@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
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { registerBuiltinSchemas } from "../../blocks/builtinSchemas.js";
4
4
  import { useModules } from "../../modules/context.js";
5
5
  registerBuiltinSchemas();
@@ -13,9 +13,8 @@ import { MediaPickerDialog, MediaPickerButton } from "../media/MediaPicker.js";
13
13
  import { Switch } from "../ui/switch.js";
14
14
  import { titelMeter, omschrijvingMeter } from "../lib/seoHulp.js";
15
15
  import { useThemeVars } from "../../XiCMSProvider.js";
16
- import { buildBlockAddOptions } from "../../blocks/registry.js";
17
16
  import DOMPurify from "dompurify";
18
- import { createPage, getDraftByPath, getPublishedPage, saveDraft, publishPage, subscribeDraft, subscribeVersions, restoreVersion } from "../lib/pagesClient.js";
17
+ import { createPage, getDraftByPath, getPublishedPage, saveDraft, publishPage, publicatieContext, subscribeDraft, subscribeVersions, restoreVersion } from "../lib/pagesClient.js";
19
18
  import { isDemoActive } from "../../demo/demoStore.js";
20
19
  import { setProductField } from "../shop/productClient.js";
21
20
  import { ProductPaneel } from "../shop/ProductPaneel.js";
@@ -26,10 +25,19 @@ import { useEditor } from "../../editor/EditorProvider.js";
26
25
  import { AdminModes, EditbarBrand } from "../../components/EditBar.js";
27
26
  import { aantalWijzigingen, bepaalWijzigingen, GEEN_WIJZIGINGEN } from "./wijzigingen.js";
28
27
  import { TranslationPanel } from "./TranslationPanel.js";
29
- import { PatternInserter } from "../patterns/PatternInserter.js";
30
28
  import { Button, Field, Input, Textarea } from "../ui/primitives.js";
31
29
  import { Select } from "../ui/select.js";
32
30
  import { ToastProvider, useToast } from "../ui/toast.js";
31
+ import { InlineRijkeTekst, RIJK_ATTR } from "./InlineRijkeTekst.js";
32
+ import { PreviewLinkResultaat } from "../ui/PreviewLinkResultaat.js";
33
+ import { controleerPagina } from "../lib/publicatieCheck.js";
34
+ import { heroBeeldPatch } from "../lib/heroHulp.js";
35
+ import { lengteAdvies } from "../lib/lengteAdvies.js";
36
+ import { vertaalVelden, veldLabel } from "../lib/veldTaal.js";
37
+ import { InlineGereedschap, snelleKeuzes, vindLijstItems } from "./InlineGereedschap.js";
38
+ import { BlokKader, BlokKiezer, TussenPlus } from "./BlokKiezer.js";
39
+ import { Icon } from "../ui/Icon.js";
40
+ import { isTekstVeld } from "../lib/tekstVeld.js";
33
41
  import { ConfirmHost, useConfirm } from "../ui/ConfirmDialog.js";
