@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
@@ -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":";AAqWc,SAoCA,UAnCE,KADF;AAnWd,SAAS,aAAa,WAAW,SAAS,gBAAgB;AAG1D,SAAS,0BAA0B;AACnC,SAAS,UAAU,eAAe,yBAAyB;AAC3D,SAAS,kBAAkB;AA8B3B,SAAS,mBAA2B;AAClC,MAAI,QAAQ;AACZ,aAAW,MAAM,MAAM,KAAK,SAAS,iBAA8B,2DAA2D,CAAC,GAAG;AAChI,UAAM,MAAM,iBAAiB,EAAE,EAAE;AACjC,QAAI,QAAQ,WAAW,QAAQ,SAAU;AACzC,QAAI,GAAG,QAAQ,iCAAiC,EAAG;AACnD,UAAM,IAAI,GAAG,sBAAsB;AACnC,QAAI,EAAE,WAAW,KAAK,EAAE,MAAM,KAAK,EAAE,SAAS,OAAO,cAAc,EAAG;AACtE,YAAQ,KAAK,IAAI,OAAO,EAAE,MAAM;AAAA,EAClC;AACA,SAAO;AACT;AAEA,SAAS,KAAK,IAAmB;AAC/B,QAAM,IAAI,GAAG,sBAAsB;AACnC,SAAO,EAAE,KAAK,EAAE,KAAK,MAAM,EAAE,MAAM,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO;AACtE;AAEA,SAAS,OAAO,GAAgB,GAAyB;AACvD,SAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE;AACrG;AAGA,SAAS,kBAAkB,KAAoB,OAAiC;AAC9E,MAAI,OAA2B,IAAI,CAAC;AACpC,SAAO,QAAQ,SAAS,SAAS,CAAC,IAAI,MAAM,CAAC,MAAM,KAAM,SAAS,CAAC,CAAC,EAAG,QAAO,KAAK;AACnF,SAAO,QAAQ;AACjB;AAaO,SAAS,eAAe,MAAgC;AAI7D,QAAM,UAAU,oBAAI,IAA2B;AAC/C,aAAW,MAAM,MAAM,KAAK,KAAK,iBAA8B,mBAAmB,CAAC,GAAG;AACpF,UAAM,MAAM,GAAG,QAAQ,aAAa;AACpC,UAAM,KAAK;AACX,QAAI;AACJ,WAAQ,IAAI,GAAG,KAAK,GAAG,GAAI;AACzB,YAAM,QAAQ,IAAI,MAAM,GAAG,EAAE,KAAK;AAClC,UAAI,CAAC,YAAY,KAAK,KAAK,EAAG;AAC9B,YAAM,UAAU,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC;AAChC,cAAQ,IAAI,SAAS,CAAC,GAAI,QAAQ,IAAI,OAAO,KAAK,CAAC,GAAI,EAAE,CAAC;AAC1D,SAAG,YAAY,EAAE,QAAQ;AAAA,IAC3B;AAAA,EACF;AACA,QAAM,MAAmB,CAAC;AAC1B,aAAW,CAAC,SAAS,GAAG,KAAK,SAAS;AACpC,UAAM,CAAC,OAAO,GAAG,IAAI,QAAQ,MAAM,GAAG;AACtC,UAAM,UAAU,CAAC,GAAG,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,WAAW,EAAE,WAAW,GAAG,KAAK,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC;AAC7G,QAAI,KAAK,kBAAkB,KAAK,IAAI;AACpC,WAAO,GAAG,iBAAiB,GAAG,kBAAkB,QAAQ,CAAC,QAAQ,KAAK,CAAC,MAAM,GAAG,cAAe,SAAS,CAAC,CAAC,GAAG;AAE3G,UAAI,GAAG,cAAc,aAAa,kBAAkB,EAAG;AACvD,WAAK,GAAG;AAAA,IACV;AACA,QAAI,KAAK,EAAE,OAAO,OAAO,OAAO,GAAG,GAAG,GAAG,CAAC;AAAA,EAC5C;AACA,SAAO,IAAI,KAAK,CAAC,GAAG,MAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,cAAc,EAAE,KAAK,CAAE;AACtG;AAGO,SAAS,UAAU,OAAuB;AAC/C,SAAO,MAAM,QAAQ,kBAAkB,EAAE;AAC3C;AAGO,SAAS,aAAa,MAAc,MAA8C;AACvF,QAAM,aAAuB,CAAC;AAC9B,MAAI,eAAe,KAAK,IAAI,EAAG,YAAW,KAAK,KAAK,QAAQ,UAAU,MAAM,CAAC;AAC7E,MAAI,mBAAmB,KAAK,IAAI,EAAG,YAAW,KAAK,KAAK,QAAQ,cAAc,MAAM,CAAC;AACrF,MAAI,SAAS,KAAK,IAAI,EAAG,YAAW,KAAK,KAAK,QAAQ,UAAU,MAAM,CAAC;AACvE,aAAW,KAAK,YAAY;AAC1B,UAAM,SAAS,EAAE,MAAM,GAAG,EAAE,OAAgB,CAAC,GAAG,MAAO,KAAK,OAAO,SAAa,EAA8B,CAAC,GAAI,IAAI;AACvH,QAAI,WAAW,OAAW,QAAO;AAAA,EACnC;AACA,SAAO;AACT;AAEA,SAAS,KAAK,GAAY,KAAsB;AAC9C,SAAO,IAAI,MAAM,GAAG,EAAE,OAAgB,CAAC,GAAG,MAAO,KAAK,OAAO,SAAa,EAA8B,CAAC,GAAI,CAAC;AAChH;AACA,SAAS,IAAO,GAAM,KAAa,QAAoB;AACrD,QAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,QAAM,QAAQ,CAAC,MAAqB,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,MAAM,WAAW,EAAE,GAAI,EAAa,IAAI;AACpH,QAAM,SAAS,MAAM,CAAC;AACtB,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,QAAI,MAAM,CAAC,CAAC,IAAI,MAAM,IAAI,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;AACzC,UAAM,IAAI,MAAM,CAAC,CAAC;AAAA,EACpB;AACA,MAAI,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;AAC/B,SAAO;AACT;AAGO,SAAS,aAAa,QAA0B;AAErD,QAAM,cAAc;AACpB,SAAO,OACJ,OAAO,CAAC,MAAM,CAAC,kBAAkB,IAAI,EAAE,GAAG,KAAK,CAAC,YAAY,KAAK,EAAE,GAAG,CAAC,EACvE;AAAA,IACC,CAAC,MACE,EAAE,SAAS,YAAY,EAAE,QAAQ,UAAU,KAAK,EAAE,QAAQ,UAAU,KACpE,EAAE,SAAS,YAAY,EAAE,QAAQ,UAAa,EAAE,QAAQ,UAAa,EAAE,MAAM,EAAE,OAAO,KAAK,EAAE,QAAQ;AAAA,EAC1G,EACC,MAAM,GAAG,CAAC;AACf;AAEO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAUG;AACD,QAAM,CAAC,MAAM,OAAO,IAAI,SAA6B,IAAI;AACzD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAsD,CAAC,CAAC;AAClF,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAkD,IAAI;AAChF,QAAM,CAAC,UAAU,WAAW,IAAI,SAAsB,IAAI;AAC1D,QAAM,CAAC,UAAU,WAAW,IAAI,SAA6D,IAAI;AACjG,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,CAAC;AACtC,YAAU,MAAM;AACd,UAAM,SAAS,MAAM,UAAU,iBAAiB,CAAC;AACjD,WAAO;AACP,WAAO,iBAAiB,UAAU,MAAM;AACxC,WAAO,MAAM,OAAO,oBAAoB,UAAU,MAAM;AAAA,EAC1D,GAAG,CAAC,CAAC;AAEL,QAAM,SAAS,QAAQ,MAAM;AAC3B,QAAI,CAAC,KAAK,OAAQ,QAAO,CAAC;AAC1B,QAAI;AACF,aAAO,cAAc,mBAAmB,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,IAAI;AAAA,IAC3E,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AACR,QAAM,SAAS,QAAQ,MAAM,aAAa,MAAM,GAAG,CAAC,MAAM,CAAC;AAK3D,QAAM,CAAC,UAAU,WAAW,IAAI,SAA6B,IAAI;AACjE,YAAU,MAAM;AACd,QAAI,WAAW;AACf,QAAI,QAAQ;AACZ,UAAM,OAAO,MAAM;AACjB,YAAM,KAAK,SAAS,cAA2B,sBAAsB,IAAI,OAAO,KAAK,IAAI,CAAC,IAAI;AAC9F,UAAI,GAAI,aAAY,EAAE;AAAA,eACb,EAAE,WAAW,IAAK,SAAQ,sBAAsB,IAAI;AAAA,IAC/D;AACA,SAAK;AACL,WAAO,MAAM,qBAAqB,KAAK;AAAA,EACzC,GAAG,CAAC,KAAK,IAAI,CAAC;AAEd,YAAU,MAAM;AACd,UAAM,KAAK;AACX,YAAQ,EAAE;AACV,QAAI,CAAC,GAAI;AACT,QAAI,QAAQ;AACZ,UAAM,OAAO,MAAM;AACjB,YAAMA,YAAW,eAAe,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,EAAE,EAAE,EAAE;AACtG,eAAS,CAAC,MAAO,EAAE,WAAWA,UAAS,UAAU,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,UAAUA,UAAS,CAAC,EAAE,SAAS,EAAE,UAAUA,UAAS,CAAC,EAAE,SAAS,OAAO,EAAE,GAAGA,UAAS,CAAC,EAAE,CAAC,CAAC,IAAI,IAAIA,SAAS;AAEhL,UAAI,IAAI,KAAK,EAAE;AACf,UAAI,EAAE,UAAU,KAAK,EAAE,WAAW,GAAG;AACnC,cAAM,OAAO,MAAM,KAAK,GAAG,QAAQ,EAAE,IAAI,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM;AAChF,YAAI,KAAK,QAAQ;AACf,gBAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;AAC9C,gBAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAChD,cAAI,EAAE,KAAK,MAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,IAAI;AAAA,QAC9I;AAAA,MACF;AACA,kBAAY,CAAC,MAAO,OAAO,GAAG,CAAC,IAAI,IAAI,CAAE;AAAA,IAC3C;AACA,UAAM,OAAO,MAAM;AACjB,2BAAqB,KAAK;AAC1B,cAAQ,sBAAsB,IAAI;AAAA,IACpC;AACA,SAAK;AACL,UAAM,MAAM,IAAI,iBAAiB,IAAI;AACrC,QAAI,QAAQ,IAAI,EAAE,WAAW,MAAM,SAAS,MAAM,eAAe,KAAK,CAAC;AACvE,WAAO,iBAAiB,UAAU,MAAM,EAAE,SAAS,MAAM,SAAS,KAAK,CAAC;AACxE,WAAO,iBAAiB,UAAU,IAAI;AACtC,WAAO,MAAM;AACX,2BAAqB,KAAK;AAC1B,UAAI,WAAW;AACf,aAAO,oBAAoB,UAAU,MAAM,EAAE,SAAS,KAAK,CAAC;AAC5D,aAAO,oBAAoB,UAAU,IAAI;AAAA,IAC3C;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAGb,YAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,OAAO,CAAC,SAA6B;AACzC,UAAI,CAAC,KAAM;AAEX,YAAM,KAAK,eAAe,IAAI,EAC3B,OAAO,CAAC,MAAM,EAAE,GAAG,SAAS,IAAI,CAAC,EACjC,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,MAAM,GAAG,EAAE,SAAS,EAAE,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,CAAC;AAC1E,eAAS,KAAK,EAAE,OAAO,GAAG,OAAO,OAAO,GAAG,MAAM,IAAI,IAAI;AACzD,YAAM,SAAS,KAAK,QAAqB,mBAAmB;AAC5D,YAAM,OAAO,QAAQ,QAAQ;AAC7B,YAAM,WAAW,OAAO,aAAa,MAAM,IAAI,IAAI;AACnD,UAAI,UAAU,QAAQ,SAAU,aAAY,EAAE,MAAM,UAAU,GAAG,KAAK,MAAM,EAAE,CAAC;AAAA,IACjF;AACA,UAAM,SAAS,CAAC,MAAa,KAAK,EAAE,MAAqB;AACzD,SAAK,iBAAiB,aAAa,MAAM;AACzC,SAAK,iBAAiB,WAAW,MAAM;AACvC,WAAO,MAAM;AACX,WAAK,oBAAoB,aAAa,MAAM;AAC5C,WAAK,oBAAoB,WAAW,MAAM;AAAA,IAC5C;AAAA,EACF,GAAG,CAAC,MAAM,IAAI,CAAC;AAEf,YAAU,MAAM;AACd,QAAI,CAAC,YAAY,CAAC,KAAM;AACxB,UAAM,iBAAiB,MAAM;AAC3B,YAAM,KAAK,KAAK,cAA2B,qBAAqB,IAAI,OAAO,SAAS,IAAI,CAAC,IAAI;AAC7F,UAAI,CAAC,GAAI,QAAO,YAAY,IAAI;AAChC,YAAM,IAAI,KAAK,EAAE;AACjB,kBAAY,CAAC,MAAO,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,EAAE,IAAI,CAAE;AAAA,IAC7D;AACA,WAAO,iBAAiB,UAAU,gBAAgB,EAAE,SAAS,MAAM,SAAS,KAAK,CAAC;AAClF,WAAO,MAAM,OAAO,oBAAoB,UAAU,gBAAgB,EAAE,SAAS,KAAK,CAAC;AAAA,EACrF,GAAG,CAAC,UAAU,IAAI,CAAC;AAEnB,QAAM,aAAa;AAAA,IACjB,CAAC,OAAe,OAAe,UAAqD;AAClF,YAAM,MAAM,CAAC,GAAK,KAAK,MAAM,KAAK,KAAmB,CAAC,CAAE;AACxD,UAAI,UAAU,YAAY,QAAQ,EAAG,EAAC,IAAI,QAAQ,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,QAAQ,CAAC,CAAC;AAAA,eACtF,UAAU,YAAY,QAAQ,IAAI,SAAS,EAAG,EAAC,IAAI,QAAQ,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,QAAQ,CAAC,CAAC;AAAA,eACxG,UAAU,YAAa,KAAI,OAAO,QAAQ,GAAG,GAAG,gBAAgB,IAAI,KAAK,CAAC,CAAC;AAAA,eAC3E,UAAU,MAAO,KAAI,OAAO,OAAO,CAAC;AAAA,UACxC;AACL,eAAS,IAAI,MAAM,OAAO,GAAG,CAAC;AAC9B,UAAI,UAAU,MAAO,cAAa,SAAS,KAAK,OAAO,UAAU,KAAK,CAAC,KAAK,WAAW;AACvF,eAAS,IAAI;AAAA,IACf;AAAA,IACA,CAAC,MAAM,UAAU,YAAY;AAAA,EAC/B;AAEA,QAAM,UAAU;AAAA,IACd,CAAC,UAAkB;AACjB,YAAM,MAAM,CAAC,GAAK,KAAK,MAAM,KAAK,KAAmC,CAAC,CAAE;AACxE,YAAM,YAAY,IAAI,IAAI,SAAS,CAAC,KAAM,KAAK,KAAK,WAAW,KAAK,CAAC,GAAG,UAAU,KAAK,CAAC,IAA8C,CAAC,KAAK,CAAC;AAC7I,YAAM,QAAQ,gBAAgB,SAAS;AAEvC,YAAM,QAAQ,SAAS,KAAK,OAAO,UAAU,KAAK,CAAC,KAAK,aAAa,YAAY;AACjF,YAAM,SAAS,CAAC,SAAS,QAAQ,SAAS,YAAY,KAAK,UAAU,KAAK,EAAE,KAAK,CAAC,MAAM,OAAO,MAAM,CAAC,MAAM,QAAQ;AACpH,UAAI,OAAQ,OAAM,MAAM,IAAI,UAAU,IAAI;AAC1C,iBAAW,KAAK,CAAC,YAAY,aAAa,EAAG,KAAI,KAAK,MAAO,OAAM,CAAC,IAAI;AACxE,UAAI,KAAK,KAAK;AACd,eAAS,IAAI,MAAM,OAAO,GAAG,CAAC;AAC9B,UAAI,OAAQ,aAAY,GAAG,KAAK,IAAI,IAAI,SAAS,CAAC,IAAI,MAAM,EAAE;AAAA,IAChE;AAAA,IACA,CAAC,MAAM,KAAK,UAAU,WAAW;AAAA,EACnC;AAGA,QAAM,UAAU,QAAQ,MAAM;AAC5B,UAAM,IAAI,oBAAI,IAAkB;AAChC,eAAW,MAAM,MAAO,GAAE,IAAI,GAAG,OAAO,GAAG,CAAC;AAC5C,WAAO;AAAA,EACT,GAAG,CAAC,KAAK,CAAC;AACV,QAAM,YAAY,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,UAAU,MAAM,SAAS,EAAE,UAAU,MAAM,KAAK,IAAI;AAClG,QAAM,SAAS,CAAC,WAAoB,KAAK,MAAM,KAAK,KAAmB,CAAC,GAAG;AAE3E,QAAM,SAAS,WAAW,OAAO,KAAK,MAAM,SAAS,QAAQ,KAAK,EAAE,IAAI;AACxE,QAAM,YAAY,CAAC,MAAY,EAAE,MAAM,EAAE,SAAS,UAAU,EAAE,MAAM,OAAO;AAE3E,SACE,iCAEG;AAAA,gBAAY,UAAU,QAAQ,KAAK,OAAO,SAAS,KAClD;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAK;AAAA,QACL,cAAY,mBAAmB,KAAK,SAAS,EAAE;AAAA,QAG/C,OAAO,EAAE,KAAK,SAAS,MAAM,KAAK,SAAS,IAAI,SAAS,MAAM,KAAK,KAAK,IAAI,SAAS,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,KAAK,IAAI,SAAS,MAAM,CAAC,EAAE;AAAA,QAC5I,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,QAEpC;AAAA,iBAAO,IAAI,CAAC,MAAM;AACjB,kBAAM,SAAS,KAAK,EAAE,GAAG;AACzB,kBAAM,SACJ,EAAE,SAAS,WACP,EAAE,QAAQ,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAkB,OAAO,EAAE,MAAM,EAAE,IACpE,MAAM,KAAK,EAAE,QAAS,EAAsB,MAAO,EAAsB,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM;AAC5F,oBAAM,IAAK,EAAsB,MAAM;AACvC,qBAAO,EAAE,OAAO,GAAc,OAAO,OAAO,CAAC,EAAE;AAAA,YACjD,CAAC;AACP,kBAAM,SAAS,WAAW,EAAE,SAAS,WAAY,EAAE,aAAa,EAAE,QAAQ,CAAC,GAAG,QAAS;AACvF,mBACE,qBAAC,UAAiB,WAAU,wBAAuB,MAAK,cAAa,cAAY,EAAE,OACjF;AAAA,kCAAC,UAAK,WAAU,wBAAwB,YAAE,OAAM;AAAA,cAC/C,OAAO,IAAI,CAAC,MACX;AAAA,gBAAC;AAAA;AAAA,kBAEC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,gBAAc,WAAW,EAAE;AAAA,kBAC3B,WAAU;AAAA,kBACV,SAAS,MAAM,SAAS,EAAE,GAAG,MAAM,CAAC,EAAE,GAAG,GAAG,EAAE,MAAM,CAAC;AAAA,kBAEpD,YAAE;AAAA;AAAA,gBAPE,OAAO,EAAE,KAAK;AAAA,cAQrB,CACD;AAAA,iBAbQ,EAAE,GAcb;AAAA,UAEJ,CAAC;AAAA,UACD,oBAAC,YAAO,MAAK,UAAS,WAAU,uBAAsB,SAAS,gBAAgB,OAAM,mCAAkC,yBAEvH;AAAA;AAAA;AAAA,IACF;AAAA,IAID,aAAa,UAAU,UAAU,CAAC,KACjC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAK;AAAA,QACL,cAAY,GAAG,SAAS,KAAK,OAAO,UAAU,UAAU,KAAK,CAAC,KAAK,WAAW,IAAI,UAAU,QAAQ,CAAC;AAAA,QACrG,OAAO,EAAE,KAAK,KAAK,IAAI,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,KAAK,IAAI,UAAU,EAAE,OAAO,UAAU,EAAE,QAAQ,GAAG,GAAG,EAAE;AAAA,QACvH,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,QAEnC,iBAAM;AACN,gBAAM,OAAO,SAAS,KAAK,OAAO,UAAU,UAAU,KAAK,CAAC,KAAK;AACjE,gBAAM,IAAI,OAAO,UAAU,KAAK;AAChC,iBACE,iCACE;AAAA,gCAAC,YAAO,MAAK,UAAS,OAAO,GAAG,IAAI,eAAe,cAAY,GAAG,IAAI,eAAe,UAAU,UAAU,UAAU,GAAG,SAAS,MAAM,WAAW,UAAU,OAAO,UAAU,OAAO,QAAQ,GAAG,oBAE7L;AAAA,YACA,oBAAC,YAAO,MAAK,UAAS,OAAO,GAAG,IAAI,kBAAkB,cAAY,GAAG,IAAI,kBAAkB,UAAU,UAAU,SAAS,IAAI,GAAG,SAAS,MAAM,WAAW,UAAU,OAAO,UAAU,OAAO,QAAQ,GAAG,oBAEtM;AAAA,YACA,oBAAC,YAAO,MAAK,UAAS,OAAO,GAAG,IAAI,eAAe,cAAY,GAAG,IAAI,eAAe,SAAS,MAAM,WAAW,UAAU,OAAO,UAAU,OAAO,WAAW,GAAG,oBAE/J;AAAA,YACA,oBAAC,YAAO,MAAK,UAAS,WAAU,aAAY,OAAO,GAAG,IAAI,aAAa,cAAY,GAAG,IAAI,aAAa,SAAS,MAAM,WAAW,UAAU,OAAO,UAAU,OAAO,KAAK,GAAG,uBAE3K;AAAA,aACF;AAAA,QAEJ,GAAG;AAAA;AAAA,IACL;AAAA,IAID,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM;AAIhC,YAAM,SAAS,MAAM,MAAM,GAAG,EAAE;AAChC,YAAM,QAAQ,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,UAAU,SAAS,MAAM,MAAM,GAAG,EAAE,SAAS,UAAU,KAAK,IAAI,GAAG,MAAM,GAAG,UAAU,EAAE,MAAM,EAAE,OAAO,IAAI,EAAE;AAC9J,aAAO,CAAC,OAAO,QAAQ,EAAE,GAAG,GAAG,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC;AAAA,IAC5D,CAAC,EAAE;AAAA,MAAI,CAAC,CAAC,OAAO,CAAC;AAAA;AAAA,QAEf,EAAE,MAAM,EAAE,SAAS,UAAU,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,cAC1D;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,YAC/D,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,YACrC,SAAS,MAAM,QAAQ,KAAK;AAAA,YAC7B;AAAA;AAAA,cACI,SAAS,KAAK,OAAO,UAAU,KAAK,CAAC,KAAK;AAAA;AAAA;AAAA,UAPxC;AAAA,QAQP,IACE;AAAA;AAAA,IACN;AAAA,IAGC,YAAY,UAAU,SAAS,CAAC,KAC/B;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,SAAS,EAAE,SAAS,GAAG,MAAM,SAAS,EAAE,KAAK;AAAA,QAC5E,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,QACrC,SAAS,MAAM,YAAY,IAAI;AAAA,QAC/B,OAAM;AAAA,QACP;AAAA;AAAA,UACK,CAAC,UAAU,WAAW,MAAM,kCAAkC,OAAO,QAAQ,gBAAgB,EAAE;AAAA;AAAA;AAAA,IACrG;AAAA,IAEF;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,cAAc;AAAA,QACd;AAAA,QACA,QAAQ,WAAW,MAAM,KAAK;AAAA,QAC9B,SAAS,CAAC,SAAS;AACjB,cAAI,SAAU,UAAS,IAAI,MAAM,SAAS,UAAU,QAAQ,EAAE,CAAC;AAAA,QACjE;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;","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":[]}