@xiwebdesign/xicms-core 7.14.0 → 7.15.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 (238) hide show
  1. package/dist/blocks/builtins/Accordion.d.ts +1 -2
  2. package/dist/blocks/builtins/Accordion.js +2 -39
  3. package/dist/blocks/builtins/Accordion.js.map +1 -1
  4. package/dist/blocks/builtins/AccordionRender.d.ts +7 -0
  5. package/dist/blocks/builtins/AccordionRender.js +42 -0
  6. package/dist/blocks/builtins/AccordionRender.js.map +1 -0
  7. package/dist/blocks/builtins/Agenda.d.ts +1 -29
  8. package/dist/blocks/builtins/Agenda.js +3 -94
  9. package/dist/blocks/builtins/Agenda.js.map +1 -1
  10. package/dist/blocks/builtins/AgendaRender.d.ts +34 -0
  11. package/dist/blocks/builtins/AgendaRender.js +96 -0
  12. package/dist/blocks/builtins/AgendaRender.js.map +1 -0
  13. package/dist/blocks/builtins/Banner.d.ts +1 -2
  14. package/dist/blocks/builtins/Banner.js +2 -32
  15. package/dist/blocks/builtins/Banner.js.map +1 -1
  16. package/dist/blocks/builtins/BannerRender.d.ts +11 -0
  17. package/dist/blocks/builtins/BannerRender.js +35 -0
  18. package/dist/blocks/builtins/BannerRender.js.map +1 -0
  19. package/dist/blocks/builtins/BeforeAfter.d.ts +1 -2
  20. package/dist/blocks/builtins/BeforeAfter.js +2 -31
  21. package/dist/blocks/builtins/BeforeAfter.js.map +1 -1
  22. package/dist/blocks/builtins/BeforeAfterRender.d.ts +11 -0
  23. package/dist/blocks/builtins/BeforeAfterRender.js +34 -0
  24. package/dist/blocks/builtins/BeforeAfterRender.js.map +1 -0
  25. package/dist/blocks/builtins/Booking.d.ts +1 -2
  26. package/dist/blocks/builtins/Booking.js +2 -14
  27. package/dist/blocks/builtins/Booking.js.map +1 -1
  28. package/dist/blocks/builtins/BookingRender.d.ts +8 -0
  29. package/dist/blocks/builtins/BookingRender.js +17 -0
  30. package/dist/blocks/builtins/BookingRender.js.map +1 -0
  31. package/dist/blocks/builtins/Breadcrumbs.d.ts +1 -10
  32. package/dist/blocks/builtins/Breadcrumbs.js +3 -69
  33. package/dist/blocks/builtins/Breadcrumbs.js.map +1 -1
  34. package/dist/blocks/builtins/BreadcrumbsRender.d.ts +18 -0
  35. package/dist/blocks/builtins/BreadcrumbsRender.js +71 -0
  36. package/dist/blocks/builtins/BreadcrumbsRender.js.map +1 -0
  37. package/dist/blocks/builtins/Cards.d.ts +1 -2
  38. package/dist/blocks/builtins/Cards.js +2 -74
  39. package/dist/blocks/builtins/Cards.js.map +1 -1
  40. package/dist/blocks/builtins/CardsRender.d.ts +7 -0
  41. package/dist/blocks/builtins/CardsRender.js +77 -0
  42. package/dist/blocks/builtins/CardsRender.js.map +1 -0
  43. package/dist/blocks/builtins/Columns.d.ts +1 -2
  44. package/dist/blocks/builtins/Columns.js +2 -9
  45. package/dist/blocks/builtins/Columns.js.map +1 -1
  46. package/dist/blocks/builtins/ColumnsRender.d.ts +6 -0
  47. package/dist/blocks/builtins/ColumnsRender.js +12 -0
  48. package/dist/blocks/builtins/ColumnsRender.js.map +1 -0
  49. package/dist/blocks/builtins/Contact.d.ts +2 -7
  50. package/dist/blocks/builtins/Contact.js +3 -102
  51. package/dist/blocks/builtins/Contact.js.map +1 -1
  52. package/dist/blocks/builtins/ContactRender.d.ts +9 -0
  53. package/dist/blocks/builtins/ContactRender.js +105 -0
  54. package/dist/blocks/builtins/ContactRender.js.map +1 -0
  55. package/dist/blocks/builtins/Countdown.d.ts +1 -18
  56. package/dist/blocks/builtins/Countdown.js +3 -53
  57. package/dist/blocks/builtins/Countdown.js.map +1 -1
  58. package/dist/blocks/builtins/CountdownRender.d.ts +22 -0
  59. package/dist/blocks/builtins/CountdownRender.js +55 -0
  60. package/dist/blocks/builtins/CountdownRender.js.map +1 -0
  61. package/dist/blocks/builtins/Cta.d.ts +1 -2
  62. package/dist/blocks/builtins/Cta.js +2 -39
  63. package/dist/blocks/builtins/Cta.js.map +1 -1
  64. package/dist/blocks/builtins/CtaRender.d.ts +6 -0
  65. package/dist/blocks/builtins/CtaRender.js +42 -0
  66. package/dist/blocks/builtins/CtaRender.js.map +1 -0
  67. package/dist/blocks/builtins/Downloads.d.ts +1 -2
  68. package/dist/blocks/builtins/Downloads.js +2 -16
  69. package/dist/blocks/builtins/Downloads.js.map +1 -1
  70. package/dist/blocks/builtins/DownloadsRender.d.ts +7 -0
  71. package/dist/blocks/builtins/DownloadsRender.js +19 -0
  72. package/dist/blocks/builtins/DownloadsRender.js.map +1 -0
  73. package/dist/blocks/builtins/Elements.d.ts +3 -4
  74. package/dist/blocks/builtins/Elements.js +4 -38
  75. package/dist/blocks/builtins/Elements.js.map +1 -1
  76. package/dist/blocks/builtins/ElementsRender.d.ts +10 -0
  77. package/dist/blocks/builtins/ElementsRender.js +41 -0
  78. package/dist/blocks/builtins/ElementsRender.js.map +1 -0
  79. package/dist/blocks/builtins/Embed.d.ts +1 -2
  80. package/dist/blocks/builtins/Embed.js +2 -19
  81. package/dist/blocks/builtins/Embed.js.map +1 -1
  82. package/dist/blocks/builtins/EmbedRender.d.ts +7 -0
  83. package/dist/blocks/builtins/EmbedRender.js +22 -0
  84. package/dist/blocks/builtins/EmbedRender.js.map +1 -0
  85. package/dist/blocks/builtins/Faq.d.ts +1 -6
  86. package/dist/blocks/builtins/Faq.js +3 -103
  87. package/dist/blocks/builtins/Faq.js.map +1 -1
  88. package/dist/blocks/builtins/FaqRender.d.ts +10 -0
  89. package/dist/blocks/builtins/FaqRender.js +105 -0
  90. package/dist/blocks/builtins/FaqRender.js.map +1 -0
  91. package/dist/blocks/builtins/FormBlock.d.ts +1 -2
  92. package/dist/blocks/builtins/FormBlock.js +2 -222
  93. package/dist/blocks/builtins/FormBlock.js.map +1 -1
  94. package/dist/blocks/builtins/FormBlockRender.d.ts +6 -0
  95. package/dist/blocks/builtins/FormBlockRender.js +225 -0
  96. package/dist/blocks/builtins/FormBlockRender.js.map +1 -0
  97. package/dist/blocks/builtins/Gallery.d.ts +1 -23
  98. package/dist/blocks/builtins/Gallery.js +2 -164
  99. package/dist/blocks/builtins/Gallery.js.map +1 -1
  100. package/dist/blocks/builtins/GalleryRender.d.ts +25 -0
  101. package/dist/blocks/builtins/GalleryRender.js +167 -0
  102. package/dist/blocks/builtins/GalleryRender.js.map +1 -0
  103. package/dist/blocks/builtins/Hero.d.ts +1 -2
  104. package/dist/blocks/builtins/Hero.js +2 -73
  105. package/dist/blocks/builtins/Hero.js.map +1 -1
  106. package/dist/blocks/builtins/HeroRender.d.ts +6 -0
  107. package/dist/blocks/builtins/HeroRender.js +76 -0
  108. package/dist/blocks/builtins/HeroRender.js.map +1 -0
  109. package/dist/blocks/builtins/ImageBlock.d.ts +1 -2
  110. package/dist/blocks/builtins/ImageBlock.js +2 -22
  111. package/dist/blocks/builtins/ImageBlock.js.map +1 -1
  112. package/dist/blocks/builtins/ImageBlockRender.d.ts +6 -0
  113. package/dist/blocks/builtins/ImageBlockRender.js +25 -0
  114. package/dist/blocks/builtins/ImageBlockRender.js.map +1 -0
  115. package/dist/blocks/builtins/Jobs.d.ts +1 -15
  116. package/dist/blocks/builtins/Jobs.js +3 -69
  117. package/dist/blocks/builtins/Jobs.js.map +1 -1
  118. package/dist/blocks/builtins/JobsRender.d.ts +17 -0
  119. package/dist/blocks/builtins/JobsRender.js +71 -0
  120. package/dist/blocks/builtins/JobsRender.js.map +1 -0
  121. package/dist/blocks/builtins/Layout.d.ts +2 -3
  122. package/dist/blocks/builtins/Layout.js +3 -39
  123. package/dist/blocks/builtins/Layout.js.map +1 -1
  124. package/dist/blocks/builtins/LayoutRender.d.ts +8 -0
  125. package/dist/blocks/builtins/LayoutRender.js +42 -0
  126. package/dist/blocks/builtins/LayoutRender.js.map +1 -0
  127. package/dist/blocks/builtins/MapBlock.d.ts +1 -2
  128. package/dist/blocks/builtins/MapBlock.js +2 -45
  129. package/dist/blocks/builtins/MapBlock.js.map +1 -1
  130. package/dist/blocks/builtins/MapBlockRender.d.ts +6 -0
  131. package/dist/blocks/builtins/MapBlockRender.js +48 -0
  132. package/dist/blocks/builtins/MapBlockRender.js.map +1 -0
  133. package/dist/blocks/builtins/NewsListBlock.d.ts +1 -2
  134. package/dist/blocks/builtins/NewsListBlock.js +2 -11
  135. package/dist/blocks/builtins/NewsListBlock.js.map +1 -1
  136. package/dist/blocks/builtins/NewsListBlockRender.d.ts +6 -0
  137. package/dist/blocks/builtins/NewsListBlockRender.js +14 -0
  138. package/dist/blocks/builtins/NewsListBlockRender.js.map +1 -0
  139. package/dist/blocks/builtins/Newsletter.d.ts +1 -2
  140. package/dist/blocks/builtins/Newsletter.js +2 -89
  141. package/dist/blocks/builtins/Newsletter.js.map +1 -1
  142. package/dist/blocks/builtins/NewsletterRender.d.ts +13 -0
  143. package/dist/blocks/builtins/NewsletterRender.js +92 -0
  144. package/dist/blocks/builtins/NewsletterRender.js.map +1 -0
  145. package/dist/blocks/builtins/OpeningHours.d.ts +1 -2
  146. package/dist/blocks/builtins/OpeningHours.js +2 -28
  147. package/dist/blocks/builtins/OpeningHours.js.map +1 -1
  148. package/dist/blocks/builtins/OpeningHoursRender.d.ts +7 -0
  149. package/dist/blocks/builtins/OpeningHoursRender.js +31 -0
  150. package/dist/blocks/builtins/OpeningHoursRender.js.map +1 -0
  151. package/dist/blocks/builtins/PdfBlock.d.ts +1 -2
  152. package/dist/blocks/builtins/PdfBlock.js +2 -76
  153. package/dist/blocks/builtins/PdfBlock.js.map +1 -1
  154. package/dist/blocks/builtins/PdfBlockRender.d.ts +11 -0
  155. package/dist/blocks/builtins/PdfBlockRender.js +79 -0
  156. package/dist/blocks/builtins/PdfBlockRender.js.map +1 -0
  157. package/dist/blocks/builtins/Portfolio.d.ts +1 -2
  158. package/dist/blocks/builtins/Portfolio.js +2 -75
  159. package/dist/blocks/builtins/Portfolio.js.map +1 -1
  160. package/dist/blocks/builtins/PortfolioRender.d.ts +7 -0
  161. package/dist/blocks/builtins/PortfolioRender.js +78 -0
  162. package/dist/blocks/builtins/PortfolioRender.js.map +1 -0
  163. package/dist/blocks/builtins/Pricing.d.ts +1 -8
  164. package/dist/blocks/builtins/Pricing.js +3 -73
  165. package/dist/blocks/builtins/Pricing.js.map +1 -1
  166. package/dist/blocks/builtins/PricingRender.d.ts +10 -0
  167. package/dist/blocks/builtins/PricingRender.js +75 -0
  168. package/dist/blocks/builtins/PricingRender.js.map +1 -0
  169. package/dist/blocks/builtins/RichTextBlock.d.ts +1 -2
  170. package/dist/blocks/builtins/RichTextBlock.js +2 -5
  171. package/dist/blocks/builtins/RichTextBlock.js.map +1 -1
  172. package/dist/blocks/builtins/RichTextBlockRender.d.ts +6 -0
  173. package/dist/blocks/builtins/RichTextBlockRender.js +8 -0
  174. package/dist/blocks/builtins/RichTextBlockRender.js.map +1 -0
  175. package/dist/blocks/builtins/Search.d.ts +1 -2
  176. package/dist/blocks/builtins/Search.js +2 -80
  177. package/dist/blocks/builtins/Search.js.map +1 -1
  178. package/dist/blocks/builtins/SearchRender.d.ts +7 -0
  179. package/dist/blocks/builtins/SearchRender.js +83 -0
  180. package/dist/blocks/builtins/SearchRender.js.map +1 -0
  181. package/dist/blocks/builtins/Sections.d.ts +4 -5
  182. package/dist/blocks/builtins/Sections.js +5 -142
  183. package/dist/blocks/builtins/Sections.js.map +1 -1
  184. package/dist/blocks/builtins/SectionsRender.d.ts +12 -0
  185. package/dist/blocks/builtins/SectionsRender.js +145 -0
  186. package/dist/blocks/builtins/SectionsRender.js.map +1 -0
  187. package/dist/blocks/builtins/Slider.d.ts +1 -2
  188. package/dist/blocks/builtins/Slider.js +2 -134
  189. package/dist/blocks/builtins/Slider.js.map +1 -1
  190. package/dist/blocks/builtins/SliderRender.d.ts +7 -0
  191. package/dist/blocks/builtins/SliderRender.js +137 -0
  192. package/dist/blocks/builtins/SliderRender.js.map +1 -0
  193. package/dist/blocks/builtins/Spacer.d.ts +1 -2
  194. package/dist/blocks/builtins/Spacer.js +2 -6
  195. package/dist/blocks/builtins/Spacer.js.map +1 -1
  196. package/dist/blocks/builtins/SpacerRender.d.ts +6 -0
  197. package/dist/blocks/builtins/SpacerRender.js +9 -0
  198. package/dist/blocks/builtins/SpacerRender.js.map +1 -0
  199. package/dist/blocks/builtins/SymbolRef.d.ts +1 -2
  200. package/dist/blocks/builtins/SymbolRef.js +2 -76
  201. package/dist/blocks/builtins/SymbolRef.js.map +1 -1
  202. package/dist/blocks/builtins/SymbolRefRender.d.ts +13 -0
  203. package/dist/blocks/builtins/SymbolRefRender.js +79 -0
  204. package/dist/blocks/builtins/SymbolRefRender.js.map +1 -0
  205. package/dist/blocks/builtins/Team.d.ts +1 -2
  206. package/dist/blocks/builtins/Team.js +2 -55
  207. package/dist/blocks/builtins/Team.js.map +1 -1
  208. package/dist/blocks/builtins/TeamRender.d.ts +7 -0
  209. package/dist/blocks/builtins/TeamRender.js +58 -0
  210. package/dist/blocks/builtins/TeamRender.js.map +1 -0
  211. package/dist/blocks/builtins/Testimonials.d.ts +1 -8
  212. package/dist/blocks/builtins/Testimonials.js +2 -69
  213. package/dist/blocks/builtins/Testimonials.js.map +1 -1
  214. package/dist/blocks/builtins/TestimonialsRender.d.ts +10 -0
  215. package/dist/blocks/builtins/TestimonialsRender.js +72 -0
  216. package/dist/blocks/builtins/TestimonialsRender.js.map +1 -0
  217. package/dist/blocks/builtins/Video.d.ts +1 -9
  218. package/dist/blocks/builtins/Video.js +2 -64
  219. package/dist/blocks/builtins/Video.js.map +1 -1
  220. package/dist/blocks/builtins/VideoRender.d.ts +10 -0
  221. package/dist/blocks/builtins/VideoRender.js +67 -0
  222. package/dist/blocks/builtins/VideoRender.js.map +1 -0
  223. package/dist/blocks/builtins/WhatsappChat.d.ts +1 -8
  224. package/dist/blocks/builtins/WhatsappChat.js +2 -37
  225. package/dist/blocks/builtins/WhatsappChat.js.map +1 -1
  226. package/dist/blocks/builtins/WhatsappChatRender.d.ts +17 -0
  227. package/dist/blocks/builtins/WhatsappChatRender.js +40 -0
  228. package/dist/blocks/builtins/WhatsappChatRender.js.map +1 -0
  229. package/dist/blocks/builtins/Widgets.d.ts +12 -13
  230. package/dist/blocks/builtins/Widgets.js +13 -175
  231. package/dist/blocks/builtins/Widgets.js.map +1 -1
  232. package/dist/blocks/builtins/WidgetsRender.d.ts +34 -0
  233. package/dist/blocks/builtins/WidgetsRender.js +178 -0
  234. package/dist/blocks/builtins/WidgetsRender.js.map +1 -0
  235. package/dist/modules/contract.js +2 -1
  236. package/dist/modules/contract.js.map +1 -1
  237. package/dist/version.js +1 -1
  238. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/blocks/builtins/BeforeAfter.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport type { z } from \"zod\";\nimport type { BeforeAfterBlockSchema } from \"../../schema/blocks\";\nimport { defineBlock, type BlockRenderProps } from \"../registry\";\n\ntype BeforeAfter = z.infer<typeof BeforeAfterBlockSchema>;\n\n/**\n * Voor/na-vergelijker: het \"na\"-beeld wordt geclipt op de sleppositie. De greep is een échte\n * range-input (over de hele breedte, transparant) — slepen, klikken én pijltjestoetsen werken\n * daarmee gratis en toegankelijk (aria-label + waarde in %).\n */\nfunction BeforeAfterRender({ block }: BlockRenderProps<BeforeAfter>) {\n const [pos, setPos] = useState(50);\n if (!block.beforeUrl || !block.afterUrl) return null;\n return (\n <figure className=\"xicms-beforeafter\" style={{ aspectRatio: block.aspectRatio.replace(\"/\", \" / \") }}>\n {block.heading && <figcaption className=\"xicms-beforeafter__heading\" data-xicms-edit=\"heading\">{block.heading}</figcaption>}\n <div className=\"xicms-beforeafter__stage\">\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img className=\"xicms-beforeafter__img\" src={block.beforeUrl} alt={block.alt || block.beforeLabel} loading=\"lazy\" />\n <div className=\"xicms-beforeafter__clip\" style={{ clipPath: `inset(0 0 0 ${pos}%)` }} aria-hidden>\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img className=\"xicms-beforeafter__img\" src={block.afterUrl} alt=\"\" loading=\"lazy\" />\n </div>\n <div className=\"xicms-beforeafter__divider\" style={{ left: `${pos}%` }} aria-hidden>\n <span className=\"xicms-beforeafter__handle\">⟨⟩</span>\n </div>\n <span className=\"xicms-beforeafter__badge xicms-beforeafter__badge--before\" data-xicms-edit=\"beforeLabel\">{block.beforeLabel}</span>\n <span className=\"xicms-beforeafter__badge xicms-beforeafter__badge--after\" data-xicms-edit=\"afterLabel\">{block.afterLabel}</span>\n <input\n className=\"xicms-beforeafter__range\"\n type=\"range\"\n min={0}\n max={100}\n value={pos}\n onChange={(e) => setPos(Number(e.target.value))}\n aria-label={`Vergelijk ${block.beforeLabel} en ${block.afterLabel}`}\n aria-valuetext={`${pos}% ${block.afterLabel}`}\n />\n </div>\n </figure>\n );\n}\n\nexport const beforeAfterBlock = defineBlock({\n type: \"beforeAfter\",\n fields: { beforeUrl: { type: \"image\" }, afterUrl: { type: \"image\" } },\n Render: BeforeAfterRender,\n label: \"Voor / na\",\n icon: \"🔀\",\n defaults: () => ({ beforeUrl: \"\", afterUrl: \"\", beforeLabel: \"Voor\", afterLabel: \"Na\", aspectRatio: \"4/3\" }),\n});\n"],"mappings":";AAmBwB,cAClB,YADkB;AAjBxB,SAAS,gBAAgB;AAGzB,SAAS,mBAA0C;AASnD,SAAS,kBAAkB,EAAE,MAAM,GAAkC;AACnE,QAAM,CAAC,KAAK,MAAM,IAAI,SAAS,EAAE;AACjC,MAAI,CAAC,MAAM,aAAa,CAAC,MAAM,SAAU,QAAO;AAChD,SACE,qBAAC,YAAO,WAAU,qBAAoB,OAAO,EAAE,aAAa,MAAM,YAAY,QAAQ,KAAK,KAAK,EAAE,GAC/F;AAAA,UAAM,WAAW,oBAAC,gBAAW,WAAU,8BAA6B,mBAAgB,WAAW,gBAAM,SAAQ;AAAA,IAC9G,qBAAC,SAAI,WAAU,4BAEb;AAAA,0BAAC,SAAI,WAAU,0BAAyB,KAAK,MAAM,WAAW,KAAK,MAAM,OAAO,MAAM,aAAa,SAAQ,QAAO;AAAA,MAClH,oBAAC,SAAI,WAAU,2BAA0B,OAAO,EAAE,UAAU,eAAe,GAAG,KAAK,GAAG,eAAW,MAE/F,8BAAC,SAAI,WAAU,0BAAyB,KAAK,MAAM,UAAU,KAAI,IAAG,SAAQ,QAAO,GACrF;AAAA,MACA,oBAAC,SAAI,WAAU,8BAA6B,OAAO,EAAE,MAAM,GAAG,GAAG,IAAI,GAAG,eAAW,MACjF,8BAAC,UAAK,WAAU,6BAA4B,0BAAE,GAChD;AAAA,MACA,oBAAC,UAAK,WAAU,6DAA4D,mBAAgB,eAAe,gBAAM,aAAY;AAAA,MAC7H,oBAAC,UAAK,WAAU,4DAA2D,mBAAgB,cAAc,gBAAM,YAAW;AAAA,MAC1H;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,OAAO,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,UAC9C,cAAY,aAAa,MAAM,WAAW,OAAO,MAAM,UAAU;AAAA,UACjE,kBAAgB,GAAG,GAAG,KAAK,MAAM,UAAU;AAAA;AAAA,MAC7C;AAAA,OACF;AAAA,KACF;AAEJ;AAEO,MAAM,mBAAmB,YAAY;AAAA,EAC1C,MAAM;AAAA,EACN,QAAQ,EAAE,WAAW,EAAE,MAAM,QAAQ,GAAG,UAAU,EAAE,MAAM,QAAQ,EAAE;AAAA,EACpE,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,WAAW,IAAI,UAAU,IAAI,aAAa,QAAQ,YAAY,MAAM,aAAa,MAAM;AAC5G,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../../src/blocks/builtins/BeforeAfter.tsx"],"sourcesContent":["import dynamic from \"next/dynamic\";\nimport { defineBlock } from \"../registry\";\n\nexport const beforeAfterBlock = defineBlock({\n type: \"beforeAfter\",\n fields: { beforeUrl: { type: \"image\" }, afterUrl: { type: \"image\" } },\n Render: dynamic(() => import(\"./BeforeAfterRender\").then((m) => m.BeforeAfterRender)),\n label: \"Voor / na\",\n icon: \"🔀\",\n defaults: () => ({ beforeUrl: \"\", afterUrl: \"\", beforeLabel: \"Voor\", afterLabel: \"Na\", aspectRatio: \"4/3\" }),\n});\n"],"mappings":"AAAA,OAAO,aAAa;AACpB,SAAS,mBAAmB;AAErB,MAAM,mBAAmB,YAAY;AAAA,EAC1C,MAAM;AAAA,EACN,QAAQ,EAAE,WAAW,EAAE,MAAM,QAAQ,GAAG,UAAU,EAAE,MAAM,QAAQ,EAAE;AAAA,EACpE,QAAQ,QAAQ,MAAM,OAAO,qBAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,iBAAiB,CAAC;AAAA,EACpF,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,WAAW,IAAI,UAAU,IAAI,aAAa,QAAQ,YAAY,MAAM,aAAa,MAAM;AAC5G,CAAC;","names":[]}
