@xiwebdesign/xicms-core 6.5.0 → 7.1.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 (381) hide show
  1. package/dist/SiteChrome.d.ts +12 -0
  2. package/dist/SiteChrome.js +24 -0
  3. package/dist/SiteChrome.js.map +1 -0
  4. package/dist/XiCMSProvider.d.ts +16 -8
  5. package/dist/XiCMSProvider.js +90 -61
  6. package/dist/XiCMSProvider.js.map +1 -1
  7. package/dist/admin/AdminApp.d.ts +1 -1
  8. package/dist/admin/AdminApp.js +81 -35
  9. package/dist/admin/AdminApp.js.map +1 -1
  10. package/dist/admin/AdminHelp.d.ts +8 -1
  11. package/dist/admin/AdminHelp.js +2 -2
  12. package/dist/admin/AdminHelp.js.map +1 -1
  13. package/dist/admin/CoreVersion.d.ts +13 -0
  14. package/dist/admin/CoreVersion.js +38 -0
  15. package/dist/admin/CoreVersion.js.map +1 -0
  16. package/dist/admin/NewsEditor.js +9 -9
  17. package/dist/admin/SuperadminPanel.js +5 -5
  18. package/dist/admin/blockEditors/GenericEditor.d.ts +2 -2
  19. package/dist/admin/blockEditors/GenericEditor.js +12 -11
  20. package/dist/admin/blockEditors/GenericEditor.js.map +1 -1
  21. package/dist/admin/blockEditors/StyleEditor.d.ts +1 -1
  22. package/dist/admin/blockEditors/StyleEditor.js +2 -2
  23. package/dist/admin/blockEditors/SymbolRefEditor.d.ts +1 -1
  24. package/dist/admin/blockEditors/SymbolRefEditor.js +5 -5
  25. package/dist/admin/blockEditors/index.d.ts +1 -1
  26. package/dist/admin/blockEditors/index.js +10 -10
  27. package/dist/admin/customBlocks/CustomBlocksPanel.js +7 -7
  28. package/dist/admin/editors/RichTextEditor.js +8 -7
  29. package/dist/admin/editors/RichTextEditor.js.map +1 -1
  30. package/dist/admin/editors/fontSizeExtension.js +1 -1
  31. package/dist/admin/editors/fontSizeExtension.js.map +1 -1
  32. package/dist/admin/forms/FormsPanel.js +9 -9
  33. package/dist/admin/index.d.ts +16 -16
  34. package/dist/admin/index.js +16 -16
  35. package/dist/admin/lib/mediaUsage.js +1 -1
  36. package/dist/admin/lib/pagesClient.d.ts +1 -1
  37. package/dist/admin/lib/pagesClient.js +11 -7
  38. package/dist/admin/lib/pagesClient.js.map +1 -1
  39. package/dist/admin/lib/sanitizeDraft.d.ts +9 -0
  40. package/dist/admin/lib/sanitizeDraft.js +28 -0
  41. package/dist/admin/lib/sanitizeDraft.js.map +1 -0
  42. package/dist/admin/lib/symbolsClient.d.ts +1 -1
  43. package/dist/admin/lib/symbolsClient.js +3 -3
  44. package/dist/admin/lib/upload.js +3 -3
  45. package/dist/admin/lib/useNestedDialog.d.ts +15 -0
  46. package/dist/admin/lib/useNestedDialog.js +23 -0
  47. package/dist/admin/lib/useNestedDialog.js.map +1 -0
  48. package/dist/admin/lib/zodFields.d.ts +4 -18
  49. package/dist/admin/lib/zodFields.js +54 -35
  50. package/dist/admin/lib/zodFields.js.map +1 -1
  51. package/dist/admin/media/MediaManager.js +7 -7
  52. package/dist/admin/media/MediaPicker.js +7 -7
  53. package/dist/admin/media/MediaPicker.js.map +1 -1
  54. package/dist/admin/pages/PageEditor.d.ts +1 -1
  55. package/dist/admin/pages/PageEditor.js +13 -13
  56. package/dist/admin/pages/PagesPanel.js +30 -30
  57. package/dist/admin/pages/PagesPanel.js.map +1 -1
  58. package/dist/admin/panelRegistry.js +7 -7
  59. package/dist/admin/patterns/PatternInserter.d.ts +1 -1
  60. package/dist/admin/patterns/PatternInserter.js +5 -5
  61. package/dist/admin/patterns/PatternInserter.js.map +1 -1
  62. package/dist/admin/settings/MailSettings.js +5 -5
  63. package/dist/admin/settings/MailTemplates.d.ts +1 -1
  64. package/dist/admin/settings/MailTemplates.js +5 -5
  65. package/dist/admin/settings/SettingsPanel.js +66 -20
  66. package/dist/admin/settings/SettingsPanel.js.map +1 -1
  67. package/dist/admin/settings/SnapshotsCard.js +5 -5
  68. package/dist/admin/settings/moduleSettingsForm.d.ts +1 -1
  69. package/dist/admin/settings/moduleSettingsForm.js +4 -4
  70. package/dist/admin/settings/moduleSettingsForm.js.map +1 -1
  71. package/dist/admin/shop/CategoriesTab.js +8 -8
  72. package/dist/admin/shop/ConnectionsTab.js +3 -3
  73. package/dist/admin/shop/DiscountsTab.js +8 -8
  74. package/dist/admin/shop/OrdersTab.js +10 -10
  75. package/dist/admin/shop/OrdersTab.js.map +1 -1
  76. package/dist/admin/shop/ProductsTab.js +10 -10
  77. package/dist/admin/shop/ShopPanel.js +9 -9
  78. package/dist/admin/shop/ShopSettingsTab.js +4 -4
  79. package/dist/admin/shop/index.d.ts +2 -2
  80. package/dist/admin/shop/index.js +2 -2
  81. package/dist/admin/shop/lib.js +2 -2
  82. package/dist/admin/stats/StatsPanel.js +2 -2
  83. package/dist/admin/ui/ArrayEditor.js +1 -1
  84. package/dist/admin/ui/PanelIcon.d.ts +3 -0
  85. package/dist/admin/ui/PanelIcon.js +34 -0
  86. package/dist/admin/ui/PanelIcon.js.map +1 -0
  87. package/dist/admin/ui/dialog.d.ts +21 -6
  88. package/dist/admin/ui/dialog.js +55 -34
  89. package/dist/admin/ui/dialog.js.map +1 -1
  90. package/dist/admin/ui/index.d.ts +7 -7
  91. package/dist/admin/ui/index.js +7 -7
  92. package/dist/admin/ui/primitives.js +1 -1
  93. package/dist/admin/ui/tabs.js +1 -1
  94. package/dist/admin/visual/TranslationPanel.d.ts +1 -1
  95. package/dist/admin/visual/TranslationPanel.js +3 -3
  96. package/dist/admin/visual/VisualEditor.js +47 -25
  97. package/dist/admin/visual/VisualEditor.js.map +1 -1
  98. package/dist/admin.css +2 -1
  99. package/dist/agentFiles/catalog.d.ts +2 -2
  100. package/dist/agentFiles/catalog.js +6 -5
  101. package/dist/agentFiles/catalog.js.map +1 -1
  102. package/dist/agentFiles/files.d.ts +5 -5
  103. package/dist/agentFiles/files.js +17 -17
  104. package/dist/agentFiles/files.js.map +1 -1
  105. package/dist/all.d.ts +4 -4
  106. package/dist/all.js +6 -6
  107. package/dist/auth/AuthProvider.d.ts +2 -2
  108. package/dist/auth/AuthProvider.js +51 -28
  109. package/dist/auth/AuthProvider.js.map +1 -1
  110. package/dist/auth/LoginForm.js +1 -1
  111. package/dist/auth/roles.js +4 -1
  112. package/dist/auth/roles.js.map +1 -1
  113. package/dist/blocks/BlockRenderer.d.ts +1 -1
  114. package/dist/blocks/BlockRenderer.js +3 -3
  115. package/dist/blocks/blockStyle.d.ts +1 -1
  116. package/dist/blocks/builtins/Accordion.d.ts +1 -1
  117. package/dist/blocks/builtins/Accordion.js +13 -6
  118. package/dist/blocks/builtins/Accordion.js.map +1 -1
  119. package/dist/blocks/builtins/Agenda.d.ts +1 -1
  120. package/dist/blocks/builtins/Agenda.js +5 -5
  121. package/dist/blocks/builtins/Banner.d.ts +1 -1
  122. package/dist/blocks/builtins/Banner.js +2 -2
  123. package/dist/blocks/builtins/BeforeAfter.d.ts +1 -1
  124. package/dist/blocks/builtins/BeforeAfter.js +4 -4
  125. package/dist/blocks/builtins/BeforeAfter.js.map +1 -1
  126. package/dist/blocks/builtins/Booking.d.ts +1 -1
  127. package/dist/blocks/builtins/Booking.js +5 -5
  128. package/dist/blocks/builtins/Breadcrumbs.d.ts +1 -1
  129. package/dist/blocks/builtins/Breadcrumbs.js +3 -3
  130. package/dist/blocks/builtins/Cards.d.ts +1 -1
  131. package/dist/blocks/builtins/Cards.js +5 -5
  132. package/dist/blocks/builtins/Cards.js.map +1 -1
  133. package/dist/blocks/builtins/Columns.d.ts +1 -1
  134. package/dist/blocks/builtins/Columns.js +4 -4
  135. package/dist/blocks/builtins/Contact.d.ts +3 -3
  136. package/dist/blocks/builtins/Contact.js +4 -4
  137. package/dist/blocks/builtins/Countdown.d.ts +1 -1
  138. package/dist/blocks/builtins/Countdown.js +4 -4
  139. package/dist/blocks/builtins/Countdown.js.map +1 -1
  140. package/dist/blocks/builtins/Cta.d.ts +1 -1
  141. package/dist/blocks/builtins/Cta.js +3 -3
  142. package/dist/blocks/builtins/Downloads.d.ts +1 -1
  143. package/dist/blocks/builtins/Downloads.js +4 -4
  144. package/dist/blocks/builtins/Elements.d.ts +3 -3
  145. package/dist/blocks/builtins/Elements.js +3 -3
  146. package/dist/blocks/builtins/Embed.d.ts +1 -1
  147. package/dist/blocks/builtins/Embed.js +3 -3
  148. package/dist/blocks/builtins/Faq.d.ts +1 -1
  149. package/dist/blocks/builtins/Faq.js +14 -6
  150. package/dist/blocks/builtins/Faq.js.map +1 -1
  151. package/dist/blocks/builtins/FormBlock.d.ts +1 -1
  152. package/dist/blocks/builtins/FormBlock.js +28 -18
  153. package/dist/blocks/builtins/FormBlock.js.map +1 -1
  154. package/dist/blocks/builtins/Gallery.d.ts +2 -2
  155. package/dist/blocks/builtins/Gallery.js +5 -5
  156. package/dist/blocks/builtins/Hero.d.ts +1 -1
  157. package/dist/blocks/builtins/Hero.js +4 -4
  158. package/dist/blocks/builtins/ImageBlock.d.ts +1 -1
  159. package/dist/blocks/builtins/ImageBlock.js +3 -3
  160. package/dist/blocks/builtins/Jobs.d.ts +2 -2
  161. package/dist/blocks/builtins/Jobs.js +5 -5
  162. package/dist/blocks/builtins/Layout.d.ts +2 -2
  163. package/dist/blocks/builtins/Layout.js +4 -4
  164. package/dist/blocks/builtins/MapBlock.d.ts +1 -1
  165. package/dist/blocks/builtins/MapBlock.js +3 -3
  166. package/dist/blocks/builtins/NewsListBlock.d.ts +1 -1
  167. package/dist/blocks/builtins/NewsListBlock.js +4 -4
  168. package/dist/blocks/builtins/Newsletter.d.ts +1 -1
  169. package/dist/blocks/builtins/Newsletter.js +7 -7
  170. package/dist/blocks/builtins/Newsletter.js.map +1 -1
  171. package/dist/blocks/builtins/OpenNowBadge.d.ts +1 -1
  172. package/dist/blocks/builtins/OpenNowBadge.js +8 -3
  173. package/dist/blocks/builtins/OpenNowBadge.js.map +1 -1
  174. package/dist/blocks/builtins/OpeningHours.d.ts +1 -1
  175. package/dist/blocks/builtins/OpeningHours.js +6 -6
  176. package/dist/blocks/builtins/PdfBlock.d.ts +1 -1
  177. package/dist/blocks/builtins/PdfBlock.js +3 -3
  178. package/dist/blocks/builtins/Portfolio.d.ts +1 -1
  179. package/dist/blocks/builtins/Portfolio.js +5 -5
  180. package/dist/blocks/builtins/Pricing.d.ts +2 -2
  181. package/dist/blocks/builtins/Pricing.js +5 -5
  182. package/dist/blocks/builtins/Pricing.js.map +1 -1
  183. package/dist/blocks/builtins/RichTextBlock.d.ts +1 -1
  184. package/dist/blocks/builtins/RichTextBlock.js +2 -2
  185. package/dist/blocks/builtins/RichTextBlock.js.map +1 -1
  186. package/dist/blocks/builtins/Search.d.ts +1 -1
  187. package/dist/blocks/builtins/Search.js +9 -7
  188. package/dist/blocks/builtins/Search.js.map +1 -1
  189. package/dist/blocks/builtins/Sections.d.ts +4 -4
  190. package/dist/blocks/builtins/Sections.js +4 -4
  191. package/dist/blocks/builtins/Slider.d.ts +1 -1
  192. package/dist/blocks/builtins/Slider.js +3 -3
  193. package/dist/blocks/builtins/Spacer.d.ts +1 -1
  194. package/dist/blocks/builtins/Spacer.js +2 -2
  195. package/dist/blocks/builtins/SymbolRef.d.ts +1 -1
  196. package/dist/blocks/builtins/SymbolRef.js +31 -17
  197. package/dist/blocks/builtins/SymbolRef.js.map +1 -1
  198. package/dist/blocks/builtins/Team.d.ts +1 -1
  199. package/dist/blocks/builtins/Team.js +4 -4
  200. package/dist/blocks/builtins/Testimonials.d.ts +2 -2
  201. package/dist/blocks/builtins/Testimonials.js +4 -4
  202. package/dist/blocks/builtins/Video.d.ts +2 -2
  203. package/dist/blocks/builtins/Video.js +4 -4
  204. package/dist/blocks/builtins/Video.js.map +1 -1
  205. package/dist/blocks/builtins/WhatsappChat.d.ts +1 -1
  206. package/dist/blocks/builtins/WhatsappChat.js +2 -2
  207. package/dist/blocks/builtins/Widgets.d.ts +12 -12
  208. package/dist/blocks/builtins/Widgets.js +19 -19
  209. package/dist/blocks/builtins/Widgets.js.map +1 -1
  210. package/dist/blocks/builtins/consentEmbed.js +2 -2
  211. package/dist/blocks/builtins/index.d.ts +40 -40
  212. package/dist/blocks/builtins/index.js +40 -40
  213. package/dist/blocks/builtins/lib/submitForm.js +5 -3
  214. package/dist/blocks/builtins/lib/submitForm.js.map +1 -1
  215. package/dist/blocks/context.d.ts +1 -1
  216. package/dist/blocks/customTemplate/definition.d.ts +3 -3
  217. package/dist/blocks/customTemplate/definition.js +6 -6
  218. package/dist/blocks/customTemplate/definition.js.map +1 -1
  219. package/dist/blocks/customTemplate/interpret.js +1 -1
  220. package/dist/blocks/index.d.ts +5 -5
  221. package/dist/blocks/index.js +5 -5
  222. package/dist/blocks/registry.d.ts +17 -7
  223. package/dist/blocks/registry.js +2 -1
  224. package/dist/blocks/registry.js.map +1 -1
  225. package/dist/components/EditBar.js +3 -3
  226. package/dist/components/FeedbackWidget.js +4 -4
  227. package/dist/components/News.d.ts +1 -1
  228. package/dist/components/News.js +50 -37
  229. package/dist/components/News.js.map +1 -1
  230. package/dist/components/PageView.js +11 -8
  231. package/dist/components/PageView.js.map +1 -1
  232. package/dist/components/ResponsiveImage.d.ts +1 -1
  233. package/dist/components/site/SiteFooter.d.ts +1 -1
  234. package/dist/components/site/SiteFooter.js +2 -2
  235. package/dist/config.d.ts +1 -1
  236. package/dist/demo/DemoStudio.js +3 -3
  237. package/dist/demo/demoStore.d.ts +3 -3
  238. package/dist/demo/index.d.ts +2 -2
  239. package/dist/demo/index.js +2 -2
  240. package/dist/editor/EditorProvider.js +1 -1
  241. package/dist/firebase/admin.d.ts +0 -2
  242. package/dist/firebase/admin.js +0 -6
  243. package/dist/firebase/admin.js.map +1 -1
  244. package/dist/firebase/appcheck.d.ts +1 -1
  245. package/dist/firebase/appcheck.js +5 -3
  246. package/dist/firebase/appcheck.js.map +1 -1
  247. package/dist/firebase/client.d.ts +2 -1
  248. package/dist/firebase/client.js +2 -14
  249. package/dist/firebase/client.js.map +1 -1
  250. package/dist/firebase/config.d.ts +31 -0
  251. package/dist/firebase/config.js +39 -0
  252. package/dist/firebase/config.js.map +1 -0
  253. package/dist/firebase/feedback.js +5 -3
  254. package/dist/firebase/feedback.js.map +1 -1
  255. package/dist/i18n/overlay.d.ts +2 -2
  256. package/dist/i18n/overlay.js +6 -4
  257. package/dist/i18n/overlay.js.map +1 -1
  258. package/dist/index.d.ts +46 -44
  259. package/dist/index.js +39 -33
  260. package/dist/index.js.map +1 -1
  261. package/dist/lock/DemoLock.js +1 -1
  262. package/dist/modules/builtins.d.ts +1 -1
  263. package/dist/modules/builtins.js +53 -55
  264. package/dist/modules/builtins.js.map +1 -1
  265. package/dist/modules/consent/ConsentBanner.js +1 -1
  266. package/dist/modules/consent/useConsent.js +1 -1
  267. package/dist/modules/context.d.ts +1 -1
  268. package/dist/modules/contract.d.ts +1 -1
  269. package/dist/modules/defineModule.d.ts +1 -1
  270. package/dist/modules/index.d.ts +9 -9
  271. package/dist/modules/index.js +8 -8
  272. package/dist/modules/overrides.d.ts +1 -1
  273. package/dist/modules/registry.d.ts +2 -7
  274. package/dist/modules/registry.js +2 -1
  275. package/dist/modules/registry.js.map +1 -1
  276. package/dist/modules/shop/blocks/Cart.d.ts +1 -1
  277. package/dist/modules/shop/blocks/Cart.js +6 -6
  278. package/dist/modules/shop/blocks/Checkout.d.ts +1 -1
  279. package/dist/modules/shop/blocks/Checkout.js +6 -6
  280. package/dist/modules/shop/blocks/Donation.d.ts +1 -1
  281. package/dist/modules/shop/blocks/Donation.js +5 -5
  282. package/dist/modules/shop/blocks/OrderStatus.d.ts +1 -1
  283. package/dist/modules/shop/blocks/OrderStatus.js +5 -5
  284. package/dist/modules/shop/blocks/ProductDetail.d.ts +1 -1
  285. package/dist/modules/shop/blocks/ProductDetail.js +8 -8
  286. package/dist/modules/shop/blocks/ProductGrid.d.ts +3 -3
  287. package/dist/modules/shop/blocks/ProductGrid.js +7 -7
  288. package/dist/modules/shop/blocks/ShopCategories.d.ts +1 -1
  289. package/dist/modules/shop/blocks/ShopCategories.js +6 -6
  290. package/dist/modules/shop/index.d.ts +5 -5
  291. package/dist/modules/shop/index.js +5 -5
  292. package/dist/modules/shop/lib.d.ts +2 -2
  293. package/dist/modules/shop/lib.js +18 -13
  294. package/dist/modules/shop/lib.js.map +1 -1
  295. package/dist/modules/shop/module.d.ts +1 -1
  296. package/dist/modules/shop/module.js +9 -9
  297. package/dist/modules/shop/settings.d.ts +18 -50
  298. package/dist/modules/shop/settings.js +16 -16
  299. package/dist/modules/shop/settings.js.map +1 -1
  300. package/dist/modules/shop/strings.js +1 -1
  301. package/dist/modules/shop/types.d.ts +1 -1
  302. package/dist/modules/types.d.ts +2 -2
  303. package/dist/patterns/builtins.d.ts +1 -1
  304. package/dist/patterns/builtins.js +1 -1
  305. package/dist/patterns/index.d.ts +2 -2
  306. package/dist/patterns/index.js +2 -2
  307. package/dist/render/PageRenderer.d.ts +2 -2
  308. package/dist/render/PageRenderer.js +1 -1
  309. package/dist/render/PublishedPage.d.ts +1 -1
  310. package/dist/render/PublishedPage.js +2 -2
  311. package/dist/schema/blocks.d.ts +6793 -15095
  312. package/dist/schema/blocks.js +335 -355
  313. package/dist/schema/blocks.js.map +1 -1
  314. package/dist/schema/customBlocks.d.ts +10 -29
  315. package/dist/schema/customBlocks.js +14 -13
  316. package/dist/schema/customBlocks.js.map +1 -1
  317. package/dist/schema/fields.d.ts +10 -16
  318. package/dist/schema/fields.js +37 -37
  319. package/dist/schema/fields.js.map +1 -1
  320. package/dist/schema/forms.d.ts +62 -111
  321. package/dist/schema/forms.js +17 -17
  322. package/dist/schema/forms.js.map +1 -1
  323. package/dist/schema/index.d.ts +7 -7
  324. package/dist/schema/index.js +7 -7
  325. package/dist/schema/mail.d.ts +39 -87
  326. package/dist/schema/mail.js +4 -4
  327. package/dist/schema/mail.js.map +1 -1
  328. package/dist/schema/pages.d.ts +152 -674
  329. package/dist/schema/pages.js +26 -15
  330. package/dist/schema/pages.js.map +1 -1
  331. package/dist/schema/seo.d.ts +9 -27
  332. package/dist/schema/seo.js +7 -7
  333. package/dist/schema/seo.js.map +1 -1
  334. package/dist/schema/settings.d.ts +233 -1074
  335. package/dist/schema/settings.js +71 -56
  336. package/dist/schema/settings.js.map +1 -1
  337. package/dist/schema/shop.d.ts +470 -1214
  338. package/dist/schema/shop.js +124 -124
  339. package/dist/schema/shop.js.map +1 -1
  340. package/dist/schema/siteConfig.d.ts +78 -597
  341. package/dist/schema/siteConfig.js +17 -17
  342. package/dist/schema/siteConfig.js.map +1 -1
  343. package/dist/schema/symbols.d.ts +34 -191
  344. package/dist/schema/symbols.js +8 -8
  345. package/dist/schema/symbols.js.map +1 -1
  346. package/dist/server/auth.d.ts +17 -0
  347. package/dist/server/auth.js +11 -0
  348. package/dist/server/auth.js.map +1 -0
  349. package/dist/server/bundle.d.ts +15 -6
  350. package/dist/server/bundle.js +5 -1
  351. package/dist/server/bundle.js.map +1 -1
  352. package/dist/server/draft.d.ts +16 -0
  353. package/dist/server/draft.js +12 -0
  354. package/dist/server/draft.js.map +1 -0
  355. package/dist/server/env.js +8 -8
  356. package/dist/server/env.js.map +1 -1
  357. package/dist/server/index.d.ts +11 -9
  358. package/dist/server/index.js +13 -10
  359. package/dist/server/index.js.map +1 -1
  360. package/dist/server/pages.d.ts +11 -4
  361. package/dist/server/pages.js +43 -15
  362. package/dist/server/pages.js.map +1 -1
  363. package/dist/server/revalidate.js +11 -2
  364. package/dist/server/revalidate.js.map +1 -1
  365. package/dist/server/seo.d.ts +3 -3
  366. package/dist/server/seo.js +1 -1
  367. package/dist/server/shop.d.ts +3 -3
  368. package/dist/server/shop.js +6 -3
  369. package/dist/server/shop.js.map +1 -1
  370. package/dist/server/version.d.ts +16 -0
  371. package/dist/server/version.js +17 -0
  372. package/dist/server/version.js.map +1 -0
  373. package/dist/settings/useSiteSettings.d.ts +2 -2
  374. package/dist/settings/useSiteSettings.js +48 -28
  375. package/dist/settings/useSiteSettings.js.map +1 -1
  376. package/dist/styles.css +30 -4
  377. package/dist/theme/presets.d.ts +1 -1
  378. package/dist/version.d.ts +8 -0
  379. package/dist/version.js +16 -0
  380. package/dist/version.js.map +1 -0
  381. package/package.json +35 -34
