@xiwebdesign/xicms-core 7.13.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 (280) hide show
  1. package/dist/admin/lib/mediaUsage.d.ts +17 -0
  2. package/dist/admin/lib/mediaUsage.js +32 -1
  3. package/dist/admin/lib/mediaUsage.js.map +1 -1
  4. package/dist/admin/media/MediaManager.js +74 -17
  5. package/dist/admin/media/MediaManager.js.map +1 -1
  6. package/dist/admin/visual/VisualEditor.js +37 -3
  7. package/dist/admin/visual/VisualEditor.js.map +1 -1
  8. package/dist/blocks/BlockErrorBoundary.d.ts +1 -0
  9. package/dist/blocks/BlockErrorBoundary.js +4 -0
  10. package/dist/blocks/BlockErrorBoundary.js.map +1 -1
  11. package/dist/blocks/BlockRenderer.js +1 -1
  12. package/dist/blocks/BlockRenderer.js.map +1 -1
  13. package/dist/blocks/builtins/Accordion.d.ts +1 -2
  14. package/dist/blocks/builtins/Accordion.js +2 -39
  15. package/dist/blocks/builtins/Accordion.js.map +1 -1
  16. package/dist/blocks/builtins/AccordionRender.d.ts +7 -0
  17. package/dist/blocks/builtins/AccordionRender.js +42 -0
  18. package/dist/blocks/builtins/AccordionRender.js.map +1 -0
  19. package/dist/blocks/builtins/Agenda.d.ts +1 -29
  20. package/dist/blocks/builtins/Agenda.js +3 -94
  21. package/dist/blocks/builtins/Agenda.js.map +1 -1
  22. package/dist/blocks/builtins/AgendaRender.d.ts +34 -0
  23. package/dist/blocks/builtins/AgendaRender.js +96 -0
  24. package/dist/blocks/builtins/AgendaRender.js.map +1 -0
  25. package/dist/blocks/builtins/Banner.d.ts +1 -2
  26. package/dist/blocks/builtins/Banner.js +2 -32
  27. package/dist/blocks/builtins/Banner.js.map +1 -1
  28. package/dist/blocks/builtins/BannerRender.d.ts +11 -0
  29. package/dist/blocks/builtins/BannerRender.js +35 -0
  30. package/dist/blocks/builtins/BannerRender.js.map +1 -0
  31. package/dist/blocks/builtins/BeforeAfter.d.ts +1 -2
  32. package/dist/blocks/builtins/BeforeAfter.js +2 -31
  33. package/dist/blocks/builtins/BeforeAfter.js.map +1 -1
  34. package/dist/blocks/builtins/BeforeAfterRender.d.ts +11 -0
  35. package/dist/blocks/builtins/BeforeAfterRender.js +34 -0
  36. package/dist/blocks/builtins/BeforeAfterRender.js.map +1 -0
  37. package/dist/blocks/builtins/Booking.d.ts +1 -2
  38. package/dist/blocks/builtins/Booking.js +2 -14
  39. package/dist/blocks/builtins/Booking.js.map +1 -1
  40. package/dist/blocks/builtins/BookingRender.d.ts +8 -0
  41. package/dist/blocks/builtins/BookingRender.js +17 -0
  42. package/dist/blocks/builtins/BookingRender.js.map +1 -0
  43. package/dist/blocks/builtins/Breadcrumbs.d.ts +1 -10
  44. package/dist/blocks/builtins/Breadcrumbs.js +3 -69
  45. package/dist/blocks/builtins/Breadcrumbs.js.map +1 -1
  46. package/dist/blocks/builtins/BreadcrumbsRender.d.ts +18 -0
  47. package/dist/blocks/builtins/BreadcrumbsRender.js +71 -0
  48. package/dist/blocks/builtins/BreadcrumbsRender.js.map +1 -0
  49. package/dist/blocks/builtins/Cards.d.ts +1 -2
  50. package/dist/blocks/builtins/Cards.js +2 -74
  51. package/dist/blocks/builtins/Cards.js.map +1 -1
  52. package/dist/blocks/builtins/CardsRender.d.ts +7 -0
  53. package/dist/blocks/builtins/CardsRender.js +77 -0
  54. package/dist/blocks/builtins/CardsRender.js.map +1 -0
  55. package/dist/blocks/builtins/Columns.d.ts +1 -2
  56. package/dist/blocks/builtins/Columns.js +2 -9
  57. package/dist/blocks/builtins/Columns.js.map +1 -1
  58. package/dist/blocks/builtins/ColumnsRender.d.ts +6 -0
  59. package/dist/blocks/builtins/ColumnsRender.js +12 -0
  60. package/dist/blocks/builtins/ColumnsRender.js.map +1 -0
  61. package/dist/blocks/builtins/Contact.d.ts +2 -7
  62. package/dist/blocks/builtins/Contact.js +3 -102
  63. package/dist/blocks/builtins/Contact.js.map +1 -1
  64. package/dist/blocks/builtins/ContactRender.d.ts +9 -0
  65. package/dist/blocks/builtins/ContactRender.js +105 -0
  66. package/dist/blocks/builtins/ContactRender.js.map +1 -0
  67. package/dist/blocks/builtins/Countdown.d.ts +1 -18
  68. package/dist/blocks/builtins/Countdown.js +3 -53
  69. package/dist/blocks/builtins/Countdown.js.map +1 -1
  70. package/dist/blocks/builtins/CountdownRender.d.ts +22 -0
  71. package/dist/blocks/builtins/CountdownRender.js +55 -0
  72. package/dist/blocks/builtins/CountdownRender.js.map +1 -0
  73. package/dist/blocks/builtins/Cta.d.ts +1 -2
  74. package/dist/blocks/builtins/Cta.js +2 -39
  75. package/dist/blocks/builtins/Cta.js.map +1 -1
  76. package/dist/blocks/builtins/CtaRender.d.ts +6 -0
  77. package/dist/blocks/builtins/CtaRender.js +42 -0
  78. package/dist/blocks/builtins/CtaRender.js.map +1 -0
  79. package/dist/blocks/builtins/Downloads.d.ts +1 -2
  80. package/dist/blocks/builtins/Downloads.js +2 -16
  81. package/dist/blocks/builtins/Downloads.js.map +1 -1
  82. package/dist/blocks/builtins/DownloadsRender.d.ts +7 -0
  83. package/dist/blocks/builtins/DownloadsRender.js +19 -0
  84. package/dist/blocks/builtins/DownloadsRender.js.map +1 -0
  85. package/dist/blocks/builtins/Elements.d.ts +3 -4
  86. package/dist/blocks/builtins/Elements.js +4 -38
  87. package/dist/blocks/builtins/Elements.js.map +1 -1
  88. package/dist/blocks/builtins/ElementsRender.d.ts +10 -0
  89. package/dist/blocks/builtins/ElementsRender.js +41 -0
  90. package/dist/blocks/builtins/ElementsRender.js.map +1 -0
  91. package/dist/blocks/builtins/Embed.d.ts +1 -2
  92. package/dist/blocks/builtins/Embed.js +2 -19
  93. package/dist/blocks/builtins/Embed.js.map +1 -1
  94. package/dist/blocks/builtins/EmbedRender.d.ts +7 -0
  95. package/dist/blocks/builtins/EmbedRender.js +22 -0
  96. package/dist/blocks/builtins/EmbedRender.js.map +1 -0
  97. package/dist/blocks/builtins/Faq.d.ts +1 -6
  98. package/dist/blocks/builtins/Faq.js +3 -103
  99. package/dist/blocks/builtins/Faq.js.map +1 -1
  100. package/dist/blocks/builtins/FaqRender.d.ts +10 -0
  101. package/dist/blocks/builtins/FaqRender.js +105 -0
  102. package/dist/blocks/builtins/FaqRender.js.map +1 -0
  103. package/dist/blocks/builtins/FormBlock.d.ts +1 -2
  104. package/dist/blocks/builtins/FormBlock.js +2 -222
  105. package/dist/blocks/builtins/FormBlock.js.map +1 -1
  106. package/dist/blocks/builtins/FormBlockRender.d.ts +6 -0
  107. package/dist/blocks/builtins/FormBlockRender.js +225 -0
  108. package/dist/blocks/builtins/FormBlockRender.js.map +1 -0
  109. package/dist/blocks/builtins/Gallery.d.ts +1 -23
  110. package/dist/blocks/builtins/Gallery.js +2 -164
  111. package/dist/blocks/builtins/Gallery.js.map +1 -1
  112. package/dist/blocks/builtins/GalleryRender.d.ts +25 -0
  113. package/dist/blocks/builtins/GalleryRender.js +167 -0
  114. package/dist/blocks/builtins/GalleryRender.js.map +1 -0
  115. package/dist/blocks/builtins/Hero.d.ts +1 -2
  116. package/dist/blocks/builtins/Hero.js +2 -73
  117. package/dist/blocks/builtins/Hero.js.map +1 -1
  118. package/dist/blocks/builtins/HeroRender.d.ts +6 -0
  119. package/dist/blocks/builtins/HeroRender.js +76 -0
  120. package/dist/blocks/builtins/HeroRender.js.map +1 -0
  121. package/dist/blocks/builtins/ImageBlock.d.ts +1 -2
  122. package/dist/blocks/builtins/ImageBlock.js +2 -22
  123. package/dist/blocks/builtins/ImageBlock.js.map +1 -1
  124. package/dist/blocks/builtins/ImageBlockRender.d.ts +6 -0
  125. package/dist/blocks/builtins/ImageBlockRender.js +25 -0
  126. package/dist/blocks/builtins/ImageBlockRender.js.map +1 -0
  127. package/dist/blocks/builtins/Jobs.d.ts +1 -15
  128. package/dist/blocks/builtins/Jobs.js +3 -69
  129. package/dist/blocks/builtins/Jobs.js.map +1 -1
  130. package/dist/blocks/builtins/JobsRender.d.ts +17 -0
  131. package/dist/blocks/builtins/JobsRender.js +71 -0
  132. package/dist/blocks/builtins/JobsRender.js.map +1 -0
  133. package/dist/blocks/builtins/Layout.d.ts +2 -3
  134. package/dist/blocks/builtins/Layout.js +3 -39
  135. package/dist/blocks/builtins/Layout.js.map +1 -1
  136. package/dist/blocks/builtins/LayoutRender.d.ts +8 -0
  137. package/dist/blocks/builtins/LayoutRender.js +42 -0
  138. package/dist/blocks/builtins/LayoutRender.js.map +1 -0
  139. package/dist/blocks/builtins/MapBlock.d.ts +1 -2
  140. package/dist/blocks/builtins/MapBlock.js +2 -45
  141. package/dist/blocks/builtins/MapBlock.js.map +1 -1
  142. package/dist/blocks/builtins/MapBlockRender.d.ts +6 -0
  143. package/dist/blocks/builtins/MapBlockRender.js +48 -0
  144. package/dist/blocks/builtins/MapBlockRender.js.map +1 -0
  145. package/dist/blocks/builtins/NewsListBlock.d.ts +1 -2
  146. package/dist/blocks/builtins/NewsListBlock.js +2 -11
  147. package/dist/blocks/builtins/NewsListBlock.js.map +1 -1
  148. package/dist/blocks/builtins/NewsListBlockRender.d.ts +6 -0
  149. package/dist/blocks/builtins/NewsListBlockRender.js +14 -0
  150. package/dist/blocks/builtins/NewsListBlockRender.js.map +1 -0
  151. package/dist/blocks/builtins/Newsletter.d.ts +1 -2
  152. package/dist/blocks/builtins/Newsletter.js +2 -89
  153. package/dist/blocks/builtins/Newsletter.js.map +1 -1
  154. package/dist/blocks/builtins/NewsletterRender.d.ts +13 -0
  155. package/dist/blocks/builtins/NewsletterRender.js +92 -0
  156. package/dist/blocks/builtins/NewsletterRender.js.map +1 -0
  157. package/dist/blocks/builtins/OpeningHours.d.ts +1 -2
  158. package/dist/blocks/builtins/OpeningHours.js +2 -28
  159. package/dist/blocks/builtins/OpeningHours.js.map +1 -1
  160. package/dist/blocks/builtins/OpeningHoursRender.d.ts +7 -0
  161. package/dist/blocks/builtins/OpeningHoursRender.js +31 -0
  162. package/dist/blocks/builtins/OpeningHoursRender.js.map +1 -0
  163. package/dist/blocks/builtins/PdfBlock.d.ts +1 -2
  164. package/dist/blocks/builtins/PdfBlock.js +2 -76
  165. package/dist/blocks/builtins/PdfBlock.js.map +1 -1
  166. package/dist/blocks/builtins/PdfBlockRender.d.ts +11 -0
  167. package/dist/blocks/builtins/PdfBlockRender.js +79 -0
  168. package/dist/blocks/builtins/PdfBlockRender.js.map +1 -0
  169. package/dist/blocks/builtins/Portfolio.d.ts +1 -2
  170. package/dist/blocks/builtins/Portfolio.js +2 -75
  171. package/dist/blocks/builtins/Portfolio.js.map +1 -1
  172. package/dist/blocks/builtins/PortfolioRender.d.ts +7 -0
  173. package/dist/blocks/builtins/PortfolioRender.js +78 -0
  174. package/dist/blocks/builtins/PortfolioRender.js.map +1 -0
  175. package/dist/blocks/builtins/Pricing.d.ts +1 -8
  176. package/dist/blocks/builtins/Pricing.js +3 -73
  177. package/dist/blocks/builtins/Pricing.js.map +1 -1
  178. package/dist/blocks/builtins/PricingRender.d.ts +10 -0
  179. package/dist/blocks/builtins/PricingRender.js +75 -0
  180. package/dist/blocks/builtins/PricingRender.js.map +1 -0
  181. package/dist/blocks/builtins/RichTextBlock.d.ts +1 -2
  182. package/dist/blocks/builtins/RichTextBlock.js +2 -5
  183. package/dist/blocks/builtins/RichTextBlock.js.map +1 -1
  184. package/dist/blocks/builtins/RichTextBlockRender.d.ts +6 -0
  185. package/dist/blocks/builtins/RichTextBlockRender.js +8 -0
  186. package/dist/blocks/builtins/RichTextBlockRender.js.map +1 -0
  187. package/dist/blocks/builtins/Search.d.ts +1 -2
  188. package/dist/blocks/builtins/Search.js +2 -80
  189. package/dist/blocks/builtins/Search.js.map +1 -1
  190. package/dist/blocks/builtins/SearchRender.d.ts +7 -0
  191. package/dist/blocks/builtins/SearchRender.js +83 -0
  192. package/dist/blocks/builtins/SearchRender.js.map +1 -0
  193. package/dist/blocks/builtins/Sections.d.ts +4 -5
  194. package/dist/blocks/builtins/Sections.js +5 -142
  195. package/dist/blocks/builtins/Sections.js.map +1 -1
  196. package/dist/blocks/builtins/SectionsRender.d.ts +12 -0
  197. package/dist/blocks/builtins/SectionsRender.js +145 -0
  198. package/dist/blocks/builtins/SectionsRender.js.map +1 -0
  199. package/dist/blocks/builtins/Slider.d.ts +1 -2
  200. package/dist/blocks/builtins/Slider.js +2 -134
  201. package/dist/blocks/builtins/Slider.js.map +1 -1
  202. package/dist/blocks/builtins/SliderRender.d.ts +7 -0
  203. package/dist/blocks/builtins/SliderRender.js +137 -0
  204. package/dist/blocks/builtins/SliderRender.js.map +1 -0
  205. package/dist/blocks/builtins/Spacer.d.ts +1 -2
  206. package/dist/blocks/builtins/Spacer.js +2 -6
  207. package/dist/blocks/builtins/Spacer.js.map +1 -1
  208. package/dist/blocks/builtins/SpacerRender.d.ts +6 -0
  209. package/dist/blocks/builtins/SpacerRender.js +9 -0
  210. package/dist/blocks/builtins/SpacerRender.js.map +1 -0
  211. package/dist/blocks/builtins/SymbolRef.d.ts +1 -2
  212. package/dist/blocks/builtins/SymbolRef.js +2 -76
  213. package/dist/blocks/builtins/SymbolRef.js.map +1 -1
  214. package/dist/blocks/builtins/SymbolRefRender.d.ts +13 -0
  215. package/dist/blocks/builtins/SymbolRefRender.js +79 -0
  216. package/dist/blocks/builtins/SymbolRefRender.js.map +1 -0
  217. package/dist/blocks/builtins/Team.d.ts +1 -2
  218. package/dist/blocks/builtins/Team.js +2 -55
  219. package/dist/blocks/builtins/Team.js.map +1 -1
  220. package/dist/blocks/builtins/TeamRender.d.ts +7 -0
  221. package/dist/blocks/builtins/TeamRender.js +58 -0
  222. package/dist/blocks/builtins/TeamRender.js.map +1 -0
  223. package/dist/blocks/builtins/Testimonials.d.ts +1 -8
  224. package/dist/blocks/builtins/Testimonials.js +2 -69
  225. package/dist/blocks/builtins/Testimonials.js.map +1 -1
  226. package/dist/blocks/builtins/TestimonialsRender.d.ts +10 -0
  227. package/dist/blocks/builtins/TestimonialsRender.js +72 -0
  228. package/dist/blocks/builtins/TestimonialsRender.js.map +1 -0
  229. package/dist/blocks/builtins/Video.d.ts +1 -9
  230. package/dist/blocks/builtins/Video.js +2 -64
  231. package/dist/blocks/builtins/Video.js.map +1 -1
  232. package/dist/blocks/builtins/VideoRender.d.ts +10 -0
  233. package/dist/blocks/builtins/VideoRender.js +67 -0
  234. package/dist/blocks/builtins/VideoRender.js.map +1 -0
  235. package/dist/blocks/builtins/WhatsappChat.d.ts +1 -8
  236. package/dist/blocks/builtins/WhatsappChat.js +2 -37
  237. package/dist/blocks/builtins/WhatsappChat.js.map +1 -1
  238. package/dist/blocks/builtins/WhatsappChatRender.d.ts +17 -0
  239. package/dist/blocks/builtins/WhatsappChatRender.js +40 -0
  240. package/dist/blocks/builtins/WhatsappChatRender.js.map +1 -0
  241. package/dist/blocks/builtins/Widgets.d.ts +12 -13
  242. package/dist/blocks/builtins/Widgets.js +13 -175
  243. package/dist/blocks/builtins/Widgets.js.map +1 -1
  244. package/dist/blocks/builtins/WidgetsRender.d.ts +34 -0
  245. package/dist/blocks/builtins/WidgetsRender.js +178 -0
  246. package/dist/blocks/builtins/WidgetsRender.js.map +1 -0
  247. package/dist/blocks/reportRenderFout.d.ts +13 -0
  248. package/dist/blocks/reportRenderFout.js +31 -0
  249. package/dist/blocks/reportRenderFout.js.map +1 -0
  250. package/dist/modules/contract.js +2 -1
  251. package/dist/modules/contract.js.map +1 -1
  252. package/dist/modules/shop/blocks/Cart.js +1 -2
  253. package/dist/modules/shop/blocks/Cart.js.map +1 -1
  254. package/dist/modules/shop/blocks/Checkout.js +1 -2
  255. package/dist/modules/shop/blocks/Checkout.js.map +1 -1
  256. package/dist/modules/shop/blocks/Donation.js +1 -2
  257. package/dist/modules/shop/blocks/Donation.js.map +1 -1
  258. package/dist/modules/shop/blocks/OrderStatus.js +0 -2
  259. package/dist/modules/shop/blocks/OrderStatus.js.map +1 -1
  260. package/dist/modules/shop/blocks/ProductDetail.js +1 -7
  261. package/dist/modules/shop/blocks/ProductDetail.js.map +1 -1
  262. package/dist/modules/shop/blocks/ProductGrid.js +1 -2
  263. package/dist/modules/shop/blocks/ProductGrid.js.map +1 -1
  264. package/dist/modules/shop/blocks/ShopCategories.js +0 -2
  265. package/dist/modules/shop/blocks/ShopCategories.js.map +1 -1
  266. package/dist/modules/shop/module.js +1 -0
  267. package/dist/modules/shop/module.js.map +1 -1
  268. package/dist/modules/shop/schemas.d.ts +1 -0
  269. package/dist/modules/shop/schemas.js +32 -0
  270. package/dist/modules/shop/schemas.js.map +1 -0
  271. package/dist/modules/types.d.ts +6 -0
  272. package/dist/schema/shop.d.ts +1 -11
  273. package/dist/schema/shop.js +1 -20
  274. package/dist/schema/shop.js.map +1 -1
  275. package/dist/schema/shopGeld.d.ts +18 -0
  276. package/dist/schema/shopGeld.js +27 -0
  277. package/dist/schema/shopGeld.js.map +1 -0
  278. package/dist/styles.css +17 -0
  279. package/dist/version.js +1 -1
  280. package/package.json +1 -1