34
42
  const GLOBAL_INLINE = [
35
43
  // `field: "html"` is de AANNAME, geen wet: een element mag met `data-xicms-edit` zeggen welk veld
@@ -83,7 +91,7 @@ function stableStringify(value) {
83
91
  return JSON.stringify(value) ?? "null";
84
92
  }
85
93
  function VisualEditor({ onClose }) {
86
- return /* @__PURE__ */ jsx("div", { className: "xicms-admin xicms-ve", children: /* @__PURE__ */ jsx(ToastProvider, { children: /* @__PURE__ */ jsx(ConfirmHost, { children: /* @__PURE__ */ jsx(VisualEditorInner, { onClose }) }) }) });
94
+ return /* @__PURE__ */ jsx("div", { className: "xicms-admin xicms-ve", children: /* @__PURE__ */ jsx(ToastProvider, { positie: "topEnd", children: /* @__PURE__ */ jsx(ConfirmHost, { children: /* @__PURE__ */ jsx(VisualEditorInner, { onClose }) }) }) });
87
95
  }
88
96
  function VisualEditorInner({ onClose }) {
89
97
  const config = useSiteConfig();
@@ -104,6 +112,10 @@ function VisualEditorInner({ onClose }) {
104
112
  const [panelOpen, setPanelOpen] = useState(false);
105
113
  const [status, setStatus] = useState("loading");
106
114
  const [selectedKey, setSelectedKey] = useState(null);
115
+ const [kiezerOpen, setKiezerOpen] = useState(false);
116
+ const [invoegNa, setInvoegNa] = useState(null);
117
+ const selectedKeyRef = useRef(null);
118
+ selectedKeyRef.current = selectedKey;
107
119
  const [selectedProduct, setSelectedProduct] = useState(null);
108
120
  const [publishing, setPublishing] = useState(false);
109
121
  const [imgPicker, setImgPicker] = useState(null);
@@ -212,7 +224,9 @@ function VisualEditorInner({ onClose }) {
212
224
  // Alleen meesturen wanneer aanwezig: `undefined` weigert de Firestore-client.
213
225
  ...d.translations ? { translations: d.translations } : {}
214
226
  });
227
+ const rijkFlushRef = useRef(null);
215
228
  const flushSave = useCallback(async () => {
229
+ rijkFlushRef.current?.();
216
230
  document.activeElement?.blur();
217
231
  const d = draftRef.current;
218
232
  if (!d || !dirtyRef.current) return;
@@ -369,24 +383,6 @@ function VisualEditorInner({ onClose }) {
369
383
  },
370
384
  [mutateDraft, locale]
371
385
  );
372
- const [fmtBar, setFmtBar] = useState(null);
373
- const fmtElRef = useRef(null);
374
- const positionFmtBar = useCallback((el) => {
375
- const r = el.getBoundingClientRect();
376
- setFmtBar({
377
- top: Math.max(56, r.top - 44),
378
- left: Math.min(Math.max(8, r.left), Math.max(8, window.innerWidth - 300))
379
- });
380
- }, []);
381
- useEffect(() => {
382
- if (!fmtBar) return;
383
- const onScroll = () => {
384
- const el = fmtElRef.current;
385
- if (el) positionFmtBar(el);
386
- };
387
- window.addEventListener("scroll", onScroll, { capture: true, passive: true });
388
- return () => window.removeEventListener("scroll", onScroll, { capture: true });
389
- }, [fmtBar !== null, positionFmtBar]);
390
386
  const commitText = useCallback(
391
387
  (key, field, value) => {
392
388
  if (isTranslating) setTranslation(`${key}.${field}`, value);
@@ -579,10 +575,22 @@ function VisualEditorInner({ onClose }) {
579
575
  };
580
576
  }, [draft, wijzigingen, displayBlocks]);
581
577
  const [spots, setSpots] = useState([]);
578
+ const lengteGemeld = useRef(/* @__PURE__ */ new Set());
582
579
  const targetsRef = useRef([]);
583
580
  const editingRef = useRef(null);
584
581
  const wilInlineRef = useRef(false);
585
582
  const [editingIndex, setEditingIndex] = useState(null);
583
+ const [rijk, setRijk] = useState(null);
584
+ const stopRijk = useCallback(() => {
585
+ setRijk(null);
586
+ setEditingIndex(null);
587
+ }, []);
588
+ useEffect(() => {
589
+ if (editingIndex !== null && toonStartHint) sluitStartHint();
590
+ }, [editingIndex, toonStartHint, sluitStartHint]);
591
+ useEffect(() => {
592
+ setRijk((r) => r && r.key !== selectedKey ? null : r);
593
+ }, [selectedKey]);
586
594
  const stopInline = useCallback((el) => {
587
595
  el.removeAttribute("contenteditable");
588
596
  el.classList.remove("is-editing");
@@ -592,9 +600,20 @@ function VisualEditorInner({ onClose }) {
592
600
  }
593
601
  }, []);
594
602
  const meldGeenTekst = useCallback(() => {
603
+ const key = selectedKeyRef.current;
604
+ const blok = blocksRef.current.find((b) => b._key === key);
605
+ const def = blok ? registryRef.current.get(String(blok._type)) : void 0;
606
+ let keuzes = 0;
607
+ try {
608
+ keuzes = def?.schema ? snelleKeuzes(vertaalVelden(introspectToFields(def.schema, def.fields), def.type)).length : 0;
609
+ } catch {
610
+ keuzes = 0;
611
+ }
612
+ const host = key ? document.querySelector(`[data-xicms-block="${CSS.escape(key)}"]`) : null;
613
+ if (keuzes > 0 || host && vindLijstItems(host).length > 0) return;
595
614
  toast({
596
- title: "Dit blok heeft geen eigen tekst",
597
- description: "Wijs een product aan voor zijn naam, of gebruik het tandwiel voor de instellingen van dit blok."
615
+ title: "Hier valt op de pagina niets te typen",
616
+ description: "Wijs een product aan voor zijn naam, of gebruik het tandwiel \u2699 voor de instellingen van dit blok."
598
617
  });
599
618
  }, [toast]);
600
619
  const startInline = useCallback((index) => {
@@ -602,6 +621,14 @@ function VisualEditorInner({ onClose }) {
602
621
  if (!target) return;
603
622
  const { el } = target;
604
623
  if (editingRef.current && editingRef.current !== el) editingRef.current.blur();
624
+ if (target.html) {
625
+ const key = el.closest("[data-xicms-block]")?.dataset.xicmsBlock;
626
+ if (!key) return;
627
+ setRijk({ el, key, field: target.field });
628
+ setEditingIndex(index);
629
+ return;
630
+ }
631
+ setRijk(null);
605
632
  el.setAttribute("contenteditable", "true");
606
633
  el.setAttribute("spellcheck", "true");
607
634
  el.classList.add("is-editing");
@@ -615,6 +642,17 @@ function VisualEditorInner({ onClose }) {
615
642
  selection?.removeAllRanges();
616
643
  selection?.addRange(range);
617
644
  }, []);
645
+ const startVeld = useCallback((veld) => {
646
+ let pogingen = 0;
647
+ const probeer = () => {
648
+ const i = targetsRef.current.findIndex((t) => t.field === veld);
649
+ if (i >= 0) {
650
+ targetsRef.current[i].el.scrollIntoView({ block: "nearest", behavior: "smooth" });
651
+ startInline(i);
652
+ } else if (++pogingen < 20) requestAnimationFrame(probeer);
653
+ };
654
+ requestAnimationFrame(probeer);
655
+ }, [startInline]);
618
656
  useEffect(() => {
619
657
  if (!selectedKey) {
620
658
  targetsRef.current = [];
@@ -630,7 +668,7 @@ function VisualEditorInner({ onClose }) {
630
668
  const labels = /* @__PURE__ */ new Map();
631
669
  if (def) {
632
670
  try {
633
- for (const f of introspectToFields(def.schema, def.fields)) labels.set(f.key, f.label);
671
+ for (const f of vertaalVelden(introspectToFields(def.schema, def.fields), def.type)) labels.set(f.key, f.label);
634
672
  } catch {
635
673
  }
636
674
  }
@@ -640,19 +678,16 @@ function VisualEditorInner({ onClose }) {
640
678
  el.dataset.veInline = "1";
641
679
  el.classList.add("xicms-ve-inline");
642
680
  el.addEventListener("blur", () => {
643
- commitText(selectedKey, field, html ? DOMPurify.sanitize(el.innerHTML) : el.textContent ?? "");
681
+ const waarde = html ? DOMPurify.sanitize(el.innerHTML) : el.textContent ?? "";
682
+ commitText(selectedKey, field, waarde);
644
683
  stopInline(el);
684
+ const advies = html ? null : lengteAdvies(field, waarde);
685
+ const sleutel = `${selectedKey}.${field}`;
686
+ if (advies && !lengteGemeld.current.has(sleutel)) {
687
+ lengteGemeld.current.add(sleutel);
688
+ toast({ title: "Lange tekst", description: advies });
689
+ }
645
690
  });
646
- if (html) {
647
- el.addEventListener("focus", () => {
648
- fmtElRef.current = el;
649
- positionFmtBar(el);
650
- });
651
- el.addEventListener("blur", () => {
652
- fmtElRef.current = null;
653
- setFmtBar(null);
654
- });
655
- }
656
691
  el.addEventListener("keydown", (e) => {
657
692
  if (e.key === "Escape") {
658
693
  e.stopPropagation();
@@ -666,11 +701,13 @@ function VisualEditorInner({ onClose }) {
666
701
  };
667
702
  const measure = () => {
668
703
  const next = targetsRef.current.map(({ el, field }) => {
669
- const r = el.getBoundingClientRect();
704
+ const zicht = el.style.display === "none" && el.nextElementSibling?.hasAttribute(RIJK_ATTR) ? el.nextElementSibling : el;
705
+ const r = zicht.getBoundingClientRect();
706
+ const uitBeeld = r.bottom < 56 || r.top > window.innerHeight - 8 || r.width === 0 && r.height === 0;
670
707
  return {
671
- top: Math.min(window.innerHeight - 22, Math.max(4, r.top + r.height / 2 - 9)),
708
+ top: uitBeeld ? -9999 : Math.min(window.innerHeight - 22, Math.max(4, r.top + r.height / 2 - 9)),
672
709
  left: Math.min(window.innerWidth - 22, Math.max(4, r.right + 6)),
673
- title: `Bewerk: ${labels.get(field) ?? field}`
710
+ title: `Bewerk: ${labels.get(field) ?? veldLabel(field.split(".").pop() ?? field)}`
674
711
  };
675
712
  });
676
713
  setSpots(
@@ -681,7 +718,9 @@ function VisualEditorInner({ onClose }) {
681
718
  const found = [];
682
719
  for (const m of GLOBAL_INLINE) {
683
720
  host.querySelectorAll(m.selector).forEach((el) => {
721
+ if (el.closest(`[${RIJK_ATTR}]`)) return;
684
722
  const field = el.dataset.xicmsEdit ?? m.field;
723
+ if (!isTekstVeld(el, field)) return;
685
724
  bind(el, field, !!m.html);
686
725
  found.push({ el, field, html: !!m.html });
687
726
  });
@@ -729,7 +768,7 @@ function VisualEditorInner({ onClose }) {
729
768
  targetsRef.current = [];
730
769
  setSpots([]);
731
770
  };
732
- }, [selectedKey, commitText, positionFmtBar, stopInline, startInline, toast]);
771
+ }, [selectedKey, commitText, stopInline, startInline, toast]);
733
772
  const dirtySinceRef = useRef(null);
734
773
  useEffect(() => {
735
774
  if (!draft) return;
@@ -752,10 +791,36 @@ function VisualEditorInner({ onClose }) {
752
791
  dirtyRef.current = false;
753
792
  setStatus("saved");
754
793
  }
755
- }).catch(() => setStatus("error"));
794
+ }).catch(() => {
795
+ setStatus("error");
796
+ setHerpoging((n) => n + 1);
797
+ });
756
798
  }, delay);
757
799
  return () => clearTimeout(t);
758
800
  }, [draft, siteId, conflict]);
801
+ const [online, setOnline] = useState(() => typeof navigator === "undefined" ? true : navigator.onLine);
802
+ const [herpoging, setHerpoging] = useState(0);
803
+ useEffect(() => {
804
+ const aan = () => setOnline(true);
805
+ const uit = () => setOnline(false);
806
+ window.addEventListener("online", aan);
807
+ window.addEventListener("offline", uit);
808
+ return () => {
809
+ window.removeEventListener("online", aan);
810
+ window.removeEventListener("offline", uit);
811
+ };
812
+ }, []);
813
+ useEffect(() => {
814
+ if (status !== "error" || !online || conflict) return;
815
+ const wacht = Math.min(12e4, 5e3 * 3 ** Math.max(0, herpoging - 1));
816
+ const t = setTimeout(() => {
817
+ void flushSave().then(() => setHerpoging(0)).catch(() => {
818
+ setStatus("error");
819
+ setHerpoging((n) => n + 1);
820
+ });
821
+ }, wacht);
822
+ return () => clearTimeout(t);
823
+ }, [status, online, conflict, herpoging, flushSave]);
759
824
  useEffect(() => {
760
825
  const beforeUnload = (e) => {
761
826
  if (dirtyRef.current || nietLiveRef.current) {
@@ -849,12 +914,50 @@ function VisualEditorInner({ onClose }) {
849
914
  if (selectedKey === blk._key) setSelectedKey(null);
850
915
  toast({ title: "Losgekoppeld", description: "Dit is nu een losse kopie.", tone: "success" });
851
916
  }
917
+ function publiceerSamenvatting(pad, demo = false, waarschuwingen = []) {
918
+ const namen = blocks.filter((b) => wijzigingen.blokken.has(b._key) || wijzigingen.velden.has(b._key)).map((b) => registry.get(String(b._type))?.label ?? String(b._type));
919
+ const uniek = [...new Set(namen)];
920
+ return /* @__PURE__ */ jsxs("div", { className: "grid gap-1", children: [
921
+ !demo && /* @__PURE__ */ jsxs("p", { children: [
922
+ "De live site wordt bijgewerkt (",
923
+ pad,
924
+ ")."
925
+ ] }),
926
+ wijzigingen.iets && /* @__PURE__ */ jsxs("p", { children: [
927
+ aantalWijzigingen(wijzigingen),
928
+ uniek.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
929
+ " in: ",
930
+ uniek.slice(0, 6).join(", "),
931
+ uniek.length > 6 ? ` en ${uniek.length - 6} meer` : ""
932
+ ] }),
933
+ wijzigingen.verwijderd > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
934
+ " \xB7 ",
935
+ wijzigingen.verwijderd === 1 ? "1 blok verwijderd" : `${wijzigingen.verwijderd} blokken verwijderd`
936
+ ] }),
937
+ "."
938
+ ] }),
939
+ waarschuwingen.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mt-2 rounded-lg bg-amber-50 px-3 py-2 text-amber-900", children: [
940
+ /* @__PURE__ */ jsx("p", { className: "font-medium", children: "Even nakijken (je kunt ook gewoon publiceren):" }),
941
+ /* @__PURE__ */ jsx("ul", { className: "mt-1 list-disc pl-5", children: waarschuwingen.map((w, i) => /* @__PURE__ */ jsx("li", { children: w.tekst }, i)) })
942
+ ] })
943
+ ] });
944
+ }
852
945
  async function remove(i) {
853
- const ok = await confirm({ title: "Blok verwijderen?", confirmLabel: "Verwijderen", tone: "danger" });
854
- if (!ok) return;
855
946
  const removed = blocks[i];
947
+ const def = registry.get(String(removed._type));
948
+ if (def?.essentieel) {
949
+ const ok = await confirm({
950
+ title: `${def.label} verwijderen?`,
951
+ description: def.essentieel,
952
+ confirmLabel: "Toch verwijderen",
953
+ tone: "danger"
954
+ });
955
+ if (!ok) return;
956
+ }
856
957
  setBlocks(blocks.filter((_, idx) => idx !== i));
857
958
  if (selectedKey === removed._key) setSelectedKey(null);
959
+ const label = def?.label ?? "Blok";
960
+ toast({ title: `${label} verwijderd`, action: { label: "Ongedaan maken", onClick: () => undo() } });
858
961
  }
859
962
  const klaarMetBlok = useCallback(() => {
860
963
  document.activeElement?.blur();
@@ -898,14 +1001,30 @@ function VisualEditorInner({ onClose }) {
898
1001
  const def = registry.get(type);
899
1002
  const base = def?.defaults?.() ?? {};
900
1003
  const block = { _key: newKey(), _type: type, ...base };
1004
+ if (type === "hero" && blocks.some((b) => b._type === "hero" && String(b.headingLevel ?? "1") === "1")) block.headingLevel = "2";
901
1005
  insertAfterSelected([block]);
902
1006
  setSelectedKey(block._key);
1007
+ toonNieuw(block._key);
903
1008
  }
904
1009
  function insertAfterSelected(newBlocks) {
905
- const sel = blocks.findIndex((b) => b._key === selectedKey);
1010
+ const na = invoegNa ?? selectedKey;
1011
+ const sel = blocks.findIndex((b) => b._key === na);
906
1012
  const copy = [...blocks];
907
1013
  copy.splice(sel >= 0 ? sel + 1 : blocks.length, 0, ...newBlocks);
908
1014
  setBlocks(copy);
1015
+ setInvoegNa(null);
1016
+ const eerste = newBlocks[0]?._key;
1017
+ if (eerste) toonNieuw(eerste);
1018
+ }
1019
+ function toonNieuw(key) {
1020
+ let pogingen = 0;
1021
+ const probeer = () => {
1022
+ const el = document.querySelector(`[data-xicms-block="${CSS.escape(key)}"]`);
1023
+ const doel = el && (el.getBoundingClientRect().height ? el : el.firstElementChild);
1024
+ if (doel) doel.scrollIntoView({ block: "center", behavior: "smooth" });
1025
+ else if (++pogingen < 30) requestAnimationFrame(probeer);
1026
+ };
1027
+ requestAnimationFrame(probeer);
909
1028
  }
910
1029
  async function onPublish() {
911
1030
  document.activeElement?.blur();
@@ -918,7 +1037,10 @@ function VisualEditorInner({ onClose }) {
918
1037
  const demo = isDemoActive();
919
1038
  const ok = await confirm({
920
1039
  title: "Pagina publiceren?",
921
- description: demo ? "In deze demo blijft alles in je eigen browser \u2014 er gaat niets echt online." : `De live site wordt bijgewerkt (${d.path}).`,
1040
+ description: /* @__PURE__ */ jsxs(Fragment, { children: [
1041
+ publiceerSamenvatting(d.path, demo, controleerPagina(d, await publicatieContext(siteId))),
1042
+ demo && /* @__PURE__ */ jsx("p", { className: "mt-1", children: "In deze demo blijft alles in je eigen browser \u2014 er gaat niets echt online." })
1043
+ ] }),
922
1044
  confirmLabel: "Publiceren"
923
1045
  });
924
1046
  if (!ok) return;
@@ -941,29 +1063,33 @@ function VisualEditorInner({ onClose }) {
941
1063
  setPublishing(false);
942
1064
  }
943
1065
  }
944
- const addOptions = useMemo(() => buildBlockAddOptions(registry.values()), [registry]);
1066
+ const blockKeys = useMemo(() => blocks.map((b) => b._key), [blocks]);
945
1067
  const selectedIndex = blocks.findIndex((b) => b._key === selectedKey);
946
1068
  const selected = selectedIndex >= 0 ? blocks[selectedIndex] : null;
947
1069
  const canUndo = historyRef.current.past.length > 0;
948
1070
  const canRedo = historyRef.current.future.length > 0;
949
1071
  const reloadRemote = useCallback(async () => {
950
1072
  const remote = await getDraftByPath(siteId, path).catch(() => null);
951
- if (remote) {
952
- mutateDraft(() => remote);
953
- lastSavedRef.current = stableStringify(draftPayload(remote));
954
- dirtyRef.current = false;
955
- setStatus("idle");
1073
+ if (!remote) {
1074
+ toast({ title: "Nieuwste versie laden mislukt", description: "Controleer je verbinding en probeer het opnieuw. Je wijzigingen worden zolang niet opgeslagen.", tone: "error" });
1075
+ return;
956
1076
  }
1077
+ mutateDraft(() => remote);
1078
+ lastSavedRef.current = stableStringify(draftPayload(remote));
1079
+ dirtyRef.current = false;
1080
+ setStatus("idle");
957
1081
  setConflict(false);
958
- }, [siteId, path, mutateDraft]);
1082
+ }, [siteId, path, mutateDraft, toast]);
959
1083
  return /* @__PURE__ */ jsxs("div", { ref: containerRef, className: "xicms-ve__shell", "data-xicms-tooling": "", role: "group", "aria-label": `Pagina bewerken: ${path}`, children: [
960
1084
  toonStartHint && /* @__PURE__ */ jsxs("div", { className: "xicms-ve-starthint", role: "status", children: [
961
1085
  /* @__PURE__ */ jsxs("span", { children: [
962
- "\u270F\uFE0F Klik het ",
1086
+ "Het ",
963
1087
  /* @__PURE__ */ jsx("strong", { children: "potlood" }),
964
- " naast een tekst om die op de pagina zelf te bewerken; foto's wissel je met ",
965
- /* @__PURE__ */ jsx("strong", { children: "\u{1F4F7} Foto wijzigen" }),
966
- ". Klaar? ",
1088
+ " bij een blok: bewerk het op de pagina zelf \u2014 tekst, knoppen, kaarten toevoegen. Het ",
1089
+ /* @__PURE__ */ jsx("strong", { children: "tandwiel" }),
1090
+ ": alle instellingen in de zijbalk. Een ",
1091
+ /* @__PURE__ */ jsx("strong", { children: "+" }),
1092
+ " onder een blok voegt iets toe. Klaar? ",
967
1093
  /* @__PURE__ */ jsx("strong", { children: "Publiceren" }),
968
1094
  " staat rechtsonder."
969
1095
  ] }),
@@ -990,7 +1116,7 @@ function VisualEditorInner({ onClose }) {
990
1116
  /* @__PURE__ */ jsx("span", { className: "xicms-ve__sep", "aria-hidden": "true" }),
991
1117
  /* @__PURE__ */ jsx("span", { className: "xicms-ve__path", title: `Je bewerkt ${name} \u2014 ${path}`, children: path }),
992
1118
  localeCfg.locales.length > 1 && /* @__PURE__ */ jsxs("span", { className: "xicms-ve__locale", title: "Taal \u2014 in een andere taal dan de standaard bewerk je vertalingen", children: [
993
- "\u{1F310}",
1119
+ /* @__PURE__ */ jsx(Icon, { naam: "wereld", grootte: 14 }),
994
1120
  /* @__PURE__ */ jsx(
995
1121
  Select,
996
1122
  {
@@ -1019,18 +1145,18 @@ function VisualEditorInner({ onClose }) {
1019
1145
  title: "Pagina-instellingen (titel, SEO, versies)",
1020
1146
  "aria-label": "Pagina-instellingen",
1021
1147
  "aria-pressed": panelOpen && !selectedKey,
1022
- children: "\u2699"
1148
+ children: /* @__PURE__ */ jsx(Icon, { naam: "tandwiel", grootte: 15 })
1023
1149
  }
1024
1150
  ),
1025
- /* @__PURE__ */ jsx("button", { type: "button", className: "xicms-ve__histbtn", disabled: !canUndo, onClick: undo, title: "Ongedaan maken (Ctrl+Z)", "aria-label": "Ongedaan maken (Ctrl+Z)", children: "\u21B6" }),
1026
- /* @__PURE__ */ jsx("button", { type: "button", className: "xicms-ve__histbtn", disabled: !canRedo, onClick: redo, title: "Opnieuw (Ctrl+Shift+Z)", "aria-label": "Opnieuw (Ctrl+Shift+Z)", children: "\u21B7" }),
1151
+ /* @__PURE__ */ jsx("button", { type: "button", className: "xicms-ve__histbtn", disabled: !canUndo, onClick: undo, title: "Ongedaan maken (Ctrl+Z)", "aria-label": "Ongedaan maken (Ctrl+Z)", children: /* @__PURE__ */ jsx(Icon, { naam: "ongedaan", grootte: 15 }) }),
1152
+ /* @__PURE__ */ jsx("button", { type: "button", className: "xicms-ve__histbtn", disabled: !canRedo, onClick: redo, title: "Opnieuw (Ctrl+Shift+Z)", "aria-label": "Opnieuw (Ctrl+Shift+Z)", children: /* @__PURE__ */ jsx(Icon, { naam: "opnieuw", grootte: 15 }) }),
1027
1153
  status === "none" && /* @__PURE__ */ jsxs("span", { className: "xicms-ve__balkmelding", children: [
1028
1154
  "Nog geen werkversie",
1029
1155
  /* @__PURE__ */ jsx(Button, { size: "sm", onClick: () => void handleCreatePage(), children: "+ Pagina aanmaken" })
1030
1156
  ] }),
1031
1157
  /* @__PURE__ */ jsxs("span", { className: "xicms-ve__status", "aria-live": "polite", children: [
1032
1158
  status === "loading" ? "Werkversie laden\u2026" : null,
1033
- status === "saving" ? "Opslaan\u2026" : status === "saved" ? "\u2713 Bewaard als werkversie" : status === "error" ? "\u26A0 Niet opgeslagen" : ""
1159
+ !online && (status === "saving" || status === "error") ? "\u26A0 Geen verbinding \u2014 je werk wordt bewaard zodra je weer online bent" : status === "saving" ? "Opslaan\u2026" : status === "saved" ? "\u2713 Bewaard als werkversie" : status === "error" ? "\u26A0 Niet opgeslagen \u2014 we proberen het zo opnieuw" : ""
1034
1160
  ] }),
1035
1161
  status === "error" && /* @__PURE__ */ jsx(Button, { size: "sm", variant: "secondary", onClick: () => void flushSave().catch(() => setStatus("error")), children: "Opnieuw opslaan" })
1036
1162
  ] }),
@@ -1040,15 +1166,13 @@ function VisualEditorInner({ onClose }) {
1040
1166
  /* @__PURE__ */ jsx(Button, { size: "sm", variant: "secondary", onClick: () => setConflict(false), children: "Mijn versie behouden" })
1041
1167
  ] }),
1042
1168
  /* @__PURE__ */ jsx("div", { className: `xicms-ve__body${panelOpen ? " is-panel-open" : ""}`, children: panelOpen && /* @__PURE__ */ jsxs("aside", { className: "xicms-ve__panel", children: [
1043
- /* @__PURE__ */ jsxs("div", { className: "xicms-ve__inserter", children: [
1044
- /* @__PURE__ */ jsxs("span", { children: [
1045
- "Toevoegen",
1046
- selected ? " (na selectie)" : "",
1047
- ":"
1048
- ] }),
1049
- /* @__PURE__ */ jsx("div", { className: "xicms-ve__inserter-select", children: /* @__PURE__ */ jsx(Select, { value: "", placeholder: "Kies een blok\u2026", onValueChange: (v) => v && addBlock(v), options: addOptions }) }),
1050
- /* @__PURE__ */ jsx(PatternInserter, { onInsert: insertAfterSelected })
1051
- ] }),
1169
+ /* @__PURE__ */ jsx("div", { className: "xicms-ve__inserter", children: /* @__PURE__ */ jsxs(Button, { type: "button", variant: "secondary", size: "sm", onClick: () => {
1170
+ setInvoegNa(null);
1171
+ setKiezerOpen(true);
1172
+ }, children: [
1173
+ "+ Blok of sectie toevoegen",
1174
+ selected ? " (na dit blok)" : ""
1175
+ ] }) }),
1052
1176
  selectedProduct ? /* @__PURE__ */ jsxs("div", { className: "grid gap-3", children: [
1053
1177
  /* @__PURE__ */ jsxs("div", { className: "xicms-ve__panel-head", children: [
1054
1178
  /* @__PURE__ */ jsx("span", { className: "text-sm text-slate-500", children: "Webwinkel" }),
@@ -1082,10 +1206,11 @@ function VisualEditorInner({ onClose }) {
1082
1206
  /* @__PURE__ */ jsx(
1083
1207
  Button,
1084
1208
  {
1209
+ loading: status === "saving",
1085
1210
  size: "sm",
1086
1211
  variant: status === "saving" || status === "error" ? "primary" : "ghost",
1087
1212
  onClick: () => void flushSave().catch(() => setStatus("error")),
1088
- children: status === "saving" ? "Opslaan\u2026" : status === "error" ? "\u26A0 Opnieuw opslaan" : "\u2713 Opgeslagen"
1213
+ children: status === "saving" ? "Opslaan" : status === "error" ? "Opnieuw opslaan" : "\u2713 Opgeslagen"
1089
1214
  }
1090
1215
  ),
1091
1216
  /* @__PURE__ */ jsx(Button, { size: "sm", variant: "ghost", onClick: () => setPanelOpen(false), children: "\u2715 Sluiten" })
@@ -1124,6 +1249,19 @@ function VisualEditorInner({ onClose }) {
1124
1249
  },
1125
1250
  onSelect: (m) => {
1126
1251
  if (imgPicker) {
1252
+ const blok = blocksRef.current.find((b) => b._key === imgPicker.key);
1253
+ if (blok?._type === "hero" && imgPicker.field === "imageUrl" && m.width && m.width < 1400) {
1254
+ toast({ title: "Kleine foto voor een openingsbeeld", description: `Deze foto is ${m.width} pixels breed; schermvullend kan hij korrelig ogen. Liefst 1600 pixels of meer.` });
1255
+ }
1256
+ if (blok?._type === "hero" && imgPicker.field === "imageUrl") {
1257
+ const extra = heroBeeldPatch(blok, m.url);
1258
+ if (extra.overlayGradient) {
1259
+ mutateDraft((d) => ({
1260
+ ...d,
1261
+ blocks: d.blocks.map((b) => b._key === imgPicker.key ? { ...b, overlayGradient: true } : b)
1262
+ }));
1263
+ }
1264
+ }
1127
1265
  commitInline(imgPicker.key, imgPicker.field, m.url);
1128
1266
  const altField = imgPicker.field.replace(/(^|\.)((image)?[uU]rl)$/, "$1alt");
1129
1267
  if (altField !== imgPicker.field) commitInline(imgPicker.key, altField, m.alt ?? "");
@@ -1141,7 +1279,7 @@ function VisualEditorInner({ onClose }) {
1141
1279
  {
1142
1280
  type: "button",
1143
1281
  className: `xicms-ve-blokknop${b.key === selectedKey ? " is-on" : ""}`,
1144
- title: `Tekst van ${b.label} bewerken`,
1282
+ title: `${b.label}: op de pagina bewerken`,
1145
1283
  "aria-label": `Tekst van ${b.label} bewerken`,
1146
1284
  onMouseDown: (e) => e.preventDefault(),
1147
1285
  onClick: () => {
@@ -1165,7 +1303,7 @@ function VisualEditorInner({ onClose }) {
1165
1303
  {
1166
1304
  type: "button",
1167
1305
  className: `xicms-ve-blokknop${b.key === selectedKey && panelOpen ? " is-on" : ""}`,
1168
- title: `Instellingen van ${b.label}`,
1306
+ title: `${b.label}: alle instellingen (zijbalk)`,
1169
1307
  "aria-label": `Instellingen van ${b.label}`,
1170
1308
  onMouseDown: (e) => e.preventDefault(),
1171
1309
  onClick: () => {
@@ -1216,8 +1354,8 @@ function VisualEditorInner({ onClose }) {
1216
1354
  onMouseDown: (e) => e.preventDefault(),
1217
1355
  onClick: () => {
1218
1356
  setSelectedProduct(null);
1219
- setSelectedKey(b.key);
1220
- setPanelOpen(true);
1357
+ setInvoegNa(b.key);
1358
+ setKiezerOpen(true);
1221
1359
  },
1222
1360
  children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", width: "13", height: "13", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M12 5v14M5 12h14" }) })
1223
1361
  }
@@ -1294,6 +1432,42 @@ function VisualEditorInner({ onClose }) {
1294
1432
  ] }) })
1295
1433
  ] }, b.key);
1296
1434
  }),
1435
+ draft && !isTranslating && /* @__PURE__ */ jsxs(Fragment, { children: [
1436
+ /* @__PURE__ */ jsx(BlokKader, { sleutels: blockKeys, gekozen: selectedKey, labelVoor: (k) => registry.get(String(blocks.find((b) => b._key === k)?._type ?? ""))?.label ?? "Blok" }),
1437
+ /* @__PURE__ */ jsx(TussenPlus, { sleutels: blockKeys, onKies: (na) => {
1438
+ setInvoegNa(na);
1439
+ setKiezerOpen(true);
1440
+ } })
1441
+ ] }),
1442
+ /* @__PURE__ */ jsx(
1443
+ BlokKiezer,
1444
+ {
1445
+ open: kiezerOpen,
1446
+ onOpenChange: (v) => {
1447
+ setKiezerOpen(v);
1448
+ if (!v) setInvoegNa(null);
1449
+ },
1450
+ onBlok: addBlock,
1451
+ onSectie: insertAfterSelected
1452
+ }
1453
+ ),
1454
+ selectedKey && !isTranslating && (() => {
1455
+ const blok = blocks.find((b) => b._key === selectedKey);
1456
+ if (!blok) return null;
1457
+ return /* @__PURE__ */ jsx(
1458
+ InlineGereedschap,
1459
+ {
1460
+ blok,
1461
+ def: registry.get(String(blok._type)),
1462
+ siteId,
1463
+ onWijzig: (volgend) => setBlocks(blocks.map((b) => b._key === blok._key ? { ...volgend, _key: b._key, _type: b._type } : b)),
1464
+ onInstellingen: () => setPanelOpen(true),
1465
+ onStartVeld: startVeld,
1466
+ onVerwijderd: (wat) => toast({ title: `${wat} weggehaald`, action: { label: "Ongedaan maken", onClick: () => undo() } })
1467
+ },
1468
+ blok._key
1469
+ );
1470
+ })(),
1297
1471
  spots.map((s, i) => {
1298
1472
  const actief = editingIndex === i;
1299
1473
  return /* @__PURE__ */ jsx(
@@ -1382,50 +1556,24 @@ function VisualEditorInner({ onClose }) {
1382
1556
  onClick: () => void onPublish(),
1383
1557
  title: wijzigingen.iets ? "Zet deze wijzigingen op de live site" : "Er is niets veranderd sinds de laatste publicatie",
1384
1558
  children: [
1385
- /* @__PURE__ */ jsx("span", { className: "xicms-ve-publiceer__label", children: publishing ? "Bezig\u2026" : "Publiceren" }),
1559
+ /* @__PURE__ */ jsx("span", { className: "xicms-ve-publiceer__label", children: publishing ? "Publiceren\u2026" : "Publiceren" }),
1386
1560
  /* @__PURE__ */ jsx("span", { className: "xicms-ve-publiceer__sub", children: wijzigingen.iets ? aantalWijzigingen(wijzigingen) : "niets gewijzigd" })
1387
1561
  ]
1388
1562
  }
1389
1563
  ),
1390
- fmtBar && /* @__PURE__ */ jsxs("div", { className: "xicms-ve-fmtbar", style: { top: fmtBar.top, left: fmtBar.left }, role: "toolbar", "aria-label": "Tekstopmaak", children: [
1391
- /* @__PURE__ */ jsx(FmtBtn, { label: /* @__PURE__ */ jsx("b", { children: "B" }), title: "Vet (Ctrl/Cmd+B)", onRun: () => document.execCommand("bold") }),
1392
- /* @__PURE__ */ jsx(FmtBtn, { label: /* @__PURE__ */ jsx("i", { children: "I" }), title: "Cursief (Ctrl/Cmd+I)", onRun: () => document.execCommand("italic") }),
1393
- /* @__PURE__ */ jsx(FmtBtn, { label: /* @__PURE__ */ jsx("u", { children: "U" }), title: "Onderstrepen (Ctrl/Cmd+U)", onRun: () => document.execCommand("underline") }),
1394
- /* @__PURE__ */ jsx(
1395
- FmtBtn,
1396
- {
1397
- label: "\u{1F517}",
1398
- title: "Link (selecteer eerst tekst; leeg = link verwijderen)",
1399
- onRun: () => {
1400
- const url = window.prompt("Link-URL (leeg = link verwijderen)", "https://");
1401
- if (url === null) return;
1402
- if (url === "" || url === "https://") document.execCommand("unlink");
1403
- else document.execCommand("createLink", false, url);
1404
- }
1405
- }
1406
- ),
1407
- /* @__PURE__ */ jsx("span", { className: "xicms-ve-fmtbar__sep", "aria-hidden": true }),
1408
- /* @__PURE__ */ jsx(FmtBtn, { label: "H2", title: "Grote kop", onRun: () => document.execCommand("formatBlock", false, "<h2>") }),
1409
- /* @__PURE__ */ jsx(FmtBtn, { label: "H3", title: "Kleine kop", onRun: () => document.execCommand("formatBlock", false, "<h3>") }),
1410
- /* @__PURE__ */ jsx(FmtBtn, { label: "\xB6", title: "Normale tekst", onRun: () => document.execCommand("formatBlock", false, "<p>") }),
1411
- /* @__PURE__ */ jsx("span", { className: "xicms-ve-fmtbar__sep", "aria-hidden": true }),
1412
- /* @__PURE__ */ jsx(FmtBtn, { label: "\u2022", title: "Opsomming", onRun: () => document.execCommand("insertUnorderedList") })
1413
- ] })
1564
+ rijk && /* @__PURE__ */ jsx(
1565
+ InlineRijkeTekst,
1566
+ {
1567
+ el: rijk.el,
1568
+ siteId,
1569
+ onCommit: (html) => commitText(rijk.key, rijk.field, html),
1570
+ onKlaar: stopRijk,
1571
+ flushRef: rijkFlushRef
1572
+ },
1573
+ `${rijk.key}:${rijk.field}`
1574
+ )
1414
1575
  ] });
1415
1576
  }
1416
- function FmtBtn({ label, title, onRun }) {
1417
- return /* @__PURE__ */ jsx(
1418
- "button",
1419
- {
1420
- type: "button",
1421
- title,
1422
- "aria-label": title,
1423
- onMouseDown: (e) => e.preventDefault(),
1424
- onClick: onRun,
1425
- children: label
1426
- }
1427
- );
1428
- }
1429
1577
  function MeterRegel({ m }) {
1430
1578
  const kleur = m.toon === "goed" ? "text-emerald-700" : m.toon === "lang" || m.toon === "leeg" ? "text-amber-700" : "text-slate-500";
1431
1579
  return /* @__PURE__ */ jsx("p", { className: `mt-1 text-xs ${kleur}`, children: m.tekst });
@@ -1437,7 +1585,7 @@ function PageSettings({
1437
1585
  }) {
1438
1586
  const seo = draft.seo ?? {};
1439
1587
  const { toast } = useToast();
1440
- const [previewUrl, setPreviewUrl] = useState(null);
1588
+ const [previewLink, setPreviewLink] = useState(null);
1441
1589
  const [bezig, setBezig] = useState(false);
1442
1590
  async function maakPreviewLink() {
1443
1591
  const { getFirebaseApp } = await import("../../firebase/client.js");
@@ -1447,15 +1595,15 @@ function PageSettings({
1447
1595
  setBezig(true);
1448
1596
  try {
1449
1597
  const res = await callable(app, "createPreviewLink")({ siteId, path: draft.path });
1450
- setPreviewUrl(res.data.url);
1598
+ setPreviewLink(res.data);
1451
1599
  try {
1452
1600
  await navigator.clipboard?.writeText(res.data.url);
1453
- toast({ title: "Preview-link gekopieerd", description: "Zeven dagen geldig; wie hem opent ziet de nieuwste stand, ook wat nog niet live is.", tone: "success" });
1601
+ toast({ title: "Voorbeeldlink gekopieerd", description: "Zeven dagen geldig; wie hem opent ziet de nieuwste stand, ook wat nog niet live is.", tone: "success" });
1454
1602
  } catch {
1455
- toast({ title: "Preview-link gemaakt", tone: "success" });
1603
+ toast({ title: "Voorbeeldlink gemaakt", tone: "success" });
1456
1604
  }
1457
1605
  } catch (e) {
1458
- toast({ title: "Preview-link mislukt", description: e.message, tone: "error" });
1606
+ toast({ title: "Voorbeeldlink mislukt", description: e.message, tone: "error" });
1459
1607
  } finally {
1460
1608
  setBezig(false);
1461
1609
  }
@@ -1487,9 +1635,9 @@ function PageSettings({
1487
1635
  }
1488
1636
  ),
1489
1637
  !isDemoActive() && /* @__PURE__ */ jsxs("div", { className: "grid gap-1 border-t border-slate-200 pt-3", children: [
1490
- /* @__PURE__ */ jsx(Button, { variant: "secondary", size: "sm", disabled: bezig, onClick: () => void maakPreviewLink(), children: bezig ? "Bezig\u2026" : "\u{1F517} Preview-link delen" }),
1638
+ /* @__PURE__ */ jsx(Button, { loading: bezig, variant: "secondary", size: "sm", disabled: bezig, onClick: () => void maakPreviewLink(), children: "Voorbeeldlink delen" }),
1491
1639
  /* @__PURE__ */ jsx("p", { className: "text-xs text-slate-500", children: "Laat iemand zonder inlog meekijken naar de werkversie. Zeven dagen geldig, geen toegang tot het beheer." }),
1492
- previewUrl && /* @__PURE__ */ jsx(Input, { readOnly: true, value: previewUrl, className: "text-xs", onFocus: (e) => e.currentTarget.select() })
1640
+ previewLink && /* @__PURE__ */ jsx(PreviewLinkResultaat, { link: previewLink, titel: draft.title })
1493
1641
  ] })
1494
1642
  ] })
1495
1643
  ] });
@@ -1508,8 +1656,8 @@ function PageTranslationSettings({
1508
1656
  ] }),
1509
1657
  /* @__PURE__ */ jsxs("div", { className: "mt-2 grid gap-3", children: [
1510
1658
  /* @__PURE__ */ jsx(Field, { label: "Paginatitel", hint: `Origineel: ${draft.title ?? ""}`, children: /* @__PURE__ */ jsx(Input, { value: ov["title"] ?? "", placeholder: draft.title ?? "", onChange: (e) => onTranslate("title", e.target.value) }) }),
1511
- /* @__PURE__ */ jsx(Field, { label: "SEO-titel", children: /* @__PURE__ */ jsx(Input, { value: ov["seo.title"] ?? "", placeholder: draft.seo?.title ?? "", onChange: (e) => onTranslate("seo.title", e.target.value) }) }),
1512
- /* @__PURE__ */ jsx(Field, { label: "SEO-omschrijving", children: /* @__PURE__ */ jsx(Textarea, { rows: 3, value: ov["seo.description"] ?? "", placeholder: draft.seo?.description ?? "", onChange: (e) => onTranslate("seo.description", e.target.value) }) })
1659
+ /* @__PURE__ */ jsx(Field, { label: "Titel in Google", children: /* @__PURE__ */ jsx(Input, { value: ov["seo.title"] ?? "", placeholder: draft.seo?.title ?? "", onChange: (e) => onTranslate("seo.title", e.target.value) }) }),
1660
+ /* @__PURE__ */ jsx(Field, { label: "Omschrijving in Google", children: /* @__PURE__ */ jsx(Textarea, { rows: 3, value: ov["seo.description"] ?? "", placeholder: draft.seo?.description ?? "", onChange: (e) => onTranslate("seo.description", e.target.value) }) })
1513
1661
  ] })
1514
1662
  ] });
1515
1663
  }
@@ -1526,7 +1674,7 @@ function VersionsPanel({
1526
1674
  const restore = async (versionId) => {
1527
1675
  const ok = await confirm({
1528
1676
  title: "Versie herstellen?",
1529
- description: "De snapshot vervangt je huidige werkversie (ongedaan te maken met Ctrl+Z). De live site verandert pas bij Publiceren.",
1677
+ description: "Deze versie vervangt je huidige werkversie (ongedaan te maken met Ctrl+Z). De live site verandert pas bij Publiceren.",
1530
1678
  confirmLabel: "Herstellen"
1531
1679
  });
1532
1680
  if (!ok) return;
@@ -1542,7 +1690,7 @@ function VersionsPanel({
1542
1690
  /* @__PURE__ */ jsx("ul", { className: "mt-2 grid gap-1 text-sm", children: versions.slice(0, 10).map((v) => /* @__PURE__ */ jsxs("li", { className: "flex items-center justify-between gap-2", children: [
1543
1691
  /* @__PURE__ */ jsxs("span", { children: [
1544
1692
  v.label ?? (v.kind === "publish" ? "Gepubliceerd" : v.kind ?? "Snapshot"),
1545
- formatVersionDate(v.createdAt) && /* @__PURE__ */ jsxs("span", { className: "text-slate-400", children: [
1693
+ formatVersionDate(v.createdAt) && /* @__PURE__ */ jsxs("span", { className: "text-slate-500", children: [
1546
1694
  " \xB7 ",
1547
1695
  formatVersionDate(v.createdAt)
1548
1696
  ] })