@@ -1,357 +1,347 @@
1
- import { z } from "zod";
1
+ import * as z from "zod/mini";
2
2
  const BlockStyleSchema = z.object({
3
- paddingY: z.enum(["none", "sm", "md", "lg", "xl"]).optional(),
4
- background: z.string().max(40).optional(),
5
- width: z.enum(["container", "full", "narrow"]).optional(),
6
- align: z.enum(["left", "center", "right"]).optional(),
7
- anchorId: z.string().max(60).optional(),
3
+ paddingY: z.optional(z.enum(["none", "sm", "md", "lg", "xl"])),
4
+ background: z.optional(z.string().check(z.maxLength(40))),
5
+ width: z.optional(z.enum(["container", "full", "narrow"])),
6
+ align: z.optional(z.enum(["left", "center", "right"])),
7
+ anchorId: z.optional(z.string().check(z.maxLength(60))),
8
8
  /** Subtiele binnenkomst-animatie bij scrollen (progressief + respecteert reduced-motion). */
9
- animate: z.enum(["fade", "up"]).optional()
9
+ animate: z.optional(z.enum(["fade", "up"]))
10
10
  });
11
11
  const blockBase = {
12
- _key: z.string().min(1).max(64),
12
+ _key: z.string().check(z.minLength(1)).check(z.maxLength(64)),
13
13
  /** Optionele gedeelde blokstijl (ruimte/achtergrond/breedte/uitlijning/anker). */
14
- _style: BlockStyleSchema.optional()
14
+ _style: z.optional(BlockStyleSchema)
15
15
  };