@@ -0,0 +1,11 @@
1
+ import type { z } from "zod";
2
+ import type { BeforeAfterBlockSchema } from "../../schema/blocks.js";
3
+ import type { BlockRenderProps } from "../registry.js";
4
+ type BeforeAfter = z.infer<typeof BeforeAfterBlockSchema>;
5
+ /**
6
+ * Voor/na-vergelijker: het "na"-beeld wordt geclipt op de sleppositie. De greep is een échte
7
+ * range-input (over de hele breedte, transparant) — slepen, klikken én pijltjestoetsen werken
8
+ * daarmee gratis en toegankelijk (aria-label + waarde in %).
9
+ */
10
+ export declare function BeforeAfterRender({ block }: BlockRenderProps<BeforeAfter>): import("react").JSX.Element | null;
11
+ export {};
@@ -0,0 +1,34 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ function BeforeAfterRender({ block }) {
5
+ const [pos, setPos] = useState(50);
6
+ if (!block.beforeUrl || !block.afterUrl) return null;
7
+ return /* @__PURE__ */ jsxs("figure", { className: "xicms-beforeafter", style: { aspectRatio: block.aspectRatio.replace("/", " / ") }, children: [
8
+ block.heading && /* @__PURE__ */ jsx("figcaption", { className: "xicms-beforeafter__heading", "data-xicms-edit": "heading", children: block.heading }),
9
+ /* @__PURE__ */ jsxs("div", { className: "xicms-beforeafter__stage", children: [
10
+ /* @__PURE__ */ jsx("img", { className: "xicms-beforeafter__img", src: block.beforeUrl, alt: block.alt || block.beforeLabel, loading: "lazy" }),
11
+ /* @__PURE__ */ jsx("div", { className: "xicms-beforeafter__clip", style: { clipPath: `inset(0 0 0 ${pos}%)` }, "aria-hidden": true, children: /* @__PURE__ */ jsx("img", { className: "xicms-beforeafter__img", src: block.afterUrl, alt: "", loading: "lazy" }) }),
12
+ /* @__PURE__ */ jsx("div", { className: "xicms-beforeafter__divider", style: { left: `${pos}%` }, "aria-hidden": true, children: /* @__PURE__ */ jsx("span", { className: "xicms-beforeafter__handle", children: "\u27E8\u27E9" }) }),
13
+ /* @__PURE__ */ jsx("span", { className: "xicms-beforeafter__badge xicms-beforeafter__badge--before", "data-xicms-edit": "beforeLabel", children: block.beforeLabel }),
14
+ /* @__PURE__ */ jsx("span", { className: "xicms-beforeafter__badge xicms-beforeafter__badge--after", "data-xicms-edit": "afterLabel", children: block.afterLabel }),
15
+ /* @__PURE__ */ jsx(
16
+ "input",
17
+ {
18
+ className: "xicms-beforeafter__range",
19
+ type: "range",
20
+ min: 0,
21
+ max: 100,
22
+ value: pos,
23
+ onChange: (e) => setPos(Number(e.target.value)),
24
+ "aria-label": `Vergelijk ${block.beforeLabel} en ${block.afterLabel}`,
25
+ "aria-valuetext": `${pos}% ${block.afterLabel}`
26
+ }
27
+ )
28
+ ] })
29
+ ] });
30
+ }
31
+ export {
32
+ BeforeAfterRender
33
+ };
34
+ //# sourceMappingURL=BeforeAfterRender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/blocks/builtins/BeforeAfterRender.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport type { z } from \"zod\";\nimport type { BeforeAfterBlockSchema } from \"../../schema/blocks\";\nimport type { BlockRenderProps } from \"../registry\";\n\ntype BeforeAfter = z.infer<typeof BeforeAfterBlockSchema>;\n\n/**\n * Voor/na-vergelijker: het \"na\"-beeld wordt geclipt op de sleppositie. De greep is een échte\n * range-input (over de hele breedte, transparant) — slepen, klikken én pijltjestoetsen werken\n * daarmee gratis en toegankelijk (aria-label + waarde in %).\n */\nexport function BeforeAfterRender({ block }: BlockRenderProps<BeforeAfter>) {\n const [pos, setPos] = useState(50);\n if (!block.beforeUrl || !block.afterUrl) return null;\n return (\n <figure className=\"xicms-beforeafter\" style={{ aspectRatio: block.aspectRatio.replace(\"/\", \" / \") }}>\n {block.heading && <figcaption className=\"xicms-beforeafter__heading\" data-xicms-edit=\"heading\">{block.heading}</figcaption>}\n <div className=\"xicms-beforeafter__stage\">\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img className=\"xicms-beforeafter__img\" src={block.beforeUrl} alt={block.alt || block.beforeLabel} loading=\"lazy\" />\n <div className=\"xicms-beforeafter__clip\" style={{ clipPath: `inset(0 0 0 ${pos}%)` }} aria-hidden>\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img className=\"xicms-beforeafter__img\" src={block.afterUrl} alt=\"\" loading=\"lazy\" />\n </div>\n <div className=\"xicms-beforeafter__divider\" style={{ left: `${pos}%` }} aria-hidden>\n <span className=\"xicms-beforeafter__handle\">⟨⟩</span>\n </div>\n <span className=\"xicms-beforeafter__badge xicms-beforeafter__badge--before\" data-xicms-edit=\"beforeLabel\">{block.beforeLabel}</span>\n <span className=\"xicms-beforeafter__badge xicms-beforeafter__badge--after\" data-xicms-edit=\"afterLabel\">{block.afterLabel}</span>\n <input\n className=\"xicms-beforeafter__range\"\n type=\"range\"\n min={0}\n max={100}\n value={pos}\n onChange={(e) => setPos(Number(e.target.value))}\n aria-label={`Vergelijk ${block.beforeLabel} en ${block.afterLabel}`}\n aria-valuetext={`${pos}% ${block.afterLabel}`}\n />\n </div>\n </figure>\n );\n}\n"],"mappings":";AAmBwB,cAClB,YADkB;AAjBxB,SAAS,gBAAgB;AAYlB,SAAS,kBAAkB,EAAE,MAAM,GAAkC;AAC1E,QAAM,CAAC,KAAK,MAAM,IAAI,SAAS,EAAE;AACjC,MAAI,CAAC,MAAM,aAAa,CAAC,MAAM,SAAU,QAAO;AAChD,SACE,qBAAC,YAAO,WAAU,qBAAoB,OAAO,EAAE,aAAa,MAAM,YAAY,QAAQ,KAAK,KAAK,EAAE,GAC/F;AAAA,UAAM,WAAW,oBAAC,gBAAW,WAAU,8BAA6B,mBAAgB,WAAW,gBAAM,SAAQ;AAAA,IAC9G,qBAAC,SAAI,WAAU,4BAEb;AAAA,0BAAC,SAAI,WAAU,0BAAyB,KAAK,MAAM,WAAW,KAAK,MAAM,OAAO,MAAM,aAAa,SAAQ,QAAO;AAAA,MAClH,oBAAC,SAAI,WAAU,2BAA0B,OAAO,EAAE,UAAU,eAAe,GAAG,KAAK,GAAG,eAAW,MAE/F,8BAAC,SAAI,WAAU,0BAAyB,KAAK,MAAM,UAAU,KAAI,IAAG,SAAQ,QAAO,GACrF;AAAA,MACA,oBAAC,SAAI,WAAU,8BAA6B,OAAO,EAAE,MAAM,GAAG,GAAG,IAAI,GAAG,eAAW,MACjF,8BAAC,UAAK,WAAU,6BAA4B,0BAAE,GAChD;AAAA,MACA,oBAAC,UAAK,WAAU,6DAA4D,mBAAgB,eAAe,gBAAM,aAAY;AAAA,MAC7H,oBAAC,UAAK,WAAU,4DAA2D,mBAAgB,cAAc,gBAAM,YAAW;AAAA,MAC1H;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,OAAO,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,UAC9C,cAAY,aAAa,MAAM,WAAW,OAAO,MAAM,UAAU;AAAA,UACjE,kBAAgB,GAAG,GAAG,KAAK,MAAM,UAAU;AAAA;AAAA,MAC7C;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
@@ -1,2 +1 @@
1
- import type { z } from "zod";
2
- export declare const bookingBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
1
+ export declare const bookingBlock: import("../index.js").BlockDefinition<import("zod/v4/core").$ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>>;
@@ -1,20 +1,8 @@
1
- "use client";
2
- import { jsx, jsxs } from "react/jsx-runtime";
1
+ import dynamic from "next/dynamic";
3
2
  import { defineBlock } from "../registry.js";