@@ -0,0 +1,55 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useState } from "react";
4
+ import { Heading } from "../ui/index.js";
5
+ function compute(target) {
6
+ const t = new Date(target).getTime();
7
+ if (Number.isNaN(t)) return null;
8
+ const diff = t - Date.now();
9
+ if (diff <= 0) return { days: 0, hours: 0, minutes: 0, seconds: 0, done: true };
10
+ const s = Math.floor(diff / 1e3);
11
+ return {
12
+ days: Math.floor(s / 86400),
13
+ hours: Math.floor(s % 86400 / 3600),
14
+ minutes: Math.floor(s % 3600 / 60),
15
+ seconds: s % 60,
16
+ done: false
17
+ };
18
+ }
19
+ function useCountdown(target) {
20
+ const [r, setR] = useState(null);
21
+ useEffect(() => {
22
+ if (!target) return;
23
+ setR(compute(target));
24
+ const id = setInterval(() => setR(compute(target)), 1e3);
25
+ return () => clearInterval(id);
26
+ }, [target]);
27
+ return r;
28
+ }
29
+ const UNITS = [
30
+ { key: "days", label: "dagen" },
31
+ { key: "hours", label: "uur" },
32
+ { key: "minutes", label: "min" },
33
+ { key: "seconds", label: "sec" }
34
+ ];
35
+ function CountdownDigits({ r, showLabels = true }) {
36
+ return /* @__PURE__ */ jsx("div", { className: "xicms-countdown__digits", role: "timer", "aria-live": "off", children: UNITS.map((u) => /* @__PURE__ */ jsxs("div", { className: "xicms-countdown__unit", children: [
37
+ /* @__PURE__ */ jsx("span", { className: "xicms-countdown__value", children: String(r[u.key]).padStart(2, "0") }),
38
+ showLabels && /* @__PURE__ */ jsx("span", { className: "xicms-countdown__label", children: u.label })
39
+ ] }, u.key)) });
40
+ }
41
+ function CountdownRender({ block, mode }) {
42
+ const r = useCountdown(block.target);
43
+ if (!block.target) return null;
44
+ if (r?.done && block.onExpire === "hide" && mode !== "preview") return null;
45
+ return /* @__PURE__ */ jsxs("section", { className: "xicms-countdown", children: [
46
+ block.heading && /* @__PURE__ */ jsx(Heading, { level: 2, className: "xicms-countdown__heading", "data-xicms-edit": "heading", children: block.heading }),
47
+ r === null ? /* @__PURE__ */ jsx("p", { className: "xicms-countdown__loading", "aria-hidden": "true", children: "\u2026" }) : r.done ? /* @__PURE__ */ jsx("p", { className: "xicms-countdown__expired", "data-xicms-edit": "expiredText", children: block.expiredText }) : /* @__PURE__ */ jsx(CountdownDigits, { r, showLabels: block.showLabels })
48
+ ] });
49
+ }
50
+ export {
51
+ CountdownDigits,
52
+ CountdownRender,
53
+ useCountdown
54
+ };
55
+ //# sourceMappingURL=CountdownRender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/blocks/builtins/CountdownRender.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport type { z } from \"zod\";\nimport type { CountdownBlockSchema } from \"../../schema/blocks\";\nimport type { BlockRenderProps } from \"../registry\";\nimport { Heading } from \"../ui\";\n\nexport interface Remaining {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n done: boolean;\n}\n\nfunction compute(target: string): Remaining | null {\n const t = new Date(target).getTime();\n if (Number.isNaN(t)) return null;\n const diff = t - Date.now();\n if (diff <= 0) return { days: 0, hours: 0, minutes: 0, seconds: 0, done: true };\n const s = Math.floor(diff / 1000);\n return {\n days: Math.floor(s / 86400),\n hours: Math.floor((s % 86400) / 3600),\n minutes: Math.floor((s % 3600) / 60),\n seconds: s % 60,\n done: false,\n };\n}\n\n/**\n * Tikkende afteltimer naar `target`. Client-only (start `null` om hydration-mismatch te voorkomen).\n * Gedeeld door het volwaardige Countdown-blok en de compacte widget.\n */\nexport function useCountdown(target: string): Remaining | null {\n const [r, setR] = useState<Remaining | null>(null);\n useEffect(() => {\n if (!target) return;\n setR(compute(target));\n const id = setInterval(() => setR(compute(target)), 1000);\n return () => clearInterval(id);\n }, [target]);\n return r;\n}\n\nconst UNITS: { key: keyof Remaining; label: string }[] = [\n { key: \"days\", label: \"dagen\" },\n { key: \"hours\", label: \"uur\" },\n { key: \"minutes\", label: \"min\" },\n { key: \"seconds\", label: \"sec\" },\n];\n\nexport function CountdownDigits({ r, showLabels = true }: { r: Remaining; showLabels?: boolean }) {\n return (\n <div className=\"xicms-countdown__digits\" role=\"timer\" aria-live=\"off\">\n {UNITS.map((u) => (\n <div key={u.key} className=\"xicms-countdown__unit\">\n <span className=\"xicms-countdown__value\">{String(r[u.key] as number).padStart(2, \"0\")}</span>\n {showLabels && <span className=\"xicms-countdown__label\">{u.label}</span>}\n </div>\n ))}\n </div>\n );\n}\n\ntype Countdown = z.infer<typeof CountdownBlockSchema>;\n\nexport function CountdownRender({ block, mode }: BlockRenderProps<Countdown>) {\n const r = useCountdown(block.target);\n if (!block.target) return null;\n // Na afloop optioneel het hele blok verbergen (bv. een verlopen actie-aankondiging) —\n // behalve in de editor-preview, anders kan de editor het blok niet meer terugvinden.\n if (r?.done && block.onExpire === \"hide\" && mode !== \"preview\") return null;\n return (\n <section className=\"xicms-countdown\">\n {block.heading && <Heading level={2} className=\"xicms-countdown__heading\" data-xicms-edit=\"heading\">{block.heading}</Heading>}\n {r === null ? (\n <p className=\"xicms-countdown__loading\" aria-hidden=\"true\">…</p>\n ) : r.done ? (\n <p className=\"xicms-countdown__expired\" data-xicms-edit=\"expiredText\">{block.expiredText}</p>\n ) : (\n <CountdownDigits r={r} showLabels={block.showLabels} />\n )}\n </section>\n );\n}\n"],"mappings":";AAyDQ,SACE,KADF;AAvDR,SAAS,WAAW,gBAAgB;AAIpC,SAAS,eAAe;AAUxB,SAAS,QAAQ,QAAkC;AACjD,QAAM,IAAI,IAAI,KAAK,MAAM,EAAE,QAAQ;AACnC,MAAI,OAAO,MAAM,CAAC,EAAG,QAAO;AAC5B,QAAM,OAAO,IAAI,KAAK,IAAI;AAC1B,MAAI,QAAQ,EAAG,QAAO,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,KAAK;AAC9E,QAAM,IAAI,KAAK,MAAM,OAAO,GAAI;AAChC,SAAO;AAAA,IACL,MAAM,KAAK,MAAM,IAAI,KAAK;AAAA,IAC1B,OAAO,KAAK,MAAO,IAAI,QAAS,IAAI;AAAA,IACpC,SAAS,KAAK,MAAO,IAAI,OAAQ,EAAE;AAAA,IACnC,SAAS,IAAI;AAAA,IACb,MAAM;AAAA,EACR;AACF;AAMO,SAAS,aAAa,QAAkC;AAC7D,QAAM,CAAC,GAAG,IAAI,IAAI,SAA2B,IAAI;AACjD,YAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AACb,SAAK,QAAQ,MAAM,CAAC;AACpB,UAAM,KAAK,YAAY,MAAM,KAAK,QAAQ,MAAM,CAAC,GAAG,GAAI;AACxD,WAAO,MAAM,cAAc,EAAE;AAAA,EAC/B,GAAG,CAAC,MAAM,CAAC;AACX,SAAO;AACT;AAEA,MAAM,QAAmD;AAAA,EACvD,EAAE,KAAK,QAAQ,OAAO,QAAQ;AAAA,EAC9B,EAAE,KAAK,SAAS,OAAO,MAAM;AAAA,EAC7B,EAAE,KAAK,WAAW,OAAO,MAAM;AAAA,EAC/B,EAAE,KAAK,WAAW,OAAO,MAAM;AACjC;AAEO,SAAS,gBAAgB,EAAE,GAAG,aAAa,KAAK,GAA2C;AAChG,SACE,oBAAC,SAAI,WAAU,2BAA0B,MAAK,SAAQ,aAAU,OAC7D,gBAAM,IAAI,CAAC,MACV,qBAAC,SAAgB,WAAU,yBACzB;AAAA,wBAAC,UAAK,WAAU,0BAA0B,iBAAO,EAAE,EAAE,GAAG,CAAW,EAAE,SAAS,GAAG,GAAG,GAAE;AAAA,IACrF,cAAc,oBAAC,UAAK,WAAU,0BAA0B,YAAE,OAAM;AAAA,OAFzD,EAAE,GAGZ,CACD,GACH;AAEJ;AAIO,SAAS,gBAAgB,EAAE,OAAO,KAAK,GAAgC;AAC5E,QAAM,IAAI,aAAa,MAAM,MAAM;AACnC,MAAI,CAAC,MAAM,OAAQ,QAAO;AAG1B,MAAI,GAAG,QAAQ,MAAM,aAAa,UAAU,SAAS,UAAW,QAAO;AACvE,SACE,qBAAC,aAAQ,WAAU,mBAChB;AAAA,UAAM,WAAW,oBAAC,WAAQ,OAAO,GAAG,WAAU,4BAA2B,mBAAgB,WAAW,gBAAM,SAAQ;AAAA,IAClH,MAAM,OACL,oBAAC,OAAE,WAAU,4BAA2B,eAAY,QAAO,oBAAC,IAC1D,EAAE,OACJ,oBAAC,OAAE,WAAU,4BAA2B,mBAAgB,eAAe,gBAAM,aAAY,IAEzF,oBAAC,mBAAgB,GAAM,YAAY,MAAM,YAAY;AAAA,KAEzD;AAEJ;","names":[]}
@@ -1,2 +1 @@
1
- import type { z } from "zod";
2
- export declare const ctaBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
1
+ export declare const ctaBlock: import("../index.js").BlockDefinition<import("zod/v4/core").$ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>>;
@@ -1,46 +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, HStack, Card, Heading, Text, Btn } from "../ui/index.js";
5
- function CtaRender({ block }) {
6
- if (block.sticky) {
7
- return /* @__PURE__ */ jsxs(
8
- HStack,
9
- {
10
- gap: 3,
11
- vAlign: "center",
12
- hAlign: "between",
13
- role: "region",
14
- "aria-label": block.title || "Call-to-action",
15
- style: { position: "sticky", bottom: 0, zIndex: 30, padding: "0.75rem 1rem", background: "var(--color-background-card)", borderTop: "1px solid var(--color-border)", flexWrap: "wrap" },
16
- children: [
17
- /* @__PURE__ */ jsx(Text, { weight: "bold", children: block.title || block.text }),
18
- /* @__PURE__ */ jsx(Btn, { label: block.buttonLabel, href: block.buttonHref, variant: block.buttonVariant, size: "md", editField: "buttonLabel" })
19
- ]
20
- }
21
- );
22
- }
23
- return /* @__PURE__ */ jsx(
24
- Card,
25
- {
26
- padding: 6,
27
- variant: block.backgroundColor ? "default" : "muted",
28
- style: block.backgroundColor ? { background: block.backgroundColor } : void 0,
29
- children: /* @__PURE__ */ jsxs(VStack, { gap: 3, hAlign: "center", style: { textAlign: "center" }, children: [
30
- block.title && /* @__PURE__ */ jsx(Heading, { level: 2, "data-xicms-edit": "title", children: block.title }),
31
- block.text && /* @__PURE__ */ jsx(Text, { type: "large", color: "secondary", "data-xicms-edit": "text", children: block.text }),
32
- /* @__PURE__ */ jsxs(HStack, { gap: 2, hAlign: "center", style: { flexWrap: "wrap" }, children: [
33
- /* @__PURE__ */ jsx(Btn, { label: block.buttonLabel, href: block.buttonHref, variant: block.buttonVariant, editField: "buttonLabel" }),
34
- block.button2Label && /* @__PURE__ */ jsx(Btn, { label: block.button2Label, href: block.button2Href ?? "#", variant: "outline", editField: "button2Label" })
35
- ] })
36
- ] })
37
- }
38
- );
39
- }
40
3
  const ctaBlock = defineBlock({
41
4
  type: "cta",
42
5
  fields: { buttonVariant: { type: "select", options: [{ value: "primary", label: "Primair" }, { value: "secondary", label: "Secundair" }, { value: "outline", label: "Outline" }] } },
43
- Render: CtaRender,
6
+ Render: dynamic(() => import("./CtaRender.js").then((m) => m.CtaRender)),
44
7
  label: "Call-to-action",
45
8
  icon: "\u{1F4E3}",
46
9
  defaults: () => ({ title: "Klaar om te starten?", buttonLabel: "Neem contact op", buttonHref: "#contact", buttonVariant: "primary" })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/blocks/builtins/Cta.tsx"],"sourcesContent":["\"use client\";\n\nimport type { z } from \"zod\";\nimport type { CtaBlockSchema } from \"../../schema/blocks\";\nimport { defineBlock, type BlockRenderProps } from \"../registry\";\nimport { VStack, HStack, Card, Heading, Text, Btn } from \"../ui\";\n\ntype Cta = z.infer<typeof CtaBlockSchema>;\n\nfunction CtaRender({ block }: BlockRenderProps<Cta>) {\n if (block.sticky) {\n return (\n <HStack\n gap={3}\n vAlign=\"center\"\n hAlign=\"between\"\n role=\"region\"\n aria-label={block.title || \"Call-to-action\"}\n style={{ position: \"sticky\", bottom: 0, zIndex: 30, padding: \"0.75rem 1rem\", background: \"var(--color-background-card)\", borderTop: \"1px solid var(--color-border)\", flexWrap: \"wrap\" }}\n >\n <Text weight=\"bold\">{block.title || block.text}</Text>\n <Btn label={block.buttonLabel} href={block.buttonHref} variant={block.buttonVariant} size=\"md\" editField=\"buttonLabel\" />\n </HStack>\n );\n }\n return (\n <Card\n padding={6}\n variant={block.backgroundColor ? \"default\" : \"muted\"}\n style={block.backgroundColor ? { background: block.backgroundColor } : undefined}\n >\n <VStack gap={3} hAlign=\"center\" style={{ textAlign: \"center\" }}>\n {block.title && <Heading level={2} data-xicms-edit=\"title\">{block.title}</Heading>}\n {block.text && <Text type=\"large\" color=\"secondary\" data-xicms-edit=\"text\">{block.text}</Text>}\n <HStack gap={2} hAlign=\"center\" style={{ flexWrap: \"wrap\" }}>\n <Btn label={block.buttonLabel} href={block.buttonHref} variant={block.buttonVariant} editField=\"buttonLabel\" />\n {block.button2Label && (\n <Btn label={block.button2Label} href={block.button2Href ?? \"#\"} variant=\"outline\" editField=\"button2Label\" />\n )}\n </HStack>\n </VStack>\n </Card>\n );\n}\n\nexport const ctaBlock = defineBlock({\n type: \"cta\",\n fields: { buttonVariant: { type: \"select\", options: [{ value: \"primary\", label: \"Primair\" }, { value: \"secondary\", label: \"Secundair\" }, { value: \"outline\", label: \"Outline\" }] } },\n Render: CtaRender,\n label: \"Call-to-action\",\n icon: \"📣\",\n defaults: () => ({ title: \"Klaar om te starten?\", buttonLabel: \"Neem contact op\", buttonHref: \"#contact\", buttonVariant: \"primary\" }),\n});\n"],"mappings":";AAYM,SAQE,KARF;AARN,SAAS,mBAA0C;AACnD,SAAS,QAAQ,QAAQ,MAAM,SAAS,MAAM,WAAW;AAIzD,SAAS,UAAU,EAAE,MAAM,GAA0B;AACnD,MAAI,MAAM,QAAQ;AAChB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,QAAO;AAAA,QACP,QAAO;AAAA,QACP,MAAK;AAAA,QACL,cAAY,MAAM,SAAS;AAAA,QAC3B,OAAO,EAAE,UAAU,UAAU,QAAQ,GAAG,QAAQ,IAAI,SAAS,gBAAgB,YAAY,gCAAgC,WAAW,iCAAiC,UAAU,OAAO;AAAA,QAEtL;AAAA,8BAAC,QAAK,QAAO,QAAQ,gBAAM,SAAS,MAAM,MAAK;AAAA,UAC/C,oBAAC,OAAI,OAAO,MAAM,aAAa,MAAM,MAAM,YAAY,SAAS,MAAM,eAAe,MAAK,MAAK,WAAU,eAAc;AAAA;AAAA;AAAA,IACzH;AAAA,EAEJ;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,SAAS,MAAM,kBAAkB,YAAY;AAAA,MAC7C,OAAO,MAAM,kBAAkB,EAAE,YAAY,MAAM,gBAAgB,IAAI;AAAA,MAEvE,+BAAC,UAAO,KAAK,GAAG,QAAO,UAAS,OAAO,EAAE,WAAW,SAAS,GAC1D;AAAA,cAAM,SAAS,oBAAC,WAAQ,OAAO,GAAG,mBAAgB,SAAS,gBAAM,OAAM;AAAA,QACvE,MAAM,QAAQ,oBAAC,QAAK,MAAK,SAAQ,OAAM,aAAY,mBAAgB,QAAQ,gBAAM,MAAK;AAAA,QACvF,qBAAC,UAAO,KAAK,GAAG,QAAO,UAAS,OAAO,EAAE,UAAU,OAAO,GACxD;AAAA,8BAAC,OAAI,OAAO,MAAM,aAAa,MAAM,MAAM,YAAY,SAAS,MAAM,eAAe,WAAU,eAAc;AAAA,UAC5G,MAAM,gBACL,oBAAC,OAAI,OAAO,MAAM,cAAc,MAAM,MAAM,eAAe,KAAK,SAAQ,WAAU,WAAU,gBAAe;AAAA,WAE/G;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;AAEO,MAAM,WAAW,YAAY;AAAA,EAClC,MAAM;AAAA,EACN,QAAQ,EAAE,eAAe,EAAE,MAAM,UAAU,SAAS,CAAC,EAAE,OAAO,WAAW,OAAO,UAAU,GAAG,EAAE,OAAO,aAAa,OAAO,YAAY,GAAG,EAAE,OAAO,WAAW,OAAO,UAAU,CAAC,EAAE,EAAE;AAAA,EACnL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,OAAO,wBAAwB,aAAa,mBAAmB,YAAY,YAAY,eAAe,UAAU;AACrI,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../../src/blocks/builtins/Cta.tsx"],"sourcesContent":["import dynamic from \"next/dynamic\";\nimport { defineBlock } from \"../registry\";\n\nexport const ctaBlock = defineBlock({\n type: \"cta\",\n fields: { buttonVariant: { type: \"select\", options: [{ value: \"primary\", label: \"Primair\" }, { value: \"secondary\", label: \"Secundair\" }, { value: \"outline\", label: \"Outline\" }] } },\n Render: dynamic(() => import(\"./CtaRender\").then((m) => m.CtaRender)),\n label: \"Call-to-action\",\n icon: \"📣\",\n defaults: () => ({ title: \"Klaar om te starten?\", buttonLabel: \"Neem contact op\", buttonHref: \"#contact\", buttonVariant: \"primary\" }),\n});\n"],"mappings":"AAAA,OAAO,aAAa;AACpB,SAAS,mBAAmB;AAErB,MAAM,WAAW,YAAY;AAAA,EAClC,MAAM;AAAA,EACN,QAAQ,EAAE,eAAe,EAAE,MAAM,UAAU,SAAS,CAAC,EAAE,OAAO,WAAW,OAAO,UAAU,GAAG,EAAE,OAAO,aAAa,OAAO,YAAY,GAAG,EAAE,OAAO,WAAW,OAAO,UAAU,CAAC,EAAE,EAAE;AAAA,EACnL,QAAQ,QAAQ,MAAM,OAAO,aAAa,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,EACpE,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,OAAO,wBAAwB,aAAa,mBAAmB,YAAY,YAAY,eAAe,UAAU;AACrI,CAAC;","names":[]}
