@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 +1 @@
1
- {"version":3,"sources":["../../src/patterns/builtins.ts"],"sourcesContent":["import { definePattern, type Pattern } from \"./patterns\";\n\n/**\n * Ingebouwde patronen — opgebouwd uit standaard-aanwezige blocks (content + galerij/faq/prijzen)\n * zodat ze altijd renderen, ongeacht welke opt-in modules aanstaan. Een agent of editor voegt ze in\n * als startpunt en past de inhoud aan.\n */\n\nexport const heroCentered = definePattern({\n id: \"hero-centered\",\n label: \"Hero (gecentreerd, met knoppen)\",\n category: \"Hero\",\n blocks: [\n {\n _type: \"hero\",\n title: \"Een krachtige kop die overtuigt\",\n subtitle: \"Een korte ondertitel die in één zin uitlegt wat je doet.\",\n align: \"center\",\n vAlign: \"center\",\n minHeight: \"lg\",\n overlayColor: \"#000000\",\n overlayOpacity: 35,\n buttons: [\n { label: \"Aan de slag\", href: \"#contact\", variant: \"primary\" },\n { label: \"Meer weten\", href: \"#over\", variant: \"outline\" },\n ],\n },\n ],\n});\n\nexport const featuresThree = definePattern({\n id: \"features-three\",\n label: \"Drie kenmerken\",\n category: \"Kenmerken\",\n blocks: [\n { _type: \"richText\", html: \"<h2>Waarom kiezen voor ons</h2>\", _style: { align: \"center\", paddingY: \"sm\" } },\n {\n _type: \"columns\",\n _style: { paddingY: \"md\" },\n columns: [\n { blocks: [{ _type: \"richText\", html: \"<h3>⚡ Snel</h3><p>Korte uitleg van dit voordeel voor de klant.</p>\" }] },\n { blocks: [{ _type: \"richText\", html: \"<h3>🔒 Betrouwbaar</h3><p>Korte uitleg van dit voordeel voor de klant.</p>\" }] },\n { blocks: [{ _type: \"richText\", html: \"<h3>💬 Persoonlijk</h3><p>Korte uitleg van dit voordeel voor de klant.</p>\" }] },\n ],\n },\n ],\n});\n\nexport const aboutImageText = definePattern({\n id: \"about-image-text\",\n label: \"Over ons (beeld + tekst)\",\n category: \"Over\",\n blocks: [\n {\n _type: \"columns\",\n _style: { paddingY: \"md\" },\n columns: [\n { blocks: [{ _type: \"image\", url: \"\", alt: \"\", aspectRatio: \"4/3\" }] },\n { blocks: [{ _type: \"richText\", html: \"<h2>Over ons</h2><p>Vertel hier kort het verhaal van het bedrijf: wie je bent, wat je doet en waarom.</p>\" }, { _type: \"buttons\", align: \"left\", items: [{ label: \"Lees meer\", href: \"/over\", variant: \"primary\" }] }] },\n ],\n },\n ],\n});\n\nexport const ctaBanner = definePattern({\n id: \"cta-banner\",\n label: \"Oproep tot actie (banner)\",\n category: \"CTA\",\n blocks: [\n {\n _type: \"cta\",\n title: \"Klaar om te beginnen?\",\n text: \"Neem vandaag nog contact op voor een vrijblijvend gesprek.\",\n buttonLabel: \"Neem contact op\",\n buttonHref: \"#contact\",\n buttonVariant: \"primary\",\n _style: { background: \"#0f172a\", paddingY: \"lg\", align: \"center\" },\n },\n ],\n});\n\nexport const pricingThree = definePattern({\n id: \"pricing-three\",\n label: \"Prijzen (3 pakketten)\",\n category: \"Prijzen\",\n blocks: [\n {\n _type: \"pricing\",\n heading: \"Onze pakketten\",\n _style: { paddingY: \"md\" },\n items: [\n { label: \"Start\", price: \"€ 29\", billingPeriod: \"/maand\", features: [\"Basis-functies\", \"E-mailsupport\"], ctaLabel: \"Kies Start\", ctaHref: \"#contact\" },\n { label: \"Pro\", price: \"€ 59\", billingPeriod: \"/maand\", highlighted: true, features: [\"Alles uit Start\", \"Prioriteit-support\", \"Extra opties\"], ctaLabel: \"Kies Pro\", ctaHref: \"#contact\" },\n { label: \"Zakelijk\", price: \"Op maat\", features: [\"Alles uit Pro\", \"Persoonlijke begeleiding\"], ctaLabel: \"Neem contact op\", ctaHref: \"#contact\" },\n ],\n },\n ],\n});\n\nexport const faqSection = definePattern({\n id: \"faq-section\",\n label: \"Veelgestelde vragen\",\n category: \"FAQ\",\n blocks: [\n {\n _type: \"faq\",\n heading: \"Veelgestelde vragen\",\n searchable: true,\n jsonLd: true,\n _style: { paddingY: \"md\", width: \"narrow\" },\n items: [\n { q: \"Hoe werkt het?\", a: \"Beschrijf hier het antwoord.\" },\n { q: \"Wat kost het?\", a: \"Beschrijf hier het antwoord.\" },\n { q: \"Hoe neem ik contact op?\", a: \"Beschrijf hier het antwoord.\" },\n ],\n },\n ],\n});\n\nexport const gallerySection = definePattern({\n id: \"gallery-section\",\n label: \"Fotogalerij\",\n category: \"Media\",\n blocks: [\n { _type: \"richText\", html: \"<h2>In beeld</h2>\", _style: { align: \"center\", paddingY: \"sm\" } },\n { _type: \"gallery\", items: [], columns: 3, lightbox: \"on\", _style: { paddingY: \"sm\" } },\n ],\n});\n\nexport const quoteSection = definePattern({\n id: \"quote-section\",\n label: \"Uitspraak (uitgelicht)\",\n category: \"Social proof\",\n blocks: [\n {\n _type: \"quote\",\n text: \"“Dit team heeft ons echt geholpen — aanrader!”\",\n author: \"Tevreden klant\",\n role: \"Bedrijfsnaam\",\n _style: { paddingY: \"lg\", width: \"narrow\", align: \"center\" },\n },\n ],\n});\n\nexport const contentWithSidebar = definePattern({\n id: \"content-with-sidebar\",\n label: \"Inhoud met zijbalk (widgets)\",\n category: \"Indeling\",\n description: \"Brede tekstkolom met een zijbalk vol widgets (laatste nieuws + call-to-action).\",\n blocks: [\n {\n _type: \"withSidebar\",\n side: \"right\",\n sidebarWidth: \"md\",\n sticky: true,\n _style: { paddingY: \"md\" },\n main: [\n { _type: \"richText\", html: \"<h2>Welkom</h2><p>Plaats hier je hoofdinhoud. In de zijbalk hiernaast tonen widgets automatisch je laatste nieuws en een oproep tot actie — die haal je zo uit dezelfde modules.</p>\" },\n ],\n aside: [\n { _type: \"newsWidget\", heading: \"Laatste nieuws\", limit: 4, basePath: \"/nieuws\", showImages: false },\n { _type: \"ctaWidget\", title: \"Vragen?\", text: \"Neem gerust contact op.\", buttonLabel: \"Contact\", buttonHref: \"#contact\" },\n ],\n },\n ],\n});\n\nexport const featuresCards = definePattern({\n id: \"features-cards\",\n label: \"Drie diensten (kaarten)\",\n category: \"Kenmerken\",\n description: \"Moderne diensten-kaarten met iconen en hover-effect (cards-module).\",\n blocks: [\n {\n _type: \"cards\",\n heading: \"Wat we doen\",\n columns: 3,\n _style: { paddingY: \"md\" },\n items: [\n { icon: \"⚡\", title: \"Dienst één\", text: \"Korte uitleg van deze dienst en het voordeel voor de klant.\" },\n { icon: \"🛠️\", title: \"Dienst twee\", text: \"Korte uitleg van deze dienst en het voordeel voor de klant.\" },\n { icon: \"💬\", title: \"Dienst drie\", text: \"Korte uitleg van deze dienst en het voordeel voor de klant.\", href: \"#contact\", linkLabel: \"Meer weten\" },\n ],\n },\n ],\n});\n\nexport const testimonialsSection = definePattern({\n id: \"testimonials-section\",\n label: \"Klantreviews (3 kaarten)\",\n category: \"Social proof\",\n blocks: [\n {\n _type: \"testimonials\",\n heading: \"Wat klanten zeggen\",\n jsonLd: true,\n _style: { paddingY: \"md\" },\n items: [\n { quote: \"Fantastisch geholpen, snel en vakkundig.\", author: \"Naam klant\", role: \"Plaats\", rating: 5 },\n { quote: \"Duidelijke communicatie en een prachtig resultaat.\", author: \"Naam klant\", role: \"Plaats\", rating: 5 },\n { quote: \"Een aanrader voor iedereen in de regio.\", author: \"Naam klant\", role: \"Plaats\", rating: 4 },\n ],\n },\n ],\n});\n\nexport const teamSection = definePattern({\n id: \"team-section\",\n label: \"Ons team\",\n category: \"Over\",\n blocks: [\n {\n _type: \"team\",\n heading: \"Ons team\",\n _style: { paddingY: \"md\" },\n members: [\n { name: \"Naam\", role: \"Functie\", bio: \"Korte introductie van dit teamlid.\" },\n { name: \"Naam\", role: \"Functie\", bio: \"Korte introductie van dit teamlid.\" },\n { name: \"Naam\", role: \"Functie\", bio: \"Korte introductie van dit teamlid.\" },\n ],\n },\n ],\n});\n\nexport const countersSection = definePattern({\n id: \"counters-section\",\n label: \"Kengetallen (tellers)\",\n category: \"Social proof\",\n blocks: [\n {\n _type: \"counters\",\n _style: { paddingY: \"md\", align: \"center\" },\n items: [\n { value: \"15\", suffix: \"+\", label: \"Jaar ervaring\" },\n { value: \"250\", suffix: \"+\", label: \"Tevreden klanten\" },\n { value: \"4.9\", label: \"Gemiddelde beoordeling\" },\n ],\n },\n ],\n});\n\nexport const logosSection = definePattern({\n id: \"logos-section\",\n label: \"Bekend van (logo-strook)\",\n category: \"Social proof\",\n blocks: [\n { _type: \"logos\", heading: \"Zij gingen je voor\", grayscale: true, items: [], _style: { paddingY: \"sm\" } },\n ],\n});\n\nexport const stepsSection = definePattern({\n id: \"steps-section\",\n label: \"Stappenplan (zo werkt het)\",\n category: \"Kenmerken\",\n blocks: [\n {\n _type: \"timeline\",\n heading: \"Zo werkt het\",\n _style: { paddingY: \"md\", width: \"narrow\" },\n items: [\n { title: \"1. Kennismaking\", text: \"We bespreken je wensen, vrijblijvend.\" },\n { title: \"2. Voorstel\", text: \"Je ontvangt een helder voorstel met vaste prijs.\" },\n { title: \"3. Uitvoering\", text: \"We gaan aan de slag en houden je op de hoogte.\" },\n { title: \"4. Oplevering\", text: \"Klaar — met nazorg en garantie.\" },\n ],\n },\n ],\n});\n\nexport const newsletterSection = definePattern({\n id: \"newsletter-section\",\n label: \"Nieuwsbrief-aanmelding\",\n category: \"CTA\",\n blocks: [\n { _type: \"newsletter\", heading: \"Blijf op de hoogte\", text: \"Ontvang tips en nieuws — max. één mail per maand.\", buttonLabel: \"Aanmelden\", _style: { paddingY: \"md\", width: \"narrow\" } },\n ],\n});\n\nexport const portfolioSection = definePattern({\n id: \"portfolio-section\",\n label: \"Portfolio / projecten\",\n category: \"Media\",\n description: \"Projecten-grid met categorie-filter en lightbox (portfolio-module).\",\n blocks: [\n {\n _type: \"portfolio\",\n heading: \"Ons werk\",\n intro: \"Een greep uit recente projecten.\",\n columns: 3,\n showFilter: true,\n lightbox: true,\n _style: { paddingY: \"md\" },\n items: [\n { imageUrl: \"\", title: \"Project één\", category: \"Categorie A\" },\n { imageUrl: \"\", title: \"Project twee\", category: \"Categorie B\" },\n { imageUrl: \"\", title: \"Project drie\", category: \"Categorie A\" },\n ],\n },\n ],\n});\n\nexport const jobsSection = definePattern({\n id: \"jobs-section\",\n label: \"Vacatures\",\n category: \"Over\",\n description: \"Vacature-overzicht met Google Jobs-JSON-LD (vacatures-module).\",\n blocks: [\n {\n _type: \"jobs\",\n heading: \"Werken bij ons\",\n intro: \"We groeien — kom je het team versterken?\",\n jsonLd: true,\n _style: { paddingY: \"md\", width: \"narrow\" },\n items: [\n { title: \"Functietitel\", employmentType: \"Fulltime\", location: \"Plaats\", description: \"Korte omschrijving van de functie en wat je gaat doen.\" },\n ],\n },\n ],\n});\n\nexport const beforeAfterSection = definePattern({\n id: \"before-after-section\",\n label: \"Voor / na\",\n category: \"Media\",\n description: \"Voor/na-vergelijker met sleepbare scheiding (voor-na-module).\",\n blocks: [\n { _type: \"richText\", html: \"<h2>Het verschil</h2>\", _style: { align: \"center\", paddingY: \"sm\" } },\n { _type: \"beforeAfter\", beforeUrl: \"\", afterUrl: \"\", beforeLabel: \"Voor\", afterLabel: \"Na\", aspectRatio: \"4/3\", _style: { paddingY: \"sm\", width: \"narrow\" } },\n ],\n});\n\n/* ── Pagina-starters: complete pagina's in één klik (daarna inhoud aanpassen) ── */\n\nexport const pageLanding = definePattern({\n id: \"page-landing\",\n label: \"Landingspagina\",\n category: \"Pagina's\",\n description: \"Hero, kenmerken, galerij, review, prijzen, FAQ en een afsluitende CTA.\",\n blocks: [\n ...heroCentered.blocks,\n ...featuresThree.blocks,\n ...gallerySection.blocks,\n ...quoteSection.blocks,\n ...pricingThree.blocks,\n ...faqSection.blocks,\n ...ctaBanner.blocks,\n ],\n});\n\nexport const pageServices = definePattern({\n id: \"page-services\",\n label: \"Dienstenpagina\",\n category: \"Pagina's\",\n description: \"Introductie, drie diensten in kolommen, stappenplan en CTA.\",\n blocks: [\n { _type: \"hero\", title: \"Onze diensten\", subtitle: \"Waar we je mee helpen.\", align: \"center\", vAlign: \"center\", minHeight: \"sm\" },\n { _type: \"richText\", html: \"<p>Korte introductie: voor wie werk je, wat maakt jullie aanpak anders?</p>\", _style: { width: \"narrow\", align: \"center\", paddingY: \"sm\" } },\n ...featuresThree.blocks.slice(1),\n ...stepsSection.blocks,\n ...ctaBanner.blocks,\n ],\n});\n\nexport const pageAbout = definePattern({\n id: \"page-about\",\n label: \"Over ons-pagina\",\n category: \"Pagina's\",\n description: \"Verhaal met beeld, uitgelichte quote en CTA.\",\n blocks: [\n { _type: \"hero\", title: \"Over ons\", subtitle: \"Wie we zijn en waar we voor staan.\", align: \"center\", vAlign: \"center\", minHeight: \"sm\" },\n ...aboutImageText.blocks,\n ...quoteSection.blocks,\n ...ctaBanner.blocks,\n ],\n});\n\nexport const pageContact = definePattern({\n id: \"page-contact\",\n label: \"Contactpagina\",\n category: \"Pagina's\",\n description: \"Contactgegevens naast openingstijden; voeg eventueel je formulier-blok toe.\",\n blocks: [\n { _type: \"hero\", title: \"Contact\", subtitle: \"We horen graag van je.\", align: \"center\", vAlign: \"center\", minHeight: \"sm\" },\n {\n _type: \"columns\",\n _style: { paddingY: \"md\" },\n columns: [\n { blocks: [{ _type: \"richText\", html: \"<h2>Neem contact op</h2><p>Adres, telefoonnummer en e-mailadres — of loop gerust binnen.</p>\" }] },\n { blocks: [{ _type: \"openingHours\", heading: \"Openingstijden\", rows: [{ day: \"Ma–Vr\", hours: \"09:00–17:00\" }, { day: \"Za\", hours: \"10:00–16:00\" }, { day: \"Zo\", hours: \"Gesloten\" }] }] },\n ],\n },\n ...ctaBanner.blocks,\n ],\n});\n\n/** Alle ingebouwde patronen. */\nexport const builtinPatterns: Pattern[] = [\n heroCentered,\n featuresThree,\n featuresCards,\n aboutImageText,\n teamSection,\n ctaBanner,\n newsletterSection,\n pricingThree,\n faqSection,\n gallerySection,\n quoteSection,\n testimonialsSection,\n countersSection,\n logosSection,\n stepsSection,\n portfolioSection,\n jobsSection,\n beforeAfterSection,\n contentWithSidebar,\n pageLanding,\n pageServices,\n pageAbout,\n pageContact,\n];\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/patterns/builtins.ts"],"sourcesContent":["import { definePattern, type Pattern } from \"./patterns\";\n\n/**\n * Ingebouwde patronen — opgebouwd uit standaard-aanwezige blocks (content + galerij/faq/prijzen)\n * zodat ze altijd renderen, ongeacht welke opt-in modules aanstaan. Een agent of editor voegt ze in\n * als startpunt en past de inhoud aan.\n */\n\nexport const heroCentered = definePattern({\n id: \"hero-centered\",\n label: \"Hero (gecentreerd, met knoppen)\",\n category: \"Hero\",\n blocks: [\n {\n _type: \"hero\",\n title: \"Een krachtige kop die overtuigt\",\n subtitle: \"Een korte ondertitel die in één zin uitlegt wat je doet.\",\n align: \"center\",\n vAlign: \"center\",\n minHeight: \"lg\",\n overlayColor: \"#000000\",\n overlayOpacity: 35,\n buttons: [\n { label: \"Aan de slag\", href: \"#contact\", variant: \"primary\" },\n { label: \"Meer weten\", href: \"#over\", variant: \"outline\" },\n ],\n },\n ],\n});\n\nexport const featuresThree = definePattern({\n id: \"features-three\",\n label: \"Drie kenmerken\",\n category: \"Kenmerken\",\n blocks: [\n { _type: \"richText\", html: \"<h2>Waarom kiezen voor ons</h2>\", _style: { align: \"center\", paddingY: \"sm\" } },\n {\n _type: \"columns\",\n _style: { paddingY: \"md\" },\n columns: [\n { blocks: [{ _type: \"richText\", html: \"<h3>⚡ Snel</h3><p>Korte uitleg van dit voordeel voor de klant.</p>\" }] },\n { blocks: [{ _type: \"richText\", html: \"<h3>🔒 Betrouwbaar</h3><p>Korte uitleg van dit voordeel voor de klant.</p>\" }] },\n { blocks: [{ _type: \"richText\", html: \"<h3>💬 Persoonlijk</h3><p>Korte uitleg van dit voordeel voor de klant.</p>\" }] },\n ],\n },\n ],\n});\n\nexport const aboutImageText = definePattern({\n id: \"about-image-text\",\n label: \"Over ons (beeld + tekst)\",\n category: \"Over\",\n blocks: [\n {\n _type: \"columns\",\n _style: { paddingY: \"md\" },\n columns: [\n { blocks: [{ _type: \"image\", url: \"\", alt: \"\", aspectRatio: \"4/3\" }] },\n { blocks: [{ _type: \"richText\", html: \"<h2>Over ons</h2><p>Vertel hier kort het verhaal van het bedrijf: wie je bent, wat je doet en waarom.</p>\" }, { _type: \"buttons\", align: \"left\", items: [{ label: \"Lees meer\", href: \"/over\", variant: \"primary\" }] }] },\n ],\n },\n ],\n});\n\nexport const ctaBanner = definePattern({\n id: \"cta-banner\",\n label: \"Oproep tot actie (banner)\",\n category: \"CTA\",\n blocks: [\n {\n _type: \"cta\",\n title: \"Klaar om te beginnen?\",\n text: \"Neem vandaag nog contact op voor een vrijblijvend gesprek.\",\n buttonLabel: \"Neem contact op\",\n buttonHref: \"#contact\",\n buttonVariant: \"primary\",\n _style: { background: \"#0f172a\", paddingY: \"lg\", align: \"center\" },\n },\n ],\n});\n\nexport const pricingThree = definePattern({\n id: \"pricing-three\",\n label: \"Prijzen (3 pakketten)\",\n category: \"Prijzen\",\n blocks: [\n {\n _type: \"pricing\",\n heading: \"Onze pakketten\",\n _style: { paddingY: \"md\" },\n items: [\n { label: \"Start\", price: \"€ 29\", billingPeriod: \"/maand\", features: [\"Basis-functies\", \"E-mailsupport\"], ctaLabel: \"Kies Start\", ctaHref: \"#contact\" },\n { label: \"Pro\", price: \"€ 59\", billingPeriod: \"/maand\", highlighted: true, features: [\"Alles uit Start\", \"Prioriteit-support\", \"Extra opties\"], ctaLabel: \"Kies Pro\", ctaHref: \"#contact\" },\n { label: \"Zakelijk\", price: \"Op maat\", features: [\"Alles uit Pro\", \"Persoonlijke begeleiding\"], ctaLabel: \"Neem contact op\", ctaHref: \"#contact\" },\n ],\n },\n ],\n});\n\nexport const faqSection = definePattern({\n id: \"faq-section\",\n label: \"Veelgestelde vragen\",\n category: \"FAQ\",\n blocks: [\n {\n _type: \"faq\",\n heading: \"Veelgestelde vragen\",\n searchable: true,\n jsonLd: true,\n _style: { paddingY: \"md\", width: \"narrow\" },\n items: [\n { q: \"Hoe werkt het?\", a: \"Beschrijf hier het antwoord.\" },\n { q: \"Wat kost het?\", a: \"Beschrijf hier het antwoord.\" },\n { q: \"Hoe neem ik contact op?\", a: \"Beschrijf hier het antwoord.\" },\n ],\n },\n ],\n});\n\nexport const gallerySection = definePattern({\n id: \"gallery-section\",\n label: \"Fotogalerij\",\n category: \"Media\",\n blocks: [\n { _type: \"richText\", html: \"<h2>In beeld</h2>\", _style: { align: \"center\", paddingY: \"sm\" } },\n { _type: \"gallery\", items: [], columns: 3, lightbox: \"on\", _style: { paddingY: \"sm\" } },\n ],\n});\n\nexport const quoteSection = definePattern({\n id: \"quote-section\",\n label: \"Uitspraak (uitgelicht)\",\n category: \"Social proof\",\n blocks: [\n {\n _type: \"quote\",\n text: \"“Dit team heeft ons echt geholpen — aanrader!”\",\n author: \"Tevreden klant\",\n role: \"Bedrijfsnaam\",\n _style: { paddingY: \"lg\", width: \"narrow\", align: \"center\" },\n },\n ],\n});\n\nexport const contentWithSidebar = definePattern({\n id: \"content-with-sidebar\",\n label: \"Inhoud met zijbalk (widgets)\",\n category: \"Indeling\",\n description: \"Brede tekstkolom met een zijbalk vol widgets (laatste nieuws + call-to-action).\",\n blocks: [\n {\n _type: \"withSidebar\",\n side: \"right\",\n sidebarWidth: \"md\",\n sticky: true,\n _style: { paddingY: \"md\" },\n main: [\n { _type: \"richText\", html: \"<h2>Welkom</h2><p>Plaats hier je hoofdinhoud. In de zijbalk hiernaast tonen widgets automatisch je laatste nieuws en een oproep tot actie — die haal je zo uit dezelfde modules.</p>\" },\n ],\n aside: [\n { _type: \"newsWidget\", heading: \"Laatste nieuws\", limit: 4, basePath: \"/nieuws\", showImages: false },\n { _type: \"ctaWidget\", title: \"Vragen?\", text: \"Neem gerust contact op.\", buttonLabel: \"Contact\", buttonHref: \"#contact\" },\n ],\n },\n ],\n});\n\nexport const featuresCards = definePattern({\n id: \"features-cards\",\n label: \"Drie diensten (kaarten)\",\n category: \"Kenmerken\",\n description: \"Moderne diensten-kaarten met iconen en hover-effect (cards-module).\",\n blocks: [\n {\n _type: \"cards\",\n heading: \"Wat we doen\",\n columns: 3,\n _style: { paddingY: \"md\" },\n items: [\n { icon: \"⚡\", title: \"Dienst één\", text: \"Korte uitleg van deze dienst en het voordeel voor de klant.\" },\n { icon: \"🛠️\", title: \"Dienst twee\", text: \"Korte uitleg van deze dienst en het voordeel voor de klant.\" },\n { icon: \"💬\", title: \"Dienst drie\", text: \"Korte uitleg van deze dienst en het voordeel voor de klant.\", href: \"#contact\", linkLabel: \"Meer weten\" },\n ],\n },\n ],\n});\n\nexport const testimonialsSection = definePattern({\n id: \"testimonials-section\",\n label: \"Klantreviews (3 kaarten)\",\n category: \"Social proof\",\n blocks: [\n {\n _type: \"testimonials\",\n heading: \"Wat klanten zeggen\",\n jsonLd: true,\n _style: { paddingY: \"md\" },\n items: [\n { quote: \"Fantastisch geholpen, snel en vakkundig.\", author: \"Naam klant\", role: \"Plaats\", rating: 5 },\n { quote: \"Duidelijke communicatie en een prachtig resultaat.\", author: \"Naam klant\", role: \"Plaats\", rating: 5 },\n { quote: \"Een aanrader voor iedereen in de regio.\", author: \"Naam klant\", role: \"Plaats\", rating: 4 },\n ],\n },\n ],\n});\n\nexport const teamSection = definePattern({\n id: \"team-section\",\n label: \"Ons team\",\n category: \"Over\",\n blocks: [\n {\n _type: \"team\",\n heading: \"Ons team\",\n _style: { paddingY: \"md\" },\n members: [\n { name: \"Naam\", role: \"Functie\", bio: \"Korte introductie van dit teamlid.\" },\n { name: \"Naam\", role: \"Functie\", bio: \"Korte introductie van dit teamlid.\" },\n { name: \"Naam\", role: \"Functie\", bio: \"Korte introductie van dit teamlid.\" },\n ],\n },\n ],\n});\n\nexport const countersSection = definePattern({\n id: \"counters-section\",\n label: \"Kengetallen (tellers)\",\n category: \"Social proof\",\n blocks: [\n {\n _type: \"counters\",\n _style: { paddingY: \"md\", align: \"center\" },\n items: [\n { value: \"15\", suffix: \"+\", label: \"Jaar ervaring\" },\n { value: \"250\", suffix: \"+\", label: \"Tevreden klanten\" },\n { value: \"4.9\", label: \"Gemiddelde beoordeling\" },\n ],\n },\n ],\n});\n\nexport const logosSection = definePattern({\n id: \"logos-section\",\n label: \"Bekend van (logo-strook)\",\n category: \"Social proof\",\n blocks: [\n { _type: \"logos\", heading: \"Zij gingen je voor\", grayscale: true, items: [], _style: { paddingY: \"sm\" } },\n ],\n});\n\nexport const stepsSection = definePattern({\n id: \"steps-section\",\n label: \"Stappenplan (zo werkt het)\",\n category: \"Kenmerken\",\n blocks: [\n {\n _type: \"timeline\",\n heading: \"Zo werkt het\",\n _style: { paddingY: \"md\", width: \"narrow\" },\n items: [\n { title: \"1. Kennismaking\", text: \"We bespreken je wensen, vrijblijvend.\" },\n { title: \"2. Voorstel\", text: \"Je ontvangt een helder voorstel met vaste prijs.\" },\n { title: \"3. Uitvoering\", text: \"We gaan aan de slag en houden je op de hoogte.\" },\n { title: \"4. Oplevering\", text: \"Klaar — met nazorg en garantie.\" },\n ],\n },\n ],\n});\n\nexport const newsletterSection = definePattern({\n id: \"newsletter-section\",\n label: \"Nieuwsbrief-aanmelding\",\n category: \"CTA\",\n blocks: [\n { _type: \"newsletter\", heading: \"Blijf op de hoogte\", text: \"Ontvang tips en nieuws — max. één mail per maand.\", buttonLabel: \"Aanmelden\", _style: { paddingY: \"md\", width: \"narrow\" } },\n ],\n});\n\nexport const portfolioSection = definePattern({\n id: \"portfolio-section\",\n label: \"Portfolio / projecten\",\n category: \"Media\",\n description: \"Projecten-grid met categorie-filter en lightbox (portfolio-module).\",\n blocks: [\n {\n _type: \"portfolio\",\n heading: \"Ons werk\",\n intro: \"Een greep uit recente projecten.\",\n columns: 3,\n showFilter: true,\n lightbox: true,\n _style: { paddingY: \"md\" },\n items: [\n { imageUrl: \"\", title: \"Project één\", category: \"Categorie A\" },\n { imageUrl: \"\", title: \"Project twee\", category: \"Categorie B\" },\n { imageUrl: \"\", title: \"Project drie\", category: \"Categorie A\" },\n ],\n },\n ],\n});\n\nexport const jobsSection = definePattern({\n id: \"jobs-section\",\n label: \"Vacatures\",\n category: \"Over\",\n description: \"Vacature-overzicht met Google Jobs-JSON-LD (vacatures-module).\",\n blocks: [\n {\n _type: \"jobs\",\n heading: \"Werken bij ons\",\n intro: \"We groeien — kom je het team versterken?\",\n jsonLd: true,\n _style: { paddingY: \"md\", width: \"narrow\" },\n items: [\n { title: \"Functietitel\", employmentType: \"Fulltime\", location: \"Plaats\", description: \"Korte omschrijving van de functie en wat je gaat doen.\" },\n ],\n },\n ],\n});\n\nexport const beforeAfterSection = definePattern({\n id: \"before-after-section\",\n label: \"Voor / na\",\n category: \"Media\",\n description: \"Voor/na-vergelijker met sleepbare scheiding (voor-na-module).\",\n blocks: [\n { _type: \"richText\", html: \"<h2>Het verschil</h2>\", _style: { align: \"center\", paddingY: \"sm\" } },\n { _type: \"beforeAfter\", beforeUrl: \"\", afterUrl: \"\", beforeLabel: \"Voor\", afterLabel: \"Na\", aspectRatio: \"4/3\", _style: { paddingY: \"sm\", width: \"narrow\" } },\n ],\n});\n\n/* ── Pagina-starters: complete pagina's in één klik (daarna inhoud aanpassen) ── */\n\nexport const pageLanding = definePattern({\n id: \"page-landing\",\n label: \"Landingspagina\",\n category: \"Pagina's\",\n description: \"Hero, kenmerken, galerij, review, prijzen, FAQ en een afsluitende CTA.\",\n blocks: [\n ...heroCentered.blocks,\n ...featuresThree.blocks,\n ...gallerySection.blocks,\n ...quoteSection.blocks,\n ...pricingThree.blocks,\n ...faqSection.blocks,\n ...ctaBanner.blocks,\n ],\n});\n\nexport const pageServices = definePattern({\n id: \"page-services\",\n label: \"Dienstenpagina\",\n category: \"Pagina's\",\n description: \"Introductie, drie diensten in kolommen, stappenplan en CTA.\",\n blocks: [\n { _type: \"hero\", title: \"Onze diensten\", subtitle: \"Waar we je mee helpen.\", align: \"center\", vAlign: \"center\", minHeight: \"sm\" },\n { _type: \"richText\", html: \"<p>Korte introductie: voor wie werk je, wat maakt jullie aanpak anders?</p>\", _style: { width: \"narrow\", align: \"center\", paddingY: \"sm\" } },\n ...featuresThree.blocks.slice(1),\n ...stepsSection.blocks,\n ...ctaBanner.blocks,\n ],\n});\n\nexport const pageAbout = definePattern({\n id: \"page-about\",\n label: \"Over ons-pagina\",\n category: \"Pagina's\",\n description: \"Verhaal met beeld, uitgelichte quote en CTA.\",\n blocks: [\n { _type: \"hero\", title: \"Over ons\", subtitle: \"Wie we zijn en waar we voor staan.\", align: \"center\", vAlign: \"center\", minHeight: \"sm\" },\n ...aboutImageText.blocks,\n ...quoteSection.blocks,\n ...ctaBanner.blocks,\n ],\n});\n\nexport const pageContact = definePattern({\n id: \"page-contact\",\n label: \"Contactpagina\",\n category: \"Pagina's\",\n description: \"Contactgegevens naast openingstijden; voeg eventueel je formulier-blok toe.\",\n blocks: [\n { _type: \"hero\", title: \"Contact\", subtitle: \"We horen graag van je.\", align: \"center\", vAlign: \"center\", minHeight: \"sm\" },\n {\n _type: \"columns\",\n _style: { paddingY: \"md\" },\n // 8.14: contact en tijden komen uit het bedrijfsprofiel (Instellingen → Bedrijf): één keer\n // invullen, en deze pagina klopt vanzelf mee.\n columns: [\n { blocks: [{ _type: \"contact\", heading: \"Neem contact op\" }] },\n { blocks: [{ _type: \"openingHours\", heading: \"Openingstijden\", rows: [], showStatus: true }] },\n ],\n },\n ...ctaBanner.blocks,\n ],\n});\n\n/* ── 8.14: pagina's per soort site (de branchestarters bouwen hierop) ── */\n\nexport const pageTarieven = definePattern({\n id: \"page-tarieven\",\n label: \"Tarieven / prijslijst\",\n category: \"Pagina's\",\n description: \"Prijslijst met behandelingen of diensten, toelichting en een knop om te boeken.\",\n blocks: [\n { _type: \"hero\", title: \"Tarieven\", subtitle: \"Duidelijke prijzen, zonder verrassingen.\", align: \"center\", vAlign: \"center\", minHeight: \"sm\" },\n {\n _type: \"priceList\",\n variant: \"kolommen\",\n sections: [\n { title: \"Behandelingen\", items: [{ name: \"Dienst één\", description: \"Korte omschrijving.\", price: \"€ 25\", duration: \"30 min\" }, { name: \"Dienst twee\", description: \"Korte omschrijving.\", price: \"€ 40\", duration: \"45 min\" }] },\n { title: \"Extra's\", items: [{ name: \"Dienst drie\", description: \"Korte omschrijving.\", price: \"€ 10\", duration: \"15 min\" }] },\n ],\n footnote: \"Prijzen zijn inclusief btw.\",\n },\n ...ctaBanner.blocks,\n ],\n});\n\nexport const pageMenukaart = definePattern({\n id: \"page-menukaart\",\n label: \"Menukaart\",\n category: \"Pagina's\",\n description: \"Menukaart met voorgerechten, hoofdgerechten en desserts, plus openingstijden.\",\n blocks: [\n { _type: \"hero\", title: \"Onze kaart\", subtitle: \"Seizoensgebonden en met zorg bereid.\", align: \"center\", vAlign: \"center\", minHeight: \"sm\" },\n {\n _type: \"priceList\",\n variant: \"menu\",\n sections: [\n { title: \"Voorgerechten\", items: [{ name: \"Dienst één\", description: \"Korte omschrijving.\", price: \"€ 9\" }] },\n { title: \"Hoofdgerechten\", items: [{ name: \"Dienst twee\", description: \"Korte omschrijving.\", price: \"€ 22\", tags: \"vegetarisch\" }] },\n { title: \"Desserts\", items: [{ name: \"Dienst drie\", description: \"Korte omschrijving.\", price: \"€ 8\" }] },\n ],\n footnote: \"Allergieën of dieetwensen? Laat het ons weten.\",\n jsonLd: true,\n },\n { _type: \"openingHours\", heading: \"Openingstijden\", rows: [], showStatus: true, _style: { width: \"narrow\" } },\n ],\n});\n\nexport const pageReserveren = definePattern({\n id: \"page-reserveren\",\n label: \"Reserveren / afspraak maken\",\n category: \"Pagina's\",\n description: \"Online afspraak maken of reserveren, met contact en openingstijden ernaast.\",\n blocks: [\n { _type: \"hero\", title: \"Afspraak maken\", subtitle: \"Kies zelf een moment dat jou uitkomt.\", align: \"center\", vAlign: \"center\", minHeight: \"sm\" },\n { _type: \"booking\", heading: \"Online plannen\", provider: \"custom\", embedUrl: \"\" },\n {\n _type: \"columns\",\n columns: [\n { blocks: [{ _type: \"contact\", heading: \"Liever bellen?\" }] },\n { blocks: [{ _type: \"openingHours\", heading: \"Openingstijden\", rows: [], showStatus: true }] },\n ],\n },\n ],\n});\n\nexport const pageTeam = definePattern({\n id: \"page-team\",\n label: \"Ons team\",\n category: \"Pagina's\",\n description: \"De mensen achter je bedrijf, met een korte inleiding en reviews.\",\n blocks: [\n { _type: \"hero\", title: \"Ons team\", subtitle: \"Met wie je te maken krijgt.\", align: \"center\", vAlign: \"center\", minHeight: \"sm\" },\n ...teamSection.blocks,\n ...testimonialsSection.blocks,\n ],\n});\n\nexport const pageVerhuur = definePattern({\n id: \"page-verhuur\",\n label: \"Verblijf / accommodatie\",\n category: \"Pagina's\",\n description: \"Foto's, voorzieningen, prijzen per periode, veelgestelde vragen en boeken.\",\n blocks: [\n { _type: \"hero\", title: \"Ons verblijf\", subtitle: \"Rust, ruimte en alles wat je nodig hebt.\", align: \"center\", vAlign: \"center\", minHeight: \"md\" },\n ...gallerySection.blocks,\n {\n _type: \"cards\",\n heading: \"Voorzieningen\",\n columns: 3,\n items: [\n { icon: \"🛏️\", title: \"Slaapkamers\", text: \"Korte omschrijving.\" },\n { icon: \"🍳\", title: \"Keuken\", text: \"Korte omschrijving.\" },\n { icon: \"🌳\", title: \"Tuin\", text: \"Korte omschrijving.\" },\n ],\n },\n {\n _type: \"priceList\",\n heading: \"Prijzen\",\n variant: \"lijst\",\n sections: [{ title: \"Per nacht\", items: [{ name: \"Laagseizoen\", price: \"€ 00\", description: \"Minimaal 2 nachten.\" }, { name: \"Hoogseizoen\", price: \"€ 00\", description: \"Minimaal 7 nachten.\" }] }],\n },\n { _type: \"availability\", heading: \"Beschikbaarheid\", units: [{ label: \"Ons verblijf\", icalUrl: \"\" }], months: 4, minNights: 2, requestPath: \"/contact\" },\n ...faqSection.blocks,\n ],\n});\n\nexport const pagePortfolio = definePattern({\n id: \"page-portfolio\",\n label: \"Werk / portfolio\",\n category: \"Pagina's\",\n description: \"Projecten met filter per categorie, een uitgelichte review en een CTA.\",\n blocks: [\n { _type: \"hero\", title: \"Ons werk\", subtitle: \"Een greep uit recente projecten.\", align: \"center\", vAlign: \"center\", minHeight: \"sm\" },\n ...portfolioSection.blocks,\n ...quoteSection.blocks,\n ...ctaBanner.blocks,\n ],\n});\n\nexport const pageAgenda = definePattern({\n id: \"page-agenda\",\n label: \"Agenda\",\n category: \"Pagina's\",\n description: \"Komende activiteiten met datum en plaats — ook in Google en toe te voegen aan de agenda.\",\n blocks: [\n { _type: \"hero\", title: \"Agenda\", subtitle: \"Wat er binnenkort te doen is.\", align: \"center\", vAlign: \"center\", minHeight: \"sm\" },\n { _type: \"agenda\", heading: \"Komende activiteiten\", events: [{ title: \"Eerste activiteit\", start: \"2026-12-01T19:30\", location: \"Plaats\", description: \"Korte omschrijving.\" }] },\n ...newsletterSection.blocks,\n ],\n});\n\n/** Alle ingebouwde patronen. */\nexport const builtinPatterns: Pattern[] = [\n heroCentered,\n featuresThree,\n featuresCards,\n aboutImageText,\n teamSection,\n ctaBanner,\n newsletterSection,\n pricingThree,\n faqSection,\n gallerySection,\n quoteSection,\n testimonialsSection,\n countersSection,\n logosSection,\n stepsSection,\n portfolioSection,\n jobsSection,\n beforeAfterSection,\n contentWithSidebar,\n pageLanding,\n pageServices,\n pageAbout,\n pageContact,\n pageTarieven,\n pageMenukaart,\n pageReserveren,\n pageTeam,\n pageVerhuur,\n pagePortfolio,\n pageAgenda,\n];\n"],"mappings":"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","names":[]}
@@ -1,4 +1,144 @@
1
1
  const RELEASE_NOTES = [
2
+ {
3
+ versie: "8.15",
4
+ punten: [
5
+ "Nieuw blok Beschikbaarheid (module Verhuur): een kalender met vrije en bezette data uit de agenda-link van Airbnb, Booking.com of je boekingssysteem. Bezoekers kiezen aankomst en vertrek en vragen direct aan \u2014 het formulier staat dan al ingevuld.",
6
+ "Agenda: activiteiten die elke week, om de week of elke maand terugkomen zet je er \xE9\xE9n keer in."
7
+ ]
8
+ },
9
+ {
10
+ versie: "8.14",
11
+ punten: [
12
+ "Snel starten: een nieuwe site kies je als kapper, restaurant, dienstverlener, webwinkel, vakantiehuis, vereniging, praktijk of creatief \u2014 en krijgt meteen de pagina's, het menu en een passende huisstijl, als werkversie om in te vullen.",
13
+ "Nieuwe paginasjablonen: tarieven, menukaart, afspraak maken, team, verblijf, werk en agenda.",
14
+ "Formulieren: een veld voor een periode (aankomst \u2013 vertrek), verborgen velden, vooraf ingevuld via een link (/contact?huisje=\u2026), en een kopie naar meerdere e-mailadressen.",
15
+ "Agenda: datum en tijd kiezen met een kalender, prijs, foto, link en status (afgelast, verplaatst, online) \u2014 en vollediger in Google.",
16
+ "Boeken voor verhuur via Lodgify, Booking Experts, Tommy of Bookingmotor. Webwinkels kunnen nette productadressen gebruiken (/product/naam)."
17
+ ]
18
+ },
19
+ {
20
+ versie: "8.13",
21
+ punten: [
22
+ "Nieuw: Instellingen \u2192 Bedrijf. Vul adres, telefoon en openingstijden \xE9\xE9n keer in \u2014 ze verschijnen in Google, in het contact- en openingstijdenblok en onderaan je site. Ook feestdagen en vakanties, met 'Nu geopend' dat daar rekening mee houdt.",
23
+ "Nieuw blok Prijslijst / menukaart: behandelingen, gerechten of tarieven met prijs, duur en labels \u2014 als lijst, menukaart of in kolommen. Regels voeg je op de pagina zelf toe.",
24
+ "Het openingsbeeld kan nu ook met de tekst n\xE1\xE1st de foto, en met korte vertrouwenspunten (\u2713 Gratis offerte). Nieuw blok Sectiekop voor een nette kop boven elke sectie.",
25
+ "Het reviewblok krijgt een knop 'Laat een review achter' als je in Instellingen \u2192 Bedrijf je Google-reviewlink invult.",
26
+ "Instellingen \u2192 Kop: logo, de knop rechtsboven en een belbalk op de telefoon (voor sites met de standaardkop)."
27
+ ]
28
+ },
29
+ {
30
+ versie: "8.12",
31
+ punten: [
32
+ "Nieuwsberichten staan op de site als een net raster van kaarten met even grote foto's.",
33
+ "'Omlijnde' knoppen zijn nu echt omlijnd, en knoptekst op je merkkleur is altijd leesbaar \u2014 ook bij een lichte kleur.",
34
+ "V\xF3\xF3r publiceren krijg je een seintje als er nog voorbeeldtekst op de pagina staat, zoals 'Dienst \xE9\xE9n'.",
35
+ "Het beheer is rustiger en duidelijker: iconen in plaats van losse tekens, knoppen die laten zien dat ze bezig zijn, uitnodigende lege lijsten en foutmeldingen in gewone woorden."
36
+ ]
37
+ },
38
+ {
39
+ versie: "8.11",
40
+ punten: [
41
+ "Het potlood bewerkt nu alles op de pagina zelf: tekst, maar ook kaarten, teamleden of reviews toevoegen, verplaatsen en weghalen, waar een knop heen gaat, en snelle keuzes zoals het aantal kolommen. Het tandwiel opent alle instellingen in de zijbalk.",
42
+ "Onder elk blok verschijnt een + om iets toe te voegen. De blokkiezer heeft een zoekveld, groepen en per blok een korte uitleg, plus kant-en-klare secties.",
43
+ "Alle blokinstellingen zijn in het Nederlands, met duidelijke keuzes (zoals 'Ingekaderd' of 'Raster') en knoppen voor kolommen en sterren.",
44
+ "Een rand met de naam van het blok laat zien waar een blok begint en eindigt; een leeg blok is zichtbaar in plaats van verdwenen.",
45
+ "Wat je nog niet publiceerde is subtiel gemarkeerd in plaats van rood. De cookiemelding staat tijdens het bewerken niet meer in de weg."
46
+ ]
47
+ },
48
+ {
49
+ versie: "8.10",
50
+ punten: [
51
+ "Veiliger bewerken: de homepage kan niet meer per ongeluk offline of in de prullenbak, en bij het weggooien van een pagina of formulier zie je eerst waar het nog gebruikt wordt (menu, footer, andere pagina's).",
52
+ "Huisstijl, menu en footer hebben een knop 'Vorige terugzetten' \u2014 en gedeelde blokken bewaren hun eerdere versies.",
53
+ "Knoppen en links kies je overal uit de pagina's van je site, in plaats van een adres te typen.",
54
+ "Een blok met een achtergrondkleur zet de tekst vanzelf in een leesbare kleur en krijgt wat lucht.",
55
+ "De controle v\xF3\xF3r publiceren ziet nu ook links in lopende tekst, knoppen zonder bestemming, links naar pagina's die nog niet live staan en meer dan \xE9\xE9n hoofdkop \u2014 ook bij 'Alles publiceren'.",
56
+ "Foutmeldingen zeggen in gewone woorden welk veld er niet klopt."
57
+ ]
58
+ },
59
+ {
60
+ versie: "8.6",
61
+ punten: [
62
+ "Teksten op de site zelf bewerk je nu met dezelfde editor als in het beheer: typ / voor een kop, lijst, tabel of foto, plak of sleep foto's erin, en kies of een link in een nieuw tabblad opent.",
63
+ "Opsommingen en citaten staan op de site nu ook echt zo: met bolletjes, nummers en inspringing.",
64
+ "Het beheer is rustiger: 'Nieuw in het beheer' is \xE9\xE9n regel op Start, je account staat bovenaan, en op een telefoon passen alle kaarten weer op het scherm."
65
+ ]
66
+ },
67
+ {
68
+ versie: "8.5",
69
+ punten: [
70
+ "Sneller schrijven: typ / in een tekstvak voor een kop, lijst, tabel, foto of link. Selecteer tekst voor een klein menu met vet, cursief en link.",
71
+ "Foto's kun je nu direct in een tekst plakken of erin slepen; ze worden vanzelf ge\xFCpload.",
72
+ "Nieuwsartikelen schrijf je in een rustige opzet: titel en tekst links, datum, coverfoto en samenvatting ernaast.",
73
+ "Leesbaarheid: onder nieuws en bij elke pagina zie je hoe makkelijk je tekst leest (taalniveau, leestijd en tips).",
74
+ "Links kun je laten openen in een nieuw tabblad.",
75
+ "Media: sorteer op datum, naam of grootte, zie grootte en datum per foto, selecteer er meerdere tegelijk om te verwijderen, en download een foto.",
76
+ "Een preview-link kopieer, open of deel je met \xE9\xE9n knop, en je ziet tot wanneer hij werkt."
77
+ ]
78
+ },
79
+ {
80
+ versie: "8.4",
81
+ punten: [
82
+ "Inplannen: zet een pagina op een gekozen moment vanzelf live of offline (Pagina's \u2192 pagina \u2192 Inplannen).",
83
+ "V\xF3\xF3r publiceren krijg je een seintje bij foto's zonder beschrijving, links naar pagina's die niet bestaan en een ontbrekende omschrijving voor Google.",
84
+ "Statistieken toont adressen die bezoekers niet vonden \u2014 met \xE9\xE9n klik stuur je ze door naar een bestaande pagina.",
85
+ "V\xF3\xF3r je een oude versie terugzet, zie je wat er verandert.",
86
+ "In Media filter je op foto's zonder beschrijving, en op de site vult een foto zonder beschrijving die vanzelf aan uit de bibliotheek.",
87
+ "Zoeken in het beheer: druk Ctrl+K (of Cmd+K) of klik op Zoeken, en typ een pagina, artikel, formulier of onderdeel."
88
+ ]
89
+ },
90
+ {
91
+ versie: "8.3",
92
+ punten: [
93
+ "Foto's laden op telefoons veel sneller: de site kiest nu de juiste maat in plaats van altijd de grootste.",
94
+ "Lettertypen kunnen via je eigen site laden, zodat bezoekers geen verbinding met Google maken (privacy).",
95
+ "Het kruimelpad toont de echte paginatitels.",
96
+ "Raakt de verbinding weg tijdens het bewerken, dan zie je dat \u2014 en je werk wordt vanzelf bewaard zodra je weer online bent.",
97
+ "De bezoekersstatistieken tellen geen bots en testtools meer mee."
98
+ ]
99
+ },
100
+ {
101
+ versie: "8.2",
102
+ punten: [
103
+ "Een foto kiezen of wijzigen gaat overal hetzelfde: je ziet de foto zelf, met \u201CWijzigen\u201D en \u201CWeghalen\u201D.",
104
+ "Een link plaatsen doe je in een eigen venster: kies een pagina van je site of typ een adres.",
105
+ "Heb je iets nog niet opgeslagen en klik je op een ander tabblad, dan vraagt het beheer eerst of dat de bedoeling is.",
106
+ "Een nieuwe pagina zet je in \xE9\xE9n stap ook in het menu, en met \u201CNu bewerken op de site\u201D ga je er direct heen.",
107
+ "Een blok weghalen in de editor kan zonder bevestiging: \u201COngedaan maken\u201D zet het terug.",
108
+ "Formulieren: keuzes vul je per regel in, en inzendingen tonen de vragen in plaats van technische namen.",
109
+ "Nieuws: een artikel met een datum in de toekomst heet nu \u201Cingepland\u201D, en datums staan in het Nederlands.",
110
+ "Op de startpagina opent een klik op een pagina, bestelling of formulier meteen dat item.",
111
+ "Op telefoon en tablet zijn de knoppen in de editor groter, en uitloggen kan ook op een klein scherm."
112
+ ]
113
+ },
114
+ {
115
+ versie: "8.1",
116
+ punten: [
117
+ "Een formulier verwijderen werkt weer, en een leeggemaakte bedankt-pagina of kopie-adres blijft nu ook echt leeg.",
118
+ "Een logo, deelafbeelding of lettertype dat je weghaalt in Instellingen komt niet meer terug.",
119
+ "Wie een formulier invult krijgt een duidelijke melding als er iets niet klopt (bijvoorbeeld een ongeldig e-mailadres).",
120
+ "Werk je in Instellingen of Menu terwijl iemand anders iets opslaat, dan raak je je wijzigingen niet meer kwijt: je kiest zelf welke versie blijft.",
121
+ "Lukt het laden van een lijst niet, dan zie je dat (met een knop om het opnieuw te proberen) in plaats van een lege lijst.",
122
+ "Telefoonfoto's staan na het uploaden altijd rechtop."
123
+ ]
124
+ },
125
+ {
126
+ versie: "8.0",
127
+ punten: [
128
+ "Beschrijvingen (alt-teksten) bij foto's in Media worden nu echt bewaard zodra je het veld verlaat.",
129
+ "Het adres van een pagina wordt automatisch netjes gemaakt (kleine letters, streepjes).",
130
+ "Met het toetsenbord zie je nu altijd waar je bent, en schermlezers noemen elk veld bij zijn naam.",
131
+ "Formulieren op je site vullen naam, e-mail en adres automatisch in, en telefoonvelden tonen een cijfertoetsenbord."
132
+ ]
133
+ },
134
+ {
135
+ versie: "7.33",
136
+ punten: [
137
+ "Webwinkel: klanten kunnen kiezen voor afhalen. Jij stelt onder Webwinkel \u2192 Instellingen de toelichting in (adres, tijden).",
138
+ "In de bestelmails is elk product nu klikbaar: je komt direct op de juiste productpagina, met de bestelde variant al gekozen.",
139
+ "In een bestelling in het beheer zijn de producten ook aanklikbaar."
140
+ ]
141
+ },
2
142
  {
3
143
  versie: "7.24",
4
144
  punten: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/releaseNotes.ts"],"sourcesContent":["/**\n * \"Wat is nieuw\" (7.24) — korte, klantgerichte notities per release, getoond in /beheer.\n *\n * Features die je bouwt zonder dat de klant het hoort, bestaan voor die klant niet. Dit is de\n * enige plek waar dat verteld wordt; `CoreVersion` toont de notitie van de huidige minor één keer.\n * Alleen wat de KLANT merkt, in zijn woorden — geen interne refactors.\n */\nexport interface ReleaseNote {\n /** major.minor — patches tellen niet als \"nieuw\". */\n versie: string;\n punten: string[];\n}\n\nexport const RELEASE_NOTES: ReleaseNote[] = [\n {\n versie: \"7.24\",\n punten: [\n \"Het menu dat je onder Menu instelt staat nu écht op de site — met submenu's.\",\n \"Bij Pagina's zie je meteen welke pagina's wijzigingen hebben die nog niet live staan.\",\n \"Een pagina kun je offline halen (en later weer publiceren) of naar de prullenbak doen — 30 dagen te herstellen.\",\n \"Verander je het adres van een pagina, dan verwijst het oude adres automatisch door.\",\n \"Deel een preview-link van een werkversie met iemand zonder account.\",\n \"Kies een focuspunt op een foto zodat het juiste deel in beeld blijft op mobiel.\",\n \"Formulieren: inzendingen exporteren als CSV, verwijderen, en zien wat nieuw is.\",\n \"Statistieken tonen nu ook waar bezoekers vandaan komen en op welk apparaat.\",\n ],\n },\n {\n versie: \"7.23\",\n punten: [\"Per productoptie (bijvoorbeeld Print of Kleur) kun je aangeven dat elke waarde een eigen foto heeft.\"],\n },\n];\n\n/** De notitie die bij deze engine-versie hoort (op major.minor). */\nexport function releaseNoteVoor(versie: string): ReleaseNote | null {\n const mm = versie.split(\".\").slice(0, 2).join(\".\");\n return RELEASE_NOTES.find((n) => n.versie === mm) ?? null;\n}\n"],"mappings":"AAaO,MAAM,gBAA+B;AAAA,EAC1C;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ,CAAC,sGAAsG;AAAA,EACjH;AACF;AAGO,SAAS,gBAAgB,QAAoC;AAClE,QAAM,KAAK,OAAO,MAAM,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AACjD,SAAO,cAAc,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK;AACvD;","names":[]}
1
+ {"version":3,"sources":["../src/releaseNotes.ts"],"sourcesContent":["/**\n * \"Wat is nieuw\" (7.24) — korte, klantgerichte notities per release, getoond in /beheer.\n *\n * Features die je bouwt zonder dat de klant het hoort, bestaan voor die klant niet. Dit is de\n * enige plek waar dat verteld wordt; `CoreVersion` toont de notitie van de huidige minor één keer.\n * Alleen wat de KLANT merkt, in zijn woorden — geen interne refactors.\n */\nexport interface ReleaseNote {\n /** major.minor — patches tellen niet als \"nieuw\". */\n versie: string;\n punten: string[];\n}\n\nexport const RELEASE_NOTES: ReleaseNote[] = [\n {\n versie: \"8.15\",\n punten: [\n \"Nieuw blok Beschikbaarheid (module Verhuur): een kalender met vrije en bezette data uit de agenda-link van Airbnb, Booking.com of je boekingssysteem. Bezoekers kiezen aankomst en vertrek en vragen direct aan — het formulier staat dan al ingevuld.\",\n \"Agenda: activiteiten die elke week, om de week of elke maand terugkomen zet je er één keer in.\",\n ],\n },\n {\n versie: \"8.14\",\n punten: [\n \"Snel starten: een nieuwe site kies je als kapper, restaurant, dienstverlener, webwinkel, vakantiehuis, vereniging, praktijk of creatief — en krijgt meteen de pagina's, het menu en een passende huisstijl, als werkversie om in te vullen.\",\n \"Nieuwe paginasjablonen: tarieven, menukaart, afspraak maken, team, verblijf, werk en agenda.\",\n \"Formulieren: een veld voor een periode (aankomst – vertrek), verborgen velden, vooraf ingevuld via een link (/contact?huisje=…), en een kopie naar meerdere e-mailadressen.\",\n \"Agenda: datum en tijd kiezen met een kalender, prijs, foto, link en status (afgelast, verplaatst, online) — en vollediger in Google.\",\n \"Boeken voor verhuur via Lodgify, Booking Experts, Tommy of Bookingmotor. Webwinkels kunnen nette productadressen gebruiken (/product/naam).\",\n ],\n },\n {\n versie: \"8.13\",\n punten: [\n \"Nieuw: Instellingen → Bedrijf. Vul adres, telefoon en openingstijden één keer in — ze verschijnen in Google, in het contact- en openingstijdenblok en onderaan je site. Ook feestdagen en vakanties, met 'Nu geopend' dat daar rekening mee houdt.\",\n \"Nieuw blok Prijslijst / menukaart: behandelingen, gerechten of tarieven met prijs, duur en labels — als lijst, menukaart of in kolommen. Regels voeg je op de pagina zelf toe.\",\n \"Het openingsbeeld kan nu ook met de tekst náást de foto, en met korte vertrouwenspunten (✓ Gratis offerte). Nieuw blok Sectiekop voor een nette kop boven elke sectie.\",\n \"Het reviewblok krijgt een knop 'Laat een review achter' als je in Instellingen → Bedrijf je Google-reviewlink invult.\",\n \"Instellingen → Kop: logo, de knop rechtsboven en een belbalk op de telefoon (voor sites met de standaardkop).\",\n ],\n },\n {\n versie: \"8.12\",\n punten: [\n \"Nieuwsberichten staan op de site als een net raster van kaarten met even grote foto's.\",\n \"'Omlijnde' knoppen zijn nu echt omlijnd, en knoptekst op je merkkleur is altijd leesbaar — ook bij een lichte kleur.\",\n \"Vóór publiceren krijg je een seintje als er nog voorbeeldtekst op de pagina staat, zoals 'Dienst één'.\",\n \"Het beheer is rustiger en duidelijker: iconen in plaats van losse tekens, knoppen die laten zien dat ze bezig zijn, uitnodigende lege lijsten en foutmeldingen in gewone woorden.\",\n ],\n },\n {\n versie: \"8.11\",\n punten: [\n \"Het potlood bewerkt nu alles op de pagina zelf: tekst, maar ook kaarten, teamleden of reviews toevoegen, verplaatsen en weghalen, waar een knop heen gaat, en snelle keuzes zoals het aantal kolommen. Het tandwiel opent alle instellingen in de zijbalk.\",\n \"Onder elk blok verschijnt een + om iets toe te voegen. De blokkiezer heeft een zoekveld, groepen en per blok een korte uitleg, plus kant-en-klare secties.\",\n \"Alle blokinstellingen zijn in het Nederlands, met duidelijke keuzes (zoals 'Ingekaderd' of 'Raster') en knoppen voor kolommen en sterren.\",\n \"Een rand met de naam van het blok laat zien waar een blok begint en eindigt; een leeg blok is zichtbaar in plaats van verdwenen.\",\n \"Wat je nog niet publiceerde is subtiel gemarkeerd in plaats van rood. De cookiemelding staat tijdens het bewerken niet meer in de weg.\",\n ],\n },\n {\n versie: \"8.10\",\n punten: [\n \"Veiliger bewerken: de homepage kan niet meer per ongeluk offline of in de prullenbak, en bij het weggooien van een pagina of formulier zie je eerst waar het nog gebruikt wordt (menu, footer, andere pagina's).\",\n \"Huisstijl, menu en footer hebben een knop 'Vorige terugzetten' — en gedeelde blokken bewaren hun eerdere versies.\",\n \"Knoppen en links kies je overal uit de pagina's van je site, in plaats van een adres te typen.\",\n \"Een blok met een achtergrondkleur zet de tekst vanzelf in een leesbare kleur en krijgt wat lucht.\",\n \"De controle vóór publiceren ziet nu ook links in lopende tekst, knoppen zonder bestemming, links naar pagina's die nog niet live staan en meer dan één hoofdkop — ook bij 'Alles publiceren'.\",\n \"Foutmeldingen zeggen in gewone woorden welk veld er niet klopt.\",\n ],\n },\n {\n versie: \"8.6\",\n punten: [\n \"Teksten op de site zelf bewerk je nu met dezelfde editor als in het beheer: typ / voor een kop, lijst, tabel of foto, plak of sleep foto's erin, en kies of een link in een nieuw tabblad opent.\",\n \"Opsommingen en citaten staan op de site nu ook echt zo: met bolletjes, nummers en inspringing.\",\n \"Het beheer is rustiger: 'Nieuw in het beheer' is één regel op Start, je account staat bovenaan, en op een telefoon passen alle kaarten weer op het scherm.\",\n ],\n },\n {\n versie: \"8.5\",\n punten: [\n \"Sneller schrijven: typ / in een tekstvak voor een kop, lijst, tabel, foto of link. Selecteer tekst voor een klein menu met vet, cursief en link.\",\n \"Foto's kun je nu direct in een tekst plakken of erin slepen; ze worden vanzelf geüpload.\",\n \"Nieuwsartikelen schrijf je in een rustige opzet: titel en tekst links, datum, coverfoto en samenvatting ernaast.\",\n \"Leesbaarheid: onder nieuws en bij elke pagina zie je hoe makkelijk je tekst leest (taalniveau, leestijd en tips).\",\n \"Links kun je laten openen in een nieuw tabblad.\",\n \"Media: sorteer op datum, naam of grootte, zie grootte en datum per foto, selecteer er meerdere tegelijk om te verwijderen, en download een foto.\",\n \"Een preview-link kopieer, open of deel je met één knop, en je ziet tot wanneer hij werkt.\",\n ],\n },\n {\n versie: \"8.4\",\n punten: [\n \"Inplannen: zet een pagina op een gekozen moment vanzelf live of offline (Pagina's → pagina → Inplannen).\",\n \"Vóór publiceren krijg je een seintje bij foto's zonder beschrijving, links naar pagina's die niet bestaan en een ontbrekende omschrijving voor Google.\",\n \"Statistieken toont adressen die bezoekers niet vonden — met één klik stuur je ze door naar een bestaande pagina.\",\n \"Vóór je een oude versie terugzet, zie je wat er verandert.\",\n \"In Media filter je op foto's zonder beschrijving, en op de site vult een foto zonder beschrijving die vanzelf aan uit de bibliotheek.\",\n \"Zoeken in het beheer: druk Ctrl+K (of Cmd+K) of klik op Zoeken, en typ een pagina, artikel, formulier of onderdeel.\",\n ],\n },\n {\n versie: \"8.3\",\n punten: [\n \"Foto's laden op telefoons veel sneller: de site kiest nu de juiste maat in plaats van altijd de grootste.\",\n \"Lettertypen kunnen via je eigen site laden, zodat bezoekers geen verbinding met Google maken (privacy).\",\n \"Het kruimelpad toont de echte paginatitels.\",\n \"Raakt de verbinding weg tijdens het bewerken, dan zie je dat — en je werk wordt vanzelf bewaard zodra je weer online bent.\",\n \"De bezoekersstatistieken tellen geen bots en testtools meer mee.\",\n ],\n },\n {\n versie: \"8.2\",\n punten: [\n \"Een foto kiezen of wijzigen gaat overal hetzelfde: je ziet de foto zelf, met “Wijzigen” en “Weghalen”.\",\n \"Een link plaatsen doe je in een eigen venster: kies een pagina van je site of typ een adres.\",\n \"Heb je iets nog niet opgeslagen en klik je op een ander tabblad, dan vraagt het beheer eerst of dat de bedoeling is.\",\n \"Een nieuwe pagina zet je in één stap ook in het menu, en met “Nu bewerken op de site” ga je er direct heen.\",\n \"Een blok weghalen in de editor kan zonder bevestiging: “Ongedaan maken” zet het terug.\",\n \"Formulieren: keuzes vul je per regel in, en inzendingen tonen de vragen in plaats van technische namen.\",\n \"Nieuws: een artikel met een datum in de toekomst heet nu “ingepland”, en datums staan in het Nederlands.\",\n \"Op de startpagina opent een klik op een pagina, bestelling of formulier meteen dat item.\",\n \"Op telefoon en tablet zijn de knoppen in de editor groter, en uitloggen kan ook op een klein scherm.\",\n ],\n },\n {\n versie: \"8.1\",\n punten: [\n \"Een formulier verwijderen werkt weer, en een leeggemaakte bedankt-pagina of kopie-adres blijft nu ook echt leeg.\",\n \"Een logo, deelafbeelding of lettertype dat je weghaalt in Instellingen komt niet meer terug.\",\n \"Wie een formulier invult krijgt een duidelijke melding als er iets niet klopt (bijvoorbeeld een ongeldig e-mailadres).\",\n \"Werk je in Instellingen of Menu terwijl iemand anders iets opslaat, dan raak je je wijzigingen niet meer kwijt: je kiest zelf welke versie blijft.\",\n \"Lukt het laden van een lijst niet, dan zie je dat (met een knop om het opnieuw te proberen) in plaats van een lege lijst.\",\n \"Telefoonfoto's staan na het uploaden altijd rechtop.\",\n ],\n },\n {\n versie: \"8.0\",\n punten: [\n \"Beschrijvingen (alt-teksten) bij foto's in Media worden nu echt bewaard zodra je het veld verlaat.\",\n \"Het adres van een pagina wordt automatisch netjes gemaakt (kleine letters, streepjes).\",\n \"Met het toetsenbord zie je nu altijd waar je bent, en schermlezers noemen elk veld bij zijn naam.\",\n \"Formulieren op je site vullen naam, e-mail en adres automatisch in, en telefoonvelden tonen een cijfertoetsenbord.\",\n ],\n },\n {\n versie: \"7.33\",\n punten: [\n \"Webwinkel: klanten kunnen kiezen voor afhalen. Jij stelt onder Webwinkel → Instellingen de toelichting in (adres, tijden).\",\n \"In de bestelmails is elk product nu klikbaar: je komt direct op de juiste productpagina, met de bestelde variant al gekozen.\",\n \"In een bestelling in het beheer zijn de producten ook aanklikbaar.\",\n ],\n },\n {\n versie: \"7.24\",\n punten: [\n \"Het menu dat je onder Menu instelt staat nu écht op de site — met submenu's.\",\n \"Bij Pagina's zie je meteen welke pagina's wijzigingen hebben die nog niet live staan.\",\n \"Een pagina kun je offline halen (en later weer publiceren) of naar de prullenbak doen — 30 dagen te herstellen.\",\n \"Verander je het adres van een pagina, dan verwijst het oude adres automatisch door.\",\n \"Deel een preview-link van een werkversie met iemand zonder account.\",\n \"Kies een focuspunt op een foto zodat het juiste deel in beeld blijft op mobiel.\",\n \"Formulieren: inzendingen exporteren als CSV, verwijderen, en zien wat nieuw is.\",\n \"Statistieken tonen nu ook waar bezoekers vandaan komen en op welk apparaat.\",\n ],\n },\n {\n versie: \"7.23\",\n punten: [\"Per productoptie (bijvoorbeeld Print of Kleur) kun je aangeven dat elke waarde een eigen foto heeft.\"],\n },\n];\n\n/** De notitie die bij deze engine-versie hoort (op major.minor). */\nexport function releaseNoteVoor(versie: string): ReleaseNote | null {\n const mm = versie.split(\".\").slice(0, 2).join(\".\");\n return RELEASE_NOTES.find((n) => n.versie === mm) ?? null;\n}\n"],"mappings":"AAaO,MAAM,gBAA+B;AAAA,EAC1C;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ,CAAC,sGAAsG;AAAA,EACjH;AACF;AAGO,SAAS,gBAAgB,QAAoC;AAClE,QAAM,KAAK,OAAO,MAAM,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AACjD,SAAO,cAAc,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK;AACvD;","names":[]}
@@ -1,3 +1,4 @@
1
+ import * as React from "react";
1
2
  import type { Page } from "../schema/pages.js";
2
3
  /**
3
4
  * Rendert een (gepubliceerde) pagina via de **context-registry** (module-resolved, opgebouwd in
@@ -15,4 +16,4 @@ export declare function PublishedPage({ page, siteId, mode, blockData, }: {
15
16
  siteId: string;
16
17
  mode?: "view" | "preview";
17
18
  blockData?: Record<string, unknown>;
18
- }): import("react").JSX.Element;
19
+ }): React.JSX.Element;
@@ -1,5 +1,6 @@
1
1
  "use client";
2
- import { jsx } from "react/jsx-runtime";
2
+ import { Fragment, jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
3
4
  import { useEffect } from "react";
4
5
  import { PageRenderer } from "./PageRenderer.js";
5
6
  import { useRegistry, BlockDataProvider } from "../blocks/context.js";
@@ -18,7 +19,7 @@ function PublishedPage({
18
19
  const config = useSiteConfig();
19
20
  const { draftBlocks, editPath, fotoVervanger, publishedOverride } = useEditor();
20
21
  useEffect(() => {
21
- if (!isDemoActive()) return;
22
+ if (!config.demoEditing && !isDemoActive()) return;
22
23
  const pad = huidigPad(window.location.pathname);
23
24
  const volledig = page;
24
25
  registerSeed(siteId, pad, {
@@ -27,7 +28,7 @@ function PublishedPage({
27
28
  slug: volledig.slug || (pad.split("/").filter(Boolean).pop() ?? ""),
28
29
  path: pad
29
30
  });
30
- }, [siteId, page]);
31
+ }, [siteId, page, config.demoEditing]);
31
32
  const huidigCanoniekPad = typeof window !== "undefined" ? (() => {
32
33
  const { slugs } = parseLocaleSlugs(
33
34
  window.location.pathname.split("/").filter(Boolean),
@@ -38,8 +39,13 @@ function PublishedPage({
38
39
  const opDezePagina = draftBlocks !== null && huidigCanoniekPad !== null && huidigCanoniekPad === editPath;
39
40
  const overrideVoorDezePagina = !opDezePagina && publishedOverride !== null && huidigCanoniekPad !== null && huidigCanoniekPad === publishedOverride.path ? publishedOverride.blocks : null;
40
41
  const teTonen = opDezePagina ? { ...page, blocks: draftBlocks } : overrideVoorDezePagina ? { ...page, blocks: overrideVoorDezePagina } : page;
41
- return /* @__PURE__ */ jsx(BlockDataProvider, { data: blockData, children: /* @__PURE__ */ jsx(InlineImageEditProvider, { onReplace: opDezePagina ? fotoVervanger : null, children: /* @__PURE__ */ jsx(PageRenderer, { page: teTonen, registry, siteId, mode }) }) });
42
+ const inhoud = /* @__PURE__ */ jsx(BlockDataProvider, { data: blockData, children: /* @__PURE__ */ jsx(InlineImageEditProvider, { onReplace: opDezePagina ? fotoVervanger : null, children: /* @__PURE__ */ jsx(PageRenderer, { page: teTonen, registry, siteId, mode: opDezePagina ? "preview" : mode }) }) });
43
+ const overgang = config.paginaOvergang;
44
+ if (!overgang || mode !== "view" || opDezePagina) return inhoud;
45
+ const klasse = `xicms-${overgang}`;
46
+ return /* @__PURE__ */ jsx(ViewTransition, { enter: klasse, exit: klasse, default: "none", children: inhoud });
42
47
  }
48
+ const ViewTransition = React.ViewTransition ?? (({ children }) => /* @__PURE__ */ jsx(Fragment, { children }));
43
49
  function huidigPad(p) {
44
50
  const schoon = p.replace(/\/+$/, "");
45
51
  return schoon === "" ? "/" : schoon;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/render/PublishedPage.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\nimport { PageRenderer } from \"./PageRenderer\";\nimport { useRegistry, BlockDataProvider } from \"../blocks/context\";\nimport { useEditor } from \"../editor/EditorProvider\";\nimport { isDemoActive, registerSeed } from \"../demo/demoStore\";\nimport { InlineImageEditProvider } from \"../media/ImageContext\";\nimport { useSiteConfig } from \"../config\";\nimport { parseLocaleSlugs, siteLocales } from \"../i18n/overlay\";\nimport type { Page } from \"../schema/pages\";\n\n/**\n * Rendert een (gepubliceerde) pagina via de **context-registry** (module-resolved, opgebouwd in\n * XiCMSProvider). Gebruik dit i.p.v. zelf `createRegistry([...builtinBlocks])` server-side te bouwen:\n * sinds de blokken op Astryx draaien zijn de meeste `\"use client\"`, en een server-opgebouwde registry\n * krijgt daar alleen opake client-referenties van → die blokken worden stil overgeslagen. Deze client-\n * component zit binnen de provider en heeft dus de volledige registry.\n *\n * `blockData` (5.6, optioneel): server-gefetchte startdata per domein (bv. `{ shop: … }` uit\n * `getShopPageData`). Data-blokken renderen dan direct met inhoud (SSR/ISR) i.p.v. eerst\n * client-side te fetchen. Moet serialiseerbare plain data zijn (server → client-prop).\n */\nexport function PublishedPage({\n page,\n siteId,\n mode = \"view\",\n blockData,\n}: {\n page: Pick<Page, \"blocks\">;\n siteId: string;\n mode?: \"view\" | \"preview\";\n blockData?: Record<string, unknown>;\n}) {\n const registry = useRegistry();\n const config = useSiteConfig();\n const { draftBlocks, editPath, fotoVervanger, publishedOverride } = useEditor();\n\n /**\n * In een DEMO is deze pagina zijn eigen uitgangspunt.\n *\n * De demo-bewerkmodus bewaart wijzigingen in de browser en legt die over een \"seed\": de\n * oorspronkelijke pagina waar de bezoeker op verder bewerkt. Zonder geregistreerde seed geeft\n * `resolveDemoPage` niets terug, meldt de editor \"Nog geen werkversie\", en loopt de enige knop\n * die dan overblijft (\"+ Pagina aanmaken\") tegen de échte database aan.\n *\n * Dat overkwam elke demo-site behalve xicms.nl zelf, want daar stond de registratie met de hand\n * in een eigen catch-all route. Een klantsite heeft die route niet en had dus wél een\n * demo-bewerkmodus in de balk, maar geen enkele pagina om te bewerken — op sites die bestaan om\n * te laten zien hoe prettig het bewerken werkt.\n *\n * Hier hoort het thuis: dit component wéét welke pagina er op dit pad staat. Buiten de demo doet\n * het niets, en in de demo is de seed per definitie gelijk aan wat de bezoeker ziet.\n */\n useEffect(() => {\n if (!isDemoActive()) return;\n const pad = huidigPad(window.location.pathname);\n // Titel en slug horen erbij: de editor toont ze in zijn balk en in de pagina-instellingen.\n // `page` levert in de praktijk het hele pagina-object; deze twee zijn de terugval voor een site\n // die alleen blokken doorgeeft — het type belooft immers niet meer dan `blocks`.\n const volledig = page as Partial<Page> & Pick<Page, \"blocks\">;\n registerSeed(siteId, pad, {\n ...volledig,\n title: volledig.title || document.title,\n slug: volledig.slug || (pad.split(\"/\").filter(Boolean).pop() ?? \"\"),\n path: pad,\n } as Page);\n // Alleen op het pad en de inhoud: opnieuw registreren bij elke render zou de seed tijdens het\n // bewerken vervangen door de zojuist bewerkte tekst, en dan is er geen origineel meer om op\n // terug te vallen.\n }, [siteId, page]);\n\n /**\n * Staat de editor open op DEZE pagina, dan tonen we de werkversie in plaats van het\n * gepubliceerde. Zo blijft de site zijn eigen layout en huisstijl tekenen, en is wat je ziet\n * precies wat je bewerkt — in plaats van een nabootsing in een apart editorvenster.\n *\n * De padvergelijking is niet overdreven voorzichtig: een pagina kan meerdere gerenderde pagina's\n * in beeld hebben (een preview, een ingekaderde pagina). Zonder die controle zou de werkversie\n * van de ene pagina in de andere opduiken.\n */\n /**\n * `editPath` is het CANONIEKE pad — zonder taalprefix, want zo houdt de editor zijn werkversie\n * bij. De URL-balk heeft die prefix wél (`/de/over-ons`). Vergeleken zonder die prefix eraf te\n * halen was de werkversie op elke vertaalde pagina onzichtbaar: de editor stond open, je typte,\n * en de pagina bleef stug het gepubliceerde tonen. Eéntalige sites merkten hier niets van —\n * precies waarom dit zo lang kon blijven staan.\n */\n const huidigCanoniekPad =\n typeof window !== \"undefined\"\n ? (() => {\n const { slugs } = parseLocaleSlugs(\n window.location.pathname.split(\"/\").filter(Boolean),\n siteLocales(config),\n );\n return huidigPad(\"/\" + slugs.join(\"/\"));\n })()\n : null;\n\n const opDezePagina = draftBlocks !== null && huidigCanoniekPad !== null && huidigCanoniekPad === editPath;\n\n /**\n * Net gepubliceerd, maar de bewerkmodus staat uit (of nog niet aan) op DEZE pagina: dan valt\n * `page` terug op de server-props van de eerste keer laden, en die zijn niet ververst — \"Live\n * site\" bekijken vlak na publiceren toonde daardoor nog de OUDE tekst totdat je de pagina zelf\n * herlaadde. `publishedOverride` (gezet door de editor direct na `publishPage`) vangt precies\n * dit gat op, zonder dat elke publicatie een volledige page-refetch hoeft te triggeren.\n */\n const overrideVoorDezePagina =\n !opDezePagina && publishedOverride !== null && huidigCanoniekPad !== null && huidigCanoniekPad === publishedOverride.path\n ? publishedOverride.blocks\n : null;\n\n const teTonen = opDezePagina\n ? { ...page, blocks: draftBlocks }\n : overrideVoorDezePagina\n ? { ...page, blocks: overrideVoorDezePagina }\n : page;\n\n return (\n <BlockDataProvider data={blockData}>\n {/* Alleen op de pagina die de editor open heeft: anders krijgt een preview of ingekaderde\n pagina óók 📷-knopjes, terwijl een klik daar in het verkeerde draft zou landen. */}\n <InlineImageEditProvider onReplace={opDezePagina ? fotoVervanger : null}>\n <PageRenderer page={teTonen} registry={registry} siteId={siteId} mode={mode} />\n </InlineImageEditProvider>\n </BlockDataProvider>\n );\n}\n\n/** Normaliseert een pad zoals de editor het bijhoudt: geen trailing slash, root blijft \"/\". */\nfunction huidigPad(p: string): string {\n const schoon = p.replace(/\\/+$/, \"\");\n return schoon === \"\" ? \"/\" : schoon;\n}\n"],"mappings":";AA4HQ;AA1HR,SAAS,iBAAiB;AAC1B,SAAS,oBAAoB;AAC7B,SAAS,aAAa,yBAAyB;AAC/C,SAAS,iBAAiB;AAC1B,SAAS,cAAc,oBAAoB;AAC3C,SAAS,+BAA+B;AACxC,SAAS,qBAAqB;AAC9B,SAAS,kBAAkB,mBAAmB;AAcvC,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AACF,GAKG;AACD,QAAM,WAAW,YAAY;AAC7B,QAAM,SAAS,cAAc;AAC7B,QAAM,EAAE,aAAa,UAAU,eAAe,kBAAkB,IAAI,UAAU;AAkB9E,YAAU,MAAM;AACd,QAAI,CAAC,aAAa,EAAG;AACrB,UAAM,MAAM,UAAU,OAAO,SAAS,QAAQ;AAI9C,UAAM,WAAW;AACjB,iBAAa,QAAQ,KAAK;AAAA,MACxB,GAAG;AAAA,MACH,OAAO,SAAS,SAAS,SAAS;AAAA,MAClC,MAAM,SAAS,SAAS,IAAI,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,IAAI,KAAK;AAAA,MAChE,MAAM;AAAA,IACR,CAAS;AAAA,EAIX,GAAG,CAAC,QAAQ,IAAI,CAAC;AAkBjB,QAAM,oBACJ,OAAO,WAAW,eACb,MAAM;AACL,UAAM,EAAE,MAAM,IAAI;AAAA,MAChB,OAAO,SAAS,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,MAClD,YAAY,MAAM;AAAA,IACpB;AACA,WAAO,UAAU,MAAM,MAAM,KAAK,GAAG,CAAC;AAAA,EACxC,GAAG,IACH;AAEN,QAAM,eAAe,gBAAgB,QAAQ,sBAAsB,QAAQ,sBAAsB;AASjG,QAAM,yBACJ,CAAC,gBAAgB,sBAAsB,QAAQ,sBAAsB,QAAQ,sBAAsB,kBAAkB,OACjH,kBAAkB,SAClB;AAEN,QAAM,UAAU,eACZ,EAAE,GAAG,MAAM,QAAQ,YAAY,IAC/B,yBACE,EAAE,GAAG,MAAM,QAAQ,uBAAuB,IAC1C;AAEN,SACE,oBAAC,qBAAkB,MAAM,WAGvB,8BAAC,2BAAwB,WAAW,eAAe,gBAAgB,MACjE,8BAAC,gBAAa,MAAM,SAAS,UAAoB,QAAgB,MAAY,GAC/E,GACF;AAEJ;AAGA,SAAS,UAAU,GAAmB;AACpC,QAAM,SAAS,EAAE,QAAQ,QAAQ,EAAE;AACnC,SAAO,WAAW,KAAK,MAAM;AAC/B;","names":[]}