16
- const BlockBaseSchema = z.object({ ...blockBase, _type: z.string().min(1).max(60) }).passthrough();
17
- const ref = z.string().max(256);
18
- const richText = z.string().max(1e5);
19
- const shortText = z.string().max(2e3);
16
+ const BlockBaseSchema = z.looseObject({ ...blockBase, _type: z.string().check(z.minLength(1)).check(z.maxLength(60)) });
17
+ const ref = z.string().check(z.maxLength(256));
18
+ const richText = z.string().check(z.maxLength(1e5));
19
+ const shortText = z.string().check(z.maxLength(2e3));
20
20
  const ButtonSchema = z.object({
21
- label: shortText.default(""),
22
- href: z.string().max(2e3).default("#"),
23
- variant: z.enum(["primary", "secondary", "outline"]).default("primary")
21
+ label: z._default(shortText, ""),
22
+ href: z._default(z.string().check(z.maxLength(2e3)), "#"),
23
+ variant: z._default(z.enum(["primary", "secondary", "outline"]), "primary")
24
24
  });
25
25
  const HeroBlockSchema = z.object({
26
26
  ...blockBase,
27
27
  _type: z.literal("hero"),
28
28
  /** Kicker/eyebrow: klein regeltje bóven de titel (bv. "Hoveniers sinds 2001"). */
29
- eyebrow: shortText.optional().describe("Regeltje boven de titel"),
30
- title: shortText.default(""),
31
- subtitle: shortText.optional(),
32
- imageUrl: z.string().max(2e3).optional(),
29
+ eyebrow: z.optional(shortText).register(z.globalRegistry, { description: "Regeltje boven de titel" }),
30
+ title: z._default(shortText, ""),
31
+ subtitle: z.optional(shortText),
32
+ imageUrl: z.optional(z.string().check(z.maxLength(2e3))),
33
33
  /** Videoachtergrond (mp4/webm); overschrijft de afbeelding als gezet. */
34
- videoUrl: z.string().max(2e3).optional(),
34
+ videoUrl: z.optional(z.string().check(z.maxLength(2e3))),
35
35
  /** Kopniveau: "1" voor dé hoofdkop; "2" voor een tweede hero op dezelfde pagina
36
36
  * (twee h1's = slechte SEO/a11y). */
37
- headingLevel: z.enum(["1", "2"]).default("1").describe("Kopniveau (h1/h2)"),
38
- align: z.enum(["left", "center"]).default("left"),
37
+ headingLevel: z._default(z.enum(["1", "2"]), "1").register(z.globalRegistry, { description: "Kopniveau (h1/h2)" }),
38
+ align: z._default(z.enum(["left", "center"]), "left"),
39
39
  /** Verticale uitlijning van de inhoud binnen de hero. */
40
- vAlign: z.enum(["top", "center", "bottom"]).default("center"),
40
+ vAlign: z._default(z.enum(["top", "center", "bottom"]), "center"),
41
41
  /** Hoogte: sm/md/lg of volledige viewport. */
42
- minHeight: z.enum(["auto", "sm", "md", "lg", "full"]).default("auto"),
42
+ minHeight: z._default(z.enum(["auto", "sm", "md", "lg", "full"]), "auto"),
43
43
  /** Donkere/gekleurde overlay over het beeld voor leesbaar contrast. */
44
- overlayColor: z.string().max(40).optional(),
45
- overlayOpacity: z.number().min(0).max(100).default(0),
44
+ overlayColor: z.optional(z.string().check(z.maxLength(40))),
45
+ overlayOpacity: z._default(z.number().check(z.minimum(0)).check(z.maximum(100)), 0),
46
46
  /** Gradient-overlay (donker onderaan → transparant boven) voor leesbare tekst op foto's. */
47
- overlayGradient: z.boolean().default(false).describe("Gradient-overlay"),
47
+ overlayGradient: z._default(z.boolean(), false).register(z.globalRegistry, { description: "Gradient-overlay" }),
48
48
  /** Ingebouwde call-to-action-knoppen. */
49
- buttons: z.array(ButtonSchema).max(3).default([])
49
+ buttons: z._default(z.array(ButtonSchema).check(z.maxLength(3)), [])
50
50
  });
51
51
  const RichTextBlockSchema = z.object({
52
52
  ...blockBase,
53
53
  _type: z.literal("richText"),
54
- html: richText.default("")
54
+ html: z._default(richText, "")
55
55
  });
56
56
  const ImageBlockSchema = z.object({
57
57
  ...blockBase,
58
58
  _type: z.literal("image"),
59
- url: z.string().max(2e3).optional(),
60
- alt: shortText.default(""),
61
- caption: shortText.optional(),
59
+ url: z.optional(z.string().check(z.maxLength(2e3))),
60
+ alt: z._default(shortText, ""),
61
+ caption: z.optional(shortText),
62
62
  /** Maak de afbeelding klikbaar. */
63
- href: z.string().max(2e3).optional(),
63
+ href: z.optional(z.string().check(z.maxLength(2e3))),
64
64
  /** Uitlijning binnen de kolom. */
65
- align: z.enum(["left", "center", "right"]).default("center"),
65
+ align: z._default(z.enum(["left", "center", "right"]), "center"),
66
66
  /** Forceer een beeldverhouding (anders natuurlijk). */
67
- aspectRatio: z.enum(["auto", "16/9", "4/3", "1/1", "3/2"]).default("auto")
67
+ aspectRatio: z._default(z.enum(["auto", "16/9", "4/3", "1/1", "3/2"]), "auto")
68
68
  });
