@xiwebdesign/xicms-core 7.31.0 → 8.16.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 (482) hide show
  1. package/dist/XiCMSProvider.js +23 -7
  2. package/dist/XiCMSProvider.js.map +1 -1
  3. package/dist/admin/AdminApp.js +175 -93
  4. package/dist/admin/AdminApp.js.map +1 -1
  5. package/dist/admin/AdminHelp.d.ts +1 -1
  6. package/dist/admin/AdminHelp.js +44 -36
  7. package/dist/admin/AdminHelp.js.map +1 -1
  8. package/dist/admin/CoreVersion.d.ts +6 -3
  9. package/dist/admin/CoreVersion.js +60 -24
  10. package/dist/admin/CoreVersion.js.map +1 -1
  11. package/dist/admin/NewsEditor.d.ts +7 -0
  12. package/dist/admin/NewsEditor.js +117 -75
  13. package/dist/admin/NewsEditor.js.map +1 -1
  14. package/dist/admin/SuperadminPanel.js +1 -1
  15. package/dist/admin/SuperadminPanel.js.map +1 -1
  16. package/dist/admin/ZoekPalet.d.ts +15 -0
  17. package/dist/admin/ZoekPalet.js +123 -0
  18. package/dist/admin/ZoekPalet.js.map +1 -0
  19. package/dist/admin/blockEditors/GenericEditor.js +36 -18
  20. package/dist/admin/blockEditors/GenericEditor.js.map +1 -1
  21. package/dist/admin/blockEditors/StyleEditor.js +37 -3
  22. package/dist/admin/blockEditors/StyleEditor.js.map +1 -1
  23. package/dist/admin/blockEditors/SymbolRefEditor.js +44 -2
  24. package/dist/admin/blockEditors/SymbolRefEditor.js.map +1 -1
  25. package/dist/admin/blockEditors/index.js +154 -73
  26. package/dist/admin/blockEditors/index.js.map +1 -1
  27. package/dist/admin/customBlocks/CustomBlocksPanel.js +18 -7
  28. package/dist/admin/customBlocks/CustomBlocksPanel.js.map +1 -1
  29. package/dist/admin/dashboard/DashboardPanel.js +26 -16
  30. package/dist/admin/dashboard/DashboardPanel.js.map +1 -1
  31. package/dist/admin/editors/RichTextEditor.d.ts +4 -3
  32. package/dist/admin/editors/RichTextEditor.js +19 -60
  33. package/dist/admin/editors/RichTextEditor.js.map +1 -1
  34. package/dist/admin/editors/fontSizeExtension.js +7 -1
  35. package/dist/admin/editors/fontSizeExtension.js.map +1 -1
  36. package/dist/admin/editors/slashMenu.d.ts +18 -0
  37. package/dist/admin/editors/slashMenu.js +34 -0
  38. package/dist/admin/editors/slashMenu.js.map +1 -0
  39. package/dist/admin/editors/useRijkeTekst.d.ts +48 -0
  40. package/dist/admin/editors/useRijkeTekst.js +310 -0
  41. package/dist/admin/editors/useRijkeTekst.js.map +1 -0
  42. package/dist/admin/forms/FormsPanel.d.ts +11 -2
  43. package/dist/admin/forms/FormsPanel.js +218 -65
  44. package/dist/admin/forms/FormsPanel.js.map +1 -1
  45. package/dist/admin/lib/blokInfo.d.ts +17 -0
  46. package/dist/admin/lib/blokInfo.js +80 -0
  47. package/dist/admin/lib/blokInfo.js.map +1 -0
  48. package/dist/admin/lib/foutNaarMens.d.ts +1 -0
  49. package/dist/admin/lib/foutNaarMens.js +22 -0
  50. package/dist/admin/lib/foutNaarMens.js.map +1 -0
  51. package/dist/admin/lib/gewisteVelden.d.ts +13 -0
  52. package/dist/admin/lib/gewisteVelden.js +31 -0
  53. package/dist/admin/lib/gewisteVelden.js.map +1 -0
  54. package/dist/admin/lib/heroHulp.d.ts +11 -0
  55. package/dist/admin/lib/heroHulp.js +18 -0
  56. package/dist/admin/lib/heroHulp.js.map +1 -0
  57. package/dist/admin/lib/kleur.js +2 -3
  58. package/dist/admin/lib/kleur.js.map +1 -1
  59. package/dist/admin/lib/leesbaarheid.d.ts +34 -0
  60. package/dist/admin/lib/leesbaarheid.js +82 -0
  61. package/dist/admin/lib/leesbaarheid.js.map +1 -0
  62. package/dist/admin/lib/lengteAdvies.d.ts +1 -0
  63. package/dist/admin/lib/lengteAdvies.js +16 -0
  64. package/dist/admin/lib/lengteAdvies.js.map +1 -0
  65. package/dist/admin/lib/mediaLijst.d.ts +26 -0
  66. package/dist/admin/lib/mediaLijst.js +42 -0
  67. package/dist/admin/lib/mediaLijst.js.map +1 -0
  68. package/dist/admin/lib/mediaUsage.d.ts +12 -1
  69. package/dist/admin/lib/mediaUsage.js +43 -33
  70. package/dist/admin/lib/mediaUsage.js.map +1 -1
  71. package/dist/admin/lib/menuHulp.d.ts +16 -0
  72. package/dist/admin/lib/menuHulp.js +41 -0
  73. package/dist/admin/lib/menuHulp.js.map +1 -0
  74. package/dist/admin/lib/onopgeslagen.d.ts +10 -0
  75. package/dist/admin/lib/onopgeslagen.js +35 -0
  76. package/dist/admin/lib/onopgeslagen.js.map +1 -0
  77. package/dist/admin/lib/pagesClient.d.ts +55 -2
  78. package/dist/admin/lib/pagesClient.js +126 -28
  79. package/dist/admin/lib/pagesClient.js.map +1 -1
  80. package/dist/admin/lib/paginaGebruik.d.ts +56 -0
  81. package/dist/admin/lib/paginaGebruik.js +109 -0
  82. package/dist/admin/lib/paginaGebruik.js.map +1 -0
  83. package/dist/admin/lib/publicatieCheck.d.ts +25 -0
  84. package/dist/admin/lib/publicatieCheck.js +114 -0
  85. package/dist/admin/lib/publicatieCheck.js.map +1 -0
  86. package/dist/admin/lib/scrollNaarDetail.d.ts +6 -0
  87. package/dist/admin/lib/scrollNaarDetail.js +20 -0
  88. package/dist/admin/lib/scrollNaarDetail.js.map +1 -0
  89. package/dist/admin/lib/symbolsClient.d.ts +10 -0
  90. package/dist/admin/lib/symbolsClient.js +14 -1
  91. package/dist/admin/lib/symbolsClient.js.map +1 -1
  92. package/dist/admin/lib/tekstVeld.d.ts +8 -0
  93. package/dist/admin/lib/tekstVeld.js +10 -0
  94. package/dist/admin/lib/tekstVeld.js.map +1 -0
  95. package/dist/admin/lib/useIsSuperadmin.d.ts +2 -0
  96. package/dist/admin/lib/useIsSuperadmin.js +13 -0
  97. package/dist/admin/lib/useIsSuperadmin.js.map +1 -0
  98. package/dist/admin/lib/veldTaal.d.ts +14 -0
  99. package/dist/admin/lib/veldTaal.js +248 -0
  100. package/dist/admin/lib/veldTaal.js.map +1 -0
  101. package/dist/admin/lib/versieVergelijk.d.ts +17 -0
  102. package/dist/admin/lib/versieVergelijk.js +24 -0
  103. package/dist/admin/lib/versieVergelijk.js.map +1 -0
  104. package/dist/admin/lib/zodFields.js +22 -4
  105. package/dist/admin/lib/zodFields.js.map +1 -1
  106. package/dist/admin/lib/zodFout.d.ts +9 -0
  107. package/dist/admin/lib/zodFout.js +63 -0
  108. package/dist/admin/lib/zodFout.js.map +1 -0
  109. package/dist/admin/media/MediaManager.js +162 -32
  110. package/dist/admin/media/MediaManager.js.map +1 -1
  111. package/dist/admin/media/MediaPicker.d.ts +3 -0
  112. package/dist/admin/media/MediaPicker.js +84 -31
  113. package/dist/admin/media/MediaPicker.js.map +1 -1
  114. package/dist/admin/menu/MenuPanel.js +144 -83
  115. package/dist/admin/menu/MenuPanel.js.map +1 -1
  116. package/dist/admin/navContext.d.ts +3 -0
  117. package/dist/admin/navContext.js +13 -1
  118. package/dist/admin/navContext.js.map +1 -1
  119. package/dist/admin/pages/PageEditor.js +146 -30
  120. package/dist/admin/pages/PageEditor.js.map +1 -1
  121. package/dist/admin/pages/PagesPanel.js +215 -61
  122. package/dist/admin/pages/PagesPanel.js.map +1 -1
  123. package/dist/admin/pages/StarterKiezer.d.ts +12 -0
  124. package/dist/admin/pages/StarterKiezer.js +113 -0
  125. package/dist/admin/pages/StarterKiezer.js.map +1 -0
  126. package/dist/admin/panelRegistry.d.ts +1 -1
  127. package/dist/admin/panelRegistry.js +2 -1
  128. package/dist/admin/panelRegistry.js.map +1 -1
  129. package/dist/admin/patterns/PatternInserter.js +1 -1
  130. package/dist/admin/patterns/PatternInserter.js.map +1 -1
  131. package/dist/admin/settings/BedrijfInstellingen.d.ts +20 -0
  132. package/dist/admin/settings/BedrijfInstellingen.js +159 -0
  133. package/dist/admin/settings/BedrijfInstellingen.js.map +1 -0
  134. package/dist/admin/settings/MailTemplates.js +5 -4
  135. package/dist/admin/settings/MailTemplates.js.map +1 -1
  136. package/dist/admin/settings/SettingsPanel.js +120 -78
  137. package/dist/admin/settings/SettingsPanel.js.map +1 -1
  138. package/dist/admin/settings/SnapshotsCard.js +4 -4
  139. package/dist/admin/settings/SnapshotsCard.js.map +1 -1
  140. package/dist/admin/settings/VorigeTerugzetten.d.ts +15 -0
  141. package/dist/admin/settings/VorigeTerugzetten.js +89 -0
  142. package/dist/admin/settings/VorigeTerugzetten.js.map +1 -0
  143. package/dist/admin/shop/CategoriesTab.js +6 -4
  144. package/dist/admin/shop/CategoriesTab.js.map +1 -1
  145. package/dist/admin/shop/DiscountsTab.js +4 -2
  146. package/dist/admin/shop/DiscountsTab.js.map +1 -1
  147. package/dist/admin/shop/OrdersTab.js +57 -19
  148. package/dist/admin/shop/OrdersTab.js.map +1 -1
  149. package/dist/admin/shop/ProductPaneel.js +2 -1
  150. package/dist/admin/shop/ProductPaneel.js.map +1 -1
  151. package/dist/admin/shop/ProductsTab.js +40 -19
  152. package/dist/admin/shop/ProductsTab.js.map +1 -1
  153. package/dist/admin/shop/ShopPanel.js +13 -1
  154. package/dist/admin/shop/ShopPanel.js.map +1 -1
  155. package/dist/admin/shop/ShopSettingsTab.js +56 -17
  156. package/dist/admin/shop/ShopSettingsTab.js.map +1 -1
  157. package/dist/admin/shop/productClient.js +7 -3
  158. package/dist/admin/shop/productClient.js.map +1 -1
  159. package/dist/admin/stats/NietGevonden.d.ts +10 -0
  160. package/dist/admin/stats/NietGevonden.js +78 -0
  161. package/dist/admin/stats/NietGevonden.js.map +1 -0
  162. package/dist/admin/stats/StatsPanel.js +6 -1
  163. package/dist/admin/stats/StatsPanel.js.map +1 -1
  164. package/dist/admin/stats/lib.d.ts +2 -0
  165. package/dist/admin/stats/lib.js.map +1 -1
  166. package/dist/admin/ui/ConfirmDialog.js +10 -1
  167. package/dist/admin/ui/ConfirmDialog.js.map +1 -1
  168. package/dist/admin/ui/Icon.d.ts +34 -0
  169. package/dist/admin/ui/Icon.js +44 -0
  170. package/dist/admin/ui/Icon.js.map +1 -0
  171. package/dist/admin/ui/ImageField.d.ts +15 -0
  172. package/dist/admin/ui/ImageField.js +67 -0
  173. package/dist/admin/ui/ImageField.js.map +1 -0
  174. package/dist/admin/ui/KleurVeld.d.ts +25 -0
  175. package/dist/admin/ui/KleurVeld.js +76 -0
  176. package/dist/admin/ui/KleurVeld.js.map +1 -0
  177. package/dist/admin/ui/LaadStaat.d.ts +21 -0
  178. package/dist/admin/ui/LaadStaat.js +43 -0
  179. package/dist/admin/ui/LaadStaat.js.map +1 -0
  180. package/dist/admin/ui/LeesbaarheidPaneel.d.ts +10 -0
  181. package/dist/admin/ui/LeesbaarheidPaneel.js +68 -0
  182. package/dist/admin/ui/LeesbaarheidPaneel.js.map +1 -0
  183. package/dist/admin/ui/LinkDialog.d.ts +22 -0
  184. package/dist/admin/ui/LinkDialog.js +131 -0
  185. package/dist/admin/ui/LinkDialog.js.map +1 -0
  186. package/dist/admin/ui/LinkVeld.d.ts +14 -0
  187. package/dist/admin/ui/LinkVeld.js +49 -0
  188. package/dist/admin/ui/LinkVeld.js.map +1 -0
  189. package/dist/admin/ui/PreviewLinkResultaat.d.ts +14 -0
  190. package/dist/admin/ui/PreviewLinkResultaat.js +52 -0
  191. package/dist/admin/ui/PreviewLinkResultaat.js.map +1 -0
  192. package/dist/admin/ui/charts.js +5 -5
  193. package/dist/admin/ui/charts.js.map +1 -1
  194. package/dist/admin/ui/primitives.d.ts +16 -6
  195. package/dist/admin/ui/primitives.js +98 -26
  196. package/dist/admin/ui/primitives.js.map +1 -1
  197. package/dist/admin/ui/select.js +5 -2
  198. package/dist/admin/ui/select.js.map +1 -1
  199. package/dist/admin/ui/switch.d.ts +3 -1
  200. package/dist/admin/ui/switch.js +6 -3
  201. package/dist/admin/ui/switch.js.map +1 -1
  202. package/dist/admin/ui/toast.d.ts +2 -1
  203. package/dist/admin/ui/toast.js +17 -11
  204. package/dist/admin/ui/toast.js.map +1 -1
  205. package/dist/admin/visual/BlokKiezer.d.ts +34 -0
  206. package/dist/admin/visual/BlokKiezer.js +225 -0
  207. package/dist/admin/visual/BlokKiezer.js.map +1 -0
  208. package/dist/admin/visual/InlineGereedschap.d.ts +52 -0
  209. package/dist/admin/visual/InlineGereedschap.js +356 -0
  210. package/dist/admin/visual/InlineGereedschap.js.map +1 -0
  211. package/dist/admin/visual/InlineRijkeTekst.d.ts +23 -0
  212. package/dist/admin/visual/InlineRijkeTekst.js +152 -0
  213. package/dist/admin/visual/InlineRijkeTekst.js.map +1 -0
  214. package/dist/admin/visual/VisualEditor.js +273 -125
  215. package/dist/admin/visual/VisualEditor.js.map +1 -1
  216. package/dist/admin.css +1 -1
  217. package/dist/auth/AuthProvider.js +1 -0
  218. package/dist/auth/AuthProvider.js.map +1 -1
  219. package/dist/bedrijf/bedrijf.d.ts +44 -0
  220. package/dist/bedrijf/bedrijf.js +125 -0
  221. package/dist/bedrijf/bedrijf.js.map +1 -0
  222. package/dist/blocks/BlockRenderer.js +11 -1
  223. package/dist/blocks/BlockRenderer.js.map +1 -1
  224. package/dist/blocks/blockStyle.d.ts +7 -0
  225. package/dist/blocks/blockStyle.js +16 -3
  226. package/dist/blocks/blockStyle.js.map +1 -1
  227. package/dist/blocks/builtinSchemas.js +6 -0
  228. package/dist/blocks/builtinSchemas.js.map +1 -1
  229. package/dist/blocks/builtins/AgendaRender.d.ts +22 -0
  230. package/dist/blocks/builtins/AgendaRender.js +69 -9
  231. package/dist/blocks/builtins/AgendaRender.js.map +1 -1
  232. package/dist/blocks/builtins/Availability.d.ts +1 -0
  233. package/dist/blocks/builtins/Availability.js +23 -0
  234. package/dist/blocks/builtins/Availability.js.map +1 -0
  235. package/dist/blocks/builtins/AvailabilityRender.d.ts +12 -0
  236. package/dist/blocks/builtins/AvailabilityRender.js +105 -0
  237. package/dist/blocks/builtins/AvailabilityRender.js.map +1 -0
  238. package/dist/blocks/builtins/BeforeAfterRender.js +4 -3
  239. package/dist/blocks/builtins/BeforeAfterRender.js.map +1 -1
  240. package/dist/blocks/builtins/Booking.js +1 -1
  241. package/dist/blocks/builtins/Booking.js.map +1 -1
  242. package/dist/blocks/builtins/BreadcrumbsRender.d.ts +4 -3
  243. package/dist/blocks/builtins/BreadcrumbsRender.js +14 -8
  244. package/dist/blocks/builtins/BreadcrumbsRender.js.map +1 -1
  245. package/dist/blocks/builtins/ColumnsRender.d.ts +1 -1
  246. package/dist/blocks/builtins/ColumnsRender.js +3 -1
  247. package/dist/blocks/builtins/ColumnsRender.js.map +1 -1
  248. package/dist/blocks/builtins/Contact.js +1 -1
  249. package/dist/blocks/builtins/Contact.js.map +1 -1
  250. package/dist/blocks/builtins/ContactRender.d.ts +1 -1
  251. package/dist/blocks/builtins/ContactRender.js +37 -8
  252. package/dist/blocks/builtins/ContactRender.js.map +1 -1
  253. package/dist/blocks/builtins/Cta.js +1 -1
  254. package/dist/blocks/builtins/Cta.js.map +1 -1
  255. package/dist/blocks/builtins/CtaRender.d.ts +1 -1
  256. package/dist/blocks/builtins/CtaRender.js +5 -4
  257. package/dist/blocks/builtins/CtaRender.js.map +1 -1
  258. package/dist/blocks/builtins/Embed.js +1 -1
  259. package/dist/blocks/builtins/Embed.js.map +1 -1
  260. package/dist/blocks/builtins/FormBlock.js +1 -0
  261. package/dist/blocks/builtins/FormBlock.js.map +1 -1
  262. package/dist/blocks/builtins/FormBlockRender.d.ts +6 -0
  263. package/dist/blocks/builtins/FormBlockRender.js +88 -16
  264. package/dist/blocks/builtins/FormBlockRender.js.map +1 -1
  265. package/dist/blocks/builtins/GalleryRender.js +3 -2
  266. package/dist/blocks/builtins/GalleryRender.js.map +1 -1
  267. package/dist/blocks/builtins/Hero.js +1 -1
  268. package/dist/blocks/builtins/Hero.js.map +1 -1
  269. package/dist/blocks/builtins/HeroRender.js +7 -3
  270. package/dist/blocks/builtins/HeroRender.js.map +1 -1
  271. package/dist/blocks/builtins/OpenNowBadge.d.ts +4 -2
  272. package/dist/blocks/builtins/OpenNowBadge.js +6 -6
  273. package/dist/blocks/builtins/OpenNowBadge.js.map +1 -1
  274. package/dist/blocks/builtins/OpeningHoursRender.d.ts +8 -2
  275. package/dist/blocks/builtins/OpeningHoursRender.js +27 -6
  276. package/dist/blocks/builtins/OpeningHoursRender.js.map +1 -1
  277. package/dist/blocks/builtins/PriceList.d.ts +1 -0
  278. package/dist/blocks/builtins/PriceList.js +25 -0
  279. package/dist/blocks/builtins/PriceList.js.map +1 -0
  280. package/dist/blocks/builtins/PriceListRender.d.ts +17 -0
  281. package/dist/blocks/builtins/PriceListRender.js +87 -0
  282. package/dist/blocks/builtins/PriceListRender.js.map +1 -0
  283. package/dist/blocks/builtins/RichTextBlockRender.js +6 -1
  284. package/dist/blocks/builtins/RichTextBlockRender.js.map +1 -1
  285. package/dist/blocks/builtins/SectionHeading.d.ts +1 -0
  286. package/dist/blocks/builtins/SectionHeading.js +14 -0
  287. package/dist/blocks/builtins/SectionHeading.js.map +1 -0
  288. package/dist/blocks/builtins/SectionHeadingRender.d.ts +7 -0
  289. package/dist/blocks/builtins/SectionHeadingRender.js +14 -0
  290. package/dist/blocks/builtins/SectionHeadingRender.js.map +1 -0
  291. package/dist/blocks/builtins/SliderRender.js +3 -2
  292. package/dist/blocks/builtins/SliderRender.js.map +1 -1
  293. package/dist/blocks/builtins/SymbolRef.js +1 -1
  294. package/dist/blocks/builtins/SymbolRef.js.map +1 -1
  295. package/dist/blocks/builtins/TeamRender.js +6 -1
  296. package/dist/blocks/builtins/TeamRender.js.map +1 -1
  297. package/dist/blocks/builtins/Testimonials.js +3 -1
  298. package/dist/blocks/builtins/Testimonials.js.map +1 -1
  299. package/dist/blocks/builtins/TestimonialsRender.js +4 -0
  300. package/dist/blocks/builtins/TestimonialsRender.js.map +1 -1
  301. package/dist/blocks/builtins/WhatsappChatRender.d.ts +1 -1
  302. package/dist/blocks/builtins/WhatsappChatRender.js +3 -1
  303. package/dist/blocks/builtins/WhatsappChatRender.js.map +1 -1
  304. package/dist/blocks/builtins/Widgets.js +2 -2
  305. package/dist/blocks/builtins/Widgets.js.map +1 -1
  306. package/dist/blocks/builtins/WidgetsRender.js +3 -1
  307. package/dist/blocks/builtins/WidgetsRender.js.map +1 -1
  308. package/dist/blocks/builtins/consentEmbed.js +26 -9
  309. package/dist/blocks/builtins/consentEmbed.js.map +1 -1
  310. package/dist/blocks/builtins/index.d.ts +3 -0
  311. package/dist/blocks/builtins/index.js +6 -0
  312. package/dist/blocks/builtins/index.js.map +1 -1
  313. package/dist/blocks/builtins/lib/autoComplete.d.ts +7 -0
  314. package/dist/blocks/builtins/lib/autoComplete.js +20 -0
  315. package/dist/blocks/builtins/lib/autoComplete.js.map +1 -0
  316. package/dist/blocks/builtins/lib/bookingUrl.d.ts +2 -2
  317. package/dist/blocks/builtins/lib/bookingUrl.js +1 -1
  318. package/dist/blocks/builtins/lib/bookingUrl.js.map +1 -1
  319. package/dist/blocks/builtins/lib/ical.d.ts +24 -0
  320. package/dist/blocks/builtins/lib/ical.js +82 -0
  321. package/dist/blocks/builtins/lib/ical.js.map +1 -0
  322. package/dist/blocks/builtins/lib/vandaag.d.ts +8 -0
  323. package/dist/blocks/builtins/lib/vandaag.js +22 -0
  324. package/dist/blocks/builtins/lib/vandaag.js.map +1 -0
  325. package/dist/blocks/registry.d.ts +6 -0
  326. package/dist/blocks/registry.js.map +1 -1
  327. package/dist/blocks/ui/index.js +1 -0
  328. package/dist/blocks/ui/index.js.map +1 -1
  329. package/dist/components/EditBar.js +2 -4
  330. package/dist/components/EditBar.js.map +1 -1
  331. package/dist/components/News.js +26 -18
  332. package/dist/components/News.js.map +1 -1
  333. package/dist/components/PageView.d.ts +7 -1
  334. package/dist/components/PageView.js +17 -0
  335. package/dist/components/PageView.js.map +1 -1
  336. package/dist/components/ResponsiveImage.js +18 -20
  337. package/dist/components/ResponsiveImage.js.map +1 -1
  338. package/dist/components/onderOffset.d.ts +13 -0
  339. package/dist/components/onderOffset.js +74 -0
  340. package/dist/components/onderOffset.js.map +1 -0
  341. package/dist/components/site/Bedrijfsnummers.d.ts +9 -0
  342. package/dist/components/site/Bedrijfsnummers.js +12 -0
  343. package/dist/components/site/Bedrijfsnummers.js.map +1 -0
  344. package/dist/components/site/SiteFooter.d.ts +6 -1
  345. package/dist/components/site/SiteFooter.js +62 -9
  346. package/dist/components/site/SiteFooter.js.map +1 -1
  347. package/dist/components/site/SiteHeader.d.ts +15 -0
  348. package/dist/components/site/SiteHeader.js +70 -0
  349. package/dist/components/site/SiteHeader.js.map +1 -0
  350. package/dist/components/site/SiteNav.d.ts +2 -0
  351. package/dist/components/site/SiteNav.js +29 -5
  352. package/dist/components/site/SiteNav.js.map +1 -1
  353. package/dist/demo/DemoStudio.js +2 -2
  354. package/dist/demo/DemoStudio.js.map +1 -1
  355. package/dist/demo/demoStore.d.ts +13 -0
  356. package/dist/demo/demoStore.js +36 -0
  357. package/dist/demo/demoStore.js.map +1 -1
  358. package/dist/editor/EditorProvider.js +15 -4
  359. package/dist/editor/EditorProvider.js.map +1 -1
  360. package/dist/firebase/functionsClient.js +5 -1
  361. package/dist/firebase/functionsClient.js.map +1 -1
  362. package/dist/index.d.ts +5 -1
  363. package/dist/index.js +20 -1
  364. package/dist/index.js.map +1 -1
  365. package/dist/media/ImageContext.d.ts +17 -0
  366. package/dist/media/ImageContext.js +65 -20
  367. package/dist/media/ImageContext.js.map +1 -1
  368. package/dist/media/altInHtml.d.ts +9 -0
  369. package/dist/media/altInHtml.js +17 -0
  370. package/dist/media/altInHtml.js.map +1 -0
  371. package/dist/media/srcset.d.ts +12 -0
  372. package/dist/media/srcset.js +13 -0
  373. package/dist/media/srcset.js.map +1 -0
  374. package/dist/modules/builtins.d.ts +1 -0
  375. package/dist/modules/builtins.js +22 -9
  376. package/dist/modules/builtins.js.map +1 -1
  377. package/dist/modules/consent/ConsentBanner.d.ts +5 -0
  378. package/dist/modules/consent/ConsentBanner.js +8 -7
  379. package/dist/modules/consent/ConsentBanner.js.map +1 -1
  380. package/dist/modules/consent/standaard.d.ts +12 -0
  381. package/dist/modules/consent/standaard.js +10 -0
  382. package/dist/modules/consent/standaard.js.map +1 -0
  383. package/dist/modules/consent/useConsent.d.ts +4 -0
  384. package/dist/modules/consent/useConsent.js +30 -1
  385. package/dist/modules/consent/useConsent.js.map +1 -1
  386. package/dist/modules/shop/blocks/Cart.js +5 -3
  387. package/dist/modules/shop/blocks/Cart.js.map +1 -1
  388. package/dist/modules/shop/blocks/Checkout.js +56 -35
  389. package/dist/modules/shop/blocks/Checkout.js.map +1 -1
  390. package/dist/modules/shop/blocks/Donation.js +4 -4
  391. package/dist/modules/shop/blocks/Donation.js.map +1 -1
  392. package/dist/modules/shop/blocks/ProductDetail.js +19 -3
  393. package/dist/modules/shop/blocks/ProductDetail.js.map +1 -1
  394. package/dist/modules/shop/blocks/ProductGrid.d.ts +3 -1
  395. package/dist/modules/shop/blocks/ProductGrid.js +8 -4
  396. package/dist/modules/shop/blocks/ProductGrid.js.map +1 -1
  397. package/dist/modules/shop/blocks/ShopCategories.js +4 -3
  398. package/dist/modules/shop/blocks/ShopCategories.js.map +1 -1
  399. package/dist/modules/shop/lib.d.ts +4 -0
  400. package/dist/modules/shop/lib.js +14 -0
  401. package/dist/modules/shop/lib.js.map +1 -1
  402. package/dist/modules/shop/settings.d.ts +3 -0
  403. package/dist/modules/shop/settings.js +14 -0
  404. package/dist/modules/shop/settings.js.map +1 -1
  405. package/dist/modules/shop/strings.d.ts +4 -0
  406. package/dist/modules/shop/strings.js +8 -0
  407. package/dist/modules/shop/strings.js.map +1 -1
  408. package/dist/next/envCheck.d.ts +42 -0
  409. package/dist/next/envCheck.js +106 -0
  410. package/dist/next/envCheck.js.map +1 -0
  411. package/dist/next/index.cjs +185 -2
  412. package/dist/next/index.d.ts +2 -0
  413. package/dist/next/index.js +8 -1
  414. package/dist/next/index.js.map +1 -1
  415. package/dist/next/securityHeaders.d.ts +36 -0
  416. package/dist/next/securityHeaders.js +74 -0
  417. package/dist/next/securityHeaders.js.map +1 -0
  418. package/dist/patterns/builtins.d.ts +7 -0
  419. package/dist/patterns/builtins.js +138 -3
  420. package/dist/patterns/builtins.js.map +1 -1
  421. package/dist/releaseNotes.js +148 -0
  422. package/dist/releaseNotes.js.map +1 -1
  423. package/dist/render/PublishedPage.d.ts +2 -1
  424. package/dist/render/PublishedPage.js +10 -4
  425. package/dist/render/PublishedPage.js.map +1 -1
  426. package/dist/schema/blocks.d.ts +473 -0
  427. package/dist/schema/blocks.js +105 -5
  428. package/dist/schema/blocks.js.map +1 -1
  429. package/dist/schema/business.d.ts +118 -0
  430. package/dist/schema/business.js +75 -0
  431. package/dist/schema/business.js.map +1 -0
  432. package/dist/schema/fields.d.ts +2 -1
  433. package/dist/schema/fields.js.map +1 -1
  434. package/dist/schema/forms.d.ts +18 -0
  435. package/dist/schema/forms.js +18 -3
  436. package/dist/schema/forms.js.map +1 -1
  437. package/dist/schema/mail.d.ts +10 -0
  438. package/dist/schema/mail.js +7 -0
  439. package/dist/schema/mail.js.map +1 -1
  440. package/dist/schema/settings.d.ts +103 -0
  441. package/dist/schema/settings.js +24 -3
  442. package/dist/schema/settings.js.map +1 -1
  443. package/dist/schema/shop.d.ts +2 -0
  444. package/dist/schema/shop.js +4 -0
  445. package/dist/schema/shop.js.map +1 -1
  446. package/dist/schema/shopGeld.d.ts +1 -0
  447. package/dist/schema/shopGeld.js +1 -0
  448. package/dist/schema/shopGeld.js.map +1 -1
  449. package/dist/schema/siteConfig.d.ts +69 -1
  450. package/dist/schema/siteConfig.js +7 -2
  451. package/dist/schema/siteConfig.js.map +1 -1
  452. package/dist/server/blockData.d.ts +1 -1
  453. package/dist/server/blockData.js +74 -18
  454. package/dist/server/blockData.js.map +1 -1
  455. package/dist/server/cspRapport.d.ts +20 -0
  456. package/dist/server/cspRapport.js +56 -0
  457. package/dist/server/cspRapport.js.map +1 -0
  458. package/dist/server/fonts.d.ts +3 -0
  459. package/dist/server/fonts.js +39 -0
  460. package/dist/server/fonts.js.map +1 -0
  461. package/dist/server/index.d.ts +3 -0
  462. package/dist/server/index.js +8 -0
  463. package/dist/server/index.js.map +1 -1
  464. package/dist/server/sanitize.js +2 -0
  465. package/dist/server/sanitize.js.map +1 -1
  466. package/dist/settings/useSiteSettings.js +4 -1
  467. package/dist/settings/useSiteSettings.js.map +1 -1
  468. package/dist/starters/starters.d.ts +69 -0
  469. package/dist/starters/starters.js +171 -0
  470. package/dist/starters/starters.js.map +1 -0
  471. package/dist/styles.css +1181 -212
  472. package/dist/theme/color.d.ts +10 -0
  473. package/dist/theme/color.js +17 -1
  474. package/dist/theme/color.js.map +1 -1
  475. package/dist/theme/fontFallback.d.ts +23 -0
  476. package/dist/theme/fontFallback.js +58 -0
  477. package/dist/theme/fontFallback.js.map +1 -0
  478. package/dist/theme/fonts.d.ts +11 -0
  479. package/dist/theme/fonts.js +16 -0
  480. package/dist/theme/fonts.js.map +1 -0
  481. package/dist/version.js +1 -1
  482. package/package.json +5 -4