@@ -0,0 +1,6 @@
1
+ import type { z } from "zod";
2
+ import type { CtaBlockSchema } from "../../schema/blocks.js";
3
+ import type { BlockRenderProps } from "../registry.js";
4
+ type Cta = z.infer<typeof CtaBlockSchema>;
5
+ export declare function CtaRender({ block }: BlockRenderProps<Cta>): import("react").JSX.Element;
6
+ export {};
@@ -0,0 +1,42 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { VStack, HStack, Card, Heading, Text, Btn } from "../ui/index.js";
4
+ function CtaRender({ block }) {
5
+ if (block.sticky) {
6
+ return /* @__PURE__ */ jsxs(
7
+ HStack,
8
+ {
9
+ gap: 3,
10
+ vAlign: "center",
11
+ hAlign: "between",
12
+ role: "region",
13
+ "aria-label": block.title || "Call-to-action",
14
+ style: { position: "sticky", bottom: 0, zIndex: 30, padding: "0.75rem 1rem", background: "var(--color-background-card)", borderTop: "1px solid var(--color-border)", flexWrap: "wrap" },
15
+ children: [
16
+ /* @__PURE__ */ jsx(Text, { weight: "bold", children: block.title || block.text }),
17
+ /* @__PURE__ */ jsx(Btn, { label: block.buttonLabel, href: block.buttonHref, variant: block.buttonVariant, size: "md", editField: "buttonLabel" })
18
+ ]
19
+ }
20
+ );
21
+ }
22
+ return /* @__PURE__ */ jsx(
23
+ Card,
24
+ {
25
+ padding: 6,
26
+ variant: block.backgroundColor ? "default" : "muted",
27
+ style: block.backgroundColor ? { background: block.backgroundColor } : void 0,
28
+ children: /* @__PURE__ */ jsxs(VStack, { gap: 3, hAlign: "center", style: { textAlign: "center" }, children: [
29
+ block.title && /* @__PURE__ */ jsx(Heading, { level: 2, "data-xicms-edit": "title", children: block.title }),
30
+ block.text && /* @__PURE__ */ jsx(Text, { type: "large", color: "secondary", "data-xicms-edit": "text", children: block.text }),
31
+ /* @__PURE__ */ jsxs(HStack, { gap: 2, hAlign: "center", style: { flexWrap: "wrap" }, children: [
32
+ /* @__PURE__ */ jsx(Btn, { label: block.buttonLabel, href: block.buttonHref, variant: block.buttonVariant, editField: "buttonLabel" }),
33
+ block.button2Label && /* @__PURE__ */ jsx(Btn, { label: block.button2Label, href: block.button2Href ?? "#", variant: "outline", editField: "button2Label" })
34
+ ] })
35
+ ] })
36
+ }
37
+ );
38
+ }
39
+ export {
40
+ CtaRender
41
+ };
42
+ //# sourceMappingURL=CtaRender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/blocks/builtins/CtaRender.tsx"],"sourcesContent":["\"use client\";\n\nimport type { z } from \"zod\";\nimport type { CtaBlockSchema } from \"../../schema/blocks\";\nimport type { BlockRenderProps } from \"../registry\";\nimport { VStack, HStack, Card, Heading, Text, Btn } from \"../ui\";\n\ntype Cta = z.infer<typeof CtaBlockSchema>;\n\nexport function CtaRender({ block }: BlockRenderProps<Cta>) {\n if (block.sticky) {\n return (\n <HStack\n gap={3}\n vAlign=\"center\"\n hAlign=\"between\"\n role=\"region\"\n aria-label={block.title || \"Call-to-action\"}\n style={{ position: \"sticky\", bottom: 0, zIndex: 30, padding: \"0.75rem 1rem\", background: \"var(--color-background-card)\", borderTop: \"1px solid var(--color-border)\", flexWrap: \"wrap\" }}\n >\n <Text weight=\"bold\">{block.title || block.text}</Text>\n <Btn label={block.buttonLabel} href={block.buttonHref} variant={block.buttonVariant} size=\"md\" editField=\"buttonLabel\" />\n </HStack>\n );\n }\n return (\n <Card\n padding={6}\n variant={block.backgroundColor ? \"default\" : \"muted\"}\n style={block.backgroundColor ? { background: block.backgroundColor } : undefined}\n >\n <VStack gap={3} hAlign=\"center\" style={{ textAlign: \"center\" }}>\n {block.title && <Heading level={2} data-xicms-edit=\"title\">{block.title}</Heading>}\n {block.text && <Text type=\"large\" color=\"secondary\" data-xicms-edit=\"text\">{block.text}</Text>}\n <HStack gap={2} hAlign=\"center\" style={{ flexWrap: \"wrap\" }}>\n <Btn label={block.buttonLabel} href={block.buttonHref} variant={block.buttonVariant} editField=\"buttonLabel\" />\n {block.button2Label && (\n <Btn label={block.button2Label} href={block.button2Href ?? \"#\"} variant=\"outline\" editField=\"button2Label\" />\n )}\n </HStack>\n </VStack>\n </Card>\n );\n}\n"],"mappings":";AAYM,SAQE,KARF;AAPN,SAAS,QAAQ,QAAQ,MAAM,SAAS,MAAM,WAAW;AAIlD,SAAS,UAAU,EAAE,MAAM,GAA0B;AAC1D,MAAI,MAAM,QAAQ;AAChB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,QAAO;AAAA,QACP,QAAO;AAAA,QACP,MAAK;AAAA,QACL,cAAY,MAAM,SAAS;AAAA,QAC3B,OAAO,EAAE,UAAU,UAAU,QAAQ,GAAG,QAAQ,IAAI,SAAS,gBAAgB,YAAY,gCAAgC,WAAW,iCAAiC,UAAU,OAAO;AAAA,QAEtL;AAAA,8BAAC,QAAK,QAAO,QAAQ,gBAAM,SAAS,MAAM,MAAK;AAAA,UAC/C,oBAAC,OAAI,OAAO,MAAM,aAAa,MAAM,MAAM,YAAY,SAAS,MAAM,eAAe,MAAK,MAAK,WAAU,eAAc;AAAA;AAAA;AAAA,IACzH;AAAA,EAEJ;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,SAAS,MAAM,kBAAkB,YAAY;AAAA,MAC7C,OAAO,MAAM,kBAAkB,EAAE,YAAY,MAAM,gBAAgB,IAAI;AAAA,MAEvE,+BAAC,UAAO,KAAK,GAAG,QAAO,UAAS,OAAO,EAAE,WAAW,SAAS,GAC1D;AAAA,cAAM,SAAS,oBAAC,WAAQ,OAAO,GAAG,mBAAgB,SAAS,gBAAM,OAAM;AAAA,QACvE,MAAM,QAAQ,oBAAC,QAAK,MAAK,SAAQ,OAAM,aAAY,mBAAgB,QAAQ,gBAAM,MAAK;AAAA,QACvF,qBAAC,UAAO,KAAK,GAAG,QAAO,UAAS,OAAO,EAAE,UAAU,OAAO,GACxD;AAAA,8BAAC,OAAI,OAAO,MAAM,aAAa,MAAM,MAAM,YAAY,SAAS,MAAM,eAAe,WAAU,eAAc;AAAA,UAC5G,MAAM,gBACL,oBAAC,OAAI,OAAO,MAAM,cAAc,MAAM,MAAM,eAAe,KAAK,SAAQ,WAAU,WAAU,gBAAe;AAAA,WAE/G;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -1,2 +1 @@
1
- import type { z } from "zod";
2
- export declare const downloadsBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
1
+ export declare const downloadsBlock: import("../index.js").BlockDefinition<import("zod/v4/core").$ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>>;
@@ -1,22 +1,8 @@
1
- import { jsx, jsxs } from "react/jsx-runtime";
1
+ import dynamic from "next/dynamic";
2
2
  import { defineBlock } from "../registry.js";