69
69
  const GalleryBlockSchema = z.object({
70
70
  ...blockBase,
71
71
  _type: z.literal("gallery"),
72
- items: z.array(
73
- z.object({
74
- url: z.string().max(2e3).optional(),
75
- alt: shortText.default(""),
76
- // Update-veilig toegevoegd (Galerij+): optioneel bijschrift onder de foto / in de lightbox.
77
- caption: shortText.optional(),
78
- /** Categorie/label voor de filterbalk (bv. "tuinen", "bestrating"). */
79
- tag: shortText.optional()
80
- })
81
- ).max(60).default([]),
72
+ items: z._default(z.array(z.object({
73
+ url: z.optional(z.string().check(z.maxLength(2e3))),
74
+ alt: z._default(shortText, ""),
75
+ // Update-veilig toegevoegd (Galerij+): optioneel bijschrift onder de foto / in de lightbox.
76
+ caption: z.optional(shortText),
77
+ /** Categorie/label voor de filterbalk (bv. "tuinen", "bestrating"). */
78
+ tag: z.optional(shortText)
79
+ })).check(z.maxLength(60)), []),
82
80
  /** Filterbalk op item-tags tonen (alleen zichtbaar als er tags zijn). */
83
- showFilter: z.boolean().default(false).describe("Filterbalk op tags"),
81
+ showFilter: z._default(z.boolean(), false).register(z.globalRegistry, { description: "Filterbalk op tags" }),
84
82
  /** Aantal kolommen in het grid (0 = volg de module-instelling). */
85
- columns: z.number().int().min(0).max(6).default(0),
83
+ columns: z._default(z.int().check(z.minimum(0)).check(z.maximum(6)), 0),
86
84
  /** Klikken opent een lightbox (0 = volg de module-instelling). */
87
- lightbox: z.enum(["inherit", "on", "off"]).default("inherit"),
85
+ lightbox: z._default(z.enum(["inherit", "on", "off"]), "inherit"),
88
86
  /** Beeldverhouding van de thumbnails. "auto" behoudt de eigen verhouding. */
89
- aspectRatio: z.enum(["1/1", "4/3", "3/2", "16/9", "auto"]).default("1/1")
87
+ aspectRatio: z._default(z.enum(["1/1", "4/3", "3/2", "16/9", "auto"]), "1/1")
90
88
  });
91
89
  const CtaBlockSchema = z.object({
92
90
  ...blockBase,
93
91
  _type: z.literal("cta"),
94
- title: shortText.default(""),
95
- text: shortText.optional(),
96
- buttonLabel: shortText.default("Neem contact op"),
97
- buttonHref: z.string().max(2e3).default("#contact"),
92
+ title: z._default(shortText, ""),
93
+ text: z.optional(shortText),
94
+ buttonLabel: z._default(shortText, "Neem contact op"),
95
+ buttonHref: z._default(z.string().check(z.maxLength(2e3)), "#contact"),
98
96
  /** Stijl van de hoofdknop. */
99
- buttonVariant: z.enum(["primary", "secondary", "outline"]).default("primary"),
97
+ buttonVariant: z._default(z.enum(["primary", "secondary", "outline"]), "primary"),
100
98
  /** Optionele tweede knop. */
101
- button2Label: shortText.optional(),
102
- button2Href: z.string().max(2e3).optional(),
99
+ button2Label: z.optional(shortText),
100
+ button2Href: z.optional(z.string().check(z.maxLength(2e3))),
103
101
  /** Achtergrondkleur (CSS-waarde); leeg = thema-default. */
104
- backgroundColor: z.string().max(40).optional(),
102
+ backgroundColor: z.optional(z.string().check(z.maxLength(40))),
105
103
  /** Toon de CTA als vaste balk onderaan het scherm (sticky). */
106
- sticky: z.boolean().default(false)
104
+ sticky: z._default(z.boolean(), false)
107
105
  });
108
106
  const FaqBlockSchema = z.object({
109
107
  ...blockBase,
110
108
  _type: z.literal("faq"),
111
- heading: shortText.optional(),
112
- items: z.array(z.object({
113
- q: shortText.default(""),
114
- a: shortText.default(""),
109
+ heading: z.optional(shortText),
110
+ items: z._default(z.array(z.object({
111
+ q: z._default(shortText, ""),
112
+ a: z._default(shortText, ""),
115
113
  /** Optioneel rich-text-antwoord (HTML, met links/lijsten); wint van `a` als gezet. */
116
- aHtml: richText.optional()
117
- })).max(50).default([]),
114
+ aHtml: z.optional(richText)
115
+ })).check(z.maxLength(50)), []),
118
116
  /** FAQ+: toon een zoekveld dat de vragen filtert (handig bij lange lijsten). */
119
- searchable: z.boolean().default(false),
117
+ searchable: z._default(z.boolean(), false),
120
118
  /** FAQ+: voeg FAQPage-JSON-LD toe voor rich results in Google. */
121
- jsonLd: z.boolean().default(false),
119
+ jsonLd: z._default(z.boolean(), false),
122
120
  /** Of items standaard open staan. Default dicht (gebruikelijke FAQ-UX). */
123
- defaultOpen: z.boolean().default(false)
121
+ defaultOpen: z._default(z.boolean(), false)
124
122
  });
125
123
  const OpeningHoursBlockSchema = z.object({
126
124
  ...blockBase,
127
125
  _type: z.literal("openingHours"),
128
- heading: shortText.optional(),
129
- rows: z.array(z.object({ day: shortText.default(""), hours: shortText.default("") })).max(14).default([]),
126
+ heading: z.optional(shortText),
127
+ rows: z._default(z.array(z.object({ day: z._default(shortText, ""), hours: z._default(shortText, "") })).check(z.maxLength(14)), []),
130
128
  /** Live "Nu geopend/gesloten"-badge (werkt bij herkenbare tijden zoals "09:00 – 17:00"). */
131
- showStatus: z.boolean().default(false).describe("'Nu geopend'-badge tonen"),
129
+ showStatus: z._default(z.boolean(), false).register(z.globalRegistry, { description: "'Nu geopend'-badge tonen" }),
132
130
  /** OpeningHoursSpecification-JSON-LD voor zoekmachines. */
133
- jsonLd: z.boolean().default(false).describe("JSON-LD (openingstijden)")
131
+ jsonLd: z._default(z.boolean(), false).register(z.globalRegistry, { description: "JSON-LD (openingstijden)" })
134
132
  });
135
133
  const PricingBlockSchema = z.object({
136
134
  ...blockBase,
137
135
  _type: z.literal("pricing"),
138
- heading: shortText.optional(),
139
- items: z.array(
140
- z.object({
141
- label: shortText.default(""),
142
- price: shortText.default(""),
143
- detail: shortText.optional(),
144
- /** Inbegrepen features (lijst met vinkjes). */
145
- features: z.array(shortText).max(20).optional(),
146
- /** Per-tier knop. */
147
- ctaLabel: shortText.optional(),
148
- ctaHref: z.string().max(2e3).optional(),
149
- /** Markeer als uitgelichte tier. */
150
- highlighted: z.boolean().default(false),
151
- /** bv. "/maand". */
152
- billingPeriod: shortText.optional()
153
- })
154
- ).max(30).default([]),
155
- note: shortText.optional(),
136
+ heading: z.optional(shortText),
137
+ items: z._default(z.array(z.object({
138
+ label: z._default(shortText, ""),
139
+ price: z._default(shortText, ""),
140
+ detail: z.optional(shortText),
141
+ /** Inbegrepen features (lijst met vinkjes). */
142
+ features: z.optional(z.array(shortText).check(z.maxLength(20))),
143
+ /** Per-tier knop. */
144
+ ctaLabel: z.optional(shortText),
145
+ ctaHref: z.optional(z.string().check(z.maxLength(2e3))),
146
+ /** Markeer als uitgelichte tier. */
147
+ highlighted: z._default(z.boolean(), false),
148
+ /** bv. "/maand". */
149
+ billingPeriod: z.optional(shortText)
150
+ })).check(z.maxLength(30)), []),
151
+ note: z.optional(shortText),
156
152
  /** ISO-valutacode voor de JSON-LD (bv. "EUR", "USD"). */
157
- currency: z.string().max(8).default("EUR").describe("Valuta (ISO-code)"),
153
+ currency: z._default(z.string().check(z.maxLength(8)), "EUR").register(z.globalRegistry, { description: "Valuta (ISO-code)" }),
158
154
  /** Voeg Product/Offer-JSON-LD toe. */
159
- jsonLd: z.boolean().default(false)
155
+ jsonLd: z._default(z.boolean(), false)
160
156
  });
161
157
  const NewsListBlockSchema = z.object({
162
158
  ...blockBase,
163
159
  _type: z.literal("newsList"),
164
- heading: shortText.optional(),
165
- limit: z.number().int().min(1).max(50).default(6),
160
+ heading: z.optional(shortText),
161
+ limit: z._default(z.int().check(z.minimum(1)).check(z.maximum(50)), 6),
166
162
  /** Toon eerst dit aantal en de rest via "Meer laden" (0 = alles ineens, huidig gedrag). */
167
- pageSize: z.number().int().min(0).max(24).default(0).describe("Per pagina (0 = alles)"),
168
- basePath: z.string().max(200).default("/nieuws")
163
+ pageSize: z._default(z.int().check(z.minimum(0)).check(z.maximum(24)), 0).register(z.globalRegistry, { description: "Per pagina (0 = alles)" }),
164
+ basePath: z._default(z.string().check(z.maxLength(200)), "/nieuws")
169
165
  });
170
166
  const FormBlockSchema = z.object({
171
167
  ...blockBase,
172
168
  _type: z.literal("form"),
173
169
  formId: ref,
174
- heading: shortText.optional()
170
+ heading: z.optional(shortText)
175
171
  });
176
172
  const SpacerBlockSchema = z.object({
177
173
  ...blockBase,
178
174
  _type: z.literal("spacer"),
179
- size: z.enum(["sm", "md", "lg", "xl"]).default("md")
175
+ size: z._default(z.enum(["sm", "md", "lg", "xl"]), "md")
180
176
  });
181
177
  const TestimonialsBlockSchema = z.object({
182
178
  ...blockBase,
183
179
  _type: z.literal("testimonials"),
184
- heading: shortText.optional(),
185
- items: z.array(
186
- z.object({
187
- quote: shortText.default(""),
188
- author: shortText.default(""),
189
- role: shortText.optional(),
190
- rating: z.number().int().min(1).max(5).optional(),
191
- avatarUrl: z.string().max(2e3).optional()
192
- })
193
- ).max(40).default([]),
180
+ heading: z.optional(shortText),
181
+ items: z._default(z.array(z.object({
182
+ quote: z._default(shortText, ""),
183
+ author: z._default(shortText, ""),
184
+ role: z.optional(shortText),
185
+ rating: z.optional(z.int().check(z.minimum(1)).check(z.maximum(5))),
186
+ avatarUrl: z.optional(z.string().check(z.maxLength(2e3)))
187
+ })).check(z.maxLength(40)), []),
194
188
  /** Weergave: lijst (kaarten) of grid. */
195
- layout: z.enum(["list", "grid"]).default("grid"),
189
+ layout: z._default(z.enum(["list", "grid"]), "grid"),
196
190
  /** Voeg Review-JSON-LD toe (rich results). */
197
- jsonLd: z.boolean().default(false)
191
+ jsonLd: z._default(z.boolean(), false)
198
192
  });