@@ -1,5 +1,9 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { heroBeeldPatch, videoAdresProbleem } from "../lib/heroHulp.js";
4
+ import { useIsSuperadmin } from "../lib/useIsSuperadmin.js";
5
+ import { LinkVeld } from "../ui/LinkVeld.js";
6
+ import { KleurVeld } from "../ui/KleurVeld.js";
3
7
  import { useEffect, useState } from "react";
4
8
  import { collection, getDocs } from "firebase/firestore";
5
9
  import { getDb } from "../../firebase/client.js";
@@ -8,26 +12,34 @@ import { Select } from "../ui/select.js";
8
12
  import { Switch } from "../ui/switch.js";
9
13
  import { ArrayEditor } from "../ui/ArrayEditor.js";
10
14
  import { RichTextEditor } from "../editors/RichTextEditor.js";
11
- import { MediaPickerButton } from "../media/MediaPicker.js";
15
+ import { ImageField } from "../ui/ImageField.js";
12
16
  import { useRegistry } from "../../blocks/context.js";
13
17
  import { GenericEditor } from "./GenericEditor.js";
14
18
  import { SymbolRefEditor } from "./SymbolRefEditor.js";
15
19
  const VARIANT_OPTIONS = [
16
20
  { value: "primary", label: "Primair" },
17
21
  { value: "secondary", label: "Secundair" },
18
- { value: "outline", label: "Outline" }
22
+ { value: "outline", label: "Omlijnd" }
19
23
  ];