3
- import { Heading } from "../ui/index.js";
4
- import { fileIcon } from "./lib/fileIcon.js";
5
- function DownloadsRender({ block }) {
6
- const items = (block.items ?? []).map((d, i) => ({ ...d, _i: i })).filter((d) => d.label && d.href);
7
- if (items.length === 0) return null;
8
- return /* @__PURE__ */ jsxs("section", { className: "xicms-downloads", children: [
9
- block.heading && /* @__PURE__ */ jsx(Heading, { level: 2, "data-xicms-edit": "heading", children: block.heading }),
10
- /* @__PURE__ */ jsx("ul", { className: "xicms-downloads__list", children: items.map((d) => /* @__PURE__ */ jsx("li", { className: "xicms-downloads__item", children: /* @__PURE__ */ jsxs("a", { className: "xicms-downloads__link", href: d.href, download: true, children: [
11
- /* @__PURE__ */ jsx("span", { className: "xicms-downloads__icon", "aria-hidden": "true", children: fileIcon(d.href) }),
12
- /* @__PURE__ */ jsx("span", { className: "xicms-downloads__label", "data-xicms-edit": `items.${d._i}.label`, children: d.label }),
13
- d.meta && /* @__PURE__ */ jsx("span", { className: "xicms-downloads__meta", "data-xicms-edit": `items.${d._i}.meta`, children: d.meta })
14
- ] }) }, d._i)) })
15
- ] });
16
- }
17
3
  const downloadsBlock = defineBlock({
18
4
  type: "downloads",
19
- Render: DownloadsRender,
5
+ Render: dynamic(() => import("./DownloadsRender.js").then((m) => m.DownloadsRender)),
20
6
  label: "Downloads",
21
7
  icon: "\u{1F4E5}",
22
8
  defaults: () => ({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/blocks/builtins/Downloads.tsx"],"sourcesContent":["import type { z } from \"zod\";\nimport type { DownloadsBlockSchema } from \"../../schema/blocks\";\nimport { defineBlock, type BlockRenderProps } from \"../registry\";\nimport { Heading } from \"../ui\";\nimport { fileIcon } from \"./lib/fileIcon\";\n\ntype Downloads = z.infer<typeof DownloadsBlockSchema>;\n\n/** Downloadbare documenten (brochures, prijslijsten, voorwaarden). Server-safe. */\nfunction DownloadsRender({ block }: BlockRenderProps<Downloads>) {\n // _i = index in de OORSPRONKELIJKE array — de lijst wordt gefilterd op label && href.\n const items = (block.items ?? []).map((d, i) => ({ ...d, _i: i })).filter((d) => d.label && d.href);\n if (items.length === 0) return null;\n return (\n <section className=\"xicms-downloads\">\n {block.heading && <Heading level={2} data-xicms-edit=\"heading\">{block.heading}</Heading>}\n <ul className=\"xicms-downloads__list\">\n {items.map((d) => (\n <li key={d._i} className=\"xicms-downloads__item\">\n <a className=\"xicms-downloads__link\" href={d.href} download>\n <span className=\"xicms-downloads__icon\" aria-hidden=\"true\">{fileIcon(d.href)}</span>\n <span className=\"xicms-downloads__label\" data-xicms-edit={`items.${d._i}.label`}>{d.label}</span>\n {d.meta && <span className=\"xicms-downloads__meta\" data-xicms-edit={`items.${d._i}.meta`}>{d.meta}</span>}\n </a>\n </li>\n ))}\n </ul>\n </section>\n );\n}\n\nexport const downloadsBlock = defineBlock({\n type: \"downloads\",\n Render: DownloadsRender,\n label: \"Downloads\",\n icon: \"📥\",\n defaults: () => ({\n heading: \"Downloads\",\n items: [{ label: \"Brochure (PDF)\", href: \"\", meta: \"PDF\" }],\n }),\n});\n"],"mappings":"AAewB,cAIZ,YAJY;AAbxB,SAAS,mBAA0C;AACnD,SAAS,eAAe;AACxB,SAAS,gBAAgB;AAKzB,SAAS,gBAAgB,EAAE,MAAM,GAAgC;AAE/D,QAAM,SAAS,MAAM,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,OAAO,EAAE,GAAG,GAAG,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI;AAClG,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SACE,qBAAC,aAAQ,WAAU,mBAChB;AAAA,UAAM,WAAW,oBAAC,WAAQ,OAAO,GAAG,mBAAgB,WAAW,gBAAM,SAAQ;AAAA,IAC9E,oBAAC,QAAG,WAAU,yBACX,gBAAM,IAAI,CAAC,MACV,oBAAC,QAAc,WAAU,yBACvB,+BAAC,OAAE,WAAU,yBAAwB,MAAM,EAAE,MAAM,UAAQ,MACzD;AAAA,0BAAC,UAAK,WAAU,yBAAwB,eAAY,QAAQ,mBAAS,EAAE,IAAI,GAAE;AAAA,MAC7E,oBAAC,UAAK,WAAU,0BAAyB,mBAAiB,SAAS,EAAE,EAAE,UAAW,YAAE,OAAM;AAAA,MACzF,EAAE,QAAQ,oBAAC,UAAK,WAAU,yBAAwB,mBAAiB,SAAS,EAAE,EAAE,SAAU,YAAE,MAAK;AAAA,OACpG,KALO,EAAE,EAMX,CACD,GACH;AAAA,KACF;AAEJ;AAEO,MAAM,iBAAiB,YAAY;AAAA,EACxC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO;AAAA,IACf,SAAS;AAAA,IACT,OAAO,CAAC,EAAE,OAAO,kBAAkB,MAAM,IAAI,MAAM,MAAM,CAAC;AAAA,EAC5D;AACF,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../../src/blocks/builtins/Downloads.tsx"],"sourcesContent":["import dynamic from \"next/dynamic\";\nimport { defineBlock } from \"../registry\";\n\nexport const downloadsBlock = defineBlock({\n type: \"downloads\",\n Render: dynamic(() => import(\"./DownloadsRender\").then((m) => m.DownloadsRender)),\n label: \"Downloads\",\n icon: \"📥\",\n defaults: () => ({\n heading: \"Downloads\",\n items: [{ label: \"Brochure (PDF)\", href: \"\", meta: \"PDF\" }],\n }),\n});\n"],"mappings":"AAAA,OAAO,aAAa;AACpB,SAAS,mBAAmB;AAErB,MAAM,iBAAiB,YAAY;AAAA,EACxC,MAAM;AAAA,EACN,QAAQ,QAAQ,MAAM,OAAO,mBAAmB,EAAE,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC;AAAA,EAChF,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO;AAAA,IACf,SAAS;AAAA,IACT,OAAO,CAAC,EAAE,OAAO,kBAAkB,MAAM,IAAI,MAAM,MAAM,CAAC;AAAA,EAC5D;AACF,CAAC;","names":[]}
@@ -0,0 +1,7 @@
1
+ import type { z } from "zod";
2
+ import type { DownloadsBlockSchema } from "../../schema/blocks.js";
3
+ import type { BlockRenderProps } from "../registry.js";
4
+ type Downloads = z.infer<typeof DownloadsBlockSchema>;
5
+ /** Downloadbare documenten (brochures, prijslijsten, voorwaarden). Server-safe. */
6
+ export declare function DownloadsRender({ block }: BlockRenderProps<Downloads>): import("react").JSX.Element | null;
7
+ export {};
@@ -0,0 +1,19 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Heading } from "../ui/index.js";
3
+ import { fileIcon } from "./lib/fileIcon.js";
4
+ function DownloadsRender({ block }) {
5
+ const items = (block.items ?? []).map((d, i) => ({ ...d, _i: i })).filter((d) => d.label && d.href);
6
+ if (items.length === 0) return null;
7
+ return /* @__PURE__ */ jsxs("section", { className: "xicms-downloads", children: [
8
+ block.heading && /* @__PURE__ */ jsx(Heading, { level: 2, "data-xicms-edit": "heading", children: block.heading }),
9
+ /* @__PURE__ */ jsx("ul", { className: "xicms-downloads__list", children: items.map((d) => /* @__PURE__ */ jsx("li", { className: "xicms-downloads__item", children: /* @__PURE__ */ jsxs("a", { className: "xicms-downloads__link", href: d.href, download: true, children: [
10
+ /* @__PURE__ */ jsx("span", { className: "xicms-downloads__icon", "aria-hidden": "true", children: fileIcon(d.href) }),
11
+ /* @__PURE__ */ jsx("span", { className: "xicms-downloads__label", "data-xicms-edit": `items.${d._i}.label`, children: d.label }),
12
+ d.meta && /* @__PURE__ */ jsx("span", { className: "xicms-downloads__meta", "data-xicms-edit": `items.${d._i}.meta`, children: d.meta })
13
+ ] }) }, d._i)) })
14
+ ] });
15
+ }
16
+ export {
17
+ DownloadsRender
18
+ };
19
+ //# sourceMappingURL=DownloadsRender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/blocks/builtins/DownloadsRender.tsx"],"sourcesContent":["import type { z } from \"zod\";\nimport type { DownloadsBlockSchema } from \"../../schema/blocks\";\nimport type { BlockRenderProps } from \"../registry\";\nimport { Heading } from \"../ui\";\nimport { fileIcon } from \"./lib/fileIcon\";\n\ntype Downloads = z.infer<typeof DownloadsBlockSchema>;\n\n/** Downloadbare documenten (brochures, prijslijsten, voorwaarden). Server-safe. */\nexport function DownloadsRender({ block }: BlockRenderProps<Downloads>) {\n // _i = index in de OORSPRONKELIJKE array — de lijst wordt gefilterd op label && href.\n const items = (block.items ?? []).map((d, i) => ({ ...d, _i: i })).filter((d) => d.label && d.href);\n if (items.length === 0) return null;\n return (\n <section className=\"xicms-downloads\">\n {block.heading && <Heading level={2} data-xicms-edit=\"heading\">{block.heading}</Heading>}\n <ul className=\"xicms-downloads__list\">\n {items.map((d) => (\n <li key={d._i} className=\"xicms-downloads__item\">\n <a className=\"xicms-downloads__link\" href={d.href} download>\n <span className=\"xicms-downloads__icon\" aria-hidden=\"true\">{fileIcon(d.href)}</span>\n <span className=\"xicms-downloads__label\" data-xicms-edit={`items.${d._i}.label`}>{d.label}</span>\n {d.meta && <span className=\"xicms-downloads__meta\" data-xicms-edit={`items.${d._i}.meta`}>{d.meta}</span>}\n </a>\n </li>\n ))}\n </ul>\n </section>\n );\n}\n"],"mappings":"AAewB,cAIZ,YAJY;AAZxB,SAAS,eAAe;AACxB,SAAS,gBAAgB;AAKlB,SAAS,gBAAgB,EAAE,MAAM,GAAgC;AAEtE,QAAM,SAAS,MAAM,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,OAAO,EAAE,GAAG,GAAG,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI;AAClG,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SACE,qBAAC,aAAQ,WAAU,mBAChB;AAAA,UAAM,WAAW,oBAAC,WAAQ,OAAO,GAAG,mBAAgB,WAAW,gBAAM,SAAQ;AAAA,IAC9E,oBAAC,QAAG,WAAU,yBACX,gBAAM,IAAI,CAAC,MACV,oBAAC,QAAc,WAAU,yBACvB,+BAAC,OAAE,WAAU,yBAAwB,MAAM,EAAE,MAAM,UAAQ,MACzD;AAAA,0BAAC,UAAK,WAAU,yBAAwB,eAAY,QAAQ,mBAAS,EAAE,IAAI,GAAE;AAAA,MAC7E,oBAAC,UAAK,WAAU,0BAAyB,mBAAiB,SAAS,EAAE,EAAE,UAAW,YAAE,OAAM;AAAA,MACzF,EAAE,QAAQ,oBAAC,UAAK,WAAU,yBAAwB,mBAAiB,SAAS,EAAE,EAAE,SAAU,YAAE,MAAK;AAAA,OACpG,KALO,EAAE,EAMX,CACD,GACH;AAAA,KACF;AAEJ;","names":[]}
@@ -1,4 +1,3 @@
1
- import type { z } from "zod";
2
- export declare const buttonsBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
3
- export declare const quoteBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
4
- export declare const dividerBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
1
+ export declare const buttonsBlock: import("../index.js").BlockDefinition<import("zod/v4/core").$ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>>;
2
+ export declare const quoteBlock: import("../index.js").BlockDefinition<import("zod/v4/core").$ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>>;
3
+ export declare const dividerBlock: import("../index.js").BlockDefinition<import("zod/v4/core").$ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>>;
@@ -1,57 +1,23 @@
1
- "use client";
2
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
1
+ import dynamic from "next/dynamic";
3
2
  import { defineBlock } from "../registry.js";