199
193
  const TeamBlockSchema = z.object({
200
194
  ...blockBase,
201
195
  _type: z.literal("team"),
202
- heading: shortText.optional(),
203
- members: z.array(
204
- z.object({
205
- name: shortText.default(""),
206
- role: shortText.optional(),
207
- photoUrl: z.string().max(2e3).optional(),
208
- bio: shortText.optional(),
209
- email: z.string().max(320).optional(),
210
- phone: shortText.optional(),
211
- social: z.array(z.object({ platform: shortText, href: z.string().max(2e3) })).max(6).optional(),
212
- /** Afdeling/team voor groepering (bv. "Keuken", "Bediening"). */
213
- department: shortText.optional()
214
- })
215
- ).max(60).default([]),
196
+ heading: z.optional(shortText),
197
+ members: z._default(z.array(z.object({
198
+ name: z._default(shortText, ""),
199
+ role: z.optional(shortText),
200
+ photoUrl: z.optional(z.string().check(z.maxLength(2e3))),
201
+ bio: z.optional(shortText),
202
+ email: z.optional(z.string().check(z.maxLength(320))),
203
+ phone: z.optional(shortText),
204
+ social: z.optional(z.array(z.object({ platform: shortText, href: z.string().check(z.maxLength(2e3)) })).check(z.maxLength(6))),
205
+ /** Afdeling/team voor groepering (bv. "Keuken", "Bediening"). */
206
+ department: z.optional(shortText)
207
+ })).check(z.maxLength(60)), []),
216
208
  /** Voeg Person-JSON-LD per lid toe. */
217
- jsonLd: z.boolean().default(false),
209
+ jsonLd: z._default(z.boolean(), false),
218
210
  /** Groepeer leden per afdeling (kopje per afdeling). */
219
- groupByDepartment: z.boolean().default(false).describe("Groeperen per afdeling")
211
+ groupByDepartment: z._default(z.boolean(), false).register(z.globalRegistry, { description: "Groeperen per afdeling" })
220
212
  });
221
213
  const AgendaBlockSchema = z.object({
222
214
  ...blockBase,
223
215
  _type: z.literal("agenda"),
224
- heading: shortText.optional(),
225
- events: z.array(
226
- z.object({
227
- title: shortText.default(""),
228
- /** ISO-datum of -datetime, bv. "2026-07-01" of "2026-07-01T19:30". */
229
- start: z.string().max(40).default(""),
230
- end: z.string().max(40).optional(),
231
- location: shortText.optional(),
232
- description: shortText.optional(),
233
- url: z.string().max(2e3).optional()
234
- })
235
- ).max(100).default([]),
216
+ heading: z.optional(shortText),
217
+ events: z._default(z.array(z.object({
218
+ title: z._default(shortText, ""),
219
+ /** ISO-datum of -datetime, bv. "2026-07-01" of "2026-07-01T19:30". */
220
+ start: z._default(z.string().check(z.maxLength(40)), ""),
221
+ end: z.optional(z.string().check(z.maxLength(40))),
222
+ location: z.optional(shortText),
223
+ description: z.optional(shortText),
224
+ url: z.optional(z.string().check(z.maxLength(2e3)))
225
+ })).check(z.maxLength(100)), []),
236
226
  /** Verberg events waarvan de startdatum in het verleden ligt. */
237
- hidePast: z.boolean().default(true),
227
+ hidePast: z._default(z.boolean(), true),
238
228
  /** Voeg Event-JSON-LD toe. */
239
- jsonLd: z.boolean().default(false)
229
+ jsonLd: z._default(z.boolean(), false)
240
230
  });
241
231
  const SearchBlockSchema = z.object({
242
232
  ...blockBase,
243
233
  _type: z.literal("search"),
244
- placeholder: shortText.default("Zoeken\u2026"),
234
+ placeholder: z._default(shortText, "Zoeken\u2026"),
245
235
  /** Ook nieuwsartikelen doorzoeken (naast pagina's). */
246
- includeNews: z.boolean().default(true)
236
+ includeNews: z._default(z.boolean(), true)
247
237
  });
248
238
  const VideoBlockSchema = z.object({
249
239
  ...blockBase,
250
240
  _type: z.literal("video"),
251
- provider: z.enum(["youtube", "vimeo", "file"]).default("youtube"),
241
+ provider: z._default(z.enum(["youtube", "vimeo", "file"]), "youtube"),
252
242
  /** YouTube/Vimeo-id of -URL, of een mp4/webm-URL bij "file". */
253
- src: z.string().max(2e3).default(""),
254
- title: shortText.optional(),
255
- caption: shortText.optional(),
243
+ src: z._default(z.string().check(z.maxLength(2e3)), ""),
244
+ title: z.optional(shortText),
245
+ caption: z.optional(shortText),
256
246
  /** Voorvertoningsbeeld (bij provider "file" als poster; met facade ook voor embeds). */
257
- posterUrl: z.string().max(2e3).optional().describe("Voorvertoningsbeeld"),
247
+ posterUrl: z.optional(z.string().check(z.maxLength(2e3))).register(z.globalRegistry, { description: "Voorvertoningsbeeld" }),
258
248
  /** Click-to-play: toon eerst een thumbnail met play-knop; de speler laadt pas na een klik
259
249
  * (sneller laden, minder third-party requests). */
260
- facade: z.boolean().default(false).describe("Click-to-play (laad speler pas na klik)"),
250
+ facade: z._default(z.boolean(), false).register(z.globalRegistry, { description: "Click-to-play (laad speler pas na klik)" }),
261
251
  /** Toon pas na cookie-consent (categorie "marketing"). */
262
- consentGated: z.boolean().default(true)
252
+ consentGated: z._default(z.boolean(), true)
263
253
  });
264
254
  const FeatureBlockSchema = z.object({
265
255
  ...blockBase,
266
256
  _type: z.literal("feature"),
267
- heading: shortText.optional(),
257
+ heading: z.optional(shortText),
268
258
  /** Rich text (veldnaam "html" zodat het server-side gesanitized wordt bij publiceren). */
269
- html: richText.default(""),
270
- imageUrl: z.string().max(2e3).optional(),
271
- imagePosition: z.enum(["left", "right"]).default("left"),
272
- buttonLabel: shortText.optional(),
273
- buttonHref: z.string().max(2e3).optional()
259
+ html: z._default(richText, ""),
260
+ imageUrl: z.optional(z.string().check(z.maxLength(2e3))),
261
+ imagePosition: z._default(z.enum(["left", "right"]), "left"),
262
+ buttonLabel: z.optional(shortText),
263
+ buttonHref: z.optional(z.string().check(z.maxLength(2e3)))
274
264
  });
275
265
  const BannerBlockSchema = z.object({
276
266
  ...blockBase,
277
267
  _type: z.literal("banner"),
278
- text: shortText.default(""),
279
- href: z.string().max(2e3).optional(),
280
- linkLabel: shortText.optional(),
281
- tone: z.enum(["info", "success", "warning"]).default("info"),
282
- dismissible: z.boolean().default(true),
268
+ text: z._default(shortText, ""),
269
+ href: z.optional(z.string().check(z.maxLength(2e3))),
270
+ linkLabel: z.optional(shortText),
271
+ tone: z._default(z.enum(["info", "success", "warning"]), "info"),
272
+ dismissible: z._default(z.boolean(), true),
283
273
  /** Wijzig deze waarde (bv. "2") als de tekst verandert — wie de oude balk wegklikte ziet de nieuwe weer. */
284
- dismissVersion: shortText.optional().describe("Versie (wijzig om balk opnieuw te tonen)")
274
+ dismissVersion: z.optional(shortText).register(z.globalRegistry, { description: "Versie (wijzig om balk opnieuw te tonen)" })
285
275
  });
286
276
  const CountersBlockSchema = z.object({
287
277
  ...blockBase,
288
278
  _type: z.literal("counters"),
289
- heading: shortText.optional(),
290
- items: z.array(z.object({ value: shortText.default(""), label: shortText.default(""), prefix: shortText.optional(), suffix: shortText.optional() })).max(8).default([]),
279
+ heading: z.optional(shortText),
280
+ items: z._default(z.array(z.object({ value: z._default(shortText, ""), label: z._default(shortText, ""), prefix: z.optional(shortText), suffix: z.optional(shortText) })).check(z.maxLength(8)), []),
291
281
  /** Tel omhoog wanneer het blok in beeld scrolt (respecteert prefers-reduced-motion). */
292
- animate: z.boolean().default(true).describe("Tel-animatie")
282
+ animate: z._default(z.boolean(), true).register(z.globalRegistry, { description: "Tel-animatie" })
293
283
  });
294
284
  const LogosBlockSchema = z.object({
295
285
  ...blockBase,
296
286
  _type: z.literal("logos"),
297
- heading: shortText.optional(),
298
- items: z.array(z.object({ src: z.string().max(2e3).default(""), alt: shortText.default(""), href: z.string().max(2e3).optional() })).max(40).default([]),
299
- grayscale: z.boolean().default(true),
287
+ heading: z.optional(shortText),
288
+ items: z._default(z.array(z.object({ src: z._default(z.string().check(z.maxLength(2e3)), ""), alt: z._default(shortText, ""), href: z.optional(z.string().check(z.maxLength(2e3))) })).check(z.maxLength(40)), []),
289
+ grayscale: z._default(z.boolean(), true),
300
290
  /** Doorlopende band (marquee) i.p.v. statische rij; pauzeert bij hover, statisch bij reduced-motion. */
301
- marquee: z.boolean().default(false).describe("Doorlopende band")
291
+ marquee: z._default(z.boolean(), false).register(z.globalRegistry, { description: "Doorlopende band" })
302
292
  });
303
293
  const TimelineBlockSchema = z.object({
304
294
  ...blockBase,
305
295
  _type: z.literal("timeline"),
306
- heading: shortText.optional(),
307
- items: z.array(z.object({ title: shortText.default(""), date: shortText.optional(), text: shortText.optional(), icon: shortText.optional() })).max(40).default([]),
296
+ heading: z.optional(shortText),
297
+ items: z._default(z.array(z.object({ title: z._default(shortText, ""), date: z.optional(shortText), text: z.optional(shortText), icon: z.optional(shortText) })).check(z.maxLength(40)), []),
308
298
  /** Alternerende links/rechts-layout op bredere schermen. */
309
- alternate: z.boolean().default(false).describe("Alternerende layout")
299
+ alternate: z._default(z.boolean(), false).register(z.globalRegistry, { description: "Alternerende layout" })
310
300
  });