4
- import { Heading } from "../ui/index.js";
5
- import { ConsentEmbed } from "./consentEmbed.js";
6
- import { buildBookingUrl } from "./lib/bookingUrl.js";
7
- function BookingRender({ block, mode }) {
8
- const src = buildBookingUrl(block.provider ?? "custom", block.embedUrl);
9
- if (!src) return null;
10
- return /* @__PURE__ */ jsxs("section", { className: "xicms-booking", children: [
11
- block.heading && /* @__PURE__ */ jsx(Heading, { level: 2, "data-xicms-edit": "heading", children: block.heading }),
12
- /* @__PURE__ */ jsx("div", { className: "xicms-booking__frame", style: { height: `${block.height}px` }, children: /* @__PURE__ */ jsx(ConsentEmbed, { gated: block.consentGated, preview: mode === "preview", label: "Afspraak/booking", children: /* @__PURE__ */ jsx("iframe", { src, title: block.heading ?? "Afspraak maken", loading: "lazy", referrerPolicy: "no-referrer-when-downgrade", sandbox: "allow-scripts allow-same-origin allow-forms allow-popups", style: { border: 0, width: "100%", height: "100%" } }) }) })
13
- ] });
14
- }
15
3
  const bookingBlock = defineBlock({
16
4
  type: "booking",
17
- Render: BookingRender,
5
+ Render: dynamic(() => import("./BookingRender.js").then((m) => m.BookingRender)),
18
6
  label: "Afspraak/booking",
19
7
  icon: "\u{1F4C6}",
20
8
  defaults: () => ({ embedUrl: "", height: 630, consentGated: true })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/blocks/builtins/Booking.tsx"],"sourcesContent":["\"use client\";\n\nimport type { z } from \"zod\";\nimport type { BookingBlockSchema } from \"../../schema/blocks\";\nimport { defineBlock, type BlockRenderProps } from \"../registry\";\nimport { Heading } from \"../ui\";\nimport { ConsentEmbed } from \"./consentEmbed\";\nimport { buildBookingUrl, type BookingProvider } from \"./lib/bookingUrl\";\n\ntype Booking = z.infer<typeof BookingBlockSchema>;\n\n/** Boekings-/afspraak-embed (bv. Calendly). Consent-gated by default. De provider-keuze bouwt de\n * volledige embed-URL uit een geplakte link óf een kale slug/id (buildBookingUrl). */\nfunction BookingRender({ block, mode }: BlockRenderProps<Booking>) {\n const src = buildBookingUrl((block.provider ?? \"custom\") as BookingProvider, block.embedUrl);\n if (!src) return null;\n return (\n <section className=\"xicms-booking\">\n {block.heading && <Heading level={2} data-xicms-edit=\"heading\">{block.heading}</Heading>}\n <div className=\"xicms-booking__frame\" style={{ height: `${block.height}px` }}>\n <ConsentEmbed gated={block.consentGated} preview={mode === \"preview\"} label=\"Afspraak/booking\">\n <iframe src={src} title={block.heading ?? \"Afspraak maken\"} loading=\"lazy\" referrerPolicy=\"no-referrer-when-downgrade\" sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups\" style={{ border: 0, width: \"100%\", height: \"100%\" }} />\n </ConsentEmbed>\n </div>\n </section>\n );\n}\n\nexport const bookingBlock = defineBlock({\n type: \"booking\",\n Render: BookingRender,\n label: \"Afspraak/booking\",\n icon: \"📆\",\n defaults: () => ({ embedUrl: \"\", height: 630, consentGated: true }),\n});\n"],"mappings":";AAiBI,SACoB,KADpB;AAbJ,SAAS,mBAA0C;AACnD,SAAS,eAAe;AACxB,SAAS,oBAAoB;AAC7B,SAAS,uBAA6C;AAMtD,SAAS,cAAc,EAAE,OAAO,KAAK,GAA8B;AACjE,QAAM,MAAM,gBAAiB,MAAM,YAAY,UAA8B,MAAM,QAAQ;AAC3F,MAAI,CAAC,IAAK,QAAO;AACjB,SACE,qBAAC,aAAQ,WAAU,iBAChB;AAAA,UAAM,WAAW,oBAAC,WAAQ,OAAO,GAAG,mBAAgB,WAAW,gBAAM,SAAQ;AAAA,IAC9E,oBAAC,SAAI,WAAU,wBAAuB,OAAO,EAAE,QAAQ,GAAG,MAAM,MAAM,KAAK,GACzE,8BAAC,gBAAa,OAAO,MAAM,cAAc,SAAS,SAAS,WAAW,OAAM,oBAC1E,8BAAC,YAAO,KAAU,OAAO,MAAM,WAAW,kBAAkB,SAAQ,QAAO,gBAAe,8BAA6B,SAAQ,4DAA2D,OAAO,EAAE,QAAQ,GAAG,OAAO,QAAQ,QAAQ,OAAO,GAAG,GACjP,GACF;AAAA,KACF;AAEJ;AAEO,MAAM,eAAe,YAAY;AAAA,EACtC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,UAAU,IAAI,QAAQ,KAAK,cAAc,KAAK;AACnE,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../../src/blocks/builtins/Booking.tsx"],"sourcesContent":["import dynamic from \"next/dynamic\";\nimport { defineBlock } from \"../registry\";\n\nexport const bookingBlock = defineBlock({\n type: \"booking\",\n Render: dynamic(() => import(\"./BookingRender\").then((m) => m.BookingRender)),\n label: \"Afspraak/booking\",\n icon: \"📆\",\n defaults: () => ({ embedUrl: \"\", height: 630, consentGated: true }),\n});\n"],"mappings":"AAAA,OAAO,aAAa;AACpB,SAAS,mBAAmB;AAErB,MAAM,eAAe,YAAY;AAAA,EACtC,MAAM;AAAA,EACN,QAAQ,QAAQ,MAAM,OAAO,iBAAiB,EAAE,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC;AAAA,EAC5E,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,UAAU,IAAI,QAAQ,KAAK,cAAc,KAAK;AACnE,CAAC;","names":[]}