20
24
  function patch(block, onChange, part) {
21
25
  onChange({ ...block, ...part });
22
26
  }
23
- function ImageUploadButton({ siteId, onUploaded }) {
24
- return /* @__PURE__ */ jsx(MediaPickerButton, { siteId, onSelect: (m) => onUploaded(m.url, m.mediaId, m.alt) });
25
- }
26
27
  function HeroEditor({ block, siteId, onChange }) {
27
28
  return /* @__PURE__ */ jsxs("div", { className: "grid gap-3", children: [
28
29
  /* @__PURE__ */ jsx(Field, { label: "Regeltje boven de titel (optioneel)", hint: "bv. 'Hoveniers sinds 2001'", children: /* @__PURE__ */ jsx(Input, { value: block.eyebrow ?? "", onChange: (e) => patch(block, onChange, { eyebrow: e.target.value || void 0 }) }) }),
29
30
  /* @__PURE__ */ jsx(Field, { label: "Titel", children: /* @__PURE__ */ jsx(Input, { value: block.title ?? "", onChange: (e) => patch(block, onChange, { title: e.target.value }) }) }),
30
31
  /* @__PURE__ */ jsx(Field, { label: "Ondertitel", children: /* @__PURE__ */ jsx(Input, { value: block.subtitle ?? "", onChange: (e) => patch(block, onChange, { subtitle: e.target.value }) }) }),
32
+ /* @__PURE__ */ jsx(Field, { label: "Weergave", hint: "Naast de foto is rustiger en altijd leesbaar; op de foto is groots.", children: /* @__PURE__ */ jsx(
33
+ Select,
34
+ {
35
+ value: block.layout ?? "overlay",
36
+ onValueChange: (v) => patch(block, onChange, { layout: v }),
37
+ options: [
38
+ { value: "overlay", label: "Tekst op de foto" },
39
+ { value: "naast", label: "Tekst naast de foto" }
40
+ ]
41
+ }
42
+ ) }),
31
43
  /* @__PURE__ */ jsx(Field, { label: "Uitlijning", children: /* @__PURE__ */ jsx(
32
44
  Select,
33
45
  {
@@ -39,11 +51,11 @@ function HeroEditor({ block, siteId, onChange }) {
39
51
  ]
40
52
  }
41
53
  ) }),
42
- /* @__PURE__ */ jsx(Field, { label: "Achtergrondafbeelding", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
43
- /* @__PURE__ */ jsx(Input, { value: block.imageUrl ?? "", onChange: (e) => patch(block, onChange, { imageUrl: e.target.value }), placeholder: "URL of upload \u2192" }),
44
- /* @__PURE__ */ jsx(ImageUploadButton, { siteId, onUploaded: (url) => patch(block, onChange, { imageUrl: url }) })
45
- ] }) }),
46
- /* @__PURE__ */ jsx(Field, { label: "Video-achtergrond (mp4/webm, optioneel)", hint: "Overschrijft de afbeelding.", children: /* @__PURE__ */ jsx(Input, { value: block.videoUrl ?? "", onChange: (e) => patch(block, onChange, { videoUrl: e.target.value }) }) }),
54
+ /* @__PURE__ */ jsx(Field, { label: "Achtergrondafbeelding", children: /* @__PURE__ */ jsx(ImageField, { siteId, value: block.imageUrl, onChange: (url) => patch(block, onChange, heroBeeldPatch(block, url)) }) }),
55
+ /* @__PURE__ */ jsxs(Field, { label: "Video-achtergrond (mp4/webm, optioneel)", hint: "Overschrijft de afbeelding. Houd hem kort en klein (onder 10 MB).", children: [
56
+ /* @__PURE__ */ jsx(Input, { value: block.videoUrl ?? "", onChange: (e) => patch(block, onChange, { videoUrl: e.target.value }) }),
57
+ videoAdresProbleem(block.videoUrl) && /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-amber-700", children: videoAdresProbleem(block.videoUrl) })
58
+ ] }),
47
59
  /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
48
60
  /* @__PURE__ */ jsx(Field, { label: "Verticale uitlijning", children: /* @__PURE__ */ jsx(
49
61
  Select,
@@ -71,10 +83,31 @@ function HeroEditor({ block, siteId, onChange }) {
71
83
  ]
72
84
  }
73
85
  ) }),