311
301
  const ContactBlockSchema = z.object({
312
302
  ...blockBase,
313
303
  _type: z.literal("contact"),
314
- heading: shortText.optional(),
315
- address: shortText.optional(),
316
- phone: shortText.optional(),
317
- email: z.string().max(320).optional(),
318
- hours: shortText.optional(),
304
+ heading: z.optional(shortText),
305
+ address: z.optional(shortText),
306
+ phone: z.optional(shortText),
307
+ email: z.optional(z.string().check(z.maxLength(320))),
308
+ hours: z.optional(shortText),
319
309
  /** Coördinaten voor de JSON-LD (Google toont het bedrijf dan op de juiste plek). */
320
- geo: z.object({ lat: z.number().min(-90).max(90), lng: z.number().min(-180).max(180) }).optional(),
310
+ geo: z.optional(z.object({ lat: z.number().check(z.minimum(-90)).check(z.maximum(90)), lng: z.number().check(z.minimum(-180)).check(z.maximum(180)) })),
321
311
  /** Voeg ContactPoint/LocalBusiness-JSON-LD toe. */
322
- jsonLd: z.boolean().default(false)
312
+ jsonLd: z._default(z.boolean(), false)
323
313
  });
324
314
  const MapBlockSchema = z.object({
325
315
  ...blockBase,
326
316
  _type: z.literal("map"),
327
- provider: z.enum(["osm", "google"]).default("osm"),
317
+ provider: z._default(z.enum(["osm", "google"]), "osm"),
328
318
  /** Adres/zoekterm (osm, legacy-fallback) of volledige embed-URL (google). */
329
- query: shortText.default(""),
319
+ query: z._default(shortText, ""),
330
320
  /** OSM-coördinaten; hieruit + zoom bouwt de render een echte bbox (geen wereldkaart meer). */
331
- lat: z.number().min(-90).max(90).optional().describe("Breedtegraad (lat)"),
332
- lng: z.number().min(-180).max(180).optional().describe("Lengtegraad (lng)"),
333
- zoom: z.number().int().min(1).max(20).default(14),
334
- height: z.number().int().min(150).max(800).default(360),
335
- consentGated: z.boolean().default(true)
321
+ lat: z.optional(z.number().check(z.minimum(-90)).check(z.maximum(90))).register(z.globalRegistry, { description: "Breedtegraad (lat)" }),
322
+ lng: z.optional(z.number().check(z.minimum(-180)).check(z.maximum(180))).register(z.globalRegistry, { description: "Lengtegraad (lng)" }),
323
+ zoom: z._default(z.int().check(z.minimum(1)).check(z.maximum(20)), 14),
324
+ height: z._default(z.int().check(z.minimum(150)).check(z.maximum(800)), 360),
325
+ consentGated: z._default(z.boolean(), true)
336
326
  });
337
327
  const SocialBlockSchema = z.object({
338
328
  ...blockBase,
339
329
  _type: z.literal("social"),
340
- heading: shortText.optional(),
341
- items: z.array(z.object({ platform: shortText.default(""), href: z.string().max(2e3).default("") })).max(12).default([])
330
+ heading: z.optional(shortText),
331
+ items: z._default(z.array(z.object({ platform: z._default(shortText, ""), href: z._default(z.string().check(z.maxLength(2e3)), "") })).check(z.maxLength(12)), [])
342
332
  });
343
333
  const NewsletterBlockSchema = z.object({
344
334
  ...blockBase,
345
335
  _type: z.literal("newsletter"),
346
- heading: shortText.optional(),
347
- text: shortText.optional(),
348
- buttonLabel: shortText.default("Aanmelden"),
336
+ heading: z.optional(shortText),
337
+ text: z.optional(shortText),
338
+ buttonLabel: z._default(shortText, "Aanmelden"),
349
339
  /** Waar het e-mailadres heen gaat (extern aanmeld-endpoint, POST email). Leeg = XiCMS-formulier. */
350
- actionUrl: z.string().max(2e3).optional(),
340
+ actionUrl: z.optional(z.string().check(z.maxLength(2e3))),
351
341
  /** Formulier-id voor opslag via XiCMS (als actionUrl leeg is). */
352
- formId: ref.optional(),
342
+ formId: z.optional(ref),
353
343
  /** AVG: indien gezet verschijnt een verplichte akkoord-checkbox met deze tekst. */
354
- consentText: shortText.optional().describe("AVG-akkoordtekst (leeg = geen checkbox)")
344
+ consentText: z.optional(shortText).register(z.globalRegistry, { description: "AVG-akkoordtekst (leeg = geen checkbox)" })
355
345
  });
