@xiwebdesign/xicms-core 4.17.1

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 (436) hide show
  1. package/dist/XiCMSProvider.d.ts +58 -0
  2. package/dist/XiCMSProvider.js +165 -0
  3. package/dist/XiCMSProvider.js.map +1 -0
  4. package/dist/admin/AdminApp.d.ts +4 -0
  5. package/dist/admin/AdminApp.js +62 -0
  6. package/dist/admin/AdminApp.js.map +1 -0
  7. package/dist/admin/AdminHelp.d.ts +2 -0
  8. package/dist/admin/AdminHelp.js +65 -0
  9. package/dist/admin/AdminHelp.js.map +1 -0
  10. package/dist/admin/NewsEditor.d.ts +2 -0
  11. package/dist/admin/NewsEditor.js +171 -0
  12. package/dist/admin/NewsEditor.js.map +1 -0
  13. package/dist/admin/SuperadminPanel.d.ts +4 -0
  14. package/dist/admin/SuperadminPanel.js +101 -0
  15. package/dist/admin/SuperadminPanel.js.map +1 -0
  16. package/dist/admin/blockEditors/StyleEditor.d.ts +10 -0
  17. package/dist/admin/blockEditors/StyleEditor.js +78 -0
  18. package/dist/admin/blockEditors/StyleEditor.js.map +1 -0
  19. package/dist/admin/blockEditors/index.d.ts +16 -0
  20. package/dist/admin/blockEditors/index.js +1602 -0
  21. package/dist/admin/blockEditors/index.js.map +1 -0
  22. package/dist/admin/editors/RichTextEditor.d.ts +10 -0
  23. package/dist/admin/editors/RichTextEditor.js +86 -0
  24. package/dist/admin/editors/RichTextEditor.js.map +1 -0
  25. package/dist/admin/forms/FormsPanel.d.ts +3 -0
  26. package/dist/admin/forms/FormsPanel.js +203 -0
  27. package/dist/admin/forms/FormsPanel.js.map +1 -0
  28. package/dist/admin/index.d.ts +21 -0
  29. package/dist/admin/index.js +38 -0
  30. package/dist/admin/index.js.map +1 -0
  31. package/dist/admin/lib/compressImage.d.ts +12 -0
  32. package/dist/admin/lib/compressImage.js +53 -0
  33. package/dist/admin/lib/compressImage.js.map +1 -0
  34. package/dist/admin/lib/mediaUsage.d.ts +9 -0
  35. package/dist/admin/lib/mediaUsage.js +25 -0
  36. package/dist/admin/lib/mediaUsage.js.map +1 -0
  37. package/dist/admin/lib/pagesClient.d.ts +38 -0
  38. package/dist/admin/lib/pagesClient.js +143 -0
  39. package/dist/admin/lib/pagesClient.js.map +1 -0
  40. package/dist/admin/lib/slugify.d.ts +2 -0
  41. package/dist/admin/lib/slugify.js +7 -0
  42. package/dist/admin/lib/slugify.js.map +1 -0
  43. package/dist/admin/lib/upload.d.ts +13 -0
  44. package/dist/admin/lib/upload.js +40 -0
  45. package/dist/admin/lib/upload.js.map +1 -0
  46. package/dist/admin/lib/zodFields.d.ts +27 -0
  47. package/dist/admin/lib/zodFields.js +48 -0
  48. package/dist/admin/lib/zodFields.js.map +1 -0
  49. package/dist/admin/media/MediaManager.d.ts +3 -0
  50. package/dist/admin/media/MediaManager.js +132 -0
  51. package/dist/admin/media/MediaManager.js.map +1 -0
  52. package/dist/admin/media/MediaPicker.d.ts +24 -0
  53. package/dist/admin/media/MediaPicker.js +93 -0
  54. package/dist/admin/media/MediaPicker.js.map +1 -0
  55. package/dist/admin/pages/PageEditor.d.ts +5 -0
  56. package/dist/admin/pages/PageEditor.js +239 -0
  57. package/dist/admin/pages/PageEditor.js.map +1 -0
  58. package/dist/admin/pages/PagesPanel.d.ts +3 -0
  59. package/dist/admin/pages/PagesPanel.js +92 -0
  60. package/dist/admin/pages/PagesPanel.js.map +1 -0
  61. package/dist/admin/panelRegistry.d.ts +20 -0
  62. package/dist/admin/panelRegistry.js +23 -0
  63. package/dist/admin/panelRegistry.js.map +1 -0
  64. package/dist/admin/patterns/PatternInserter.d.ts +10 -0
  65. package/dist/admin/patterns/PatternInserter.js +58 -0
  66. package/dist/admin/patterns/PatternInserter.js.map +1 -0
  67. package/dist/admin/settings/SettingsPanel.d.ts +3 -0
  68. package/dist/admin/settings/SettingsPanel.js +304 -0
  69. package/dist/admin/settings/SettingsPanel.js.map +1 -0
  70. package/dist/admin/settings/moduleSettingsForm.d.ts +12 -0
  71. package/dist/admin/settings/moduleSettingsForm.js +45 -0
  72. package/dist/admin/settings/moduleSettingsForm.js.map +1 -0
  73. package/dist/admin/stats/StatsPanel.d.ts +4 -0
  74. package/dist/admin/stats/StatsPanel.js +80 -0
  75. package/dist/admin/stats/StatsPanel.js.map +1 -0
  76. package/dist/admin/ui/ArrayEditor.d.ts +16 -0
  77. package/dist/admin/ui/ArrayEditor.js +38 -0
  78. package/dist/admin/ui/ArrayEditor.js.map +1 -0
  79. package/dist/admin/ui/ConfirmDialog.d.ts +22 -0
  80. package/dist/admin/ui/ConfirmDialog.js +47 -0
  81. package/dist/admin/ui/ConfirmDialog.js.map +1 -0
  82. package/dist/admin/ui/cn.d.ts +3 -0
  83. package/dist/admin/ui/cn.js +9 -0
  84. package/dist/admin/ui/cn.js.map +1 -0
  85. package/dist/admin/ui/dialog.d.ts +9 -0
  86. package/dist/admin/ui/dialog.js +47 -0
  87. package/dist/admin/ui/dialog.js.map +1 -0
  88. package/dist/admin/ui/index.d.ts +7 -0
  89. package/dist/admin/ui/index.js +29 -0
  90. package/dist/admin/ui/index.js.map +1 -0
  91. package/dist/admin/ui/primitives.d.ts +37 -0
  92. package/dist/admin/ui/primitives.js +137 -0
  93. package/dist/admin/ui/primitives.js.map +1 -0
  94. package/dist/admin/ui/select.d.ts +11 -0
  95. package/dist/admin/ui/select.js +27 -0
  96. package/dist/admin/ui/select.js.map +1 -0
  97. package/dist/admin/ui/switch.d.ts +6 -0
  98. package/dist/admin/ui/switch.js +22 -0
  99. package/dist/admin/ui/switch.js.map +1 -0
  100. package/dist/admin/ui/tabs.d.ts +5 -0
  101. package/dist/admin/ui/tabs.js +36 -0
  102. package/dist/admin/ui/tabs.js.map +1 -0
  103. package/dist/admin/ui/toast.d.ts +19 -0
  104. package/dist/admin/ui/toast.js +24 -0
  105. package/dist/admin/ui/toast.js.map +1 -0
  106. package/dist/admin/visual/VisualEditor.d.ts +10 -0
  107. package/dist/admin/visual/VisualEditor.js +597 -0
  108. package/dist/admin/visual/VisualEditor.js.map +1 -0
  109. package/dist/admin/visual/reorder.d.ts +6 -0
  110. package/dist/admin/visual/reorder.js +12 -0
  111. package/dist/admin/visual/reorder.js.map +1 -0
  112. package/dist/admin.css +1 -0
  113. package/dist/auth/AuthProvider.d.ts +30 -0
  114. package/dist/auth/AuthProvider.js +110 -0
  115. package/dist/auth/AuthProvider.js.map +1 -0
  116. package/dist/auth/LoginForm.d.ts +4 -0
  117. package/dist/auth/LoginForm.js +122 -0
  118. package/dist/auth/LoginForm.js.map +1 -0
  119. package/dist/auth/roles.d.ts +15 -0
  120. package/dist/auth/roles.js +21 -0
  121. package/dist/auth/roles.js.map +1 -0
  122. package/dist/blocks/BlockErrorBoundary.d.ts +32 -0
  123. package/dist/blocks/BlockErrorBoundary.js +39 -0
  124. package/dist/blocks/BlockErrorBoundary.js.map +1 -0
  125. package/dist/blocks/BlockRenderer.d.ts +15 -0
  126. package/dist/blocks/BlockRenderer.js +24 -0
  127. package/dist/blocks/BlockRenderer.js.map +1 -0
  128. package/dist/blocks/blockStyle.d.ts +14 -0
  129. package/dist/blocks/blockStyle.js +14 -0
  130. package/dist/blocks/blockStyle.js.map +1 -0
  131. package/dist/blocks/builtins/Accordion.d.ts +2 -0
  132. package/dist/blocks/builtins/Accordion.js +45 -0
  133. package/dist/blocks/builtins/Accordion.js.map +1 -0
  134. package/dist/blocks/builtins/Agenda.d.ts +23 -0
  135. package/dist/blocks/builtins/Agenda.js +102 -0
  136. package/dist/blocks/builtins/Agenda.js.map +1 -0
  137. package/dist/blocks/builtins/Banner.d.ts +2 -0
  138. package/dist/blocks/builtins/Banner.js +45 -0
  139. package/dist/blocks/builtins/Banner.js.map +1 -0
  140. package/dist/blocks/builtins/BeforeAfter.d.ts +2 -0
  141. package/dist/blocks/builtins/BeforeAfter.js +44 -0
  142. package/dist/blocks/builtins/BeforeAfter.js.map +1 -0
  143. package/dist/blocks/builtins/Booking.d.ts +2 -0
  144. package/dist/blocks/builtins/Booking.js +27 -0
  145. package/dist/blocks/builtins/Booking.js.map +1 -0
  146. package/dist/blocks/builtins/Breadcrumbs.d.ts +10 -0
  147. package/dist/blocks/builtins/Breadcrumbs.js +73 -0
  148. package/dist/blocks/builtins/Breadcrumbs.js.map +1 -0
  149. package/dist/blocks/builtins/Cards.d.ts +2 -0
  150. package/dist/blocks/builtins/Cards.js +94 -0
  151. package/dist/blocks/builtins/Cards.js.map +1 -0
  152. package/dist/blocks/builtins/Columns.d.ts +2 -0
  153. package/dist/blocks/builtins/Columns.js +22 -0
  154. package/dist/blocks/builtins/Columns.js.map +1 -0
  155. package/dist/blocks/builtins/Contact.d.ts +7 -0
  156. package/dist/blocks/builtins/Contact.js +121 -0
  157. package/dist/blocks/builtins/Contact.js.map +1 -0
  158. package/dist/blocks/builtins/Countdown.d.ts +18 -0
  159. package/dist/blocks/builtins/Countdown.js +65 -0
  160. package/dist/blocks/builtins/Countdown.js.map +1 -0
  161. package/dist/blocks/builtins/Cta.d.ts +2 -0
  162. package/dist/blocks/builtins/Cta.js +52 -0
  163. package/dist/blocks/builtins/Cta.js.map +1 -0
  164. package/dist/blocks/builtins/Downloads.d.ts +2 -0
  165. package/dist/blocks/builtins/Downloads.js +32 -0
  166. package/dist/blocks/builtins/Downloads.js.map +1 -0
  167. package/dist/blocks/builtins/Elements.d.ts +4 -0
  168. package/dist/blocks/builtins/Elements.js +64 -0
  169. package/dist/blocks/builtins/Elements.js.map +1 -0
  170. package/dist/blocks/builtins/Embed.d.ts +2 -0
  171. package/dist/blocks/builtins/Embed.js +30 -0
  172. package/dist/blocks/builtins/Embed.js.map +1 -0
  173. package/dist/blocks/builtins/Faq.d.ts +6 -0
  174. package/dist/blocks/builtins/Faq.js +110 -0
  175. package/dist/blocks/builtins/Faq.js.map +1 -0
  176. package/dist/blocks/builtins/FormBlock.d.ts +2 -0
  177. package/dist/blocks/builtins/FormBlock.js +221 -0
  178. package/dist/blocks/builtins/FormBlock.js.map +1 -0
  179. package/dist/blocks/builtins/Gallery.d.ts +23 -0
  180. package/dist/blocks/builtins/Gallery.js +177 -0
  181. package/dist/blocks/builtins/Gallery.js.map +1 -0
  182. package/dist/blocks/builtins/Hero.d.ts +2 -0
  183. package/dist/blocks/builtins/Hero.js +47 -0
  184. package/dist/blocks/builtins/Hero.js.map +1 -0
  185. package/dist/blocks/builtins/ImageBlock.d.ts +2 -0
  186. package/dist/blocks/builtins/ImageBlock.js +24 -0
  187. package/dist/blocks/builtins/ImageBlock.js.map +1 -0
  188. package/dist/blocks/builtins/Jobs.d.ts +8 -0
  189. package/dist/blocks/builtins/Jobs.js +65 -0
  190. package/dist/blocks/builtins/Jobs.js.map +1 -0
  191. package/dist/blocks/builtins/Layout.d.ts +3 -0
  192. package/dist/blocks/builtins/Layout.js +67 -0
  193. package/dist/blocks/builtins/Layout.js.map +1 -0
  194. package/dist/blocks/builtins/MapBlock.d.ts +2 -0
  195. package/dist/blocks/builtins/MapBlock.js +31 -0
  196. package/dist/blocks/builtins/MapBlock.js.map +1 -0
  197. package/dist/blocks/builtins/NewsListBlock.d.ts +2 -0
  198. package/dist/blocks/builtins/NewsListBlock.js +24 -0
  199. package/dist/blocks/builtins/NewsListBlock.js.map +1 -0
  200. package/dist/blocks/builtins/Newsletter.d.ts +2 -0
  201. package/dist/blocks/builtins/Newsletter.js +84 -0
  202. package/dist/blocks/builtins/Newsletter.js.map +1 -0
  203. package/dist/blocks/builtins/OpenNowBadge.d.ts +9 -0
  204. package/dist/blocks/builtins/OpenNowBadge.js +20 -0
  205. package/dist/blocks/builtins/OpenNowBadge.js.map +1 -0
  206. package/dist/blocks/builtins/OpeningHours.d.ts +2 -0
  207. package/dist/blocks/builtins/OpeningHours.js +47 -0
  208. package/dist/blocks/builtins/OpeningHours.js.map +1 -0
  209. package/dist/blocks/builtins/PdfBlock.d.ts +2 -0
  210. package/dist/blocks/builtins/PdfBlock.js +97 -0
  211. package/dist/blocks/builtins/PdfBlock.js.map +1 -0
  212. package/dist/blocks/builtins/Portfolio.d.ts +2 -0
  213. package/dist/blocks/builtins/Portfolio.js +94 -0
  214. package/dist/blocks/builtins/Portfolio.js.map +1 -0
  215. package/dist/blocks/builtins/Pricing.d.ts +6 -0
  216. package/dist/blocks/builtins/Pricing.js +77 -0
  217. package/dist/blocks/builtins/Pricing.js.map +1 -0
  218. package/dist/blocks/builtins/RichTextBlock.d.ts +2 -0
  219. package/dist/blocks/builtins/RichTextBlock.js +18 -0
  220. package/dist/blocks/builtins/RichTextBlock.js.map +1 -0
  221. package/dist/blocks/builtins/Search.d.ts +2 -0
  222. package/dist/blocks/builtins/Search.js +99 -0
  223. package/dist/blocks/builtins/Search.js.map +1 -0
  224. package/dist/blocks/builtins/Sections.d.ts +5 -0
  225. package/dist/blocks/builtins/Sections.js +183 -0
  226. package/dist/blocks/builtins/Sections.js.map +1 -0
  227. package/dist/blocks/builtins/Slider.d.ts +2 -0
  228. package/dist/blocks/builtins/Slider.js +131 -0
  229. package/dist/blocks/builtins/Slider.js.map +1 -0
  230. package/dist/blocks/builtins/Spacer.d.ts +2 -0
  231. package/dist/blocks/builtins/Spacer.js +19 -0
  232. package/dist/blocks/builtins/Spacer.js.map +1 -0
  233. package/dist/blocks/builtins/Team.d.ts +2 -0
  234. package/dist/blocks/builtins/Team.js +70 -0
  235. package/dist/blocks/builtins/Team.js.map +1 -0
  236. package/dist/blocks/builtins/Testimonials.d.ts +8 -0
  237. package/dist/blocks/builtins/Testimonials.js +82 -0
  238. package/dist/blocks/builtins/Testimonials.js.map +1 -0
  239. package/dist/blocks/builtins/Video.d.ts +9 -0
  240. package/dist/blocks/builtins/Video.js +77 -0
  241. package/dist/blocks/builtins/Video.js.map +1 -0
  242. package/dist/blocks/builtins/WhatsappChat.d.ts +8 -0
  243. package/dist/blocks/builtins/WhatsappChat.js +51 -0
  244. package/dist/blocks/builtins/WhatsappChat.js.map +1 -0
  245. package/dist/blocks/builtins/Widgets.d.ts +13 -0
  246. package/dist/blocks/builtins/Widgets.js +308 -0
  247. package/dist/blocks/builtins/Widgets.js.map +1 -0
  248. package/dist/blocks/builtins/consentEmbed.d.ts +17 -0
  249. package/dist/blocks/builtins/consentEmbed.js +31 -0
  250. package/dist/blocks/builtins/consentEmbed.js.map +1 -0
  251. package/dist/blocks/builtins/index.d.ts +46 -0
  252. package/dist/blocks/builtins/index.js +121 -0
  253. package/dist/blocks/builtins/index.js.map +1 -0
  254. package/dist/blocks/builtins/lib/bookingUrl.d.ts +8 -0
  255. package/dist/blocks/builtins/lib/bookingUrl.js +50 -0
  256. package/dist/blocks/builtins/lib/bookingUrl.js.map +1 -0
  257. package/dist/blocks/builtins/lib/fileIcon.d.ts +2 -0
  258. package/dist/blocks/builtins/lib/fileIcon.js +45 -0
  259. package/dist/blocks/builtins/lib/fileIcon.js.map +1 -0
  260. package/dist/blocks/builtins/lib/ics.d.ts +17 -0
  261. package/dist/blocks/builtins/lib/ics.js +50 -0
  262. package/dist/blocks/builtins/lib/ics.js.map +1 -0
  263. package/dist/blocks/builtins/lib/openingHours.d.ts +20 -0
  264. package/dist/blocks/builtins/lib/openingHours.js +79 -0
  265. package/dist/blocks/builtins/lib/openingHours.js.map +1 -0
  266. package/dist/blocks/builtins/lib/searchRank.d.ts +22 -0
  267. package/dist/blocks/builtins/lib/searchRank.js +45 -0
  268. package/dist/blocks/builtins/lib/searchRank.js.map +1 -0
  269. package/dist/blocks/builtins/lib/submitForm.d.ts +6 -0
  270. package/dist/blocks/builtins/lib/submitForm.js +14 -0
  271. package/dist/blocks/builtins/lib/submitForm.js.map +1 -0
  272. package/dist/blocks/context.d.ts +8 -0
  273. package/dist/blocks/context.js +20 -0
  274. package/dist/blocks/context.js.map +1 -0
  275. package/dist/blocks/index.d.ts +9 -0
  276. package/dist/blocks/index.js +21 -0
  277. package/dist/blocks/index.js.map +1 -0
  278. package/dist/blocks/registry.d.ts +75 -0
  279. package/dist/blocks/registry.js +71 -0
  280. package/dist/blocks/registry.js.map +1 -0
  281. package/dist/blocks/ui/index.d.ts +35 -0
  282. package/dist/blocks/ui/index.js +48 -0
  283. package/dist/blocks/ui/index.js.map +1 -0
  284. package/dist/components/EditBar.d.ts +2 -0
  285. package/dist/components/EditBar.js +20 -0
  286. package/dist/components/EditBar.js.map +1 -0
  287. package/dist/components/EditableImage.d.ts +18 -0
  288. package/dist/components/EditableImage.js +62 -0
  289. package/dist/components/EditableImage.js.map +1 -0
  290. package/dist/components/EditableRichText.d.ts +14 -0
  291. package/dist/components/EditableRichText.js +26 -0
  292. package/dist/components/EditableRichText.js.map +1 -0
  293. package/dist/components/EditableText.d.ts +21 -0
  294. package/dist/components/EditableText.js +25 -0
  295. package/dist/components/EditableText.js.map +1 -0
  296. package/dist/components/News.d.ts +38 -0
  297. package/dist/components/News.js +128 -0
  298. package/dist/components/News.js.map +1 -0
  299. package/dist/components/PageView.d.ts +8 -0
  300. package/dist/components/PageView.js +28 -0
  301. package/dist/components/PageView.js.map +1 -0
  302. package/dist/components/ResponsiveImage.d.ts +16 -0
  303. package/dist/components/ResponsiveImage.js +39 -0
  304. package/dist/components/ResponsiveImage.js.map +1 -0
  305. package/dist/components/site/SiteFooter.d.ts +12 -0
  306. package/dist/components/site/SiteFooter.js +34 -0
  307. package/dist/components/site/SiteFooter.js.map +1 -0
  308. package/dist/config.d.ts +8 -0
  309. package/dist/config.js +17 -0
  310. package/dist/config.js.map +1 -0
  311. package/dist/content/ContentProvider.d.ts +23 -0
  312. package/dist/content/ContentProvider.js +86 -0
  313. package/dist/content/ContentProvider.js.map +1 -0
  314. package/dist/content/types.d.ts +41 -0
  315. package/dist/content/types.js +1 -0
  316. package/dist/content/types.js.map +1 -0
  317. package/dist/demo/DemoStudio.d.ts +7 -0
  318. package/dist/demo/DemoStudio.js +54 -0
  319. package/dist/demo/DemoStudio.js.map +1 -0
  320. package/dist/demo/demoStore.d.ts +26 -0
  321. package/dist/demo/demoStore.js +115 -0
  322. package/dist/demo/demoStore.js.map +1 -0
  323. package/dist/editor/EditorProvider.d.ts +12 -0
  324. package/dist/editor/EditorProvider.js +22 -0
  325. package/dist/editor/EditorProvider.js.map +1 -0
  326. package/dist/firebase/admin.d.ts +7 -0
  327. package/dist/firebase/admin.js +31 -0
  328. package/dist/firebase/admin.js.map +1 -0
  329. package/dist/firebase/appcheck.d.ts +6 -0
  330. package/dist/firebase/appcheck.js +23 -0
  331. package/dist/firebase/appcheck.js.map +1 -0
  332. package/dist/firebase/client.d.ts +9 -0
  333. package/dist/firebase/client.js +44 -0
  334. package/dist/firebase/client.js.map +1 -0
  335. package/dist/firebase/region.d.ts +5 -0
  336. package/dist/firebase/region.js +7 -0
  337. package/dist/firebase/region.js.map +1 -0
  338. package/dist/index.d.ts +54 -0
  339. package/dist/index.js +172 -0
  340. package/dist/index.js.map +1 -0
  341. package/dist/layers.css +13 -0
  342. package/dist/lock/DemoLock.d.ts +5 -0
  343. package/dist/lock/DemoLock.js +35 -0
  344. package/dist/lock/DemoLock.js.map +1 -0
  345. package/dist/media/ImageContext.d.ts +41 -0
  346. package/dist/media/ImageContext.js +74 -0
  347. package/dist/media/ImageContext.js.map +1 -0
  348. package/dist/modules/builtins.d.ts +46 -0
  349. package/dist/modules/builtins.js +462 -0
  350. package/dist/modules/builtins.js.map +1 -0
  351. package/dist/modules/consent/ConsentBanner.d.ts +42 -0
  352. package/dist/modules/consent/ConsentBanner.js +119 -0
  353. package/dist/modules/consent/ConsentBanner.js.map +1 -0
  354. package/dist/modules/consent/useConsent.d.ts +28 -0
  355. package/dist/modules/consent/useConsent.js +52 -0
  356. package/dist/modules/consent/useConsent.js.map +1 -0
  357. package/dist/modules/context.d.ts +20 -0
  358. package/dist/modules/context.js +31 -0
  359. package/dist/modules/context.js.map +1 -0
  360. package/dist/modules/contract.d.ts +9 -0
  361. package/dist/modules/contract.js +38 -0
  362. package/dist/modules/contract.js.map +1 -0
  363. package/dist/modules/defineModule.d.ts +11 -0
  364. package/dist/modules/defineModule.js +7 -0
  365. package/dist/modules/defineModule.js.map +1 -0
  366. package/dist/modules/index.d.ts +13 -0
  367. package/dist/modules/index.js +44 -0
  368. package/dist/modules/index.js.map +1 -0
  369. package/dist/modules/overrides.d.ts +17 -0
  370. package/dist/modules/overrides.js +25 -0
  371. package/dist/modules/overrides.js.map +1 -0
  372. package/dist/modules/registry.d.ts +40 -0
  373. package/dist/modules/registry.js +79 -0
  374. package/dist/modules/registry.js.map +1 -0
  375. package/dist/modules/types.d.ts +66 -0
  376. package/dist/modules/types.js +1 -0
  377. package/dist/modules/types.js.map +1 -0
  378. package/dist/patterns/builtins.d.ts +31 -0
  379. package/dist/patterns/builtins.js +415 -0
  380. package/dist/patterns/builtins.js.map +1 -0
  381. package/dist/patterns/index.d.ts +6 -0
  382. package/dist/patterns/index.js +9 -0
  383. package/dist/patterns/index.js.map +1 -0
  384. package/dist/patterns/patterns.d.ts +28 -0
  385. package/dist/patterns/patterns.js +53 -0
  386. package/dist/patterns/patterns.js.map +1 -0
  387. package/dist/render/PageRenderer.d.ts +13 -0
  388. package/dist/render/PageRenderer.js +14 -0
  389. package/dist/render/PageRenderer.js.map +1 -0
  390. package/dist/render/PublishedPage.d.ts +13 -0
  391. package/dist/render/PublishedPage.js +16 -0
  392. package/dist/render/PublishedPage.js.map +1 -0
  393. package/dist/schema/blocks.d.ts +15052 -0
  394. package/dist/schema/blocks.js +794 -0
  395. package/dist/schema/blocks.js.map +1 -0
  396. package/dist/schema/forms.d.ts +111 -0
  397. package/dist/schema/forms.js +47 -0
  398. package/dist/schema/forms.js.map +1 -0
  399. package/dist/schema/index.d.ts +11 -0
  400. package/dist/schema/index.js +16 -0
  401. package/dist/schema/index.js.map +1 -0
  402. package/dist/schema/pages.d.ts +674 -0
  403. package/dist/schema/pages.js +37 -0
  404. package/dist/schema/pages.js.map +1 -0
  405. package/dist/schema/seo.d.ts +29 -0
  406. package/dist/schema/seo.js +17 -0
  407. package/dist/schema/seo.js.map +1 -0
  408. package/dist/schema/settings.d.ts +1126 -0
  409. package/dist/schema/settings.js +128 -0
  410. package/dist/schema/settings.js.map +1 -0
  411. package/dist/schema/siteConfig.d.ts +722 -0
  412. package/dist/schema/siteConfig.js +39 -0
  413. package/dist/schema/siteConfig.js.map +1 -0
  414. package/dist/server/env.d.ts +10 -0
  415. package/dist/server/env.js +36 -0
  416. package/dist/server/env.js.map +1 -0
  417. package/dist/server/index.d.ts +10 -0
  418. package/dist/server/index.js +51 -0
  419. package/dist/server/index.js.map +1 -0
  420. package/dist/server/pages.d.ts +15 -0
  421. package/dist/server/pages.js +99 -0
  422. package/dist/server/pages.js.map +1 -0
  423. package/dist/server/sanitize.d.ts +2 -0
  424. package/dist/server/sanitize.js +55 -0
  425. package/dist/server/sanitize.js.map +1 -0
  426. package/dist/server/seo.d.ts +116 -0
  427. package/dist/server/seo.js +179 -0
  428. package/dist/server/seo.js.map +1 -0
  429. package/dist/settings/useSiteSettings.d.ts +25 -0
  430. package/dist/settings/useSiteSettings.js +68 -0
  431. package/dist/settings/useSiteSettings.js.map +1 -0
  432. package/dist/styles.css +2495 -0
  433. package/dist/theme/presets.d.ts +12 -0
  434. package/dist/theme/presets.js +147 -0
  435. package/dist/theme/presets.js.map +1 -0
  436. package/package.json +112 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/blocks/BlockErrorBoundary.tsx"],"sourcesContent":["\"use client\";\n\nimport { Component, type ErrorInfo, type ReactNode } from \"react\";\n\n/**\n * Vangt een fout in één block-Render op zodat één kapot block nooit de hele pagina sloopt\n * (foolproof: een editor kan geen content maken die de live site breekt).\n *\n * - `mode=\"view\"` (publiek): faalt stil — rendert niets, layout blijft intact.\n * - `mode=\"preview\"` (editor): toont een zichtbare foutkaart zodat de bewerker de breuk ziet.\n *\n * Let op de RSC-grens: een error-boundary is per definitie client (`componentDidCatch`). Daarom is\n * dit een client-leaf die per block om de Render heen wordt gezet; `BlockRenderer` zelf blijft\n * server-importeerbaar. Een fout die al tijdens server-rendering wordt gegooid valt buiten een\n * client-boundary — maar `validateBlocks` haalt schema-ongeldige content er server-side al uit, en\n * de meeste runtime-render-fouten (kapotte URL, client-hook) gebeuren client-side en worden hier\n * dus wél gevangen.\n */\ninterface Props {\n mode: \"view\" | \"preview\";\n type: string;\n blockKey: string;\n children: ReactNode;\n}\ninterface State {\n error: Error | null;\n}\n\nexport class BlockErrorBoundary extends Component<Props, State> {\n state: State = { error: null };\n\n static getDerivedStateFromError(error: Error): State {\n return { error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo): void {\n if (typeof console !== \"undefined\") {\n console.error(`[xicms] block \"${this.props.type}\" gaf een renderfout:`, error, info);\n }\n }\n\n componentDidUpdate(prev: Props): void {\n // Reset na een fix (ander block of ander type) zodat het block opnieuw probeert te renderen.\n if (this.state.error && (prev.blockKey !== this.props.blockKey || prev.type !== this.props.type)) {\n this.setState({ error: null });\n }\n }\n\n render(): ReactNode {\n if (this.state.error) {\n if (this.props.mode === \"preview\") {\n return (\n <div className=\"xicms-block-error\" role=\"alert\">\n <strong>Blok “{this.props.type}” kon niet worden weergegeven.</strong>\n <span>{this.state.error.message}</span>\n </div>\n );\n }\n // Publiek: stil falen, geen layout-verstoring.\n return null;\n }\n return this.props.children;\n }\n}\n"],"mappings":";AAqDY,SACA,KADA;AAnDZ,SAAS,iBAAiD;AA0BnD,MAAM,2BAA2B,UAAwB;AAAA,EAC9D,QAAe,EAAE,OAAO,KAAK;AAAA,EAE7B,OAAO,yBAAyB,OAAqB;AACnD,WAAO,EAAE,MAAM;AAAA,EACjB;AAAA,EAEA,kBAAkB,OAAc,MAAuB;AACrD,QAAI,OAAO,YAAY,aAAa;AAClC,cAAQ,MAAM,kBAAkB,KAAK,MAAM,IAAI,yBAAyB,OAAO,IAAI;AAAA,IACrF;AAAA,EACF;AAAA,EAEA,mBAAmB,MAAmB;AAEpC,QAAI,KAAK,MAAM,UAAU,KAAK,aAAa,KAAK,MAAM,YAAY,KAAK,SAAS,KAAK,MAAM,OAAO;AAChG,WAAK,SAAS,EAAE,OAAO,KAAK,CAAC;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,SAAoB;AAClB,QAAI,KAAK,MAAM,OAAO;AACpB,UAAI,KAAK,MAAM,SAAS,WAAW;AACjC,eACE,qBAAC,SAAI,WAAU,qBAAoB,MAAK,SACtC;AAAA,+BAAC,YAAO;AAAA;AAAA,YAAO,KAAK,MAAM;AAAA,YAAK;AAAA,aAA8B;AAAA,UAC7D,oBAAC,UAAM,eAAK,MAAM,MAAM,SAAQ;AAAA,WAClC;AAAA,MAEJ;AAEA,aAAO;AAAA,IACT;AACA,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;","names":[]}