@@ -0,0 +1,8 @@
1
+ import type { z } from "zod";
2
+ import type { BookingBlockSchema } from "../../schema/blocks.js";
3
+ import type { BlockRenderProps } from "../registry.js";
4
+ type Booking = z.infer<typeof BookingBlockSchema>;
5
+ /** Boekings-/afspraak-embed (bv. Calendly). Consent-gated by default. De provider-keuze bouwt de
6
+ * volledige embed-URL uit een geplakte link óf een kale slug/id (buildBookingUrl). */
7
+ export declare function BookingRender({ block, mode }: BlockRenderProps<Booking>): import("react").JSX.Element | null;
8
+ export {};
@@ -0,0 +1,17 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { Heading } from "../ui/index.js";
4
+ import { ConsentEmbed } from "./consentEmbed.js";
5
+ import { buildBookingUrl } from "./lib/bookingUrl.js";
6
+ function BookingRender({ block, mode }) {
7
+ const src = buildBookingUrl(block.provider ?? "custom", block.embedUrl);
8
+ if (!src) return null;
9
+ return /* @__PURE__ */ jsxs("section", { className: "xicms-booking", children: [
10
+ block.heading && /* @__PURE__ */ jsx(Heading, { level: 2, "data-xicms-edit": "heading", children: block.heading }),
11
+ /* @__PURE__ */ jsx("div", { className: "xicms-booking__frame", style: { height: `${block.height}px` }, children: /* @__PURE__ */ jsx(ConsentEmbed, { gated: block.consentGated, preview: mode === "preview", label: "Afspraak/booking", children: /* @__PURE__ */ jsx("iframe", { src, title: block.heading ?? "Afspraak maken", loading: "lazy", referrerPolicy: "no-referrer-when-downgrade", sandbox: "allow-scripts allow-same-origin allow-forms allow-popups", style: { border: 0, width: "100%", height: "100%" } }) }) })
12
+ ] });
13
+ }
14
+ export {
15
+ BookingRender
16
+ };
17
+ //# sourceMappingURL=BookingRender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/blocks/builtins/BookingRender.tsx"],"sourcesContent":["\"use client\";\n\nimport type { z } from \"zod\";\nimport type { BookingBlockSchema } from \"../../schema/blocks\";\nimport type { BlockRenderProps } from \"../registry\";\nimport { Heading } from \"../ui\";\nimport { ConsentEmbed } from \"./consentEmbed\";\nimport { buildBookingUrl, type BookingProvider } from \"./lib/bookingUrl\";\n\ntype Booking = z.infer<typeof BookingBlockSchema>;\n\n/** Boekings-/afspraak-embed (bv. Calendly). Consent-gated by default. De provider-keuze bouwt de\n * volledige embed-URL uit een geplakte link óf een kale slug/id (buildBookingUrl). */\nexport function BookingRender({ block, mode }: BlockRenderProps<Booking>) {\n const src = buildBookingUrl((block.provider ?? \"custom\") as BookingProvider, block.embedUrl);\n if (!src) return null;\n return (\n <section className=\"xicms-booking\">\n {block.heading && <Heading level={2} data-xicms-edit=\"heading\">{block.heading}</Heading>}\n <div className=\"xicms-booking__frame\" style={{ height: `${block.height}px` }}>\n <ConsentEmbed gated={block.consentGated} preview={mode === \"preview\"} label=\"Afspraak/booking\">\n <iframe src={src} title={block.heading ?? \"Afspraak maken\"} loading=\"lazy\" referrerPolicy=\"no-referrer-when-downgrade\" sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups\" style={{ border: 0, width: \"100%\", height: \"100%\" }} />\n </ConsentEmbed>\n </div>\n </section>\n );\n}\n"],"mappings":";AAiBI,SACoB,KADpB;AAZJ,SAAS,eAAe;AACxB,SAAS,oBAAoB;AAC7B,SAAS,uBAA6C;AAM/C,SAAS,cAAc,EAAE,OAAO,KAAK,GAA8B;AACxE,QAAM,MAAM,gBAAiB,MAAM,YAAY,UAA8B,MAAM,QAAQ;AAC3F,MAAI,CAAC,IAAK,QAAO;AACjB,SACE,qBAAC,aAAQ,WAAU,iBAChB;AAAA,UAAM,WAAW,oBAAC,WAAQ,OAAO,GAAG,mBAAgB,WAAW,gBAAM,SAAQ;AAAA,IAC9E,oBAAC,SAAI,WAAU,wBAAuB,OAAO,EAAE,QAAQ,GAAG,MAAM,MAAM,KAAK,GACzE,8BAAC,gBAAa,OAAO,MAAM,cAAc,SAAS,SAAS,WAAW,OAAM,oBAC1E,8BAAC,YAAO,KAAU,OAAO,MAAM,WAAW,kBAAkB,SAAQ,QAAO,gBAAe,8BAA6B,SAAQ,4DAA2D,OAAO,EAAE,QAAQ,GAAG,OAAO,QAAQ,QAAQ,OAAO,GAAG,GACjP,GACF;AAAA,KACF;AAEJ;","names":[]}
@@ -1,10 +1 @@
1
- import type { z } from "zod";
2
- export interface Crumb {
3
- label: string;
4
- href: string;
5
- }
6
- /** Kruimels uit een pad: "/diensten/tuinaanleg" → Home / Diensten / Tuinaanleg. Puur en getest. */
7
- export declare function crumbsFromPath(path: string, homeLabel?: string): Crumb[];
8
- /** BreadcrumbList-JSON-LD. Puur en getest. */
9
- export declare function breadcrumbsJsonLd(crumbs: Crumb[]): Record<string, unknown>;
10
- export declare const breadcrumbsBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
1
+ export declare const breadcrumbsBlock: import("../index.js").BlockDefinition<import("zod/v4/core").$ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>>;
@@ -1,79 +1,13 @@
1
- "use client";
2
- import { jsx, jsxs } from "react/jsx-runtime";
3
- import { useEffect, useState } from "react";
1
+ import dynamic from "next/dynamic";
4
2
  import { defineBlock } from "../registry.js";