356
346
  const BookingProviderSchema = z.enum([
357
347
  "custom",
@@ -368,309 +358,299 @@ const BookingProviderSchema = z.enum([
368
358
  const BookingBlockSchema = z.object({
369
359
  ...blockBase,
370
360
  _type: z.literal("booking"),
371
- heading: shortText.optional(),
361
+ heading: z.optional(shortText),
372
362
  /** Welk reserveersysteem; bepaalt de embed-helper en uitleg in de editor. */
373
- provider: BookingProviderSchema.default("custom"),
363
+ provider: z._default(BookingProviderSchema, "custom"),
374
364
  /** Embed-URL of account/slug bij een preset-provider (bv. Calendly-link, Formitable-restaurant-id). */
375
- embedUrl: z.string().max(2e3).default(""),
376
- height: z.number().int().min(300).max(1200).default(630),
377
- consentGated: z.boolean().default(true)
365
+ embedUrl: z._default(z.string().check(z.maxLength(2e3)), ""),
366
+ height: z._default(z.int().check(z.minimum(300)).check(z.maximum(1200)), 630),
367
+ consentGated: z._default(z.boolean(), true)
378
368
  });
379
369
  const ButtonsBlockSchema = z.object({
380
370
  ...blockBase,
381
371
  _type: z.literal("buttons"),
382
- align: z.enum(["left", "center", "right"]).default("left"),
383
- items: z.array(z.object({ label: shortText.default(""), href: z.string().max(2e3).default("#"), variant: z.enum(["primary", "secondary", "outline"]).default("primary") })).max(6).default([])
372
+ align: z._default(z.enum(["left", "center", "right"]), "left"),
373
+ items: z._default(z.array(z.object({ label: z._default(shortText, ""), href: z._default(z.string().check(z.maxLength(2e3)), "#"), variant: z._default(z.enum(["primary", "secondary", "outline"]), "primary") })).check(z.maxLength(6)), [])
384
374
  });
385
375
  const QuoteBlockSchema = z.object({
386
376
  ...blockBase,
387
377
  _type: z.literal("quote"),
388
- text: shortText.default(""),
389
- author: shortText.optional(),
390
- role: shortText.optional()
378
+ text: z._default(shortText, ""),
379
+ author: z.optional(shortText),
380
+ role: z.optional(shortText)
391
381
  });
392
382
  const DividerBlockSchema = z.object({
393
383
  ...blockBase,
394
384
  _type: z.literal("divider"),
395
- variant: z.enum(["line", "dots", "space"]).default("line"),
396
- spacing: z.enum(["sm", "md", "lg"]).default("md")
385
+ variant: z._default(z.enum(["line", "dots", "space"]), "line"),
386
+ spacing: z._default(z.enum(["sm", "md", "lg"]), "md")
397
387
  });
398
388
  const AccordionBlockSchema = z.object({
399
389
  ...blockBase,
400
390
  _type: z.literal("accordion"),
401
- heading: shortText.optional(),
402
- items: z.array(z.object({
403
- title: shortText.default(""),
404
- body: shortText.default(""),
391
+ heading: z.optional(shortText),
392
+ items: z._default(z.array(z.object({
393
+ title: z._default(shortText, ""),
394
+ body: z._default(shortText, ""),
405
395
  /** Optioneel rich-text-paneel (HTML); wint van `body` als gezet. */
406
- bodyHtml: richText.optional()
407
- })).max(50).default([]),
396
+ bodyHtml: z.optional(richText)
397
+ })).check(z.maxLength(50)), []),
408
398
  /** Sta toe dat meerdere panelen tegelijk open staan. */
409
- multiple: z.boolean().default(false)
399
+ multiple: z._default(z.boolean(), false)
410
400
  });
411
401
  const EmbedBlockSchema = z.object({
412
402
  ...blockBase,
413
403
  _type: z.literal("embed"),
414
- url: z.string().max(2e3).default(""),
415
- title: shortText.optional(),
416
- height: z.number().int().min(150).max(1200).default(420),
404
+ url: z._default(z.string().check(z.maxLength(2e3)), ""),
405
+ title: z.optional(shortText),
406
+ height: z._default(z.int().check(z.minimum(150)).check(z.maximum(1200)), 420),
417
407
  /** Beeldverhouding; "fixed" gebruikt de vaste hoogte (huidig gedrag). */
418
- aspectRatio: z.enum(["fixed", "16/9", "4/3", "1/1"]).default("fixed").describe("Beeldverhouding"),
408
+ aspectRatio: z._default(z.enum(["fixed", "16/9", "4/3", "1/1"]), "fixed").register(z.globalRegistry, { description: "Beeldverhouding" }),
419
409
  /** Toon pas na cookie-toestemming (categorie "marketing"). */
420
- consentGated: z.boolean().default(true)
410
+ consentGated: z._default(z.boolean(), true)
421
411
  });
422
412
  const ColumnsBlockSchema = z.object({
423
413
  ...blockBase,
424
414
  _type: z.literal("columns"),
425
- columns: z.array(z.object({ blocks: z.array(BlockBaseSchema).max(50).default([]) })).min(1).max(4).default([])
415
+ columns: z._default(z.array(z.object({ blocks: z._default(z.array(BlockBaseSchema).check(z.maxLength(50)), []) })).check(z.minLength(1)).check(z.maxLength(4)), [])
426
416
  });
427
417
  const WithSidebarBlockSchema = z.object({
428
418
  ...blockBase,
429
419
  _type: z.literal("withSidebar"),
430
- main: z.array(BlockBaseSchema).max(50).default([]),
431
- aside: z.array(BlockBaseSchema).max(30).default([]),
432
- side: z.enum(["left", "right"]).default("right"),
433
- sidebarWidth: z.enum(["sm", "md", "lg"]).default("md"),
434
- sticky: z.boolean().default(true)
420
+ main: z._default(z.array(BlockBaseSchema).check(z.maxLength(50)), []),
421
+ aside: z._default(z.array(BlockBaseSchema).check(z.maxLength(30)), []),
422
+ side: z._default(z.enum(["left", "right"]), "right"),
423
+ sidebarWidth: z._default(z.enum(["sm", "md", "lg"]), "md"),
424
+ sticky: z._default(z.boolean(), true)
435
425
  });
436
426
  const TabsBlockSchema = z.object({
437
427
  ...blockBase,
438
428
  _type: z.literal("tabs"),
439
- tabs: z.array(z.object({ label: shortText.default("Tab"), blocks: z.array(BlockBaseSchema).max(30).default([]) })).min(1).max(10).default([])
429
+ tabs: z._default(z.array(z.object({ label: z._default(shortText, "Tab"), blocks: z._default(z.array(BlockBaseSchema).check(z.maxLength(30)), []) })).check(z.minLength(1)).check(z.maxLength(10)), [])
440
430
  });
441
431
  const CardsBlockSchema = z.object({
442
432
  ...blockBase,
443
433
  _type: z.literal("cards"),
444
- heading: shortText.optional(),
445
- intro: shortText.optional(),
446
- columns: z.number().int().min(1).max(4).default(3),
434
+ heading: z.optional(shortText),
435
+ intro: z.optional(shortText),
436
+ columns: z._default(z.int().check(z.minimum(1)).check(z.maximum(4)), 3),
447
437
  /** "cover" = beeld edge-to-edge bovenaan de kaart (postkaart-stijl); "inset" = ingekaderd. */
448
- imageStyle: z.enum(["inset", "cover"]).default("inset"),
449
- items: z.array(
450
- z.object({
451
- icon: shortText.optional(),
452
- imageUrl: z.string().max(2e3).optional(),
453
- title: shortText.default(""),
454
- text: shortText.optional(),
455
- href: z.string().max(2e3).optional(),
456
- linkLabel: shortText.optional(),
457
- /** Uitgelichte kaart (accentrand + subtiele schaal). */
458
- featured: z.boolean().default(false)
459
- })
460
- ).max(24).default([])
438
+ imageStyle: z._default(z.enum(["inset", "cover"]), "inset"),
439
+ items: z._default(z.array(z.object({
440
+ icon: z.optional(shortText),
441
+ imageUrl: z.optional(z.string().check(z.maxLength(2e3))),
442
+ title: z._default(shortText, ""),
443
+ text: z.optional(shortText),
444
+ href: z.optional(z.string().check(z.maxLength(2e3))),
445
+ linkLabel: z.optional(shortText),
446
+ /** Uitgelichte kaart (accentrand + subtiele schaal). */
447
+ featured: z._default(z.boolean(), false)
448
+ })).check(z.maxLength(24)), [])
461
449
  });
462
450
  const DownloadsBlockSchema = z.object({
463
451
  ...blockBase,
464
452
  _type: z.literal("downloads"),
465
- heading: shortText.optional(),
466
- items: z.array(z.object({ label: shortText.default(""), href: z.string().max(2e3).default(""), meta: shortText.optional() })).max(60).default([])
453
+ heading: z.optional(shortText),
454
+ items: z._default(z.array(z.object({ label: z._default(shortText, ""), href: z._default(z.string().check(z.maxLength(2e3)), ""), meta: z.optional(shortText) })).check(z.maxLength(60)), [])
467
455
  });
468
456
  const PdfBlockSchema = z.object({
469
457
  ...blockBase,
470
458
  _type: z.literal("pdf"),
471
- heading: shortText.optional(),
459
+ heading: z.optional(shortText),
472
460
  /** Eén of meer PDF's; bij meerdere verschijnen tabs (label) om te wisselen. */
473
- documents: z.array(z.object({ label: shortText.default(""), url: z.string().max(2e3).default("") })).max(12).default([]),
474
- height: z.number().int().min(300).max(1600).default(820),
461
+ documents: z._default(z.array(z.object({ label: z._default(shortText, ""), url: z._default(z.string().check(z.maxLength(2e3)), "") })).check(z.maxLength(12)), []),
462
+ height: z._default(z.int().check(z.minimum(300)).check(z.maximum(1600)), 820),
475
463
  /** Toon een "Open/Download"-link onder de viewer. */
476
- showDownload: z.boolean().default(true)
464
+ showDownload: z._default(z.boolean(), true)
477
465
  });
478
466
  const CountdownBlockSchema = z.object({
479
467
  ...blockBase,
480
468
  _type: z.literal("countdown"),
481
- heading: shortText.optional(),
469
+ heading: z.optional(shortText),
482
470
  /** ISO-datetime, bv. "2026-12-31T23:59". */
483
- target: z.string().max(40).default(""),
484
- expiredText: shortText.default("Het is zover!"),
485
- showLabels: z.boolean().default(true),
471
+ target: z._default(z.string().check(z.maxLength(40)), ""),
472
+ expiredText: z._default(shortText, "Het is zover!"),
473
+ showLabels: z._default(z.boolean(), true),
486
474
  /** Wat er gebeurt als de teller afloopt: melding tonen of het hele blok verbergen. */
487
- onExpire: z.enum(["message", "hide"]).default("message").describe("Na afloop")
475
+ onExpire: z._default(z.enum(["message", "hide"]), "message").register(z.globalRegistry, { description: "Na afloop" })
488
476
  });
489
477
  const SliderBlockSchema = z.object({
490
478
  ...blockBase,
491
479
  _type: z.literal("slider"),
492
- slides: z.array(
493
- z.object({
494
- imageUrl: z.string().max(2e3).optional(),
495
- alt: shortText.default(""),
496
- caption: shortText.optional(),
497
- href: z.string().max(2e3).optional()
498
- })
499
- ).max(20).default([]),
500
- autoplay: z.boolean().default(false),
480
+ slides: z._default(z.array(z.object({
481
+ imageUrl: z.optional(z.string().check(z.maxLength(2e3))),
482
+ alt: z._default(shortText, ""),
483
+ caption: z.optional(shortText),
484
+ href: z.optional(z.string().check(z.maxLength(2e3)))
485
+ })).check(z.maxLength(20)), []),
486
+ autoplay: z._default(z.boolean(), false),
501
487
  /** Interval in seconden bij autoplay. */
502
- interval: z.number().int().min(2).max(20).default(5),
503
- showDots: z.boolean().default(true),
504
- showArrows: z.boolean().default(true),
505
- aspectRatio: z.enum(["16/9", "4/3", "3/2", "1/1", "21/9"]).default("16/9")
488
+ interval: z._default(z.int().check(z.minimum(2)).check(z.maximum(20)), 5),
489
+ showDots: z._default(z.boolean(), true),
490
+ showArrows: z._default(z.boolean(), true),
491
+ aspectRatio: z._default(z.enum(["16/9", "4/3", "3/2", "1/1", "21/9"]), "16/9")
506
492
  });
507
493
  const WhatsappChatBlockSchema = z.object({
508
494
  ...blockBase,
509
495
  _type: z.literal("whatsappChat"),
510
496
  /** Telefoonnummer, internationaal (bv. "31612345678" of "+31 6 12345678"). */
511
- phone: shortText.default("").describe("Telefoonnummer (internationaal)"),
497
+ phone: z._default(shortText, "").register(z.globalRegistry, { description: "Telefoonnummer (internationaal)" }),
512
498
  /** Vooringevuld bericht in WhatsApp. */
513
- prefilledText: shortText.optional().describe("Vooringevuld bericht"),
499
+ prefilledText: z.optional(shortText).register(z.globalRegistry, { description: "Vooringevuld bericht" }),
514
500
  /** Tekstlabel naast het icoon (leeg = alleen icoon). */
515
- label: shortText.optional().describe("Label (optioneel)"),
516
- position: z.enum(["br", "bl"]).default("br").describe("Positie (rechts-/linksonder)")
501
+ label: z.optional(shortText).register(z.globalRegistry, { description: "Label (optioneel)" }),
502
+ position: z._default(z.enum(["br", "bl"]), "br").register(z.globalRegistry, { description: "Positie (rechts-/linksonder)" })
517
503
  });
518
504
  const BeforeAfterBlockSchema = z.object({
519
505
  ...blockBase,
520
506
  _type: z.literal("beforeAfter"),
521
- heading: shortText.optional(),
522
- beforeUrl: z.string().max(2e3).default(""),
523
- afterUrl: z.string().max(2e3).default(""),
524
- beforeLabel: shortText.default("Voor"),
525
- afterLabel: shortText.default("Na"),
526
- alt: shortText.default(""),
527
- aspectRatio: z.enum(["16/9", "4/3", "3/2", "1/1"]).default("4/3")
507
+ heading: z.optional(shortText),
508
+ beforeUrl: z._default(z.string().check(z.maxLength(2e3)), ""),
509
+ afterUrl: z._default(z.string().check(z.maxLength(2e3)), ""),
510
+ beforeLabel: z._default(shortText, "Voor"),
511
+ afterLabel: z._default(shortText, "Na"),
512
+ alt: z._default(shortText, ""),
513
+ aspectRatio: z._default(z.enum(["16/9", "4/3", "3/2", "1/1"]), "4/3")
528
514
  });
529
515
  const PortfolioBlockSchema = z.object({
530
516
  ...blockBase,
531
517
  _type: z.literal("portfolio"),
532
- heading: shortText.optional(),
533
- intro: shortText.optional(),
534
- columns: z.number().int().min(1).max(4).default(3),
535
- items: z.array(
536
- z.object({
537
- imageUrl: z.string().max(2e3).default(""),
538
- title: shortText.default(""),
539
- category: shortText.optional(),
540
- description: shortText.optional(),
541
- href: z.string().max(2e3).optional()
542
- })
543
- ).max(60).default([]),
518
+ heading: z.optional(shortText),
519
+ intro: z.optional(shortText),
520
+ columns: z._default(z.int().check(z.minimum(1)).check(z.maximum(4)), 3),
521
+ items: z._default(z.array(z.object({
522
+ imageUrl: z._default(z.string().check(z.maxLength(2e3)), ""),
523
+ title: z._default(shortText, ""),
524
+ category: z.optional(shortText),
525
+ description: z.optional(shortText),
526
+ href: z.optional(z.string().check(z.maxLength(2e3)))
527
+ })).check(z.maxLength(60)), []),
544
528
  /** Filterbalk op categorieën (alleen zichtbaar als er categorieën zijn). */
545
- showFilter: z.boolean().default(true).describe("Filterbalk op categorie\xEBn"),
546
- lightbox: z.boolean().default(true).describe("Lightbox bij klikken")
529
+ showFilter: z._default(z.boolean(), true).register(z.globalRegistry, { description: "Filterbalk op categorie\xEBn" }),
530
+ lightbox: z._default(z.boolean(), true).register(z.globalRegistry, { description: "Lightbox bij klikken" })
547
531
  });
548
532
  const JobsBlockSchema = z.object({
549
533
  ...blockBase,
550
534
  _type: z.literal("jobs"),
551
- heading: shortText.optional(),
552
- intro: shortText.optional(),
553
- items: z.array(
554
- z.object({
555
- title: shortText.default(""),
556
- location: shortText.optional(),
557
- /** bv. "Fulltime", "Parttime", "BBL". */
558
- employmentType: shortText.optional(),
559
- description: shortText.optional(),
560
- salary: shortText.optional(),
561
- applyUrl: z.string().max(2e3).optional(),
562
- /** ISO-datum van plaatsing (voor Google Jobs). */
563
- datePosted: shortText.optional()
564
- })
565
- ).max(30).default([]),
566
- jsonLd: z.boolean().default(true).describe("JSON-LD (Google Jobs)")
535
+ heading: z.optional(shortText),
536
+ intro: z.optional(shortText),
537
+ items: z._default(z.array(z.object({
538
+ title: z._default(shortText, ""),
539
+ location: z.optional(shortText),
540
+ /** bv. "Fulltime", "Parttime", "BBL". */
541
+ employmentType: z.optional(shortText),
542
+ description: z.optional(shortText),
543
+ salary: z.optional(shortText),
544
+ applyUrl: z.optional(z.string().check(z.maxLength(2e3))),
545
+ /** ISO-datum van plaatsing (voor Google Jobs). */
546
+ datePosted: z.optional(shortText)
547
+ })).check(z.maxLength(30)), []),
548
+ jsonLd: z._default(z.boolean(), true).register(z.globalRegistry, { description: "JSON-LD (Google Jobs)" })
567
549
  });
568
550
  const BreadcrumbsBlockSchema = z.object({
569
551
  ...blockBase,
570
552
  _type: z.literal("breadcrumbs"),
571
- homeLabel: shortText.default("Home"),
572
- jsonLd: z.boolean().default(true).describe("JSON-LD (BreadcrumbList)")
553
+ homeLabel: z._default(shortText, "Home"),
554
+ jsonLd: z._default(z.boolean(), true).register(z.globalRegistry, { description: "JSON-LD (BreadcrumbList)" })
573
555
  });
574
556
  const NewsWidgetSchema = z.object({
575
557
  ...blockBase,
576
558
  _type: z.literal("newsWidget"),
577
- heading: shortText.optional(),
578
- limit: z.number().int().min(1).max(12).default(5),
579
- basePath: z.string().max(200).default("/nieuws"),
580
- showImages: z.boolean().default(false)
559
+ heading: z.optional(shortText),
560
+ limit: z._default(z.int().check(z.minimum(1)).check(z.maximum(12)), 5),
561
+ basePath: z._default(z.string().check(z.maxLength(200)), "/nieuws"),
562
+ showImages: z._default(z.boolean(), false)
581
563
  });
582
564
  const AgendaWidgetSchema = z.object({
583
565
  ...blockBase,
584
566
  _type: z.literal("agendaWidget"),
585
- heading: shortText.optional(),
586
- limit: z.number().int().min(1).max(12).default(5),
587
- events: z.array(
588
- z.object({
589
- title: shortText.default(""),
590
- start: z.string().max(40).default(""),
591
- end: z.string().max(40).optional(),
592
- location: shortText.optional(),
593
- url: z.string().max(2e3).optional()
594
- })
595
- ).max(100).default([]),
596
- hidePast: z.boolean().default(true)
567
+ heading: z.optional(shortText),
568
+ limit: z._default(z.int().check(z.minimum(1)).check(z.maximum(12)), 5),
569
+ events: z._default(z.array(z.object({
570
+ title: z._default(shortText, ""),
571
+ start: z._default(z.string().check(z.maxLength(40)), ""),
572
+ end: z.optional(z.string().check(z.maxLength(40))),
573
+ location: z.optional(shortText),
574
+ url: z.optional(z.string().check(z.maxLength(2e3)))
575
+ })).check(z.maxLength(100)), []),
576
+ hidePast: z._default(z.boolean(), true)
597
577
  });
598
578
  const OpeningHoursWidgetSchema = z.object({
599
579
  ...blockBase,
600
580
  _type: z.literal("openingHoursWidget"),
601
- heading: shortText.optional(),
602
- rows: z.array(z.object({ day: shortText.default(""), hours: shortText.default("") })).max(14).default([]),
603
- highlightToday: z.boolean().default(true)
581
+ heading: z.optional(shortText),
582
+ rows: z._default(z.array(z.object({ day: z._default(shortText, ""), hours: z._default(shortText, "") })).check(z.maxLength(14)), []),
583
+ highlightToday: z._default(z.boolean(), true)
604
584
  });
605
585
  const ContactWidgetSchema = z.object({
606
586
  ...blockBase,
607
587
  _type: z.literal("contactWidget"),
608
- heading: shortText.optional(),
609
- address: shortText.optional(),
610
- phone: shortText.optional(),
611
- email: z.string().max(320).optional()
588
+ heading: z.optional(shortText),
589
+ address: z.optional(shortText),
590
+ phone: z.optional(shortText),
591
+ email: z.optional(z.string().check(z.maxLength(320)))
612
592
  });
613
593
  const SocialWidgetSchema = z.object({
614
594
  ...blockBase,
615
595
  _type: z.literal("socialWidget"),
616
- heading: shortText.optional(),
617
- items: z.array(z.object({ platform: shortText.default(""), href: z.string().max(2e3).default("") })).max(12).default([])
596
+ heading: z.optional(shortText),
597
+ items: z._default(z.array(z.object({ platform: z._default(shortText, ""), href: z._default(z.string().check(z.maxLength(2e3)), "") })).check(z.maxLength(12)), [])
618
598
  });
619
599
  const NewsletterWidgetSchema = z.object({
620
600
  ...blockBase,
621
601
  _type: z.literal("newsletterWidget"),
622
- heading: shortText.optional(),
623
- text: shortText.optional(),
624
- buttonLabel: shortText.default("Aanmelden"),
625
- actionUrl: z.string().max(2e3).optional()
602
+ heading: z.optional(shortText),
603
+ text: z.optional(shortText),
604
+ buttonLabel: z._default(shortText, "Aanmelden"),
605
+ actionUrl: z.optional(z.string().check(z.maxLength(2e3)))
626
606
  });
627
607
  const CtaWidgetSchema = z.object({
628
608
  ...blockBase,
629
609
  _type: z.literal("ctaWidget"),
630
- title: shortText.default(""),
631
- text: shortText.optional(),
632
- buttonLabel: shortText.default("Lees meer"),
633
- buttonHref: z.string().max(2e3).default("#"),
634
- backgroundColor: z.string().max(40).optional()
610
+ title: z._default(shortText, ""),
611
+ text: z.optional(shortText),
612
+ buttonLabel: z._default(shortText, "Lees meer"),
613
+ buttonHref: z._default(z.string().check(z.maxLength(2e3)), "#"),
614
+ backgroundColor: z.optional(z.string().check(z.maxLength(40)))
635
615
  });
636
616
  const GalleryWidgetSchema = z.object({
637
617
  ...blockBase,
638
618
  _type: z.literal("galleryWidget"),
639
- heading: shortText.optional(),
640
- items: z.array(z.object({ url: z.string().max(2e3).optional(), alt: shortText.default("") })).max(24).default([]),
641
- columns: z.number().int().min(2).max(4).default(3)
619
+ heading: z.optional(shortText),
620
+ items: z._default(z.array(z.object({ url: z.optional(z.string().check(z.maxLength(2e3))), alt: z._default(shortText, "") })).check(z.maxLength(24)), []),
621
+ columns: z._default(z.int().check(z.minimum(2)).check(z.maximum(4)), 3)
642
622
  });
643
623
  const TestimonialsWidgetSchema = z.object({
644
624
  ...blockBase,
645
625
  _type: z.literal("testimonialsWidget"),
646
- heading: shortText.optional(),
647
- items: z.array(z.object({ quote: shortText.default(""), author: shortText.default(""), rating: z.number().int().min(1).max(5).optional() })).max(20).default([])
626
+ heading: z.optional(shortText),
627
+ items: z._default(z.array(z.object({ quote: z._default(shortText, ""), author: z._default(shortText, ""), rating: z.optional(z.int().check(z.minimum(1)).check(z.maximum(5))) })).check(z.maxLength(20)), [])
648
628
  });
649
629
  const CardsWidgetSchema = z.object({
650
630
  ...blockBase,
651
631
  _type: z.literal("cardsWidget"),
652
- heading: shortText.optional(),
653
- items: z.array(z.object({ icon: shortText.optional(), title: shortText.default(""), text: shortText.optional(), href: z.string().max(2e3).optional() })).max(10).default([])
632
+ heading: z.optional(shortText),
633
+ items: z._default(z.array(z.object({ icon: z.optional(shortText), title: z._default(shortText, ""), text: z.optional(shortText), href: z.optional(z.string().check(z.maxLength(2e3))) })).check(z.maxLength(10)), [])
654
634
  });
655
635
  const DownloadsWidgetSchema = z.object({
656
636
  ...blockBase,
657
637
  _type: z.literal("downloadsWidget"),
658
- heading: shortText.optional(),
659
- limit: z.number().int().min(1).max(12).default(5),
660
- items: z.array(z.object({ label: shortText.default(""), href: z.string().max(2e3).default(""), meta: shortText.optional() })).max(60).default([])
638
+ heading: z.optional(shortText),
639
+ limit: z._default(z.int().check(z.minimum(1)).check(z.maximum(12)), 5),
640
+ items: z._default(z.array(z.object({ label: z._default(shortText, ""), href: z._default(z.string().check(z.maxLength(2e3)), ""), meta: z.optional(shortText) })).check(z.maxLength(60)), [])
661
641
  });
662
642
  const CountdownWidgetSchema = z.object({
663
643
  ...blockBase,
664
644
  _type: z.literal("countdownWidget"),
665
- heading: shortText.optional(),
666
- target: z.string().max(40).default(""),
667
- expiredText: shortText.default("Het is zover!")
645
+ heading: z.optional(shortText),
646
+ target: z._default(z.string().check(z.maxLength(40)), ""),
647
+ expiredText: z._default(shortText, "Het is zover!")
668
648
  });
669
649
  const SymbolRefBlockSchema = z.object({
670
650
  ...blockBase,
671
651
  _type: z.literal("symbolRef"),
672
652
  // Leeg = nog geen symbool gekozen (vers blok); render en server-expansie slaan dat stil over.
673
- symbolId: z.string().max(120).default("").describe("Symbool")
653
+ symbolId: z._default(z.string().check(z.maxLength(120)), "").register(z.globalRegistry, { description: "Symbool" })
674
654
  });
675
655
  const BuiltinBlockSchema = z.discriminatedUnion("_type", [
676
656
  HeroBlockSchema,