4
- import { HStack, VStack, Card, Text, Btn, Divider } from "../ui/index.js";
5
- function ButtonsRender({ block }) {
6
- const items = (block.items ?? []).map((b, i) => ({ ...b, _i: i })).filter((b) => b.label);
7
- if (items.length === 0) return null;
8
- const hAlign = block.align === "center" ? "center" : block.align === "right" ? "end" : "start";
9
- return /* @__PURE__ */ jsx(HStack, { gap: 2, hAlign, style: { flexWrap: "wrap" }, children: items.map((b) => /* @__PURE__ */ jsx(Btn, { label: b.label, href: b.href, variant: b.variant, editField: `items.${b._i}.label` }, b._i)) });
10
- }
11
3
  const buttonsBlock = defineBlock({
12
4
  type: "buttons",
13
5
  fields: { "items.variant": { type: "select", options: [{ value: "primary", label: "Primair" }, { value: "secondary", label: "Secundair" }, { value: "outline", label: "Outline" }] } },
14
- Render: ButtonsRender,
6
+ Render: dynamic(() => import("./ElementsRender.js").then((m) => m.ButtonsRender)),
15
7
  label: "Knoppen",
16
8
  icon: "\u{1F518}",
17
9
  defaults: () => ({ align: "left", items: [{ label: "Knop", href: "#", variant: "primary" }] })
18
10
  });