5
- import { useLinkComponent } from "@astryxdesign/core/Link";
6
- import { jsonLdHtml } from "./jsonld.js";
7
- function crumbsFromPath(path, homeLabel = "Home") {
8
- const segments = path.split("/").filter(Boolean);
9
- const crumbs = [{ label: homeLabel, href: "/" }];
10
- let href = "";
11
- for (const seg of segments) {
12
- href += `/${seg}`;
13
- let decoded = seg;
14
- try {
15
- decoded = decodeURIComponent(seg);
16
- } catch {
17
- }
18
- const label = decoded.replace(/[-_]+/g, " ").replace(/^./, (c) => c.toUpperCase());
19
- crumbs.push({ label, href });
20
- }
21
- return crumbs;
22
- }
23
- function breadcrumbsJsonLd(crumbs) {
24
- return {
25
- "@context": "https://schema.org",
26
- "@type": "BreadcrumbList",
27
- itemListElement: crumbs.map((c, i) => ({
28
- "@type": "ListItem",
29
- position: i + 1,
30
- name: c.label,
31
- item: c.href
32
- }))
33
- };
34
- }
35
- function BreadcrumbsRender({ block, mode }) {
36
- const LinkC = useLinkComponent();
37
- const [path, setPath] = useState(null);
38
- useEffect(() => {
39
- setPath(window.location.pathname);
40
- }, []);
41
- if (mode === "preview" && (path === null || path === "/")) {
42
- return /* @__PURE__ */ jsxs("nav", { className: "xicms-breadcrumbs", "aria-label": "Kruimelpad", children: [
43
- /* @__PURE__ */ jsx("span", { "data-xicms-edit": "homeLabel", children: block.homeLabel }),
44
- " / Voorbeeldpagina"
45
- ] });
46
- }
47
- if (path === null || path === "/") return null;
48
- const crumbs = crumbsFromPath(path, block.homeLabel);
49
- return /* @__PURE__ */ jsxs("nav", { className: "xicms-breadcrumbs", "aria-label": "Kruimelpad", children: [
50
- /* @__PURE__ */ jsx("ol", { className: "xicms-breadcrumbs__list", children: crumbs.map((c, i) => /* @__PURE__ */ jsx("li", { className: "xicms-breadcrumbs__item", children: i < crumbs.length - 1 ? (
51
- // De eerste kruimel ís `homeLabel`; de rest komt uit het pad en is dus geen blokveld.
52
- /* @__PURE__ */ jsx(LinkC, { href: c.href, children: i === 0 ? /* @__PURE__ */ jsx("span", { "data-xicms-edit": "homeLabel", children: c.label }) : c.label })
53
- ) : /* @__PURE__ */ jsx("span", { "aria-current": "page", children: c.label }) }, c.href)) }),
54
- block.jsonLd && /* @__PURE__ */ jsx(
55
- "script",
56
- {
57
- type: "application/ld+json",
58
- dangerouslySetInnerHTML: {
59
- __html: jsonLdHtml(
60
- breadcrumbsJsonLd(crumbs.map((c) => ({ ...c, href: `${window.location.origin}${c.href}` })))
61
- )
62
- }
63
- }
64
- )
65
- ] });
66
- }
67
3
  const breadcrumbsBlock = defineBlock({
68
4
  type: "breadcrumbs",
69
- Render: BreadcrumbsRender,
5
+ Render: dynamic(() => import("./BreadcrumbsRender.js").then((m) => m.BreadcrumbsRender)),
70
6
  label: "Kruimelpad",
71
7
  icon: "\u{1F9ED}",
72
8
  defaults: () => ({ homeLabel: "Home", jsonLd: true })
73
9
  });
74
10
  export {
75
- breadcrumbsBlock,
76
- breadcrumbsJsonLd,
77
- crumbsFromPath
11
+ breadcrumbsBlock
78
12
  };
79
13
  //# sourceMappingURL=Breadcrumbs.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/blocks/builtins/Breadcrumbs.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport type { z } from \"zod\";\nimport type { BreadcrumbsBlockSchema } from \"../../schema/blocks\";\nimport { defineBlock, type BlockRenderProps } from \"../registry\";\nimport { useLinkComponent } from \"@astryxdesign/core/Link\";\nimport { jsonLdHtml } from \"./jsonld\";\n\ntype Breadcrumbs = z.infer<typeof BreadcrumbsBlockSchema>;\n\nexport interface Crumb {\n label: string;\n href: string;\n}\n\n/** Kruimels uit een pad: \"/diensten/tuinaanleg\" → Home / Diensten / Tuinaanleg. Puur en getest. */\nexport function crumbsFromPath(path: string, homeLabel = \"Home\"): Crumb[] {\n const segments = path.split(\"/\").filter(Boolean);\n const crumbs: Crumb[] = [{ label: homeLabel, href: \"/\" }];\n let href = \"\";\n for (const seg of segments) {\n href += `/${seg}`;\n // decodeURIComponent gooit op misvormde percent-encoding (\"%E0%A4%A\") — dan het rauwe segment.\n let decoded = seg;\n try {\n decoded = decodeURIComponent(seg);\n } catch {\n /* rauw segment als label */\n }\n const label = decoded.replace(/[-_]+/g, \" \").replace(/^./, (c) => c.toUpperCase());\n crumbs.push({ label, href });\n }\n return crumbs;\n}\n\n/** BreadcrumbList-JSON-LD. Puur en getest. */\nexport function breadcrumbsJsonLd(crumbs: Crumb[]): Record<string, unknown> {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"BreadcrumbList\",\n itemListElement: crumbs.map((c, i) => ({\n \"@type\": \"ListItem\",\n position: i + 1,\n name: c.label,\n item: c.href,\n })),\n };\n}\n\n/**\n * Kruimelpad, afgeleid van de URL (client, ná mount — hydration-veilig). Op de homepage\n * (alleen \"Home\") wordt niets getoond.\n */\nfunction BreadcrumbsRender({ block, mode }: BlockRenderProps<Breadcrumbs>) {\n const LinkC = useLinkComponent();\n const [path, setPath] = useState<string | null>(null);\n useEffect(() => {\n setPath(window.location.pathname);\n }, []);\n\n if (mode === \"preview\" && (path === null || path === \"/\")) {\n return <nav className=\"xicms-breadcrumbs\" aria-label=\"Kruimelpad\"><span data-xicms-edit=\"homeLabel\">{block.homeLabel}</span> / Voorbeeldpagina</nav>;\n }\n if (path === null || path === \"/\") return null;\n const crumbs = crumbsFromPath(path, block.homeLabel);\n\n return (\n <nav className=\"xicms-breadcrumbs\" aria-label=\"Kruimelpad\">\n <ol className=\"xicms-breadcrumbs__list\">\n {crumbs.map((c, i) => (\n <li key={c.href} className=\"xicms-breadcrumbs__item\">\n {i < crumbs.length - 1 ? (\n // De eerste kruimel ís `homeLabel`; de rest komt uit het pad en is dus geen blokveld.\n <LinkC href={c.href}>{i === 0 ? <span data-xicms-edit=\"homeLabel\">{c.label}</span> : c.label}</LinkC>\n ) : (\n <span aria-current=\"page\">{c.label}</span>\n )}\n </li>\n ))}\n </ol>\n {block.jsonLd && (\n <script\n type=\"application/ld+json\"\n // eslint-disable-next-line react/no-danger\n // Absolute URL's: Google wil volledige item-URL's in BreadcrumbList (dit rendert\n // client-side ná mount, dus window.location.origin is beschikbaar).\n dangerouslySetInnerHTML={{\n __html: jsonLdHtml(\n breadcrumbsJsonLd(crumbs.map((c) => ({ ...c, href: `${window.location.origin}${c.href}` }))),\n ),\n }}\n />\n )}\n </nav>\n );\n}\n\nexport const breadcrumbsBlock = defineBlock({\n type: \"breadcrumbs\",\n Render: BreadcrumbsRender,\n label: \"Kruimelpad\",\n icon: \"🧭\",\n defaults: () => ({ homeLabel: \"Home\", jsonLd: true }),\n});\n"],"mappings":";AA8DW,SAA2D,KAA3D;AA5DX,SAAS,WAAW,gBAAgB;AAGpC,SAAS,mBAA0C;AACnD,SAAS,wBAAwB;AACjC,SAAS,kBAAkB;AAUpB,SAAS,eAAe,MAAc,YAAY,QAAiB;AACxE,QAAM,WAAW,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAC/C,QAAM,SAAkB,CAAC,EAAE,OAAO,WAAW,MAAM,IAAI,CAAC;AACxD,MAAI,OAAO;AACX,aAAW,OAAO,UAAU;AAC1B,YAAQ,IAAI,GAAG;AAEf,QAAI,UAAU;AACd,QAAI;AACF,gBAAU,mBAAmB,GAAG;AAAA,IAClC,QAAQ;AAAA,IAER;AACA,UAAM,QAAQ,QAAQ,QAAQ,UAAU,GAAG,EAAE,QAAQ,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;AACjF,WAAO,KAAK,EAAE,OAAO,KAAK,CAAC;AAAA,EAC7B;AACA,SAAO;AACT;AAGO,SAAS,kBAAkB,QAA0C;AAC1E,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,iBAAiB,OAAO,IAAI,CAAC,GAAG,OAAO;AAAA,MACrC,SAAS;AAAA,MACT,UAAU,IAAI;AAAA,MACd,MAAM,EAAE;AAAA,MACR,MAAM,EAAE;AAAA,IACV,EAAE;AAAA,EACJ;AACF;AAMA,SAAS,kBAAkB,EAAE,OAAO,KAAK,GAAkC;AACzE,QAAM,QAAQ,iBAAiB;AAC/B,QAAM,CAAC,MAAM,OAAO,IAAI,SAAwB,IAAI;AACpD,YAAU,MAAM;AACd,YAAQ,OAAO,SAAS,QAAQ;AAAA,EAClC,GAAG,CAAC,CAAC;AAEL,MAAI,SAAS,cAAc,SAAS,QAAQ,SAAS,MAAM;AACzD,WAAO,qBAAC,SAAI,WAAU,qBAAoB,cAAW,cAAa;AAAA,0BAAC,UAAK,mBAAgB,aAAa,gBAAM,WAAU;AAAA,MAAO;AAAA,OAAkB;AAAA,EAChJ;AACA,MAAI,SAAS,QAAQ,SAAS,IAAK,QAAO;AAC1C,QAAM,SAAS,eAAe,MAAM,MAAM,SAAS;AAEnD,SACE,qBAAC,SAAI,WAAU,qBAAoB,cAAW,cAC5C;AAAA,wBAAC,QAAG,WAAU,2BACX,iBAAO,IAAI,CAAC,GAAG,MACd,oBAAC,QAAgB,WAAU,2BACxB,cAAI,OAAO,SAAS;AAAA;AAAA,MAEnB,oBAAC,SAAM,MAAM,EAAE,MAAO,gBAAM,IAAI,oBAAC,UAAK,mBAAgB,aAAa,YAAE,OAAM,IAAU,EAAE,OAAM;AAAA,QAE7F,oBAAC,UAAK,gBAAa,QAAQ,YAAE,OAAM,KAL9B,EAAE,IAOX,CACD,GACH;AAAA,IACC,MAAM,UACL;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QAIL,yBAAyB;AAAA,UACvB,QAAQ;AAAA,YACN,kBAAkB,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,GAAG,OAAO,SAAS,MAAM,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC;AAAA,UAC7F;AAAA,QACF;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;AAEO,MAAM,mBAAmB,YAAY;AAAA,EAC1C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,WAAW,QAAQ,QAAQ,KAAK;AACrD,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../../src/blocks/builtins/Breadcrumbs.tsx"],"sourcesContent":["import dynamic from \"next/dynamic\";\nimport { defineBlock } from \"../registry\";\n\nexport const breadcrumbsBlock = defineBlock({\n type: \"breadcrumbs\",\n Render: dynamic(() => import(\"./BreadcrumbsRender\").then((m) => m.BreadcrumbsRender)),\n label: \"Kruimelpad\",\n icon: \"🧭\",\n defaults: () => ({ homeLabel: \"Home\", jsonLd: true }),\n});\n"],"mappings":"AAAA,OAAO,aAAa;AACpB,SAAS,mBAAmB;AAErB,MAAM,mBAAmB,YAAY;AAAA,EAC1C,MAAM;AAAA,EACN,QAAQ,QAAQ,MAAM,OAAO,qBAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,iBAAiB,CAAC;AAAA,EACpF,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,WAAW,QAAQ,QAAQ,KAAK;AACrD,CAAC;","names":[]}
