@xiwebdesign/xicms-core 6.4.7 → 7.0.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 (373) hide show
  1. package/dist/SiteChrome.d.ts +12 -0
  2. package/dist/SiteChrome.js +24 -0
  3. package/dist/SiteChrome.js.map +1 -0
  4. package/dist/XiCMSProvider.d.ts +16 -8
  5. package/dist/XiCMSProvider.js +83 -58
  6. package/dist/XiCMSProvider.js.map +1 -1
  7. package/dist/admin/AdminApp.d.ts +1 -1
  8. package/dist/admin/AdminApp.js +79 -35
  9. package/dist/admin/AdminApp.js.map +1 -1
  10. package/dist/admin/AdminHelp.d.ts +8 -1
  11. package/dist/admin/AdminHelp.js +2 -2
  12. package/dist/admin/AdminHelp.js.map +1 -1
  13. package/dist/admin/NewsEditor.js +9 -9
  14. package/dist/admin/SuperadminPanel.js +5 -5
  15. package/dist/admin/blockEditors/GenericEditor.d.ts +2 -2
  16. package/dist/admin/blockEditors/GenericEditor.js +12 -11
  17. package/dist/admin/blockEditors/GenericEditor.js.map +1 -1
  18. package/dist/admin/blockEditors/StyleEditor.d.ts +1 -1
  19. package/dist/admin/blockEditors/StyleEditor.js +2 -2
  20. package/dist/admin/blockEditors/SymbolRefEditor.d.ts +1 -1
  21. package/dist/admin/blockEditors/SymbolRefEditor.js +5 -5
  22. package/dist/admin/blockEditors/index.d.ts +1 -1
  23. package/dist/admin/blockEditors/index.js +10 -10
  24. package/dist/admin/customBlocks/CustomBlocksPanel.js +7 -7
  25. package/dist/admin/editors/RichTextEditor.js +8 -7
  26. package/dist/admin/editors/RichTextEditor.js.map +1 -1
  27. package/dist/admin/editors/fontSizeExtension.js +1 -1
  28. package/dist/admin/editors/fontSizeExtension.js.map +1 -1
  29. package/dist/admin/forms/FormsPanel.js +9 -9
  30. package/dist/admin/index.d.ts +16 -16
  31. package/dist/admin/index.js +16 -16
  32. package/dist/admin/lib/mediaUsage.js +1 -1
  33. package/dist/admin/lib/pagesClient.d.ts +1 -1
  34. package/dist/admin/lib/pagesClient.js +11 -7
  35. package/dist/admin/lib/pagesClient.js.map +1 -1
  36. package/dist/admin/lib/sanitizeDraft.d.ts +9 -0
  37. package/dist/admin/lib/sanitizeDraft.js +28 -0
  38. package/dist/admin/lib/sanitizeDraft.js.map +1 -0
  39. package/dist/admin/lib/symbolsClient.d.ts +1 -1
  40. package/dist/admin/lib/symbolsClient.js +3 -3
  41. package/dist/admin/lib/upload.js +3 -3
  42. package/dist/admin/lib/useNestedDialog.d.ts +15 -0
  43. package/dist/admin/lib/useNestedDialog.js +23 -0
  44. package/dist/admin/lib/useNestedDialog.js.map +1 -0
  45. package/dist/admin/lib/zodFields.d.ts +4 -18
  46. package/dist/admin/lib/zodFields.js +54 -35
  47. package/dist/admin/lib/zodFields.js.map +1 -1
  48. package/dist/admin/media/MediaManager.js +7 -7
  49. package/dist/admin/media/MediaPicker.js +7 -7
  50. package/dist/admin/media/MediaPicker.js.map +1 -1
  51. package/dist/admin/pages/PageEditor.d.ts +1 -1
  52. package/dist/admin/pages/PageEditor.js +13 -13
  53. package/dist/admin/pages/PagesPanel.js +30 -30
  54. package/dist/admin/pages/PagesPanel.js.map +1 -1
  55. package/dist/admin/panelRegistry.js +7 -7
  56. package/dist/admin/patterns/PatternInserter.d.ts +1 -1
  57. package/dist/admin/patterns/PatternInserter.js +5 -5
  58. package/dist/admin/patterns/PatternInserter.js.map +1 -1
  59. package/dist/admin/settings/MailSettings.js +5 -5
  60. package/dist/admin/settings/MailTemplates.d.ts +1 -1
  61. package/dist/admin/settings/MailTemplates.js +5 -5
  62. package/dist/admin/settings/SettingsPanel.js +20 -20
  63. package/dist/admin/settings/SettingsPanel.js.map +1 -1
  64. package/dist/admin/settings/SnapshotsCard.js +5 -5
  65. package/dist/admin/settings/moduleSettingsForm.d.ts +1 -1
  66. package/dist/admin/settings/moduleSettingsForm.js +4 -4
  67. package/dist/admin/settings/moduleSettingsForm.js.map +1 -1
  68. package/dist/admin/shop/CategoriesTab.js +8 -8
  69. package/dist/admin/shop/ConnectionsTab.js +3 -3
  70. package/dist/admin/shop/DiscountsTab.js +8 -8
  71. package/dist/admin/shop/OrdersTab.js +10 -10
  72. package/dist/admin/shop/OrdersTab.js.map +1 -1
  73. package/dist/admin/shop/ProductsTab.js +10 -10
  74. package/dist/admin/shop/ShopPanel.js +9 -9
  75. package/dist/admin/shop/ShopSettingsTab.js +4 -4
  76. package/dist/admin/shop/index.d.ts +2 -2
  77. package/dist/admin/shop/index.js +2 -2
  78. package/dist/admin/shop/lib.js +2 -2
  79. package/dist/admin/stats/StatsPanel.js +2 -2
  80. package/dist/admin/ui/ArrayEditor.js +1 -1
  81. package/dist/admin/ui/PanelIcon.d.ts +3 -0
  82. package/dist/admin/ui/PanelIcon.js +34 -0
  83. package/dist/admin/ui/PanelIcon.js.map +1 -0
  84. package/dist/admin/ui/dialog.d.ts +21 -6
  85. package/dist/admin/ui/dialog.js +55 -34
  86. package/dist/admin/ui/dialog.js.map +1 -1
  87. package/dist/admin/ui/index.d.ts +7 -7
  88. package/dist/admin/ui/index.js +7 -7
  89. package/dist/admin/ui/primitives.js +1 -1
  90. package/dist/admin/ui/tabs.js +1 -1
  91. package/dist/admin/visual/TranslationPanel.d.ts +1 -1
  92. package/dist/admin/visual/TranslationPanel.js +3 -3
  93. package/dist/admin/visual/VisualEditor.js +47 -25
  94. package/dist/admin/visual/VisualEditor.js.map +1 -1
  95. package/dist/admin.css +2 -1
  96. package/dist/agentFiles/catalog.d.ts +2 -2
  97. package/dist/agentFiles/catalog.js +6 -5
  98. package/dist/agentFiles/catalog.js.map +1 -1
  99. package/dist/agentFiles/files.d.ts +5 -5
  100. package/dist/agentFiles/files.js +17 -17
  101. package/dist/agentFiles/files.js.map +1 -1
  102. package/dist/all.d.ts +4 -4
  103. package/dist/all.js +6 -6
  104. package/dist/auth/AuthProvider.d.ts +2 -2
  105. package/dist/auth/AuthProvider.js +51 -28
  106. package/dist/auth/AuthProvider.js.map +1 -1
  107. package/dist/auth/LoginForm.js +1 -1
  108. package/dist/auth/roles.js +4 -1
  109. package/dist/auth/roles.js.map +1 -1
  110. package/dist/blocks/BlockRenderer.d.ts +1 -1
  111. package/dist/blocks/BlockRenderer.js +3 -3
  112. package/dist/blocks/blockStyle.d.ts +1 -1
  113. package/dist/blocks/builtins/Accordion.d.ts +1 -1
  114. package/dist/blocks/builtins/Accordion.js +13 -6
  115. package/dist/blocks/builtins/Accordion.js.map +1 -1
  116. package/dist/blocks/builtins/Agenda.d.ts +1 -1
  117. package/dist/blocks/builtins/Agenda.js +5 -5
  118. package/dist/blocks/builtins/Banner.d.ts +1 -1
  119. package/dist/blocks/builtins/Banner.js +2 -2
  120. package/dist/blocks/builtins/BeforeAfter.d.ts +1 -1
  121. package/dist/blocks/builtins/BeforeAfter.js +4 -4
  122. package/dist/blocks/builtins/BeforeAfter.js.map +1 -1
  123. package/dist/blocks/builtins/Booking.d.ts +1 -1
  124. package/dist/blocks/builtins/Booking.js +5 -5
  125. package/dist/blocks/builtins/Breadcrumbs.d.ts +1 -1
  126. package/dist/blocks/builtins/Breadcrumbs.js +3 -3
  127. package/dist/blocks/builtins/Cards.d.ts +1 -1
  128. package/dist/blocks/builtins/Cards.js +5 -5
  129. package/dist/blocks/builtins/Cards.js.map +1 -1
  130. package/dist/blocks/builtins/Columns.d.ts +1 -1
  131. package/dist/blocks/builtins/Columns.js +4 -4
  132. package/dist/blocks/builtins/Contact.d.ts +3 -3
  133. package/dist/blocks/builtins/Contact.js +4 -4
  134. package/dist/blocks/builtins/Countdown.d.ts +1 -1
  135. package/dist/blocks/builtins/Countdown.js +4 -4
  136. package/dist/blocks/builtins/Countdown.js.map +1 -1
  137. package/dist/blocks/builtins/Cta.d.ts +1 -1
  138. package/dist/blocks/builtins/Cta.js +3 -3
  139. package/dist/blocks/builtins/Downloads.d.ts +1 -1
  140. package/dist/blocks/builtins/Downloads.js +4 -4
  141. package/dist/blocks/builtins/Elements.d.ts +3 -3
  142. package/dist/blocks/builtins/Elements.js +3 -3
  143. package/dist/blocks/builtins/Embed.d.ts +1 -1
  144. package/dist/blocks/builtins/Embed.js +3 -3
  145. package/dist/blocks/builtins/Faq.d.ts +1 -1
  146. package/dist/blocks/builtins/Faq.js +14 -6
  147. package/dist/blocks/builtins/Faq.js.map +1 -1
  148. package/dist/blocks/builtins/FormBlock.d.ts +1 -1
  149. package/dist/blocks/builtins/FormBlock.js +28 -18
  150. package/dist/blocks/builtins/FormBlock.js.map +1 -1
  151. package/dist/blocks/builtins/Gallery.d.ts +2 -2
  152. package/dist/blocks/builtins/Gallery.js +5 -5
  153. package/dist/blocks/builtins/Hero.d.ts +1 -1
  154. package/dist/blocks/builtins/Hero.js +4 -4
  155. package/dist/blocks/builtins/ImageBlock.d.ts +1 -1
  156. package/dist/blocks/builtins/ImageBlock.js +3 -3
  157. package/dist/blocks/builtins/Jobs.d.ts +2 -2
  158. package/dist/blocks/builtins/Jobs.js +5 -5
  159. package/dist/blocks/builtins/Layout.d.ts +2 -2
  160. package/dist/blocks/builtins/Layout.js +4 -4
  161. package/dist/blocks/builtins/MapBlock.d.ts +1 -1
  162. package/dist/blocks/builtins/MapBlock.js +3 -3
  163. package/dist/blocks/builtins/NewsListBlock.d.ts +1 -1
  164. package/dist/blocks/builtins/NewsListBlock.js +4 -4
  165. package/dist/blocks/builtins/Newsletter.d.ts +1 -1
  166. package/dist/blocks/builtins/Newsletter.js +7 -7
  167. package/dist/blocks/builtins/Newsletter.js.map +1 -1
  168. package/dist/blocks/builtins/OpenNowBadge.d.ts +1 -1
  169. package/dist/blocks/builtins/OpenNowBadge.js +8 -3
  170. package/dist/blocks/builtins/OpenNowBadge.js.map +1 -1
  171. package/dist/blocks/builtins/OpeningHours.d.ts +1 -1
  172. package/dist/blocks/builtins/OpeningHours.js +6 -6
  173. package/dist/blocks/builtins/PdfBlock.d.ts +1 -1
  174. package/dist/blocks/builtins/PdfBlock.js +3 -3
  175. package/dist/blocks/builtins/Portfolio.d.ts +1 -1
  176. package/dist/blocks/builtins/Portfolio.js +5 -5
  177. package/dist/blocks/builtins/Pricing.d.ts +2 -2
  178. package/dist/blocks/builtins/Pricing.js +5 -5
  179. package/dist/blocks/builtins/Pricing.js.map +1 -1
  180. package/dist/blocks/builtins/RichTextBlock.d.ts +1 -1
  181. package/dist/blocks/builtins/RichTextBlock.js +2 -2
  182. package/dist/blocks/builtins/RichTextBlock.js.map +1 -1
  183. package/dist/blocks/builtins/Search.d.ts +1 -1
  184. package/dist/blocks/builtins/Search.js +9 -7
  185. package/dist/blocks/builtins/Search.js.map +1 -1
  186. package/dist/blocks/builtins/Sections.d.ts +4 -4
  187. package/dist/blocks/builtins/Sections.js +4 -4
  188. package/dist/blocks/builtins/Slider.d.ts +1 -1
  189. package/dist/blocks/builtins/Slider.js +3 -3
  190. package/dist/blocks/builtins/Spacer.d.ts +1 -1
  191. package/dist/blocks/builtins/Spacer.js +2 -2
  192. package/dist/blocks/builtins/SymbolRef.d.ts +1 -1
  193. package/dist/blocks/builtins/SymbolRef.js +31 -17
  194. package/dist/blocks/builtins/SymbolRef.js.map +1 -1
  195. package/dist/blocks/builtins/Team.d.ts +1 -1
  196. package/dist/blocks/builtins/Team.js +4 -4
  197. package/dist/blocks/builtins/Testimonials.d.ts +2 -2
  198. package/dist/blocks/builtins/Testimonials.js +4 -4
  199. package/dist/blocks/builtins/Video.d.ts +2 -2
  200. package/dist/blocks/builtins/Video.js +4 -4
  201. package/dist/blocks/builtins/Video.js.map +1 -1
  202. package/dist/blocks/builtins/WhatsappChat.d.ts +1 -1
  203. package/dist/blocks/builtins/WhatsappChat.js +2 -2
  204. package/dist/blocks/builtins/Widgets.d.ts +12 -12
  205. package/dist/blocks/builtins/Widgets.js +19 -19
  206. package/dist/blocks/builtins/Widgets.js.map +1 -1
  207. package/dist/blocks/builtins/consentEmbed.js +2 -2
  208. package/dist/blocks/builtins/index.d.ts +40 -40
  209. package/dist/blocks/builtins/index.js +40 -40
  210. package/dist/blocks/builtins/lib/submitForm.js +5 -3
  211. package/dist/blocks/builtins/lib/submitForm.js.map +1 -1
  212. package/dist/blocks/context.d.ts +1 -1
  213. package/dist/blocks/customTemplate/definition.d.ts +3 -3
  214. package/dist/blocks/customTemplate/definition.js +6 -6
  215. package/dist/blocks/customTemplate/definition.js.map +1 -1
  216. package/dist/blocks/customTemplate/interpret.js +1 -1
  217. package/dist/blocks/index.d.ts +5 -5
  218. package/dist/blocks/index.js +5 -5
  219. package/dist/blocks/registry.d.ts +17 -7
  220. package/dist/blocks/registry.js +2 -1
  221. package/dist/blocks/registry.js.map +1 -1
  222. package/dist/components/EditBar.js +3 -3
  223. package/dist/components/FeedbackWidget.js +4 -4
  224. package/dist/components/News.d.ts +1 -1
  225. package/dist/components/News.js +50 -37
  226. package/dist/components/News.js.map +1 -1
  227. package/dist/components/PageView.js +11 -8
  228. package/dist/components/PageView.js.map +1 -1
  229. package/dist/components/ResponsiveImage.d.ts +1 -1
  230. package/dist/components/site/SiteFooter.d.ts +1 -1
  231. package/dist/components/site/SiteFooter.js +2 -2
  232. package/dist/config.d.ts +1 -1
  233. package/dist/demo/DemoStudio.js +3 -3
  234. package/dist/demo/demoStore.d.ts +3 -3
  235. package/dist/demo/index.d.ts +2 -2
  236. package/dist/demo/index.js +2 -2
  237. package/dist/editor/EditorProvider.js +1 -1
  238. package/dist/firebase/admin.d.ts +0 -2
  239. package/dist/firebase/admin.js +0 -6
  240. package/dist/firebase/admin.js.map +1 -1
  241. package/dist/firebase/appcheck.d.ts +1 -1
  242. package/dist/firebase/appcheck.js +5 -3
  243. package/dist/firebase/appcheck.js.map +1 -1
  244. package/dist/firebase/client.d.ts +2 -1
  245. package/dist/firebase/client.js +2 -14
  246. package/dist/firebase/client.js.map +1 -1
  247. package/dist/firebase/config.d.ts +31 -0
  248. package/dist/firebase/config.js +39 -0
  249. package/dist/firebase/config.js.map +1 -0
  250. package/dist/firebase/feedback.js +5 -3
  251. package/dist/firebase/feedback.js.map +1 -1
  252. package/dist/i18n/overlay.d.ts +2 -2
  253. package/dist/i18n/overlay.js +6 -4
  254. package/dist/i18n/overlay.js.map +1 -1
  255. package/dist/index.d.ts +45 -44
  256. package/dist/index.js +35 -33
  257. package/dist/index.js.map +1 -1
  258. package/dist/lock/DemoLock.js +1 -1
  259. package/dist/modules/builtins.d.ts +1 -1
  260. package/dist/modules/builtins.js +53 -55
  261. package/dist/modules/builtins.js.map +1 -1
  262. package/dist/modules/consent/ConsentBanner.js +1 -1
  263. package/dist/modules/consent/useConsent.js +1 -1
  264. package/dist/modules/context.d.ts +1 -1
  265. package/dist/modules/contract.d.ts +1 -1
  266. package/dist/modules/defineModule.d.ts +1 -1
  267. package/dist/modules/index.d.ts +9 -9
  268. package/dist/modules/index.js +8 -8
  269. package/dist/modules/overrides.d.ts +1 -1
  270. package/dist/modules/registry.d.ts +2 -7
  271. package/dist/modules/registry.js +2 -1
  272. package/dist/modules/registry.js.map +1 -1
  273. package/dist/modules/shop/blocks/Cart.d.ts +1 -1
  274. package/dist/modules/shop/blocks/Cart.js +6 -6
  275. package/dist/modules/shop/blocks/Checkout.d.ts +1 -1
  276. package/dist/modules/shop/blocks/Checkout.js +6 -6
  277. package/dist/modules/shop/blocks/Donation.d.ts +1 -1
  278. package/dist/modules/shop/blocks/Donation.js +5 -5
  279. package/dist/modules/shop/blocks/OrderStatus.d.ts +1 -1
  280. package/dist/modules/shop/blocks/OrderStatus.js +5 -5
  281. package/dist/modules/shop/blocks/ProductDetail.d.ts +1 -1
  282. package/dist/modules/shop/blocks/ProductDetail.js +8 -8
  283. package/dist/modules/shop/blocks/ProductGrid.d.ts +3 -3
  284. package/dist/modules/shop/blocks/ProductGrid.js +7 -7
  285. package/dist/modules/shop/blocks/ShopCategories.d.ts +1 -1
  286. package/dist/modules/shop/blocks/ShopCategories.js +6 -6
  287. package/dist/modules/shop/index.d.ts +5 -5
  288. package/dist/modules/shop/index.js +5 -5
  289. package/dist/modules/shop/lib.d.ts +2 -2
  290. package/dist/modules/shop/lib.js +18 -13
  291. package/dist/modules/shop/lib.js.map +1 -1
  292. package/dist/modules/shop/module.d.ts +1 -1
  293. package/dist/modules/shop/module.js +9 -9
  294. package/dist/modules/shop/settings.d.ts +18 -50
  295. package/dist/modules/shop/settings.js +16 -16
  296. package/dist/modules/shop/settings.js.map +1 -1
  297. package/dist/modules/shop/strings.js +1 -1
  298. package/dist/modules/shop/types.d.ts +1 -1
  299. package/dist/modules/types.d.ts +2 -2
  300. package/dist/patterns/builtins.d.ts +1 -1
  301. package/dist/patterns/builtins.js +1 -1
  302. package/dist/patterns/index.d.ts +2 -2
  303. package/dist/patterns/index.js +2 -2
  304. package/dist/render/PageRenderer.d.ts +2 -2
  305. package/dist/render/PageRenderer.js +1 -1
  306. package/dist/render/PublishedPage.d.ts +1 -1
  307. package/dist/render/PublishedPage.js +2 -2
  308. package/dist/schema/blocks.d.ts +6793 -15095
  309. package/dist/schema/blocks.js +335 -355
  310. package/dist/schema/blocks.js.map +1 -1
  311. package/dist/schema/customBlocks.d.ts +10 -29
  312. package/dist/schema/customBlocks.js +14 -13
  313. package/dist/schema/customBlocks.js.map +1 -1
  314. package/dist/schema/fields.d.ts +10 -16
  315. package/dist/schema/fields.js +37 -37
  316. package/dist/schema/fields.js.map +1 -1
  317. package/dist/schema/forms.d.ts +62 -111
  318. package/dist/schema/forms.js +17 -17
  319. package/dist/schema/forms.js.map +1 -1
  320. package/dist/schema/index.d.ts +7 -7
  321. package/dist/schema/index.js +7 -7
  322. package/dist/schema/mail.d.ts +39 -87
  323. package/dist/schema/mail.js +4 -4
  324. package/dist/schema/mail.js.map +1 -1
  325. package/dist/schema/pages.d.ts +152 -674
  326. package/dist/schema/pages.js +26 -15
  327. package/dist/schema/pages.js.map +1 -1
  328. package/dist/schema/seo.d.ts +9 -27
  329. package/dist/schema/seo.js +7 -7
  330. package/dist/schema/seo.js.map +1 -1
  331. package/dist/schema/settings.d.ts +218 -1074
  332. package/dist/schema/settings.js +55 -55
  333. package/dist/schema/settings.js.map +1 -1
  334. package/dist/schema/shop.d.ts +470 -1214
  335. package/dist/schema/shop.js +124 -124
  336. package/dist/schema/shop.js.map +1 -1
  337. package/dist/schema/siteConfig.d.ts +73 -597
  338. package/dist/schema/siteConfig.js +17 -17
  339. package/dist/schema/siteConfig.js.map +1 -1
  340. package/dist/schema/symbols.d.ts +34 -191
  341. package/dist/schema/symbols.js +8 -8
  342. package/dist/schema/symbols.js.map +1 -1
  343. package/dist/server/auth.d.ts +17 -0
  344. package/dist/server/auth.js +11 -0
  345. package/dist/server/auth.js.map +1 -0
  346. package/dist/server/bundle.d.ts +15 -6
  347. package/dist/server/bundle.js +5 -1
  348. package/dist/server/bundle.js.map +1 -1
  349. package/dist/server/draft.d.ts +16 -0
  350. package/dist/server/draft.js +12 -0
  351. package/dist/server/draft.js.map +1 -0
  352. package/dist/server/env.js +8 -8
  353. package/dist/server/env.js.map +1 -1
  354. package/dist/server/index.d.ts +10 -8
  355. package/dist/server/index.js +12 -9
  356. package/dist/server/index.js.map +1 -1
  357. package/dist/server/pages.d.ts +14 -7
  358. package/dist/server/pages.js +183 -17
  359. package/dist/server/pages.js.map +1 -1
  360. package/dist/server/revalidate.d.ts +6 -0
  361. package/dist/server/revalidate.js +40 -0
  362. package/dist/server/revalidate.js.map +1 -0
  363. package/dist/server/seo.d.ts +3 -3
  364. package/dist/server/seo.js +1 -1
  365. package/dist/server/shop.d.ts +3 -3
  366. package/dist/server/shop.js +6 -3
  367. package/dist/server/shop.js.map +1 -1
  368. package/dist/settings/useSiteSettings.d.ts +2 -2
  369. package/dist/settings/useSiteSettings.js +48 -28
  370. package/dist/settings/useSiteSettings.js.map +1 -1
  371. package/dist/styles.css +4 -1
  372. package/dist/theme/presets.d.ts +1 -1
  373. package/package.json +35 -34