19
- function QuoteRender({ block }) {
20
- if (!block.text) return null;
21
- return /* @__PURE__ */ jsx(Card, { padding: 5, variant: "muted", children: /* @__PURE__ */ jsxs(VStack, { gap: 2, as: "figure", style: { margin: 0 }, children: [
22
- /* @__PURE__ */ jsxs(Text, { type: "large", as: "p", style: { fontStyle: "italic" }, children: [
23
- "\u201C",
24
- /* @__PURE__ */ jsx("span", { "data-xicms-edit": "text", children: block.text }),
25
- "\u201D"
26
- ] }),
27
- (block.author || block.role) && /* @__PURE__ */ jsxs(Text, { as: "label", color: "secondary", children: [
28
- "\u2014 ",
29
- /* @__PURE__ */ jsx("span", { "data-xicms-edit": "author", children: block.author }),
30
- block.role ? /* @__PURE__ */ jsxs(Fragment, { children: [
31
- " \xB7 ",
32
- /* @__PURE__ */ jsx("span", { "data-xicms-edit": "role", children: block.role })
33
- ] }) : ""
34
- ] })
35
- ] }) });
36
- }
37
11
  const quoteBlock = defineBlock({
38
12
  type: "quote",
39
- Render: QuoteRender,
13
+ Render: dynamic(() => import("./ElementsRender.js").then((m) => m.QuoteRender)),
40
14
  label: "Uitspraak",
41
15
  icon: "\u275D",
42
16
  defaults: () => ({ text: "Een krachtige uitspraak.", author: "" })
43
17
  });
44
- function DividerRender({ block }) {
45
- const pad = block.spacing === "sm" ? "0.75rem" : block.spacing === "lg" ? "3rem" : "1.5rem";
46
- if (block.variant === "space") return /* @__PURE__ */ jsx("div", { style: { height: pad }, "aria-hidden": "true" });
47
- if (block.variant === "dots") {
48
- return /* @__PURE__ */ jsx("div", { style: { textAlign: "center", padding: `${pad} 0`, color: "var(--color-text-secondary)", letterSpacing: "0.5em" }, "aria-hidden": "true", children: "\u2022 \u2022 \u2022" });
49
- }
50
- return /* @__PURE__ */ jsx("div", { style: { padding: `${pad} 0` }, children: /* @__PURE__ */ jsx(Divider, { variant: "subtle" }) });
51
- }
52
18
  const dividerBlock = defineBlock({
53
19
  type: "divider",
54
- Render: DividerRender,
20
+ Render: dynamic(() => import("./ElementsRender.js").then((m) => m.DividerRender)),
55
21
  label: "Scheiding",
56
22
  icon: "\u2796",
57
23
  defaults: () => ({ variant: "line", spacing: "md" })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/blocks/builtins/Elements.tsx"],"sourcesContent":["\"use client\";\n\nimport type { z } from \"zod\";\nimport type { ButtonsBlockSchema, QuoteBlockSchema, DividerBlockSchema } from \"../../schema/blocks\";\nimport { defineBlock, type BlockRenderProps } from \"../registry\";\nimport { HStack, VStack, Card, Text, Btn, Divider } from \"../ui\";\n\n/* ── Buttons (knopgroep) ─────────────────────────────────────────────────── */\ntype Buttons = z.infer<typeof ButtonsBlockSchema>;\nfunction ButtonsRender({ block }: BlockRenderProps<Buttons>) {\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((b, i) => ({ ...b, _i: i })).filter((b) => b.label);\n if (items.length === 0) return null;\n const hAlign = block.align === \"center\" ? \"center\" : block.align === \"right\" ? \"end\" : \"start\";\n return (\n <HStack gap={2} hAlign={hAlign} style={{ flexWrap: \"wrap\" }}>\n {items.map((b) => (\n <Btn key={b._i} label={b.label} href={b.href} variant={b.variant} editField={`items.${b._i}.label`} />\n ))}\n </HStack>\n );\n}\nexport const buttonsBlock = defineBlock({\n type: \"buttons\",\n fields: { \"items.variant\": { type: \"select\", options: [{ value: \"primary\", label: \"Primair\" }, { value: \"secondary\", label: \"Secundair\" }, { value: \"outline\", label: \"Outline\" }] } },\n Render: ButtonsRender,\n label: \"Knoppen\",\n icon: \"🔘\",\n defaults: () => ({ align: \"left\", items: [{ label: \"Knop\", href: \"#\", variant: \"primary\" }] }),\n});\n\n/* ── Quote (uitspraak) ───────────────────────────────────────────────────── */\ntype Quote = z.infer<typeof QuoteBlockSchema>;\nfunction QuoteRender({ block }: BlockRenderProps<Quote>) {\n if (!block.text) return null;\n return (\n <Card padding={5} variant=\"muted\">\n <VStack gap={2} as=\"figure\" style={{ margin: 0 }}>\n <Text type=\"large\" as=\"p\" style={{ fontStyle: \"italic\" }}>“<span data-xicms-edit=\"text\">{block.text}</span>”</Text>\n {(block.author || block.role) && (\n <Text as=\"label\" color=\"secondary\">\n — <span data-xicms-edit=\"author\">{block.author}</span>\n {block.role ? <> · <span data-xicms-edit=\"role\">{block.role}</span></> : \"\"}\n </Text>\n )}\n </VStack>\n </Card>\n );\n}\nexport const quoteBlock = defineBlock({\n type: \"quote\",\n Render: QuoteRender,\n label: \"Uitspraak\",\n icon: \"❝\",\n defaults: () => ({ text: \"Een krachtige uitspraak.\", author: \"\" }),\n});\n\n/* ── Divider (scheiding) ─────────────────────────────────────────────────── */\ntype DividerBlk = z.infer<typeof DividerBlockSchema>;\nfunction DividerRender({ block }: BlockRenderProps<DividerBlk>) {\n const pad = block.spacing === \"sm\" ? \"0.75rem\" : block.spacing === \"lg\" ? \"3rem\" : \"1.5rem\";\n if (block.variant === \"space\") return <div style={{ height: pad }} aria-hidden=\"true\" />;\n if (block.variant === \"dots\") {\n return (\n <div style={{ textAlign: \"center\", padding: `${pad} 0`, color: \"var(--color-text-secondary)\", letterSpacing: \"0.5em\" }} aria-hidden=\"true\">\n • • •\n </div>\n );\n }\n return <div style={{ padding: `${pad} 0` }}><Divider variant=\"subtle\" /></div>;\n}\nexport const dividerBlock = defineBlock({\n type: \"divider\",\n Render: DividerRender,\n label: \"Scheiding\",\n icon: \"➖\",\n defaults: () => ({ variant: \"line\", spacing: \"md\" }),\n});\n"],"mappings":";AAkBQ,SAyBkB,UAzBlB,KAqBA,YArBA;AAdR,SAAS,mBAA0C;AACnD,SAAS,QAAQ,QAAQ,MAAM,MAAM,KAAK,eAAe;AAIzD,SAAS,cAAc,EAAE,MAAM,GAA8B;AAG3D,QAAM,SAAS,MAAM,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,OAAO,EAAE,GAAG,GAAG,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK;AACxF,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,SAAS,MAAM,UAAU,WAAW,WAAW,MAAM,UAAU,UAAU,QAAQ;AACvF,SACE,oBAAC,UAAO,KAAK,GAAG,QAAgB,OAAO,EAAE,UAAU,OAAO,GACvD,gBAAM,IAAI,CAAC,MACV,oBAAC,OAAe,OAAO,EAAE,OAAO,MAAM,EAAE,MAAM,SAAS,EAAE,SAAS,WAAW,SAAS,EAAE,EAAE,YAAhF,EAAE,EAAwF,CACrG,GACH;AAEJ;AACO,MAAM,eAAe,YAAY;AAAA,EACtC,MAAM;AAAA,EACN,QAAQ,EAAE,iBAAiB,EAAE,MAAM,UAAU,SAAS,CAAC,EAAE,OAAO,WAAW,OAAO,UAAU,GAAG,EAAE,OAAO,aAAa,OAAO,YAAY,GAAG,EAAE,OAAO,WAAW,OAAO,UAAU,CAAC,EAAE,EAAE;AAAA,EACrL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,OAAO,QAAQ,OAAO,CAAC,EAAE,OAAO,QAAQ,MAAM,KAAK,SAAS,UAAU,CAAC,EAAE;AAC9F,CAAC;AAID,SAAS,YAAY,EAAE,MAAM,GAA4B;AACvD,MAAI,CAAC,MAAM,KAAM,QAAO;AACxB,SACE,oBAAC,QAAK,SAAS,GAAG,SAAQ,SACxB,+BAAC,UAAO,KAAK,GAAG,IAAG,UAAS,OAAO,EAAE,QAAQ,EAAE,GAC7C;AAAA,yBAAC,QAAK,MAAK,SAAQ,IAAG,KAAI,OAAO,EAAE,WAAW,SAAS,GAAG;AAAA;AAAA,MAAC,oBAAC,UAAK,mBAAgB,QAAQ,gBAAM,MAAK;AAAA,MAAO;AAAA,OAAC;AAAA,KAC1G,MAAM,UAAU,MAAM,SACtB,qBAAC,QAAK,IAAG,SAAQ,OAAM,aAAY;AAAA;AAAA,MAC/B,oBAAC,UAAK,mBAAgB,UAAU,gBAAM,QAAO;AAAA,MAC9C,MAAM,OAAO,iCAAE;AAAA;AAAA,QAAG,oBAAC,UAAK,mBAAgB,QAAQ,gBAAM,MAAK;AAAA,SAAO,IAAM;AAAA,OAC3E;AAAA,KAEJ,GACF;AAEJ;AACO,MAAM,aAAa,YAAY;AAAA,EACpC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,MAAM,4BAA4B,QAAQ,GAAG;AAClE,CAAC;AAID,SAAS,cAAc,EAAE,MAAM,GAAiC;AAC9D,QAAM,MAAM,MAAM,YAAY,OAAO,YAAY,MAAM,YAAY,OAAO,SAAS;AACnF,MAAI,MAAM,YAAY,QAAS,QAAO,oBAAC,SAAI,OAAO,EAAE,QAAQ,IAAI,GAAG,eAAY,QAAO;AACtF,MAAI,MAAM,YAAY,QAAQ;AAC5B,WACE,oBAAC,SAAI,OAAO,EAAE,WAAW,UAAU,SAAS,GAAG,GAAG,MAAM,OAAO,+BAA+B,eAAe,QAAQ,GAAG,eAAY,QAAO,kCAE3I;AAAA,EAEJ;AACA,SAAO,oBAAC,SAAI,OAAO,EAAE,SAAS,GAAG,GAAG,KAAK,GAAG,8BAAC,WAAQ,SAAQ,UAAS,GAAE;AAC1E;AACO,MAAM,eAAe,YAAY;AAAA,EACtC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,SAAS,QAAQ,SAAS,KAAK;AACpD,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../../src/blocks/builtins/Elements.tsx"],"sourcesContent":["import dynamic from \"next/dynamic\";\nimport { defineBlock } from \"../registry\";\n\nexport const buttonsBlock = defineBlock({\n type: \"buttons\",\n fields: { \"items.variant\": { type: \"select\", options: [{ value: \"primary\", label: \"Primair\" }, { value: \"secondary\", label: \"Secundair\" }, { value: \"outline\", label: \"Outline\" }] } },\n Render: dynamic(() => import(\"./ElementsRender\").then((m) => m.ButtonsRender)),\n label: \"Knoppen\",\n icon: \"🔘\",\n defaults: () => ({ align: \"left\", items: [{ label: \"Knop\", href: \"#\", variant: \"primary\" }] }),\n});\n\nexport const quoteBlock = defineBlock({\n type: \"quote\",\n Render: dynamic(() => import(\"./ElementsRender\").then((m) => m.QuoteRender)),\n label: \"Uitspraak\",\n icon: \"❝\",\n defaults: () => ({ text: \"Een krachtige uitspraak.\", author: \"\" }),\n});\n\nexport const dividerBlock = defineBlock({\n type: \"divider\",\n Render: dynamic(() => import(\"./ElementsRender\").then((m) => m.DividerRender)),\n label: \"Scheiding\",\n icon: \"➖\",\n defaults: () => ({ variant: \"line\", spacing: \"md\" }),\n});\n"],"mappings":"AAAA,OAAO,aAAa;AACpB,SAAS,mBAAmB;AAErB,MAAM,eAAe,YAAY;AAAA,EACtC,MAAM;AAAA,EACN,QAAQ,EAAE,iBAAiB,EAAE,MAAM,UAAU,SAAS,CAAC,EAAE,OAAO,WAAW,OAAO,UAAU,GAAG,EAAE,OAAO,aAAa,OAAO,YAAY,GAAG,EAAE,OAAO,WAAW,OAAO,UAAU,CAAC,EAAE,EAAE;AAAA,EACrL,QAAQ,QAAQ,MAAM,OAAO,kBAAkB,EAAE,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC;AAAA,EAC7E,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,OAAO,QAAQ,OAAO,CAAC,EAAE,OAAO,QAAQ,MAAM,KAAK,SAAS,UAAU,CAAC,EAAE;AAC9F,CAAC;AAEM,MAAM,aAAa,YAAY;AAAA,EACpC,MAAM;AAAA,EACN,QAAQ,QAAQ,MAAM,OAAO,kBAAkB,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC;AAAA,EAC3E,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,MAAM,4BAA4B,QAAQ,GAAG;AAClE,CAAC;AAEM,MAAM,eAAe,YAAY;AAAA,EACtC,MAAM;AAAA,EACN,QAAQ,QAAQ,MAAM,OAAO,kBAAkB,EAAE,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC;AAAA,EAC7E,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,SAAS,QAAQ,SAAS,KAAK;AACpD,CAAC;","names":[]}