@@ -0,0 +1,18 @@
1
+ import type { z } from "zod";
2
+ import type { BreadcrumbsBlockSchema } from "../../schema/blocks.js";
3
+ import type { BlockRenderProps } from "../registry.js";
4
+ type Breadcrumbs = z.infer<typeof BreadcrumbsBlockSchema>;
5
+ export interface Crumb {
6
+ label: string;
7
+ href: string;
8
+ }
9
+ /** Kruimels uit een pad: "/diensten/tuinaanleg" → Home / Diensten / Tuinaanleg. Puur en getest. */
10
+ export declare function crumbsFromPath(path: string, homeLabel?: string): Crumb[];
11
+ /** BreadcrumbList-JSON-LD. Puur en getest. */
12
+ export declare function breadcrumbsJsonLd(crumbs: Crumb[]): Record<string, unknown>;
13
+ /**
14
+ * Kruimelpad, afgeleid van de URL (client, ná mount — hydration-veilig). Op de homepage
15
+ * (alleen "Home") wordt niets getoond.
16
+ */
17
+ export declare function BreadcrumbsRender({ block, mode }: BlockRenderProps<Breadcrumbs>): import("react").JSX.Element | null;
18
+ export {};
@@ -0,0 +1,71 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useState } from "react";
4
+ import { useLinkComponent } from "@astryxdesign/core/Link";
5
+ import { jsonLdHtml } from "./jsonld.js";
6
+ function crumbsFromPath(path, homeLabel = "Home") {
7
+ const segments = path.split("/").filter(Boolean);
8
+ const crumbs = [{ label: homeLabel, href: "/" }];
9
+ let href = "";
10
+ for (const seg of segments) {
11
+ href += `/${seg}`;
12
+ let decoded = seg;
13
+ try {
14
+ decoded = decodeURIComponent(seg);
15
+ } catch {
16
+ }
17
+ const label = decoded.replace(/[-_]+/g, " ").replace(/^./, (c) => c.toUpperCase());
18
+ crumbs.push({ label, href });
19
+ }
20
+ return crumbs;
21
+ }
22
+ function breadcrumbsJsonLd(crumbs) {
23
+ return {
24
+ "@context": "https://schema.org",
25
+ "@type": "BreadcrumbList",
26
+ itemListElement: crumbs.map((c, i) => ({
27
+ "@type": "ListItem",
28
+ position: i + 1,
29
+ name: c.label,
30
+ item: c.href
31
+ }))
32
+ };
33
+ }
34
+ function BreadcrumbsRender({ block, mode }) {
35
+ const LinkC = useLinkComponent();
36
+ const [path, setPath] = useState(null);
37
+ useEffect(() => {
38
+ setPath(window.location.pathname);
39
+ }, []);
40
+ if (mode === "preview" && (path === null || path === "/")) {
41
+ return /* @__PURE__ */ jsxs("nav", { className: "xicms-breadcrumbs", "aria-label": "Kruimelpad", children: [
42
+ /* @__PURE__ */ jsx("span", { "data-xicms-edit": "homeLabel", children: block.homeLabel }),
43
+ " / Voorbeeldpagina"
44
+ ] });
45
+ }
46
+ if (path === null || path === "/") return null;
47
+ const crumbs = crumbsFromPath(path, block.homeLabel);
48
+ return /* @__PURE__ */ jsxs("nav", { className: "xicms-breadcrumbs", "aria-label": "Kruimelpad", children: [
49
+ /* @__PURE__ */ jsx("ol", { className: "xicms-breadcrumbs__list", children: crumbs.map((c, i) => /* @__PURE__ */ jsx("li", { className: "xicms-breadcrumbs__item", children: i < crumbs.length - 1 ? (
50
+ // De eerste kruimel ís `homeLabel`; de rest komt uit het pad en is dus geen blokveld.
51
+ /* @__PURE__ */ jsx(LinkC, { href: c.href, children: i === 0 ? /* @__PURE__ */ jsx("span", { "data-xicms-edit": "homeLabel", children: c.label }) : c.label })
52
+ ) : /* @__PURE__ */ jsx("span", { "aria-current": "page", children: c.label }) }, c.href)) }),
53
+ block.jsonLd && /* @__PURE__ */ jsx(
54
+ "script",
55
+ {
56
+ type: "application/ld+json",
57
+ dangerouslySetInnerHTML: {
58
+ __html: jsonLdHtml(
59
+ breadcrumbsJsonLd(crumbs.map((c) => ({ ...c, href: `${window.location.origin}${c.href}` })))
60
+ )
61
+ }
62
+ }
63
+ )
64
+ ] });
65
+ }
66
+ export {
67
+ BreadcrumbsRender,
68
+ breadcrumbsJsonLd,
69
+ crumbsFromPath
70
+ };
71
+ //# sourceMappingURL=BreadcrumbsRender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/blocks/builtins/BreadcrumbsRender.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport type { z } from \"zod\";\nimport type { BreadcrumbsBlockSchema } from \"../../schema/blocks\";\nimport type { BlockRenderProps } from \"../registry\";\nimport { useLinkComponent } from \"@astryxdesign/core/Link\";\nimport { jsonLdHtml } from \"./jsonld\";\n\ntype Breadcrumbs = z.infer<typeof BreadcrumbsBlockSchema>;\n\nexport interface Crumb {\n label: string;\n href: string;\n}\n\n/** Kruimels uit een pad: \"/diensten/tuinaanleg\" → Home / Diensten / Tuinaanleg. Puur en getest. */\nexport function crumbsFromPath(path: string, homeLabel = \"Home\"): Crumb[] {\n const segments = path.split(\"/\").filter(Boolean);\n const crumbs: Crumb[] = [{ label: homeLabel, href: \"/\" }];\n let href = \"\";\n for (const seg of segments) {\n href += `/${seg}`;\n // decodeURIComponent gooit op misvormde percent-encoding (\"%E0%A4%A\") — dan het rauwe segment.\n let decoded = seg;\n try {\n decoded = decodeURIComponent(seg);\n } catch {\n /* rauw segment als label */\n }\n const label = decoded.replace(/[-_]+/g, \" \").replace(/^./, (c) => c.toUpperCase());\n crumbs.push({ label, href });\n }\n return crumbs;\n}\n\n/** BreadcrumbList-JSON-LD. Puur en getest. */\nexport function breadcrumbsJsonLd(crumbs: Crumb[]): Record<string, unknown> {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"BreadcrumbList\",\n itemListElement: crumbs.map((c, i) => ({\n \"@type\": \"ListItem\",\n position: i + 1,\n name: c.label,\n item: c.href,\n })),\n };\n}\n\n/**\n * Kruimelpad, afgeleid van de URL (client, ná mount — hydration-veilig). Op de homepage\n * (alleen \"Home\") wordt niets getoond.\n */\nexport function BreadcrumbsRender({ block, mode }: BlockRenderProps<Breadcrumbs>) {\n const LinkC = useLinkComponent();\n const [path, setPath] = useState<string | null>(null);\n useEffect(() => {\n setPath(window.location.pathname);\n }, []);\n\n if (mode === \"preview\" && (path === null || path === \"/\")) {\n return <nav className=\"xicms-breadcrumbs\" aria-label=\"Kruimelpad\"><span data-xicms-edit=\"homeLabel\">{block.homeLabel}</span> / Voorbeeldpagina</nav>;\n }\n if (path === null || path === \"/\") return null;\n const crumbs = crumbsFromPath(path, block.homeLabel);\n\n return (\n <nav className=\"xicms-breadcrumbs\" aria-label=\"Kruimelpad\">\n <ol className=\"xicms-breadcrumbs__list\">\n {crumbs.map((c, i) => (\n <li key={c.href} className=\"xicms-breadcrumbs__item\">\n {i < crumbs.length - 1 ? (\n // De eerste kruimel ís `homeLabel`; de rest komt uit het pad en is dus geen blokveld.\n <LinkC href={c.href}>{i === 0 ? <span data-xicms-edit=\"homeLabel\">{c.label}</span> : c.label}</LinkC>\n ) : (\n <span aria-current=\"page\">{c.label}</span>\n )}\n </li>\n ))}\n </ol>\n {block.jsonLd && (\n <script\n type=\"application/ld+json\"\n // eslint-disable-next-line react/no-danger\n // Absolute URL's: Google wil volledige item-URL's in BreadcrumbList (dit rendert\n // client-side ná mount, dus window.location.origin is beschikbaar).\n dangerouslySetInnerHTML={{\n __html: jsonLdHtml(\n breadcrumbsJsonLd(crumbs.map((c) => ({ ...c, href: `${window.location.origin}${c.href}` }))),\n ),\n }}\n />\n )}\n </nav>\n );\n}\n"],"mappings":";AA8DW,SAA2D,KAA3D;AA5DX,SAAS,WAAW,gBAAgB;AAIpC,SAAS,wBAAwB;AACjC,SAAS,kBAAkB;AAUpB,SAAS,eAAe,MAAc,YAAY,QAAiB;AACxE,QAAM,WAAW,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAC/C,QAAM,SAAkB,CAAC,EAAE,OAAO,WAAW,MAAM,IAAI,CAAC;AACxD,MAAI,OAAO;AACX,aAAW,OAAO,UAAU;AAC1B,YAAQ,IAAI,GAAG;AAEf,QAAI,UAAU;AACd,QAAI;AACF,gBAAU,mBAAmB,GAAG;AAAA,IAClC,QAAQ;AAAA,IAER;AACA,UAAM,QAAQ,QAAQ,QAAQ,UAAU,GAAG,EAAE,QAAQ,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;AACjF,WAAO,KAAK,EAAE,OAAO,KAAK,CAAC;AAAA,EAC7B;AACA,SAAO;AACT;AAGO,SAAS,kBAAkB,QAA0C;AAC1E,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,iBAAiB,OAAO,IAAI,CAAC,GAAG,OAAO;AAAA,MACrC,SAAS;AAAA,MACT,UAAU,IAAI;AAAA,MACd,MAAM,EAAE;AAAA,MACR,MAAM,EAAE;AAAA,IACV,EAAE;AAAA,EACJ;AACF;AAMO,SAAS,kBAAkB,EAAE,OAAO,KAAK,GAAkC;AAChF,QAAM,QAAQ,iBAAiB;AAC/B,QAAM,CAAC,MAAM,OAAO,IAAI,SAAwB,IAAI;AACpD,YAAU,MAAM;AACd,YAAQ,OAAO,SAAS,QAAQ;AAAA,EAClC,GAAG,CAAC,CAAC;AAEL,MAAI,SAAS,cAAc,SAAS,QAAQ,SAAS,MAAM;AACzD,WAAO,qBAAC,SAAI,WAAU,qBAAoB,cAAW,cAAa;AAAA,0BAAC,UAAK,mBAAgB,aAAa,gBAAM,WAAU;AAAA,MAAO;AAAA,OAAkB;AAAA,EAChJ;AACA,MAAI,SAAS,QAAQ,SAAS,IAAK,QAAO;AAC1C,QAAM,SAAS,eAAe,MAAM,MAAM,SAAS;AAEnD,SACE,qBAAC,SAAI,WAAU,qBAAoB,cAAW,cAC5C;AAAA,wBAAC,QAAG,WAAU,2BACX,iBAAO,IAAI,CAAC,GAAG,MACd,oBAAC,QAAgB,WAAU,2BACxB,cAAI,OAAO,SAAS;AAAA;AAAA,MAEnB,oBAAC,SAAM,MAAM,EAAE,MAAO,gBAAM,IAAI,oBAAC,UAAK,mBAAgB,aAAa,YAAE,OAAM,IAAU,EAAE,OAAM;AAAA,QAE7F,oBAAC,UAAK,gBAAa,QAAQ,YAAE,OAAM,KAL9B,EAAE,IAOX,CACD,GACH;AAAA,IACC,MAAM,UACL;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QAIL,yBAAyB;AAAA,UACvB,QAAQ;AAAA,YACN,kBAAkB,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,GAAG,OAAO,SAAS,MAAM,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC;AAAA,UAC7F;AAAA,QACF;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;","names":[]}
@@ -1,2 +1 @@
1
- import type { z } from "zod";
2
- export declare const cardsBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
1
+ export declare const cardsBlock: import("../index.js").BlockDefinition<import("zod/v4/core").$ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>>;
@@ -1,81 +1,9 @@
1
- "use client";
2
- import { jsx, jsxs } from "react/jsx-runtime";
1
+ import dynamic from "next/dynamic";
3
2
  import { defineBlock } from "../registry.js";