1
+ {"version":3,"sources":["../../src/render/PublishedPage.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { useEffect, type ComponentType, type ReactNode } from \"react\";\nimport { PageRenderer } from \"./PageRenderer\";\nimport { useRegistry, BlockDataProvider } from \"../blocks/context\";\nimport { useEditor } from \"../editor/EditorProvider\";\nimport { isDemoActive, registerSeed } from \"../demo/demoStore\";\nimport { InlineImageEditProvider } from \"../media/ImageContext\";\nimport { useSiteConfig } from \"../config\";\nimport { parseLocaleSlugs, siteLocales } from \"../i18n/overlay\";\nimport type { Page } from \"../schema/pages\";\n\n/**\n * Rendert een (gepubliceerde) pagina via de **context-registry** (module-resolved, opgebouwd in\n * XiCMSProvider). Gebruik dit i.p.v. zelf `createRegistry([...builtinBlocks])` server-side te bouwen:\n * sinds de blokken op Astryx draaien zijn de meeste `\"use client\"`, en een server-opgebouwde registry\n * krijgt daar alleen opake client-referenties van → die blokken worden stil overgeslagen. Deze client-\n * component zit binnen de provider en heeft dus de volledige registry.\n *\n * `blockData` (5.6, optioneel): server-gefetchte startdata per domein (bv. `{ shop: … }` uit\n * `getShopPageData`). Data-blokken renderen dan direct met inhoud (SSR/ISR) i.p.v. eerst\n * client-side te fetchen. Moet serialiseerbare plain data zijn (server → client-prop).\n */\nexport function PublishedPage({\n page,\n siteId,\n mode = \"view\",\n blockData,\n}: {\n page: Pick<Page, \"blocks\">;\n siteId: string;\n mode?: \"view\" | \"preview\";\n blockData?: Record<string, unknown>;\n}) {\n const registry = useRegistry();\n const config = useSiteConfig();\n const { draftBlocks, editPath, fotoVervanger, publishedOverride } = useEditor();\n\n /**\n * In een DEMO is deze pagina zijn eigen uitgangspunt.\n *\n * De demo-bewerkmodus bewaart wijzigingen in de browser en legt die over een \"seed\": de\n * oorspronkelijke pagina waar de bezoeker op verder bewerkt. Zonder geregistreerde seed geeft\n * `resolveDemoPage` niets terug, meldt de editor \"Nog geen werkversie\", en loopt de enige knop\n * die dan overblijft (\"+ Pagina aanmaken\") tegen de échte database aan.\n *\n * Dat overkwam elke demo-site behalve xicms.nl zelf, want daar stond de registratie met de hand\n * in een eigen catch-all route. Een klantsite heeft die route niet en had dus wél een\n * demo-bewerkmodus in de balk, maar geen enkele pagina om te bewerken — op sites die bestaan om\n * te laten zien hoe prettig het bewerken werkt.\n *\n * Hier hoort het thuis: dit component wéét welke pagina er op dit pad staat. Buiten de demo doet\n * het niets, en in de demo is de seed per definitie gelijk aan wat de bezoeker ziet.\n */\n useEffect(() => {\n // 8.2: óók op de config kijken. `XiCMSProvider` zet de demo-vlag in zijn eigen effect, en\n // effecten van kinderen draaien vóór die van hun ouder — bij de eerste render was\n // isDemoActive() hier dus nog false, werd er geen seed geregistreerd, en meldde de editor op\n // de demosite \"Nog geen werkversie\" (groenhof, oktober 2026).\n if (!config.demoEditing && !isDemoActive()) return;\n const pad = huidigPad(window.location.pathname);\n // Titel en slug horen erbij: de editor toont ze in zijn balk en in de pagina-instellingen.\n // `page` levert in de praktijk het hele pagina-object; deze twee zijn de terugval voor een site\n // die alleen blokken doorgeeft — het type belooft immers niet meer dan `blocks`.\n const volledig = page as Partial<Page> & Pick<Page, \"blocks\">;\n registerSeed(siteId, pad, {\n ...volledig,\n title: volledig.title || document.title,\n slug: volledig.slug || (pad.split(\"/\").filter(Boolean).pop() ?? \"\"),\n path: pad,\n } as Page);\n // Alleen op het pad en de inhoud: opnieuw registreren bij elke render zou de seed tijdens het\n // bewerken vervangen door de zojuist bewerkte tekst, en dan is er geen origineel meer om op\n // terug te vallen.\n }, [siteId, page, config.demoEditing]);\n\n /**\n * Staat de editor open op DEZE pagina, dan tonen we de werkversie in plaats van het\n * gepubliceerde. Zo blijft de site zijn eigen layout en huisstijl tekenen, en is wat je ziet\n * precies wat je bewerkt — in plaats van een nabootsing in een apart editorvenster.\n *\n * De padvergelijking is niet overdreven voorzichtig: een pagina kan meerdere gerenderde pagina's\n * in beeld hebben (een preview, een ingekaderde pagina). Zonder die controle zou de werkversie\n * van de ene pagina in de andere opduiken.\n */\n /**\n * `editPath` is het CANONIEKE pad — zonder taalprefix, want zo houdt de editor zijn werkversie\n * bij. De URL-balk heeft die prefix wél (`/de/over-ons`). Vergeleken zonder die prefix eraf te\n * halen was de werkversie op elke vertaalde pagina onzichtbaar: de editor stond open, je typte,\n * en de pagina bleef stug het gepubliceerde tonen. Eéntalige sites merkten hier niets van —\n * precies waarom dit zo lang kon blijven staan.\n */\n const huidigCanoniekPad =\n typeof window !== \"undefined\"\n ? (() => {\n const { slugs } = parseLocaleSlugs(\n window.location.pathname.split(\"/\").filter(Boolean),\n siteLocales(config),\n );\n return huidigPad(\"/\" + slugs.join(\"/\"));\n })()\n : null;\n\n const opDezePagina = draftBlocks !== null && huidigCanoniekPad !== null && huidigCanoniekPad === editPath;\n\n /**\n * Net gepubliceerd, maar de bewerkmodus staat uit (of nog niet aan) op DEZE pagina: dan valt\n * `page` terug op de server-props van de eerste keer laden, en die zijn niet ververst — \"Live\n * site\" bekijken vlak na publiceren toonde daardoor nog de OUDE tekst totdat je de pagina zelf\n * herlaadde. `publishedOverride` (gezet door de editor direct na `publishPage`) vangt precies\n * dit gat op, zonder dat elke publicatie een volledige page-refetch hoeft te triggeren.\n */\n const overrideVoorDezePagina =\n !opDezePagina && publishedOverride !== null && huidigCanoniekPad !== null && huidigCanoniekPad === publishedOverride.path\n ? publishedOverride.blocks\n : null;\n\n const teTonen = opDezePagina\n ? { ...page, blocks: draftBlocks }\n : overrideVoorDezePagina\n ? { ...page, blocks: overrideVoorDezePagina }\n : page;\n\n const inhoud = (\n <BlockDataProvider data={blockData}>\n {/* Alleen op de pagina die de editor open heeft: anders krijgt een preview of ingekaderde\n pagina óók 📷-knopjes, terwijl een klik daar in het verkeerde draft zou landen. */}\n <InlineImageEditProvider onReplace={opDezePagina ? fotoVervanger : null}>\n {/* 8.11: tijdens het bewerken op déze pagina is het een werkversie — \"preview\". Blokken\n gebruiken dat contract al (geen formulier versturen, geen autoplay, lege blokken en\n knoppen zichtbaar houden, WhatsApp-knop niet zwevend), maar sinds het bewerken op de\n live pagina gebeurt in plaats van in een apart canvas, kregen ze het nooit meer door. */}\n <PageRenderer page={teTonen} registry={registry} siteId={siteId} mode={opDezePagina ? \"preview\" : mode} />\n </InlineImageEditProvider>\n </BlockDataProvider>\n );\n // 8.8: pagina-overgang (opt-in). Next-navigaties zijn transitions, dus dit animeert vanzelf\n // bij het wisselen van pagina; niet in de editor of preview.\n const overgang = config.paginaOvergang;\n if (!overgang || mode !== \"view\" || opDezePagina) return inhoud;\n const klasse = `xicms-${overgang}`;\n return (\n <ViewTransition enter={klasse} exit={klasse} default=\"none\">\n {inhoud}\n </ViewTransition>\n );\n}\n\n/**\n * React `<ViewTransition>` (8.8) zit in de React-canary die Next in de App Router meelevert, niet in\n * de stabiele React van tests of andere omgevingen. Daar valt hij terug op een gewone wrapper.\n */\ntype VTProps = { enter?: string; exit?: string; default?: string; children?: ReactNode };\nconst ViewTransition: ComponentType<VTProps> =\n (React as unknown as { ViewTransition?: ComponentType<VTProps> }).ViewTransition ?? (({ children }: VTProps) => <>{children}</>);\n\n/** Normaliseert een pad zoals de editor het bijhoudt: geen trailing slash, root blijft \"/\". */\nfunction huidigPad(p: string): string {\n const schoon = p.replace(/\\/+$/, \"\");\n return schoon === \"\" ? \"/\" : schoon;\n}\n"],"mappings":";AAqIQ,SAsB0G,UAtB1G;AAnIR,YAAY,WAAW;AACvB,SAAS,iBAAqD;AAC9D,SAAS,oBAAoB;AAC7B,SAAS,aAAa,yBAAyB;AAC/C,SAAS,iBAAiB;AAC1B,SAAS,cAAc,oBAAoB;AAC3C,SAAS,+BAA+B;AACxC,SAAS,qBAAqB;AAC9B,SAAS,kBAAkB,mBAAmB;AAcvC,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AACF,GAKG;AACD,QAAM,WAAW,YAAY;AAC7B,QAAM,SAAS,cAAc;AAC7B,QAAM,EAAE,aAAa,UAAU,eAAe,kBAAkB,IAAI,UAAU;AAkB9E,YAAU,MAAM;AAKd,QAAI,CAAC,OAAO,eAAe,CAAC,aAAa,EAAG;AAC5C,UAAM,MAAM,UAAU,OAAO,SAAS,QAAQ;AAI9C,UAAM,WAAW;AACjB,iBAAa,QAAQ,KAAK;AAAA,MACxB,GAAG;AAAA,MACH,OAAO,SAAS,SAAS,SAAS;AAAA,MAClC,MAAM,SAAS,SAAS,IAAI,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,IAAI,KAAK;AAAA,MAChE,MAAM;AAAA,IACR,CAAS;AAAA,EAIX,GAAG,CAAC,QAAQ,MAAM,OAAO,WAAW,CAAC;AAkBrC,QAAM,oBACJ,OAAO,WAAW,eACb,MAAM;AACL,UAAM,EAAE,MAAM,IAAI;AAAA,MAChB,OAAO,SAAS,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,MAClD,YAAY,MAAM;AAAA,IACpB;AACA,WAAO,UAAU,MAAM,MAAM,KAAK,GAAG,CAAC;AAAA,EACxC,GAAG,IACH;AAEN,QAAM,eAAe,gBAAgB,QAAQ,sBAAsB,QAAQ,sBAAsB;AASjG,QAAM,yBACJ,CAAC,gBAAgB,sBAAsB,QAAQ,sBAAsB,QAAQ,sBAAsB,kBAAkB,OACjH,kBAAkB,SAClB;AAEN,QAAM,UAAU,eACZ,EAAE,GAAG,MAAM,QAAQ,YAAY,IAC/B,yBACE,EAAE,GAAG,MAAM,QAAQ,uBAAuB,IAC1C;AAEN,QAAM,SACJ,oBAAC,qBAAkB,MAAM,WAGvB,8BAAC,2BAAwB,WAAW,eAAe,gBAAgB,MAKjE,8BAAC,gBAAa,MAAM,SAAS,UAAoB,QAAgB,MAAM,eAAe,YAAY,MAAM,GAC1G,GACF;AAIF,QAAM,WAAW,OAAO;AACxB,MAAI,CAAC,YAAY,SAAS,UAAU,aAAc,QAAO;AACzD,QAAM,SAAS,SAAS,QAAQ;AAChC,SACE,oBAAC,kBAAe,OAAO,QAAQ,MAAM,QAAQ,SAAQ,QAClD,kBACH;AAEJ;AAOA,MAAM,iBACH,MAAiE,mBAAmB,CAAC,EAAE,SAAS,MAAe,gCAAG,UAAS;AAG9H,SAAS,UAAU,GAAmB;AACpC,QAAM,SAAS,EAAE,QAAQ,QAAQ,EAAE;AACnC,SAAO,WAAW,KAAK,MAAM;AAC/B;","names":[]}