@@ -0,0 +1,15 @@
1
+ import { type BlockRegistry } from "./registry";
2
+ /**
3
+ * Rendert een blocks-array via de registry. Server-safe (geen "use client"): bruikbaar in
4
+ * React Server Components én client. Geef de registry expliciet mee (zo werkt server-rendering);
5
+ * client-componenten kunnen `useRegistry()` gebruiken om hem te verkrijgen.
6
+ *
7
+ * Elk block wordt in een `BlockErrorBoundary` gewikkeld zodat één kapot block nooit de hele
8
+ * pagina sloopt (foolproof).
9
+ */
10
+ export declare function BlockRenderer({ blocks, registry, siteId, mode, }: {
11
+ blocks: unknown[] | undefined;
12
+ registry: BlockRegistry;
13
+ siteId: string;
14
+ mode?: "view" | "preview";
15
+ }): import("react").JSX.Element;
@@ -0,0 +1,24 @@
1
+ import { Fragment, jsx } from "react/jsx-runtime";
2
+ import { validateBlocks } from "./registry";
3
+ import { BlockErrorBoundary } from "./BlockErrorBoundary";
4
+ import { blockStyleAttrs } from "./blockStyle";
5
+ function BlockRenderer({
6
+ blocks,
7
+ registry,
8
+ siteId,
9
+ mode = "view"
10
+ }) {
11
+ const valid = validateBlocks(blocks, registry);
12
+ return /* @__PURE__ */ jsx(Fragment, { children: valid.map((b) => {
13
+ const def = registry.get(b._type);
14
+ if (!def) return null;
15
+ const Render = def.Render;
16
+ const attrs = blockStyleAttrs(b._style);
17
+ const rendered = /* @__PURE__ */ jsx(Render, { block: b, siteId, mode });
18
+ return /* @__PURE__ */ jsx(BlockErrorBoundary, { mode, type: b._type, blockKey: b._key, children: attrs ? /* @__PURE__ */ jsx("div", { id: attrs.id, className: attrs.className, style: attrs.style, "data-xicms-animate": attrs.dataAnimate, children: rendered }) : rendered }, b._key);
19
+ }) });
20
+ }
21
+ export {
22
+ BlockRenderer
23
+ };
24
+ //# sourceMappingURL=BlockRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/blocks/BlockRenderer.tsx"],"sourcesContent":["import { validateBlocks, type BlockRegistry } from \"./registry\";\nimport { BlockErrorBoundary } from \"./BlockErrorBoundary\";\nimport { blockStyleAttrs } from \"./blockStyle\";\nimport type { BlockStyle } from \"../schema/blocks\";\n\n/**\n * Rendert een blocks-array via de registry. Server-safe (geen \"use client\"): bruikbaar in\n * React Server Components én client. Geef de registry expliciet mee (zo werkt server-rendering);\n * client-componenten kunnen `useRegistry()` gebruiken om hem te verkrijgen.\n *\n * Elk block wordt in een `BlockErrorBoundary` gewikkeld zodat één kapot block nooit de hele\n * pagina sloopt (foolproof).\n */\nexport function BlockRenderer({\n blocks,\n registry,\n siteId,\n mode = \"view\",\n}: {\n blocks: unknown[] | undefined;\n registry: BlockRegistry;\n siteId: string;\n mode?: \"view\" | \"preview\";\n}) {\n const valid = validateBlocks(blocks, registry);\n return (\n <>\n {valid.map((b) => {\n const def = registry.get(b._type);\n if (!def) return null;\n const Render = def.Render;\n // Gedeelde blokstijl (ruimte/achtergrond/breedte/uitlijning/anker) centraal toepassen.\n const attrs = blockStyleAttrs((b as { _style?: BlockStyle })._style);\n const rendered = <Render block={b} siteId={siteId} mode={mode} />;\n return (\n <BlockErrorBoundary key={b._key} mode={mode} type={b._type} blockKey={b._key}>\n {attrs ? (\n <div id={attrs.id} className={attrs.className} style={attrs.style} data-xicms-animate={attrs.dataAnimate}>\n {rendered}\n </div>\n ) : (\n rendered\n )}\n </BlockErrorBoundary>\n );\n })}\n </>\n );\n}\n"],"mappings":"AA0BI,mBAOqB,WAPrB;AA1BJ,SAAS,sBAA0C;AACnD,SAAS,0BAA0B;AACnC,SAAS,uBAAuB;AAWzB,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AACT,GAKG;AACD,QAAM,QAAQ,eAAe,QAAQ,QAAQ;AAC7C,SACE,gCACG,gBAAM,IAAI,CAAC,MAAM;AAChB,UAAM,MAAM,SAAS,IAAI,EAAE,KAAK;AAChC,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,SAAS,IAAI;AAEnB,UAAM,QAAQ,gBAAiB,EAA8B,MAAM;AACnE,UAAM,WAAW,oBAAC,UAAO,OAAO,GAAG,QAAgB,MAAY;AAC/D,WACE,oBAAC,sBAAgC,MAAY,MAAM,EAAE,OAAO,UAAU,EAAE,MACrE,kBACC,oBAAC,SAAI,IAAI,MAAM,IAAI,WAAW,MAAM,WAAW,OAAO,MAAM,OAAO,sBAAoB,MAAM,aAC1F,oBACH,IAEA,YANqB,EAAE,IAQ3B;AAAA,EAEJ,CAAC,GACH;AAEJ;","names":[]}
@@ -0,0 +1,14 @@
1
+ import type { CSSProperties } from "react";
2
+ import type { BlockStyle } from "../schema/blocks";
3
+ export interface BlockStyleAttrs {
4
+ id?: string;
5
+ className: string;
6
+ style: CSSProperties;
7
+ dataAnimate?: string;
8
+ }
9
+ /**
10
+ * Vertaalt de gedeelde `_style` van een block naar wrapper-attributen. Gebruikt classNames +
11
+ * CSS-variabelen (te overschrijven per site) en alleen inline-CSS waar een vrije waarde nodig is
12
+ * (achtergrondkleur). Geeft `null` terug als er niets te stylen valt (dan rendert het block kaal).
13
+ */
14
+ export declare function blockStyleAttrs(style: BlockStyle | undefined): BlockStyleAttrs | null;
@@ -0,0 +1,14 @@
1
+ function blockStyleAttrs(style) {
2
+ if (!style || Object.keys(style).length === 0) return null;
3
+ const cls = ["xicms-block"];
4
+ if (style.paddingY) cls.push(`xicms-block--pad-${style.paddingY}`);
5
+ if (style.width) cls.push(`xicms-block--${style.width}`);
6
+ if (style.align) cls.push(`xicms-block--align-${style.align}`);
7
+ const css = {};
8
+ if (style.background) css.background = style.background;
9
+ return { id: style.anchorId || void 0, className: cls.join(" "), style: css, dataAnimate: style.animate };
10
+ }
11
+ export {
12
+ blockStyleAttrs
13
+ };
14
+ //# sourceMappingURL=blockStyle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/blocks/blockStyle.ts"],"sourcesContent":["import type { CSSProperties } from \"react\";\nimport type { BlockStyle } from \"../schema/blocks\";\n\nexport interface BlockStyleAttrs {\n id?: string;\n className: string;\n style: CSSProperties;\n dataAnimate?: string;\n}\n\n/**\n * Vertaalt de gedeelde `_style` van een block naar wrapper-attributen. Gebruikt classNames +\n * CSS-variabelen (te overschrijven per site) en alleen inline-CSS waar een vrije waarde nodig is\n * (achtergrondkleur). Geeft `null` terug als er niets te stylen valt (dan rendert het block kaal).\n */\nexport function blockStyleAttrs(style: BlockStyle | undefined): BlockStyleAttrs | null {\n if (!style || Object.keys(style).length === 0) return null;\n const cls = [\"xicms-block\"];\n if (style.paddingY) cls.push(`xicms-block--pad-${style.paddingY}`);\n if (style.width) cls.push(`xicms-block--${style.width}`);\n if (style.align) cls.push(`xicms-block--align-${style.align}`);\n const css: CSSProperties = {};\n if (style.background) css.background = style.background;\n return { id: style.anchorId || undefined, className: cls.join(\" \"), style: css, dataAnimate: style.animate };\n}\n"],"mappings":"AAeO,SAAS,gBAAgB,OAAuD;AACrF,MAAI,CAAC,SAAS,OAAO,KAAK,KAAK,EAAE,WAAW,EAAG,QAAO;AACtD,QAAM,MAAM,CAAC,aAAa;AAC1B,MAAI,MAAM,SAAU,KAAI,KAAK,oBAAoB,MAAM,QAAQ,EAAE;AACjE,MAAI,MAAM,MAAO,KAAI,KAAK,gBAAgB,MAAM,KAAK,EAAE;AACvD,MAAI,MAAM,MAAO,KAAI,KAAK,sBAAsB,MAAM,KAAK,EAAE;AAC7D,QAAM,MAAqB,CAAC;AAC5B,MAAI,MAAM,WAAY,KAAI,aAAa,MAAM;AAC7C,SAAO,EAAE,IAAI,MAAM,YAAY,QAAW,WAAW,IAAI,KAAK,GAAG,GAAG,OAAO,KAAK,aAAa,MAAM,QAAQ;AAC7G;","names":[]}
@@ -0,0 +1,2 @@
1
+ import type { z } from "zod";
2
+ export declare const accordionBlock: import("..").BlockDefinition<z.ZodTypeAny>;
@@ -0,0 +1,45 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { AccordionBlockSchema } from "../../schema/blocks";
5
+ import { defineBlock } from "../registry";
6
+ import { Collapsible } from "@astryxdesign/core/Collapsible";
7
+ import { VStack, Heading, Text } from "../ui";
8
+ function AccordionRender({ block }) {
9
+ const items = (block.items ?? []).filter((i) => i.title);
10
+ const [openIdx, setOpenIdx] = useState(null);
11
+ if (items.length === 0) return null;
12
+ return /* @__PURE__ */ jsxs(VStack, { gap: 3, as: "section", className: "xicms-accordion", children: [
13
+ block.heading && /* @__PURE__ */ jsx(Heading, { level: 2, "data-xicms-edit": "heading", children: block.heading }),
14
+ /* @__PURE__ */ jsx(VStack, { gap: 1.5, children: items.map((it, i) => {
15
+ const body = it.bodyHtml ? (
16
+ // Server-side gesanitized bij publiceren (*Html-velden) — zie functions/lib/sanitize.
17
+ // eslint-disable-next-line react/no-danger
18
+ /* @__PURE__ */ jsx("div", { className: "xicms-richtext", dangerouslySetInnerHTML: { __html: it.bodyHtml } })
19
+ ) : /* @__PURE__ */ jsx(Text, { color: "secondary", children: it.body });
20
+ const trigger = /* @__PURE__ */ jsx(Text, { weight: "bold", children: it.title });
21
+ return block.multiple ? /* @__PURE__ */ jsx(Collapsible, { trigger, defaultIsOpen: false, children: body }, i) : /* @__PURE__ */ jsx(
22
+ Collapsible,
23
+ {
24
+ trigger,
25
+ isOpen: openIdx === i,
26
+ onOpenChange: (o) => setOpenIdx(o ? i : null),
27
+ children: body
28
+ },
29
+ i
30
+ );
31
+ }) })
32
+ ] });
33
+ }
34
+ const accordionBlock = defineBlock({
35
+ type: "accordion",
36
+ schema: AccordionBlockSchema,
37
+ Render: AccordionRender,
38
+ label: "Accordeon",
39
+ icon: "\u{1FA97}",
40
+ defaults: () => ({ items: [{ title: "Titel", body: "Inhoud\u2026" }], multiple: false })
41
+ });
42
+ export {
43
+ accordionBlock
44
+ };
45
+ //# sourceMappingURL=Accordion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/blocks/builtins/Accordion.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport type { z } from \"zod\";\nimport { AccordionBlockSchema } from \"../../schema/blocks\";\nimport { defineBlock, type BlockRenderProps } from \"../registry\";\nimport { Collapsible } from \"@astryxdesign/core/Collapsible\";\nimport { VStack, Heading, Text } from \"../ui\";\n\ntype Accordion = z.infer<typeof AccordionBlockSchema>;\n\n/** Accordeon op Astryx Collapsible. Bij `multiple: false` is er max. één paneel tegelijk open. */\nfunction AccordionRender({ block }: BlockRenderProps<Accordion>) {\n const items = (block.items ?? []).filter((i) => i.title);\n const [openIdx, setOpenIdx] = useState<number | null>(null);\n if (items.length === 0) return null;\n return (\n <VStack gap={3} as=\"section\" className=\"xicms-accordion\">\n {block.heading && <Heading level={2} data-xicms-edit=\"heading\">{block.heading}</Heading>}\n <VStack gap={1.5}>\n {items.map((it, i) => {\n const body = it.bodyHtml ? (\n // Server-side gesanitized bij publiceren (*Html-velden) — zie functions/lib/sanitize.\n // eslint-disable-next-line react/no-danger\n <div className=\"xicms-richtext\" dangerouslySetInnerHTML={{ __html: it.bodyHtml }} />\n ) : (\n <Text color=\"secondary\">{it.body}</Text>\n );\n const trigger = <Text weight=\"bold\">{it.title}</Text>;\n return block.multiple ? (\n <Collapsible key={i} trigger={trigger} defaultIsOpen={false}>{body}</Collapsible>\n ) : (\n <Collapsible\n key={i}\n trigger={trigger}\n isOpen={openIdx === i}\n onOpenChange={(o) => setOpenIdx(o ? i : null)}\n >\n {body}\n </Collapsible>\n );\n })}\n </VStack>\n </VStack>\n );\n}\n\nexport const accordionBlock = defineBlock({\n type: \"accordion\",\n schema: AccordionBlockSchema,\n Render: AccordionRender,\n label: \"Accordeon\",\n icon: \"🪗\",\n defaults: () => ({ items: [{ title: \"Titel\", body: \"Inhoud…\" }], multiple: false }),\n});\n"],"mappings":";AAiBI,SACoB,KADpB;AAfJ,SAAS,gBAAgB;AAEzB,SAAS,4BAA4B;AACrC,SAAS,mBAA0C;AACnD,SAAS,mBAAmB;AAC5B,SAAS,QAAQ,SAAS,YAAY;AAKtC,SAAS,gBAAgB,EAAE,MAAM,GAAgC;AAC/D,QAAM,SAAS,MAAM,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK;AACvD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAwB,IAAI;AAC1D,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SACE,qBAAC,UAAO,KAAK,GAAG,IAAG,WAAU,WAAU,mBACpC;AAAA,UAAM,WAAW,oBAAC,WAAQ,OAAO,GAAG,mBAAgB,WAAW,gBAAM,SAAQ;AAAA,IAC9E,oBAAC,UAAO,KAAK,KACV,gBAAM,IAAI,CAAC,IAAI,MAAM;AACpB,YAAM,OAAO,GAAG;AAAA;AAAA;AAAA,QAGd,oBAAC,SAAI,WAAU,kBAAiB,yBAAyB,EAAE,QAAQ,GAAG,SAAS,GAAG;AAAA,UAElF,oBAAC,QAAK,OAAM,aAAa,aAAG,MAAK;AAEnC,YAAM,UAAU,oBAAC,QAAK,QAAO,QAAQ,aAAG,OAAM;AAC9C,aAAO,MAAM,WACX,oBAAC,eAAoB,SAAkB,eAAe,OAAQ,kBAA5C,CAAiD,IAEnE;AAAA,QAAC;AAAA;AAAA,UAEC;AAAA,UACA,QAAQ,YAAY;AAAA,UACpB,cAAc,CAAC,MAAM,WAAW,IAAI,IAAI,IAAI;AAAA,UAE3C;AAAA;AAAA,QALI;AAAA,MAMP;AAAA,IAEJ,CAAC,GACH;AAAA,KACF;AAEJ;AAEO,MAAM,iBAAiB,YAAY;AAAA,EACxC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,SAAS,MAAM,eAAU,CAAC,GAAG,UAAU,MAAM;AACnF,CAAC;","names":[]}
@@ -0,0 +1,23 @@
1
+ import type { z } from "zod";
2
+ /** Eén event zoals zowel het Agenda-blok als de Agenda-widget het kennen. */
3
+ export interface AgendaEvent {
4
+ title: string;
5
+ start: string;
6
+ end?: string;
7
+ location?: string;
8
+ description?: string;
9
+ url?: string;
10
+ }
11
+ /** Toont een datum leesbaar (nl-NL). Valt terug op de ruwe string bij ongeldige invoer. */
12
+ export declare function formatEventDate(value: string): string;
13
+ /**
14
+ * Selecteert de te tonen events: filtert lege titels, optioneel verlopen events, sorteert
15
+ * chronologisch (events zonder geldige datum achteraan, in invoervolgorde) en limiteert. Gedeeld
16
+ * door het volwaardige Agenda-blok en de compacte Agenda-widget — zo "haalt" de widget alles
17
+ * uit dezelfde logica als de volledige versie.
18
+ */
19
+ export declare function selectAgendaEvents<T extends AgendaEvent>(events: T[] | undefined, opts?: {
20
+ hidePast?: boolean;
21
+ limit?: number;
22
+ }): T[];
23
+ export declare const agendaBlock: import("..").BlockDefinition<z.ZodTypeAny>;
@@ -0,0 +1,102 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { AgendaBlockSchema } from "../../schema/blocks";
3
+ import { defineBlock } from "../registry";
4
+ import { Heading } from "../ui";
5
+ import { icsDataUrl } from "./lib/ics";
6
+ function formatEventDate(value) {
7
+ if (!value) return "";
8
+ const d = new Date(value);
9
+ if (Number.isNaN(d.getTime())) return value;
10
+ const hasTime = value.includes("T");
11
+ return d.toLocaleDateString("nl-NL", {
12
+ weekday: "short",
13
+ day: "numeric",
14
+ month: "long",
15
+ year: "numeric",
16
+ ...hasTime ? { hour: "2-digit", minute: "2-digit" } : {}
17
+ });
18
+ }
19
+ function selectAgendaEvents(events, opts = {}) {
20
+ let list = (events ?? []).filter((e) => e.title);
21
+ if (opts.hidePast) {
22
+ const today = /* @__PURE__ */ new Date();
23
+ today.setHours(0, 0, 0, 0);
24
+ list = list.filter((e) => {
25
+ const d = new Date(e.end || e.start);
26
+ return Number.isNaN(d.getTime()) || d >= today;
27
+ });
28
+ }
29
+ list = [...list].sort((a, b) => {
30
+ const ta = new Date(a.start).getTime();
31
+ const tb = new Date(b.start).getTime();
32
+ if (Number.isNaN(ta) && Number.isNaN(tb)) return 0;
33
+ if (Number.isNaN(ta)) return 1;
34
+ if (Number.isNaN(tb)) return -1;
35
+ return ta - tb;
36
+ });
37
+ return typeof opts.limit === "number" ? list.slice(0, opts.limit) : list;
38
+ }
39
+ function eventJsonLd(events) {
40
+ return {
41
+ "@context": "https://schema.org",
42
+ "@type": "ItemList",
43
+ itemListElement: events.filter((e) => e.title && e.start).map((e, i) => ({
44
+ "@type": "ListItem",
45
+ position: i + 1,
46
+ item: {
47
+ "@type": "Event",
48
+ name: e.title,
49
+ startDate: e.start,
50
+ ...e.end ? { endDate: e.end } : {},
51
+ ...e.location ? { location: { "@type": "Place", name: e.location } } : {},
52
+ ...e.description ? { description: e.description } : {},
53
+ ...e.url ? { url: e.url } : {}
54
+ }
55
+ }))
56
+ };
57
+ }
58
+ function AgendaRender({ block }) {
59
+ const events = selectAgendaEvents(block.events, { hidePast: block.hidePast });
60
+ if (events.length === 0) return null;
61
+ return /* @__PURE__ */ jsxs("section", { className: "xicms-agenda", children: [
62
+ block.heading && /* @__PURE__ */ jsx(Heading, { level: 2, "data-xicms-edit": "heading", children: block.heading }),
63
+ /* @__PURE__ */ jsx("ul", { className: "xicms-agenda__list", children: events.map((e, i) => /* @__PURE__ */ jsxs("li", { className: "xicms-agenda__item", children: [
64
+ /* @__PURE__ */ jsx("time", { className: "xicms-agenda__date", dateTime: e.start, children: formatEventDate(e.start) }),
65
+ /* @__PURE__ */ jsxs("div", { className: "xicms-agenda__body", children: [
66
+ /* @__PURE__ */ jsx("strong", { className: "xicms-agenda__title", children: e.url ? /* @__PURE__ */ jsx("a", { href: e.url, children: e.title }) : e.title }),
67
+ e.location && /* @__PURE__ */ jsx("span", { className: "xicms-agenda__location", children: e.location }),
68
+ e.description && /* @__PURE__ */ jsx("p", { className: "xicms-agenda__desc", children: e.description }),
69
+ (() => {
70
+ const ics = icsDataUrl(e);
71
+ return ics ? /* @__PURE__ */ jsx("a", { className: "xicms-agenda__ics", href: ics, download: `${(e.title || "evenement").toLowerCase().replace(/\s+/g, "-").slice(0, 40)}.ics`, children: "\u{1F4C5} Zet in agenda" }) : null;
72
+ })()
73
+ ] })
74
+ ] }, i)) }),
75
+ block.jsonLd && /* @__PURE__ */ jsx(
76
+ "script",
77
+ {
78
+ type: "application/ld+json",
79
+ dangerouslySetInnerHTML: { __html: JSON.stringify(eventJsonLd(events)) }
80
+ }
81
+ )
82
+ ] });
83
+ }
84
+ const agendaBlock = defineBlock({
85
+ type: "agenda",
86
+ schema: AgendaBlockSchema,
87
+ Render: AgendaRender,
88
+ label: "Agenda",
89
+ icon: "\u{1F4C5}",
90
+ defaults: () => ({
91
+ heading: "Agenda",
92
+ events: [{ title: "Evenement", start: "" }],
93
+ hidePast: true,
94
+ jsonLd: true
95
+ })
96
+ });
97
+ export {
98
+ agendaBlock,
99
+ formatEventDate,
100
+ selectAgendaEvents
101
+ };
102
+ //# sourceMappingURL=Agenda.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/blocks/builtins/Agenda.tsx"],"sourcesContent":["import type { z } from \"zod\";\nimport { AgendaBlockSchema } from \"../../schema/blocks\";\nimport { defineBlock, type BlockRenderProps } from \"../registry\";\nimport { Heading } from \"../ui\";\nimport { icsDataUrl } from \"./lib/ics\";\n\ntype Agenda = z.infer<typeof AgendaBlockSchema>;\n\n/** Eén event zoals zowel het Agenda-blok als de Agenda-widget het kennen. */\nexport interface AgendaEvent {\n title: string;\n start: string;\n end?: string;\n location?: string;\n description?: string;\n url?: string;\n}\n\n/** Toont een datum leesbaar (nl-NL). Valt terug op de ruwe string bij ongeldige invoer. */\nexport function formatEventDate(value: string): string {\n if (!value) return \"\";\n const d = new Date(value);\n if (Number.isNaN(d.getTime())) return value;\n const hasTime = value.includes(\"T\");\n return d.toLocaleDateString(\"nl-NL\", {\n weekday: \"short\",\n day: \"numeric\",\n month: \"long\",\n year: \"numeric\",\n ...(hasTime ? { hour: \"2-digit\", minute: \"2-digit\" } : {}),\n });\n}\n\n/**\n * Selecteert de te tonen events: filtert lege titels, optioneel verlopen events, sorteert\n * chronologisch (events zonder geldige datum achteraan, in invoervolgorde) en limiteert. Gedeeld\n * door het volwaardige Agenda-blok en de compacte Agenda-widget — zo \"haalt\" de widget alles\n * uit dezelfde logica als de volledige versie.\n */\nexport function selectAgendaEvents<T extends AgendaEvent>(\n events: T[] | undefined,\n opts: { hidePast?: boolean; limit?: number } = {},\n): T[] {\n let list = (events ?? []).filter((e) => e.title);\n if (opts.hidePast) {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n list = list.filter((e) => {\n const d = new Date(e.end || e.start);\n return Number.isNaN(d.getTime()) || d >= today;\n });\n }\n list = [...list].sort((a, b) => {\n const ta = new Date(a.start).getTime();\n const tb = new Date(b.start).getTime();\n if (Number.isNaN(ta) && Number.isNaN(tb)) return 0;\n if (Number.isNaN(ta)) return 1;\n if (Number.isNaN(tb)) return -1;\n return ta - tb;\n });\n return typeof opts.limit === \"number\" ? list.slice(0, opts.limit) : list;\n}\n\nfunction eventJsonLd(events: Agenda[\"events\"]): Record<string, unknown> {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"ItemList\",\n itemListElement: events\n .filter((e) => e.title && e.start)\n .map((e, i) => ({\n \"@type\": \"ListItem\",\n position: i + 1,\n item: {\n \"@type\": \"Event\",\n name: e.title,\n startDate: e.start,\n ...(e.end ? { endDate: e.end } : {}),\n ...(e.location ? { location: { \"@type\": \"Place\", name: e.location } } : {}),\n ...(e.description ? { description: e.description } : {}),\n ...(e.url ? { url: e.url } : {}),\n },\n })),\n };\n}\n\n/** Agenda/evenementen. Server-safe (geen client-state); `hidePast` filtert verlopen events. */\nfunction AgendaRender({ block }: BlockRenderProps<Agenda>) {\n const events = selectAgendaEvents(block.events, { hidePast: block.hidePast });\n if (events.length === 0) return null;\n\n return (\n <section className=\"xicms-agenda\">\n {/* Alleen de kop is inline bewerkbaar: de items worden gefilterd/gesorteerd, dus hun\n render-index wijst niet betrouwbaar naar block.events[i]. */}\n {block.heading && <Heading level={2} data-xicms-edit=\"heading\">{block.heading}</Heading>}\n <ul className=\"xicms-agenda__list\">\n {events.map((e, i) => (\n <li key={i} className=\"xicms-agenda__item\">\n <time className=\"xicms-agenda__date\" dateTime={e.start}>\n {formatEventDate(e.start)}\n </time>\n <div className=\"xicms-agenda__body\">\n <strong className=\"xicms-agenda__title\">\n {e.url ? <a href={e.url}>{e.title}</a> : e.title}\n </strong>\n {e.location && <span className=\"xicms-agenda__location\">{e.location}</span>}\n {e.description && <p className=\"xicms-agenda__desc\">{e.description}</p>}\n {(() => {\n const ics = icsDataUrl(e);\n return ics ? (\n <a className=\"xicms-agenda__ics\" href={ics} download={`${(e.title || \"evenement\").toLowerCase().replace(/\\s+/g, \"-\").slice(0, 40)}.ics`}>\n 📅 Zet in agenda\n </a>\n ) : null;\n })()}\n </div>\n </li>\n ))}\n </ul>\n {block.jsonLd && (\n <script\n type=\"application/ld+json\"\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{ __html: JSON.stringify(eventJsonLd(events)) }}\n />\n )}\n </section>\n );\n}\n\nexport const agendaBlock = defineBlock({\n type: \"agenda\",\n schema: AgendaBlockSchema,\n Render: AgendaRender,\n label: \"Agenda\",\n icon: \"📅\",\n defaults: () => ({\n heading: \"Agenda\",\n events: [{ title: \"Evenement\", start: \"\" }],\n hidePast: true,\n jsonLd: true,\n }),\n});\n"],"mappings":"AA8FwB,cAOZ,YAPY;AA7FxB,SAAS,yBAAyB;AAClC,SAAS,mBAA0C;AACnD,SAAS,eAAe;AACxB,SAAS,kBAAkB;AAepB,SAAS,gBAAgB,OAAuB;AACrD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,IAAI,IAAI,KAAK,KAAK;AACxB,MAAI,OAAO,MAAM,EAAE,QAAQ,CAAC,EAAG,QAAO;AACtC,QAAM,UAAU,MAAM,SAAS,GAAG;AAClC,SAAO,EAAE,mBAAmB,SAAS;AAAA,IACnC,SAAS;AAAA,IACT,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,GAAI,UAAU,EAAE,MAAM,WAAW,QAAQ,UAAU,IAAI,CAAC;AAAA,EAC1D,CAAC;AACH;AAQO,SAAS,mBACd,QACA,OAA+C,CAAC,GAC3C;AACL,MAAI,QAAQ,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK;AAC/C,MAAI,KAAK,UAAU;AACjB,UAAM,QAAQ,oBAAI,KAAK;AACvB,UAAM,SAAS,GAAG,GAAG,GAAG,CAAC;AACzB,WAAO,KAAK,OAAO,CAAC,MAAM;AACxB,YAAM,IAAI,IAAI,KAAK,EAAE,OAAO,EAAE,KAAK;AACnC,aAAO,OAAO,MAAM,EAAE,QAAQ,CAAC,KAAK,KAAK;AAAA,IAC3C,CAAC;AAAA,EACH;AACA,SAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM;AAC9B,UAAM,KAAK,IAAI,KAAK,EAAE,KAAK,EAAE,QAAQ;AACrC,UAAM,KAAK,IAAI,KAAK,EAAE,KAAK,EAAE,QAAQ;AACrC,QAAI,OAAO,MAAM,EAAE,KAAK,OAAO,MAAM,EAAE,EAAG,QAAO;AACjD,QAAI,OAAO,MAAM,EAAE,EAAG,QAAO;AAC7B,QAAI,OAAO,MAAM,EAAE,EAAG,QAAO;AAC7B,WAAO,KAAK;AAAA,EACd,CAAC;AACD,SAAO,OAAO,KAAK,UAAU,WAAW,KAAK,MAAM,GAAG,KAAK,KAAK,IAAI;AACtE;AAEA,SAAS,YAAY,QAAmD;AACtE,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,iBAAiB,OACd,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAChC,IAAI,CAAC,GAAG,OAAO;AAAA,MACd,SAAS;AAAA,MACT,UAAU,IAAI;AAAA,MACd,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,MAAM,EAAE;AAAA,QACR,WAAW,EAAE;AAAA,QACb,GAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC;AAAA,QAClC,GAAI,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,SAAS,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC;AAAA,QACzE,GAAI,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,IAAI,CAAC;AAAA,QACtD,GAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC;AAAA,MAChC;AAAA,IACF,EAAE;AAAA,EACN;AACF;AAGA,SAAS,aAAa,EAAE,MAAM,GAA6B;AACzD,QAAM,SAAS,mBAAmB,MAAM,QAAQ,EAAE,UAAU,MAAM,SAAS,CAAC;AAC5E,MAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,SACE,qBAAC,aAAQ,WAAU,gBAGhB;AAAA,UAAM,WAAW,oBAAC,WAAQ,OAAO,GAAG,mBAAgB,WAAW,gBAAM,SAAQ;AAAA,IAC9E,oBAAC,QAAG,WAAU,sBACX,iBAAO,IAAI,CAAC,GAAG,MACd,qBAAC,QAAW,WAAU,sBACpB;AAAA,0BAAC,UAAK,WAAU,sBAAqB,UAAU,EAAE,OAC9C,0BAAgB,EAAE,KAAK,GAC1B;AAAA,MACA,qBAAC,SAAI,WAAU,sBACb;AAAA,4BAAC,YAAO,WAAU,uBACf,YAAE,MAAM,oBAAC,OAAE,MAAM,EAAE,KAAM,YAAE,OAAM,IAAO,EAAE,OAC7C;AAAA,QACC,EAAE,YAAY,oBAAC,UAAK,WAAU,0BAA0B,YAAE,UAAS;AAAA,QACnE,EAAE,eAAe,oBAAC,OAAE,WAAU,sBAAsB,YAAE,aAAY;AAAA,SACjE,MAAM;AACN,gBAAM,MAAM,WAAW,CAAC;AACxB,iBAAO,MACL,oBAAC,OAAE,WAAU,qBAAoB,MAAM,KAAK,UAAU,IAAI,EAAE,SAAS,aAAa,YAAY,EAAE,QAAQ,QAAQ,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,QAAQ,qCAEzI,IACE;AAAA,QACN,GAAG;AAAA,SACL;AAAA,SAlBO,CAmBT,CACD,GACH;AAAA,IACC,MAAM,UACL;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QAEL,yBAAyB,EAAE,QAAQ,KAAK,UAAU,YAAY,MAAM,CAAC,EAAE;AAAA;AAAA,IACzE;AAAA,KAEJ;AAEJ;AAEO,MAAM,cAAc,YAAY;AAAA,EACrC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO;AAAA,IACf,SAAS;AAAA,IACT,QAAQ,CAAC,EAAE,OAAO,aAAa,OAAO,GAAG,CAAC;AAAA,IAC1C,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AACF,CAAC;","names":[]}
@@ -0,0 +1,2 @@
1
+ import type { z } from "zod";
2
+ export declare const bannerBlock: import("..").BlockDefinition<z.ZodTypeAny>;
@@ -0,0 +1,45 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useState } from "react";
4
+ import { BannerBlockSchema } from "../../schema/blocks";
5
+ import { defineBlock } from "../registry";
6
+ function storageKey(block) {
7
+ return `xicms-banner:${block._key}${block.dismissVersion ? `:${block.dismissVersion}` : ""}`;
8
+ }
9
+ function BannerRender({ block, mode }) {
10
+ const [closed, setClosed] = useState(false);
11
+ useEffect(() => {
12
+ if (mode === "preview" || !block.dismissible) return;
13
+ try {
14
+ if (window.localStorage.getItem(storageKey(block)) === "1") setClosed(true);
15
+ } catch {
16
+ }
17
+ }, [block, mode]);
18
+ const dismiss = () => {
19
+ setClosed(true);
20
+ try {
21
+ window.localStorage.setItem(storageKey(block), "1");
22
+ } catch {
23
+ }
24
+ };
25
+ if (!block.text || closed && mode !== "preview") return null;
26
+ return /* @__PURE__ */ jsxs("div", { className: "xicms-banner", "data-tone": block.tone, role: "region", "aria-label": "Aankondiging", children: [
27
+ /* @__PURE__ */ jsxs("span", { children: [
28
+ /* @__PURE__ */ jsx("span", { "data-xicms-edit": "text", children: block.text }),
29
+ block.href && /* @__PURE__ */ jsx("a", { className: "xicms-banner__link", href: block.href, children: block.linkLabel ?? "Meer" })
30
+ ] }),
31
+ block.dismissible && /* @__PURE__ */ jsx("button", { type: "button", className: "xicms-banner__close", "aria-label": "Sluiten", onClick: dismiss, children: "\u2715" })
32
+ ] });
33
+ }
34
+ const bannerBlock = defineBlock({
35
+ type: "banner",
36
+ schema: BannerBlockSchema,
37
+ Render: BannerRender,
38
+ label: "Aankondiging",
39
+ icon: "\u{1F4E2}",
40
+ defaults: () => ({ text: "Nieuw: \u2026", tone: "info", dismissible: true })
41
+ });
42
+ export {
43
+ bannerBlock
44
+ };
45
+ //# sourceMappingURL=Banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/blocks/builtins/Banner.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport type { z } from \"zod\";\nimport { BannerBlockSchema } from \"../../schema/blocks\";\nimport { defineBlock, type BlockRenderProps } from \"../registry\";\n\ntype Banner = z.infer<typeof BannerBlockSchema>;\n\n/** Sleutel per blok (+ optionele versie): wegklikken onthouden we per banner-inhoud. */\nfunction storageKey(block: Banner): string {\n return `xicms-banner:${block._key}${block.dismissVersion ? `:${block.dismissVersion}` : \"\"}`;\n}\n\n/**\n * Aankondigingsbalk, optioneel sluitbaar. Wegklikken wordt in localStorage onthouden (per blok +\n * `dismissVersion`), zodat de balk niet bij elke paginaweergave terugkomt. In de editor-preview\n * tonen we hem altijd (anders kan een editor zijn eigen weggeklikte banner niet meer bewerken).\n */\nfunction BannerRender({ block, mode }: BlockRenderProps<Banner>) {\n const [closed, setClosed] = useState(false);\n\n // localStorage pas na mount lezen (SSR-veilig; voorkomt hydration-mismatch).\n useEffect(() => {\n if (mode === \"preview\" || !block.dismissible) return;\n try {\n if (window.localStorage.getItem(storageKey(block)) === \"1\") setClosed(true);\n } catch {\n /* opslag onbeschikbaar: banner gewoon tonen */\n }\n }, [block, mode]);\n\n const dismiss = () => {\n setClosed(true);\n try {\n window.localStorage.setItem(storageKey(block), \"1\");\n } catch {\n /* opslag geweigerd: sluiten geldt dan alleen voor deze weergave */\n }\n };\n\n if (!block.text || (closed && mode !== \"preview\")) return null;\n return (\n <div className=\"xicms-banner\" data-tone={block.tone} role=\"region\" aria-label=\"Aankondiging\">\n <span>\n <span data-xicms-edit=\"text\">{block.text}</span>\n {block.href && (\n <a className=\"xicms-banner__link\" href={block.href}>\n {block.linkLabel ?? \"Meer\"}\n </a>\n )}\n </span>\n {block.dismissible && (\n <button type=\"button\" className=\"xicms-banner__close\" aria-label=\"Sluiten\" onClick={dismiss}>\n ✕\n </button>\n )}\n </div>\n );\n}\n\nexport const bannerBlock = defineBlock({\n type: \"banner\",\n schema: BannerBlockSchema,\n Render: BannerRender,\n label: \"Aankondiging\",\n icon: \"📢\",\n defaults: () => ({ text: \"Nieuw: …\", tone: \"info\", dismissible: true }),\n});\n"],"mappings":";AA4CM,SACE,KADF;AA1CN,SAAS,WAAW,gBAAgB;AAEpC,SAAS,yBAAyB;AAClC,SAAS,mBAA0C;AAKnD,SAAS,WAAW,OAAuB;AACzC,SAAO,gBAAgB,MAAM,IAAI,GAAG,MAAM,iBAAiB,IAAI,MAAM,cAAc,KAAK,EAAE;AAC5F;AAOA,SAAS,aAAa,EAAE,OAAO,KAAK,GAA6B;AAC/D,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAG1C,YAAU,MAAM;AACd,QAAI,SAAS,aAAa,CAAC,MAAM,YAAa;AAC9C,QAAI;AACF,UAAI,OAAO,aAAa,QAAQ,WAAW,KAAK,CAAC,MAAM,IAAK,WAAU,IAAI;AAAA,IAC5E,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAAC,OAAO,IAAI,CAAC;AAEhB,QAAM,UAAU,MAAM;AACpB,cAAU,IAAI;AACd,QAAI;AACF,aAAO,aAAa,QAAQ,WAAW,KAAK,GAAG,GAAG;AAAA,IACpD,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI,CAAC,MAAM,QAAS,UAAU,SAAS,UAAY,QAAO;AAC1D,SACE,qBAAC,SAAI,WAAU,gBAAe,aAAW,MAAM,MAAM,MAAK,UAAS,cAAW,gBAC5E;AAAA,yBAAC,UACC;AAAA,0BAAC,UAAK,mBAAgB,QAAQ,gBAAM,MAAK;AAAA,MACxC,MAAM,QACL,oBAAC,OAAE,WAAU,sBAAqB,MAAM,MAAM,MAC3C,gBAAM,aAAa,QACtB;AAAA,OAEJ;AAAA,IACC,MAAM,eACL,oBAAC,YAAO,MAAK,UAAS,WAAU,uBAAsB,cAAW,WAAU,SAAS,SAAS,oBAE7F;AAAA,KAEJ;AAEJ;AAEO,MAAM,cAAc,YAAY;AAAA,EACrC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,MAAM,iBAAY,MAAM,QAAQ,aAAa,KAAK;AACvE,CAAC;","names":[]}
@@ -0,0 +1,2 @@
1
+ import type { z } from "zod";
2
+ export declare const beforeAfterBlock: import("..").BlockDefinition<z.ZodTypeAny>;
@@ -0,0 +1,44 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { BeforeAfterBlockSchema } from "../../schema/blocks";
5
+ import { defineBlock } from "../registry";
6
+ function BeforeAfterRender({ block }) {
7
+ const [pos, setPos] = useState(50);
8
+ if (!block.beforeUrl || !block.afterUrl) return null;
9
+ return /* @__PURE__ */ jsxs("figure", { className: "xicms-beforeafter", style: { aspectRatio: block.aspectRatio.replace("/", " / ") }, children: [
10
+ block.heading && /* @__PURE__ */ jsx("figcaption", { className: "xicms-beforeafter__heading", "data-xicms-edit": "heading", children: block.heading }),
11
+ /* @__PURE__ */ jsxs("div", { className: "xicms-beforeafter__stage", children: [
12
+ /* @__PURE__ */ jsx("img", { className: "xicms-beforeafter__img", src: block.beforeUrl, alt: block.alt || block.beforeLabel, loading: "lazy" }),
13
+ /* @__PURE__ */ jsx("div", { className: "xicms-beforeafter__clip", style: { clipPath: `inset(0 0 0 ${pos}%)` }, "aria-hidden": true, children: /* @__PURE__ */ jsx("img", { className: "xicms-beforeafter__img", src: block.afterUrl, alt: "", loading: "lazy" }) }),
14
+ /* @__PURE__ */ jsx("div", { className: "xicms-beforeafter__divider", style: { left: `${pos}%` }, "aria-hidden": true, children: /* @__PURE__ */ jsx("span", { className: "xicms-beforeafter__handle", children: "\u27E8\u27E9" }) }),
15
+ /* @__PURE__ */ jsx("span", { className: "xicms-beforeafter__badge xicms-beforeafter__badge--before", children: block.beforeLabel }),
16
+ /* @__PURE__ */ jsx("span", { className: "xicms-beforeafter__badge xicms-beforeafter__badge--after", children: block.afterLabel }),
17
+ /* @__PURE__ */ jsx(
18
+ "input",
19
+ {
20
+ className: "xicms-beforeafter__range",
21
+ type: "range",
22
+ min: 0,
23
+ max: 100,
24
+ value: pos,
25
+ onChange: (e) => setPos(Number(e.target.value)),
26
+ "aria-label": `Vergelijk ${block.beforeLabel} en ${block.afterLabel}`,
27
+ "aria-valuetext": `${pos}% ${block.afterLabel}`
28
+ }
29
+ )
30
+ ] })
31
+ ] });
32
+ }
33
+ const beforeAfterBlock = defineBlock({
34
+ type: "beforeAfter",
35
+ schema: BeforeAfterBlockSchema,
36
+ Render: BeforeAfterRender,
37
+ label: "Voor / na",
38
+ icon: "\u{1F500}",
39
+ defaults: () => ({ beforeUrl: "", afterUrl: "", beforeLabel: "Voor", afterLabel: "Na", aspectRatio: "4/3" })
40
+ });
41
+ export {
42
+ beforeAfterBlock
43
+ };
44
+ //# sourceMappingURL=BeforeAfter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/blocks/builtins/BeforeAfter.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport type { z } from \"zod\";\nimport { BeforeAfterBlockSchema } from \"../../schema/blocks\";\nimport { defineBlock, type BlockRenderProps } from \"../registry\";\n\ntype BeforeAfter = z.infer<typeof BeforeAfterBlockSchema>;\n\n/**\n * Voor/na-vergelijker: het \"na\"-beeld wordt geclipt op de sleppositie. De greep is een échte\n * range-input (over de hele breedte, transparant) — slepen, klikken én pijltjestoetsen werken\n * daarmee gratis en toegankelijk (aria-label + waarde in %).\n */\nfunction BeforeAfterRender({ block }: BlockRenderProps<BeforeAfter>) {\n const [pos, setPos] = useState(50);\n if (!block.beforeUrl || !block.afterUrl) return null;\n return (\n <figure className=\"xicms-beforeafter\" style={{ aspectRatio: block.aspectRatio.replace(\"/\", \" / \") }}>\n {block.heading && <figcaption className=\"xicms-beforeafter__heading\" data-xicms-edit=\"heading\">{block.heading}</figcaption>}\n <div className=\"xicms-beforeafter__stage\">\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img className=\"xicms-beforeafter__img\" src={block.beforeUrl} alt={block.alt || block.beforeLabel} loading=\"lazy\" />\n <div className=\"xicms-beforeafter__clip\" style={{ clipPath: `inset(0 0 0 ${pos}%)` }} aria-hidden>\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img className=\"xicms-beforeafter__img\" src={block.afterUrl} alt=\"\" loading=\"lazy\" />\n </div>\n <div className=\"xicms-beforeafter__divider\" style={{ left: `${pos}%` }} aria-hidden>\n <span className=\"xicms-beforeafter__handle\">⟨⟩</span>\n </div>\n <span className=\"xicms-beforeafter__badge xicms-beforeafter__badge--before\">{block.beforeLabel}</span>\n <span className=\"xicms-beforeafter__badge xicms-beforeafter__badge--after\">{block.afterLabel}</span>\n <input\n className=\"xicms-beforeafter__range\"\n type=\"range\"\n min={0}\n max={100}\n value={pos}\n onChange={(e) => setPos(Number(e.target.value))}\n aria-label={`Vergelijk ${block.beforeLabel} en ${block.afterLabel}`}\n aria-valuetext={`${pos}% ${block.afterLabel}`}\n />\n </div>\n </figure>\n );\n}\n\nexport const beforeAfterBlock = defineBlock({\n type: \"beforeAfter\",\n schema: BeforeAfterBlockSchema,\n Render: BeforeAfterRender,\n label: \"Voor / na\",\n icon: \"🔀\",\n defaults: () => ({ beforeUrl: \"\", afterUrl: \"\", beforeLabel: \"Voor\", afterLabel: \"Na\", aspectRatio: \"4/3\" }),\n});\n"],"mappings":";AAmBwB,cAClB,YADkB;AAjBxB,SAAS,gBAAgB;AAEzB,SAAS,8BAA8B;AACvC,SAAS,mBAA0C;AASnD,SAAS,kBAAkB,EAAE,MAAM,GAAkC;AACnE,QAAM,CAAC,KAAK,MAAM,IAAI,SAAS,EAAE;AACjC,MAAI,CAAC,MAAM,aAAa,CAAC,MAAM,SAAU,QAAO;AAChD,SACE,qBAAC,YAAO,WAAU,qBAAoB,OAAO,EAAE,aAAa,MAAM,YAAY,QAAQ,KAAK,KAAK,EAAE,GAC/F;AAAA,UAAM,WAAW,oBAAC,gBAAW,WAAU,8BAA6B,mBAAgB,WAAW,gBAAM,SAAQ;AAAA,IAC9G,qBAAC,SAAI,WAAU,4BAEb;AAAA,0BAAC,SAAI,WAAU,0BAAyB,KAAK,MAAM,WAAW,KAAK,MAAM,OAAO,MAAM,aAAa,SAAQ,QAAO;AAAA,MAClH,oBAAC,SAAI,WAAU,2BAA0B,OAAO,EAAE,UAAU,eAAe,GAAG,KAAK,GAAG,eAAW,MAE/F,8BAAC,SAAI,WAAU,0BAAyB,KAAK,MAAM,UAAU,KAAI,IAAG,SAAQ,QAAO,GACrF;AAAA,MACA,oBAAC,SAAI,WAAU,8BAA6B,OAAO,EAAE,MAAM,GAAG,GAAG,IAAI,GAAG,eAAW,MACjF,8BAAC,UAAK,WAAU,6BAA4B,0BAAE,GAChD;AAAA,MACA,oBAAC,UAAK,WAAU,6DAA6D,gBAAM,aAAY;AAAA,MAC/F,oBAAC,UAAK,WAAU,4DAA4D,gBAAM,YAAW;AAAA,MAC7F;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,OAAO,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,UAC9C,cAAY,aAAa,MAAM,WAAW,OAAO,MAAM,UAAU;AAAA,UACjE,kBAAgB,GAAG,GAAG,KAAK,MAAM,UAAU;AAAA;AAAA,MAC7C;AAAA,OACF;AAAA,KACF;AAEJ;AAEO,MAAM,mBAAmB,YAAY;AAAA,EAC1C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,WAAW,IAAI,UAAU,IAAI,aAAa,QAAQ,YAAY,MAAM,aAAa,MAAM;AAC5G,CAAC;","names":[]}
@@ -0,0 +1,2 @@
1
+ import type { z } from "zod";
2
+ export declare const bookingBlock: import("..").BlockDefinition<z.ZodTypeAny>;
@@ -0,0 +1,27 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { BookingBlockSchema } from "../../schema/blocks";
4
+ import { defineBlock } from "../registry";
5
+ import { Heading } from "../ui";
6
+ import { ConsentEmbed } from "./consentEmbed";
7
+ import { buildBookingUrl } from "./lib/bookingUrl";
8
+ function BookingRender({ block, mode }) {
9
+ const src = buildBookingUrl(block.provider ?? "custom", block.embedUrl);
10
+ if (!src) return null;
11
+ return /* @__PURE__ */ jsxs("section", { className: "xicms-booking", children: [
12
+ block.heading && /* @__PURE__ */ jsx(Heading, { level: 2, "data-xicms-edit": "heading", children: block.heading }),
13
+ /* @__PURE__ */ jsx("div", { className: "xicms-booking__frame", style: { height: `${block.height}px` }, children: /* @__PURE__ */ jsx(ConsentEmbed, { gated: block.consentGated, preview: mode === "preview", label: "Afspraak/booking", children: /* @__PURE__ */ jsx("iframe", { src, title: block.heading ?? "Afspraak maken", loading: "lazy", style: { border: 0, width: "100%", height: "100%" } }) }) })
14
+ ] });
15
+ }
16
+ const bookingBlock = defineBlock({
17
+ type: "booking",
18
+ schema: BookingBlockSchema,
19
+ Render: BookingRender,
20
+ label: "Afspraak/booking",
21
+ icon: "\u{1F4C6}",
22
+ defaults: () => ({ embedUrl: "", height: 630, consentGated: true })
23
+ });
24
+ export {
25
+ bookingBlock
26
+ };
27
+ //# sourceMappingURL=Booking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/blocks/builtins/Booking.tsx"],"sourcesContent":["\"use client\";\n\nimport type { z } from \"zod\";\nimport { BookingBlockSchema } from \"../../schema/blocks\";\nimport { defineBlock, type BlockRenderProps } from \"../registry\";\nimport { Heading } from \"../ui\";\nimport { ConsentEmbed } from \"./consentEmbed\";\nimport { buildBookingUrl, type BookingProvider } from \"./lib/bookingUrl\";\n\ntype Booking = z.infer<typeof BookingBlockSchema>;\n\n/** Boekings-/afspraak-embed (bv. Calendly). Consent-gated by default. De provider-keuze bouwt de\n * volledige embed-URL uit een geplakte link óf een kale slug/id (buildBookingUrl). */\nfunction BookingRender({ block, mode }: BlockRenderProps<Booking>) {\n const src = buildBookingUrl((block.provider ?? \"custom\") as BookingProvider, block.embedUrl);\n if (!src) return null;\n return (\n <section className=\"xicms-booking\">\n {block.heading && <Heading level={2} data-xicms-edit=\"heading\">{block.heading}</Heading>}\n <div className=\"xicms-booking__frame\" style={{ height: `${block.height}px` }}>\n <ConsentEmbed gated={block.consentGated} preview={mode === \"preview\"} label=\"Afspraak/booking\">\n <iframe src={src} title={block.heading ?? \"Afspraak maken\"} loading=\"lazy\" style={{ border: 0, width: \"100%\", height: \"100%\" }} />\n </ConsentEmbed>\n </div>\n </section>\n );\n}\n\nexport const bookingBlock = defineBlock({\n type: \"booking\",\n schema: BookingBlockSchema,\n Render: BookingRender,\n label: \"Afspraak/booking\",\n icon: \"📆\",\n defaults: () => ({ embedUrl: \"\", height: 630, consentGated: true }),\n});\n"],"mappings":";AAiBI,SACoB,KADpB;AAdJ,SAAS,0BAA0B;AACnC,SAAS,mBAA0C;AACnD,SAAS,eAAe;AACxB,SAAS,oBAAoB;AAC7B,SAAS,uBAA6C;AAMtD,SAAS,cAAc,EAAE,OAAO,KAAK,GAA8B;AACjE,QAAM,MAAM,gBAAiB,MAAM,YAAY,UAA8B,MAAM,QAAQ;AAC3F,MAAI,CAAC,IAAK,QAAO;AACjB,SACE,qBAAC,aAAQ,WAAU,iBAChB;AAAA,UAAM,WAAW,oBAAC,WAAQ,OAAO,GAAG,mBAAgB,WAAW,gBAAM,SAAQ;AAAA,IAC9E,oBAAC,SAAI,WAAU,wBAAuB,OAAO,EAAE,QAAQ,GAAG,MAAM,MAAM,KAAK,GACzE,8BAAC,gBAAa,OAAO,MAAM,cAAc,SAAS,SAAS,WAAW,OAAM,oBAC1E,8BAAC,YAAO,KAAU,OAAO,MAAM,WAAW,kBAAkB,SAAQ,QAAO,OAAO,EAAE,QAAQ,GAAG,OAAO,QAAQ,QAAQ,OAAO,GAAG,GAClI,GACF;AAAA,KACF;AAEJ;AAEO,MAAM,eAAe,YAAY;AAAA,EACtC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,UAAU,IAAI,QAAQ,KAAK,cAAc,KAAK;AACnE,CAAC;","names":[]}
@@ -0,0 +1,10 @@
1
+ import type { z } from "zod";
2
+ export interface Crumb {
3
+ label: string;
4
+ href: string;
5
+ }
6
+ /** Kruimels uit een pad: "/diensten/tuinaanleg" → Home / Diensten / Tuinaanleg. Puur en getest. */
7
+ export declare function crumbsFromPath(path: string, homeLabel?: string): Crumb[];
8
+ /** BreadcrumbList-JSON-LD. Puur en getest. */
9
+ export declare function breadcrumbsJsonLd(crumbs: Crumb[]): Record<string, unknown>;
10
+ export declare const breadcrumbsBlock: import("..").BlockDefinition<z.ZodTypeAny>;
@@ -0,0 +1,73 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useState } from "react";
4
+ import { BreadcrumbsBlockSchema } from "../../schema/blocks";
5
+ import { defineBlock } from "../registry";
6
+ import { useLinkComponent } from "@astryxdesign/core/Link";
7
+ function crumbsFromPath(path, homeLabel = "Home") {
8
+ const segments = path.split("/").filter(Boolean);
9
+ const crumbs = [{ label: homeLabel, href: "/" }];
10
+ let href = "";
11
+ for (const seg of segments) {
12
+ href += `/${seg}`;
13
+ let decoded = seg;
14
+ try {
15
+ decoded = decodeURIComponent(seg);
16
+ } catch {
17
+ }
18
+ const label = decoded.replace(/[-_]+/g, " ").replace(/^./, (c) => c.toUpperCase());
19
+ crumbs.push({ label, href });
20
+ }
21
+ return crumbs;
22
+ }
23
+ function breadcrumbsJsonLd(crumbs) {
24
+ return {
25
+ "@context": "https://schema.org",
26
+ "@type": "BreadcrumbList",
27
+ itemListElement: crumbs.map((c, i) => ({
28
+ "@type": "ListItem",
29
+ position: i + 1,
30
+ name: c.label,
31
+ item: c.href
32
+ }))
33
+ };
34
+ }
35
+ function BreadcrumbsRender({ block, mode }) {
36
+ const LinkC = useLinkComponent();
37
+ const [path, setPath] = useState(null);
38
+ useEffect(() => {
39
+ setPath(window.location.pathname);
40
+ }, []);
41
+ if (mode === "preview" && (path === null || path === "/")) {
42
+ return /* @__PURE__ */ jsxs("nav", { className: "xicms-breadcrumbs", "aria-label": "Kruimelpad", children: [
43
+ block.homeLabel,
44
+ " / Voorbeeldpagina"
45
+ ] });
46
+ }
47
+ if (path === null || path === "/") return null;
48
+ const crumbs = crumbsFromPath(path, block.homeLabel);
49
+ return /* @__PURE__ */ jsxs("nav", { className: "xicms-breadcrumbs", "aria-label": "Kruimelpad", children: [
50
+ /* @__PURE__ */ jsx("ol", { className: "xicms-breadcrumbs__list", children: crumbs.map((c, i) => /* @__PURE__ */ jsx("li", { className: "xicms-breadcrumbs__item", children: i < crumbs.length - 1 ? /* @__PURE__ */ jsx(LinkC, { href: c.href, children: c.label }) : /* @__PURE__ */ jsx("span", { "aria-current": "page", children: c.label }) }, c.href)) }),
51
+ block.jsonLd && /* @__PURE__ */ jsx(
52
+ "script",
53
+ {
54
+ type: "application/ld+json",
55
+ dangerouslySetInnerHTML: { __html: JSON.stringify(breadcrumbsJsonLd(crumbs)) }
56
+ }
57
+ )
58
+ ] });
59
+ }
60
+ const breadcrumbsBlock = defineBlock({
61
+ type: "breadcrumbs",
62
+ schema: BreadcrumbsBlockSchema,
63
+ Render: BreadcrumbsRender,
64
+ label: "Kruimelpad",
65
+ icon: "\u{1F9ED}",
66
+ defaults: () => ({ homeLabel: "Home", jsonLd: true })
67
+ });
68
+ export {
69
+ breadcrumbsBlock,
70
+ breadcrumbsJsonLd,
71
+ crumbsFromPath
72
+ };
73
+ //# sourceMappingURL=Breadcrumbs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/blocks/builtins/Breadcrumbs.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport type { z } from \"zod\";\nimport { BreadcrumbsBlockSchema } from \"../../schema/blocks\";\nimport { defineBlock, type BlockRenderProps } from \"../registry\";\nimport { useLinkComponent } from \"@astryxdesign/core/Link\";\n\ntype Breadcrumbs = z.infer<typeof BreadcrumbsBlockSchema>;\n\nexport interface Crumb {\n label: string;\n href: string;\n}\n\n/** Kruimels uit een pad: \"/diensten/tuinaanleg\" → Home / Diensten / Tuinaanleg. Puur en getest. */\nexport function crumbsFromPath(path: string, homeLabel = \"Home\"): Crumb[] {\n const segments = path.split(\"/\").filter(Boolean);\n const crumbs: Crumb[] = [{ label: homeLabel, href: \"/\" }];\n let href = \"\";\n for (const seg of segments) {\n href += `/${seg}`;\n // decodeURIComponent gooit op misvormde percent-encoding (\"%E0%A4%A\") — dan het rauwe segment.\n let decoded = seg;\n try {\n decoded = decodeURIComponent(seg);\n } catch {\n /* rauw segment als label */\n }\n const label = decoded.replace(/[-_]+/g, \" \").replace(/^./, (c) => c.toUpperCase());\n crumbs.push({ label, href });\n }\n return crumbs;\n}\n\n/** BreadcrumbList-JSON-LD. Puur en getest. */\nexport function breadcrumbsJsonLd(crumbs: Crumb[]): Record<string, unknown> {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"BreadcrumbList\",\n itemListElement: crumbs.map((c, i) => ({\n \"@type\": \"ListItem\",\n position: i + 1,\n name: c.label,\n item: c.href,\n })),\n };\n}\n\n/**\n * Kruimelpad, afgeleid van de URL (client, ná mount — hydration-veilig). Op de homepage\n * (alleen \"Home\") wordt niets getoond.\n */\nfunction BreadcrumbsRender({ block, mode }: BlockRenderProps<Breadcrumbs>) {\n const LinkC = useLinkComponent();\n const [path, setPath] = useState<string | null>(null);\n useEffect(() => {\n setPath(window.location.pathname);\n }, []);\n\n if (mode === \"preview\" && (path === null || path === \"/\")) {\n return <nav className=\"xicms-breadcrumbs\" aria-label=\"Kruimelpad\">{block.homeLabel} / Voorbeeldpagina</nav>;\n }\n if (path === null || path === \"/\") return null;\n const crumbs = crumbsFromPath(path, block.homeLabel);\n\n return (\n <nav className=\"xicms-breadcrumbs\" aria-label=\"Kruimelpad\">\n <ol className=\"xicms-breadcrumbs__list\">\n {crumbs.map((c, i) => (\n <li key={c.href} className=\"xicms-breadcrumbs__item\">\n {i < crumbs.length - 1 ? (\n <LinkC href={c.href}>{c.label}</LinkC>\n ) : (\n <span aria-current=\"page\">{c.label}</span>\n )}\n </li>\n ))}\n </ol>\n {block.jsonLd && (\n <script\n type=\"application/ld+json\"\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{ __html: JSON.stringify(breadcrumbsJsonLd(crumbs)) }}\n />\n )}\n </nav>\n );\n}\n\nexport const breadcrumbsBlock = defineBlock({\n type: \"breadcrumbs\",\n schema: BreadcrumbsBlockSchema,\n Render: BreadcrumbsRender,\n label: \"Kruimelpad\",\n icon: \"🧭\",\n defaults: () => ({ homeLabel: \"Home\", jsonLd: true }),\n});\n"],"mappings":";AA6DW,SAWG,KAXH;AA3DX,SAAS,WAAW,gBAAgB;AAEpC,SAAS,8BAA8B;AACvC,SAAS,mBAA0C;AACnD,SAAS,wBAAwB;AAU1B,SAAS,eAAe,MAAc,YAAY,QAAiB;AACxE,QAAM,WAAW,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAC/C,QAAM,SAAkB,CAAC,EAAE,OAAO,WAAW,MAAM,IAAI,CAAC;AACxD,MAAI,OAAO;AACX,aAAW,OAAO,UAAU;AAC1B,YAAQ,IAAI,GAAG;AAEf,QAAI,UAAU;AACd,QAAI;AACF,gBAAU,mBAAmB,GAAG;AAAA,IAClC,QAAQ;AAAA,IAER;AACA,UAAM,QAAQ,QAAQ,QAAQ,UAAU,GAAG,EAAE,QAAQ,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;AACjF,WAAO,KAAK,EAAE,OAAO,KAAK,CAAC;AAAA,EAC7B;AACA,SAAO;AACT;AAGO,SAAS,kBAAkB,QAA0C;AAC1E,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,iBAAiB,OAAO,IAAI,CAAC,GAAG,OAAO;AAAA,MACrC,SAAS;AAAA,MACT,UAAU,IAAI;AAAA,MACd,MAAM,EAAE;AAAA,MACR,MAAM,EAAE;AAAA,IACV,EAAE;AAAA,EACJ;AACF;AAMA,SAAS,kBAAkB,EAAE,OAAO,KAAK,GAAkC;AACzE,QAAM,QAAQ,iBAAiB;AAC/B,QAAM,CAAC,MAAM,OAAO,IAAI,SAAwB,IAAI;AACpD,YAAU,MAAM;AACd,YAAQ,OAAO,SAAS,QAAQ;AAAA,EAClC,GAAG,CAAC,CAAC;AAEL,MAAI,SAAS,cAAc,SAAS,QAAQ,SAAS,MAAM;AACzD,WAAO,qBAAC,SAAI,WAAU,qBAAoB,cAAW,cAAc;AAAA,YAAM;AAAA,MAAU;AAAA,OAAkB;AAAA,EACvG;AACA,MAAI,SAAS,QAAQ,SAAS,IAAK,QAAO;AAC1C,QAAM,SAAS,eAAe,MAAM,MAAM,SAAS;AAEnD,SACE,qBAAC,SAAI,WAAU,qBAAoB,cAAW,cAC5C;AAAA,wBAAC,QAAG,WAAU,2BACX,iBAAO,IAAI,CAAC,GAAG,MACd,oBAAC,QAAgB,WAAU,2BACxB,cAAI,OAAO,SAAS,IACnB,oBAAC,SAAM,MAAM,EAAE,MAAO,YAAE,OAAM,IAE9B,oBAAC,UAAK,gBAAa,QAAQ,YAAE,OAAM,KAJ9B,EAAE,IAMX,CACD,GACH;AAAA,IACC,MAAM,UACL;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QAEL,yBAAyB,EAAE,QAAQ,KAAK,UAAU,kBAAkB,MAAM,CAAC,EAAE;AAAA;AAAA,IAC/E;AAAA,KAEJ;AAEJ;AAEO,MAAM,mBAAmB,YAAY;AAAA,EAC1C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,WAAW,QAAQ,QAAQ,KAAK;AACrD,CAAC;","names":[]}
@@ -0,0 +1,2 @@
1
+ import type { z } from "zod";
2
+ export declare const cardsBlock: import("..").BlockDefinition<z.ZodTypeAny>;