74
- /* @__PURE__ */ jsx(Field, { label: "Overlay-kleur (optioneel)", children: /* @__PURE__ */ jsx(Input, { value: block.overlayColor ?? "", onChange: (e) => patch(block, onChange, { overlayColor: e.target.value }), placeholder: "#000000" }) }),
86
+ /* @__PURE__ */ jsx(KleurVeld, { label: "Overlay-kleur (optioneel)", value: block.overlayColor ?? "", placeholder: "#000000", onChange: (overlayColor) => patch(block, onChange, { overlayColor }) }),
75
87
  /* @__PURE__ */ jsx(Field, { label: "Overlay-dekking (%)", children: /* @__PURE__ */ jsx(Input, { type: "number", value: String(block.overlayOpacity ?? 0), onChange: (e) => patch(block, onChange, { overlayOpacity: Math.max(0, Math.min(100, Number(e.target.value) || 0)) }) }) }),
76
88
  /* @__PURE__ */ jsx(ToggleField, { label: "Gradient-overlay (donker onderaan \u2014 leesbare tekst op foto's)", checked: Boolean(block.overlayGradient), onChange: (v) => patch(block, onChange, { overlayGradient: v }) })
77
89
  ] }),
90
+ /* @__PURE__ */ jsxs("div", { children: [
91
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: "Vertrouwenspunten (optioneel)" }),
92
+ /* @__PURE__ */ jsx("p", { className: "mb-1 text-xs text-slate-500", children: "Korte punten met een vinkje onder de knoppen, bv. \u201CGratis offerte\u201D of \u201CGroenkeur-erkend\u201D." }),
93
+ /* @__PURE__ */ jsx(
94
+ ArrayEditor,
95
+ {
96
+ items: block.trust ?? [],
97
+ onChange: (trust) => patch(block, onChange, { trust }),
98
+ newItem: () => "",
99
+ addLabel: "+ Punt",
100
+ renderRow: (t, _update, i) => /* @__PURE__ */ jsx(
101
+ Input,
102
+ {
103
+ value: t,
104
+ maxLength: 60,
105
+ onChange: (e) => patch(block, onChange, { trust: (block.trust ?? []).map((x, j) => j === i ? e.target.value : x) })
106
+ }
107
+ )
108
+ }
109
+ )
110
+ ] }),
78
111
  /* @__PURE__ */ jsxs("div", { children: [
79
112
  /* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: "Knoppen" }),
80
113
  /* @__PURE__ */ jsx(
@@ -84,10 +117,12 @@ function HeroEditor({ block, siteId, onChange }) {
84
117
  onChange: (buttons) => patch(block, onChange, { buttons }),
85
118
  newItem: () => ({ label: "", href: "#", variant: "primary" }),
86
119
  addLabel: "+ Knop",
87
- renderRow: (b, update) => /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-3 gap-2", children: [
88
- /* @__PURE__ */ jsx(Input, { value: b.label, placeholder: "Label", onChange: (e) => update({ label: e.target.value }) }),
89
- /* @__PURE__ */ jsx(Input, { value: b.href, placeholder: "/pad of https://\u2026", onChange: (e) => update({ href: e.target.value }) }),
90
- /* @__PURE__ */ jsx(Select, { value: b.variant, onValueChange: (v) => update({ variant: v }), options: VARIANT_OPTIONS })
120
+ renderRow: (b, update) => /* @__PURE__ */ jsxs("div", { className: "grid gap-2", children: [
121
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[1fr_auto] gap-2", children: [
122
+ /* @__PURE__ */ jsx(Input, { value: b.label, placeholder: "Tekst op de knop", onChange: (e) => update({ label: e.target.value }) }),
123
+ /* @__PURE__ */ jsx(Select, { value: b.variant, onValueChange: (v) => update({ variant: v }), options: VARIANT_OPTIONS })
124
+ ] }),
125
+ /* @__PURE__ */ jsx(LinkVeld, { siteId, value: b.href, onChange: (href) => update({ href }) })
91
126
  ] })
92
127
  }
93
128
  )
