@xiwebdesign/xicms-core 7.30.0 → 8.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (463) hide show
  1. package/dist/XiCMSProvider.js +22 -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 -56
  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 +247 -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 +144 -0
  133. package/dist/admin/settings/BedrijfInstellingen.js.map +1 -0
  134. package/dist/admin/settings/MailSettings.js +2 -2
  135. package/dist/admin/settings/MailSettings.js.map +1 -1
  136. package/dist/admin/settings/MailTemplates.js +5 -4
  137. package/dist/admin/settings/MailTemplates.js.map +1 -1
  138. package/dist/admin/settings/SettingsPanel.js +120 -78
  139. package/dist/admin/settings/SettingsPanel.js.map +1 -1
  140. package/dist/admin/settings/SnapshotsCard.js +4 -4
  141. package/dist/admin/settings/SnapshotsCard.js.map +1 -1
  142. package/dist/admin/settings/VorigeTerugzetten.d.ts +15 -0
  143. package/dist/admin/settings/VorigeTerugzetten.js +89 -0
  144. package/dist/admin/settings/VorigeTerugzetten.js.map +1 -0
  145. package/dist/admin/shop/CategoriesTab.js +6 -4
  146. package/dist/admin/shop/CategoriesTab.js.map +1 -1
  147. package/dist/admin/shop/DiscountsTab.js +4 -2
  148. package/dist/admin/shop/DiscountsTab.js.map +1 -1
  149. package/dist/admin/shop/OrdersTab.js +57 -19
  150. package/dist/admin/shop/OrdersTab.js.map +1 -1
  151. package/dist/admin/shop/ProductPaneel.js +2 -1
  152. package/dist/admin/shop/ProductPaneel.js.map +1 -1
  153. package/dist/admin/shop/ProductsTab.js +40 -19
  154. package/dist/admin/shop/ProductsTab.js.map +1 -1
  155. package/dist/admin/shop/ShopPanel.js +13 -1
  156. package/dist/admin/shop/ShopPanel.js.map +1 -1
  157. package/dist/admin/shop/ShopSettingsTab.js +27 -1
  158. package/dist/admin/shop/ShopSettingsTab.js.map +1 -1
  159. package/dist/admin/shop/productClient.js +7 -3
  160. package/dist/admin/shop/productClient.js.map +1 -1
  161. package/dist/admin/stats/NietGevonden.d.ts +10 -0
  162. package/dist/admin/stats/NietGevonden.js +78 -0
  163. package/dist/admin/stats/NietGevonden.js.map +1 -0
  164. package/dist/admin/stats/StatsPanel.js +6 -1
  165. package/dist/admin/stats/StatsPanel.js.map +1 -1
  166. package/dist/admin/stats/lib.d.ts +2 -0
  167. package/dist/admin/stats/lib.js.map +1 -1
  168. package/dist/admin/ui/ConfirmDialog.js +10 -1
  169. package/dist/admin/ui/ConfirmDialog.js.map +1 -1
  170. package/dist/admin/ui/Icon.d.ts +34 -0
  171. package/dist/admin/ui/Icon.js +44 -0
  172. package/dist/admin/ui/Icon.js.map +1 -0
  173. package/dist/admin/ui/ImageField.d.ts +15 -0
  174. package/dist/admin/ui/ImageField.js +67 -0
  175. package/dist/admin/ui/ImageField.js.map +1 -0
  176. package/dist/admin/ui/KleurVeld.d.ts +25 -0
  177. package/dist/admin/ui/KleurVeld.js +76 -0
  178. package/dist/admin/ui/KleurVeld.js.map +1 -0
  179. package/dist/admin/ui/LaadStaat.d.ts +21 -0
  180. package/dist/admin/ui/LaadStaat.js +43 -0
  181. package/dist/admin/ui/LaadStaat.js.map +1 -0
  182. package/dist/admin/ui/LeesbaarheidPaneel.d.ts +10 -0
  183. package/dist/admin/ui/LeesbaarheidPaneel.js +68 -0
  184. package/dist/admin/ui/LeesbaarheidPaneel.js.map +1 -0
  185. package/dist/admin/ui/LinkDialog.d.ts +22 -0
  186. package/dist/admin/ui/LinkDialog.js +131 -0
  187. package/dist/admin/ui/LinkDialog.js.map +1 -0
  188. package/dist/admin/ui/LinkVeld.d.ts +14 -0
  189. package/dist/admin/ui/LinkVeld.js +49 -0
  190. package/dist/admin/ui/LinkVeld.js.map +1 -0
  191. package/dist/admin/ui/PreviewLinkResultaat.d.ts +14 -0
  192. package/dist/admin/ui/PreviewLinkResultaat.js +52 -0
  193. package/dist/admin/ui/PreviewLinkResultaat.js.map +1 -0
  194. package/dist/admin/ui/charts.js +5 -5
  195. package/dist/admin/ui/charts.js.map +1 -1
  196. package/dist/admin/ui/primitives.d.ts +16 -6
  197. package/dist/admin/ui/primitives.js +98 -26
  198. package/dist/admin/ui/primitives.js.map +1 -1
  199. package/dist/admin/ui/select.js +5 -2
  200. package/dist/admin/ui/select.js.map +1 -1
  201. package/dist/admin/ui/switch.d.ts +3 -1
  202. package/dist/admin/ui/switch.js +6 -3
  203. package/dist/admin/ui/switch.js.map +1 -1
  204. package/dist/admin/ui/toast.d.ts +2 -1
  205. package/dist/admin/ui/toast.js +17 -11
  206. package/dist/admin/ui/toast.js.map +1 -1
  207. package/dist/admin/visual/BlokKiezer.d.ts +34 -0
  208. package/dist/admin/visual/BlokKiezer.js +225 -0
  209. package/dist/admin/visual/BlokKiezer.js.map +1 -0
  210. package/dist/admin/visual/InlineGereedschap.d.ts +52 -0
  211. package/dist/admin/visual/InlineGereedschap.js +356 -0
  212. package/dist/admin/visual/InlineGereedschap.js.map +1 -0
  213. package/dist/admin/visual/InlineRijkeTekst.d.ts +23 -0
  214. package/dist/admin/visual/InlineRijkeTekst.js +152 -0
  215. package/dist/admin/visual/InlineRijkeTekst.js.map +1 -0
  216. package/dist/admin/visual/VisualEditor.js +273 -125
  217. package/dist/admin/visual/VisualEditor.js.map +1 -1
  218. package/dist/admin.css +1 -1
  219. package/dist/bedrijf/bedrijf.d.ts +36 -0
  220. package/dist/bedrijf/bedrijf.js +110 -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 +29 -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 +1 -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/index.d.ts +3 -0
  309. package/dist/blocks/builtins/index.js +6 -0
  310. package/dist/blocks/builtins/index.js.map +1 -1
  311. package/dist/blocks/builtins/lib/autoComplete.d.ts +7 -0
  312. package/dist/blocks/builtins/lib/autoComplete.js +20 -0
  313. package/dist/blocks/builtins/lib/autoComplete.js.map +1 -0
  314. package/dist/blocks/builtins/lib/bookingUrl.d.ts +2 -2
  315. package/dist/blocks/builtins/lib/bookingUrl.js +1 -1
  316. package/dist/blocks/builtins/lib/bookingUrl.js.map +1 -1
  317. package/dist/blocks/builtins/lib/ical.d.ts +24 -0
  318. package/dist/blocks/builtins/lib/ical.js +82 -0
  319. package/dist/blocks/builtins/lib/ical.js.map +1 -0
  320. package/dist/blocks/builtins/lib/vandaag.d.ts +8 -0
  321. package/dist/blocks/builtins/lib/vandaag.js +22 -0
  322. package/dist/blocks/builtins/lib/vandaag.js.map +1 -0
  323. package/dist/blocks/registry.d.ts +6 -0
  324. package/dist/blocks/registry.js.map +1 -1
  325. package/dist/blocks/ui/index.js +1 -0
  326. package/dist/blocks/ui/index.js.map +1 -1
  327. package/dist/components/EditBar.js +2 -4
  328. package/dist/components/EditBar.js.map +1 -1
  329. package/dist/components/News.js +26 -18
  330. package/dist/components/News.js.map +1 -1
  331. package/dist/components/PageView.d.ts +7 -1
  332. package/dist/components/PageView.js +17 -0
  333. package/dist/components/PageView.js.map +1 -1
  334. package/dist/components/ResponsiveImage.js +18 -20
  335. package/dist/components/ResponsiveImage.js.map +1 -1
  336. package/dist/components/site/SiteFooter.d.ts +6 -1
  337. package/dist/components/site/SiteFooter.js +61 -9
  338. package/dist/components/site/SiteFooter.js.map +1 -1
  339. package/dist/components/site/SiteHeader.d.ts +15 -0
  340. package/dist/components/site/SiteHeader.js +70 -0
  341. package/dist/components/site/SiteHeader.js.map +1 -0
  342. package/dist/components/site/SiteNav.d.ts +2 -0
  343. package/dist/components/site/SiteNav.js +29 -5
  344. package/dist/components/site/SiteNav.js.map +1 -1
  345. package/dist/demo/DemoStudio.js +2 -2
  346. package/dist/demo/DemoStudio.js.map +1 -1
  347. package/dist/demo/demoStore.d.ts +13 -0
  348. package/dist/demo/demoStore.js +36 -0
  349. package/dist/demo/demoStore.js.map +1 -1
  350. package/dist/editor/EditorProvider.js +15 -4
  351. package/dist/editor/EditorProvider.js.map +1 -1
  352. package/dist/index.d.ts +4 -1
  353. package/dist/index.js +16 -1
  354. package/dist/index.js.map +1 -1
  355. package/dist/media/ImageContext.d.ts +17 -0
  356. package/dist/media/ImageContext.js +65 -20
  357. package/dist/media/ImageContext.js.map +1 -1
  358. package/dist/media/altInHtml.d.ts +9 -0
  359. package/dist/media/altInHtml.js +17 -0
  360. package/dist/media/altInHtml.js.map +1 -0
  361. package/dist/media/srcset.d.ts +12 -0
  362. package/dist/media/srcset.js +13 -0
  363. package/dist/media/srcset.js.map +1 -0
  364. package/dist/modules/builtins.d.ts +1 -0
  365. package/dist/modules/builtins.js +16 -3
  366. package/dist/modules/builtins.js.map +1 -1
  367. package/dist/modules/shop/blocks/Cart.js +5 -3
  368. package/dist/modules/shop/blocks/Cart.js.map +1 -1
  369. package/dist/modules/shop/blocks/Checkout.js +56 -35
  370. package/dist/modules/shop/blocks/Checkout.js.map +1 -1
  371. package/dist/modules/shop/blocks/Donation.js +4 -4
  372. package/dist/modules/shop/blocks/Donation.js.map +1 -1
  373. package/dist/modules/shop/blocks/ProductDetail.js +19 -3
  374. package/dist/modules/shop/blocks/ProductDetail.js.map +1 -1
  375. package/dist/modules/shop/blocks/ProductGrid.d.ts +3 -1
  376. package/dist/modules/shop/blocks/ProductGrid.js +8 -4
  377. package/dist/modules/shop/blocks/ProductGrid.js.map +1 -1
  378. package/dist/modules/shop/blocks/ShopCategories.js +4 -3
  379. package/dist/modules/shop/blocks/ShopCategories.js.map +1 -1
  380. package/dist/modules/shop/lib.d.ts +4 -0
  381. package/dist/modules/shop/lib.js +14 -0
  382. package/dist/modules/shop/lib.js.map +1 -1
  383. package/dist/modules/shop/settings.d.ts +3 -0
  384. package/dist/modules/shop/settings.js +14 -0
  385. package/dist/modules/shop/settings.js.map +1 -1
  386. package/dist/modules/shop/strings.d.ts +4 -0
  387. package/dist/modules/shop/strings.js +8 -0
  388. package/dist/modules/shop/strings.js.map +1 -1
  389. package/dist/next/envCheck.d.ts +42 -0
  390. package/dist/next/envCheck.js +106 -0
  391. package/dist/next/envCheck.js.map +1 -0
  392. package/dist/next/index.cjs +185 -2
  393. package/dist/next/index.d.ts +2 -0
  394. package/dist/next/index.js +8 -1
  395. package/dist/next/index.js.map +1 -1
  396. package/dist/next/securityHeaders.d.ts +36 -0
  397. package/dist/next/securityHeaders.js +74 -0
  398. package/dist/next/securityHeaders.js.map +1 -0
  399. package/dist/patterns/builtins.d.ts +7 -0
  400. package/dist/patterns/builtins.js +138 -3
  401. package/dist/patterns/builtins.js.map +1 -1
  402. package/dist/releaseNotes.js +140 -0
  403. package/dist/releaseNotes.js.map +1 -1
  404. package/dist/render/PublishedPage.d.ts +2 -1
  405. package/dist/render/PublishedPage.js +10 -4
  406. package/dist/render/PublishedPage.js.map +1 -1
  407. package/dist/schema/blocks.d.ts +470 -0
  408. package/dist/schema/blocks.js +102 -4
  409. package/dist/schema/blocks.js.map +1 -1
  410. package/dist/schema/business.d.ts +117 -0
  411. package/dist/schema/business.js +73 -0
  412. package/dist/schema/business.js.map +1 -0
  413. package/dist/schema/fields.d.ts +2 -1
  414. package/dist/schema/fields.js.map +1 -1
  415. package/dist/schema/forms.d.ts +18 -0
  416. package/dist/schema/forms.js +18 -3
  417. package/dist/schema/forms.js.map +1 -1
  418. package/dist/schema/mail.d.ts +10 -0
  419. package/dist/schema/mail.js +7 -0
  420. package/dist/schema/mail.js.map +1 -1
  421. package/dist/schema/settings.d.ts +101 -0
  422. package/dist/schema/settings.js +24 -3
  423. package/dist/schema/settings.js.map +1 -1
  424. package/dist/schema/shop.d.ts +2 -0
  425. package/dist/schema/shop.js +4 -0
  426. package/dist/schema/shop.js.map +1 -1
  427. package/dist/schema/shopGeld.d.ts +1 -0
  428. package/dist/schema/shopGeld.js +1 -0
  429. package/dist/schema/shopGeld.js.map +1 -1
  430. package/dist/schema/siteConfig.d.ts +68 -1
  431. package/dist/schema/siteConfig.js +7 -2
  432. package/dist/schema/siteConfig.js.map +1 -1
  433. package/dist/server/blockData.d.ts +1 -1
  434. package/dist/server/blockData.js +74 -18
  435. package/dist/server/blockData.js.map +1 -1
  436. package/dist/server/cspRapport.d.ts +20 -0
  437. package/dist/server/cspRapport.js +56 -0
  438. package/dist/server/cspRapport.js.map +1 -0
  439. package/dist/server/fonts.d.ts +3 -0
  440. package/dist/server/fonts.js +39 -0
  441. package/dist/server/fonts.js.map +1 -0
  442. package/dist/server/index.d.ts +3 -0
  443. package/dist/server/index.js +8 -0
  444. package/dist/server/index.js.map +1 -1
  445. package/dist/server/sanitize.js +15 -2
  446. package/dist/server/sanitize.js.map +1 -1
  447. package/dist/settings/useSiteSettings.js +4 -1
  448. package/dist/settings/useSiteSettings.js.map +1 -1
  449. package/dist/starters/starters.d.ts +69 -0
  450. package/dist/starters/starters.js +171 -0
  451. package/dist/starters/starters.js.map +1 -0
  452. package/dist/styles.css +1149 -208
  453. package/dist/theme/color.d.ts +10 -0
  454. package/dist/theme/color.js +17 -1
  455. package/dist/theme/color.js.map +1 -1
  456. package/dist/theme/fontFallback.d.ts +23 -0
  457. package/dist/theme/fontFallback.js +58 -0
  458. package/dist/theme/fontFallback.js.map +1 -0
  459. package/dist/theme/fonts.d.ts +11 -0
  460. package/dist/theme/fonts.js +16 -0
  461. package/dist/theme/fonts.js.map +1 -0
  462. package/dist/version.js +1 -1
  463. package/package.json +6 -4