4
- import { VStack, Grid, Card, Heading, Text } from "../ui/index.js";
5
- import { useLinkComponent } from "@astryxdesign/core/Link";
6
- import { Img } from "../../media/ImageContext.js";
7
- function CardsRender({ block }) {
8
- const LinkC = useLinkComponent();
9
- const items = (block.items ?? []).map((c, i) => ({ ...c, _i: i })).filter((c) => c.title || c.text || c.imageUrl);
10
- if (items.length === 0 && !block.heading) return null;
11
- return /* @__PURE__ */ jsxs(VStack, { gap: 4, as: "section", className: "xicms-cards", children: [
12
- (block.heading || block.intro) && /* @__PURE__ */ jsxs(VStack, { gap: 1, hAlign: "center", style: { textAlign: "center" }, children: [
13
- block.heading && /* @__PURE__ */ jsx(Heading, { level: 2, "data-xicms-edit": "heading", children: block.heading }),
14
- block.intro && /* @__PURE__ */ jsx(Text, { type: "large", color: "secondary", "data-xicms-edit": "intro", children: block.intro })
15
- ] }),
16
- /* @__PURE__ */ jsx(Grid, { columns: { minWidth: 240, max: block.columns }, gap: 4, children: items.map((c) => {
17
- const i = c._i;
18
- const cover = block.imageStyle === "cover" && Boolean(c.imageUrl);
19
- const body = /* @__PURE__ */ jsxs(VStack, { gap: 2, style: cover ? { padding: "1.1rem 1.25rem 1.25rem" } : void 0, children: [
20
- c.title && /* @__PURE__ */ jsx(Heading, { level: 3, className: "xicms-cards__title", "data-xicms-edit": `items.${i}.title`, children: c.title }),
21
- c.text && /* @__PURE__ */ jsx(Text, { color: "secondary", className: "xicms-cards__text", "data-xicms-edit": `items.${i}.text`, children: c.text }),
22
- c.href && c.linkLabel && /* @__PURE__ */ jsxs(Text, { type: "label", style: { color: "var(--color-accent)" }, children: [
23
- /* @__PURE__ */ jsx("span", { "data-xicms-edit": `items.${i}.linkLabel`, children: c.linkLabel }),
24
- " \u2192"
25
- ] })
26
- ] });
27
- const inner = cover ? /* @__PURE__ */ jsxs(VStack, { gap: 0, style: { height: "100%" }, children: [
28
- /* @__PURE__ */ jsx(
29
- Img,
30
- {
31
- src: c.imageUrl,
32
- alt: c.title ?? "",
33
- width: 600,
34
- height: 360,
35
- sizes: "(max-width: 720px) 100vw, 33vw",
36
- editField: `items.${i}.imageUrl`,
37
- style: { width: "100%", aspectRatio: "16 / 10", objectFit: "cover", display: "block" }
38
- }
39
- ),
40
- body
41
- ] }) : /* @__PURE__ */ jsxs(VStack, { gap: 2, children: [
42
- c.imageUrl ? /* @__PURE__ */ jsx(
43
- Img,
44
- {
45
- src: c.imageUrl,
46
- alt: c.title ?? "",
47
- width: 480,
48
- height: 300,
49
- sizes: "(max-width: 720px) 100vw, 33vw",
50
- editField: `items.${i}.imageUrl`,
51
- style: { width: "100%", height: 160, objectFit: "cover", borderRadius: "var(--radius-element)" }
52
- }
53
- ) : c.icon ? /* @__PURE__ */ jsx("div", { "aria-hidden": "true", style: { fontSize: "2rem", lineHeight: 1 }, children: c.icon }) : null,
54
- c.title && /* @__PURE__ */ jsx(Heading, { level: 3, className: "xicms-cards__title", "data-xicms-edit": `items.${i}.title`, children: c.title }),
55
- c.text && /* @__PURE__ */ jsx(Text, { color: "secondary", className: "xicms-cards__text", "data-xicms-edit": `items.${i}.text`, children: c.text }),
56
- c.href && c.linkLabel && /* @__PURE__ */ jsxs(Text, { type: "label", style: { color: "var(--color-accent)" }, children: [
57
- /* @__PURE__ */ jsx("span", { "data-xicms-edit": `items.${i}.linkLabel`, children: c.linkLabel }),
58
- " \u2192"
59
- ] })
60
- ] });
61
- const card = /* @__PURE__ */ jsx(
62
- Card,
63
- {
64
- padding: cover ? 0 : 4,
65
- height: "100%",
66
- className: `xicms-cards__card${c.featured ? " xicms-cards__card--featured" : ""}`,
67
- style: cover ? { overflow: "hidden" } : void 0,
68
- children: inner
69
- }
70
- );
71
- return c.href ? /* @__PURE__ */ jsx(LinkC, { href: c.href, style: { textDecoration: "none", color: "inherit", display: "block" }, children: card }, i) : /* @__PURE__ */ jsx("div", { children: card }, i);
72
- }) })
73
- ] });
74
- }
75
3
  const cardsBlock = defineBlock({
76
4
  type: "cards",
77
5
  fields: { "items.icon": { type: "icon" } },
78
- Render: CardsRender,
6
+ Render: dynamic(() => import("./CardsRender.js").then((m) => m.CardsRender)),
79
7
  label: "Diensten / kaarten",
80
8
  icon: "\u{1F9E9}",
81
9
  defaults: () => ({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/blocks/builtins/Cards.tsx"],"sourcesContent":["\"use client\";\n\nimport type { z } from \"zod\";\nimport type { CardsBlockSchema } from \"../../schema/blocks\";\nimport { defineBlock, type BlockRenderProps } from \"../registry\";\nimport { VStack, Grid, Card, Heading, Text } from \"../ui\";\nimport { useLinkComponent } from \"@astryxdesign/core/Link\";\nimport { Img } from \"../../media/ImageContext\";\n\ntype Cards = z.infer<typeof CardsBlockSchema>;\n\n/** Diensten/uitgelichte kaarten in een responsive grid (Astryx). */\nfunction CardsRender({ block }: BlockRenderProps<Cards>) {\n const LinkC = useLinkComponent();\n // _i = index in de OORSPRONKELIJKE array — inline-edit-paden moeten naar de ongefilterde\n // items wijzen, anders schrijft bewerken naar het verkeerde (weggefilterde) item.\n const items = (block.items ?? []).map((c, i) => ({ ...c, _i: i })).filter((c) => c.title || c.text || c.imageUrl);\n if (items.length === 0 && !block.heading) return null;\n return (\n <VStack gap={4} as=\"section\" className=\"xicms-cards\">\n {(block.heading || block.intro) && (\n <VStack gap={1} hAlign=\"center\" style={{ textAlign: \"center\" }}>\n {block.heading && <Heading level={2} data-xicms-edit=\"heading\">{block.heading}</Heading>}\n {block.intro && <Text type=\"large\" color=\"secondary\" data-xicms-edit=\"intro\">{block.intro}</Text>}\n </VStack>\n )}\n <Grid columns={{ minWidth: 240, max: block.columns }} gap={4}>\n {items.map((c) => {\n const i = c._i;\n const cover = block.imageStyle === \"cover\" && Boolean(c.imageUrl);\n const body = (\n <VStack gap={2} style={cover ? { padding: \"1.1rem 1.25rem 1.25rem\" } : undefined}>\n {c.title && <Heading level={3} className=\"xicms-cards__title\" data-xicms-edit={`items.${i}.title`}>{c.title}</Heading>}\n {c.text && <Text color=\"secondary\" className=\"xicms-cards__text\" data-xicms-edit={`items.${i}.text`}>{c.text}</Text>}\n {c.href && c.linkLabel && (\n <Text type=\"label\" style={{ color: \"var(--color-accent)\" }}><span data-xicms-edit={`items.${i}.linkLabel`}>{c.linkLabel}</span> →</Text>\n )}\n </VStack>\n );\n const inner = cover ? (\n <VStack gap={0} style={{ height: \"100%\" }}>\n {/* Beeld edge-to-edge bovenaan (postkaart-stijl); tekst hieronder gepad. */}\n <Img src={c.imageUrl as string} alt={c.title ?? \"\"} width={600} height={360}\n sizes=\"(max-width: 720px) 100vw, 33vw\" editField={`items.${i}.imageUrl`}\n style={{ width: \"100%\", aspectRatio: \"16 / 10\", objectFit: \"cover\", display: \"block\" }} />\n {body}\n </VStack>\n ) : (\n <VStack gap={2}>\n {c.imageUrl ? (\n <Img src={c.imageUrl} alt={c.title ?? \"\"} width={480} height={300}\n sizes=\"(max-width: 720px) 100vw, 33vw\" editField={`items.${i}.imageUrl`}\n style={{ width: \"100%\", height: 160, objectFit: \"cover\", borderRadius: \"var(--radius-element)\" }} />\n ) : c.icon ? (\n <div aria-hidden=\"true\" style={{ fontSize: \"2rem\", lineHeight: 1 }}>{c.icon}</div>\n ) : null}\n {c.title && <Heading level={3} className=\"xicms-cards__title\" data-xicms-edit={`items.${i}.title`}>{c.title}</Heading>}\n {c.text && <Text color=\"secondary\" className=\"xicms-cards__text\" data-xicms-edit={`items.${i}.text`}>{c.text}</Text>}\n {c.href && c.linkLabel && (\n <Text type=\"label\" style={{ color: \"var(--color-accent)\" }}><span data-xicms-edit={`items.${i}.linkLabel`}>{c.linkLabel}</span> →</Text>\n )}\n </VStack>\n );\n const card = (\n <Card\n padding={cover ? 0 : 4}\n height=\"100%\"\n className={`xicms-cards__card${c.featured ? \" xicms-cards__card--featured\" : \"\"}`}\n style={cover ? { overflow: \"hidden\" } : undefined}\n >\n {inner}\n </Card>\n );\n return c.href ? (\n <LinkC key={i} href={c.href} style={{ textDecoration: \"none\", color: \"inherit\", display: \"block\" }}>\n {card}\n </LinkC>\n ) : (\n <div key={i}>{card}</div>\n );\n })}\n </Grid>\n </VStack>\n );\n}\n\nexport const cardsBlock = defineBlock({\n type: \"cards\",\n fields: { \"items.icon\": { type: \"icon\" } },\n Render: CardsRender,\n label: \"Diensten / kaarten\",\n icon: \"🧩\",\n defaults: () => ({\n heading: \"Onze diensten\",\n columns: 3,\n items: [\n { icon: \"⭐\", title: \"Dienst één\", text: \"Korte omschrijving van wat je biedt.\" },\n { icon: \"⚡\", title: \"Dienst twee\", text: \"Korte omschrijving van wat je biedt.\" },\n { icon: \"💬\", title: \"Dienst drie\", text: \"Korte omschrijving van wat je biedt.\" },\n ],\n }),\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/blocks/builtins/Cards.tsx"],"sourcesContent":["import dynamic from \"next/dynamic\";\nimport { defineBlock } from \"../registry\";\n\nexport const cardsBlock = defineBlock({\n type: \"cards\",\n fields: { \"items.icon\": { type: \"icon\" } },\n Render: dynamic(() => import(\"./CardsRender\").then((m) => m.CardsRender)),\n label: \"Diensten / kaarten\",\n icon: \"🧩\",\n defaults: () => ({\n heading: \"Onze diensten\",\n columns: 3,\n items: [\n { icon: \"⭐\", title: \"Dienst één\", text: \"Korte omschrijving van wat je biedt.\" },\n { icon: \"⚡\", title: \"Dienst twee\", text: \"Korte omschrijving van wat je biedt.\" },\n { icon: \"💬\", title: \"Dienst drie\", text: \"Korte omschrijving van wat je biedt.\" },\n ],\n }),\n});\n"],"mappings":"AAAA,OAAO,aAAa;AACpB,SAAS,mBAAmB;AAErB,MAAM,aAAa,YAAY;AAAA,EACpC,MAAM;AAAA,EACN,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,EAAE;AAAA,EACzC,QAAQ,QAAQ,MAAM,OAAO,eAAe,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC;AAAA,EACxE,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,MACL,EAAE,MAAM,UAAK,OAAO,oBAAc,MAAM,uCAAuC;AAAA,MAC/E,EAAE,MAAM,UAAK,OAAO,eAAe,MAAM,uCAAuC;AAAA,MAChF,EAAE,MAAM,aAAM,OAAO,eAAe,MAAM,uCAAuC;AAAA,IACnF;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -0,0 +1,7 @@
1
+ import type { z } from "zod";
2
+ import type { CardsBlockSchema } from "../../schema/blocks.js";
3
+ import type { BlockRenderProps } from "../registry.js";
4
+ type Cards = z.infer<typeof CardsBlockSchema>;
5
+ /** Diensten/uitgelichte kaarten in een responsive grid (Astryx). */
6
+ export declare function CardsRender({ block }: BlockRenderProps<Cards>): import("react").JSX.Element | null;
7
+ export {};
@@ -0,0 +1,77 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { VStack, Grid, Card, Heading, Text } from "../ui/index.js";
4
+ import { useLinkComponent } from "@astryxdesign/core/Link";
5
+ import { Img } from "../../media/ImageContext.js";
6
+ function CardsRender({ block }) {
7
+ const LinkC = useLinkComponent();
8
+ const items = (block.items ?? []).map((c, i) => ({ ...c, _i: i })).filter((c) => c.title || c.text || c.imageUrl);
9
+ if (items.length === 0 && !block.heading) return null;
10
+ return /* @__PURE__ */ jsxs(VStack, { gap: 4, as: "section", className: "xicms-cards", children: [
11
+ (block.heading || block.intro) && /* @__PURE__ */ jsxs(VStack, { gap: 1, hAlign: "center", style: { textAlign: "center" }, children: [
12
+ block.heading && /* @__PURE__ */ jsx(Heading, { level: 2, "data-xicms-edit": "heading", children: block.heading }),
13
+ block.intro && /* @__PURE__ */ jsx(Text, { type: "large", color: "secondary", "data-xicms-edit": "intro", children: block.intro })
14
+ ] }),
15
+ /* @__PURE__ */ jsx(Grid, { columns: { minWidth: 240, max: block.columns }, gap: 4, children: items.map((c) => {
16
+ const i = c._i;
17
+ const cover = block.imageStyle === "cover" && Boolean(c.imageUrl);
18
+ const body = /* @__PURE__ */ jsxs(VStack, { gap: 2, style: cover ? { padding: "1.1rem 1.25rem 1.25rem" } : void 0, children: [
19
+ c.title && /* @__PURE__ */ jsx(Heading, { level: 3, className: "xicms-cards__title", "data-xicms-edit": `items.${i}.title`, children: c.title }),
20
+ c.text && /* @__PURE__ */ jsx(Text, { color: "secondary", className: "xicms-cards__text", "data-xicms-edit": `items.${i}.text`, children: c.text }),
21
+ c.href && c.linkLabel && /* @__PURE__ */ jsxs(Text, { type: "label", style: { color: "var(--color-accent)" }, children: [
22
+ /* @__PURE__ */ jsx("span", { "data-xicms-edit": `items.${i}.linkLabel`, children: c.linkLabel }),
23
+ " \u2192"
24
+ ] })
25
+ ] });
26
+ const inner = cover ? /* @__PURE__ */ jsxs(VStack, { gap: 0, style: { height: "100%" }, children: [
27
+ /* @__PURE__ */ jsx(
28
+ Img,
29
+ {
30
+ src: c.imageUrl,
31
+ alt: c.title ?? "",
32
+ width: 600,
33
+ height: 360,
34
+ sizes: "(max-width: 720px) 100vw, 33vw",
35
+ editField: `items.${i}.imageUrl`,
36
+ style: { width: "100%", aspectRatio: "16 / 10", objectFit: "cover", display: "block" }
37
+ }
38
+ ),
39
+ body
40
+ ] }) : /* @__PURE__ */ jsxs(VStack, { gap: 2, children: [
41
+ c.imageUrl ? /* @__PURE__ */ jsx(
42
+ Img,
43
+ {
44
+ src: c.imageUrl,
45
+ alt: c.title ?? "",
46
+ width: 480,
47
+ height: 300,
48
+ sizes: "(max-width: 720px) 100vw, 33vw",
49
+ editField: `items.${i}.imageUrl`,
50
+ style: { width: "100%", height: 160, objectFit: "cover", borderRadius: "var(--radius-element)" }
51
+ }
52
+ ) : c.icon ? /* @__PURE__ */ jsx("div", { "aria-hidden": "true", style: { fontSize: "2rem", lineHeight: 1 }, children: c.icon }) : null,
53
+ c.title && /* @__PURE__ */ jsx(Heading, { level: 3, className: "xicms-cards__title", "data-xicms-edit": `items.${i}.title`, children: c.title }),
54
+ c.text && /* @__PURE__ */ jsx(Text, { color: "secondary", className: "xicms-cards__text", "data-xicms-edit": `items.${i}.text`, children: c.text }),
55
+ c.href && c.linkLabel && /* @__PURE__ */ jsxs(Text, { type: "label", style: { color: "var(--color-accent)" }, children: [
56
+ /* @__PURE__ */ jsx("span", { "data-xicms-edit": `items.${i}.linkLabel`, children: c.linkLabel }),
57
+ " \u2192"
58
+ ] })
59
+ ] });
60
+ const card = /* @__PURE__ */ jsx(
61
+ Card,
62
+ {
63
+ padding: cover ? 0 : 4,
64
+ height: "100%",
65
+ className: `xicms-cards__card${c.featured ? " xicms-cards__card--featured" : ""}`,
66
+ style: cover ? { overflow: "hidden" } : void 0,
67
+ children: inner
68
+ }
69
+ );
70
+ return c.href ? /* @__PURE__ */ jsx(LinkC, { href: c.href, style: { textDecoration: "none", color: "inherit", display: "block" }, children: card }, i) : /* @__PURE__ */ jsx("div", { children: card }, i);
71
+ }) })
72
+ ] });
73
+ }
74
+ export {
75
+ CardsRender
76
+ };
77
+ //# sourceMappingURL=CardsRender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/blocks/builtins/CardsRender.tsx"],"sourcesContent":["\"use client\";\n\nimport type { z } from \"zod\";\nimport type { CardsBlockSchema } from \"../../schema/blocks\";\nimport type { BlockRenderProps } from \"../registry\";\nimport { VStack, Grid, Card, Heading, Text } from \"../ui\";\nimport { useLinkComponent } from \"@astryxdesign/core/Link\";\nimport { Img } from \"../../media/ImageContext\";\n\ntype Cards = z.infer<typeof CardsBlockSchema>;\n\n/** Diensten/uitgelichte kaarten in een responsive grid (Astryx). */\nexport function CardsRender({ block }: BlockRenderProps<Cards>) {\n const LinkC = useLinkComponent();\n // _i = index in de OORSPRONKELIJKE array — inline-edit-paden moeten naar de ongefilterde\n // items wijzen, anders schrijft bewerken naar het verkeerde (weggefilterde) item.\n const items = (block.items ?? []).map((c, i) => ({ ...c, _i: i })).filter((c) => c.title || c.text || c.imageUrl);\n if (items.length === 0 && !block.heading) return null;\n return (\n <VStack gap={4} as=\"section\" className=\"xicms-cards\">\n {(block.heading || block.intro) && (\n <VStack gap={1} hAlign=\"center\" style={{ textAlign: \"center\" }}>\n {block.heading && <Heading level={2} data-xicms-edit=\"heading\">{block.heading}</Heading>}\n {block.intro && <Text type=\"large\" color=\"secondary\" data-xicms-edit=\"intro\">{block.intro}</Text>}\n </VStack>\n )}\n <Grid columns={{ minWidth: 240, max: block.columns }} gap={4}>\n {items.map((c) => {\n const i = c._i;\n const cover = block.imageStyle === \"cover\" && Boolean(c.imageUrl);\n const body = (\n <VStack gap={2} style={cover ? { padding: \"1.1rem 1.25rem 1.25rem\" } : undefined}>\n {c.title && <Heading level={3} className=\"xicms-cards__title\" data-xicms-edit={`items.${i}.title`}>{c.title}</Heading>}\n {c.text && <Text color=\"secondary\" className=\"xicms-cards__text\" data-xicms-edit={`items.${i}.text`}>{c.text}</Text>}\n {c.href && c.linkLabel && (\n <Text type=\"label\" style={{ color: \"var(--color-accent)\" }}><span data-xicms-edit={`items.${i}.linkLabel`}>{c.linkLabel}</span> →</Text>\n )}\n </VStack>\n );\n const inner = cover ? (\n <VStack gap={0} style={{ height: \"100%\" }}>\n {/* Beeld edge-to-edge bovenaan (postkaart-stijl); tekst hieronder gepad. */}\n <Img src={c.imageUrl as string} alt={c.title ?? \"\"} width={600} height={360}\n sizes=\"(max-width: 720px) 100vw, 33vw\" editField={`items.${i}.imageUrl`}\n style={{ width: \"100%\", aspectRatio: \"16 / 10\", objectFit: \"cover\", display: \"block\" }} />\n {body}\n </VStack>\n ) : (\n <VStack gap={2}>\n {c.imageUrl ? (\n <Img src={c.imageUrl} alt={c.title ?? \"\"} width={480} height={300}\n sizes=\"(max-width: 720px) 100vw, 33vw\" editField={`items.${i}.imageUrl`}\n style={{ width: \"100%\", height: 160, objectFit: \"cover\", borderRadius: \"var(--radius-element)\" }} />\n ) : c.icon ? (\n <div aria-hidden=\"true\" style={{ fontSize: \"2rem\", lineHeight: 1 }}>{c.icon}</div>\n ) : null}\n {c.title && <Heading level={3} className=\"xicms-cards__title\" data-xicms-edit={`items.${i}.title`}>{c.title}</Heading>}\n {c.text && <Text color=\"secondary\" className=\"xicms-cards__text\" data-xicms-edit={`items.${i}.text`}>{c.text}</Text>}\n {c.href && c.linkLabel && (\n <Text type=\"label\" style={{ color: \"var(--color-accent)\" }}><span data-xicms-edit={`items.${i}.linkLabel`}>{c.linkLabel}</span> →</Text>\n )}\n </VStack>\n );\n const card = (\n <Card\n padding={cover ? 0 : 4}\n height=\"100%\"\n className={`xicms-cards__card${c.featured ? \" xicms-cards__card--featured\" : \"\"}`}\n style={cover ? { overflow: \"hidden\" } : undefined}\n >\n {inner}\n </Card>\n );\n return c.href ? (\n <LinkC key={i} href={c.href} style={{ textDecoration: \"none\", color: \"inherit\", display: \"block\" }}>\n {card}\n </LinkC>\n ) : (\n <div key={i}>{card}</div>\n );\n })}\n </Grid>\n </VStack>\n );\n}\n"],"mappings":"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","names":[]}