@@ -99,14 +134,11 @@ function RichTextBlockEditor({ block, siteId, onChange }) {
99
134
  }
100
135
  function ImageEditor({ block, siteId, onChange }) {
101
136
  return /* @__PURE__ */ jsxs("div", { className: "grid gap-3", children: [
102
- /* @__PURE__ */ jsx(Field, { label: "Afbeelding", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
103
- /* @__PURE__ */ jsx(Input, { value: block.url ?? "", onChange: (e) => patch(block, onChange, { url: e.target.value }), placeholder: "URL of upload \u2192" }),
104
- /* @__PURE__ */ jsx(ImageUploadButton, { siteId, onUploaded: (url) => patch(block, onChange, { url }) })
105
- ] }) }),
137
+ /* @__PURE__ */ jsx(Field, { label: "Afbeelding", children: /* @__PURE__ */ jsx(ImageField, { siteId, value: block.url, onChange: (url) => patch(block, onChange, { url }) }) }),
106
138
  /* @__PURE__ */ jsx(Field, { label: "Alt-tekst (toegankelijkheid)", hint: "Beschrijf de afbeelding kort.", children: /* @__PURE__ */ jsx(Input, { value: block.alt ?? "", onChange: (e) => patch(block, onChange, { alt: e.target.value }) }) }),
107
139
  /* @__PURE__ */ jsx(Field, { label: "Bijschrift", children: /* @__PURE__ */ jsx(Input, { value: block.caption ?? "", onChange: (e) => patch(block, onChange, { caption: e.target.value }) }) }),
108
140
  /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-3 gap-2", children: [
109
- /* @__PURE__ */ jsx(Field, { label: "Link (klikbaar)", children: /* @__PURE__ */ jsx(Input, { value: block.href ?? "", onChange: (e) => patch(block, onChange, { href: e.target.value }) }) }),
141
+ /* @__PURE__ */ jsx(Field, { label: "Link (klikbaar)", children: /* @__PURE__ */ jsx(LinkVeld, { siteId, value: block.href ?? "", onChange: (href) => patch(block, onChange, { href }), leegTekst: "Geen link (optioneel)" }) }),
110
142
  /* @__PURE__ */ jsx(Field, { label: "Uitlijning", children: /* @__PURE__ */ jsx(
111
143
  Select,
112
144
  {
@@ -157,7 +189,7 @@ function FaqEditor({ block, siteId, onChange }) {
157
189
  )
158
190
  ] });
159
191
  }
160
- function PricingEditor({ block, onChange }) {
192
+ function PricingEditor({ block, siteId, onChange }) {
161
193
  const items = block.items ?? [];
162
194
  return /* @__PURE__ */ jsxs("div", { className: "grid gap-3", children: [
163
195
  /* @__PURE__ */ jsx(Field, { label: "Kop", children: /* @__PURE__ */ jsx(Input, { value: block.heading ?? "", onChange: (e) => patch(block, onChange, { heading: e.target.value }) }) }),
@@ -185,7 +217,7 @@ function PricingEditor({ block, onChange }) {
185
217
  ) }),
186
218
  /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-2", children: [
187
219
  /* @__PURE__ */ jsx(Input, { value: it.ctaLabel ?? "", placeholder: "Knoptekst", onChange: (e) => update({ ctaLabel: e.target.value }) }),
188
- /* @__PURE__ */ jsx(Input, { value: it.ctaHref ?? "", placeholder: "Knoplink", onChange: (e) => update({ ctaHref: e.target.value }) })
220
+ /* @__PURE__ */ jsx(LinkVeld, { siteId, value: it.ctaHref ?? "", onChange: (ctaHref) => update({ ctaHref }), leegTekst: "Knop zonder link" })
189
221
  ] }),
190
222
  /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 text-sm", children: [
191
223
  /* @__PURE__ */ jsx("input", { type: "checkbox", checked: Boolean(it.highlighted), onChange: (e) => update({ highlighted: e.target.checked }) }),
@@ -197,7 +229,7 @@ function PricingEditor({ block, onChange }) {
197
229
  /* @__PURE__ */ jsx(Field, { label: "Voetnoot (optioneel)", children: /* @__PURE__ */ jsx(Input, { value: block.note ?? "", onChange: (e) => patch(block, onChange, { note: e.target.value }) }) }),
198
230
  /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 items-end gap-2", children: [
199
231
  /* @__PURE__ */ jsx(Field, { label: "Valuta", hint: "ISO-code voor zoekmachines, bv. EUR", children: /* @__PURE__ */ jsx(Input, { value: block.currency ?? "EUR", onChange: (e) => patch(block, onChange, { currency: e.target.value || "EUR" }) }) }),
200
- /* @__PURE__ */ jsx(ToggleField, { label: "JSON-LD (Product/Offer)", checked: Boolean(block.jsonLd), onChange: (v) => patch(block, onChange, { jsonLd: v }) })
232
+ /* @__PURE__ */ jsx(ToggleField, { label: "Extra gegevens voor Google (aanbevolen)", checked: Boolean(block.jsonLd), onChange: (v) => patch(block, onChange, { jsonLd: v }) })
201
233
  ] })
202
234
  ] });
203
235
  }
@@ -233,7 +265,7 @@ function FormEditor({ block, siteId, onChange }) {
233
265
  let cancelled = false;
234
266
  void getDocs(collection(db, "sites", siteId, "forms")).then((snap) => {
235
267
  if (!cancelled) setForms(snap.docs.map((d) => ({ id: d.id, name: String(d.data().name ?? d.id) })));
236
- });
268
+ }).catch((e) => console.warn("[xicms] lezen mislukt:", e.message));
237
269
  return () => {
238
270
  cancelled = true;
239
271
  };
@@ -295,10 +327,7 @@ function GalleryEditor({ block, siteId, onChange }) {
295
327
  ) })
296
328
  ] }),