@@ -7,4 +7,4 @@ export interface Crumb {
7
7
  export declare function crumbsFromPath(path: string, homeLabel?: string): Crumb[];
8
8
  /** BreadcrumbList-JSON-LD. Puur en getest. */
9
9
  export declare function breadcrumbsJsonLd(crumbs: Crumb[]): Record<string, unknown>;
10
- export declare const breadcrumbsBlock: import("..").BlockDefinition<z.ZodTypeAny>;
10
+ export declare const breadcrumbsBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useEffect, useState } from "react";
4
- import { BreadcrumbsBlockSchema } from "../../schema/blocks";
5
- import { defineBlock } from "../registry";
4
+ import { BreadcrumbsBlockSchema } from "../../schema/blocks.js";
5
+ import { defineBlock } from "../registry.js";
6
6
  import { useLinkComponent } from "@astryxdesign/core/Link";
7
- import { jsonLdHtml } from "./jsonld";
7
+ import { jsonLdHtml } from "./jsonld.js";
8
8
  function crumbsFromPath(path, homeLabel = "Home") {
9
9
  const segments = path.split("/").filter(Boolean);
10
10
  const crumbs = [{ label: homeLabel, href: "/" }];
@@ -1,2 +1,2 @@
1
1
  import type { z } from "zod";
2
- export declare const cardsBlock: import("..").BlockDefinition<z.ZodTypeAny>;
2
+ export declare const cardsBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { CardsBlockSchema } from "../../schema/blocks";
4
- import { defineBlock } from "../registry";
5
- import { VStack, Grid, Card, Heading, Text } from "../ui";
3
+ import { CardsBlockSchema } from "../../schema/blocks.js";
4
+ import { defineBlock } from "../registry.js";
5
+ import { VStack, Grid, Card, Heading, Text } from "../ui/index.js";
6
6
  import { useLinkComponent } from "@astryxdesign/core/Link";
7
- import { Img } from "../../media/ImageContext";
7
+ import { Img } from "../../media/ImageContext.js";
8
8
  function CardsRender({ block }) {
9
9
  const LinkC = useLinkComponent();
10
10
  const items = (block.items ?? []).map((c, i) => ({ ...c, _i: i })).filter((c) => c.title || c.text || c.imageUrl);
@@ -12,7 +12,7 @@ function CardsRender({ block }) {
12
12
  return /* @__PURE__ */ jsxs(VStack, { gap: 4, as: "section", className: "xicms-cards", children: [
13
13
  (block.heading || block.intro) && /* @__PURE__ */ jsxs(VStack, { gap: 1, hAlign: "center", style: { textAlign: "center" }, children: [
14
14
  block.heading && /* @__PURE__ */ jsx(Heading, { level: 2, "data-xicms-edit": "heading", children: block.heading }),
15
- block.intro && /* @__PURE__ */ jsx(Text, { type: "large", color: "secondary", children: block.intro })
15
+ block.intro && /* @__PURE__ */ jsx(Text, { type: "large", color: "secondary", "data-xicms-edit": "intro", children: block.intro })
16
16
  ] }),
17
17
  /* @__PURE__ */ jsx(Grid, { columns: { minWidth: 240, max: block.columns }, gap: 4, children: items.map((c) => {
18
18
  const i = c._i;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/blocks/builtins/Cards.tsx"],"sourcesContent":["\"use client\";\n\nimport type { z } from \"zod\";\nimport { 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\">{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)\" }}>{c.linkLabel} →</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)\" }}>{c.linkLabel} →</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 schema: CardsBlockSchema,\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":["\"use client\";\n\nimport type { z } from \"zod\";\nimport { 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)\" }}>{c.linkLabel} →</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)\" }}>{c.linkLabel} →</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 schema: CardsBlockSchema,\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,2 +1,2 @@
1
1
  import type { z } from "zod";
2
- export declare const columnsBlock: import("..").BlockDefinition<z.ZodTypeAny>;
2
+ export declare const columnsBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import { jsx } from "react/jsx-runtime";
3
- import { ColumnsBlockSchema } from "../../schema/blocks";
4
- import { defineBlock } from "../registry";
5
- import { BlockRenderer } from "../BlockRenderer";
6
- import { useRegistry } from "../context";
3
+ import { ColumnsBlockSchema } from "../../schema/blocks.js";
4
+ import { defineBlock } from "../registry.js";
5
+ import { BlockRenderer } from "../BlockRenderer.js";
6
+ import { useRegistry } from "../context.js";
7
7
  function ColumnsRender({ block, siteId, mode }) {
8
8
  const registry = useRegistry();
9
9
  return /* @__PURE__ */ jsx("div", { className: "xicms-columns", "data-cols": block.columns.length, style: { gridTemplateColumns: `repeat(${block.columns.length}, 1fr)` }, children: block.columns.map((col, idx) => /* @__PURE__ */ jsx("div", { className: "xicms-column", children: /* @__PURE__ */ jsx(BlockRenderer, { blocks: col.blocks, registry, siteId, mode }) }, idx)) });
@@ -1,7 +1,7 @@
1
1
  import type { z } from "zod";
2
- import { ContactBlockSchema } from "../../schema/blocks";
2
+ import { ContactBlockSchema } from "../../schema/blocks.js";
3
3
  type Contact = z.infer<typeof ContactBlockSchema>;
4
4
  export declare function contactJsonLd(b: Contact): Record<string, unknown>;
5
- export declare const contactBlock: import("..").BlockDefinition<z.ZodTypeAny>;
6
- export declare const socialBlock: import("..").BlockDefinition<z.ZodTypeAny>;
5
+ export declare const contactBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
6
+ export declare const socialBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
7
7
  export {};
@@ -1,8 +1,8 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import { jsonLdHtml } from "./jsonld";
3
- import { ContactBlockSchema, SocialBlockSchema } from "../../schema/blocks";
4
- import { defineBlock } from "../registry";
5
- import { Heading } from "../ui";
2
+ import { jsonLdHtml } from "./jsonld.js";
3
+ import { ContactBlockSchema, SocialBlockSchema } from "../../schema/blocks.js";
4
+ import { defineBlock } from "../registry.js";
5
+ import { Heading } from "../ui/index.js";
6
6
  function contactJsonLd(b) {
7
7
  return {
8
8
  "@context": "https://schema.org",
@@ -15,4 +15,4 @@ export declare function CountdownDigits({ r, showLabels }: {
15
15
  r: Remaining;
16
16
  showLabels?: boolean;
17
17
  }): import("react").JSX.Element;
18
- export declare const countdownBlock: import("..").BlockDefinition<z.ZodTypeAny>;
18
+ export declare const countdownBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useEffect, useState } from "react";
4
- import { CountdownBlockSchema } from "../../schema/blocks";
5
- import { defineBlock } from "../registry";
6
- import { Heading } from "../ui";
4
+ import { CountdownBlockSchema } from "../../schema/blocks.js";
5
+ import { defineBlock } from "../registry.js";
6
+ import { Heading } from "../ui/index.js";
7
7
  function compute(target) {
8
8
  const t = new Date(target).getTime();
9
9
  if (Number.isNaN(t)) return null;
@@ -46,7 +46,7 @@ function CountdownRender({ block, mode }) {
46
46
  if (r?.done && block.onExpire === "hide" && mode !== "preview") return null;
47
47
  return /* @__PURE__ */ jsxs("section", { className: "xicms-countdown", children: [
48
48
  block.heading && /* @__PURE__ */ jsx(Heading, { level: 2, className: "xicms-countdown__heading", "data-xicms-edit": "heading", children: block.heading }),
49
- r === null ? /* @__PURE__ */ jsx("p", { className: "xicms-countdown__loading", "aria-hidden": "true", children: "\u2026" }) : r.done ? /* @__PURE__ */ jsx("p", { className: "xicms-countdown__expired", children: block.expiredText }) : /* @__PURE__ */ jsx(CountdownDigits, { r, showLabels: block.showLabels })
49
+ 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 })
50
50
  ] });
51
51
  }
52
52
  const countdownBlock = defineBlock({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/blocks/builtins/Countdown.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport type { z } from \"zod\";\nimport { CountdownBlockSchema } from \"../../schema/blocks\";\nimport { defineBlock, 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\nfunction 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\">{block.expiredText}</p>\n ) : (\n <CountdownDigits r={r} showLabels={block.showLabels} />\n )}\n </section>\n );\n}\n\nexport const countdownBlock = defineBlock({\n type: \"countdown\",\n schema: CountdownBlockSchema,\n Render: CountdownRender,\n label: \"Aftelteller\",\n icon: \"⏳\",\n defaults: () => ({ heading: \"Nog even tot de start\", target: \"\", expiredText: \"Het is zover!\", showLabels: true }),\n});\n"],"mappings":";AAyDQ,SACE,KADF;AAvDR,SAAS,WAAW,gBAAgB;AAEpC,SAAS,4BAA4B;AACrC,SAAS,mBAA0C;AACnD,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;AAIA,SAAS,gBAAgB,EAAE,OAAO,KAAK,GAAgC;AACrE,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,4BAA4B,gBAAM,aAAY,IAE3D,oBAAC,mBAAgB,GAAM,YAAY,MAAM,YAAY;AAAA,KAEzD;AAEJ;AAEO,MAAM,iBAAiB,YAAY;AAAA,EACxC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,SAAS,yBAAyB,QAAQ,IAAI,aAAa,iBAAiB,YAAY,KAAK;AAClH,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../../src/blocks/builtins/Countdown.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport type { z } from \"zod\";\nimport { CountdownBlockSchema } from \"../../schema/blocks\";\nimport { defineBlock, 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\nfunction 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\nexport const countdownBlock = defineBlock({\n type: \"countdown\",\n schema: CountdownBlockSchema,\n Render: CountdownRender,\n label: \"Aftelteller\",\n icon: \"⏳\",\n defaults: () => ({ heading: \"Nog even tot de start\", target: \"\", expiredText: \"Het is zover!\", showLabels: true }),\n});\n"],"mappings":";AAyDQ,SACE,KADF;AAvDR,SAAS,WAAW,gBAAgB;AAEpC,SAAS,4BAA4B;AACrC,SAAS,mBAA0C;AACnD,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;AAIA,SAAS,gBAAgB,EAAE,OAAO,KAAK,GAAgC;AACrE,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;AAEO,MAAM,iBAAiB,YAAY;AAAA,EACxC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,SAAS,yBAAyB,QAAQ,IAAI,aAAa,iBAAiB,YAAY,KAAK;AAClH,CAAC;","names":[]}
@@ -1,2 +1,2 @@
1
1
  import type { z } from "zod";
2
- export declare const ctaBlock: import("..").BlockDefinition<z.ZodTypeAny>;
2
+ export declare const ctaBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { CtaBlockSchema } from "../../schema/blocks";
4
- import { defineBlock } from "../registry";
5
- import { VStack, HStack, Card, Heading, Text, Btn } from "../ui";
3
+ import { CtaBlockSchema } from "../../schema/blocks.js";
4
+ import { defineBlock } from "../registry.js";
5
+ import { VStack, HStack, Card, Heading, Text, Btn } from "../ui/index.js";
6
6
  function CtaRender({ block }) {
7
7
  if (block.sticky) {
8
8
  return /* @__PURE__ */ jsxs(
@@ -1,2 +1,2 @@
1
1
  import type { z } from "zod";
2
- export declare const downloadsBlock: import("..").BlockDefinition<z.ZodTypeAny>;
2
+ export declare const downloadsBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
@@ -1,8 +1,8 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import { DownloadsBlockSchema } from "../../schema/blocks";
3
- import { defineBlock } from "../registry";
4
- import { Heading } from "../ui";
5
- import { fileIcon } from "./lib/fileIcon";
2
+ import { DownloadsBlockSchema } from "../../schema/blocks.js";
3
+ import { defineBlock } from "../registry.js";
4
+ import { Heading } from "../ui/index.js";
5
+ import { fileIcon } from "./lib/fileIcon.js";
6
6
  function DownloadsRender({ block }) {
7
7
  const items = (block.items ?? []).filter((d) => d.label && d.href);
8
8
  if (items.length === 0) return null;
@@ -1,4 +1,4 @@
1
1
  import type { z } from "zod";
2
- export declare const buttonsBlock: import("..").BlockDefinition<z.ZodTypeAny>;
3
- export declare const quoteBlock: import("..").BlockDefinition<z.ZodTypeAny>;
4
- export declare const dividerBlock: import("..").BlockDefinition<z.ZodTypeAny>;
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,8 +1,8 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { ButtonsBlockSchema, QuoteBlockSchema, DividerBlockSchema } from "../../schema/blocks";
4
- import { defineBlock } from "../registry";
5
- import { HStack, VStack, Card, Text, Btn, Divider } from "../ui";
3
+ import { ButtonsBlockSchema, QuoteBlockSchema, DividerBlockSchema } from "../../schema/blocks.js";
4
+ import { defineBlock } from "../registry.js";
5
+ import { HStack, VStack, Card, Text, Btn, Divider } from "../ui/index.js";
6
6
  function ButtonsRender({ block }) {
7
7
  const items = (block.items ?? []).filter((b) => b.label);
8
8
  if (items.length === 0) return null;
@@ -1,2 +1,2 @@
1
1
  import type { z } from "zod";
2
- export declare const embedBlock: import("..").BlockDefinition<z.ZodTypeAny>;
2
+ export declare const embedBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { jsx } from "react/jsx-runtime";
3
- import { EmbedBlockSchema } from "../../schema/blocks";
4
- import { defineBlock } from "../registry";
5
- import { ConsentEmbed } from "./consentEmbed";
3
+ import { EmbedBlockSchema } from "../../schema/blocks.js";
4
+ import { defineBlock } from "../registry.js";
5
+ import { ConsentEmbed } from "./consentEmbed.js";
6
6
  function EmbedRender({ block, mode }) {
7
7
  if (!block.url) return null;
8
8
  const sizing = block.aspectRatio && block.aspectRatio !== "fixed" ? { aspectRatio: block.aspectRatio.replace("/", " / ") } : { height: `${block.height}px` };
@@ -3,4 +3,4 @@ import type { z } from "zod";
3
3
  export declare function questionSlug(q: string): string;
4
4
  /** Unieke anker-ids voor een vragenlijst: identieke vragen krijgen -2, -3, … (ids moeten uniek zijn). */
5
5
  export declare function questionSlugs(questions: string[]): string[];
6
- export declare const faqBlock: import("..").BlockDefinition<z.ZodTypeAny>;
6
+ export declare const faqBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useEffect, useMemo, useState } from "react";
4
- import { FaqBlockSchema } from "../../schema/blocks";
5
- import { defineBlock } from "../registry";
4
+ import { FaqBlockSchema } from "../../schema/blocks.js";
5
+ import { defineBlock } from "../registry.js";
6
6
  import { Collapsible } from "@astryxdesign/core/Collapsible";
7
7
  import { TextInput } from "@astryxdesign/core/TextInput";
8
- import { VStack, Heading, Text } from "../ui";
9
- import { jsonLdHtml } from "./jsonld";
8
+ import { VStack, Heading, Text } from "../ui/index.js";
9
+ import { jsonLdHtml } from "./jsonld.js";
10
10
  function questionSlug(q) {
11
11
  return q.toLowerCase().normalize("NFD").replace(/[̀-ͯ]/g, "").replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 60);
12
12
  }
@@ -72,9 +72,17 @@ function FaqRender({ block }) {
72
72
  defaultIsOpen: block.defaultOpen || slug !== "" && slug === openSlug,
73
73
  children: it.aHtml ? (
74
74
  // Server-side gesanitized bij publiceren (velden op *Html) — zie functions/lib/sanitize.
75
- // Rich-text-antwoord: bewerk je via het zijpaneel (de platte-tekst-haak dekt geen html-veld).
75
+ // Inline bewerkbaar MET opmaak: `data-xicms-edit` wijst naar het eigen veld, zodat
76
+ // de editor hier niet naar een niet-bestaand "html" schrijft.
76
77
  // eslint-disable-next-line react/no-danger
77
- /* @__PURE__ */ jsx("div", { className: "xicms-richtext xicms-faq__answer", dangerouslySetInnerHTML: { __html: it.aHtml } })
78
+ /* @__PURE__ */ jsx(
79
+ "div",
80
+ {
81
+ className: "xicms-richtext xicms-faq__answer",
82
+ "data-xicms-edit": `items.${idx}.aHtml`,
83
+ dangerouslySetInnerHTML: { __html: it.aHtml }
84
+ }
85
+ )
78
86
  ) : /* @__PURE__ */ jsx(Text, { color: "secondary", className: "xicms-faq__answer", "data-xicms-edit": `items.${idx}.a`, children: it.a })
79
87
  },
80
88
  `${i}-${slug === openSlug ? "open" : "dicht"}`
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/blocks/builtins/Faq.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport type { z } from \"zod\";\nimport { FaqBlockSchema } from \"../../schema/blocks\";\nimport { defineBlock, type BlockRenderProps } from \"../registry\";\nimport { Collapsible } from \"@astryxdesign/core/Collapsible\";\nimport { TextInput } from \"@astryxdesign/core/TextInput\";\nimport { VStack, Heading, Text } from \"../ui\";\nimport { jsonLdHtml } from \"./jsonld\";\n\ntype Faq = z.infer<typeof FaqBlockSchema>;\n\n/** Anker-id voor een vraag (deep-link: /faq#hoe-werkt-het). */\nexport function questionSlug(q: string): string {\n return q\n .toLowerCase()\n .normalize(\"NFD\")\n .replace(/[̀-ͯ]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 60);\n}\n\n/** Unieke anker-ids voor een vragenlijst: identieke vragen krijgen -2, -3, … (ids moeten uniek zijn). */\nexport function questionSlugs(questions: string[]): string[] {\n const seen = new Map<string, number>();\n return questions.map((q) => {\n const base = questionSlug(q);\n if (!base) return \"\";\n const n = (seen.get(base) ?? 0) + 1;\n seen.set(base, n);\n return n === 1 ? base : `${base}-${n}`;\n });\n}\n\nfunction faqJsonLd(items: { q: string; a: string; aHtml?: string }[]): Record<string, unknown> {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"FAQPage\",\n mainEntity: items\n .filter((it) => it.q && (it.a || it.aHtml))\n .map((it) => ({\n \"@type\": \"Question\",\n name: it.q,\n acceptedAnswer: { \"@type\": \"Answer\", text: it.aHtml ? it.aHtml.replace(/<[^>]*>/g, \" \").trim() : it.a },\n })),\n };\n}\n\nfunction FaqRender({ block }: BlockRenderProps<Faq>) {\n const items = block.items ?? [];\n const [q, setQ] = useState(\"\");\n // Slug per item vooraf berekenen (met dedupe), zodat dubbele vragen geen dubbele ids opleveren\n // en de hash-match precies één vraag opent.\n const withSlugs = useMemo(() => {\n const slugs = questionSlugs(items.map((it) => it.q));\n // idx = originele index in block.items — nodig voor de inline-edit-paden, want `filtered`\n // kan bij een actieve zoekterm een deelverzameling met verschoven indexen zijn.\n return items.map((it, i) => ({ it, slug: slugs[i], idx: i }));\n }, [items]);\n // Deep-link: bij laden met #<vraag-slug> die vraag openen (en ernaartoe scrollen).\n const [openSlug, setOpenSlug] = useState<string | null>(null);\n useEffect(() => {\n const hash = window.location.hash.slice(1);\n if (hash && withSlugs.some(({ slug }) => slug === hash)) {\n setOpenSlug(hash);\n document.getElementById(hash)?.scrollIntoView({ block: \"start\" });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n const filtered = useMemo(() => {\n if (!block.searchable || !q.trim()) return withSlugs;\n const needle = q.toLowerCase();\n return withSlugs.filter(({ it }) => (it.q + \" \" + it.a + \" \" + (it.aHtml ?? \"\")).toLowerCase().includes(needle));\n }, [withSlugs, q, block.searchable]);\n\n return (\n <VStack gap={3} as=\"section\" className=\"xicms-faq\">\n {block.heading && <Heading level={2} data-xicms-edit=\"heading\">{block.heading}</Heading>}\n {block.searchable && (\n <div style={{ maxWidth: 360 }}>\n <TextInput\n label=\"Zoek in veelgestelde vragen\"\n isLabelHidden\n placeholder=\"Zoek in vragen…\"\n value={q}\n onChange={setQ}\n />\n </div>\n )}\n <VStack gap={1.5}>\n {filtered.map(({ it, slug, idx }, i) => {\n return (\n <div key={i} id={slug || undefined}>\n <Collapsible\n // key wisselt zodra de hash-match binnenkomt (effect ná mount) → remount met open staat.\n key={`${i}-${slug === openSlug ? \"open\" : \"dicht\"}`}\n trigger={<Text weight=\"bold\" className=\"xicms-faq__question\" data-xicms-edit={`items.${idx}.q`}>{it.q}</Text>}\n defaultIsOpen={block.defaultOpen || (slug !== \"\" && slug === openSlug)}\n >\n {it.aHtml ? (\n // Server-side gesanitized bij publiceren (velden op *Html) — zie functions/lib/sanitize.\n // Rich-text-antwoord: bewerk je via het zijpaneel (de platte-tekst-haak dekt geen html-veld).\n // eslint-disable-next-line react/no-danger\n <div className=\"xicms-richtext xicms-faq__answer\" dangerouslySetInnerHTML={{ __html: it.aHtml }} />\n ) : (\n <Text color=\"secondary\" className=\"xicms-faq__answer\" data-xicms-edit={`items.${idx}.a`}>{it.a}</Text>\n )}\n </Collapsible>\n </div>\n );\n })}\n {filtered.length === 0 && <Text color=\"secondary\">Geen vragen gevonden.</Text>}\n </VStack>\n {block.jsonLd && (\n <script\n type=\"application/ld+json\"\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{ __html: jsonLdHtml(faqJsonLd(items)) }}\n />\n )}\n </VStack>\n );\n}\n\nexport const faqBlock = defineBlock({\n type: \"faq\",\n schema: FaqBlockSchema,\n Render: FaqRender,\n label: \"Veelgestelde vragen\",\n icon: \"❓\",\n defaults: () => ({\n heading: \"Veelgestelde vragen\",\n items: [{ q: \"Een vraag?\", a: \"Het antwoord.\" }],\n searchable: false,\n jsonLd: true,\n }),\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/blocks/builtins/Faq.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport type { z } from \"zod\";\nimport { FaqBlockSchema } from \"../../schema/blocks\";\nimport { defineBlock, type BlockRenderProps } from \"../registry\";\nimport { Collapsible } from \"@astryxdesign/core/Collapsible\";\nimport { TextInput } from \"@astryxdesign/core/TextInput\";\nimport { VStack, Heading, Text } from \"../ui\";\nimport { jsonLdHtml } from \"./jsonld\";\n\ntype Faq = z.infer<typeof FaqBlockSchema>;\n\n/** Anker-id voor een vraag (deep-link: /faq#hoe-werkt-het). */\nexport function questionSlug(q: string): string {\n return q\n .toLowerCase()\n .normalize(\"NFD\")\n .replace(/[̀-ͯ]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 60);\n}\n\n/** Unieke anker-ids voor een vragenlijst: identieke vragen krijgen -2, -3, … (ids moeten uniek zijn). */\nexport function questionSlugs(questions: string[]): string[] {\n const seen = new Map<string, number>();\n return questions.map((q) => {\n const base = questionSlug(q);\n if (!base) return \"\";\n const n = (seen.get(base) ?? 0) + 1;\n seen.set(base, n);\n return n === 1 ? base : `${base}-${n}`;\n });\n}\n\nfunction faqJsonLd(items: { q: string; a: string; aHtml?: string }[]): Record<string, unknown> {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"FAQPage\",\n mainEntity: items\n .filter((it) => it.q && (it.a || it.aHtml))\n .map((it) => ({\n \"@type\": \"Question\",\n name: it.q,\n acceptedAnswer: { \"@type\": \"Answer\", text: it.aHtml ? it.aHtml.replace(/<[^>]*>/g, \" \").trim() : it.a },\n })),\n };\n}\n\nfunction FaqRender({ block }: BlockRenderProps<Faq>) {\n const items = block.items ?? [];\n const [q, setQ] = useState(\"\");\n // Slug per item vooraf berekenen (met dedupe), zodat dubbele vragen geen dubbele ids opleveren\n // en de hash-match precies één vraag opent.\n const withSlugs = useMemo(() => {\n const slugs = questionSlugs(items.map((it) => it.q));\n // idx = originele index in block.items — nodig voor de inline-edit-paden, want `filtered`\n // kan bij een actieve zoekterm een deelverzameling met verschoven indexen zijn.\n return items.map((it, i) => ({ it, slug: slugs[i], idx: i }));\n }, [items]);\n // Deep-link: bij laden met #<vraag-slug> die vraag openen (en ernaartoe scrollen).\n const [openSlug, setOpenSlug] = useState<string | null>(null);\n useEffect(() => {\n const hash = window.location.hash.slice(1);\n if (hash && withSlugs.some(({ slug }) => slug === hash)) {\n setOpenSlug(hash);\n document.getElementById(hash)?.scrollIntoView({ block: \"start\" });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n const filtered = useMemo(() => {\n if (!block.searchable || !q.trim()) return withSlugs;\n const needle = q.toLowerCase();\n return withSlugs.filter(({ it }) => (it.q + \" \" + it.a + \" \" + (it.aHtml ?? \"\")).toLowerCase().includes(needle));\n }, [withSlugs, q, block.searchable]);\n\n return (\n <VStack gap={3} as=\"section\" className=\"xicms-faq\">\n {block.heading && <Heading level={2} data-xicms-edit=\"heading\">{block.heading}</Heading>}\n {block.searchable && (\n <div style={{ maxWidth: 360 }}>\n <TextInput\n label=\"Zoek in veelgestelde vragen\"\n isLabelHidden\n placeholder=\"Zoek in vragen…\"\n value={q}\n onChange={setQ}\n />\n </div>\n )}\n <VStack gap={1.5}>\n {filtered.map(({ it, slug, idx }, i) => {\n return (\n <div key={i} id={slug || undefined}>\n <Collapsible\n // key wisselt zodra de hash-match binnenkomt (effect ná mount) → remount met open staat.\n key={`${i}-${slug === openSlug ? \"open\" : \"dicht\"}`}\n trigger={<Text weight=\"bold\" className=\"xicms-faq__question\" data-xicms-edit={`items.${idx}.q`}>{it.q}</Text>}\n defaultIsOpen={block.defaultOpen || (slug !== \"\" && slug === openSlug)}\n >\n {it.aHtml ? (\n // Server-side gesanitized bij publiceren (velden op *Html) — zie functions/lib/sanitize.\n // Inline bewerkbaar MET opmaak: `data-xicms-edit` wijst naar het eigen veld, zodat\n // de editor hier niet naar een niet-bestaand \"html\" schrijft.\n // eslint-disable-next-line react/no-danger\n <div\n className=\"xicms-richtext xicms-faq__answer\"\n data-xicms-edit={`items.${idx}.aHtml`}\n dangerouslySetInnerHTML={{ __html: it.aHtml }}\n />\n ) : (\n <Text color=\"secondary\" className=\"xicms-faq__answer\" data-xicms-edit={`items.${idx}.a`}>{it.a}</Text>\n )}\n </Collapsible>\n </div>\n );\n })}\n {filtered.length === 0 && <Text color=\"secondary\">Geen vragen gevonden.</Text>}\n </VStack>\n {block.jsonLd && (\n <script\n type=\"application/ld+json\"\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{ __html: jsonLdHtml(faqJsonLd(items)) }}\n />\n )}\n </VStack>\n );\n}\n\nexport const faqBlock = defineBlock({\n type: \"faq\",\n schema: FaqBlockSchema,\n Render: FaqRender,\n label: \"Veelgestelde vragen\",\n icon: \"❓\",\n defaults: () => ({\n heading: \"Veelgestelde vragen\",\n items: [{ q: \"Een vraag?\", a: \"Het antwoord.\" }],\n searchable: false,\n jsonLd: true,\n }),\n});\n"],"mappings":"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","names":[]}
@@ -1,2 +1,2 @@
1
1
  import type { z } from "zod";
2
- export declare const formBlock: import("..").BlockDefinition<z.ZodTypeAny>;
2
+ export declare const formBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
@@ -1,20 +1,18 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useEffect, useState } from "react";
4
- import { doc, getDoc } from "firebase/firestore";
5
- import { FormBlockSchema } from "../../schema/blocks";
6
- import { defineBlock } from "../registry";
7
- import { getDb } from "../../firebase/client";
8
- import { submitFormValues } from "./lib/submitForm";
9
- import { isDemoActive, getDemoForm } from "../../demo/demoStore";
10
- import { useSiteConfig } from "../../config";
4
+ import { FormBlockSchema } from "../../schema/blocks.js";
5
+ import { defineBlock } from "../registry.js";
6
+ import { submitFormValues } from "./lib/submitForm.js";
7
+ import { isDemoActive, getDemoForm } from "../../demo/demoStore.js";
8
+ import { useSiteConfig } from "../../config.js";
11
9
  import { TextInput } from "@astryxdesign/core/TextInput";
12
10
  import { TextArea } from "@astryxdesign/core/TextArea";
13
11
  import { Selector } from "@astryxdesign/core/Selector";
14
12
  import { CheckboxInput } from "@astryxdesign/core/CheckboxInput";
15
13
  import { Spinner } from "@astryxdesign/core/Spinner";
16
14
  import { Button } from "@astryxdesign/core/Button";
17
- import { VStack, Card, Heading, Text } from "../ui";
15
+ import { VStack, Card, Heading, Text } from "../ui/index.js";
18
16
  const DEMO_FALLBACK_FORM = {
19
17
  name: "Contact",
20
18
  submitLabel: "Versturen",
@@ -41,18 +39,30 @@ function FormRender({ block, siteId, mode }) {
41
39
  setLocalOnly(true);
42
40
  return;
43
41
  }
44
- const db = getDb();
45
- if (!db) {
46
- const reg = getDemoForm(siteId, block.formId) ?? (siteMode === "demo" ? DEMO_FALLBACK_FORM : null);
47
- if (reg) {
48
- setDef(reg);
49
- setLocalOnly(true);
50
- } else {
42
+ void (async () => {
43
+ const [{ getDb }, { doc, getDoc }] = await Promise.all([
44
+ import("../../firebase/client.js"),
45
+ import("firebase/firestore")
46
+ ]);
47
+ const db = getDb();
48
+ if (!db) {
49
+ const reg = getDemoForm(siteId, block.formId) ?? (siteMode === "demo" ? DEMO_FALLBACK_FORM : null);
50
+ if (reg) {
51
+ setDef(reg);
52
+ setLocalOnly(true);
53
+ } else {
54
+ setUnavailable(true);
55
+ }
56
+ return;
57
+ }
58
+ try {
59
+ const snap = await getDoc(doc(db, "sites", siteId, "forms", block.formId));
60
+ if (snap.exists()) setDef(snap.data());
61
+ else setUnavailable(true);
62
+ } catch {
51
63
  setUnavailable(true);
52
64
  }
53
- return;
54
- }
55
- void getDoc(doc(db, "sites", siteId, "forms", block.formId)).then((s) => s.exists() ? setDef(s.data()) : setUnavailable(true)).catch(() => setUnavailable(true));
65
+ })();
56
66
  }, [demo, siteId, block.formId, siteMode]);
57
67
  if (unavailable) {
58
68
  return /* @__PURE__ */ jsx(Card, { padding: 4, variant: "muted", children: /* @__PURE__ */ jsxs(Text, { children: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/blocks/builtins/FormBlock.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState, type FormEvent } from \"react\";\nimport type { z } from \"zod\";\nimport { doc, getDoc } from \"firebase/firestore\";\nimport { FormBlockSchema } from \"../../schema/blocks\";\nimport type { FormDefinition } from \"../../schema/forms\";\nimport { defineBlock, type BlockRenderProps } from \"../registry\";\nimport { getDb } from \"../../firebase/client\";\nimport { submitFormValues } from \"./lib/submitForm\";\nimport { isDemoActive, getDemoForm } from \"../../demo/demoStore\";\nimport { useSiteConfig } from \"../../config\";\nimport { TextInput } from \"@astryxdesign/core/TextInput\";\nimport { TextArea } from \"@astryxdesign/core/TextArea\";\nimport { Selector } from \"@astryxdesign/core/Selector\";\nimport { CheckboxInput } from \"@astryxdesign/core/CheckboxInput\";\nimport { Spinner } from \"@astryxdesign/core/Spinner\";\nimport { Button } from \"@astryxdesign/core/Button\";\nimport { VStack, Card, Heading, Text } from \"../ui\";\n\ntype FormBlk = z.infer<typeof FormBlockSchema>;\n\n/** Voorbeeldformulier voor de demo wanneer er geen specifieke definitie is geregistreerd. */\nconst DEMO_FALLBACK_FORM: FormDefinition = {\n name: \"Contact\",\n submitLabel: \"Versturen\",\n successMessage: \"Bedankt! Dit is een demo — je bericht is niet echt verstuurd.\",\n fields: [\n { name: \"naam\", label: \"Naam\", type: \"text\", required: true },\n { name: \"email\", label: \"E-mail\", type: \"email\", required: true },\n { name: \"bericht\", label: \"Bericht\", type: \"textarea\", required: false, placeholder: \"Waarmee kunnen we je helpen?\" },\n ],\n};\n\nfunction FormRender({ block, siteId, mode }: BlockRenderProps<FormBlk>) {\n const siteMode = useSiteConfig().mode;\n const [def, setDef] = useState<FormDefinition | null>(null);\n const [unavailable, setUnavailable] = useState(false);\n const [values, setValues] = useState<Record<string, string | boolean>>({});\n const [hp, setHp] = useState(\"\");\n const [status, setStatus] = useState<\"idle\" | \"busy\" | \"ok\" | \"error\">(\"idle\");\n const [error, setError] = useState<string | null>(null);\n\n const demo = isDemoActive();\n // \"Lokaal\" inzenden (geen Firebase-call) bij demo OF wanneer er geen Firebase is maar wél een\n // geregistreerd voorbeeldformulier — zo werkt een statische referentiesite z'n formulier ook.\n const [localOnly, setLocalOnly] = useState(demo);\n\n useEffect(() => {\n if (demo) {\n setDef(getDemoForm(siteId, block.formId) ?? DEMO_FALLBACK_FORM);\n setLocalOnly(true);\n return;\n }\n const db = getDb();\n if (!db) {\n // Geen Firebase: val terug op een geregistreerd formulier, of (op een mode:\"demo\"-site) op het\n // ingebouwde voorbeeldformulier; beide zenden lokaal in. Anders een nette \"niet beschikbaar\".\n const reg = getDemoForm(siteId, block.formId) ?? (siteMode === \"demo\" ? DEMO_FALLBACK_FORM : null);\n if (reg) { setDef(reg); setLocalOnly(true); } else { setUnavailable(true); }\n return;\n }\n void getDoc(doc(db, \"sites\", siteId, \"forms\", block.formId))\n .then((s) => (s.exists() ? setDef(s.data() as FormDefinition) : setUnavailable(true)))\n .catch(() => setUnavailable(true));\n }, [demo, siteId, block.formId, siteMode]);\n\n if (unavailable) {\n return (\n <Card padding={4} variant=\"muted\">\n <Text>{block.heading ? `${block.heading}: ` : \"\"}neem contact met ons op — we reageren snel.</Text>\n </Card>\n );\n }\n if (!def) {\n return (\n <div style={{ display: \"grid\", placeItems: \"center\", minHeight: 120 }}>\n <Spinner label=\"Formulier laden…\" />\n </div>\n );\n }\n\n async function submit(e: FormEvent) {\n e.preventDefault();\n if (mode === \"preview\") return;\n if (localOnly) {\n // Lokaal (demo / geen backend): niets versturen, alleen de successtaat tonen.\n setStatus(\"ok\");\n setValues({});\n return;\n }\n setStatus(\"busy\");\n setError(null);\n try {\n await submitFormValues(siteId, block.formId, values, hp);\n // Optioneel doorsturen naar een bedankt-pagina (conversiemeting/advertenties).\n if (def?.successRedirect) {\n window.location.assign(def.successRedirect);\n return;\n }\n setStatus(\"ok\");\n setValues({});\n } catch {\n setStatus(\"error\");\n setError(\"Versturen mislukt. Probeer het later opnieuw.\");\n }\n }\n\n if (status === \"ok\") {\n return (\n // role=\"status\": screenreaders melden de succesboodschap wanneer het formulier verdwijnt.\n <Card padding={4} variant=\"muted\" role=\"status\">\n <Text>{def.successMessage}</Text>\n </Card>\n );\n }\n\n const setVal = (name: string, v: string | boolean) => setValues((prev) => ({ ...prev, [name]: v }));\n\n return (\n <form className=\"xicms-form\" onSubmit={submit}>\n <VStack gap={3}>\n {block.heading && <Heading level={2} data-xicms-edit=\"heading\">{block.heading}</Heading>}\n {def.fields.map((f) => {\n const sv = (values[f.name] as string) ?? \"\";\n if (f.type === \"textarea\") {\n return (\n <TextArea key={f.name} label={f.label} isRequired={f.required} placeholder={f.placeholder} rows={4}\n value={sv} onChange={(v) => setVal(f.name, v)} />\n );\n }\n if (f.type === \"select\") {\n return (\n <Selector key={f.name} label={f.label} isRequired={f.required} placeholder=\"Kies…\"\n options={f.options ?? []} value={sv} onChange={(v) => setVal(f.name, (v as string) ?? \"\")} />\n );\n }\n if (f.type === \"checkbox\") {\n return (\n <CheckboxInput key={f.name} label={f.label} isRequired={f.required}\n value={Boolean(values[f.name])} onChange={(checked) => setVal(f.name, checked)} />\n );\n }\n if (f.type === \"radio\") {\n return (\n <fieldset key={f.name} className=\"xicms-form__radios\">\n <legend>{f.label}{f.required && \" *\"}</legend>\n {(f.options ?? []).map((opt) => (\n <label key={opt} className=\"xicms-form__radio\">\n <input\n type=\"radio\"\n name={f.name}\n value={opt}\n required={f.required}\n checked={sv === opt}\n onChange={() => setVal(f.name, opt)}\n />\n {opt}\n </label>\n ))}\n </fieldset>\n );\n }\n if (f.type === \"date\" || f.type === \"number\") {\n // Astryx TextInput kent geen date/number → native input in dezelfde stijl.\n return (\n <label key={f.name} className=\"xicms-form__native\">\n <span className=\"xicms-form__native-label\">{f.label}{f.required && \" *\"}</span>\n <input\n className=\"xicms-input\"\n type={f.type}\n required={f.required}\n placeholder={f.placeholder}\n value={sv}\n onChange={(e) => setVal(f.name, e.target.value)}\n />\n </label>\n );\n }\n return (\n <TextInput key={f.name} label={f.label} type={f.type === \"email\" ? \"email\" : \"text\"}\n isRequired={f.required} placeholder={f.placeholder}\n value={sv} onChange={(v) => setVal(f.name, v)} />\n );\n })}\n {/* Honeypot — verborgen voor mensen, bots vullen 'm vaak wel in. */}\n <input\n type=\"text\"\n tabIndex={-1}\n autoComplete=\"off\"\n value={hp}\n onChange={(e) => setHp(e.target.value)}\n style={{ position: \"absolute\", left: \"-9999px\", width: 1, height: 1 }}\n aria-hidden\n />\n {error && <Text role=\"alert\" style={{ color: \"var(--color-error, #c0392b)\" }}>{error}</Text>}\n <div>\n <Button label={status === \"busy\" ? \"Versturen…\" : def.submitLabel} variant=\"primary\" size=\"lg\" type=\"submit\" isLoading={status === \"busy\"} />\n </div>\n </VStack>\n </form>\n );\n}\n\nexport const formBlock = defineBlock({\n type: \"form\",\n schema: FormBlockSchema,\n Render: FormRender,\n label: \"Formulier\",\n icon: \"✉️\",\n defaults: () => ({ formId: \"\" }),\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/blocks/builtins/FormBlock.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState, type FormEvent } from \"react\";\nimport type { z } from \"zod\";\nimport { FormBlockSchema } from \"../../schema/blocks\";\nimport type { FormDefinition } from \"../../schema/forms\";\nimport { defineBlock, type BlockRenderProps } from \"../registry\";\nimport { submitFormValues } from \"./lib/submitForm\";\nimport { isDemoActive, getDemoForm } from \"../../demo/demoStore\";\nimport { useSiteConfig } from \"../../config\";\nimport { TextInput } from \"@astryxdesign/core/TextInput\";\nimport { TextArea } from \"@astryxdesign/core/TextArea\";\nimport { Selector } from \"@astryxdesign/core/Selector\";\nimport { CheckboxInput } from \"@astryxdesign/core/CheckboxInput\";\nimport { Spinner } from \"@astryxdesign/core/Spinner\";\nimport { Button } from \"@astryxdesign/core/Button\";\nimport { VStack, Card, Heading, Text } from \"../ui\";\n\ntype FormBlk = z.infer<typeof FormBlockSchema>;\n\n/** Voorbeeldformulier voor de demo wanneer er geen specifieke definitie is geregistreerd. */\nconst DEMO_FALLBACK_FORM: FormDefinition = {\n name: \"Contact\",\n submitLabel: \"Versturen\",\n successMessage: \"Bedankt! Dit is een demo — je bericht is niet echt verstuurd.\",\n fields: [\n { name: \"naam\", label: \"Naam\", type: \"text\", required: true },\n { name: \"email\", label: \"E-mail\", type: \"email\", required: true },\n { name: \"bericht\", label: \"Bericht\", type: \"textarea\", required: false, placeholder: \"Waarmee kunnen we je helpen?\" },\n ],\n};\n\nfunction FormRender({ block, siteId, mode }: BlockRenderProps<FormBlk>) {\n const siteMode = useSiteConfig().mode;\n const [def, setDef] = useState<FormDefinition | null>(null);\n const [unavailable, setUnavailable] = useState(false);\n const [values, setValues] = useState<Record<string, string | boolean>>({});\n const [hp, setHp] = useState(\"\");\n const [status, setStatus] = useState<\"idle\" | \"busy\" | \"ok\" | \"error\">(\"idle\");\n const [error, setError] = useState<string | null>(null);\n\n const demo = isDemoActive();\n // \"Lokaal\" inzenden (geen Firebase-call) bij demo OF wanneer er geen Firebase is maar wél een\n // geregistreerd voorbeeldformulier — zo werkt een statische referentiesite z'n formulier ook.\n const [localOnly, setLocalOnly] = useState(demo);\n\n useEffect(() => {\n if (demo) {\n setDef(getDemoForm(siteId, block.formId) ?? DEMO_FALLBACK_FORM);\n setLocalOnly(true);\n return;\n }\n // Firestore dynamisch: alleen een pagina die écht een formulier toont haalt de SDK binnen.\n void (async () => {\n const [{ getDb }, { doc, getDoc }] = await Promise.all([\n import(\"../../firebase/client\"),\n import(\"firebase/firestore\"),\n ]);\n const db = getDb();\n if (!db) {\n // Geen Firebase: val terug op een geregistreerd formulier, of (op een mode:\"demo\"-site) op\n // het ingebouwde voorbeeld; beide zenden lokaal in. Anders een nette \"niet beschikbaar\".\n const reg = getDemoForm(siteId, block.formId) ?? (siteMode === \"demo\" ? DEMO_FALLBACK_FORM : null);\n if (reg) { setDef(reg); setLocalOnly(true); } else { setUnavailable(true); }\n return;\n }\n try {\n const snap = await getDoc(doc(db, \"sites\", siteId, \"forms\", block.formId));\n if (snap.exists()) setDef(snap.data() as FormDefinition);\n else setUnavailable(true);\n } catch {\n setUnavailable(true);\n }\n })();\n }, [demo, siteId, block.formId, siteMode]);\n\n if (unavailable) {\n return (\n <Card padding={4} variant=\"muted\">\n <Text>{block.heading ? `${block.heading}: ` : \"\"}neem contact met ons op — we reageren snel.</Text>\n </Card>\n );\n }\n if (!def) {\n return (\n <div style={{ display: \"grid\", placeItems: \"center\", minHeight: 120 }}>\n <Spinner label=\"Formulier laden…\" />\n </div>\n );\n }\n\n async function submit(e: FormEvent) {\n e.preventDefault();\n if (mode === \"preview\") return;\n if (localOnly) {\n // Lokaal (demo / geen backend): niets versturen, alleen de successtaat tonen.\n setStatus(\"ok\");\n setValues({});\n return;\n }\n setStatus(\"busy\");\n setError(null);\n try {\n await submitFormValues(siteId, block.formId, values, hp);\n // Optioneel doorsturen naar een bedankt-pagina (conversiemeting/advertenties).\n if (def?.successRedirect) {\n window.location.assign(def.successRedirect);\n return;\n }\n setStatus(\"ok\");\n setValues({});\n } catch {\n setStatus(\"error\");\n setError(\"Versturen mislukt. Probeer het later opnieuw.\");\n }\n }\n\n if (status === \"ok\") {\n return (\n // role=\"status\": screenreaders melden de succesboodschap wanneer het formulier verdwijnt.\n <Card padding={4} variant=\"muted\" role=\"status\">\n <Text>{def.successMessage}</Text>\n </Card>\n );\n }\n\n const setVal = (name: string, v: string | boolean) => setValues((prev) => ({ ...prev, [name]: v }));\n\n return (\n <form className=\"xicms-form\" onSubmit={submit}>\n <VStack gap={3}>\n {block.heading && <Heading level={2} data-xicms-edit=\"heading\">{block.heading}</Heading>}\n {def.fields.map((f) => {\n const sv = (values[f.name] as string) ?? \"\";\n if (f.type === \"textarea\") {\n return (\n <TextArea key={f.name} label={f.label} isRequired={f.required} placeholder={f.placeholder} rows={4}\n value={sv} onChange={(v) => setVal(f.name, v)} />\n );\n }\n if (f.type === \"select\") {\n return (\n <Selector key={f.name} label={f.label} isRequired={f.required} placeholder=\"Kies…\"\n options={f.options ?? []} value={sv} onChange={(v) => setVal(f.name, (v as string) ?? \"\")} />\n );\n }\n if (f.type === \"checkbox\") {\n return (\n <CheckboxInput key={f.name} label={f.label} isRequired={f.required}\n value={Boolean(values[f.name])} onChange={(checked) => setVal(f.name, checked)} />\n );\n }\n if (f.type === \"radio\") {\n return (\n <fieldset key={f.name} className=\"xicms-form__radios\">\n <legend>{f.label}{f.required && \" *\"}</legend>\n {(f.options ?? []).map((opt) => (\n <label key={opt} className=\"xicms-form__radio\">\n <input\n type=\"radio\"\n name={f.name}\n value={opt}\n required={f.required}\n checked={sv === opt}\n onChange={() => setVal(f.name, opt)}\n />\n {opt}\n </label>\n ))}\n </fieldset>\n );\n }\n if (f.type === \"date\" || f.type === \"number\") {\n // Astryx TextInput kent geen date/number → native input in dezelfde stijl.\n return (\n <label key={f.name} className=\"xicms-form__native\">\n <span className=\"xicms-form__native-label\">{f.label}{f.required && \" *\"}</span>\n <input\n className=\"xicms-input\"\n type={f.type}\n required={f.required}\n placeholder={f.placeholder}\n value={sv}\n onChange={(e) => setVal(f.name, e.target.value)}\n />\n </label>\n );\n }\n return (\n <TextInput key={f.name} label={f.label} type={f.type === \"email\" ? \"email\" : \"text\"}\n isRequired={f.required} placeholder={f.placeholder}\n value={sv} onChange={(v) => setVal(f.name, v)} />\n );\n })}\n {/* Honeypot — verborgen voor mensen, bots vullen 'm vaak wel in. */}\n <input\n type=\"text\"\n tabIndex={-1}\n autoComplete=\"off\"\n value={hp}\n onChange={(e) => setHp(e.target.value)}\n style={{ position: \"absolute\", left: \"-9999px\", width: 1, height: 1 }}\n aria-hidden\n />\n {error && <Text role=\"alert\" style={{ color: \"var(--color-error, #c0392b)\" }}>{error}</Text>}\n <div>\n <Button label={status === \"busy\" ? \"Versturen…\" : def.submitLabel} variant=\"primary\" size=\"lg\" type=\"submit\" isLoading={status === \"busy\"} />\n </div>\n </VStack>\n </form>\n );\n}\n\nexport const formBlock = defineBlock({\n type: \"form\",\n schema: FormBlockSchema,\n Render: FormRender,\n label: \"Formulier\",\n icon: \"✉️\",\n defaults: () => ({ formId: \"\" }),\n});\n"],"mappings":"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","names":[]}
@@ -1,5 +1,5 @@
1
1
  import type { z } from "zod";
2
- import { GalleryBlockSchema } from "../../schema/blocks";
2
+ import { GalleryBlockSchema } from "../../schema/blocks.js";
3
3
  type Gallery = z.infer<typeof GalleryBlockSchema>;
4
4
  type Item = Gallery["items"][number];
5
5
  /** Per-site instelbaar via `modules.gallery.config` (door de agent of in /beheer). */
@@ -19,5 +19,5 @@ export declare function LightboxOverlay({ items, index, onIndex, onClose, }: {
19
19
  onIndex: (i: number) => void;
20
20
  onClose: () => void;
21
21
  }): import("react").ReactPortal | null;
22
- export declare const galleryBlock: import("..").BlockDefinition<z.ZodTypeAny>;
22
+ export declare const galleryBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
23
23
  export {};
@@ -2,11 +2,11 @@
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useCallback, useEffect, useRef, useState } from "react";
4
4
  import { createPortal } from "react-dom";
5
- import { GalleryBlockSchema } from "../../schema/blocks";
6
- import { defineBlock } from "../registry";
7
- import { useModuleSettings } from "../../modules/context";
8
- import { Grid } from "../ui";
9
- import { Img } from "../../media/ImageContext";
5
+ import { GalleryBlockSchema } from "../../schema/blocks.js";
6
+ import { defineBlock } from "../registry.js";
7
+ import { useModuleSettings } from "../../modules/context.js";
8
+ import { Grid } from "../ui/index.js";
9
+ import { Img } from "../../media/ImageContext.js";
10
10
  function LightboxOverlay({
11
11
  items,
12
12
  index,
@@ -1,2 +1,2 @@
1
1
  import type { z } from "zod";
2
- export declare const heroBlock: import("..").BlockDefinition<z.ZodTypeAny>;
2
+ export declare const heroBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useEffect, useRef, useState } from "react";
4
- import { HeroBlockSchema } from "../../schema/blocks";
5
- import { defineBlock } from "../registry";
6
- import { Btn, Heading, Text } from "../ui";
7
- import { Img } from "../../media/ImageContext";
4
+ import { HeroBlockSchema } from "../../schema/blocks.js";
5
+ import { defineBlock } from "../registry.js";
6
+ import { Btn, Heading, Text } from "../ui/index.js";
7
+ import { Img } from "../../media/ImageContext.js";
8
8
  function HeroRender({ block }) {
9
9
  const videoRef = useRef(null);
10
10
  const [playing, setPlaying] = useState(false);
@@ -1,2 +1,2 @@
1
1
  import type { z } from "zod";
2
- export declare const imageBlock: import("..").BlockDefinition<z.ZodTypeAny>;
2
+ export declare const imageBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;