@@ -0,0 +1,356 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useMemo, useState } from "react";
4
+ import { introspectToFields } from "../lib/zodFields.js";
5
+ import { itemNaam, vertaalVelden, TECHNISCHE_VELDEN } from "../lib/veldTaal.js";
6
+ import { LinkDialog } from "../ui/LinkDialog.js";
7
+ function veiligeBovenkant() {
8
+ let onder = 0;
9
+ for (const el of Array.from(document.querySelectorAll("header, [class*='header'], [class*='nav'], body > div > *"))) {
10
+ const pos = getComputedStyle(el).position;
11
+ if (pos !== "fixed" && pos !== "sticky") continue;
12
+ if (el.closest("[data-xicms-tooling], .xicms-ve")) continue;
13
+ const r = el.getBoundingClientRect();
14
+ if (r.height === 0 || r.top > 4 || r.height > window.innerHeight / 3) continue;
15
+ onder = Math.max(onder, r.bottom);
16
+ }
17
+ return onder;
18
+ }
19
+ function rect(el) {
20
+ const r = el.getBoundingClientRect();
21
+ return { top: r.top, left: r.left, width: r.width, height: r.height };
22
+ }
23
+ function zelfde(a, b) {
24
+ return !!a && !!b && a.top === b.top && a.left === b.left && a.width === b.width && a.height === b.height;
25
+ }
26
+ function gemeenschappelijk(els, grens) {
27
+ let kand = els[0];
28
+ while (kand && kand !== grens && !els.every((e) => kand.contains(e))) kand = kand.parentElement;
29
+ return kand ?? grens;
30
+ }
31
+ function vindLijstItems(host) {
32
+ const perItem = /* @__PURE__ */ new Map();
33
+ for (const el of Array.from(host.querySelectorAll("[data-xicms-edit]"))) {
34
+ const pad = el.dataset.xicmsEdit ?? "";
35
+ const re = /\.(\d+)\./g;
36
+ let m;
37
+ while (m = re.exec(pad)) {
38
+ const lijst = pad.slice(0, m.index);
39
+ if (!/^[A-Za-z]/.test(lijst)) continue;
40
+ const sleutel = `${lijst}|${m[1]}`;
41
+ perItem.set(sleutel, [...perItem.get(sleutel) ?? [], el]);
42
+ re.lastIndex = m.index + 1;
43
+ }
44
+ }
45
+ const uit = [];
46
+ for (const [sleutel, els] of perItem) {
47
+ const [lijst, idx] = sleutel.split("|");
48
+ const anderen = [...perItem].filter(([k]) => k !== sleutel && k.startsWith(`${lijst}|`)).flatMap(([, v]) => v);
49
+ let el = gemeenschappelijk(els, host);
50
+ while (el.parentElement && el.parentElement !== host && !anderen.some((a) => el.parentElement.contains(a))) {
51
+ if (el.parentElement.hasAttribute("data-xicms-block")) break;
52
+ el = el.parentElement;
53
+ }
54
+ uit.push({ lijst, index: Number(idx), el });
55
+ }
56
+ return uit.sort((a, b) => a.lijst === b.lijst ? a.index - b.index : a.lijst.localeCompare(b.lijst));
57
+ }
58
+ function lijstVorm(lijst) {
59
+ return lijst.replace(/\.\d+(?=\.|$)/g, "");
60
+ }
61
+ function linkVeldVoor(veld, blok) {
62
+ const kandidaten = [];
63
+ if (/(^|\.)label$/.test(veld)) kandidaten.push(veld.replace(/label$/, "href"));
64
+ if (/(^|\.)linkLabel$/.test(veld)) kandidaten.push(veld.replace(/linkLabel$/, "href"));
65
+ if (/Label$/.test(veld)) kandidaten.push(veld.replace(/Label$/, "Href"));
66
+ for (const k of kandidaten) {
67
+ const waarde = k.split(".").reduce((o, s) => o == null ? void 0 : o[s], blok);
68
+ if (waarde !== void 0) return k;
69
+ }
70
+ return null;
71
+ }
72
+ function haal(o, pad) {
73
+ return pad.split(".").reduce((x, k) => x == null ? void 0 : x[k], o);
74
+ }
75
+ function zet(o, pad, waarde) {
76
+ const delen = pad.split(".");
77
+ const kloon = (v) => Array.isArray(v) ? [...v] : v && typeof v === "object" ? { ...v } : v;
78
+ const wortel = kloon(o);
79
+ let cur = wortel;
80
+ for (let i = 0; i < delen.length - 1; i++) {
81
+ cur[delen[i]] = kloon(cur[delen[i]] ?? {});
82
+ cur = cur[delen[i]];
83
+ }
84
+ cur[delen[delen.length - 1]] = waarde;
85
+ return wortel;
86
+ }
87
+ function snelleKeuzes(velden) {
88
+ const uitgesloten = /jsonLd|consent|dismiss|sticky|^lightbox$|^showDownload$|^includeNews$|^headingLevel$/;
89
+ return velden.filter((f) => !TECHNISCHE_VELDEN.has(f.key) && !uitgesloten.test(f.key)).filter(
90
+ (f) => f.type === "select" && f.options.length >= 2 && f.options.length <= 5 || f.type === "number" && f.min !== void 0 && f.max !== void 0 && f.max - f.min <= 4 && f.key !== "rating"
91
+ ).slice(0, 3);
92
+ }
93
+ function InlineGereedschap({
94
+ blok,
95
+ def,
96
+ siteId,
97
+ onWijzig,
98
+ onInstellingen,
99
+ onStartVeld,
100
+ onVerwijderd
101
+ }) {
102
+ const [host, setHost] = useState(null);
103
+ const [items, setItems] = useState([]);
104
+ const [hover, setHover] = useState(null);
105
+ const [blokRect, setBlokRect] = useState(null);
106
+ const [linkDoel, setLinkDoel] = useState(null);
107
+ const [linkOpen, setLinkOpen] = useState(false);
108
+ const [veilig, setVeilig] = useState(0);
109
+ useEffect(() => {
110
+ const herijk = () => setVeilig(veiligeBovenkant());
111
+ herijk();
112
+ window.addEventListener("resize", herijk);
113
+ return () => window.removeEventListener("resize", herijk);
114
+ }, []);
115
+ const velden = useMemo(() => {
116
+ if (!def?.schema) return [];
117
+ try {
118
+ return vertaalVelden(introspectToFields(def.schema, def.fields), def.type);
119
+ } catch {
120
+ return [];
121
+ }
122
+ }, [def]);
123
+ const keuzes = useMemo(() => snelleKeuzes(velden), [velden]);
124
+ const [gevonden, setGevonden] = useState(null);
125
+ useEffect(() => {
126
+ let pogingen = 0;
127
+ let frame = 0;
128
+ const zoek = () => {
129
+ const el = document.querySelector(`[data-xicms-block="${CSS.escape(blok._key)}"]`);
130
+ if (el) setGevonden(el);
131
+ else if (++pogingen < 120) frame = requestAnimationFrame(zoek);
132
+ };
133
+ zoek();
134
+ return () => cancelAnimationFrame(frame);
135
+ }, [blok._key]);
136
+ useEffect(() => {
137
+ const el = gevonden;
138
+ setHost(el);
139
+ if (!el) return;
140
+ let frame = 0;
141
+ const meet = () => {
142
+ const gevonden2 = vindLijstItems(el).map((it) => ({ lijst: it.lijst, index: it.index, r: rect(it.el) }));
143
+ setItems((v) => v.length === gevonden2.length && v.every((x, i) => x.lijst === gevonden2[i].lijst && x.index === gevonden2[i].index && zelfde(x.r, gevonden2[i].r)) ? v : gevonden2);
144
+ let r = rect(el);
145
+ if (r.width === 0 && r.height === 0) {
146
+ const kids = Array.from(el.children).map(rect).filter((k) => k.width || k.height);
147
+ if (kids.length) {
148
+ const top = Math.min(...kids.map((k) => k.top));
149
+ const left = Math.min(...kids.map((k) => k.left));
150
+ r = { top, left, width: Math.max(...kids.map((k) => k.left + k.width)) - left, height: Math.max(...kids.map((k) => k.top + k.height)) - top };
151
+ }
152
+ }
153
+ setBlokRect((v) => zelfde(v, r) ? v : r);
154
+ };
155
+ const plan = () => {
156
+ cancelAnimationFrame(frame);
157
+ frame = requestAnimationFrame(meet);
158
+ };
159
+ meet();
160
+ const obs = new MutationObserver(plan);
161
+ obs.observe(el, { childList: true, subtree: true, characterData: true });
162
+ window.addEventListener("scroll", plan, { capture: true, passive: true });
163
+ window.addEventListener("resize", plan);
164
+ return () => {
165
+ cancelAnimationFrame(frame);
166
+ obs.disconnect();
167
+ window.removeEventListener("scroll", plan, { capture: true });
168
+ window.removeEventListener("resize", plan);
169
+ };
170
+ }, [gevonden]);
171
+ useEffect(() => {
172
+ if (!host) return;
173
+ const kijk = (doel) => {
174
+ if (!doel) return;
175
+ const it = vindLijstItems(host).filter((x) => x.el.contains(doel)).sort((a, b) => b.lijst.split(".").length - a.lijst.split(".").length)[0];
176
+ setHover(it ? { lijst: it.lijst, index: it.index } : null);
177
+ const veldEl = doel.closest("[data-xicms-edit]");
178
+ const veld = veldEl?.dataset.xicmsEdit;
179
+ const hrefVeld = veld ? linkVeldVoor(veld, blok) : null;
180
+ if (veldEl && veld && hrefVeld) setLinkDoel({ veld, hrefVeld, r: rect(veldEl) });
181
+ };
182
+ const opOver = (e) => kijk(e.target);
183
+ host.addEventListener("mouseover", opOver);
184
+ host.addEventListener("focusin", opOver);
185
+ return () => {
186
+ host.removeEventListener("mouseover", opOver);
187
+ host.removeEventListener("focusin", opOver);
188
+ };
189
+ }, [host, blok]);
190
+ useEffect(() => {
191
+ if (!linkDoel || !host) return;
192
+ const herpositioneer = () => {
193
+ const el = host.querySelector(`[data-xicms-edit="${CSS.escape(linkDoel.veld)}"]`);
194
+ if (!el) return setLinkDoel(null);
195
+ const r = rect(el);
196
+ setLinkDoel((v) => v && !zelfde(v.r, r) ? { ...v, r } : v);
197
+ };
198
+ window.addEventListener("scroll", herpositioneer, { capture: true, passive: true });
199
+ return () => window.removeEventListener("scroll", herpositioneer, { capture: true });
200
+ }, [linkDoel, host]);
201
+ const lijstActie = useCallback(
202
+ (lijst, index, actie) => {
203
+ const arr = [...haal(blok, lijst) ?? []];
204
+ if (actie === "omhoog" && index > 0) [arr[index - 1], arr[index]] = [arr[index], arr[index - 1]];
205
+ else if (actie === "omlaag" && index < arr.length - 1) [arr[index + 1], arr[index]] = [arr[index], arr[index + 1]];
206
+ else if (actie === "dupliceer") arr.splice(index + 1, 0, structuredClone(arr[index]));
207
+ else if (actie === "weg") arr.splice(index, 1);
208
+ else return;
209
+ onWijzig(zet(blok, lijst, arr));
210
+ if (actie === "weg") onVerwijderd(itemNaam(blok._type, lijstVorm(lijst)) ?? "Onderdeel");
211
+ setHover(null);
212
+ },
213
+ [blok, onWijzig, onVerwijderd]
214
+ );
215
+ const voegToe = useCallback(
216
+ (lijst) => {
217
+ const arr = [...haal(blok, lijst) ?? []];
218
+ const voorbeeld = arr[arr.length - 1] ?? haal(def?.defaults?.() ?? {}, lijstVorm(lijst))?.[0] ?? {};
219
+ const nieuw = structuredClone(voorbeeld);
220
+ const naam = (itemNaam(blok._type, lijstVorm(lijst)) ?? "onderdeel").toLowerCase();
221
+ const eerste = ["title", "name", "label", "question", "q", "author", "day"].find((k) => typeof nieuw[k] === "string");
222
+ if (eerste) nieuw[eerste] = `Nieuw: ${naam}`;
223
+ for (const k of ["featured", "highlighted"]) if (k in nieuw) nieuw[k] = false;
224
+ arr.push(nieuw);
225
+ onWijzig(zet(blok, lijst, arr));
226
+ if (eerste) onStartVeld(`${lijst}.${arr.length - 1}.${eerste}`);
227
+ },
228
+ [blok, def, onWijzig, onStartVeld]
229
+ );
230
+ const laatste = useMemo(() => {
231
+ const m = /* @__PURE__ */ new Map();
232
+ for (const it of items) m.set(it.lijst, it.r);
233
+ return m;
234
+ }, [items]);
235
+ const hoverItem = hover ? items.find((x) => x.lijst === hover.lijst && x.index === hover.index) : void 0;
236
+ const aantal = (lijst) => (haal(blok, lijst) ?? []).length;
237
+ const hrefNu = linkDoel ? String(haal(blok, linkDoel.hrefVeld) ?? "") : "";
238
+ const zichtbaar = (r) => r.top + r.height > veilig && r.top < window.innerHeight;
239
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
240
+ blokRect && zichtbaar(blokRect) && keuzes.length > 0 && /* @__PURE__ */ jsxs(
241
+ "div",
242
+ {
243
+ className: "xicms-ve-snel",
244
+ role: "toolbar",
245
+ "aria-label": `Snel aanpassen: ${def?.label ?? ""}`,
246
+ style: { top: blokRect.top - 46 > veilig + 4 ? blokRect.top - 46 : Math.max(blokRect.top + 8, veilig + 8), left: Math.max(blokRect.left, 8) },
247
+ onMouseDown: (e) => e.preventDefault(),
248
+ children: [
249
+ keuzes.map((f) => {
250
+ const huidig = blok[f.key];
251
+ const opties = f.type === "select" ? f.options.map((o) => ({ value: o.value, label: o.label })) : Array.from({ length: f.max - f.min + 1 }, (_, i) => {
252
+ const n = f.min + i;
253
+ return { value: n, label: String(n) };
254
+ });
255
+ const actief = huidig ?? (f.type === "select" ? f.standaard ?? f.options[0]?.value : void 0);
256
+ return /* @__PURE__ */ jsxs("span", { className: "xicms-ve-snel__groep", role: "radiogroup", "aria-label": f.label, children: [
257
+ /* @__PURE__ */ jsx("span", { className: "xicms-ve-snel__label", children: f.label }),
258
+ opties.map((o) => /* @__PURE__ */ jsx(
259
+ "button",
260
+ {
261
+ type: "button",
262
+ role: "radio",
263
+ "aria-checked": actief === o.value,
264
+ className: "xicms-ve-snel__knop",
265
+ onClick: () => onWijzig({ ...blok, [f.key]: o.value }),
266
+ children: o.label
267
+ },
268
+ String(o.value)
269
+ ))
270
+ ] }, f.key);
271
+ }),
272
+ /* @__PURE__ */ jsx("button", { type: "button", className: "xicms-ve-snel__meer", onClick: onInstellingen, title: "Alle instellingen in de zijbalk", children: "Meer \u2699" })
273
+ ]
274
+ }
275
+ ),
276
+ hoverItem && zichtbaar(hoverItem.r) && /* @__PURE__ */ jsx(
277
+ "div",
278
+ {
279
+ className: "xicms-ve-item",
280
+ role: "toolbar",
281
+ "aria-label": `${itemNaam(blok._type, lijstVorm(hoverItem.lijst)) ?? "Onderdeel"} ${hoverItem.index + 1}`,
282
+ style: { top: Math.max(hoverItem.r.top + 6, veilig + 8), left: Math.max(hoverItem.r.left + hoverItem.r.width - 6, 120) },
283
+ onMouseDown: (e) => e.preventDefault(),
284
+ children: (() => {
285
+ const naam = itemNaam(blok._type, lijstVorm(hoverItem.lijst)) ?? "Onderdeel";
286
+ const n = aantal(hoverItem.lijst);
287
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
288
+ /* @__PURE__ */ jsx("button", { type: "button", title: `${naam} naar voren`, "aria-label": `${naam} naar voren`, disabled: hoverItem.index === 0, onClick: () => lijstActie(hoverItem.lijst, hoverItem.index, "omhoog"), children: "\u2191" }),
289
+ /* @__PURE__ */ jsx("button", { type: "button", title: `${naam} naar achteren`, "aria-label": `${naam} naar achteren`, disabled: hoverItem.index >= n - 1, onClick: () => lijstActie(hoverItem.lijst, hoverItem.index, "omlaag"), children: "\u2193" }),
290
+ /* @__PURE__ */ jsx("button", { type: "button", title: `${naam} dupliceren`, "aria-label": `${naam} dupliceren`, onClick: () => lijstActie(hoverItem.lijst, hoverItem.index, "dupliceer"), children: "\u29C9" }),
291
+ /* @__PURE__ */ jsx("button", { type: "button", className: "is-gevaar", title: `${naam} weghalen`, "aria-label": `${naam} weghalen`, onClick: () => lijstActie(hoverItem.lijst, hoverItem.index, "weg"), children: "\u{1F5D1}" })
292
+ ] });
293
+ })()
294
+ }
295
+ ),
296
+ [...laatste].map(([lijst, r]) => {
297
+ const diepte = lijst.split(".").length;
298
+ const botst = [...laatste].some(([ander, ar]) => ander !== lijst && ander.split(".").length > diepte && Math.abs(ar.top + ar.height - (r.top + r.height)) < 30);
299
+ return [lijst, botst ? { ...r, height: r.height + 40 } : r];
300
+ }).map(
301
+ ([lijst, r]) => (
302
+ // Alleen als de onderkant van de lijst in beeld is — anders zweeft "+ Kaart" los onderaan.
303
+ r.top + r.height > veilig && r.top + r.height + 46 < window.innerHeight ? /* @__PURE__ */ jsxs(
304
+ "button",
305
+ {
306
+ type: "button",
307
+ className: "xicms-ve-plus",
308
+ style: { top: r.top + r.height + 6, left: r.left + r.width / 2 },
309
+ onMouseDown: (e) => e.preventDefault(),
310
+ onClick: () => voegToe(lijst),
311
+ children: [
312
+ "+ ",
313
+ itemNaam(blok._type, lijstVorm(lijst)) ?? "Toevoegen"
314
+ ]
315
+ },
316
+ lijst
317
+ ) : null
318
+ )
319
+ ),
320
+ linkDoel && zichtbaar(linkDoel.r) && /* @__PURE__ */ jsxs(
321
+ "button",
322
+ {
323
+ type: "button",
324
+ className: "xicms-ve-linkchip",
325
+ style: { top: linkDoel.r.top + linkDoel.r.height + 4, left: linkDoel.r.left },
326
+ onMouseDown: (e) => e.preventDefault(),
327
+ onClick: () => setLinkOpen(true),
328
+ title: "Waar gaat deze knop heen?",
329
+ children: [
330
+ "\u{1F517} ",
331
+ !hrefNu || hrefNu === "#" ? "Kies waar deze knop heen gaat" : hrefNu.replace(/^https?:\/\//, "")
332
+ ]
333
+ }
334
+ ),
335
+ /* @__PURE__ */ jsx(
336
+ LinkDialog,
337
+ {
338
+ open: linkOpen,
339
+ onOpenChange: setLinkOpen,
340
+ siteId,
341
+ huidig: hrefNu === "#" ? "" : hrefNu,
342
+ onKlaar: (href) => {
343
+ if (linkDoel) onWijzig(zet(blok, linkDoel.hrefVeld, href ?? ""));
344
+ }
345
+ }
346
+ )
347
+ ] });
348
+ }
349
+ export {
350
+ InlineGereedschap,
351
+ lijstVorm,
352
+ linkVeldVoor,
353
+ snelleKeuzes,
354
+ vindLijstItems
355
+ };
356
+ //# sourceMappingURL=InlineGereedschap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/admin/visual/InlineGereedschap.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { BlockDefinition } from \"../../blocks/registry\";\nimport type { Field } from \"../../schema/fields\";\nimport { introspectToFields } from \"../lib/zodFields\";\nimport { itemNaam, vertaalVelden, TECHNISCHE_VELDEN } from \"../lib/veldTaal\";\nimport { LinkDialog } from \"../ui/LinkDialog\";\n\n/**\n * Bewerken op de pagina, voorbij de tekst (8.11): het POTLOOD.\n *\n * De wens: potlood = op de pagina zelf bewerken, tandwiel = de zijbalk. Tot nu toe deed het potlood\n * alleen tekst; voor al het andere moest je toch naar de zijbalk — een kaart toevoegen, een knop\n * naar een andere pagina laten wijzen, van drie naar vier kolommen. Dit gereedschap verschijnt bij\n * het geselecteerde blok en doet precies dat, op de plek zelf:\n *\n * - **Lijsten** (kaarten, teamleden, reviews, stappen …): bij het onderdeel onder je muis ↑ ↓ ⧉ 🗑,\n * en onder de lijst \"+ Kaart\". De onderdelen worden gevonden via de veldhaken die de blokken al\n * zetten (`data-xicms-edit=\"items.2.title\"`) — geen wijziging aan een Render nodig, ook niet aan\n * maatwerkblokken.\n * - **Links**: wie een knoptekst aanwijst of bewerkt, krijgt eronder \"🔗 Contact\" — klik, en kies\n * een pagina of adres.\n * - **Snelle keuzes**: de paar keuzes die het uiterlijk van het blok bepalen (kolommen, stijl,\n * uitlijning), als een balkje boven het blok. Alles daarbuiten blijft in de zijbalk.\n */\n\ntype Blok = Record<string, unknown> & { _key: string; _type: string };\n\ninterface Rect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/** Onderkant van wat er bovenaan het scherm vast hangt (sticky header): daaronder tekenen we. */\nfunction veiligeBovenkant(): number {\n let onder = 0;\n for (const el of Array.from(document.querySelectorAll<HTMLElement>(\"header, [class*='header'], [class*='nav'], body > div > *\"))) {\n const pos = getComputedStyle(el).position;\n if (pos !== \"fixed\" && pos !== \"sticky\") continue;\n if (el.closest(\"[data-xicms-tooling], .xicms-ve\")) continue;\n const r = el.getBoundingClientRect();\n if (r.height === 0 || r.top > 4 || r.height > window.innerHeight / 3) continue;\n onder = Math.max(onder, r.bottom);\n }\n return onder;\n}\n\nfunction rect(el: Element): Rect {\n const r = el.getBoundingClientRect();\n return { top: r.top, left: r.left, width: r.width, height: r.height };\n}\n\nfunction zelfde(a: Rect | null, b: Rect | null): boolean {\n return !!a && !!b && a.top === b.top && a.left === b.left && a.width === b.width && a.height === b.height;\n}\n\n/** Laagste gemeenschappelijke voorouder van een set elementen (binnen `grens`). */\nfunction gemeenschappelijk(els: HTMLElement[], grens: HTMLElement): HTMLElement {\n let kand: HTMLElement | null = els[0];\n while (kand && kand !== grens && !els.every((e) => kand!.contains(e))) kand = kand.parentElement;\n return kand ?? grens;\n}\n\nexport interface LijstItem {\n lijst: string;\n index: number;\n el: HTMLElement;\n}\n\n/**\n * Vind de onderdelen van de lijsten in een blok, via de veldhaken. Per onderdeel: de laagste\n * voorouder die al zijn velden bevat, en dan zo ver omhoog als kan zonder een ánder onderdeel van\n * dezelfde lijst te raken — dat is de kaart, de rij, het teamlid.\n */\nexport function vindLijstItems(host: HTMLElement): LijstItem[] {\n // Per onderdeel (\"lijstpad|index\") de velden. Geneste lijsten (8.13: een prijslijst heeft\n // onderdelen met regels) leveren voor één veld meerdere onderdelen op:\n // \"sections.0.items.2.name\" hoort bij \"sections\" #0 én bij \"sections.0.items\" #2.\n const perItem = new Map<string, HTMLElement[]>();\n for (const el of Array.from(host.querySelectorAll<HTMLElement>(\"[data-xicms-edit]\"))) {\n const pad = el.dataset.xicmsEdit ?? \"\";\n const re = /\\.(\\d+)\\./g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(pad))) {\n const lijst = pad.slice(0, m.index);\n if (!/^[A-Za-z]/.test(lijst)) continue;\n const sleutel = `${lijst}|${m[1]}`;\n perItem.set(sleutel, [...(perItem.get(sleutel) ?? []), el]);\n re.lastIndex = m.index + 1;\n }\n }\n const uit: LijstItem[] = [];\n for (const [sleutel, els] of perItem) {\n const [lijst, idx] = sleutel.split(\"|\");\n const anderen = [...perItem].filter(([k]) => k !== sleutel && k.startsWith(`${lijst}|`)).flatMap(([, v]) => v);\n let el = gemeenschappelijk(els, host);\n while (el.parentElement && el.parentElement !== host && !anderen.some((a) => el.parentElement!.contains(a))) {\n // Niet voorbij een display:contents-wrapper van het blok zelf.\n if (el.parentElement.hasAttribute(\"data-xicms-block\")) break;\n el = el.parentElement;\n }\n uit.push({ lijst, index: Number(idx), el });\n }\n return uit.sort((a, b) => (a.lijst === b.lijst ? a.index - b.index : a.lijst.localeCompare(b.lijst)));\n}\n\n/** \"sections.0.items\" → \"sections.items\": de vorm waarop lijst- en onderdeelnamen per blok staan. */\nexport function lijstVorm(lijst: string): string {\n return lijst.replace(/\\.\\d+(?=\\.|$)/g, \"\");\n}\n\n/** Bij een knoptekst-veld: welk veld bevat de link? `null` = geen link bij dit veld. */\nexport function linkVeldVoor(veld: string, blok: Record<string, unknown>): string | null {\n const kandidaten: string[] = [];\n if (/(^|\\.)label$/.test(veld)) kandidaten.push(veld.replace(/label$/, \"href\"));\n if (/(^|\\.)linkLabel$/.test(veld)) kandidaten.push(veld.replace(/linkLabel$/, \"href\"));\n if (/Label$/.test(veld)) kandidaten.push(veld.replace(/Label$/, \"Href\"));\n for (const k of kandidaten) {\n const waarde = k.split(\".\").reduce<unknown>((o, s) => (o == null ? undefined : (o as Record<string, unknown>)[s]), blok);\n if (waarde !== undefined) return k;\n }\n return null;\n}\n\nfunction haal(o: unknown, pad: string): unknown {\n return pad.split(\".\").reduce<unknown>((x, k) => (x == null ? undefined : (x as Record<string, unknown>)[k]), o);\n}\nfunction zet<T>(o: T, pad: string, waarde: unknown): T {\n const delen = pad.split(\".\");\n const kloon = (v: unknown): any => (Array.isArray(v) ? [...v] : v && typeof v === \"object\" ? { ...(v as object) } : v); // eslint-disable-line @typescript-eslint/no-explicit-any\n const wortel = kloon(o);\n let cur = wortel;\n for (let i = 0; i < delen.length - 1; i++) {\n cur[delen[i]] = kloon(cur[delen[i]] ?? {});\n cur = cur[delen[i]];\n }\n cur[delen[delen.length - 1]] = waarde;\n return wortel as T;\n}\n\n/** De snelle keuzes van een blok: keuzelijsten, kleine getallen en schakelaars die het uiterlijk bepalen. */\nexport function snelleKeuzes(velden: Field[]): Field[] {\n // Alleen wat het UITERLIJK bepaalt; techniek en SEO (kopniveau, Google) horen in de zijbalk.\n const uitgesloten = /jsonLd|consent|dismiss|sticky|^lightbox$|^showDownload$|^includeNews$|^headingLevel$/;\n return velden\n .filter((f) => !TECHNISCHE_VELDEN.has(f.key) && !uitgesloten.test(f.key))\n .filter(\n (f) =>\n (f.type === \"select\" && f.options.length >= 2 && f.options.length <= 5) ||\n (f.type === \"number\" && f.min !== undefined && f.max !== undefined && f.max - f.min <= 4 && f.key !== \"rating\"),\n )\n .slice(0, 3);\n}\n\nexport function InlineGereedschap({\n blok,\n def,\n siteId,\n onWijzig,\n onInstellingen,\n onStartVeld,\n onVerwijderd,\n}: {\n blok: Blok;\n def: BlockDefinition | undefined;\n siteId: string;\n /** Nieuwe versie van het blok (één ongedaan-maak-stap). */\n onWijzig: (volgend: Blok) => void;\n onInstellingen: () => void;\n /** Zet het bewerken van een veld aan (na het toevoegen van een onderdeel). */\n onStartVeld: (veld: string) => void;\n onVerwijderd: (wat: string) => void;\n}) {\n const [host, setHost] = useState<HTMLElement | null>(null);\n const [items, setItems] = useState<{ lijst: string; index: number; r: Rect }[]>([]);\n const [hover, setHover] = useState<{ lijst: string; index: number } | null>(null);\n const [blokRect, setBlokRect] = useState<Rect | null>(null);\n const [linkDoel, setLinkDoel] = useState<{ veld: string; hrefVeld: string; r: Rect } | null>(null);\n const [linkOpen, setLinkOpen] = useState(false);\n const [veilig, setVeilig] = useState(0);\n useEffect(() => {\n const herijk = () => setVeilig(veiligeBovenkant());\n herijk();\n window.addEventListener(\"resize\", herijk);\n return () => window.removeEventListener(\"resize\", herijk);\n }, []);\n\n const velden = useMemo(() => {\n if (!def?.schema) return [] as Field[];\n try {\n return vertaalVelden(introspectToFields(def.schema, def.fields), def.type);\n } catch {\n return [] as Field[];\n }\n }, [def]);\n const keuzes = useMemo(() => snelleKeuzes(velden), [velden]);\n\n // Meten: het blok, zijn onderdelen. Bij scrollen, resizen en elke DOM-wijziging in het blok.\n // Het blok kan nog niet op de pagina staan (net ingevoegd: de werkversie rendert een frame\n // later). Dan even wachten in plaats van voorgoed zonder gereedschap te blijven.\n const [gevonden, setGevonden] = useState<HTMLElement | null>(null);\n useEffect(() => {\n let pogingen = 0;\n let frame = 0;\n const zoek = () => {\n const el = document.querySelector<HTMLElement>(`[data-xicms-block=\"${CSS.escape(blok._key)}\"]`);\n if (el) setGevonden(el);\n else if (++pogingen < 120) frame = requestAnimationFrame(zoek);\n };\n zoek();\n return () => cancelAnimationFrame(frame);\n }, [blok._key]);\n\n useEffect(() => {\n const el = gevonden;\n setHost(el);\n if (!el) return;\n let frame = 0;\n const meet = () => {\n const gevonden = vindLijstItems(el).map((it) => ({ lijst: it.lijst, index: it.index, r: rect(it.el) }));\n setItems((v) => (v.length === gevonden.length && v.every((x, i) => x.lijst === gevonden[i].lijst && x.index === gevonden[i].index && zelfde(x.r, gevonden[i].r)) ? v : gevonden));\n // Een display:contents-wrapper meet 0×0: dan de omtrek van de kinderen.\n let r = rect(el);\n if (r.width === 0 && r.height === 0) {\n const kids = Array.from(el.children).map(rect).filter((k) => k.width || k.height);\n if (kids.length) {\n const top = Math.min(...kids.map((k) => k.top));\n const left = Math.min(...kids.map((k) => k.left));\n r = { top, left, width: Math.max(...kids.map((k) => k.left + k.width)) - left, height: Math.max(...kids.map((k) => k.top + k.height)) - top };\n }\n }\n setBlokRect((v) => (zelfde(v, r) ? v : r));\n };\n const plan = () => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(meet);\n };\n meet();\n const obs = new MutationObserver(plan);\n obs.observe(el, { childList: true, subtree: true, characterData: true });\n window.addEventListener(\"scroll\", plan, { capture: true, passive: true });\n window.addEventListener(\"resize\", plan);\n return () => {\n cancelAnimationFrame(frame);\n obs.disconnect();\n window.removeEventListener(\"scroll\", plan, { capture: true });\n window.removeEventListener(\"resize\", plan);\n };\n }, [gevonden]);\n\n // Aanwijzen: welk onderdeel, en staat er een knoptekst met een link onder de muis/focus?\n useEffect(() => {\n if (!host) return;\n const kijk = (doel: HTMLElement | null) => {\n if (!doel) return;\n // Het binnenste onderdeel wint (de regel, niet het hele onderdeel waar hij in staat).\n const it = vindLijstItems(host)\n .filter((x) => x.el.contains(doel))\n .sort((a, b) => b.lijst.split(\".\").length - a.lijst.split(\".\").length)[0];\n setHover(it ? { lijst: it.lijst, index: it.index } : null);\n const veldEl = doel.closest<HTMLElement>(\"[data-xicms-edit]\");\n const veld = veldEl?.dataset.xicmsEdit;\n const hrefVeld = veld ? linkVeldVoor(veld, blok) : null;\n if (veldEl && veld && hrefVeld) setLinkDoel({ veld, hrefVeld, r: rect(veldEl) });\n };\n const opOver = (e: Event) => kijk(e.target as HTMLElement);\n host.addEventListener(\"mouseover\", opOver);\n host.addEventListener(\"focusin\", opOver);\n return () => {\n host.removeEventListener(\"mouseover\", opOver);\n host.removeEventListener(\"focusin\", opOver);\n };\n }, [host, blok]);\n // De link-chip volgt zijn knop bij scrollen.\n useEffect(() => {\n if (!linkDoel || !host) return;\n const herpositioneer = () => {\n const el = host.querySelector<HTMLElement>(`[data-xicms-edit=\"${CSS.escape(linkDoel.veld)}\"]`);\n if (!el) return setLinkDoel(null);\n const r = rect(el);\n setLinkDoel((v) => (v && !zelfde(v.r, r) ? { ...v, r } : v));\n };\n window.addEventListener(\"scroll\", herpositioneer, { capture: true, passive: true });\n return () => window.removeEventListener(\"scroll\", herpositioneer, { capture: true });\n }, [linkDoel, host]);\n\n const lijstActie = useCallback(\n (lijst: string, index: number, actie: \"omhoog\" | \"omlaag\" | \"dupliceer\" | \"weg\") => {\n const arr = [...((haal(blok, lijst) as unknown[]) ?? [])];\n if (actie === \"omhoog\" && index > 0) [arr[index - 1], arr[index]] = [arr[index], arr[index - 1]];\n else if (actie === \"omlaag\" && index < arr.length - 1) [arr[index + 1], arr[index]] = [arr[index], arr[index + 1]];\n else if (actie === \"dupliceer\") arr.splice(index + 1, 0, structuredClone(arr[index]));\n else if (actie === \"weg\") arr.splice(index, 1);\n else return;\n onWijzig(zet(blok, lijst, arr));\n if (actie === \"weg\") onVerwijderd(itemNaam(blok._type, lijstVorm(lijst)) ?? \"Onderdeel\");\n setHover(null);\n },\n [blok, onWijzig, onVerwijderd],\n );\n\n const voegToe = useCallback(\n (lijst: string) => {\n const arr = [...((haal(blok, lijst) as Record<string, unknown>[]) ?? [])];\n const voorbeeld = arr[arr.length - 1] ?? (haal(def?.defaults?.() ?? {}, lijstVorm(lijst)) as Record<string, unknown>[] | undefined)?.[0] ?? {};\n const nieuw = structuredClone(voorbeeld) as Record<string, unknown>;\n // Zichtbaar nieuw: de eerste tekst krijgt \"Nieuw …\", zodat je ziet wélk onderdeel erbij kwam.\n const naam = (itemNaam(blok._type, lijstVorm(lijst)) ?? \"onderdeel\").toLowerCase();\n const eerste = [\"title\", \"name\", \"label\", \"question\", \"q\", \"author\", \"day\"].find((k) => typeof nieuw[k] === \"string\");\n if (eerste) nieuw[eerste] = `Nieuw: ${naam}`;\n for (const k of [\"featured\", \"highlighted\"]) if (k in nieuw) nieuw[k] = false;\n arr.push(nieuw);\n onWijzig(zet(blok, lijst, arr));\n if (eerste) onStartVeld(`${lijst}.${arr.length - 1}.${eerste}`);\n },\n [blok, def, onWijzig, onStartVeld],\n );\n\n // Per lijst het laatste onderdeel (daaronder de \"+\"-knop).\n const laatste = useMemo(() => {\n const m = new Map<string, Rect>();\n for (const it of items) m.set(it.lijst, it.r);\n return m;\n }, [items]);\n const hoverItem = hover ? items.find((x) => x.lijst === hover.lijst && x.index === hover.index) : undefined;\n const aantal = (lijst: string) => ((haal(blok, lijst) as unknown[]) ?? []).length;\n\n const hrefNu = linkDoel ? String(haal(blok, linkDoel.hrefVeld) ?? \"\") : \"\";\n const zichtbaar = (r: Rect) => r.top + r.height > veilig && r.top < window.innerHeight;\n\n return (\n <>\n {/* Snelle keuzes: linksboven het blok (rechtsboven staan potlood en tandwiel). */}\n {blokRect && zichtbaar(blokRect) && keuzes.length > 0 && (\n <div\n className=\"xicms-ve-snel\"\n role=\"toolbar\"\n aria-label={`Snel aanpassen: ${def?.label ?? \"\"}`}\n // Boven het blok (net buiten de rand), zodat het de kop van het blok niet afdekt; is daar\n // geen ruimte (blok bovenaan in beeld), dan binnen de bovenrand.\n style={{ top: blokRect.top - 46 > veilig + 4 ? blokRect.top - 46 : Math.max(blokRect.top + 8, veilig + 8), left: Math.max(blokRect.left, 8) }}\n onMouseDown={(e) => e.preventDefault()}\n >\n {keuzes.map((f) => {\n const huidig = blok[f.key];\n const opties =\n f.type === \"select\"\n ? f.options.map((o) => ({ value: o.value as unknown, label: o.label }))\n : Array.from({ length: (f as { max: number }).max - (f as { min: number }).min + 1 }, (_, i) => {\n const n = (f as { min: number }).min + i;\n return { value: n as unknown, label: String(n) };\n });\n const actief = huidig ?? (f.type === \"select\" ? (f.standaard ?? f.options[0]?.value) : undefined);\n return (\n <span key={f.key} className=\"xicms-ve-snel__groep\" role=\"radiogroup\" aria-label={f.label}>\n <span className=\"xicms-ve-snel__label\">{f.label}</span>\n {opties.map((o) => (\n <button\n key={String(o.value)}\n type=\"button\"\n role=\"radio\"\n aria-checked={actief === o.value}\n className=\"xicms-ve-snel__knop\"\n onClick={() => onWijzig({ ...blok, [f.key]: o.value })}\n >\n {o.label}\n </button>\n ))}\n </span>\n );\n })}\n <button type=\"button\" className=\"xicms-ve-snel__meer\" onClick={onInstellingen} title=\"Alle instellingen in de zijbalk\">\n Meer ⚙\n </button>\n </div>\n )}\n\n {/* Het onderdeel onder de muis: verplaatsen, dupliceren, weghalen. */}\n {hoverItem && zichtbaar(hoverItem.r) && (\n <div\n className=\"xicms-ve-item\"\n role=\"toolbar\"\n aria-label={`${itemNaam(blok._type, lijstVorm(hoverItem.lijst)) ?? \"Onderdeel\"} ${hoverItem.index + 1}`}\n style={{ top: Math.max(hoverItem.r.top + 6, veilig + 8), left: Math.max(hoverItem.r.left + hoverItem.r.width - 6, 120) }}\n onMouseDown={(e) => e.preventDefault()}\n >\n {(() => {\n const naam = itemNaam(blok._type, lijstVorm(hoverItem.lijst)) ?? \"Onderdeel\";\n const n = aantal(hoverItem.lijst);\n return (\n <>\n <button type=\"button\" title={`${naam} naar voren`} aria-label={`${naam} naar voren`} disabled={hoverItem.index === 0} onClick={() => lijstActie(hoverItem.lijst, hoverItem.index, \"omhoog\")}>\n ↑\n </button>\n <button type=\"button\" title={`${naam} naar achteren`} aria-label={`${naam} naar achteren`} disabled={hoverItem.index >= n - 1} onClick={() => lijstActie(hoverItem.lijst, hoverItem.index, \"omlaag\")}>\n ↓\n </button>\n <button type=\"button\" title={`${naam} dupliceren`} aria-label={`${naam} dupliceren`} onClick={() => lijstActie(hoverItem.lijst, hoverItem.index, \"dupliceer\")}>\n ⧉\n </button>\n <button type=\"button\" className=\"is-gevaar\" title={`${naam} weghalen`} aria-label={`${naam} weghalen`} onClick={() => lijstActie(hoverItem.lijst, hoverItem.index, \"weg\")}>\n 🗑\n </button>\n </>\n );\n })()}\n </div>\n )}\n\n {/* \"+ Kaart\" onder het laatste onderdeel van elke lijst. */}\n {[...laatste].map(([lijst, r]) => {\n // Een buitenste lijst waarvan het laatste onderdeel samen eindigt met een binnenste lijst\n // (laatste regel van het laatste onderdeel) schuift een knophoogte op, anders liggen\n // \"+ Regel\" en \"+ Onderdeel\" op elkaar.\n const diepte = lijst.split(\".\").length;\n const botst = [...laatste].some(([ander, ar]) => ander !== lijst && ander.split(\".\").length > diepte && Math.abs(ar.top + ar.height - (r.top + r.height)) < 30);\n return [lijst, botst ? { ...r, height: r.height + 40 } : r] as const;\n }).map(([lijst, r]) =>\n // Alleen als de onderkant van de lijst in beeld is — anders zweeft \"+ Kaart\" los onderaan.\n r.top + r.height > veilig && r.top + r.height + 46 < window.innerHeight ? (\n <button\n key={lijst}\n type=\"button\"\n className=\"xicms-ve-plus\"\n style={{ top: r.top + r.height + 6, left: r.left + r.width / 2 }}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => voegToe(lijst)}\n >\n + {itemNaam(blok._type, lijstVorm(lijst)) ?? \"Toevoegen\"}\n </button>\n ) : null,\n )}\n\n {/* Link bij een knop: waar hij heen gaat, en wijzigen met één klik. */}\n {linkDoel && zichtbaar(linkDoel.r) && (\n <button\n type=\"button\"\n className=\"xicms-ve-linkchip\"\n style={{ top: linkDoel.r.top + linkDoel.r.height + 4, left: linkDoel.r.left }}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setLinkOpen(true)}\n title=\"Waar gaat deze knop heen?\"\n >\n 🔗 {!hrefNu || hrefNu === \"#\" ? \"Kies waar deze knop heen gaat\" : hrefNu.replace(/^https?:\\/\\//, \"\")}\n </button>\n )}\n <LinkDialog\n open={linkOpen}\n onOpenChange={setLinkOpen}\n siteId={siteId}\n huidig={hrefNu === \"#\" ? \"\" : hrefNu}\n onKlaar={(href) => {\n if (linkDoel) onWijzig(zet(blok, linkDoel.hrefVeld, href ?? \"\"));\n }}\n />\n </>\n );\n}\n"],"mappings":"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","names":["gevonden"]}
@@ -0,0 +1,23 @@
1
+ /** Markeert de vervanger, zodat de inline-binding van de editor hem niet als nieuw veld ziet. */
2
+ export declare const RIJK_ATTR = "data-xicms-ve-rijk";
3
+ /**
4
+ * Rich-text bewerken OP DE SITE (8.6) met dezelfde editor als het beheer: slash-menu,
5
+ * selectie-werkbalk, koppen, lijsten, tabellen, foto's plakken/slepen, links met nieuw tabblad.
6
+ *
7
+ * Hoe: het tekstelement van het blok blijft van React (de render van de klant). We verbergen het en
8
+ * zetten er een vervanger naast met dezelfde klassen, zodat de tekst exact de opmaak van de site
9
+ * houdt (WYSIWYG). TipTap komt via een portal in die vervanger. Wijzigingen gaan doorlopend
10
+ * (gedebounced) naar de werkversie — het verborgen origineel mag dus gewoon her-renderen. Bij
11
+ * "klaar" verdwijnt de vervanger en staat het origineel weer, met de nieuwe tekst.
12
+ */
13
+ export declare function InlineRijkeTekst({ el, siteId, onCommit, onKlaar, flushRef, }: {
14
+ /** Het `.xicms-richtext`-element van het blok. */
15
+ el: HTMLElement;
16
+ siteId?: string;
17
+ /** Schrijf de (gesanitizede) HTML naar de werkversie. */
18
+ onCommit: (html: string) => void;
19
+ /** Bewerken afgerond (Escape, klik ernaast, ✓). */
20
+ onKlaar: () => void;
21
+ /** Voor de editor: alles wat nog in de debounce zit nú wegschrijven (vóór opslaan/publiceren). */
22
+ flushRef: React.MutableRefObject<(() => void) | null>;
23
+ }): import("react").JSX.Element | null;
@@ -0,0 +1,152 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { EditorContent } from "@tiptap/react";
4
+ import DOMPurify from "dompurify";
5
+ import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
6
+ import { createPortal } from "react-dom";
7
+ import { RteKnop, useRijkeTekst } from "../editors/useRijkeTekst.js";
8
+ const RIJK_ATTR = "data-xicms-ve-rijk";
9
+ function InlineRijkeTekst({
10
+ el,
11
+ siteId,
12
+ onCommit,
13
+ onKlaar,
14
+ flushRef
15
+ }) {
16
+ const [wrap, setWrap] = useState(null);
17
+ const beginHtml = useRef(el.innerHTML);
18
+ const laatsteRef = useRef(null);
19
+ const timerRef = useRef(void 0);
20
+ const balkRef = useRef(null);
21
+ const [pos, setPos] = useState(null);
22
+ const flush = useCallback(() => {
23
+ window.clearTimeout(timerRef.current);
24
+ const html = laatsteRef.current;
25
+ if (html === null) return;
26
+ laatsteRef.current = null;
27
+ onCommit(html);
28
+ }, [onCommit]);
29
+ const flushLatest = useRef(flush);
30
+ flushLatest.current = flush;
31
+ const { editor, overlays, openLink, openFoto, ietsOpen } = useRijkeTekst({
32
+ value: beginHtml.current,
33
+ siteId,
34
+ autofocus: true,
35
+ editorClass: "xicms-ve-rijk__oppervlak",
36
+ onEscape: onKlaar,
37
+ alleenVensterScroll: true,
38
+ onChange: (html) => {
39
+ laatsteRef.current = DOMPurify.sanitize(html);
40
+ window.clearTimeout(timerRef.current);
41
+ timerRef.current = window.setTimeout(() => flushLatest.current(), 600);
42
+ }
43
+ });
44
+ useLayoutEffect(() => {
45
+ const w = document.createElement("div");
46
+ w.className = el.className;
47
+ w.classList.remove("is-editing", "is-hover", "xicms-ve-inline", "xicms-ve-gewijzigd");
48
+ w.classList.add("xicms-ve-rijk");
49
+ w.setAttribute(RIJK_ATTR, "");
50
+ el.after(w);
51
+ const oudeDisplay = el.style.display;
52
+ el.style.display = "none";
53
+ setWrap(w);
54
+ return () => {
55
+ w.remove();
56
+ el.style.display = oudeDisplay;
57
+ };
58
+ }, [el]);
59
+ useEffect(() => {
60
+ flushRef.current = () => flushLatest.current();
61
+ return () => {
62
+ flushLatest.current();
63
+ flushRef.current = null;
64
+ };
65
+ }, [flushRef]);
66
+ useEffect(() => {
67
+ if (!wrap) return;
68
+ let frame = 0;
69
+ const meet = () => {
70
+ const r = wrap.getBoundingClientRect();
71
+ const breedte = balkRef.current?.offsetWidth ?? 420;
72
+ const hoogte = balkRef.current?.offsetHeight ?? 40;
73
+ setPos({
74
+ top: Math.min(Math.max(56, r.top - hoogte - 8), Math.max(56, r.bottom - 8)),
75
+ left: Math.min(Math.max(8, r.left), Math.max(8, window.innerWidth - breedte - 8))
76
+ });
77
+ };
78
+ const opnieuw = () => {
79
+ cancelAnimationFrame(frame);
80
+ frame = requestAnimationFrame(meet);
81
+ };
82
+ meet();
83
+ const ro = new ResizeObserver(opnieuw);
84
+ ro.observe(wrap);
85
+ window.addEventListener("scroll", opnieuw, { capture: true, passive: true });
86
+ window.addEventListener("resize", opnieuw, { passive: true });
87
+ return () => {
88
+ cancelAnimationFrame(frame);
89
+ ro.disconnect();
90
+ window.removeEventListener("scroll", opnieuw, { capture: true });
91
+ window.removeEventListener("resize", opnieuw);
92
+ };
93
+ }, [wrap]);
94
+ const ietsOpenRef = useRef(ietsOpen);
95
+ ietsOpenRef.current = ietsOpen;
96
+ useEffect(() => {
97
+ if (!wrap) return;
98
+ const opKlik = (e) => {
99
+ const t = e.target;
100
+ if (!t || ietsOpenRef.current) return;
101
+ if (wrap.contains(t) || balkRef.current?.contains(t)) return;
102
+ if (t.closest(".xicms-bubbel, .xicms-slash, [role='dialog'], [role='listbox'], .xicms-ve-pencil, .xicms-toast, [data-radix-popper-content-wrapper]")) return;
103
+ onKlaar();
104
+ };
105
+ document.addEventListener("pointerdown", opKlik, true);
106
+ return () => document.removeEventListener("pointerdown", opKlik, true);
107
+ }, [wrap, onKlaar]);
108
+ if (!wrap || !editor) return null;
109
+ const k = "xicms-ve-fmtbar__knop";
110
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
111
+ createPortal(/* @__PURE__ */ jsx(EditorContent, { editor }), wrap),
112
+ /* @__PURE__ */ jsxs(
113
+ "div",
114
+ {
115
+ ref: balkRef,
116
+ className: "xicms-ve-fmtbar",
117
+ style: pos ? { top: pos.top, left: pos.left } : { visibility: "hidden" },
118
+ role: "toolbar",
119
+ "aria-label": "Tekstopmaak",
120
+ children: [
121
+ /* @__PURE__ */ jsx(RteKnop, { className: k, on: () => editor.chain().focus().toggleBold().run(), active: editor.isActive("bold"), label: /* @__PURE__ */ jsx("b", { children: "B" }), title: "Vet (Ctrl/Cmd+B)" }),
122
+ /* @__PURE__ */ jsx(RteKnop, { className: k, on: () => editor.chain().focus().toggleItalic().run(), active: editor.isActive("italic"), label: /* @__PURE__ */ jsx("i", { children: "I" }), title: "Cursief (Ctrl/Cmd+I)" }),
123
+ /* @__PURE__ */ jsx(RteKnop, { className: k, on: () => editor.chain().focus().toggleUnderline().run(), active: editor.isActive("underline"), label: /* @__PURE__ */ jsx("u", { children: "U" }), title: "Onderstrepen (Ctrl/Cmd+U)" }),
124
+ /* @__PURE__ */ jsx(RteKnop, { className: k, on: openLink, active: editor.isActive("link"), label: "\u{1F517}", title: "Link" }),
125
+ /* @__PURE__ */ jsx("span", { className: "xicms-ve-fmtbar__sep", "aria-hidden": true }),
126
+ /* @__PURE__ */ jsx(RteKnop, { className: k, on: () => editor.chain().focus().toggleHeading({ level: 2 }).run(), active: editor.isActive("heading", { level: 2 }), label: "H2", title: "Kop" }),
127
+ /* @__PURE__ */ jsx(RteKnop, { className: k, on: () => editor.chain().focus().toggleHeading({ level: 3 }).run(), active: editor.isActive("heading", { level: 3 }), label: "H3", title: "Subkop" }),
128
+ /* @__PURE__ */ jsx(RteKnop, { className: k, on: () => editor.chain().focus().setParagraph().run(), active: editor.isActive("paragraph"), label: "\xB6", title: "Gewone tekst" }),
129
+ /* @__PURE__ */ jsx("span", { className: "xicms-ve-fmtbar__sep", "aria-hidden": true }),
130
+ /* @__PURE__ */ jsx(RteKnop, { className: k, on: () => editor.chain().focus().toggleBulletList().run(), active: editor.isActive("bulletList"), label: "\u2022", title: "Opsomming" }),
131
+ /* @__PURE__ */ jsx(RteKnop, { className: k, on: () => editor.chain().focus().toggleOrderedList().run(), active: editor.isActive("orderedList"), label: "1.", title: "Genummerde lijst" }),
132
+ /* @__PURE__ */ jsx(RteKnop, { className: k, on: () => editor.chain().focus().toggleBlockquote().run(), active: editor.isActive("blockquote"), label: "\u275D", title: "Citaat" }),
133
+ siteId && /* @__PURE__ */ jsx(RteKnop, { className: k, on: openFoto, label: "\u{1F5BC}", title: "Foto invoegen (of plak/sleep een foto in de tekst)" }),
134
+ /* @__PURE__ */ jsx("span", { className: "xicms-ve-fmtbar__sep", "aria-hidden": true }),
135
+ /* @__PURE__ */ jsx(RteKnop, { className: k, on: () => editor.chain().focus().undo().run(), label: "\u21B6", title: "Ongedaan maken (Ctrl/Cmd+Z)" }),
136
+ /* @__PURE__ */ jsx(RteKnop, { className: `${k} xicms-ve-fmtbar__klaar`, on: onKlaar, label: "Klaar", title: "Klaar met deze tekst (Esc)" }),
137
+ /* @__PURE__ */ jsxs("span", { className: "xicms-ve-fmtbar__tip", "aria-hidden": true, children: [
138
+ "typ ",
139
+ /* @__PURE__ */ jsx("kbd", { children: "/" }),
140
+ " voor meer"
141
+ ] })
142
+ ]
143
+ }
144
+ ),
145
+ overlays
146
+ ] });
147
+ }
148
+ export {
149
+ InlineRijkeTekst,
150
+ RIJK_ATTR
151
+ };
152
+ //# sourceMappingURL=InlineRijkeTekst.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/admin/visual/InlineRijkeTekst.tsx"],"sourcesContent":["\"use client\";\n\nimport { EditorContent } from \"@tiptap/react\";\nimport DOMPurify from \"dompurify\";\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { RteKnop, useRijkeTekst } from \"../editors/useRijkeTekst\";\n\n/** Markeert de vervanger, zodat de inline-binding van de editor hem niet als nieuw veld ziet. */\nexport const RIJK_ATTR = \"data-xicms-ve-rijk\";\n\n/**\n * Rich-text bewerken OP DE SITE (8.6) met dezelfde editor als het beheer: slash-menu,\n * selectie-werkbalk, koppen, lijsten, tabellen, foto's plakken/slepen, links met nieuw tabblad.\n *\n * Hoe: het tekstelement van het blok blijft van React (de render van de klant). We verbergen het en\n * zetten er een vervanger naast met dezelfde klassen, zodat de tekst exact de opmaak van de site\n * houdt (WYSIWYG). TipTap komt via een portal in die vervanger. Wijzigingen gaan doorlopend\n * (gedebounced) naar de werkversie — het verborgen origineel mag dus gewoon her-renderen. Bij\n * \"klaar\" verdwijnt de vervanger en staat het origineel weer, met de nieuwe tekst.\n */\nexport function InlineRijkeTekst({\n el,\n siteId,\n onCommit,\n onKlaar,\n flushRef,\n}: {\n /** Het `.xicms-richtext`-element van het blok. */\n el: HTMLElement;\n siteId?: string;\n /** Schrijf de (gesanitizede) HTML naar de werkversie. */\n onCommit: (html: string) => void;\n /** Bewerken afgerond (Escape, klik ernaast, ✓). */\n onKlaar: () => void;\n /** Voor de editor: alles wat nog in de debounce zit nú wegschrijven (vóór opslaan/publiceren). */\n flushRef: React.MutableRefObject<(() => void) | null>;\n}) {\n const [wrap, setWrap] = useState<HTMLElement | null>(null);\n const beginHtml = useRef(el.innerHTML);\n const laatsteRef = useRef<string | null>(null);\n const timerRef = useRef<number | undefined>(undefined);\n const balkRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<{ top: number; left: number } | null>(null);\n\n const flush = useCallback(() => {\n window.clearTimeout(timerRef.current);\n const html = laatsteRef.current;\n if (html === null) return;\n laatsteRef.current = null;\n onCommit(html);\n }, [onCommit]);\n const flushLatest = useRef(flush);\n flushLatest.current = flush;\n\n const { editor, overlays, openLink, openFoto, ietsOpen } = useRijkeTekst({\n value: beginHtml.current,\n siteId,\n autofocus: true,\n editorClass: \"xicms-ve-rijk__oppervlak\",\n onEscape: onKlaar,\n alleenVensterScroll: true,\n onChange: (html) => {\n laatsteRef.current = DOMPurify.sanitize(html);\n window.clearTimeout(timerRef.current);\n timerRef.current = window.setTimeout(() => flushLatest.current(), 600);\n },\n });\n\n // Vervanger plaatsen vóór de eerste paint (geen flits van de oude tekst), origineel verbergen.\n useLayoutEffect(() => {\n const w = document.createElement(\"div\");\n w.className = el.className;\n w.classList.remove(\"is-editing\", \"is-hover\", \"xicms-ve-inline\", \"xicms-ve-gewijzigd\");\n w.classList.add(\"xicms-ve-rijk\");\n w.setAttribute(RIJK_ATTR, \"\");\n el.after(w);\n const oudeDisplay = el.style.display;\n el.style.display = \"none\";\n setWrap(w);\n return () => {\n w.remove();\n el.style.display = oudeDisplay;\n };\n }, [el]);\n\n // Bij afronden of wegnavigeren: laatste wijziging niet kwijtraken.\n useEffect(() => {\n flushRef.current = () => flushLatest.current();\n return () => {\n flushLatest.current();\n flushRef.current = null;\n };\n }, [flushRef]);\n\n // Werkbalk boven het veld; blijft in beeld als het veld hoger is dan het scherm.\n useEffect(() => {\n if (!wrap) return;\n let frame = 0;\n const meet = () => {\n const r = wrap.getBoundingClientRect();\n const breedte = balkRef.current?.offsetWidth ?? 420;\n // Echte hoogte: op een telefoon loopt de balk over twee regels en lag hij anders over de tekst.\n const hoogte = balkRef.current?.offsetHeight ?? 40;\n setPos({\n top: Math.min(Math.max(56, r.top - hoogte - 8), Math.max(56, r.bottom - 8)),\n left: Math.min(Math.max(8, r.left), Math.max(8, window.innerWidth - breedte - 8)),\n });\n };\n const opnieuw = () => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(meet);\n };\n meet();\n const ro = new ResizeObserver(opnieuw);\n ro.observe(wrap);\n window.addEventListener(\"scroll\", opnieuw, { capture: true, passive: true });\n window.addEventListener(\"resize\", opnieuw, { passive: true });\n return () => {\n cancelAnimationFrame(frame);\n ro.disconnect();\n window.removeEventListener(\"scroll\", opnieuw, { capture: true });\n window.removeEventListener(\"resize\", opnieuw);\n };\n }, [wrap]);\n\n // Klik ernaast = klaar. Niet bij klikken in de editor, zijn werkbalk, menu's of dialogen.\n const ietsOpenRef = useRef(ietsOpen);\n ietsOpenRef.current = ietsOpen;\n useEffect(() => {\n if (!wrap) return;\n const opKlik = (e: PointerEvent) => {\n const t = e.target as Element | null;\n if (!t || ietsOpenRef.current) return;\n if (wrap.contains(t) || balkRef.current?.contains(t)) return;\n if (t.closest(\".xicms-bubbel, .xicms-slash, [role='dialog'], [role='listbox'], .xicms-ve-pencil, .xicms-toast, [data-radix-popper-content-wrapper]\")) return;\n onKlaar();\n };\n document.addEventListener(\"pointerdown\", opKlik, true);\n return () => document.removeEventListener(\"pointerdown\", opKlik, true);\n }, [wrap, onKlaar]);\n\n if (!wrap || !editor) return null;\n const k = \"xicms-ve-fmtbar__knop\";\n return (\n <>\n {createPortal(<EditorContent editor={editor} />, wrap)}\n <div\n ref={balkRef}\n className=\"xicms-ve-fmtbar\"\n style={pos ? { top: pos.top, left: pos.left } : { visibility: \"hidden\" }}\n role=\"toolbar\"\n aria-label=\"Tekstopmaak\"\n >\n <RteKnop className={k} on={() => editor.chain().focus().toggleBold().run()} active={editor.isActive(\"bold\")} label={<b>B</b>} title=\"Vet (Ctrl/Cmd+B)\" />\n <RteKnop className={k} on={() => editor.chain().focus().toggleItalic().run()} active={editor.isActive(\"italic\")} label={<i>I</i>} title=\"Cursief (Ctrl/Cmd+I)\" />\n <RteKnop className={k} on={() => editor.chain().focus().toggleUnderline().run()} active={editor.isActive(\"underline\")} label={<u>U</u>} title=\"Onderstrepen (Ctrl/Cmd+U)\" />\n <RteKnop className={k} on={openLink} active={editor.isActive(\"link\")} label=\"🔗\" title=\"Link\" />\n <span className=\"xicms-ve-fmtbar__sep\" aria-hidden />\n <RteKnop className={k} on={() => editor.chain().focus().toggleHeading({ level: 2 }).run()} active={editor.isActive(\"heading\", { level: 2 })} label=\"H2\" title=\"Kop\" />\n <RteKnop className={k} on={() => editor.chain().focus().toggleHeading({ level: 3 }).run()} active={editor.isActive(\"heading\", { level: 3 })} label=\"H3\" title=\"Subkop\" />\n <RteKnop className={k} on={() => editor.chain().focus().setParagraph().run()} active={editor.isActive(\"paragraph\")} label=\"¶\" title=\"Gewone tekst\" />\n <span className=\"xicms-ve-fmtbar__sep\" aria-hidden />\n <RteKnop className={k} on={() => editor.chain().focus().toggleBulletList().run()} active={editor.isActive(\"bulletList\")} label=\"•\" title=\"Opsomming\" />\n <RteKnop className={k} on={() => editor.chain().focus().toggleOrderedList().run()} active={editor.isActive(\"orderedList\")} label=\"1.\" title=\"Genummerde lijst\" />\n <RteKnop className={k} on={() => editor.chain().focus().toggleBlockquote().run()} active={editor.isActive(\"blockquote\")} label=\"❝\" title=\"Citaat\" />\n {siteId && <RteKnop className={k} on={openFoto} label=\"🖼\" title=\"Foto invoegen (of plak/sleep een foto in de tekst)\" />}\n <span className=\"xicms-ve-fmtbar__sep\" aria-hidden />\n <RteKnop className={k} on={() => editor.chain().focus().undo().run()} label=\"↶\" title=\"Ongedaan maken (Ctrl/Cmd+Z)\" />\n <RteKnop className={`${k} xicms-ve-fmtbar__klaar`} on={onKlaar} label=\"Klaar\" title=\"Klaar met deze tekst (Esc)\" />\n <span className=\"xicms-ve-fmtbar__tip\" aria-hidden>\n typ <kbd>/</kbd> voor meer\n </span>\n </div>\n {overlays}\n </>\n );\n}\n"],"mappings":"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","names":[]}