297
329
  items.map((it, i) => /* @__PURE__ */ jsxs("div", { className: "grid gap-2 rounded-lg border border-slate-200 p-3", children: [
298
- /* @__PURE__ */ jsx(Field, { label: `Foto ${i + 1}`, children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
299
- /* @__PURE__ */ jsx(Input, { value: it.url ?? "", onChange: (e) => set(items.map((x, j) => j === i ? { ...x, url: e.target.value } : x)), placeholder: "URL of upload \u2192" }),
300
- /* @__PURE__ */ jsx(ImageUploadButton, { siteId, onUploaded: (url) => set(items.map((x, j) => j === i ? { ...x, url } : x)) })
301
- ] }) }),
330
+ /* @__PURE__ */ jsx(Field, { label: `Foto ${i + 1}`, children: /* @__PURE__ */ jsx(ImageField, { siteId, value: it.url, onChange: (url) => set(items.map((x, j) => j === i ? { ...x, url } : x)) }) }),
302
331
  /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-3 gap-2", children: [
303
332
  /* @__PURE__ */ jsx(Field, { label: "Alt-tekst", children: /* @__PURE__ */ jsx(Input, { value: it.alt ?? "", onChange: (e) => set(items.map((x, j) => j === i ? { ...x, alt: e.target.value } : x)) }) }),
304
333
  /* @__PURE__ */ jsx(Field, { label: "Bijschrift", children: /* @__PURE__ */ jsx(Input, { value: it.caption ?? "", onChange: (e) => set(items.map((x, j) => j === i ? { ...x, caption: e.target.value } : x)) }) }),
@@ -310,21 +339,74 @@ function GalleryEditor({ block, siteId, onChange }) {
310
339
  /* @__PURE__ */ jsx(ToggleField, { label: "Filterbalk op tags", checked: Boolean(block.showFilter), onChange: (v) => patch(block, onChange, { showFilter: v }) })
311
340
  ] });
312
341
  }
313
- function AgendaEditor({ block, onChange }) {
342
+ function AgendaEditor({ block, siteId, onChange }) {
314
343
  const events = block.events ?? [];
315
344
  const set = (next) => patch(block, onChange, { events: next });
345
+ const zet = (i, p) => set(events.map((x, j) => j === i ? { ...x, ...p } : x));
346
+ const naarInvoer = (v) => v ? v.length === 10 ? `${v}T00:00` : v.slice(0, 16) : "";
316
347
  return /* @__PURE__ */ jsxs("div", { className: "grid gap-3", children: [
317
348
  /* @__PURE__ */ jsx(Field, { label: "Kop", children: /* @__PURE__ */ jsx(Input, { value: block.heading ?? "", onChange: (e) => patch(block, onChange, { heading: e.target.value }) }) }),
318
- events.map((ev, i) => /* @__PURE__ */ jsxs("div", { className: "grid gap-2 rounded-lg border border-slate-200 p-3", children: [
319
- /* @__PURE__ */ jsx(Field, { label: "Titel", children: /* @__PURE__ */ jsx(Input, { value: ev.title ?? "", onChange: (e) => set(events.map((x, j) => j === i ? { ...x, title: e.target.value } : x)) }) }),
320
- /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-2", children: [
321
- /* @__PURE__ */ jsx(Field, { label: "Start", hint: "bv. 2026-07-01 of 2026-07-01T19:30", children: /* @__PURE__ */ jsx(Input, { value: ev.start ?? "", onChange: (e) => set(events.map((x, j) => j === i ? { ...x, start: e.target.value } : x)) }) }),
322
- /* @__PURE__ */ jsx(Field, { label: "Einde (optioneel)", children: /* @__PURE__ */ jsx(Input, { value: ev.end ?? "", onChange: (e) => set(events.map((x, j) => j === i ? { ...x, end: e.target.value } : x)) }) })
323
- ] }),
324
- /* @__PURE__ */ jsx(Field, { label: "Locatie (optioneel)", children: /* @__PURE__ */ jsx(Input, { value: ev.location ?? "", onChange: (e) => set(events.map((x, j) => j === i ? { ...x, location: e.target.value } : x)) }) }),
325
- /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => set(events.filter((_, j) => j !== i)), children: "Verwijderen" }) })
326
- ] }, i)),
327
- /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Button, { type: "button", variant: "secondary", size: "sm", onClick: () => set([...events, { title: "", start: "" }]), children: "+ Evenement toevoegen" }) })
349
+ /* @__PURE__ */ jsx(
350
+ ArrayEditor,
351
+ {
352
+ items: events,
353
+ onChange: set,
354
+ newItem: () => ({ title: "", start: "" }),
355
+ addLabel: "+ Activiteit",
356
+ emptyLabel: "Nog geen activiteiten.",
357
+ renderRow: (ev, _u, i) => /* @__PURE__ */ jsxs("div", { className: "grid gap-2", children: [
358
+ /* @__PURE__ */ jsx(Field, { label: "Titel", children: /* @__PURE__ */ jsx(Input, { value: ev.title ?? "", onChange: (e) => zet(i, { title: e.target.value }) }) }),
359
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-2", children: [
360
+ /* @__PURE__ */ jsx(Field, { label: "Begint op", children: /* @__PURE__ */ jsx(Input, { type: "datetime-local", value: naarInvoer(ev.start), onChange: (e) => zet(i, { start: e.target.value }) }) }),
361
+ /* @__PURE__ */ jsx(Field, { label: "Eindigt op (optioneel)", children: /* @__PURE__ */ jsx(Input, { type: "datetime-local", value: naarInvoer(ev.end), onChange: (e) => zet(i, { end: e.target.value || void 0 }) }) })
362
+ ] }),
363
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-2", children: [
364
+ /* @__PURE__ */ jsx(Field, { label: "Plaats", hint: "Nodig om in Google te verschijnen.", children: /* @__PURE__ */ jsx(Input, { value: ev.location ?? "", onChange: (e) => zet(i, { location: e.target.value || void 0 }) }) }),
365
+ /* @__PURE__ */ jsx(Field, { label: "Prijs (optioneel)", hint: "bv. Gratis of \u20AC 12,50", children: /* @__PURE__ */ jsx(Input, { value: ev.price ?? "", onChange: (e) => zet(i, { price: e.target.value || void 0 }) }) })
366
+ ] }),
367
+ /* @__PURE__ */ jsx(Field, { label: "Omschrijving (optioneel)", children: /* @__PURE__ */ jsx(Textarea, { rows: 2, value: ev.description ?? "", onChange: (e) => zet(i, { description: e.target.value || void 0 }) }) }),
368
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-2", children: [
369
+ /* @__PURE__ */ jsx(Field, { label: "Herhaalt", children: /* @__PURE__ */ jsx(
370
+ Select,
371
+ {
372
+ value: ev.herhaal ?? "",
373
+ onValueChange: (v) => zet(i, { herhaal: v || void 0 }),
374
+ options: [
375
+ { value: "", label: "Eenmalig" },
376
+ { value: "wekelijks", label: "Elke week" },
377
+ { value: "tweewekelijks", label: "Om de week" },
378
+ { value: "maandelijks", label: "Elke maand" }
379
+ ]
380
+ }
381
+ ) }),
382
+ ev.herhaal && /* @__PURE__ */ jsx(Field, { label: "Tot en met (optioneel)", hint: "Leeg = een jaar vooruit.", children: /* @__PURE__ */ jsx(Input, { type: "date", value: ev.herhaalTot ?? "", onChange: (e) => zet(i, { herhaalTot: e.target.value || void 0 }) }) })
383
+ ] }),
384
+ /* @__PURE__ */ jsxs("details", { className: "rounded-md border border-slate-200 p-2 text-sm", children: [
385
+ /* @__PURE__ */ jsx("summary", { className: "cursor-pointer text-slate-600", children: "Meer: adres, foto, link, status" }),
386
+ /* @__PURE__ */ jsxs("div", { className: "mt-2 grid gap-2", children: [
387
+ /* @__PURE__ */ jsx(Field, { label: "Adres", hint: "Alleen als het niet op je eigen adres is (dat komt uit Instellingen \u2192 Bedrijf).", children: /* @__PURE__ */ jsx(Input, { value: ev.address ?? "", onChange: (e) => zet(i, { address: e.target.value || void 0 }) }) }),
388
+ /* @__PURE__ */ jsx(Field, { label: "Foto", children: /* @__PURE__ */ jsx(ImageField, { siteId, value: ev.imageUrl, onChange: (imageUrl) => zet(i, { imageUrl }) }) }),
389
+ /* @__PURE__ */ jsx(Field, { label: "Link (aanmelden, tickets, meer info)", children: /* @__PURE__ */ jsx(LinkVeld, { siteId, value: ev.url, onChange: (url) => zet(i, { url: url || void 0 }), leegTekst: "Geen link (optioneel)" }) }),
390
+ /* @__PURE__ */ jsx(Field, { label: "Status", children: /* @__PURE__ */ jsx(
391
+ Select,
392
+ {
393
+ value: ev.status ?? "",
394
+ onValueChange: (v) => zet(i, { status: v || void 0 }),
395
+ options: [
396
+ { value: "", label: "Gaat gewoon door" },
397
+ { value: "afgelast", label: "Afgelast" },
398
+ { value: "verplaatst", label: "Verplaatst" },
399
+ { value: "online", label: "Online" }
400
+ ]
401
+ }
402
+ ) })
403
+ ] })
404
+ ] })
405
+ ] })
406
+ }
407
+ ),
408
+ /* @__PURE__ */ jsx(ToggleField, { label: "Voorbije activiteiten verbergen", checked: block.hidePast !== false, onChange: (v) => patch(block, onChange, { hidePast: v }) }),
409
+ /* @__PURE__ */ jsx(ToggleField, { label: "Laat Google de activiteiten herkennen", checked: Boolean(block.jsonLd), onChange: (v) => patch(block, onChange, { jsonLd: v }) })
328
410
  ] });
329
411
  }