@@ -0,0 +1,10 @@
1
+ import type { z } from "zod";
2
+ import type { ButtonsBlockSchema, QuoteBlockSchema, DividerBlockSchema } from "../../schema/blocks.js";
3
+ import type { BlockRenderProps } from "../registry.js";
4
+ type Buttons = z.infer<typeof ButtonsBlockSchema>;
5
+ export declare function ButtonsRender({ block }: BlockRenderProps<Buttons>): import("react").JSX.Element | null;
6
+ type Quote = z.infer<typeof QuoteBlockSchema>;
7
+ export declare function QuoteRender({ block }: BlockRenderProps<Quote>): import("react").JSX.Element | null;
8
+ type DividerBlk = z.infer<typeof DividerBlockSchema>;
9
+ export declare function DividerRender({ block }: BlockRenderProps<DividerBlk>): import("react").JSX.Element;
10
+ export {};
@@ -0,0 +1,41 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { HStack, VStack, Card, Text, Btn, Divider } from "../ui/index.js";
4
+ function ButtonsRender({ block }) {
5
+ const items = (block.items ?? []).map((b, i) => ({ ...b, _i: i })).filter((b) => b.label);
6
+ if (items.length === 0) return null;
7
+ const hAlign = block.align === "center" ? "center" : block.align === "right" ? "end" : "start";
8
+ return /* @__PURE__ */ jsx(HStack, { gap: 2, hAlign, style: { flexWrap: "wrap" }, children: items.map((b) => /* @__PURE__ */ jsx(Btn, { label: b.label, href: b.href, variant: b.variant, editField: `items.${b._i}.label` }, b._i)) });
9
+ }
10
+ function QuoteRender({ block }) {
11
+ if (!block.text) return null;
12
+ return /* @__PURE__ */ jsx(Card, { padding: 5, variant: "muted", children: /* @__PURE__ */ jsxs(VStack, { gap: 2, as: "figure", style: { margin: 0 }, children: [
13
+ /* @__PURE__ */ jsxs(Text, { type: "large", as: "p", style: { fontStyle: "italic" }, children: [
14
+ "\u201C",
15
+ /* @__PURE__ */ jsx("span", { "data-xicms-edit": "text", children: block.text }),
16
+ "\u201D"
17
+ ] }),
18
+ (block.author || block.role) && /* @__PURE__ */ jsxs(Text, { as: "label", color: "secondary", children: [
19
+ "\u2014 ",
20
+ /* @__PURE__ */ jsx("span", { "data-xicms-edit": "author", children: block.author }),
21
+ block.role ? /* @__PURE__ */ jsxs(Fragment, { children: [
22
+ " \xB7 ",
23
+ /* @__PURE__ */ jsx("span", { "data-xicms-edit": "role", children: block.role })
24
+ ] }) : ""
25
+ ] })
26
+ ] }) });
27
+ }
28
+ function DividerRender({ block }) {
29
+ const pad = block.spacing === "sm" ? "0.75rem" : block.spacing === "lg" ? "3rem" : "1.5rem";
30
+ if (block.variant === "space") return /* @__PURE__ */ jsx("div", { style: { height: pad }, "aria-hidden": "true" });
31
+ if (block.variant === "dots") {
32
+ return /* @__PURE__ */ jsx("div", { style: { textAlign: "center", padding: `${pad} 0`, color: "var(--color-text-secondary)", letterSpacing: "0.5em" }, "aria-hidden": "true", children: "\u2022 \u2022 \u2022" });
33
+ }
34
+ return /* @__PURE__ */ jsx("div", { style: { padding: `${pad} 0` }, children: /* @__PURE__ */ jsx(Divider, { variant: "subtle" }) });
35
+ }
36
+ export {
37
+ ButtonsRender,
38
+ DividerRender,
39
+ QuoteRender
40
+ };
41
+ //# sourceMappingURL=ElementsRender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/blocks/builtins/ElementsRender.tsx"],"sourcesContent":["\"use client\";\n\nimport type { z } from \"zod\";\nimport type { ButtonsBlockSchema, QuoteBlockSchema, DividerBlockSchema } from \"../../schema/blocks\";\nimport type { BlockRenderProps } from \"../registry\";\nimport { HStack, VStack, Card, Text, Btn, Divider } from \"../ui\";\n\n/* ── Buttons (knopgroep) ─────────────────────────────────────────────────── */\ntype Buttons = z.infer<typeof ButtonsBlockSchema>;\nexport function ButtonsRender({ block }: BlockRenderProps<Buttons>) {\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((b, i) => ({ ...b, _i: i })).filter((b) => b.label);\n if (items.length === 0) return null;\n const hAlign = block.align === \"center\" ? \"center\" : block.align === \"right\" ? \"end\" : \"start\";\n return (\n <HStack gap={2} hAlign={hAlign} style={{ flexWrap: \"wrap\" }}>\n {items.map((b) => (\n <Btn key={b._i} label={b.label} href={b.href} variant={b.variant} editField={`items.${b._i}.label`} />\n ))}\n </HStack>\n );\n}\n/* ── Quote (uitspraak) ───────────────────────────────────────────────────── */\ntype Quote = z.infer<typeof QuoteBlockSchema>;\nexport function QuoteRender({ block }: BlockRenderProps<Quote>) {\n if (!block.text) return null;\n return (\n <Card padding={5} variant=\"muted\">\n <VStack gap={2} as=\"figure\" style={{ margin: 0 }}>\n <Text type=\"large\" as=\"p\" style={{ fontStyle: \"italic\" }}>“<span data-xicms-edit=\"text\">{block.text}</span>”</Text>\n {(block.author || block.role) && (\n <Text as=\"label\" color=\"secondary\">\n — <span data-xicms-edit=\"author\">{block.author}</span>\n {block.role ? <> · <span data-xicms-edit=\"role\">{block.role}</span></> : \"\"}\n </Text>\n )}\n </VStack>\n </Card>\n );\n}\n/* ── Divider (scheiding) ─────────────────────────────────────────────────── */\ntype DividerBlk = z.infer<typeof DividerBlockSchema>;\nexport function DividerRender({ block }: BlockRenderProps<DividerBlk>) {\n const pad = block.spacing === \"sm\" ? \"0.75rem\" : block.spacing === \"lg\" ? \"3rem\" : \"1.5rem\";\n if (block.variant === \"space\") return <div style={{ height: pad }} aria-hidden=\"true\" />;\n if (block.variant === \"dots\") {\n return (\n <div style={{ textAlign: \"center\", padding: `${pad} 0`, color: \"var(--color-text-secondary)\", letterSpacing: \"0.5em\" }} aria-hidden=\"true\">\n • • •\n </div>\n );\n }\n return <div style={{ padding: `${pad} 0` }}><Divider variant=\"subtle\" /></div>;\n}\n"],"mappings":";AAkBQ,SAgBkB,UAhBlB,KAYA,YAZA;AAbR,SAAS,QAAQ,QAAQ,MAAM,MAAM,KAAK,eAAe;AAIlD,SAAS,cAAc,EAAE,MAAM,GAA8B;AAGlE,QAAM,SAAS,MAAM,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,OAAO,EAAE,GAAG,GAAG,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK;AACxF,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,SAAS,MAAM,UAAU,WAAW,WAAW,MAAM,UAAU,UAAU,QAAQ;AACvF,SACE,oBAAC,UAAO,KAAK,GAAG,QAAgB,OAAO,EAAE,UAAU,OAAO,GACvD,gBAAM,IAAI,CAAC,MACV,oBAAC,OAAe,OAAO,EAAE,OAAO,MAAM,EAAE,MAAM,SAAS,EAAE,SAAS,WAAW,SAAS,EAAE,EAAE,YAAhF,EAAE,EAAwF,CACrG,GACH;AAEJ;AAGO,SAAS,YAAY,EAAE,MAAM,GAA4B;AAC9D,MAAI,CAAC,MAAM,KAAM,QAAO;AACxB,SACE,oBAAC,QAAK,SAAS,GAAG,SAAQ,SACxB,+BAAC,UAAO,KAAK,GAAG,IAAG,UAAS,OAAO,EAAE,QAAQ,EAAE,GAC7C;AAAA,yBAAC,QAAK,MAAK,SAAQ,IAAG,KAAI,OAAO,EAAE,WAAW,SAAS,GAAG;AAAA;AAAA,MAAC,oBAAC,UAAK,mBAAgB,QAAQ,gBAAM,MAAK;AAAA,MAAO;AAAA,OAAC;AAAA,KAC1G,MAAM,UAAU,MAAM,SACtB,qBAAC,QAAK,IAAG,SAAQ,OAAM,aAAY;AAAA;AAAA,MAC/B,oBAAC,UAAK,mBAAgB,UAAU,gBAAM,QAAO;AAAA,MAC9C,MAAM,OAAO,iCAAE;AAAA;AAAA,QAAG,oBAAC,UAAK,mBAAgB,QAAQ,gBAAM,MAAK;AAAA,SAAO,IAAM;AAAA,OAC3E;AAAA,KAEJ,GACF;AAEJ;AAGO,SAAS,cAAc,EAAE,MAAM,GAAiC;AACrE,QAAM,MAAM,MAAM,YAAY,OAAO,YAAY,MAAM,YAAY,OAAO,SAAS;AACnF,MAAI,MAAM,YAAY,QAAS,QAAO,oBAAC,SAAI,OAAO,EAAE,QAAQ,IAAI,GAAG,eAAY,QAAO;AACtF,MAAI,MAAM,YAAY,QAAQ;AAC5B,WACE,oBAAC,SAAI,OAAO,EAAE,WAAW,UAAU,SAAS,GAAG,GAAG,MAAM,OAAO,+BAA+B,eAAe,QAAQ,GAAG,eAAY,QAAO,kCAE3I;AAAA,EAEJ;AACA,SAAO,oBAAC,SAAI,OAAO,EAAE,SAAS,GAAG,GAAG,KAAK,GAAG,8BAAC,WAAQ,SAAQ,UAAS,GAAE;AAC1E;","names":[]}
@@ -1,2 +1 @@
1
- import type { z } from "zod";
2
- export declare const embedBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
1
+ export declare const embedBlock: import("../index.js").BlockDefinition<import("zod/v4/core").$ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>>;
@@ -1,25 +1,8 @@
1
- "use client";
2
- import { jsx } from "react/jsx-runtime";
1
+ import dynamic from "next/dynamic";
3
2
  import { defineBlock } from "../registry.js";
