@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.
- package/dist/SiteChrome.d.ts +12 -0
- package/dist/SiteChrome.js +24 -0
- package/dist/SiteChrome.js.map +1 -0
- package/dist/XiCMSProvider.d.ts +16 -8
- package/dist/XiCMSProvider.js +90 -61
- package/dist/XiCMSProvider.js.map +1 -1
- package/dist/admin/AdminApp.d.ts +1 -1
- package/dist/admin/AdminApp.js +81 -35
- package/dist/admin/AdminApp.js.map +1 -1
- package/dist/admin/AdminHelp.d.ts +8 -1
- package/dist/admin/AdminHelp.js +2 -2
- package/dist/admin/AdminHelp.js.map +1 -1
- package/dist/admin/CoreVersion.d.ts +13 -0
- package/dist/admin/CoreVersion.js +38 -0
- package/dist/admin/CoreVersion.js.map +1 -0
- package/dist/admin/NewsEditor.js +9 -9
- package/dist/admin/SuperadminPanel.js +5 -5
- package/dist/admin/blockEditors/GenericEditor.d.ts +2 -2
- package/dist/admin/blockEditors/GenericEditor.js +12 -11
- package/dist/admin/blockEditors/GenericEditor.js.map +1 -1
- package/dist/admin/blockEditors/StyleEditor.d.ts +1 -1
- package/dist/admin/blockEditors/StyleEditor.js +2 -2
- package/dist/admin/blockEditors/SymbolRefEditor.d.ts +1 -1
- package/dist/admin/blockEditors/SymbolRefEditor.js +5 -5
- package/dist/admin/blockEditors/index.d.ts +1 -1
- package/dist/admin/blockEditors/index.js +10 -10
- package/dist/admin/customBlocks/CustomBlocksPanel.js +7 -7
- package/dist/admin/editors/RichTextEditor.js +8 -7
- package/dist/admin/editors/RichTextEditor.js.map +1 -1
- package/dist/admin/editors/fontSizeExtension.js +1 -1
- package/dist/admin/editors/fontSizeExtension.js.map +1 -1
- package/dist/admin/forms/FormsPanel.js +9 -9
- package/dist/admin/index.d.ts +16 -16
- package/dist/admin/index.js +16 -16
- package/dist/admin/lib/mediaUsage.js +1 -1
- package/dist/admin/lib/pagesClient.d.ts +1 -1
- package/dist/admin/lib/pagesClient.js +11 -7
- package/dist/admin/lib/pagesClient.js.map +1 -1
- package/dist/admin/lib/sanitizeDraft.d.ts +9 -0
- package/dist/admin/lib/sanitizeDraft.js +28 -0
- package/dist/admin/lib/sanitizeDraft.js.map +1 -0
- package/dist/admin/lib/symbolsClient.d.ts +1 -1
- package/dist/admin/lib/symbolsClient.js +3 -3
- package/dist/admin/lib/upload.js +3 -3
- package/dist/admin/lib/useNestedDialog.d.ts +15 -0
- package/dist/admin/lib/useNestedDialog.js +23 -0
- package/dist/admin/lib/useNestedDialog.js.map +1 -0
- package/dist/admin/lib/zodFields.d.ts +4 -18
- package/dist/admin/lib/zodFields.js +54 -35
- package/dist/admin/lib/zodFields.js.map +1 -1
- package/dist/admin/media/MediaManager.js +7 -7
- package/dist/admin/media/MediaPicker.js +7 -7
- package/dist/admin/media/MediaPicker.js.map +1 -1
- package/dist/admin/pages/PageEditor.d.ts +1 -1
- package/dist/admin/pages/PageEditor.js +13 -13
- package/dist/admin/pages/PagesPanel.js +30 -30
- package/dist/admin/pages/PagesPanel.js.map +1 -1
- package/dist/admin/panelRegistry.js +7 -7
- package/dist/admin/patterns/PatternInserter.d.ts +1 -1
- package/dist/admin/patterns/PatternInserter.js +5 -5
- package/dist/admin/patterns/PatternInserter.js.map +1 -1
- package/dist/admin/settings/MailSettings.js +5 -5
- package/dist/admin/settings/MailTemplates.d.ts +1 -1
- package/dist/admin/settings/MailTemplates.js +5 -5
- package/dist/admin/settings/SettingsPanel.js +66 -20
- package/dist/admin/settings/SettingsPanel.js.map +1 -1
- package/dist/admin/settings/SnapshotsCard.js +5 -5
- package/dist/admin/settings/moduleSettingsForm.d.ts +1 -1
- package/dist/admin/settings/moduleSettingsForm.js +4 -4
- package/dist/admin/settings/moduleSettingsForm.js.map +1 -1
- package/dist/admin/shop/CategoriesTab.js +8 -8
- package/dist/admin/shop/ConnectionsTab.js +3 -3
- package/dist/admin/shop/DiscountsTab.js +8 -8
- package/dist/admin/shop/OrdersTab.js +10 -10
- package/dist/admin/shop/OrdersTab.js.map +1 -1
- package/dist/admin/shop/ProductsTab.js +10 -10
- package/dist/admin/shop/ShopPanel.js +9 -9
- package/dist/admin/shop/ShopSettingsTab.js +4 -4
- package/dist/admin/shop/index.d.ts +2 -2
- package/dist/admin/shop/index.js +2 -2
- package/dist/admin/shop/lib.js +2 -2
- package/dist/admin/stats/StatsPanel.js +2 -2
- package/dist/admin/ui/ArrayEditor.js +1 -1
- package/dist/admin/ui/PanelIcon.d.ts +3 -0
- package/dist/admin/ui/PanelIcon.js +34 -0
- package/dist/admin/ui/PanelIcon.js.map +1 -0
- package/dist/admin/ui/dialog.d.ts +21 -6
- package/dist/admin/ui/dialog.js +55 -34
- package/dist/admin/ui/dialog.js.map +1 -1
- package/dist/admin/ui/index.d.ts +7 -7
- package/dist/admin/ui/index.js +7 -7
- package/dist/admin/ui/primitives.js +1 -1
- package/dist/admin/ui/tabs.js +1 -1
- package/dist/admin/visual/TranslationPanel.d.ts +1 -1
- package/dist/admin/visual/TranslationPanel.js +3 -3
- package/dist/admin/visual/VisualEditor.js +47 -25
- package/dist/admin/visual/VisualEditor.js.map +1 -1
- package/dist/admin.css +2 -1
- package/dist/agentFiles/catalog.d.ts +2 -2
- package/dist/agentFiles/catalog.js +6 -5
- package/dist/agentFiles/catalog.js.map +1 -1
- package/dist/agentFiles/files.d.ts +5 -5
- package/dist/agentFiles/files.js +17 -17
- package/dist/agentFiles/files.js.map +1 -1
- package/dist/all.d.ts +4 -4
- package/dist/all.js +6 -6
- package/dist/auth/AuthProvider.d.ts +2 -2
- package/dist/auth/AuthProvider.js +51 -28
- package/dist/auth/AuthProvider.js.map +1 -1
- package/dist/auth/LoginForm.js +1 -1
- package/dist/auth/roles.js +4 -1
- package/dist/auth/roles.js.map +1 -1
- package/dist/blocks/BlockRenderer.d.ts +1 -1
- package/dist/blocks/BlockRenderer.js +3 -3
- package/dist/blocks/blockStyle.d.ts +1 -1
- package/dist/blocks/builtins/Accordion.d.ts +1 -1
- package/dist/blocks/builtins/Accordion.js +13 -6
- package/dist/blocks/builtins/Accordion.js.map +1 -1
- package/dist/blocks/builtins/Agenda.d.ts +1 -1
- package/dist/blocks/builtins/Agenda.js +5 -5
- package/dist/blocks/builtins/Banner.d.ts +1 -1
- package/dist/blocks/builtins/Banner.js +2 -2
- package/dist/blocks/builtins/BeforeAfter.d.ts +1 -1
- package/dist/blocks/builtins/BeforeAfter.js +4 -4
- package/dist/blocks/builtins/BeforeAfter.js.map +1 -1
- package/dist/blocks/builtins/Booking.d.ts +1 -1
- package/dist/blocks/builtins/Booking.js +5 -5
- package/dist/blocks/builtins/Breadcrumbs.d.ts +1 -1
- package/dist/blocks/builtins/Breadcrumbs.js +3 -3
- package/dist/blocks/builtins/Cards.d.ts +1 -1
- package/dist/blocks/builtins/Cards.js +5 -5
- package/dist/blocks/builtins/Cards.js.map +1 -1
- package/dist/blocks/builtins/Columns.d.ts +1 -1
- package/dist/blocks/builtins/Columns.js +4 -4
- package/dist/blocks/builtins/Contact.d.ts +3 -3
- package/dist/blocks/builtins/Contact.js +4 -4
- package/dist/blocks/builtins/Countdown.d.ts +1 -1
- package/dist/blocks/builtins/Countdown.js +4 -4
- package/dist/blocks/builtins/Countdown.js.map +1 -1
- package/dist/blocks/builtins/Cta.d.ts +1 -1
- package/dist/blocks/builtins/Cta.js +3 -3
- package/dist/blocks/builtins/Downloads.d.ts +1 -1
- package/dist/blocks/builtins/Downloads.js +4 -4
- package/dist/blocks/builtins/Elements.d.ts +3 -3
- package/dist/blocks/builtins/Elements.js +3 -3
- package/dist/blocks/builtins/Embed.d.ts +1 -1
- package/dist/blocks/builtins/Embed.js +3 -3
- package/dist/blocks/builtins/Faq.d.ts +1 -1
- package/dist/blocks/builtins/Faq.js +14 -6
- package/dist/blocks/builtins/Faq.js.map +1 -1
- package/dist/blocks/builtins/FormBlock.d.ts +1 -1
- package/dist/blocks/builtins/FormBlock.js +28 -18
- package/dist/blocks/builtins/FormBlock.js.map +1 -1
- package/dist/blocks/builtins/Gallery.d.ts +2 -2
- package/dist/blocks/builtins/Gallery.js +5 -5
- package/dist/blocks/builtins/Hero.d.ts +1 -1
- package/dist/blocks/builtins/Hero.js +4 -4
- package/dist/blocks/builtins/ImageBlock.d.ts +1 -1
- package/dist/blocks/builtins/ImageBlock.js +3 -3
- package/dist/blocks/builtins/Jobs.d.ts +2 -2
- package/dist/blocks/builtins/Jobs.js +5 -5
- package/dist/blocks/builtins/Layout.d.ts +2 -2
- package/dist/blocks/builtins/Layout.js +4 -4
- package/dist/blocks/builtins/MapBlock.d.ts +1 -1
- package/dist/blocks/builtins/MapBlock.js +3 -3
- package/dist/blocks/builtins/NewsListBlock.d.ts +1 -1
- package/dist/blocks/builtins/NewsListBlock.js +4 -4
- package/dist/blocks/builtins/Newsletter.d.ts +1 -1
- package/dist/blocks/builtins/Newsletter.js +7 -7
- package/dist/blocks/builtins/Newsletter.js.map +1 -1
- package/dist/blocks/builtins/OpenNowBadge.d.ts +1 -1
- package/dist/blocks/builtins/OpenNowBadge.js +8 -3
- package/dist/blocks/builtins/OpenNowBadge.js.map +1 -1
- package/dist/blocks/builtins/OpeningHours.d.ts +1 -1
- package/dist/blocks/builtins/OpeningHours.js +6 -6
- package/dist/blocks/builtins/PdfBlock.d.ts +1 -1
- package/dist/blocks/builtins/PdfBlock.js +3 -3
- package/dist/blocks/builtins/Portfolio.d.ts +1 -1
- package/dist/blocks/builtins/Portfolio.js +5 -5
- package/dist/blocks/builtins/Pricing.d.ts +2 -2
- package/dist/blocks/builtins/Pricing.js +5 -5
- package/dist/blocks/builtins/Pricing.js.map +1 -1
- package/dist/blocks/builtins/RichTextBlock.d.ts +1 -1
- package/dist/blocks/builtins/RichTextBlock.js +2 -2
- package/dist/blocks/builtins/RichTextBlock.js.map +1 -1
- package/dist/blocks/builtins/Search.d.ts +1 -1
- package/dist/blocks/builtins/Search.js +9 -7
- package/dist/blocks/builtins/Search.js.map +1 -1
- package/dist/blocks/builtins/Sections.d.ts +4 -4
- package/dist/blocks/builtins/Sections.js +4 -4
- package/dist/blocks/builtins/Slider.d.ts +1 -1
- package/dist/blocks/builtins/Slider.js +3 -3
- package/dist/blocks/builtins/Spacer.d.ts +1 -1
- package/dist/blocks/builtins/Spacer.js +2 -2
- package/dist/blocks/builtins/SymbolRef.d.ts +1 -1
- package/dist/blocks/builtins/SymbolRef.js +31 -17
- package/dist/blocks/builtins/SymbolRef.js.map +1 -1
- package/dist/blocks/builtins/Team.d.ts +1 -1
- package/dist/blocks/builtins/Team.js +4 -4
- package/dist/blocks/builtins/Testimonials.d.ts +2 -2
- package/dist/blocks/builtins/Testimonials.js +4 -4
- package/dist/blocks/builtins/Video.d.ts +2 -2
- package/dist/blocks/builtins/Video.js +4 -4
- package/dist/blocks/builtins/Video.js.map +1 -1
- package/dist/blocks/builtins/WhatsappChat.d.ts +1 -1
- package/dist/blocks/builtins/WhatsappChat.js +2 -2
- package/dist/blocks/builtins/Widgets.d.ts +12 -12
- package/dist/blocks/builtins/Widgets.js +19 -19
- package/dist/blocks/builtins/Widgets.js.map +1 -1
- package/dist/blocks/builtins/consentEmbed.js +2 -2
- package/dist/blocks/builtins/index.d.ts +40 -40
- package/dist/blocks/builtins/index.js +40 -40
- package/dist/blocks/builtins/lib/submitForm.js +5 -3
- package/dist/blocks/builtins/lib/submitForm.js.map +1 -1
- package/dist/blocks/context.d.ts +1 -1
- package/dist/blocks/customTemplate/definition.d.ts +3 -3
- package/dist/blocks/customTemplate/definition.js +6 -6
- package/dist/blocks/customTemplate/definition.js.map +1 -1
- package/dist/blocks/customTemplate/interpret.js +1 -1
- package/dist/blocks/index.d.ts +5 -5
- package/dist/blocks/index.js +5 -5
- package/dist/blocks/registry.d.ts +17 -7
- package/dist/blocks/registry.js +2 -1
- package/dist/blocks/registry.js.map +1 -1
- package/dist/components/EditBar.js +3 -3
- package/dist/components/FeedbackWidget.js +4 -4
- package/dist/components/News.d.ts +1 -1
- package/dist/components/News.js +50 -37
- package/dist/components/News.js.map +1 -1
- package/dist/components/PageView.js +11 -8
- package/dist/components/PageView.js.map +1 -1
- package/dist/components/ResponsiveImage.d.ts +1 -1
- package/dist/components/site/SiteFooter.d.ts +1 -1
- package/dist/components/site/SiteFooter.js +2 -2
- package/dist/config.d.ts +1 -1
- package/dist/demo/DemoStudio.js +3 -3
- package/dist/demo/demoStore.d.ts +3 -3
- package/dist/demo/index.d.ts +2 -2
- package/dist/demo/index.js +2 -2
- package/dist/editor/EditorProvider.js +1 -1
- package/dist/firebase/admin.d.ts +0 -2
- package/dist/firebase/admin.js +0 -6
- package/dist/firebase/admin.js.map +1 -1
- package/dist/firebase/appcheck.d.ts +1 -1
- package/dist/firebase/appcheck.js +5 -3
- package/dist/firebase/appcheck.js.map +1 -1
- package/dist/firebase/client.d.ts +2 -1
- package/dist/firebase/client.js +2 -14
- package/dist/firebase/client.js.map +1 -1
- package/dist/firebase/config.d.ts +31 -0
- package/dist/firebase/config.js +39 -0
- package/dist/firebase/config.js.map +1 -0
- package/dist/firebase/feedback.js +5 -3
- package/dist/firebase/feedback.js.map +1 -1
- package/dist/i18n/overlay.d.ts +2 -2
- package/dist/i18n/overlay.js +6 -4
- package/dist/i18n/overlay.js.map +1 -1
- package/dist/index.d.ts +46 -44
- package/dist/index.js +39 -33
- package/dist/index.js.map +1 -1
- package/dist/lock/DemoLock.js +1 -1
- package/dist/modules/builtins.d.ts +1 -1
- package/dist/modules/builtins.js +53 -55
- package/dist/modules/builtins.js.map +1 -1
- package/dist/modules/consent/ConsentBanner.js +1 -1
- package/dist/modules/consent/useConsent.js +1 -1
- package/dist/modules/context.d.ts +1 -1
- package/dist/modules/contract.d.ts +1 -1
- package/dist/modules/defineModule.d.ts +1 -1
- package/dist/modules/index.d.ts +9 -9
- package/dist/modules/index.js +8 -8
- package/dist/modules/overrides.d.ts +1 -1
- package/dist/modules/registry.d.ts +2 -7
- package/dist/modules/registry.js +2 -1
- package/dist/modules/registry.js.map +1 -1
- package/dist/modules/shop/blocks/Cart.d.ts +1 -1
- package/dist/modules/shop/blocks/Cart.js +6 -6
- package/dist/modules/shop/blocks/Checkout.d.ts +1 -1
- package/dist/modules/shop/blocks/Checkout.js +6 -6
- package/dist/modules/shop/blocks/Donation.d.ts +1 -1
- package/dist/modules/shop/blocks/Donation.js +5 -5
- package/dist/modules/shop/blocks/OrderStatus.d.ts +1 -1
- package/dist/modules/shop/blocks/OrderStatus.js +5 -5
- package/dist/modules/shop/blocks/ProductDetail.d.ts +1 -1
- package/dist/modules/shop/blocks/ProductDetail.js +8 -8
- package/dist/modules/shop/blocks/ProductGrid.d.ts +3 -3
- package/dist/modules/shop/blocks/ProductGrid.js +7 -7
- package/dist/modules/shop/blocks/ShopCategories.d.ts +1 -1
- package/dist/modules/shop/blocks/ShopCategories.js +6 -6
- package/dist/modules/shop/index.d.ts +5 -5
- package/dist/modules/shop/index.js +5 -5
- package/dist/modules/shop/lib.d.ts +2 -2
- package/dist/modules/shop/lib.js +18 -13
- package/dist/modules/shop/lib.js.map +1 -1
- package/dist/modules/shop/module.d.ts +1 -1
- package/dist/modules/shop/module.js +9 -9
- package/dist/modules/shop/settings.d.ts +18 -50
- package/dist/modules/shop/settings.js +16 -16
- package/dist/modules/shop/settings.js.map +1 -1
- package/dist/modules/shop/strings.js +1 -1
- package/dist/modules/shop/types.d.ts +1 -1
- package/dist/modules/types.d.ts +2 -2
- package/dist/patterns/builtins.d.ts +1 -1
- package/dist/patterns/builtins.js +1 -1
- package/dist/patterns/index.d.ts +2 -2
- package/dist/patterns/index.js +2 -2
- package/dist/render/PageRenderer.d.ts +2 -2
- package/dist/render/PageRenderer.js +1 -1
- package/dist/render/PublishedPage.d.ts +1 -1
- package/dist/render/PublishedPage.js +2 -2
- package/dist/schema/blocks.d.ts +6793 -15095
- package/dist/schema/blocks.js +335 -355
- package/dist/schema/blocks.js.map +1 -1
- package/dist/schema/customBlocks.d.ts +10 -29
- package/dist/schema/customBlocks.js +14 -13
- package/dist/schema/customBlocks.js.map +1 -1
- package/dist/schema/fields.d.ts +10 -16
- package/dist/schema/fields.js +37 -37
- package/dist/schema/fields.js.map +1 -1
- package/dist/schema/forms.d.ts +62 -111
- package/dist/schema/forms.js +17 -17
- package/dist/schema/forms.js.map +1 -1
- package/dist/schema/index.d.ts +7 -7
- package/dist/schema/index.js +7 -7
- package/dist/schema/mail.d.ts +39 -87
- package/dist/schema/mail.js +4 -4
- package/dist/schema/mail.js.map +1 -1
- package/dist/schema/pages.d.ts +152 -674
- package/dist/schema/pages.js +26 -15
- package/dist/schema/pages.js.map +1 -1
- package/dist/schema/seo.d.ts +9 -27
- package/dist/schema/seo.js +7 -7
- package/dist/schema/seo.js.map +1 -1
- package/dist/schema/settings.d.ts +233 -1074
- package/dist/schema/settings.js +71 -56
- package/dist/schema/settings.js.map +1 -1
- package/dist/schema/shop.d.ts +470 -1214
- package/dist/schema/shop.js +124 -124
- package/dist/schema/shop.js.map +1 -1
- package/dist/schema/siteConfig.d.ts +78 -597
- package/dist/schema/siteConfig.js +17 -17
- package/dist/schema/siteConfig.js.map +1 -1
- package/dist/schema/symbols.d.ts +34 -191
- package/dist/schema/symbols.js +8 -8
- package/dist/schema/symbols.js.map +1 -1
- package/dist/server/auth.d.ts +17 -0
- package/dist/server/auth.js +11 -0
- package/dist/server/auth.js.map +1 -0
- package/dist/server/bundle.d.ts +15 -6
- package/dist/server/bundle.js +5 -1
- package/dist/server/bundle.js.map +1 -1
- package/dist/server/draft.d.ts +16 -0
- package/dist/server/draft.js +12 -0
- package/dist/server/draft.js.map +1 -0
- package/dist/server/env.js +8 -8
- package/dist/server/env.js.map +1 -1
- package/dist/server/index.d.ts +11 -9
- package/dist/server/index.js +13 -10
- package/dist/server/index.js.map +1 -1
- package/dist/server/pages.d.ts +11 -4
- package/dist/server/pages.js +43 -15
- package/dist/server/pages.js.map +1 -1
- package/dist/server/revalidate.js +11 -2
- package/dist/server/revalidate.js.map +1 -1
- package/dist/server/seo.d.ts +3 -3
- package/dist/server/seo.js +1 -1
- package/dist/server/shop.d.ts +3 -3
- package/dist/server/shop.js +6 -3
- package/dist/server/shop.js.map +1 -1
- package/dist/server/version.d.ts +16 -0
- package/dist/server/version.js +17 -0
- package/dist/server/version.js.map +1 -0
- package/dist/settings/useSiteSettings.d.ts +2 -2
- package/dist/settings/useSiteSettings.js +48 -28
- package/dist/settings/useSiteSettings.js.map +1 -1
- package/dist/styles.css +30 -4
- package/dist/theme/presets.d.ts +1 -1
- package/dist/version.d.ts +8 -0
- package/dist/version.js +16 -0
- package/dist/version.js.map +1 -0
- package/package.json +35 -34
package/dist/schema/blocks.js
CHANGED
|
@@ -1,357 +1,347 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as z from "zod/mini";
|
|
2
2
|
const BlockStyleSchema = z.object({
|
|
3
|
-
paddingY: z.enum(["none", "sm", "md", "lg", "xl"])
|
|
4
|
-
background: z.string().
|
|
5
|
-
width: z.enum(["container", "full", "narrow"])
|
|
6
|
-
align: z.enum(["left", "center", "right"])
|
|
7
|
-
anchorId: z.string().
|
|
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"])
|
|
9
|
+
animate: z.optional(z.enum(["fade", "up"]))
|
|
10
10
|
});
|
|
11
11
|
const blockBase = {
|
|
12
|
-
_key: z.string().
|
|
12
|
+
_key: z.string().check(z.minLength(1)).check(z.maxLength(64)),
|
|
13
13
|
/** Optionele gedeelde blokstijl (ruimte/achtergrond/breedte/uitlijning/anker). */
|
|
14
|
-
_style:
|
|
14
|
+
_style: z.optional(BlockStyleSchema)
|
|
15
15
|
};
|
|
16
|
-
const BlockBaseSchema = z.
|
|
17
|
-
const ref = z.string().
|
|
18
|
-
const richText = z.string().
|
|
19
|
-
const shortText = z.string().
|
|
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:
|
|
22
|
-
href: z.string().
|
|
23
|
-
variant: z.enum(["primary", "secondary", "outline"])
|
|
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:
|
|
30
|
-
title:
|
|
31
|
-
subtitle:
|
|
32
|
-
imageUrl: z.string().
|
|
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().
|
|
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"])
|
|
38
|
-
align: z.enum(["left", "center"])
|
|
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"])
|
|
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"])
|
|
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().
|
|
45
|
-
overlayOpacity: z.number().
|
|
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()
|
|
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).
|
|
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:
|
|
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().
|
|
60
|
-
alt:
|
|
61
|
-
caption:
|
|
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().
|
|
63
|
+
href: z.optional(z.string().check(z.maxLength(2e3))),
|
|
64
64
|
/** Uitlijning binnen de kolom. */
|
|
65
|
-
align: z.enum(["left", "center", "right"])
|
|
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"])
|
|
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.
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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()
|
|
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.
|
|
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"])
|
|
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"])
|
|
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:
|
|
95
|
-
text:
|
|
96
|
-
buttonLabel:
|
|
97
|
-
buttonHref: z.string().
|
|
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"])
|
|
97
|
+
buttonVariant: z._default(z.enum(["primary", "secondary", "outline"]), "primary"),
|
|
100
98
|
/** Optionele tweede knop. */
|
|
101
|
-
button2Label:
|
|
102
|
-
button2Href: z.string().
|
|
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().
|
|
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()
|
|
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:
|
|
112
|
-
items: z.array(z.object({
|
|
113
|
-
q:
|
|
114
|
-
a:
|
|
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:
|
|
117
|
-
})).
|
|
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()
|
|
117
|
+
searchable: z._default(z.boolean(), false),
|
|
120
118
|
/** FAQ+: voeg FAQPage-JSON-LD toe voor rich results in Google. */
|
|
121
|
-
jsonLd: z.boolean()
|
|
119
|
+
jsonLd: z._default(z.boolean(), false),
|
|
122
120
|
/** Of items standaard open staan. Default dicht (gebruikelijke FAQ-UX). */
|
|
123
|
-
defaultOpen: z.boolean()
|
|
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:
|
|
129
|
-
rows: z.array(z.object({ day:
|
|
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()
|
|
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()
|
|
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:
|
|
139
|
-
items: z.array(
|
|
140
|
-
z.
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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().
|
|
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()
|
|
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:
|
|
165
|
-
limit: z.
|
|
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.
|
|
168
|
-
basePath: z.string().
|
|
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:
|
|
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"])
|
|
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:
|
|
185
|
-
items: z.array(
|
|
186
|
-
z.
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
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"])
|
|
189
|
+
layout: z._default(z.enum(["list", "grid"]), "grid"),
|
|
196
190
|
/** Voeg Review-JSON-LD toe (rich results). */
|
|
197
|
-
jsonLd: z.boolean()
|
|
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:
|
|
203
|
-
members: z.array(
|
|
204
|
-
z.
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
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()
|
|
209
|
+
jsonLd: z._default(z.boolean(), false),
|
|
218
210
|
/** Groepeer leden per afdeling (kopje per afdeling). */
|
|
219
|
-
groupByDepartment: z.boolean()
|
|
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:
|
|
225
|
-
events: z.array(
|
|
226
|
-
z.
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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()
|
|
227
|
+
hidePast: z._default(z.boolean(), true),
|
|
238
228
|
/** Voeg Event-JSON-LD toe. */
|
|
239
|
-
jsonLd: z.boolean()
|
|
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:
|
|
234
|
+
placeholder: z._default(shortText, "Zoeken\u2026"),
|
|
245
235
|
/** Ook nieuwsartikelen doorzoeken (naast pagina's). */
|
|
246
|
-
includeNews: z.boolean()
|
|
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"])
|
|
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().
|
|
254
|
-
title:
|
|
255
|
-
caption:
|
|
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().
|
|
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()
|
|
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()
|
|
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:
|
|
257
|
+
heading: z.optional(shortText),
|
|
268
258
|
/** Rich text (veldnaam "html" zodat het server-side gesanitized wordt bij publiceren). */
|
|
269
|
-
html:
|
|
270
|
-
imageUrl: z.string().
|
|
271
|
-
imagePosition: z.enum(["left", "right"])
|
|
272
|
-
buttonLabel:
|
|
273
|
-
buttonHref: z.string().
|
|
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:
|
|
279
|
-
href: z.string().
|
|
280
|
-
linkLabel:
|
|
281
|
-
tone: z.enum(["info", "success", "warning"])
|
|
282
|
-
dismissible: z.boolean()
|
|
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:
|
|
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:
|
|
290
|
-
items: z.array(z.object({ value:
|
|
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()
|
|
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:
|
|
298
|
-
items: z.array(z.object({ src: z.string().
|
|
299
|
-
grayscale: z.boolean()
|
|
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()
|
|
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:
|
|
307
|
-
items: z.array(z.object({ title:
|
|
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()
|
|
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:
|
|
315
|
-
address:
|
|
316
|
-
phone:
|
|
317
|
-
email: z.string().
|
|
318
|
-
hours:
|
|
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().
|
|
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()
|
|
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"])
|
|
317
|
+
provider: z._default(z.enum(["osm", "google"]), "osm"),
|
|
328
318
|
/** Adres/zoekterm (osm, legacy-fallback) of volledige embed-URL (google). */
|
|
329
|
-
query:
|
|
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().
|
|
332
|
-
lng: z.number().
|
|
333
|
-
zoom: z.
|
|
334
|
-
height: z.
|
|
335
|
-
consentGated: z.boolean()
|
|
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:
|
|
341
|
-
items: z.array(z.object({ platform:
|
|
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:
|
|
347
|
-
text:
|
|
348
|
-
buttonLabel:
|
|
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().
|
|
340
|
+
actionUrl: z.optional(z.string().check(z.maxLength(2e3))),
|
|
351
341
|
/** Formulier-id voor opslag via XiCMS (als actionUrl leeg is). */
|
|
352
|
-
formId:
|
|
342
|
+
formId: z.optional(ref),
|
|
353
343
|
/** AVG: indien gezet verschijnt een verplichte akkoord-checkbox met deze tekst. */
|
|
354
|
-
consentText:
|
|
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:
|
|
361
|
+
heading: z.optional(shortText),
|
|
372
362
|
/** Welk reserveersysteem; bepaalt de embed-helper en uitleg in de editor. */
|
|
373
|
-
provider:
|
|
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().
|
|
376
|
-
height: z.
|
|
377
|
-
consentGated: z.boolean()
|
|
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"])
|
|
383
|
-
items: z.array(z.object({ label:
|
|
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:
|
|
389
|
-
author:
|
|
390
|
-
role:
|
|
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"])
|
|
396
|
-
spacing: z.enum(["sm", "md", "lg"])
|
|
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:
|
|
402
|
-
items: z.array(z.object({
|
|
403
|
-
title:
|
|
404
|
-
body:
|
|
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:
|
|
407
|
-
})).
|
|
396
|
+
bodyHtml: z.optional(richText)
|
|
397
|
+
})).check(z.maxLength(50)), []),
|
|
408
398
|
/** Sta toe dat meerdere panelen tegelijk open staan. */
|
|
409
|
-
multiple: z.boolean()
|
|
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().
|
|
415
|
-
title:
|
|
416
|
-
height: z.
|
|
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"])
|
|
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()
|
|
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).
|
|
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).
|
|
431
|
-
aside: z.array(BlockBaseSchema).
|
|
432
|
-
side: z.enum(["left", "right"])
|
|
433
|
-
sidebarWidth: z.enum(["sm", "md", "lg"])
|
|
434
|
-
sticky: z.boolean()
|
|
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:
|
|
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:
|
|
445
|
-
intro:
|
|
446
|
-
columns: z.
|
|
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"])
|
|
449
|
-
items: z.array(
|
|
450
|
-
z.
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
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:
|
|
466
|
-
items: z.array(z.object({ label:
|
|
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:
|
|
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:
|
|
474
|
-
height: z.
|
|
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()
|
|
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:
|
|
469
|
+
heading: z.optional(shortText),
|
|
482
470
|
/** ISO-datetime, bv. "2026-12-31T23:59". */
|
|
483
|
-
target: z.string().
|
|
484
|
-
expiredText:
|
|
485
|
-
showLabels: z.boolean()
|
|
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"])
|
|
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.
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
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.
|
|
503
|
-
showDots: z.boolean()
|
|
504
|
-
showArrows: z.boolean()
|
|
505
|
-
aspectRatio: z.enum(["16/9", "4/3", "3/2", "1/1", "21/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:
|
|
497
|
+
phone: z._default(shortText, "").register(z.globalRegistry, { description: "Telefoonnummer (internationaal)" }),
|
|
512
498
|
/** Vooringevuld bericht in WhatsApp. */
|
|
513
|
-
prefilledText:
|
|
499
|
+
prefilledText: z.optional(shortText).register(z.globalRegistry, { description: "Vooringevuld bericht" }),
|
|
514
500
|
/** Tekstlabel naast het icoon (leeg = alleen icoon). */
|
|
515
|
-
label:
|
|
516
|
-
position: z.enum(["br", "bl"])
|
|
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:
|
|
522
|
-
beforeUrl: z.string().
|
|
523
|
-
afterUrl: z.string().
|
|
524
|
-
beforeLabel:
|
|
525
|
-
afterLabel:
|
|
526
|
-
alt:
|
|
527
|
-
aspectRatio: z.enum(["16/9", "4/3", "3/2", "1/1"])
|
|
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:
|
|
533
|
-
intro:
|
|
534
|
-
columns: z.
|
|
535
|
-
items: z.array(
|
|
536
|
-
z.
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
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()
|
|
546
|
-
lightbox: z.boolean()
|
|
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:
|
|
552
|
-
intro:
|
|
553
|
-
items: z.array(
|
|
554
|
-
z.
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
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:
|
|
572
|
-
jsonLd: z.boolean()
|
|
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:
|
|
578
|
-
limit: z.
|
|
579
|
-
basePath: z.string().
|
|
580
|
-
showImages: z.boolean()
|
|
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:
|
|
586
|
-
limit: z.
|
|
587
|
-
events: z.array(
|
|
588
|
-
z.
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
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:
|
|
602
|
-
rows: z.array(z.object({ day:
|
|
603
|
-
highlightToday: z.boolean()
|
|
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:
|
|
609
|
-
address:
|
|
610
|
-
phone:
|
|
611
|
-
email: z.string().
|
|
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:
|
|
617
|
-
items: z.array(z.object({ platform:
|
|
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:
|
|
623
|
-
text:
|
|
624
|
-
buttonLabel:
|
|
625
|
-
actionUrl: z.string().
|
|
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:
|
|
631
|
-
text:
|
|
632
|
-
buttonLabel:
|
|
633
|
-
buttonHref: z.string().
|
|
634
|
-
backgroundColor: z.string().
|
|
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:
|
|
640
|
-
items: z.array(z.object({ url: z.string().
|
|
641
|
-
columns: z.
|
|
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:
|
|
647
|
-
items: z.array(z.object({ quote:
|
|
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:
|
|
653
|
-
items: z.array(z.object({ icon:
|
|
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:
|
|
659
|
-
limit: z.
|
|
660
|
-
items: z.array(z.object({ label:
|
|
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:
|
|
666
|
-
target: z.string().
|
|
667
|
-
expiredText:
|
|
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().
|
|
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,
|