330
412
  function HeadingField({ block, onChange }) {
@@ -340,14 +422,11 @@ function FeatureEditor({ block, siteId, onChange }) {
340
422
  return /* @__PURE__ */ jsxs("div", { className: "grid gap-3", children: [
341
423
  /* @__PURE__ */ jsx(HeadingField, { block, siteId, onChange }),
342
424
  /* @__PURE__ */ jsx(Field, { label: "Tekst", children: /* @__PURE__ */ jsx(RichTextEditor, { siteId, value: block.html ?? "", onChange: (html) => patch(block, onChange, { html }) }) }),
343
- /* @__PURE__ */ jsx(Field, { label: "Afbeelding", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
344
- /* @__PURE__ */ jsx(Input, { value: block.imageUrl ?? "", onChange: (e) => patch(block, onChange, { imageUrl: e.target.value }), placeholder: "URL of upload \u2192" }),
345
- /* @__PURE__ */ jsx(ImageUploadButton, { siteId, onUploaded: (url) => patch(block, onChange, { imageUrl: url }) })
346
- ] }) }),
425
+ /* @__PURE__ */ jsx(Field, { label: "Afbeelding", children: /* @__PURE__ */ jsx(ImageField, { siteId, value: block.imageUrl, onChange: (url) => patch(block, onChange, { imageUrl: url }) }) }),
347
426
  /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-3 gap-2", children: [
348
427
  /* @__PURE__ */ jsx(Field, { label: "Beeldpositie", children: /* @__PURE__ */ jsx(Select, { value: block.imagePosition ?? "left", onValueChange: (v) => patch(block, onChange, { imagePosition: v }), options: [{ value: "left", label: "Links" }, { value: "right", label: "Rechts" }] }) }),
349
428
  /* @__PURE__ */ jsx(Field, { label: "Knoptekst", children: /* @__PURE__ */ jsx(Input, { value: block.buttonLabel ?? "", onChange: (e) => patch(block, onChange, { buttonLabel: e.target.value }) }) }),
350
- /* @__PURE__ */ jsx(Field, { label: "Knoplink", children: /* @__PURE__ */ jsx(Input, { value: block.buttonHref ?? "", onChange: (e) => patch(block, onChange, { buttonHref: e.target.value }) }) })
429
+ /* @__PURE__ */ jsx(Field, { label: "Knoplink", children: /* @__PURE__ */ jsx(LinkVeld, { siteId, value: block.buttonHref ?? "", onChange: (buttonHref) => patch(block, onChange, { buttonHref }) }) })
351
430
  ] })
352
431
  ] });
353
432
  }
@@ -355,14 +434,11 @@ function VideoEditor({ block, siteId, onChange }) {
355
434
  return /* @__PURE__ */ jsxs("div", { className: "grid gap-3", children: [
356
435
  /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-2", children: [
357
436
  /* @__PURE__ */ jsx(Field, { label: "Bron", children: /* @__PURE__ */ jsx(Select, { value: block.provider ?? "youtube", onValueChange: (v) => patch(block, onChange, { provider: v }), options: [{ value: "youtube", label: "YouTube" }, { value: "vimeo", label: "Vimeo" }, { value: "file", label: "MP4/WebM-URL" }] }) }),
358
- /* @__PURE__ */ jsx(Field, { label: "Id of URL", children: /* @__PURE__ */ jsx(Input, { value: block.src ?? "", onChange: (e) => patch(block, onChange, { src: e.target.value }) }) })
437
+ /* @__PURE__ */ jsx(Field, { label: "Link naar de video", hint: "Plak het adres van de video (YouTube of Vimeo).", children: /* @__PURE__ */ jsx(Input, { value: block.src ?? "", onChange: (e) => patch(block, onChange, { src: e.target.value }) }) })
359
438
  ] }),
360
439
  /* @__PURE__ */ jsx(Field, { label: "Bijschrift (optioneel)", children: /* @__PURE__ */ jsx(Input, { value: block.caption ?? "", onChange: (e) => patch(block, onChange, { caption: e.target.value }) }) }),
361
- /* @__PURE__ */ jsx(Field, { label: "Voorvertoningsbeeld (optioneel)", children: /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
362
- /* @__PURE__ */ jsx(Input, { value: block.posterUrl ?? "", onChange: (e) => patch(block, onChange, { posterUrl: e.target.value || void 0 }), placeholder: "URL of upload \u2192" }),
363
- /* @__PURE__ */ jsx(ImageUploadButton, { siteId, onUploaded: (url) => patch(block, onChange, { posterUrl: url }) })
364
- ] }) }),
365
- /* @__PURE__ */ jsx(ToggleField, { label: "Pas tonen na cookie-toestemming", checked: block.consentGated !== false, onChange: (v) => patch(block, onChange, { consentGated: v }) }),
440
+ /* @__PURE__ */ jsx(Field, { label: "Voorvertoningsbeeld (optioneel)", children: /* @__PURE__ */ jsx(ImageField, { siteId, value: block.posterUrl, onChange: (url) => patch(block, onChange, { posterUrl: url }) }) }),
441
+ /* @__PURE__ */ jsx(ToestemmingSchakelaar, { block, onChange }),
366
442
  /* @__PURE__ */ jsx(ToggleField, { label: "Click-to-play (speler laadt pas na klik \u2014 sneller & privacyvriendelijker)", checked: Boolean(block.facade), onChange: (v) => patch(block, onChange, { facade: v }) })
367
443
  ] });
368
444
  }
@@ -403,7 +479,7 @@ function ContactEditor({ block, siteId, onChange }) {
403
479
  onChange: (geo) => patch(block, onChange, { geo })
404
480
  }
405
481
  ),
406
- /* @__PURE__ */ jsx(ToggleField, { label: "JSON-LD (LocalBusiness)", checked: Boolean(block.jsonLd), onChange: (v) => patch(block, onChange, { jsonLd: v }) })
482
+ /* @__PURE__ */ jsx(ToggleField, { label: "Bedrijfsgegevens doorgeven aan Google (aanbevolen)", checked: Boolean(block.jsonLd), onChange: (v) => patch(block, onChange, { jsonLd: v }) })
407
483
  ] });
408
484
  }
409
485
  function MapCoordField({ block, onChange }) {
@@ -438,11 +514,11 @@ function MapEditor({ block, siteId, onChange }) {
438
514
  /* @__PURE__ */ jsx(Field, { label: "Aanbieder", children: /* @__PURE__ */ jsx(Select, { value: block.provider ?? "osm", onValueChange: (v) => patch(block, onChange, { provider: v }), options: [{ value: "osm", label: "OpenStreetMap (co\xF6rdinaten)" }, { value: "google", label: "Google (embed-URL)" }] }) }),
439
515
  /* @__PURE__ */ jsx(Field, { label: "Hoogte (px)", children: /* @__PURE__ */ jsx(Input, { type: "number", value: String(block.height ?? 360), onChange: (e) => patch(block, onChange, { height: Math.max(150, Math.min(800, Number(e.target.value) || 360)) }) }) })
440
516
  ] }),
441
- isGoogle ? /* @__PURE__ */ jsx(Field, { label: "Embed-URL", children: /* @__PURE__ */ jsx(Input, { value: block.query ?? "", onChange: (e) => patch(block, onChange, { query: e.target.value }) }) }) : /* @__PURE__ */ jsxs(Fragment, { children: [
517
+ isGoogle ? /* @__PURE__ */ jsx(Field, { label: "Link (om in te sluiten)", children: /* @__PURE__ */ jsx(Input, { value: block.query ?? "", onChange: (e) => patch(block, onChange, { query: e.target.value }) }) }) : /* @__PURE__ */ jsxs(Fragment, { children: [
442
518
  /* @__PURE__ */ jsx(MapCoordField, { block, siteId, onChange }),
443
519
  /* @__PURE__ */ jsx(Field, { label: "Zoom (1\u201320)", children: /* @__PURE__ */ jsx(Input, { type: "number", value: String(block.zoom ?? 14), onChange: (e) => patch(block, onChange, { zoom: Math.max(1, Math.min(20, Number(e.target.value) || 14)) }) }) })
444
520
  ] }),
445
- /* @__PURE__ */ jsx(ToggleField, { label: "Pas tonen na cookie-toestemming", checked: block.consentGated !== false, onChange: (v) => patch(block, onChange, { consentGated: v }) })
521
+ /* @__PURE__ */ jsx(ToestemmingSchakelaar, { block, onChange })
446
522
  ] });
447
523
  }
448
524
  function NewsletterEditor({ block, siteId, onChange }) {
@@ -453,7 +529,7 @@ function NewsletterEditor({ block, siteId, onChange }) {
453
529
  let cancelled = false;
454
530
  void getDocs(collection(db, "sites", siteId, "forms")).then((snap) => {
455
531
  if (!cancelled) setForms(snap.docs.map((d) => ({ id: d.id, name: String(d.data().name ?? d.id) })));
456
- });
532
+ }).catch((e) => console.warn("[xicms] lezen mislukt:", e.message));
457
533
  return () => {
458
534
  cancelled = true;
459
535
  };
@@ -512,13 +588,17 @@ function BookingEditor({ block, siteId, onChange }) {
512
588
  { value: "treatwell", label: "Treatwell" },
513
589
  { value: "salonized", label: "Salonized" },
514
590
  { value: "tablebooker", label: "Tablebooker" },
515
- { value: "bookingkit", label: "bookingkit" }
591
+ { value: "bookingkit", label: "bookingkit" },
592
+ { value: "lodgify", label: "Lodgify (verhuur)" },
593
+ { value: "bookingexperts", label: "Booking Experts (verhuur)" },
594
+ { value: "tommy", label: "Tommy (verhuur)" },
595
+ { value: "bookingmotor", label: "Bookingmotor (verhuur)" }
516
596
  ]
517
597
  }
518
598
  ) }),
519
- /* @__PURE__ */ jsx(Field, { label: "Embed-URL of account-naam", hint: "Volledige link \xF3f alleen je slug/id \u2014 de provider-keuze bouwt er de juiste embed van.", children: /* @__PURE__ */ jsx(Input, { value: block.embedUrl ?? "", onChange: (e) => patch(block, onChange, { embedUrl: e.target.value }), placeholder: "https://calendly.com/jouw-naam/intake \u2014 of: jouw-naam/intake" }) }),
599
+ /* @__PURE__ */ jsx(Field, { label: "Link of accountnaam", hint: "De volledige link naar je boekingspagina, of alleen je accountnaam.", children: /* @__PURE__ */ jsx(Input, { value: block.embedUrl ?? "", onChange: (e) => patch(block, onChange, { embedUrl: e.target.value }), placeholder: "https://calendly.com/jouw-naam/intake \u2014 of: jouw-naam/intake" }) }),
520
600
  /* @__PURE__ */ jsx(Field, { label: "Hoogte (px)", children: /* @__PURE__ */ jsx(Input, { type: "number", value: String(block.height ?? 630), onChange: (e) => patch(block, onChange, { height: Math.max(300, Math.min(1200, Number(e.target.value) || 630)) }) }) }),
