@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,16 +1,19 @@
1
1
  "use client";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  import { Switch as AstryxSwitch } from "@astryxdesign/core/Switch";
4
+ import { useFieldLabel } from "./primitives.js";
4
5
  function Switch({
5
6
  checked,
6
7
  onCheckedChange,
7
- label
8
+ label,
9
+ labelVerborgen
8
10
  }) {
11
+ const veldLabel = useFieldLabel("Aan/uit");
9
12
  return /* @__PURE__ */ jsx(
10
13
  AstryxSwitch,
11
14
  {
12
- label: label ?? "Schakelaar",
13
- isLabelHidden: !label,
15
+ label: label ?? veldLabel,
16
+ isLabelHidden: !label || labelVerborgen,
14
17
  value: checked,
15
18
  onChange: (c) => onCheckedChange(c)
16
19
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/admin/ui/switch.tsx"],"sourcesContent":["\"use client\";\n\nimport { Switch as AstryxSwitch } from \"@astryxdesign/core/Switch\";\n\n/** Admin-switch op de Astryx Switch. API ongewijzigd (checked/onCheckedChange/label). */\nexport function Switch({\n checked,\n onCheckedChange,\n label,\n}: {\n checked: boolean;\n onCheckedChange: (v: boolean) => void;\n label?: string;\n}) {\n return (\n <AstryxSwitch\n label={label ?? \"Schakelaar\"}\n isLabelHidden={!label}\n value={checked}\n onChange={(c) => onCheckedChange(c)}\n />\n );\n}\n"],"mappings":";AAeI;AAbJ,SAAS,UAAU,oBAAoB;AAGhC,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,SAAS;AAAA,MAChB,eAAe,CAAC;AAAA,MAChB,OAAO;AAAA,MACP,UAAU,CAAC,MAAM,gBAAgB,CAAC;AAAA;AAAA,EACpC;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/admin/ui/switch.tsx"],"sourcesContent":["\"use client\";\n\nimport { Switch as AstryxSwitch } from \"@astryxdesign/core/Switch\";\nimport { useFieldLabel } from \"./primitives\";\n\n/** Admin-switch op de Astryx Switch. API ongewijzigd (checked/onCheckedChange/label). */\nexport function Switch({\n checked,\n onCheckedChange,\n label,\n labelVerborgen,\n}: {\n checked: boolean;\n onCheckedChange: (v: boolean) => void;\n label?: string;\n /** Label alleen voor schermlezers (bv. in een tabel waar de kolomkop het al zegt). */\n labelVerborgen?: boolean;\n}) {\n const veldLabel = useFieldLabel(\"Aan/uit\");\n return (\n <AstryxSwitch\n label={label ?? veldLabel}\n isLabelHidden={!label || labelVerborgen}\n value={checked}\n onChange={(c) => onCheckedChange(c)}\n />\n );\n}\n"],"mappings":";AAoBI;AAlBJ,SAAS,UAAU,oBAAoB;AACvC,SAAS,qBAAqB;AAGvB,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,YAAY,cAAc,SAAS;AACzC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,SAAS;AAAA,MAChB,eAAe,CAAC,SAAS;AAAA,MACzB,OAAO;AAAA,MACP,UAAU,CAAC,MAAM,gBAAgB,CAAC;AAAA;AAAA,EACpC;AAEJ;","names":[]}
@@ -16,8 +16,9 @@ interface ToastApi {
16
16
  * `toast({title, description, tone})` blijft, zodat de editors ongewijzigd blijven. Fouten blijven
17
17
  * staan tot de gebruiker ze sluit (auto-hide uit); overige verdwijnen vanzelf.
18
18
  */
19
- export declare function ToastProvider({ children }: {
19
+ export declare function ToastProvider({ children, positie }: {
20
20
  children: ReactNode;
21
+ positie?: "bottomEnd" | "topEnd";
21
22
  }): import("react").JSX.Element;
22
23
  /**
23
24
  * `toast` MOET stabiel zijn over renders heen.
@@ -2,24 +2,30 @@
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useCallback, useMemo, useRef } from "react";
4
4
  import { useToast as useAstryxToast, ToastViewport } from "@astryxdesign/core/Toast";
5
- function ToastProvider({ children }) {
6
- return /* @__PURE__ */ jsx(ToastViewport, { position: "bottomEnd", maxVisible: 4, children });
5
+ import { Icon } from "./Icon.js";
6
+ import { foutNaarMens } from "../lib/foutNaarMens.js";
7
+ function ToastProvider({ children, positie = "bottomEnd" }) {
8
+ return /* @__PURE__ */ jsx(ToastViewport, { position: positie, maxVisible: 4, children });
7
9
  }
8
10
  function useToast() {
9
11
  const show = useAstryxToast();
10
12
  const showRef = useRef(show);
11
13
  showRef.current = show;
12
14
  const toast = useCallback(({ title, description, tone = "default", action }) => {
15
+ const uitleg = tone === "error" ? foutNaarMens(description) : description;
13
16
  showRef.current({
14
- body: /* @__PURE__ */ jsxs("span", { children: [
15
- /* @__PURE__ */ jsx("strong", { children: title }),
16
- description ? /* @__PURE__ */ jsx("span", { style: { display: "block", opacity: 0.8 }, children: description }) : null,
17
- action ? (
18
- // Eén optionele vervolg-actie in de melding zelf ("Bekijk als bezoeker →"): de melding
19
- // is precies het moment waarop die vraag leeft, en een knop sluit de mentale lus die
20
- // een instructie in prozavorm open laat staan.
21
- /* @__PURE__ */ jsx("button", { type: "button", className: "xicms-toast__actie", onClick: action.onClick, children: action.label })
22
- ) : null
17
+ body: /* @__PURE__ */ jsxs("span", { style: { display: "flex", gap: "0.6rem", alignItems: "flex-start" }, children: [
18
+ tone === "success" ? /* @__PURE__ */ jsx("span", { "aria-hidden": true, style: { color: "#16a34a", marginTop: 2 }, children: /* @__PURE__ */ jsx(Icon, { naam: "vink", grootte: 18 }) }) : null,
19
+ /* @__PURE__ */ jsxs("span", { children: [
20
+ /* @__PURE__ */ jsx("strong", { children: title }),
21
+ uitleg ? /* @__PURE__ */ jsx("span", { style: { display: "block", opacity: 0.8 }, children: uitleg }) : null,
22
+ action ? (
23
+ // Eén optionele vervolg-actie in de melding zelf ("Bekijk als bezoeker →"): de melding
24
+ // is precies het moment waarop die vraag leeft, en een knop sluit de mentale lus die
25
+ // een instructie in prozavorm open laat staan.
26
+ /* @__PURE__ */ jsx("button", { type: "button", className: "xicms-toast__actie", onClick: action.onClick, children: action.label })
27
+ ) : null
28
+ ] })
23
29
  ] }),
24
30
  type: tone === "error" ? "error" : "info",
25
31
  isAutoHide: tone !== "error" && !action
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/admin/ui/toast.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useMemo, useRef, type ReactNode } from \"react\";\nimport { useToast as useAstryxToast, ToastViewport } from \"@astryxdesign/core/Toast\";\n\ntype ToastTone = \"default\" | \"success\" | \"error\";\ninterface ToastApi {\n toast: (t: { title: string; description?: string; tone?: ToastTone; action?: { label: string; onClick: () => void } }) => void;\n}\n\n/**\n * Admin-toasts op de **Astryx Toast** (ToastViewport + useToast). De bestaande API\n * `toast({title, description, tone})` blijft, zodat de editors ongewijzigd blijven. Fouten blijven\n * staan tot de gebruiker ze sluit (auto-hide uit); overige verdwijnen vanzelf.\n */\nexport function ToastProvider({ children }: { children: ReactNode }) {\n return (\n <ToastViewport position=\"bottomEnd\" maxVisible={4}>\n {children}\n </ToastViewport>\n );\n}\n\n/**\n * `toast` MOET stabiel zijn over renders heen.\n *\n * Dit gaf `{ toast: (t) => … }` terug — een nieuw object met een nieuwe functie bij ELKE render.\n * Op zichzelf onschuldig, tot je bedenkt dat drie effecten in het beheer `toast` in hun\n * afhankelijkheden hebben (de mediakiezer, de mediabeheerder en de visuele editor). Zo'n effect\n * draait dan bij elke render opnieuw, zet state, en die state veroorzaakt weer een render:\n * \"Maximum update depth exceeded\", en een pagina die niet meer laadt.\n *\n * Dat maakte de visuele editor onbruikbaar op élke pagina mét werkversie — daar hangt de\n * mediakiezer in de boom. Op een pagina zónder werkversie kwam de editor nooit zo ver, en precies\n * daarom kon dit lang onopgemerkt blijven: wie het probeerde op een lege pagina zag niets bijzonders.\n *\n * `show` komt uit Astryx en biedt geen garantie over zijn eigen stabiliteit; daarom via een ref, en\n * niet als afhankelijkheid. Anders verplaatsen we het probleem alleen maar één laag.\n */\nexport function useToast(): ToastApi {\n const show = useAstryxToast();\n const showRef = useRef(show);\n showRef.current = show;\n\n const toast = useCallback<ToastApi[\"toast\"]>(({ title, description, tone = \"default\", action }) => {\n showRef.current({\n body: (\n <span>\n <strong>{title}</strong>\n {description ? <span style={{ display: \"block\", opacity: 0.8 }}>{description}</span> : null}\n {action ? (\n // Eén optionele vervolg-actie in de melding zelf (\"Bekijk als bezoeker →\"): de melding\n // is precies het moment waarop die vraag leeft, en een knop sluit de mentale lus die\n // een instructie in prozavorm open laat staan.\n <button type=\"button\" className=\"xicms-toast__actie\" onClick={action.onClick}>\n {action.label}\n </button>\n ) : null}\n </span>\n ),\n type: tone === \"error\" ? \"error\" : \"info\",\n isAutoHide: tone !== \"error\" && !action,\n });\n }, []);\n\n return useMemo(() => ({ toast }), [toast]);\n}\n"],"mappings":";AAiBI,cA8BI,YA9BJ;AAfJ,SAAS,aAAa,SAAS,cAA8B;AAC7D,SAAS,YAAY,gBAAgB,qBAAqB;AAYnD,SAAS,cAAc,EAAE,SAAS,GAA4B;AACnE,SACE,oBAAC,iBAAc,UAAS,aAAY,YAAY,GAC7C,UACH;AAEJ;AAkBO,SAAS,WAAqB;AACnC,QAAM,OAAO,eAAe;AAC5B,QAAM,UAAU,OAAO,IAAI;AAC3B,UAAQ,UAAU;AAElB,QAAM,QAAQ,YAA+B,CAAC,EAAE,OAAO,aAAa,OAAO,WAAW,OAAO,MAAM;AACjG,YAAQ,QAAQ;AAAA,MACd,MACE,qBAAC,UACC;AAAA,4BAAC,YAAQ,iBAAM;AAAA,QACd,cAAc,oBAAC,UAAK,OAAO,EAAE,SAAS,SAAS,SAAS,IAAI,GAAI,uBAAY,IAAU;AAAA,QACtF;AAAA;AAAA;AAAA;AAAA,UAIC,oBAAC,YAAO,MAAK,UAAS,WAAU,sBAAqB,SAAS,OAAO,SAClE,iBAAO,OACV;AAAA,YACE;AAAA,SACN;AAAA,MAEF,MAAM,SAAS,UAAU,UAAU;AAAA,MACnC,YAAY,SAAS,WAAW,CAAC;AAAA,IACnC,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,SAAO,QAAQ,OAAO,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC;AAC3C;","names":[]}
1
+ {"version":3,"sources":["../../../src/admin/ui/toast.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useMemo, useRef, type ReactNode } from \"react\";\nimport { useToast as useAstryxToast, ToastViewport } from \"@astryxdesign/core/Toast\";\nimport { Icon } from \"./Icon\";\nimport { foutNaarMens } from \"../lib/foutNaarMens\";\n\ntype ToastTone = \"default\" | \"success\" | \"error\";\ninterface ToastApi {\n toast: (t: { title: string; description?: string; tone?: ToastTone; action?: { label: string; onClick: () => void } }) => void;\n}\n\n/**\n * Admin-toasts op de **Astryx Toast** (ToastViewport + useToast). De bestaande API\n * `toast({title, description, tone})` blijft, zodat de editors ongewijzigd blijven. Fouten blijven\n * staan tot de gebruiker ze sluit (auto-hide uit); overige verdwijnen vanzelf.\n */\nexport function ToastProvider({ children, positie = \"bottomEnd\" }: { children: ReactNode; positie?: \"bottomEnd\" | \"topEnd\" }) {\n return (\n <ToastViewport position={positie} maxVisible={4}>\n {children}\n </ToastViewport>\n );\n}\n\n/**\n * `toast` MOET stabiel zijn over renders heen.\n *\n * Dit gaf `{ toast: (t) => … }` terug — een nieuw object met een nieuwe functie bij ELKE render.\n * Op zichzelf onschuldig, tot je bedenkt dat drie effecten in het beheer `toast` in hun\n * afhankelijkheden hebben (de mediakiezer, de mediabeheerder en de visuele editor). Zo'n effect\n * draait dan bij elke render opnieuw, zet state, en die state veroorzaakt weer een render:\n * \"Maximum update depth exceeded\", en een pagina die niet meer laadt.\n *\n * Dat maakte de visuele editor onbruikbaar op élke pagina mét werkversie — daar hangt de\n * mediakiezer in de boom. Op een pagina zónder werkversie kwam de editor nooit zo ver, en precies\n * daarom kon dit lang onopgemerkt blijven: wie het probeerde op een lege pagina zag niets bijzonders.\n *\n * `show` komt uit Astryx en biedt geen garantie over zijn eigen stabiliteit; daarom via een ref, en\n * niet als afhankelijkheid. Anders verplaatsen we het probleem alleen maar één laag.\n */\nexport function useToast(): ToastApi {\n const show = useAstryxToast();\n const showRef = useRef(show);\n showRef.current = show;\n\n const toast = useCallback<ToastApi[\"toast\"]>(({ title, description, tone = \"default\", action }) => {\n // 8.12: technische (Firebase-)fouten in gewone woorden, op één plek voor het hele beheer.\n const uitleg = tone === \"error\" ? foutNaarMens(description) : description;\n showRef.current({\n body: (\n <span style={{ display: \"flex\", gap: \"0.6rem\", alignItems: \"flex-start\" }}>\n {/* Astryx kent alleen info/error; een geslaagde actie krijgt zijn eigen groene vinkje. */}\n {tone === \"success\" ? (\n <span aria-hidden style={{ color: \"#16a34a\", marginTop: 2 }}><Icon naam=\"vink\" grootte={18} /></span>\n ) : null}\n <span>\n <strong>{title}</strong>\n {uitleg ? <span style={{ display: \"block\", opacity: 0.8 }}>{uitleg}</span> : null}\n {action ? (\n // Eén optionele vervolg-actie in de melding zelf (\"Bekijk als bezoeker →\"): de melding\n // is precies het moment waarop die vraag leeft, en een knop sluit de mentale lus die\n // een instructie in prozavorm open laat staan.\n <button type=\"button\" className=\"xicms-toast__actie\" onClick={action.onClick}>\n {action.label}\n </button>\n ) : null}\n </span>\n </span>\n ),\n type: tone === \"error\" ? \"error\" : \"info\",\n isAutoHide: tone !== \"error\" && !action,\n });\n }, []);\n\n return useMemo(() => ({ toast }), [toast]);\n}\n"],"mappings":";AAmBI,cAqCM,YArCN;AAjBJ,SAAS,aAAa,SAAS,cAA8B;AAC7D,SAAS,YAAY,gBAAgB,qBAAqB;AAC1D,SAAS,YAAY;AACrB,SAAS,oBAAoB;AAYtB,SAAS,cAAc,EAAE,UAAU,UAAU,YAAY,GAA8D;AAC5H,SACE,oBAAC,iBAAc,UAAU,SAAS,YAAY,GAC3C,UACH;AAEJ;AAkBO,SAAS,WAAqB;AACnC,QAAM,OAAO,eAAe;AAC5B,QAAM,UAAU,OAAO,IAAI;AAC3B,UAAQ,UAAU;AAElB,QAAM,QAAQ,YAA+B,CAAC,EAAE,OAAO,aAAa,OAAO,WAAW,OAAO,MAAM;AAEjG,UAAM,SAAS,SAAS,UAAU,aAAa,WAAW,IAAI;AAC9D,YAAQ,QAAQ;AAAA,MACd,MACE,qBAAC,UAAK,OAAO,EAAE,SAAS,QAAQ,KAAK,UAAU,YAAY,aAAa,GAErE;AAAA,iBAAS,YACR,oBAAC,UAAK,eAAW,MAAC,OAAO,EAAE,OAAO,WAAW,WAAW,EAAE,GAAG,8BAAC,QAAK,MAAK,QAAO,SAAS,IAAI,GAAE,IAC5F;AAAA,QACJ,qBAAC,UACD;AAAA,8BAAC,YAAQ,iBAAM;AAAA,UACd,SAAS,oBAAC,UAAK,OAAO,EAAE,SAAS,SAAS,SAAS,IAAI,GAAI,kBAAO,IAAU;AAAA,UAC5E;AAAA;AAAA;AAAA;AAAA,YAIC,oBAAC,YAAO,MAAK,UAAS,WAAU,sBAAqB,SAAS,OAAO,SAClE,iBAAO,OACV;AAAA,cACE;AAAA,WACJ;AAAA,SACF;AAAA,MAEF,MAAM,SAAS,UAAU,UAAU;AAAA,MACnC,YAAY,SAAS,WAAW,CAAC;AAAA,IACnC,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,SAAO,QAAQ,OAAO,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC;AAC3C;","names":[]}
@@ -0,0 +1,34 @@
1
+ import { type Pattern } from "../../patterns/index.js";
2
+ /**
3
+ * De blokkiezer (8.11): wat wil je hier toevoegen?
4
+ *
5
+ * Verving een platte keuzelijst van zo'n zestig namen. Nu: een zoekveld, groepen ("Over je bedrijf",
6
+ * "Contact en afspraken"), per blok één zin uitleg, en een tweede tabblad met kant-en-klare secties
7
+ * (de patronen) — die zaten achter een aparte knop in de zijbalk. Opent vanaf de "+" tussen twee
8
+ * blokken op de pagina én vanuit de zijbalk.
9
+ */
10
+ export declare function BlokKiezer({ open, onOpenChange, onBlok, onSectie, patterns, }: {
11
+ open: boolean;
12
+ onOpenChange: (v: boolean) => void;
13
+ onBlok: (type: string) => void;
14
+ onSectie: (blocks: Array<Record<string, unknown>>) => void;
15
+ patterns?: Pattern[];
16
+ }): import("react").JSX.Element | null;
17
+ /**
18
+ * Een "+" op de naad onder het blok waar je muis is: hier iets invoegen. Alleen voor blokken op het
19
+ * hoogste niveau van de pagina (`sleutels`), niet voor blokken in kolommen of tabbladen.
20
+ */
21
+ export declare function TussenPlus({ sleutels, onKies }: {
22
+ sleutels: string[];
23
+ onKies: (na: string) => void;
24
+ }): import("react").JSX.Element | null;
25
+ /**
26
+ * Kaders (8.11): een stippellijn met de naam rond het blok onder je muis, een doorgetrokken lijn
27
+ * rond het blok dat je bewerkt. Zonder kader was niet te zien waar een blok begon en eindigde — de
28
+ * CSS ervoor bestond nog uit de tijd van het canvas, maar niets gebruikte hem.
29
+ */
30
+ export declare function BlokKader({ sleutels, gekozen, labelVoor }: {
31
+ sleutels: string[];
32
+ gekozen: string | null;
33
+ labelVoor: (key: string) => string;
34
+ }): import("react").JSX.Element;
@@ -0,0 +1,225 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useMemo, useRef, useState } from "react";
4
+ import { Dialog, DialogContent } from "../ui/dialog.js";
5
+ import { Button } from "../ui/primitives.js";
6
+ import { useRegistry } from "../../blocks/context.js";
7
+ import { builtinPatterns, collectPatternTypes, instantiatePattern } from "../../patterns/index.js";
8
+ import { GROEPEN, blokInfo } from "../lib/blokInfo.js";
9
+ function BlokKiezer({
10
+ open,
11
+ onOpenChange,
12
+ onBlok,
13
+ onSectie,
14
+ patterns = builtinPatterns
15
+ }) {
16
+ const registry = useRegistry();
17
+ const [zoek, setZoek] = useState("");
18
+ const [tab, setTab] = useState("blokken");
19
+ const zoekRef = useRef(null);
20
+ useEffect(() => {
21
+ if (!open) return;
22
+ setZoek("");
23
+ setTab("blokken");
24
+ const t = setTimeout(() => zoekRef.current?.focus(), 50);
25
+ return () => clearTimeout(t);
26
+ }, [open]);
27
+ const perGroep = useMemo(() => {
28
+ const q = zoek.trim().toLowerCase();
29
+ const m = /* @__PURE__ */ new Map();
30
+ for (const def of registry.values()) {
31
+ const info = blokInfo(def.type, def.category);
32
+ const item = { type: def.type, label: def.label, icon: def.icon, uitleg: info.uitleg };
33
+ if (q && !`${item.label} ${item.uitleg ?? ""}`.toLowerCase().includes(q)) continue;
34
+ m.set(info.groep, [...m.get(info.groep) ?? [], item]);
35
+ }
36
+ return GROEPEN.map((g) => ({ ...g, items: m.get(g.id) ?? [] })).filter((g) => g.items.length > 0);
37
+ }, [registry, zoek]);
38
+ const secties = useMemo(() => {
39
+ const q = zoek.trim().toLowerCase();
40
+ return patterns.filter((p) => collectPatternTypes(p).every((t) => registry.get(t))).filter((p) => !q || `${p.label} ${p.description ?? ""} ${p.category}`.toLowerCase().includes(q));
41
+ }, [patterns, registry, zoek]);
42
+ if (!open) return null;
43
+ return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsx(DialogContent, { title: "Toevoegen", width: "min(94vw, 46rem)", children: /* @__PURE__ */ jsxs("div", { className: "grid gap-3", children: [
44
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
45
+ /* @__PURE__ */ jsx("div", { role: "tablist", "aria-label": "Wat toevoegen", className: "inline-flex rounded-lg bg-slate-100 p-0.5", children: ["blokken", "secties"].map((t) => /* @__PURE__ */ jsx(
46
+ "button",
47
+ {
48
+ type: "button",
49
+ role: "tab",
50
+ "aria-selected": tab === t,
51
+ onClick: () => setTab(t),
52
+ className: "xicms-admin-btn rounded-md px-3 py-1.5 text-sm font-medium text-slate-600 aria-[selected=true]:bg-white aria-[selected=true]:text-slate-900 aria-[selected=true]:shadow-sm",
53
+ children: t === "blokken" ? "Losse blokken" : "Kant-en-klare secties"
54
+ },
55
+ t
56
+ )) }),
57
+ /* @__PURE__ */ jsx(
58
+ "input",
59
+ {
60
+ ref: zoekRef,
61
+ type: "search",
62
+ value: zoek,
63
+ onChange: (e) => setZoek(e.target.value),
64
+ placeholder: "Zoek, bv. foto, prijzen, team\u2026",
65
+ "aria-label": "Zoek een blok",
66
+ className: "min-w-0 flex-1 rounded-lg border border-slate-200 bg-white px-3 py-2 text-sm"
67
+ }
68
+ )
69
+ ] }),
70
+ /* @__PURE__ */ jsxs("div", { className: "grid max-h-[60vh] gap-4 overflow-y-auto pr-1", children: [
71
+ tab === "blokken" && (perGroep.length === 0 ? /* @__PURE__ */ jsxs("p", { className: "py-6 text-center text-sm text-slate-500", children: [
72
+ "Niets gevonden voor \u201C",
73
+ zoek,
74
+ "\u201D."
75
+ ] }) : perGroep.map((g) => /* @__PURE__ */ jsxs("section", { children: [
76
+ /* @__PURE__ */ jsx("h4", { className: "mb-1.5 text-xs font-semibold uppercase tracking-wide text-slate-500", children: g.label }),
77
+ /* @__PURE__ */ jsx("div", { className: "grid gap-1.5 sm:grid-cols-2", children: g.items.map((b) => /* @__PURE__ */ jsxs(
78
+ "button",
79
+ {
80
+ type: "button",
81
+ onClick: () => {
82
+ onBlok(b.type);
83
+ onOpenChange(false);
84
+ },
85
+ className: "xicms-admin-btn flex items-start gap-3 rounded-lg border border-slate-200 bg-white p-2.5 text-left hover:border-slate-400 hover:bg-slate-50",
86
+ children: [
87
+ /* @__PURE__ */ jsx("span", { className: "grid h-9 w-9 shrink-0 place-items-center rounded-md bg-slate-100 text-lg", "aria-hidden": true, children: b.icon ?? "\u25AB" }),
88
+ /* @__PURE__ */ jsxs("span", { className: "min-w-0", children: [
89
+ /* @__PURE__ */ jsx("span", { className: "block text-sm font-medium text-slate-900", children: b.label }),
90
+ b.uitleg && /* @__PURE__ */ jsx("span", { className: "block text-xs leading-snug text-slate-500", children: b.uitleg })
91
+ ] })
92
+ ]
93
+ },
94
+ b.type
95
+ )) })
96
+ ] }, g.id))),
97
+ tab === "secties" && (secties.length === 0 ? /* @__PURE__ */ jsx("p", { className: "py-6 text-center text-sm text-slate-500", children: "Geen secties gevonden." }) : /* @__PURE__ */ jsx("div", { className: "grid gap-1.5 sm:grid-cols-2", children: secties.map((p) => /* @__PURE__ */ jsxs(
98
+ "button",
99
+ {
100
+ type: "button",
101
+ onClick: () => {
102
+ onSectie(instantiatePattern(p));
103
+ onOpenChange(false);
104
+ },
105
+ className: "xicms-admin-btn rounded-lg border border-slate-200 bg-white p-2.5 text-left hover:border-slate-400 hover:bg-slate-50",
106
+ children: [
107
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center justify-between gap-2", children: [
108
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-slate-900", children: p.label }),
109
+ /* @__PURE__ */ jsx("span", { className: "shrink-0 text-sm opacity-70", "aria-hidden": true, children: p.blocks.slice(0, 5).map((b, i) => /* @__PURE__ */ jsx("span", { children: registry.get(b._type)?.icon ?? "\u{1F9E9}" }, i)) })
110
+ ] }),
111
+ /* @__PURE__ */ jsx("span", { className: "block text-xs text-slate-500", children: p.description ?? p.category })
112
+ ]
113
+ },
114
+ p.id
115
+ )) }))
116
+ ] }),
117
+ /* @__PURE__ */ jsx("div", { className: "flex justify-end", children: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: () => onOpenChange(false), children: "Sluiten" }) })
118
+ ] }) }) });
119
+ }
120
+ function TussenPlus({ sleutels, onKies }) {
121
+ const [plek, setPlek] = useState(null);
122
+ useEffect(() => {
123
+ const set = new Set(sleutels);
124
+ const meet = (el) => {
125
+ let r = el.getBoundingClientRect();
126
+ if (r.width === 0 && r.height === 0) {
127
+ const kids = Array.from(el.children).map((k) => k.getBoundingClientRect()).filter((k) => k.width || k.height);
128
+ if (!kids.length) return null;
129
+ const left = Math.min(...kids.map((k) => k.left));
130
+ const right = Math.max(...kids.map((k) => k.right));
131
+ const bottom = Math.max(...kids.map((k) => k.bottom));
132
+ r = { left, right, bottom, width: right - left };
133
+ }
134
+ return { top: r.bottom, left: r.left + r.width / 2 };
135
+ };
136
+ const opOver = (e) => {
137
+ const doel = e.target;
138
+ if (doel?.closest?.(".xicms-ve-tussenplus")) return;
139
+ let blok = doel?.closest?.("[data-xicms-block]") ?? null;
140
+ while (blok && !set.has(blok.dataset.xicmsBlock ?? "")) blok = blok.parentElement?.closest("[data-xicms-block]") ?? null;
141
+ if (!blok) return setPlek(null);
142
+ const p = meet(blok);
143
+ if (!p || p.top > window.innerHeight - 70) return setPlek(null);
144
+ const key = blok.dataset.xicmsBlock;
145
+ setPlek((v) => v && v.key === key && v.top === p.top ? v : { key, ...p });
146
+ };
147
+ const opScroll = () => setPlek(null);
148
+ document.addEventListener("mouseover", opOver, true);
149
+ window.addEventListener("scroll", opScroll, { capture: true, passive: true });
150
+ return () => {
151
+ document.removeEventListener("mouseover", opOver, true);
152
+ window.removeEventListener("scroll", opScroll, { capture: true });
153
+ };
154
+ }, [sleutels]);
155
+ if (!plek) return null;
156
+ return /* @__PURE__ */ jsx(
157
+ "button",
158
+ {
159
+ type: "button",
160
+ className: "xicms-ve-tussenplus",
161
+ style: { top: plek.top, left: plek.left },
162
+ title: "Hier een blok of sectie toevoegen",
163
+ "aria-label": "Hier een blok of sectie toevoegen",
164
+ onMouseDown: (e) => e.preventDefault(),
165
+ onClick: () => onKies(plek.key),
166
+ children: /* @__PURE__ */ jsx("span", { "aria-hidden": true, children: "+" })
167
+ }
168
+ );
169
+ }
170
+ function omtrek(el) {
171
+ let r = el.getBoundingClientRect();
172
+ if (r.width === 0 && r.height === 0) {
173
+ const kids = Array.from(el.children).map((k) => k.getBoundingClientRect()).filter((k) => k.width || k.height);
174
+ if (!kids.length) return null;
175
+ const left = Math.min(...kids.map((k) => k.left));
176
+ const top = Math.min(...kids.map((k) => k.top));
177
+ r = { left, top, width: Math.max(...kids.map((k) => k.right)) - left, height: Math.max(...kids.map((k) => k.bottom)) - top };
178
+ }
179
+ return { top: r.top, left: r.left, width: r.width, height: r.height };
180
+ }
181
+ function BlokKader({ sleutels, gekozen, labelVoor }) {
182
+ const [aangewezen, setAangewezen] = useState(null);
183
+ const [, setTik] = useState(0);
184
+ useEffect(() => {
185
+ const set = new Set(sleutels);
186
+ const opOver = (e) => {
187
+ const doel = e.target;
188
+ if (doel?.closest?.("[data-xicms-tooling], .xicms-ve-snel, .xicms-ve-item, .xicms-ve-blokknoppen, .xicms-ve-pencil, .xicms-ve-tussenplus")) return;
189
+ let blok = doel?.closest?.("[data-xicms-block]") ?? null;
190
+ while (blok && !set.has(blok.dataset.xicmsBlock ?? "")) blok = blok.parentElement?.closest("[data-xicms-block]") ?? null;
191
+ setAangewezen(blok?.dataset.xicmsBlock ?? null);
192
+ };
193
+ let frame = 0;
194
+ const her = () => {
195
+ cancelAnimationFrame(frame);
196
+ frame = requestAnimationFrame(() => setTik((n) => n + 1));
197
+ };
198
+ document.addEventListener("mouseover", opOver, true);
199
+ window.addEventListener("scroll", her, { capture: true, passive: true });
200
+ window.addEventListener("resize", her);
201
+ return () => {
202
+ cancelAnimationFrame(frame);
203
+ document.removeEventListener("mouseover", opOver, true);
204
+ window.removeEventListener("scroll", her, { capture: true });
205
+ window.removeEventListener("resize", her);
206
+ };
207
+ }, [sleutels]);
208
+ const teken = (key, soort) => {
209
+ if (!key) return null;
210
+ const el = document.querySelector(`[data-xicms-block="${CSS.escape(key)}"]`);
211
+ const r = el ? omtrek(el) : null;
212
+ if (!r) return null;
213
+ return /* @__PURE__ */ jsx("div", { className: `xicms-ve-kader is-${soort}`, style: { top: r.top, left: r.left, width: r.width, height: r.height }, "aria-hidden": true, children: soort === "aangewezen" && /* @__PURE__ */ jsx("span", { className: "xicms-ve-kader__naam", children: labelVoor(key) }) });
214
+ };
215
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
216
+ aangewezen !== gekozen && teken(aangewezen, "aangewezen"),
217
+ teken(gekozen, "gekozen")
218
+ ] });
219
+ }
220
+ export {
221
+ BlokKader,
222
+ BlokKiezer,
223
+ TussenPlus
224
+ };
225
+ //# sourceMappingURL=BlokKiezer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/admin/visual/BlokKiezer.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Dialog, DialogContent } from \"../ui/dialog\";\nimport { Button } from \"../ui/primitives\";\nimport { useRegistry } from \"../../blocks/context\";\nimport { builtinPatterns, collectPatternTypes, instantiatePattern, type Pattern } from \"../../patterns\";\nimport { GROEPEN, blokInfo, type BlokGroep } from \"../lib/blokInfo\";\n\n/**\n * De blokkiezer (8.11): wat wil je hier toevoegen?\n *\n * Verving een platte keuzelijst van zo'n zestig namen. Nu: een zoekveld, groepen (\"Over je bedrijf\",\n * \"Contact en afspraken\"), per blok één zin uitleg, en een tweede tabblad met kant-en-klare secties\n * (de patronen) — die zaten achter een aparte knop in de zijbalk. Opent vanaf de \"+\" tussen twee\n * blokken op de pagina én vanuit de zijbalk.\n */\nexport function BlokKiezer({\n open,\n onOpenChange,\n onBlok,\n onSectie,\n patterns = builtinPatterns,\n}: {\n open: boolean;\n onOpenChange: (v: boolean) => void;\n onBlok: (type: string) => void;\n onSectie: (blocks: Array<Record<string, unknown>>) => void;\n patterns?: Pattern[];\n}) {\n const registry = useRegistry();\n const [zoek, setZoek] = useState(\"\");\n const [tab, setTab] = useState<\"blokken\" | \"secties\">(\"blokken\");\n const zoekRef = useRef<HTMLInputElement>(null);\n useEffect(() => {\n if (!open) return;\n setZoek(\"\");\n setTab(\"blokken\");\n const t = setTimeout(() => zoekRef.current?.focus(), 50);\n return () => clearTimeout(t);\n }, [open]);\n\n const perGroep = useMemo(() => {\n const q = zoek.trim().toLowerCase();\n const m = new Map<BlokGroep, { type: string; label: string; icon?: string; uitleg?: string }[]>();\n for (const def of registry.values()) {\n const info = blokInfo(def.type, def.category);\n const item = { type: def.type, label: def.label, icon: def.icon, uitleg: info.uitleg };\n if (q && !`${item.label} ${item.uitleg ?? \"\"}`.toLowerCase().includes(q)) continue;\n m.set(info.groep, [...(m.get(info.groep) ?? []), item]);\n }\n return GROEPEN.map((g) => ({ ...g, items: m.get(g.id) ?? [] })).filter((g) => g.items.length > 0);\n }, [registry, zoek]);\n\n const secties = useMemo(() => {\n const q = zoek.trim().toLowerCase();\n return patterns\n .filter((p) => collectPatternTypes(p).every((t) => registry.get(t)))\n .filter((p) => !q || `${p.label} ${p.description ?? \"\"} ${p.category}`.toLowerCase().includes(q));\n }, [patterns, registry, zoek]);\n\n if (!open) return null;\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent title=\"Toevoegen\" width=\"min(94vw, 46rem)\">\n <div className=\"grid gap-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <div role=\"tablist\" aria-label=\"Wat toevoegen\" className=\"inline-flex rounded-lg bg-slate-100 p-0.5\">\n {([\"blokken\", \"secties\"] as const).map((t) => (\n <button\n key={t}\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === t}\n onClick={() => setTab(t)}\n className=\"xicms-admin-btn rounded-md px-3 py-1.5 text-sm font-medium text-slate-600 aria-[selected=true]:bg-white aria-[selected=true]:text-slate-900 aria-[selected=true]:shadow-sm\"\n >\n {t === \"blokken\" ? \"Losse blokken\" : \"Kant-en-klare secties\"}\n </button>\n ))}\n </div>\n <input\n ref={zoekRef}\n type=\"search\"\n value={zoek}\n onChange={(e) => setZoek(e.target.value)}\n placeholder=\"Zoek, bv. foto, prijzen, team…\"\n aria-label=\"Zoek een blok\"\n className=\"min-w-0 flex-1 rounded-lg border border-slate-200 bg-white px-3 py-2 text-sm\"\n />\n </div>\n\n <div className=\"grid max-h-[60vh] gap-4 overflow-y-auto pr-1\">\n {tab === \"blokken\" &&\n (perGroep.length === 0 ? (\n <p className=\"py-6 text-center text-sm text-slate-500\">Niets gevonden voor “{zoek}”.</p>\n ) : (\n perGroep.map((g) => (\n <section key={g.id}>\n <h4 className=\"mb-1.5 text-xs font-semibold uppercase tracking-wide text-slate-500\">{g.label}</h4>\n <div className=\"grid gap-1.5 sm:grid-cols-2\">\n {g.items.map((b) => (\n <button\n key={b.type}\n type=\"button\"\n onClick={() => {\n onBlok(b.type);\n onOpenChange(false);\n }}\n className=\"xicms-admin-btn flex items-start gap-3 rounded-lg border border-slate-200 bg-white p-2.5 text-left hover:border-slate-400 hover:bg-slate-50\"\n >\n <span className=\"grid h-9 w-9 shrink-0 place-items-center rounded-md bg-slate-100 text-lg\" aria-hidden>\n {b.icon ?? \"▫\"}\n </span>\n <span className=\"min-w-0\">\n <span className=\"block text-sm font-medium text-slate-900\">{b.label}</span>\n {b.uitleg && <span className=\"block text-xs leading-snug text-slate-500\">{b.uitleg}</span>}\n </span>\n </button>\n ))}\n </div>\n </section>\n ))\n ))}\n {tab === \"secties\" &&\n (secties.length === 0 ? (\n <p className=\"py-6 text-center text-sm text-slate-500\">Geen secties gevonden.</p>\n ) : (\n <div className=\"grid gap-1.5 sm:grid-cols-2\">\n {secties.map((p) => (\n <button\n key={p.id}\n type=\"button\"\n onClick={() => {\n onSectie(instantiatePattern(p));\n onOpenChange(false);\n }}\n className=\"xicms-admin-btn rounded-lg border border-slate-200 bg-white p-2.5 text-left hover:border-slate-400 hover:bg-slate-50\"\n >\n <span className=\"flex items-center justify-between gap-2\">\n <span className=\"text-sm font-medium text-slate-900\">{p.label}</span>\n <span className=\"shrink-0 text-sm opacity-70\" aria-hidden>\n {p.blocks.slice(0, 5).map((b, i) => (\n <span key={i}>{registry.get(b._type)?.icon ?? \"🧩\"}</span>\n ))}\n </span>\n </span>\n <span className=\"block text-xs text-slate-500\">{p.description ?? p.category}</span>\n </button>\n ))}\n </div>\n ))}\n </div>\n <div className=\"flex justify-end\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => onOpenChange(false)}>\n Sluiten\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n\n/**\n * Een \"+\" op de naad onder het blok waar je muis is: hier iets invoegen. Alleen voor blokken op het\n * hoogste niveau van de pagina (`sleutels`), niet voor blokken in kolommen of tabbladen.\n */\nexport function TussenPlus({ sleutels, onKies }: { sleutels: string[]; onKies: (na: string) => void }) {\n const [plek, setPlek] = useState<{ key: string; top: number; left: number } | null>(null);\n useEffect(() => {\n const set = new Set(sleutels);\n const meet = (el: HTMLElement) => {\n let r = el.getBoundingClientRect();\n if (r.width === 0 && r.height === 0) {\n const kids = Array.from(el.children).map((k) => k.getBoundingClientRect()).filter((k) => k.width || k.height);\n if (!kids.length) return null;\n const left = Math.min(...kids.map((k) => k.left));\n const right = Math.max(...kids.map((k) => k.right));\n const bottom = Math.max(...kids.map((k) => k.bottom));\n r = { left, right, bottom, width: right - left } as DOMRect;\n }\n return { top: r.bottom, left: r.left + r.width / 2 };\n };\n const opOver = (e: MouseEvent) => {\n const doel = e.target as HTMLElement | null;\n if (doel?.closest?.(\".xicms-ve-tussenplus\")) return;\n let blok = doel?.closest?.<HTMLElement>(\"[data-xicms-block]\") ?? null;\n // Het buitenste blok: in kolommen staan blokken in blokken.\n while (blok && !set.has(blok.dataset.xicmsBlock ?? \"\")) blok = blok.parentElement?.closest<HTMLElement>(\"[data-xicms-block]\") ?? null;\n if (!blok) return setPlek(null);\n const p = meet(blok);\n if (!p || p.top > window.innerHeight - 70) return setPlek(null);\n const key = blok.dataset.xicmsBlock!;\n setPlek((v) => (v && v.key === key && v.top === p.top ? v : { key, ...p }));\n };\n const opScroll = () => setPlek(null);\n document.addEventListener(\"mouseover\", opOver, true);\n window.addEventListener(\"scroll\", opScroll, { capture: true, passive: true });\n return () => {\n document.removeEventListener(\"mouseover\", opOver, true);\n window.removeEventListener(\"scroll\", opScroll, { capture: true });\n };\n }, [sleutels]);\n if (!plek) return null;\n return (\n <button\n type=\"button\"\n className=\"xicms-ve-tussenplus\"\n style={{ top: plek.top, left: plek.left }}\n title=\"Hier een blok of sectie toevoegen\"\n aria-label=\"Hier een blok of sectie toevoegen\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => onKies(plek.key)}\n >\n <span aria-hidden>+</span>\n </button>\n );\n}\n\nfunction omtrek(el: HTMLElement): { top: number; left: number; width: number; height: number } | null {\n let r = el.getBoundingClientRect();\n if (r.width === 0 && r.height === 0) {\n const kids = Array.from(el.children).map((k) => k.getBoundingClientRect()).filter((k) => k.width || k.height);\n if (!kids.length) return null;\n const left = Math.min(...kids.map((k) => k.left));\n const top = Math.min(...kids.map((k) => k.top));\n r = { left, top, width: Math.max(...kids.map((k) => k.right)) - left, height: Math.max(...kids.map((k) => k.bottom)) - top } as DOMRect;\n }\n return { top: r.top, left: r.left, width: r.width, height: r.height };\n}\n\n/**\n * Kaders (8.11): een stippellijn met de naam rond het blok onder je muis, een doorgetrokken lijn\n * rond het blok dat je bewerkt. Zonder kader was niet te zien waar een blok begon en eindigde — de\n * CSS ervoor bestond nog uit de tijd van het canvas, maar niets gebruikte hem.\n */\nexport function BlokKader({ sleutels, gekozen, labelVoor }: { sleutels: string[]; gekozen: string | null; labelVoor: (key: string) => string }) {\n const [aangewezen, setAangewezen] = useState<string | null>(null);\n const [, setTik] = useState(0);\n useEffect(() => {\n const set = new Set(sleutels);\n const opOver = (e: MouseEvent) => {\n const doel = e.target as HTMLElement | null;\n if (doel?.closest?.(\"[data-xicms-tooling], .xicms-ve-snel, .xicms-ve-item, .xicms-ve-blokknoppen, .xicms-ve-pencil, .xicms-ve-tussenplus\")) return;\n let blok = doel?.closest?.<HTMLElement>(\"[data-xicms-block]\") ?? null;\n while (blok && !set.has(blok.dataset.xicmsBlock ?? \"\")) blok = blok.parentElement?.closest<HTMLElement>(\"[data-xicms-block]\") ?? null;\n setAangewezen(blok?.dataset.xicmsBlock ?? null);\n };\n let frame = 0;\n const her = () => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => setTik((n) => n + 1));\n };\n document.addEventListener(\"mouseover\", opOver, true);\n window.addEventListener(\"scroll\", her, { capture: true, passive: true });\n window.addEventListener(\"resize\", her);\n return () => {\n cancelAnimationFrame(frame);\n document.removeEventListener(\"mouseover\", opOver, true);\n window.removeEventListener(\"scroll\", her, { capture: true });\n window.removeEventListener(\"resize\", her);\n };\n }, [sleutels]);\n const teken = (key: string | null, soort: \"aangewezen\" | \"gekozen\") => {\n if (!key) return null;\n const el = document.querySelector<HTMLElement>(`[data-xicms-block=\"${CSS.escape(key)}\"]`);\n const r = el ? omtrek(el) : null;\n if (!r) return null;\n return (\n <div className={`xicms-ve-kader is-${soort}`} style={{ top: r.top, left: r.left, width: r.width, height: r.height }} aria-hidden>\n {soort === \"aangewezen\" && <span className=\"xicms-ve-kader__naam\">{labelVoor(key)}</span>}\n </div>\n );\n };\n return (\n <>\n {aangewezen !== gekozen && teken(aangewezen, \"aangewezen\")}\n {teken(gekozen, \"gekozen\")}\n </>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,52 @@
1
+ import type { BlockDefinition } from "../../blocks/registry.js";
2
+ import type { Field } from "../../schema/fields.js";
3
+ /**
4
+ * Bewerken op de pagina, voorbij de tekst (8.11): het POTLOOD.
5
+ *
6
+ * De wens: potlood = op de pagina zelf bewerken, tandwiel = de zijbalk. Tot nu toe deed het potlood
7
+ * alleen tekst; voor al het andere moest je toch naar de zijbalk — een kaart toevoegen, een knop
8
+ * naar een andere pagina laten wijzen, van drie naar vier kolommen. Dit gereedschap verschijnt bij
9
+ * het geselecteerde blok en doet precies dat, op de plek zelf:
10
+ *
11
+ * - **Lijsten** (kaarten, teamleden, reviews, stappen …): bij het onderdeel onder je muis ↑ ↓ ⧉ 🗑,
12
+ * en onder de lijst "+ Kaart". De onderdelen worden gevonden via de veldhaken die de blokken al
13
+ * zetten (`data-xicms-edit="items.2.title"`) — geen wijziging aan een Render nodig, ook niet aan
14
+ * maatwerkblokken.
15
+ * - **Links**: wie een knoptekst aanwijst of bewerkt, krijgt eronder "🔗 Contact" — klik, en kies
16
+ * een pagina of adres.
17
+ * - **Snelle keuzes**: de paar keuzes die het uiterlijk van het blok bepalen (kolommen, stijl,
18
+ * uitlijning), als een balkje boven het blok. Alles daarbuiten blijft in de zijbalk.
19
+ */
20
+ type Blok = Record<string, unknown> & {
21
+ _key: string;
22
+ _type: string;
23
+ };
24
+ export interface LijstItem {
25
+ lijst: string;
26
+ index: number;
27
+ el: HTMLElement;
28
+ }
29
+ /**
30
+ * Vind de onderdelen van de lijsten in een blok, via de veldhaken. Per onderdeel: de laagste
31
+ * voorouder die al zijn velden bevat, en dan zo ver omhoog als kan zonder een ánder onderdeel van
32
+ * dezelfde lijst te raken — dat is de kaart, de rij, het teamlid.
33
+ */
34
+ export declare function vindLijstItems(host: HTMLElement): LijstItem[];
35
+ /** "sections.0.items" → "sections.items": de vorm waarop lijst- en onderdeelnamen per blok staan. */
36
+ export declare function lijstVorm(lijst: string): string;
37
+ /** Bij een knoptekst-veld: welk veld bevat de link? `null` = geen link bij dit veld. */
38
+ export declare function linkVeldVoor(veld: string, blok: Record<string, unknown>): string | null;
39
+ /** De snelle keuzes van een blok: keuzelijsten, kleine getallen en schakelaars die het uiterlijk bepalen. */
40
+ export declare function snelleKeuzes(velden: Field[]): Field[];
41
+ export declare function InlineGereedschap({ blok, def, siteId, onWijzig, onInstellingen, onStartVeld, onVerwijderd, }: {
42
+ blok: Blok;
43
+ def: BlockDefinition | undefined;
44
+ siteId: string;
45
+ /** Nieuwe versie van het blok (één ongedaan-maak-stap). */
46
+ onWijzig: (volgend: Blok) => void;
47
+ onInstellingen: () => void;
48
+ /** Zet het bewerken van een veld aan (na het toevoegen van een onderdeel). */
49
+ onStartVeld: (veld: string) => void;
50
+ onVerwijderd: (wat: string) => void;
51
+ }): import("react").JSX.Element;
52
+ export {};