4
- import { ConsentEmbed } from "./consentEmbed.js";
5
- function EmbedRender({ block, mode }) {
6
- if (!block.url) return null;
7
- const sizing = block.aspectRatio && block.aspectRatio !== "fixed" ? { aspectRatio: block.aspectRatio.replace("/", " / ") } : { height: `${block.height}px` };
8
- return /* @__PURE__ */ jsx("div", { className: "xicms-embed", style: sizing, children: /* @__PURE__ */ jsx(ConsentEmbed, { gated: block.consentGated, preview: mode === "preview", label: block.title ?? "Embed", children: /* @__PURE__ */ jsx(
9
- "iframe",
10
- {
11
- src: block.url,
12
- title: block.title ?? "Embed",
13
- loading: "lazy",
14
- referrerPolicy: "no-referrer-when-downgrade",
15
- sandbox: "allow-scripts allow-same-origin allow-forms allow-popups",
16
- style: { border: 0, width: "100%", height: "100%" }
17
- }
18
- ) }) });
19
- }
20
3
  const embedBlock = defineBlock({
21
4
  type: "embed",
22
- Render: EmbedRender,
5
+ Render: dynamic(() => import("./EmbedRender.js").then((m) => m.EmbedRender)),
23
6
  label: "Embed (iframe)",
24
7
  icon: "\u{1F9E9}",
25
8
  defaults: () => ({ url: "", height: 420, consentGated: true })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/blocks/builtins/Embed.tsx"],"sourcesContent":["\"use client\";\n\nimport type { z } from \"zod\";\nimport type { EmbedBlockSchema } from \"../../schema/blocks\";\nimport { defineBlock, type BlockRenderProps } from \"../registry\";\nimport { ConsentEmbed } from \"./consentEmbed\";\n\ntype Embed = z.infer<typeof EmbedBlockSchema>;\n\n/** Generieke responsive iframe-embed (consent-gated by default) — voor wat dan ook met een URL. */\nfunction EmbedRender({ block, mode }: BlockRenderProps<Embed>) {\n if (!block.url) return null;\n // \"fixed\" = vaste hoogte (bestaand gedrag); anders schaalt de embed mee met de beeldverhouding.\n const sizing =\n block.aspectRatio && block.aspectRatio !== \"fixed\"\n ? { aspectRatio: block.aspectRatio.replace(\"/\", \" / \") }\n : { height: `${block.height}px` };\n return (\n <div className=\"xicms-embed\" style={sizing}>\n <ConsentEmbed gated={block.consentGated} preview={mode === \"preview\"} label={block.title ?? \"Embed\"}>\n <iframe\n src={block.url}\n title={block.title ?? \"Embed\"}\n loading=\"lazy\"\n referrerPolicy=\"no-referrer-when-downgrade\"\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups\"\n style={{ border: 0, width: \"100%\", height: \"100%\" }}\n />\n </ConsentEmbed>\n </div>\n );\n}\n\nexport const embedBlock = defineBlock({\n type: \"embed\",\n Render: EmbedRender,\n label: \"Embed (iframe)\",\n icon: \"🧩\",\n defaults: () => ({ url: \"\", height: 420, consentGated: true }),\n});\n"],"mappings":";AAoBQ;AAhBR,SAAS,mBAA0C;AACnD,SAAS,oBAAoB;AAK7B,SAAS,YAAY,EAAE,OAAO,KAAK,GAA4B;AAC7D,MAAI,CAAC,MAAM,IAAK,QAAO;AAEvB,QAAM,SACJ,MAAM,eAAe,MAAM,gBAAgB,UACvC,EAAE,aAAa,MAAM,YAAY,QAAQ,KAAK,KAAK,EAAE,IACrD,EAAE,QAAQ,GAAG,MAAM,MAAM,KAAK;AACpC,SACE,oBAAC,SAAI,WAAU,eAAc,OAAO,QAClC,8BAAC,gBAAa,OAAO,MAAM,cAAc,SAAS,SAAS,WAAW,OAAO,MAAM,SAAS,SAC1F;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,MAAM;AAAA,MACX,OAAO,MAAM,SAAS;AAAA,MACtB,SAAQ;AAAA,MACR,gBAAe;AAAA,MACf,SAAQ;AAAA,MACR,OAAO,EAAE,QAAQ,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA;AAAA,EACpD,GACF,GACF;AAEJ;AAEO,MAAM,aAAa,YAAY;AAAA,EACpC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,KAAK,IAAI,QAAQ,KAAK,cAAc,KAAK;AAC9D,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../../src/blocks/builtins/Embed.tsx"],"sourcesContent":["import dynamic from \"next/dynamic\";\nimport { defineBlock } from \"../registry\";\n\nexport const embedBlock = defineBlock({\n type: \"embed\",\n Render: dynamic(() => import(\"./EmbedRender\").then((m) => m.EmbedRender)),\n label: \"Embed (iframe)\",\n icon: \"🧩\",\n defaults: () => ({ url: \"\", height: 420, consentGated: true }),\n});\n"],"mappings":"AAAA,OAAO,aAAa;AACpB,SAAS,mBAAmB;AAErB,MAAM,aAAa,YAAY;AAAA,EACpC,MAAM;AAAA,EACN,QAAQ,QAAQ,MAAM,OAAO,eAAe,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC;AAAA,EACxE,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,KAAK,IAAI,QAAQ,KAAK,cAAc,KAAK;AAC9D,CAAC;","names":[]}
@@ -0,0 +1,7 @@
1
+ import type { z } from "zod";
2
+ import type { EmbedBlockSchema } from "../../schema/blocks.js";
3
+ import type { BlockRenderProps } from "../registry.js";
4
+ type Embed = z.infer<typeof EmbedBlockSchema>;
5
+ /** Generieke responsive iframe-embed (consent-gated by default) — voor wat dan ook met een URL. */
6
+ export declare function EmbedRender({ block, mode }: BlockRenderProps<Embed>): import("react").JSX.Element | null;
7
+ export {};
@@ -0,0 +1,22 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { ConsentEmbed } from "./consentEmbed.js";
4
+ function EmbedRender({ block, mode }) {
5
+ if (!block.url) return null;
6
+ const sizing = block.aspectRatio && block.aspectRatio !== "fixed" ? { aspectRatio: block.aspectRatio.replace("/", " / ") } : { height: `${block.height}px` };
7
+ return /* @__PURE__ */ jsx("div", { className: "xicms-embed", style: sizing, children: /* @__PURE__ */ jsx(ConsentEmbed, { gated: block.consentGated, preview: mode === "preview", label: block.title ?? "Embed", children: /* @__PURE__ */ jsx(
8
+ "iframe",
9
+ {
10
+ src: block.url,
11
+ title: block.title ?? "Embed",
12
+ loading: "lazy",
13
+ referrerPolicy: "no-referrer-when-downgrade",
14
+ sandbox: "allow-scripts allow-same-origin allow-forms allow-popups",
15
+ style: { border: 0, width: "100%", height: "100%" }
16
+ }
17
+ ) }) });
18
+ }
19
+ export {
20
+ EmbedRender
21
+ };
22
+ //# sourceMappingURL=EmbedRender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/blocks/builtins/EmbedRender.tsx"],"sourcesContent":["\"use client\";\n\nimport type { z } from \"zod\";\nimport type { EmbedBlockSchema } from \"../../schema/blocks\";\nimport type { BlockRenderProps } from \"../registry\";\nimport { ConsentEmbed } from \"./consentEmbed\";\n\ntype Embed = z.infer<typeof EmbedBlockSchema>;\n\n/** Generieke responsive iframe-embed (consent-gated by default) — voor wat dan ook met een URL. */\nexport function EmbedRender({ block, mode }: BlockRenderProps<Embed>) {\n if (!block.url) return null;\n // \"fixed\" = vaste hoogte (bestaand gedrag); anders schaalt de embed mee met de beeldverhouding.\n const sizing =\n block.aspectRatio && block.aspectRatio !== \"fixed\"\n ? { aspectRatio: block.aspectRatio.replace(\"/\", \" / \") }\n : { height: `${block.height}px` };\n return (\n <div className=\"xicms-embed\" style={sizing}>\n <ConsentEmbed gated={block.consentGated} preview={mode === \"preview\"} label={block.title ?? \"Embed\"}>\n <iframe\n src={block.url}\n title={block.title ?? \"Embed\"}\n loading=\"lazy\"\n referrerPolicy=\"no-referrer-when-downgrade\"\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups\"\n style={{ border: 0, width: \"100%\", height: \"100%\" }}\n />\n </ConsentEmbed>\n </div>\n );\n}\n"],"mappings":";AAoBQ;AAfR,SAAS,oBAAoB;AAKtB,SAAS,YAAY,EAAE,OAAO,KAAK,GAA4B;AACpE,MAAI,CAAC,MAAM,IAAK,QAAO;AAEvB,QAAM,SACJ,MAAM,eAAe,MAAM,gBAAgB,UACvC,EAAE,aAAa,MAAM,YAAY,QAAQ,KAAK,KAAK,EAAE,IACrD,EAAE,QAAQ,GAAG,MAAM,MAAM,KAAK;AACpC,SACE,oBAAC,SAAI,WAAU,eAAc,OAAO,QAClC,8BAAC,gBAAa,OAAO,MAAM,cAAc,SAAS,SAAS,WAAW,OAAO,MAAM,SAAS,SAC1F;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,MAAM;AAAA,MACX,OAAO,MAAM,SAAS;AAAA,MACtB,SAAQ;AAAA,MACR,gBAAe;AAAA,MACf,SAAQ;AAAA,MACR,OAAO,EAAE,QAAQ,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA;AAAA,EACpD,GACF,GACF;AAEJ;","names":[]}
@@ -1,6 +1 @@
1
- import type { z } from "zod";
2
- /** Anker-id voor een vraag (deep-link: /faq#hoe-werkt-het). */
3
- export declare function questionSlug(q: string): string;
4
- /** Unieke anker-ids voor een vragenlijst: identieke vragen krijgen -2, -3, … (ids moeten uniek zijn). */
5
- export declare function questionSlugs(questions: string[]): string[];
6
- export declare const faqBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
1
+ export declare const faqBlock: import("../index.js").BlockDefinition<import("zod/v4/core").$ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>>;