521
- /* @__PURE__ */ jsx(ToggleField, { label: "Pas tonen na cookie-toestemming", checked: block.consentGated !== false, onChange: (v) => patch(block, onChange, { consentGated: v }) })
601
+ /* @__PURE__ */ jsx(ToestemmingSchakelaar, { block, onChange })
522
602
  ] });
523
603
  }
524
604
  function AccordionEditor({ block, siteId, onChange }) {
@@ -562,7 +642,7 @@ function EmbedEditor({ block, onChange }) {
562
642
  ]
563
643
  }
564
644
  ) }),
565
- /* @__PURE__ */ jsx(ToggleField, { label: "Pas tonen na cookie-toestemming", checked: block.consentGated !== false, onChange: (v) => patch(block, onChange, { consentGated: v }) })
645
+ /* @__PURE__ */ jsx(ToestemmingSchakelaar, { block, onChange })
566
646
  ] });
567
647
  }
568
648
  function nestKey() {
@@ -619,7 +699,7 @@ function NestedBlocksEditor({
619
699
  open && /* @__PURE__ */ jsx("div", { className: "border-t border-slate-100 p-2", children: /* @__PURE__ */ jsx(Editor, { block: b, siteId, onChange: (next) => onChange(list.map((x, j) => j === i ? next : x)) }) })
620
700
  ] }, b._key ?? i);
621
701
  }),
622
- list.length === 0 && /* @__PURE__ */ jsx("p", { className: "text-xs text-slate-400", children: "Nog geen blokken." }),
702
+ list.length === 0 && /* @__PURE__ */ jsx("p", { className: "text-xs text-slate-500", children: "Nog geen blokken." }),
623
703
  /* @__PURE__ */ jsx(Select, { value: "", placeholder: addLabel, onValueChange: (v) => v && add(v), options: addOptions })
624
704
  ] });
625
705
  }
@@ -767,13 +847,10 @@ function SliderEditor({ block, siteId, onChange }) {
767
847
  newItem: () => ({ imageUrl: "", alt: "", caption: "" }),
768
848
  addLabel: "+ Slide",
769
849
  renderRow: (it, update, i) => /* @__PURE__ */ jsxs("div", { className: "grid gap-2", children: [
770
- /* @__PURE__ */ jsx(Field, { label: `Afbeelding ${i + 1}`, children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
771
- /* @__PURE__ */ jsx(Input, { value: it.imageUrl ?? "", onChange: (e) => update({ imageUrl: e.target.value }), placeholder: "URL of upload \u2192" }),
772
- /* @__PURE__ */ jsx(ImageUploadButton, { siteId, onUploaded: (url) => update({ imageUrl: url }) }, i)
773
- ] }) }),
850
+ /* @__PURE__ */ jsx(Field, { label: `Afbeelding ${i + 1}`, children: /* @__PURE__ */ jsx(ImageField, { siteId, value: it.imageUrl, onChange: (url) => update({ imageUrl: url }) }) }),
774
851
  /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-2", children: [
775
852
  /* @__PURE__ */ jsx(Input, { value: it.alt ?? "", placeholder: "Alt-tekst", onChange: (e) => update({ alt: e.target.value }) }),
776
- /* @__PURE__ */ jsx(Input, { value: it.href ?? "", placeholder: "Link (optioneel)", onChange: (e) => update({ href: e.target.value }) })
853
+ /* @__PURE__ */ jsx(LinkVeld, { siteId, value: it.href ?? "", onChange: (href) => update({ href }), leegTekst: "Geen link (optioneel)" })
777
854
  ] }),
778
855
  /* @__PURE__ */ jsx(Input, { value: it.caption ?? "", placeholder: "Bijschrift (optioneel)", onChange: (e) => update({ caption: e.target.value }) })
779
856
  ] })
@@ -874,15 +951,15 @@ function NewsletterWidgetEditor({ block, onChange }) {
874
951
  ] })
875
952
  ] });
876
953
  }
877
- function CtaWidgetEditor({ block, onChange }) {
954
+ function CtaWidgetEditor({ block, siteId, onChange }) {
878
955
  return /* @__PURE__ */ jsxs("div", { className: "grid gap-3", children: [
879
956
  /* @__PURE__ */ jsx(Field, { label: "Titel", children: /* @__PURE__ */ jsx(Input, { value: block.title ?? "", onChange: (e) => patch(block, onChange, { title: e.target.value }) }) }),
880
957
  /* @__PURE__ */ jsx(Field, { label: "Tekst", children: /* @__PURE__ */ jsx(Input, { value: block.text ?? "", onChange: (e) => patch(block, onChange, { text: e.target.value }) }) }),
881
958
  /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-2", children: [
882
959
  /* @__PURE__ */ jsx(Field, { label: "Knoptekst", children: /* @__PURE__ */ jsx(Input, { value: block.buttonLabel ?? "", onChange: (e) => patch(block, onChange, { buttonLabel: e.target.value }) }) }),
883
- /* @__PURE__ */ jsx(Field, { label: "Knoplink", children: /* @__PURE__ */ jsx(Input, { value: block.buttonHref ?? "", onChange: (e) => patch(block, onChange, { buttonHref: e.target.value }) }) })
960
+ /* @__PURE__ */ jsx(Field, { label: "Knoplink", children: /* @__PURE__ */ jsx(LinkVeld, { siteId, value: block.buttonHref ?? "", onChange: (buttonHref) => patch(block, onChange, { buttonHref }) }) })
884
961
  ] }),
885
- /* @__PURE__ */ jsx(Field, { label: "Achtergrondkleur (optioneel)", children: /* @__PURE__ */ jsx(Input, { value: block.backgroundColor ?? "", onChange: (e) => patch(block, onChange, { backgroundColor: e.target.value }), placeholder: "#f5f5f5" }) })
962
+ /* @__PURE__ */ jsx(KleurVeld, { label: "Achtergrondkleur (optioneel)", value: block.backgroundColor ?? "", placeholder: "#f5f5f5", onChange: (backgroundColor) => patch(block, onChange, { backgroundColor }) })
886
963
  ] });
887
964
  }
888
965
  function GalleryWidgetEditor({ block, siteId, onChange }) {
@@ -898,10 +975,7 @@ function GalleryWidgetEditor({ block, siteId, onChange }) {
898
975
  newItem: () => ({ url: "", alt: "" }),
899
976
  addLabel: "+ Foto",
900
977
  renderRow: (it, update, i) => /* @__PURE__ */ jsxs("div", { className: "grid gap-2", children: [
901
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
902
- /* @__PURE__ */ jsx(Input, { value: it.url ?? "", onChange: (e) => update({ url: e.target.value }), placeholder: "URL of upload \u2192" }),
903
- /* @__PURE__ */ jsx(ImageUploadButton, { siteId, onUploaded: (url) => update({ url }) }, i)
904
- ] }),
978
+ /* @__PURE__ */ jsx(ImageField, { siteId, value: it.url, onChange: (url) => update({ url }) }),
905
979
  /* @__PURE__ */ jsx(Input, { value: it.alt ?? "", placeholder: "Alt-tekst", onChange: (e) => update({ alt: e.target.value }) })
906
980
  ] })
907
981
  }
@@ -930,7 +1004,7 @@ function TestimonialsWidgetEditor({ block, onChange }) {
930
1004
  )
931
1005
  ] });
932
1006
  }
933
- function CardsWidgetEditor({ block, onChange }) {
1007
+ function CardsWidgetEditor({ block, siteId, onChange }) {
934
1008
  const items = block.items ?? [];
935
1009
  return /* @__PURE__ */ jsxs("div", { className: "grid gap-3", children: [
936
1010
  /* @__PURE__ */ jsx(Field, { label: "Kop", children: /* @__PURE__ */ jsx(Input, { value: block.heading ?? "", onChange: (e) => patch(block, onChange, { heading: e.target.value }) }) }),
@@ -947,7 +1021,7 @@ function CardsWidgetEditor({ block, onChange }) {
947
1021
  /* @__PURE__ */ jsx(Input, { value: it.title, placeholder: "Titel", onChange: (e) => update({ title: e.target.value }) })
948
1022
  ] }),
949
1023
  /* @__PURE__ */ jsx(Input, { value: it.text ?? "", placeholder: "Korte tekst", onChange: (e) => update({ text: e.target.value }) }),
950
- /* @__PURE__ */ jsx(Input, { value: it.href ?? "", placeholder: "Link (optioneel)", onChange: (e) => update({ href: e.target.value }) })
1024
+ /* @__PURE__ */ jsx(LinkVeld, { siteId, value: it.href ?? "", onChange: (href) => update({ href }), leegTekst: "Geen link (optioneel)" })
951
1025
  ] })
952
1026
  }
953
1027
  )
@@ -1023,6 +1097,13 @@ const builtinBlockEditors = {
1023
1097
  downloadsWidget: DownloadsWidgetEditor,
1024
1098
  countdownWidget: CountdownWidgetEditor
1025
1099
  };
1100
+ function ToestemmingSchakelaar({ block, onChange }) {
1101
+ const superadmin = useIsSuperadmin();
1102
+ if (!superadmin) {
1103
+ return block.consentGated === false ? /* @__PURE__ */ jsx("p", { className: "text-xs text-amber-700", children: "Dit blok laadt zonder cookie-toestemming (ingesteld door Xi Webdesign)." }) : /* @__PURE__ */ jsx("p", { className: "text-xs text-slate-500", children: "Bezoekers zien dit pas na hun cookie-toestemming \u2014 zo blijft de site AVG-proof." });
1104
+ }
1105
+ return /* @__PURE__ */ jsx(ToggleField, { label: "Pas tonen na cookie-toestemming", checked: block.consentGated !== false, onChange: (v) => patch(block, onChange, { consentGated: v }) });
1106
+ }
1026
1107
  export {
1027
1108
  GenericEditor,
1028
1109
  NestedBlocksEditor,