@xiwebdesign/xicms-core 5.3.0 → 5.4.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/XiCMSProvider.d.ts +11 -2
- package/dist/XiCMSProvider.js +10 -5
- package/dist/XiCMSProvider.js.map +1 -1
- package/dist/admin/blockEditors/GenericEditor.js +18 -8
- package/dist/admin/blockEditors/GenericEditor.js.map +1 -1
- package/dist/admin/customBlocks/CustomBlocksPanel.js +12 -2
- package/dist/admin/customBlocks/CustomBlocksPanel.js.map +1 -1
- package/dist/admin/lib/pagesClient.js +4 -1
- package/dist/admin/lib/pagesClient.js.map +1 -1
- package/dist/admin/lib/upload.js +14 -7
- package/dist/admin/lib/upload.js.map +1 -1
- package/dist/admin/media/MediaManager.js +60 -28
- package/dist/admin/media/MediaManager.js.map +1 -1
- package/dist/admin/media/MediaPicker.js +25 -15
- package/dist/admin/media/MediaPicker.js.map +1 -1
- package/dist/admin/pages/PageEditor.d.ts +2 -1
- package/dist/admin/pages/PageEditor.js +16 -2
- package/dist/admin/pages/PageEditor.js.map +1 -1
- package/dist/admin/pages/PagesPanel.js +9 -5
- package/dist/admin/pages/PagesPanel.js.map +1 -1
- package/dist/admin/visual/VisualEditor.js +11 -2
- package/dist/admin/visual/VisualEditor.js.map +1 -1
- package/dist/agentFiles/files.d.ts +15 -3
- package/dist/agentFiles/files.js +57 -0
- package/dist/agentFiles/files.js.map +1 -1
- package/dist/auth/AuthProvider.js +3 -3
- package/dist/auth/AuthProvider.js.map +1 -1
- package/dist/blocks/builtins/Columns.js +1 -1
- package/dist/blocks/builtins/Columns.js.map +1 -1
- package/dist/blocks/builtins/Gallery.js +2 -2
- package/dist/blocks/builtins/Gallery.js.map +1 -1
- package/dist/blocks/builtins/Hero.js +1 -1
- package/dist/blocks/builtins/Hero.js.map +1 -1
- package/dist/blocks/builtins/SymbolRef.js.map +1 -1
- package/dist/components/PageView.js +4 -3
- package/dist/components/PageView.js.map +1 -1
- package/dist/demo/index.d.ts +7 -0
- package/dist/demo/index.js +23 -0
- package/dist/demo/index.js.map +1 -0
- package/dist/index.d.ts +2 -4
- package/dist/index.js +0 -20
- package/dist/index.js.map +1 -1
- package/dist/modules/registry.d.ts +3 -4
- package/dist/modules/registry.js +2 -3
- package/dist/modules/registry.js.map +1 -1
- package/dist/schema/blocks.d.ts +27 -12
- package/dist/schema/blocks.js +3 -0
- package/dist/schema/blocks.js.map +1 -1
- package/dist/schema/settings.d.ts +1 -34
- package/dist/schema/settings.js +2 -8
- package/dist/schema/settings.js.map +1 -1
- package/dist/schema/siteConfig.d.ts +3 -71
- package/dist/schema/siteConfig.js +3 -8
- package/dist/schema/siteConfig.js.map +1 -1
- package/dist/schema/symbols.d.ts +2 -2
- package/dist/schema/symbols.js.map +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/pages.d.ts +23 -3
- package/dist/server/pages.js +37 -3
- package/dist/server/pages.js.map +1 -1
- package/dist/server/seo.js +5 -3
- package/dist/server/seo.js.map +1 -1
- package/dist/settings/useSiteSettings.d.ts +15 -3
- package/dist/settings/useSiteSettings.js +26 -5
- package/dist/settings/useSiteSettings.js.map +1 -1
- package/dist/styles.css +14 -0
- package/package.json +6 -2
package/dist/schema/blocks.d.ts
CHANGED
|
@@ -156,6 +156,9 @@ export declare const HeroBlockSchema: z.ZodObject<{
|
|
|
156
156
|
imageUrl: z.ZodOptional<z.ZodString>;
|
|
157
157
|
/** Videoachtergrond (mp4/webm); overschrijft de afbeelding als gezet. */
|
|
158
158
|
videoUrl: z.ZodOptional<z.ZodString>;
|
|
159
|
+
/** Kopniveau: "1" voor dé hoofdkop; "2" voor een tweede hero op dezelfde pagina
|
|
160
|
+
* (twee h1's = slechte SEO/a11y). */
|
|
161
|
+
headingLevel: z.ZodDefault<z.ZodEnum<["1", "2"]>>;
|
|
159
162
|
align: z.ZodDefault<z.ZodEnum<["left", "center"]>>;
|
|
160
163
|
/** Verticale uitlijning van de inhoud binnen de hero. */
|
|
161
164
|
vAlign: z.ZodDefault<z.ZodEnum<["top", "center", "bottom"]>>;
|
|
@@ -210,6 +213,7 @@ export declare const HeroBlockSchema: z.ZodObject<{
|
|
|
210
213
|
_type: "hero";
|
|
211
214
|
align: "left" | "center";
|
|
212
215
|
_key: string;
|
|
216
|
+
headingLevel: "1" | "2";
|
|
213
217
|
vAlign: "center" | "top" | "bottom";
|
|
214
218
|
minHeight: "sm" | "md" | "lg" | "auto" | "full";
|
|
215
219
|
overlayOpacity: number;
|
|
@@ -249,6 +253,7 @@ export declare const HeroBlockSchema: z.ZodObject<{
|
|
|
249
253
|
subtitle?: string | undefined;
|
|
250
254
|
imageUrl?: string | undefined;
|
|
251
255
|
videoUrl?: string | undefined;
|
|
256
|
+
headingLevel?: "1" | "2" | undefined;
|
|
252
257
|
vAlign?: "center" | "top" | "bottom" | undefined;
|
|
253
258
|
minHeight?: "sm" | "md" | "lg" | "auto" | "full" | undefined;
|
|
254
259
|
overlayColor?: string | undefined;
|
|
@@ -748,16 +753,16 @@ export declare const PricingBlockSchema: z.ZodObject<{
|
|
|
748
753
|
label: string;
|
|
749
754
|
price: string;
|
|
750
755
|
highlighted: boolean;
|
|
751
|
-
features?: string[] | undefined;
|
|
752
756
|
detail?: string | undefined;
|
|
757
|
+
features?: string[] | undefined;
|
|
753
758
|
ctaLabel?: string | undefined;
|
|
754
759
|
ctaHref?: string | undefined;
|
|
755
760
|
billingPeriod?: string | undefined;
|
|
756
761
|
}, {
|
|
757
762
|
label?: string | undefined;
|
|
758
|
-
features?: string[] | undefined;
|
|
759
763
|
price?: string | undefined;
|
|
760
764
|
detail?: string | undefined;
|
|
765
|
+
features?: string[] | undefined;
|
|
761
766
|
ctaLabel?: string | undefined;
|
|
762
767
|
ctaHref?: string | undefined;
|
|
763
768
|
highlighted?: boolean | undefined;
|
|
@@ -800,8 +805,8 @@ export declare const PricingBlockSchema: z.ZodObject<{
|
|
|
800
805
|
label: string;
|
|
801
806
|
price: string;
|
|
802
807
|
highlighted: boolean;
|
|
803
|
-
features?: string[] | undefined;
|
|
804
808
|
detail?: string | undefined;
|
|
809
|
+
features?: string[] | undefined;
|
|
805
810
|
ctaLabel?: string | undefined;
|
|
806
811
|
ctaHref?: string | undefined;
|
|
807
812
|
billingPeriod?: string | undefined;
|
|
@@ -832,9 +837,9 @@ export declare const PricingBlockSchema: z.ZodObject<{
|
|
|
832
837
|
} | undefined;
|
|
833
838
|
items?: {
|
|
834
839
|
label?: string | undefined;
|
|
835
|
-
features?: string[] | undefined;
|
|
836
840
|
price?: string | undefined;
|
|
837
841
|
detail?: string | undefined;
|
|
842
|
+
features?: string[] | undefined;
|
|
838
843
|
ctaLabel?: string | undefined;
|
|
839
844
|
ctaHref?: string | undefined;
|
|
840
845
|
highlighted?: boolean | undefined;
|
|
@@ -5191,6 +5196,9 @@ export declare const BuiltinBlockSchema: z.ZodDiscriminatedUnion<"_type", [z.Zod
|
|
|
5191
5196
|
imageUrl: z.ZodOptional<z.ZodString>;
|
|
5192
5197
|
/** Videoachtergrond (mp4/webm); overschrijft de afbeelding als gezet. */
|
|
5193
5198
|
videoUrl: z.ZodOptional<z.ZodString>;
|
|
5199
|
+
/** Kopniveau: "1" voor dé hoofdkop; "2" voor een tweede hero op dezelfde pagina
|
|
5200
|
+
* (twee h1's = slechte SEO/a11y). */
|
|
5201
|
+
headingLevel: z.ZodDefault<z.ZodEnum<["1", "2"]>>;
|
|
5194
5202
|
align: z.ZodDefault<z.ZodEnum<["left", "center"]>>;
|
|
5195
5203
|
/** Verticale uitlijning van de inhoud binnen de hero. */
|
|
5196
5204
|
vAlign: z.ZodDefault<z.ZodEnum<["top", "center", "bottom"]>>;
|
|
@@ -5245,6 +5253,7 @@ export declare const BuiltinBlockSchema: z.ZodDiscriminatedUnion<"_type", [z.Zod
|
|
|
5245
5253
|
_type: "hero";
|
|
5246
5254
|
align: "left" | "center";
|
|
5247
5255
|
_key: string;
|
|
5256
|
+
headingLevel: "1" | "2";
|
|
5248
5257
|
vAlign: "center" | "top" | "bottom";
|
|
5249
5258
|
minHeight: "sm" | "md" | "lg" | "auto" | "full";
|
|
5250
5259
|
overlayOpacity: number;
|
|
@@ -5284,6 +5293,7 @@ export declare const BuiltinBlockSchema: z.ZodDiscriminatedUnion<"_type", [z.Zod
|
|
|
5284
5293
|
subtitle?: string | undefined;
|
|
5285
5294
|
imageUrl?: string | undefined;
|
|
5286
5295
|
videoUrl?: string | undefined;
|
|
5296
|
+
headingLevel?: "1" | "2" | undefined;
|
|
5287
5297
|
vAlign?: "center" | "top" | "bottom" | undefined;
|
|
5288
5298
|
minHeight?: "sm" | "md" | "lg" | "auto" | "full" | undefined;
|
|
5289
5299
|
overlayColor?: string | undefined;
|
|
@@ -5776,16 +5786,16 @@ export declare const BuiltinBlockSchema: z.ZodDiscriminatedUnion<"_type", [z.Zod
|
|
|
5776
5786
|
label: string;
|
|
5777
5787
|
price: string;
|
|
5778
5788
|
highlighted: boolean;
|
|
5779
|
-
features?: string[] | undefined;
|
|
5780
5789
|
detail?: string | undefined;
|
|
5790
|
+
features?: string[] | undefined;
|
|
5781
5791
|
ctaLabel?: string | undefined;
|
|
5782
5792
|
ctaHref?: string | undefined;
|
|
5783
5793
|
billingPeriod?: string | undefined;
|
|
5784
5794
|
}, {
|
|
5785
5795
|
label?: string | undefined;
|
|
5786
|
-
features?: string[] | undefined;
|
|
5787
5796
|
price?: string | undefined;
|
|
5788
5797
|
detail?: string | undefined;
|
|
5798
|
+
features?: string[] | undefined;
|
|
5789
5799
|
ctaLabel?: string | undefined;
|
|
5790
5800
|
ctaHref?: string | undefined;
|
|
5791
5801
|
highlighted?: boolean | undefined;
|
|
@@ -5828,8 +5838,8 @@ export declare const BuiltinBlockSchema: z.ZodDiscriminatedUnion<"_type", [z.Zod
|
|
|
5828
5838
|
label: string;
|
|
5829
5839
|
price: string;
|
|
5830
5840
|
highlighted: boolean;
|
|
5831
|
-
features?: string[] | undefined;
|
|
5832
5841
|
detail?: string | undefined;
|
|
5842
|
+
features?: string[] | undefined;
|
|
5833
5843
|
ctaLabel?: string | undefined;
|
|
5834
5844
|
ctaHref?: string | undefined;
|
|
5835
5845
|
billingPeriod?: string | undefined;
|
|
@@ -5860,9 +5870,9 @@ export declare const BuiltinBlockSchema: z.ZodDiscriminatedUnion<"_type", [z.Zod
|
|
|
5860
5870
|
} | undefined;
|
|
5861
5871
|
items?: {
|
|
5862
5872
|
label?: string | undefined;
|
|
5863
|
-
features?: string[] | undefined;
|
|
5864
5873
|
price?: string | undefined;
|
|
5865
5874
|
detail?: string | undefined;
|
|
5875
|
+
features?: string[] | undefined;
|
|
5866
5876
|
ctaLabel?: string | undefined;
|
|
5867
5877
|
ctaHref?: string | undefined;
|
|
5868
5878
|
highlighted?: boolean | undefined;
|
|
@@ -10136,6 +10146,9 @@ export declare const AnyBlockSchema: z.ZodUnion<[z.ZodDiscriminatedUnion<"_type"
|
|
|
10136
10146
|
imageUrl: z.ZodOptional<z.ZodString>;
|
|
10137
10147
|
/** Videoachtergrond (mp4/webm); overschrijft de afbeelding als gezet. */
|
|
10138
10148
|
videoUrl: z.ZodOptional<z.ZodString>;
|
|
10149
|
+
/** Kopniveau: "1" voor dé hoofdkop; "2" voor een tweede hero op dezelfde pagina
|
|
10150
|
+
* (twee h1's = slechte SEO/a11y). */
|
|
10151
|
+
headingLevel: z.ZodDefault<z.ZodEnum<["1", "2"]>>;
|
|
10139
10152
|
align: z.ZodDefault<z.ZodEnum<["left", "center"]>>;
|
|
10140
10153
|
/** Verticale uitlijning van de inhoud binnen de hero. */
|
|
10141
10154
|
vAlign: z.ZodDefault<z.ZodEnum<["top", "center", "bottom"]>>;
|
|
@@ -10190,6 +10203,7 @@ export declare const AnyBlockSchema: z.ZodUnion<[z.ZodDiscriminatedUnion<"_type"
|
|
|
10190
10203
|
_type: "hero";
|
|
10191
10204
|
align: "left" | "center";
|
|
10192
10205
|
_key: string;
|
|
10206
|
+
headingLevel: "1" | "2";
|
|
10193
10207
|
vAlign: "center" | "top" | "bottom";
|
|
10194
10208
|
minHeight: "sm" | "md" | "lg" | "auto" | "full";
|
|
10195
10209
|
overlayOpacity: number;
|
|
@@ -10229,6 +10243,7 @@ export declare const AnyBlockSchema: z.ZodUnion<[z.ZodDiscriminatedUnion<"_type"
|
|
|
10229
10243
|
subtitle?: string | undefined;
|
|
10230
10244
|
imageUrl?: string | undefined;
|
|
10231
10245
|
videoUrl?: string | undefined;
|
|
10246
|
+
headingLevel?: "1" | "2" | undefined;
|
|
10232
10247
|
vAlign?: "center" | "top" | "bottom" | undefined;
|
|
10233
10248
|
minHeight?: "sm" | "md" | "lg" | "auto" | "full" | undefined;
|
|
10234
10249
|
overlayColor?: string | undefined;
|
|
@@ -10721,16 +10736,16 @@ export declare const AnyBlockSchema: z.ZodUnion<[z.ZodDiscriminatedUnion<"_type"
|
|
|
10721
10736
|
label: string;
|
|
10722
10737
|
price: string;
|
|
10723
10738
|
highlighted: boolean;
|
|
10724
|
-
features?: string[] | undefined;
|
|
10725
10739
|
detail?: string | undefined;
|
|
10740
|
+
features?: string[] | undefined;
|
|
10726
10741
|
ctaLabel?: string | undefined;
|
|
10727
10742
|
ctaHref?: string | undefined;
|
|
10728
10743
|
billingPeriod?: string | undefined;
|
|
10729
10744
|
}, {
|
|
10730
10745
|
label?: string | undefined;
|
|
10731
|
-
features?: string[] | undefined;
|
|
10732
10746
|
price?: string | undefined;
|
|
10733
10747
|
detail?: string | undefined;
|
|
10748
|
+
features?: string[] | undefined;
|
|
10734
10749
|
ctaLabel?: string | undefined;
|
|
10735
10750
|
ctaHref?: string | undefined;
|
|
10736
10751
|
highlighted?: boolean | undefined;
|
|
@@ -10773,8 +10788,8 @@ export declare const AnyBlockSchema: z.ZodUnion<[z.ZodDiscriminatedUnion<"_type"
|
|
|
10773
10788
|
label: string;
|
|
10774
10789
|
price: string;
|
|
10775
10790
|
highlighted: boolean;
|
|
10776
|
-
features?: string[] | undefined;
|
|
10777
10791
|
detail?: string | undefined;
|
|
10792
|
+
features?: string[] | undefined;
|
|
10778
10793
|
ctaLabel?: string | undefined;
|
|
10779
10794
|
ctaHref?: string | undefined;
|
|
10780
10795
|
billingPeriod?: string | undefined;
|
|
@@ -10805,9 +10820,9 @@ export declare const AnyBlockSchema: z.ZodUnion<[z.ZodDiscriminatedUnion<"_type"
|
|
|
10805
10820
|
} | undefined;
|
|
10806
10821
|
items?: {
|
|
10807
10822
|
label?: string | undefined;
|
|
10808
|
-
features?: string[] | undefined;
|
|
10809
10823
|
price?: string | undefined;
|
|
10810
10824
|
detail?: string | undefined;
|
|
10825
|
+
features?: string[] | undefined;
|
|
10811
10826
|
ctaLabel?: string | undefined;
|
|
10812
10827
|
ctaHref?: string | undefined;
|
|
10813
10828
|
highlighted?: boolean | undefined;
|
package/dist/schema/blocks.js
CHANGED
|
@@ -32,6 +32,9 @@ const HeroBlockSchema = z.object({
|
|
|
32
32
|
imageUrl: z.string().max(2e3).optional(),
|
|
33
33
|
/** Videoachtergrond (mp4/webm); overschrijft de afbeelding als gezet. */
|
|
34
34
|
videoUrl: z.string().max(2e3).optional(),
|
|
35
|
+
/** Kopniveau: "1" voor dé hoofdkop; "2" voor een tweede hero op dezelfde pagina
|
|
36
|
+
* (twee h1's = slechte SEO/a11y). */
|
|
37
|
+
headingLevel: z.enum(["1", "2"]).default("1").describe("Kopniveau (h1/h2)"),
|
|
35
38
|
align: z.enum(["left", "center"]).default("left"),
|
|
36
39
|
/** Verticale uitlijning van de inhoud binnen de hero. */
|
|
37
40
|
vAlign: z.enum(["top", "center", "bottom"]).default("center"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/schema/blocks.ts"],"sourcesContent":["import { z } from \"zod\";\n\n/**\n * Block-schema's (Zod) — de bron van waarheid voor content-structuur, gedeeld door core,\n * de server-helpers en de Cloud Functions. Pure data: geen React, geen Firebase.\n *\n * Elk block heeft een stabiele `_key` (voor reorder/diff) en een `_type` (registry-sleutel).\n * Built-ins staan hieronder; klant-blokken brengen hun eigen schema mee via `defineBlock`\n * (de registry valideert die per type — zie blocks/registry.ts `validateBlocks`).\n */\n\n/**\n * Gedeelde, optionele blokstijl die ELK block kan dragen (via `blockBase`): verticale ruimte,\n * achtergrond, breedte, uitlijning en een anker-id. Toegepast centraal in `BlockRenderer` zodat\n * elk block deze opties krijgt zonder zijn Render te wijzigen. Volledig update-veilig (optioneel).\n */\nexport const BlockStyleSchema = z.object({\n paddingY: z.enum([\"none\", \"sm\", \"md\", \"lg\", \"xl\"]).optional(),\n background: z.string().max(40).optional(),\n width: z.enum([\"container\", \"full\", \"narrow\"]).optional(),\n align: z.enum([\"left\", \"center\", \"right\"]).optional(),\n anchorId: z.string().max(60).optional(),\n /** Subtiele binnenkomst-animatie bij scrollen (progressief + respecteert reduced-motion). */\n animate: z.enum([\"fade\", \"up\"]).optional(),\n});\nexport type BlockStyle = z.infer<typeof BlockStyleSchema>;\n\nexport const blockBase = {\n _key: z.string().min(1).max(64),\n /** Optionele gedeelde blokstijl (ruimte/achtergrond/breedte/uitlijning/anker). */\n _style: BlockStyleSchema.optional(),\n};\n\n/** Losse vorm voor onbekende/klant-blokken: alleen _key + _type vereist, rest vrij. */\nexport const BlockBaseSchema = z\n .object({ ...blockBase, _type: z.string().min(1).max(60) })\n .passthrough();\nexport type BlockBase = z.infer<typeof BlockBaseSchema>;\n\n/** Korte, veilige id voor verwijzingen naar media-items / overige refs. */\nconst ref = z.string().max(256);\nconst richText = z.string().max(100_000); // gesanitizede HTML (zie server/sanitize.ts)\nconst shortText = z.string().max(2000);\n\n/** Knop met label, link en stijlvariant (gedeeld door hero/cta). */\nconst ButtonSchema = z.object({\n label: shortText.default(\"\"),\n href: z.string().max(2000).default(\"#\"),\n variant: z.enum([\"primary\", \"secondary\", \"outline\"]).default(\"primary\"),\n});\n\nexport const HeroBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"hero\"),\n /** Kicker/eyebrow: klein regeltje bóven de titel (bv. \"Hoveniers sinds 2001\"). */\n eyebrow: shortText.optional().describe(\"Regeltje boven de titel\"),\n title: shortText.default(\"\"),\n subtitle: shortText.optional(),\n imageUrl: z.string().max(2000).optional(),\n /** Videoachtergrond (mp4/webm); overschrijft de afbeelding als gezet. */\n videoUrl: z.string().max(2000).optional(),\n align: z.enum([\"left\", \"center\"]).default(\"left\"),\n /** Verticale uitlijning van de inhoud binnen de hero. */\n vAlign: z.enum([\"top\", \"center\", \"bottom\"]).default(\"center\"),\n /** Hoogte: sm/md/lg of volledige viewport. */\n minHeight: z.enum([\"auto\", \"sm\", \"md\", \"lg\", \"full\"]).default(\"auto\"),\n /** Donkere/gekleurde overlay over het beeld voor leesbaar contrast. */\n overlayColor: z.string().max(40).optional(),\n overlayOpacity: z.number().min(0).max(100).default(0),\n /** Gradient-overlay (donker onderaan → transparant boven) voor leesbare tekst op foto's. */\n overlayGradient: z.boolean().default(false).describe(\"Gradient-overlay\"),\n /** Ingebouwde call-to-action-knoppen. */\n buttons: z.array(ButtonSchema).max(3).default([]),\n});\n\nexport const RichTextBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"richText\"),\n html: richText.default(\"\"),\n});\n\nexport const ImageBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"image\"),\n url: z.string().max(2000).optional(),\n alt: shortText.default(\"\"),\n caption: shortText.optional(),\n /** Maak de afbeelding klikbaar. */\n href: z.string().max(2000).optional(),\n /** Uitlijning binnen de kolom. */\n align: z.enum([\"left\", \"center\", \"right\"]).default(\"center\"),\n /** Forceer een beeldverhouding (anders natuurlijk). */\n aspectRatio: z.enum([\"auto\", \"16/9\", \"4/3\", \"1/1\", \"3/2\"]).default(\"auto\"),\n});\n\nexport const GalleryBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"gallery\"),\n items: z\n .array(\n z.object({\n url: z.string().max(2000).optional(),\n alt: shortText.default(\"\"),\n // Update-veilig toegevoegd (Galerij+): optioneel bijschrift onder de foto / in de lightbox.\n caption: shortText.optional(),\n /** Categorie/label voor de filterbalk (bv. \"tuinen\", \"bestrating\"). */\n tag: shortText.optional(),\n }),\n )\n .max(60)\n .default([]),\n /** Filterbalk op item-tags tonen (alleen zichtbaar als er tags zijn). */\n showFilter: z.boolean().default(false).describe(\"Filterbalk op tags\"),\n /** Aantal kolommen in het grid (0 = volg de module-instelling). */\n columns: z.number().int().min(0).max(6).default(0),\n /** Klikken opent een lightbox (0 = volg de module-instelling). */\n lightbox: z.enum([\"inherit\", \"on\", \"off\"]).default(\"inherit\"),\n /** Beeldverhouding van de thumbnails. \"auto\" behoudt de eigen verhouding. */\n aspectRatio: z.enum([\"1/1\", \"4/3\", \"3/2\", \"16/9\", \"auto\"]).default(\"1/1\"),\n});\n\nexport const CtaBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"cta\"),\n title: shortText.default(\"\"),\n text: shortText.optional(),\n buttonLabel: shortText.default(\"Neem contact op\"),\n buttonHref: z.string().max(2000).default(\"#contact\"),\n /** Stijl van de hoofdknop. */\n buttonVariant: z.enum([\"primary\", \"secondary\", \"outline\"]).default(\"primary\"),\n /** Optionele tweede knop. */\n button2Label: shortText.optional(),\n button2Href: z.string().max(2000).optional(),\n /** Achtergrondkleur (CSS-waarde); leeg = thema-default. */\n backgroundColor: z.string().max(40).optional(),\n /** Toon de CTA als vaste balk onderaan het scherm (sticky). */\n sticky: z.boolean().default(false),\n});\n\nexport const FaqBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"faq\"),\n heading: shortText.optional(),\n items: z\n .array(z.object({\n q: shortText.default(\"\"),\n a: shortText.default(\"\"),\n /** Optioneel rich-text-antwoord (HTML, met links/lijsten); wint van `a` als gezet. */\n aHtml: richText.optional(),\n }))\n .max(50)\n .default([]),\n /** FAQ+: toon een zoekveld dat de vragen filtert (handig bij lange lijsten). */\n searchable: z.boolean().default(false),\n /** FAQ+: voeg FAQPage-JSON-LD toe voor rich results in Google. */\n jsonLd: z.boolean().default(false),\n /** Of items standaard open staan. Default dicht (gebruikelijke FAQ-UX). */\n defaultOpen: z.boolean().default(false),\n});\n\nexport const OpeningHoursBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"openingHours\"),\n heading: shortText.optional(),\n rows: z\n .array(z.object({ day: shortText.default(\"\"), hours: shortText.default(\"\") }))\n .max(14)\n .default([]),\n /** Live \"Nu geopend/gesloten\"-badge (werkt bij herkenbare tijden zoals \"09:00 – 17:00\"). */\n showStatus: z.boolean().default(false).describe(\"'Nu geopend'-badge tonen\"),\n /** OpeningHoursSpecification-JSON-LD voor zoekmachines. */\n jsonLd: z.boolean().default(false).describe(\"JSON-LD (openingstijden)\"),\n});\n\nexport const PricingBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"pricing\"),\n heading: shortText.optional(),\n items: z\n .array(\n z.object({\n label: shortText.default(\"\"),\n price: shortText.default(\"\"),\n detail: shortText.optional(),\n /** Inbegrepen features (lijst met vinkjes). */\n features: z.array(shortText).max(20).optional(),\n /** Per-tier knop. */\n ctaLabel: shortText.optional(),\n ctaHref: z.string().max(2000).optional(),\n /** Markeer als uitgelichte tier. */\n highlighted: z.boolean().default(false),\n /** bv. \"/maand\". */\n billingPeriod: shortText.optional(),\n }),\n )\n .max(30)\n .default([]),\n note: shortText.optional(),\n /** ISO-valutacode voor de JSON-LD (bv. \"EUR\", \"USD\"). */\n currency: z.string().max(8).default(\"EUR\").describe(\"Valuta (ISO-code)\"),\n /** Voeg Product/Offer-JSON-LD toe. */\n jsonLd: z.boolean().default(false),\n});\n\nexport const NewsListBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"newsList\"),\n heading: shortText.optional(),\n limit: z.number().int().min(1).max(50).default(6),\n /** Toon eerst dit aantal en de rest via \"Meer laden\" (0 = alles ineens, huidig gedrag). */\n pageSize: z.number().int().min(0).max(24).default(0).describe(\"Per pagina (0 = alles)\"),\n basePath: z.string().max(200).default(\"/nieuws\"),\n});\n\nexport const FormBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"form\"),\n formId: ref,\n heading: shortText.optional(),\n});\n\nexport const SpacerBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"spacer\"),\n size: z.enum([\"sm\", \"md\", \"lg\", \"xl\"]).default(\"md\"),\n});\n\nexport const TestimonialsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"testimonials\"),\n heading: shortText.optional(),\n items: z\n .array(\n z.object({\n quote: shortText.default(\"\"),\n author: shortText.default(\"\"),\n role: shortText.optional(),\n rating: z.number().int().min(1).max(5).optional(),\n avatarUrl: z.string().max(2000).optional(),\n }),\n )\n .max(40)\n .default([]),\n /** Weergave: lijst (kaarten) of grid. */\n layout: z.enum([\"list\", \"grid\"]).default(\"grid\"),\n /** Voeg Review-JSON-LD toe (rich results). */\n jsonLd: z.boolean().default(false),\n});\n\nexport const TeamBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"team\"),\n heading: shortText.optional(),\n members: z\n .array(\n z.object({\n name: shortText.default(\"\"),\n role: shortText.optional(),\n photoUrl: z.string().max(2000).optional(),\n bio: shortText.optional(),\n email: z.string().max(320).optional(),\n phone: shortText.optional(),\n social: z.array(z.object({ platform: shortText, href: z.string().max(2000) })).max(6).optional(),\n /** Afdeling/team voor groepering (bv. \"Keuken\", \"Bediening\"). */\n department: shortText.optional(),\n }),\n )\n .max(60)\n .default([]),\n /** Voeg Person-JSON-LD per lid toe. */\n jsonLd: z.boolean().default(false),\n /** Groepeer leden per afdeling (kopje per afdeling). */\n groupByDepartment: z.boolean().default(false).describe(\"Groeperen per afdeling\"),\n});\n\nexport const AgendaBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"agenda\"),\n heading: shortText.optional(),\n events: z\n .array(\n z.object({\n title: shortText.default(\"\"),\n /** ISO-datum of -datetime, bv. \"2026-07-01\" of \"2026-07-01T19:30\". */\n start: z.string().max(40).default(\"\"),\n end: z.string().max(40).optional(),\n location: shortText.optional(),\n description: shortText.optional(),\n url: z.string().max(2000).optional(),\n }),\n )\n .max(100)\n .default([]),\n /** Verberg events waarvan de startdatum in het verleden ligt. */\n hidePast: z.boolean().default(true),\n /** Voeg Event-JSON-LD toe. */\n jsonLd: z.boolean().default(false),\n});\n\nexport const SearchBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"search\"),\n placeholder: shortText.default(\"Zoeken…\"),\n /** Ook nieuwsartikelen doorzoeken (naast pagina's). */\n includeNews: z.boolean().default(true),\n});\n\nexport const VideoBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"video\"),\n provider: z.enum([\"youtube\", \"vimeo\", \"file\"]).default(\"youtube\"),\n /** YouTube/Vimeo-id of -URL, of een mp4/webm-URL bij \"file\". */\n src: z.string().max(2000).default(\"\"),\n title: shortText.optional(),\n caption: shortText.optional(),\n /** Voorvertoningsbeeld (bij provider \"file\" als poster; met facade ook voor embeds). */\n posterUrl: z.string().max(2000).optional().describe(\"Voorvertoningsbeeld\"),\n /** Click-to-play: toon eerst een thumbnail met play-knop; de speler laadt pas na een klik\n * (sneller laden, minder third-party requests). */\n facade: z.boolean().default(false).describe(\"Click-to-play (laad speler pas na klik)\"),\n /** Toon pas na cookie-consent (categorie \"marketing\"). */\n consentGated: z.boolean().default(true),\n});\n\nexport const FeatureBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"feature\"),\n heading: shortText.optional(),\n /** Rich text (veldnaam \"html\" zodat het server-side gesanitized wordt bij publiceren). */\n html: richText.default(\"\"),\n imageUrl: z.string().max(2000).optional(),\n imagePosition: z.enum([\"left\", \"right\"]).default(\"left\"),\n buttonLabel: shortText.optional(),\n buttonHref: z.string().max(2000).optional(),\n});\n\nexport const BannerBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"banner\"),\n text: shortText.default(\"\"),\n href: z.string().max(2000).optional(),\n linkLabel: shortText.optional(),\n tone: z.enum([\"info\", \"success\", \"warning\"]).default(\"info\"),\n dismissible: z.boolean().default(true),\n /** Wijzig deze waarde (bv. \"2\") als de tekst verandert — wie de oude balk wegklikte ziet de nieuwe weer. */\n dismissVersion: shortText.optional().describe(\"Versie (wijzig om balk opnieuw te tonen)\"),\n});\n\nexport const CountersBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"counters\"),\n heading: shortText.optional(),\n items: z\n .array(z.object({ value: shortText.default(\"\"), label: shortText.default(\"\"), prefix: shortText.optional(), suffix: shortText.optional() }))\n .max(8)\n .default([]),\n /** Tel omhoog wanneer het blok in beeld scrolt (respecteert prefers-reduced-motion). */\n animate: z.boolean().default(true).describe(\"Tel-animatie\"),\n});\n\nexport const LogosBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"logos\"),\n heading: shortText.optional(),\n items: z\n .array(z.object({ src: z.string().max(2000).default(\"\"), alt: shortText.default(\"\"), href: z.string().max(2000).optional() }))\n .max(40)\n .default([]),\n grayscale: z.boolean().default(true),\n /** Doorlopende band (marquee) i.p.v. statische rij; pauzeert bij hover, statisch bij reduced-motion. */\n marquee: z.boolean().default(false).describe(\"Doorlopende band\"),\n});\n\nexport const TimelineBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"timeline\"),\n heading: shortText.optional(),\n items: z\n .array(z.object({ title: shortText.default(\"\"), date: shortText.optional(), text: shortText.optional(), icon: shortText.optional() }))\n .max(40)\n .default([]),\n /** Alternerende links/rechts-layout op bredere schermen. */\n alternate: z.boolean().default(false).describe(\"Alternerende layout\"),\n});\n\nexport const ContactBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"contact\"),\n heading: shortText.optional(),\n address: shortText.optional(),\n phone: shortText.optional(),\n email: z.string().max(320).optional(),\n hours: shortText.optional(),\n /** Coördinaten voor de JSON-LD (Google toont het bedrijf dan op de juiste plek). */\n geo: z.object({ lat: z.number().min(-90).max(90), lng: z.number().min(-180).max(180) }).optional(),\n /** Voeg ContactPoint/LocalBusiness-JSON-LD toe. */\n jsonLd: z.boolean().default(false),\n});\n\nexport const MapBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"map\"),\n provider: z.enum([\"osm\", \"google\"]).default(\"osm\"),\n /** Adres/zoekterm (osm, legacy-fallback) of volledige embed-URL (google). */\n query: shortText.default(\"\"),\n /** OSM-coördinaten; hieruit + zoom bouwt de render een echte bbox (geen wereldkaart meer). */\n lat: z.number().min(-90).max(90).optional().describe(\"Breedtegraad (lat)\"),\n lng: z.number().min(-180).max(180).optional().describe(\"Lengtegraad (lng)\"),\n zoom: z.number().int().min(1).max(20).default(14),\n height: z.number().int().min(150).max(800).default(360),\n consentGated: z.boolean().default(true),\n});\n\nexport const SocialBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"social\"),\n heading: shortText.optional(),\n items: z\n .array(z.object({ platform: shortText.default(\"\"), href: z.string().max(2000).default(\"\") }))\n .max(12)\n .default([]),\n});\n\nexport const NewsletterBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"newsletter\"),\n heading: shortText.optional(),\n text: shortText.optional(),\n buttonLabel: shortText.default(\"Aanmelden\"),\n /** Waar het e-mailadres heen gaat (extern aanmeld-endpoint, POST email). Leeg = XiCMS-formulier. */\n actionUrl: z.string().max(2000).optional(),\n /** Formulier-id voor opslag via XiCMS (als actionUrl leeg is). */\n formId: ref.optional(),\n /** AVG: indien gezet verschijnt een verplichte akkoord-checkbox met deze tekst. */\n consentText: shortText.optional().describe(\"AVG-akkoordtekst (leeg = geen checkbox)\"),\n});\n\n/** Bekende reserveer-/afspraaksystemen (preset; \"custom\" = vrije embed-URL). */\nexport const BookingProviderSchema = z.enum([\n \"custom\",\n \"calendly\",\n \"cal\",\n \"formitable\",\n \"resengo\",\n \"thefork\",\n \"treatwell\",\n \"salonized\",\n \"tablebooker\",\n \"bookingkit\",\n]);\n\nexport const BookingBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"booking\"),\n heading: shortText.optional(),\n /** Welk reserveersysteem; bepaalt de embed-helper en uitleg in de editor. */\n provider: BookingProviderSchema.default(\"custom\"),\n /** Embed-URL of account/slug bij een preset-provider (bv. Calendly-link, Formitable-restaurant-id). */\n embedUrl: z.string().max(2000).default(\"\"),\n height: z.number().int().min(300).max(1200).default(630),\n consentGated: z.boolean().default(true),\n});\n\nexport const ButtonsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"buttons\"),\n align: z.enum([\"left\", \"center\", \"right\"]).default(\"left\"),\n items: z\n .array(z.object({ label: shortText.default(\"\"), href: z.string().max(2000).default(\"#\"), variant: z.enum([\"primary\", \"secondary\", \"outline\"]).default(\"primary\") }))\n .max(6)\n .default([]),\n});\n\nexport const QuoteBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"quote\"),\n text: shortText.default(\"\"),\n author: shortText.optional(),\n role: shortText.optional(),\n});\n\nexport const DividerBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"divider\"),\n variant: z.enum([\"line\", \"dots\", \"space\"]).default(\"line\"),\n spacing: z.enum([\"sm\", \"md\", \"lg\"]).default(\"md\"),\n});\n\nexport const AccordionBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"accordion\"),\n heading: shortText.optional(),\n items: z\n .array(z.object({\n title: shortText.default(\"\"),\n body: shortText.default(\"\"),\n /** Optioneel rich-text-paneel (HTML); wint van `body` als gezet. */\n bodyHtml: richText.optional(),\n }))\n .max(50)\n .default([]),\n /** Sta toe dat meerdere panelen tegelijk open staan. */\n multiple: z.boolean().default(false),\n});\n\nexport const EmbedBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"embed\"),\n url: z.string().max(2000).default(\"\"),\n title: shortText.optional(),\n height: z.number().int().min(150).max(1200).default(420),\n /** Beeldverhouding; \"fixed\" gebruikt de vaste hoogte (huidig gedrag). */\n aspectRatio: z.enum([\"fixed\", \"16/9\", \"4/3\", \"1/1\"]).default(\"fixed\").describe(\"Beeldverhouding\"),\n /** Toon pas na cookie-toestemming (categorie \"marketing\"). */\n consentGated: z.boolean().default(true),\n});\n\nexport const ColumnsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"columns\"),\n columns: z\n .array(z.object({ blocks: z.array(BlockBaseSchema).max(50).default([]) }))\n .min(1)\n .max(4)\n .default([]),\n});\n\n/**\n * Indelingsblok \"Met zijbalk\": een brede hoofdkolom met blokken plus een smalle (sticky) zijbalk\n * waarin je widgets zet (laatste nieuws, komende agenda, contact, …). Beide kanten bevatten gewone\n * blokken; de zijbalk is bedoeld voor de compacte widget-varianten.\n */\nexport const WithSidebarBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"withSidebar\"),\n main: z.array(BlockBaseSchema).max(50).default([]),\n aside: z.array(BlockBaseSchema).max(30).default([]),\n side: z.enum([\"left\", \"right\"]).default(\"right\"),\n sidebarWidth: z.enum([\"sm\", \"md\", \"lg\"]).default(\"md\"),\n sticky: z.boolean().default(true),\n});\n\n/**\n * Tabbladen: per tab een eigen set blokken. Indelingsblok (layout) — handig om veel informatie\n * compact aan te bieden (bv. \"Beschrijving / Specificaties / Reviews\").\n */\nexport const TabsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"tabs\"),\n tabs: z\n .array(z.object({ label: shortText.default(\"Tab\"), blocks: z.array(BlockBaseSchema).max(30).default([]) }))\n .min(1)\n .max(10)\n .default([]),\n});\n\n/* ════════════════════ Nieuwe modules (volwaardig) ════════════════════ */\n\n/** Diensten/uitgelichte kaarten in een grid (icoon of beeld + titel + tekst + link). */\nexport const CardsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"cards\"),\n heading: shortText.optional(),\n intro: shortText.optional(),\n columns: z.number().int().min(1).max(4).default(3),\n /** \"cover\" = beeld edge-to-edge bovenaan de kaart (postkaart-stijl); \"inset\" = ingekaderd. */\n imageStyle: z.enum([\"inset\", \"cover\"]).default(\"inset\"),\n items: z\n .array(\n z.object({\n icon: shortText.optional(),\n imageUrl: z.string().max(2000).optional(),\n title: shortText.default(\"\"),\n text: shortText.optional(),\n href: z.string().max(2000).optional(),\n linkLabel: shortText.optional(),\n /** Uitgelichte kaart (accentrand + subtiele schaal). */\n featured: z.boolean().default(false),\n }),\n )\n .max(24)\n .default([]),\n});\n\n/** Downloadbare documenten (brochures, prijslijsten, voorwaarden). */\nexport const DownloadsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"downloads\"),\n heading: shortText.optional(),\n items: z\n .array(z.object({ label: shortText.default(\"\"), href: z.string().max(2000).default(\"\"), meta: shortText.optional() }))\n .max(60)\n .default([]),\n});\n\n/** Inline PDF-lezer voor één of meerdere documenten (bv. lunch-/diner-/wijnkaart). */\nexport const PdfBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"pdf\"),\n heading: shortText.optional(),\n /** Eén of meer PDF's; bij meerdere verschijnen tabs (label) om te wisselen. */\n documents: z\n .array(z.object({ label: shortText.default(\"\"), url: z.string().max(2000).default(\"\") }))\n .max(12)\n .default([]),\n height: z.number().int().min(300).max(1600).default(820),\n /** Toon een \"Open/Download\"-link onder de viewer. */\n showDownload: z.boolean().default(true),\n});\n\n/** Afteltimer naar een datum/tijd (lancering, evenement, aanbieding). Client-side telling. */\nexport const CountdownBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"countdown\"),\n heading: shortText.optional(),\n /** ISO-datetime, bv. \"2026-12-31T23:59\". */\n target: z.string().max(40).default(\"\"),\n expiredText: shortText.default(\"Het is zover!\"),\n showLabels: z.boolean().default(true),\n /** Wat er gebeurt als de teller afloopt: melding tonen of het hele blok verbergen. */\n onExpire: z.enum([\"message\", \"hide\"]).default(\"message\").describe(\"Na afloop\"),\n});\n\n/** Beeld-/contentcarrousel (slider). Client-side; optioneel autoplay (respecteert reduced-motion). */\nexport const SliderBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"slider\"),\n slides: z\n .array(\n z.object({\n imageUrl: z.string().max(2000).optional(),\n alt: shortText.default(\"\"),\n caption: shortText.optional(),\n href: z.string().max(2000).optional(),\n }),\n )\n .max(20)\n .default([]),\n autoplay: z.boolean().default(false),\n /** Interval in seconden bij autoplay. */\n interval: z.number().int().min(2).max(20).default(5),\n showDots: z.boolean().default(true),\n showArrows: z.boolean().default(true),\n aspectRatio: z.enum([\"16/9\", \"4/3\", \"3/2\", \"1/1\", \"21/9\"]).default(\"16/9\"),\n});\n\n/* ── 4.16: nieuwe modules ─────────────────────────────────────────────────── */\n\n/** Zwevende WhatsApp-/contactknop (wa.me-link; geen embed, dus geen consent nodig). */\nexport const WhatsappChatBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"whatsappChat\"),\n /** Telefoonnummer, internationaal (bv. \"31612345678\" of \"+31 6 12345678\"). */\n phone: shortText.default(\"\").describe(\"Telefoonnummer (internationaal)\"),\n /** Vooringevuld bericht in WhatsApp. */\n prefilledText: shortText.optional().describe(\"Vooringevuld bericht\"),\n /** Tekstlabel naast het icoon (leeg = alleen icoon). */\n label: shortText.optional().describe(\"Label (optioneel)\"),\n position: z.enum([\"br\", \"bl\"]).default(\"br\").describe(\"Positie (rechts-/linksonder)\"),\n});\n\n/** Voor/na-vergelijker: twee foto's met een sleepbare scheiding. */\nexport const BeforeAfterBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"beforeAfter\"),\n heading: shortText.optional(),\n beforeUrl: z.string().max(2000).default(\"\"),\n afterUrl: z.string().max(2000).default(\"\"),\n beforeLabel: shortText.default(\"Voor\"),\n afterLabel: shortText.default(\"Na\"),\n alt: shortText.default(\"\"),\n aspectRatio: z.enum([\"16/9\", \"4/3\", \"3/2\", \"1/1\"]).default(\"4/3\"),\n});\n\n/** Portfolio/projecten-grid met categorie-filter en lightbox. */\nexport const PortfolioBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"portfolio\"),\n heading: shortText.optional(),\n intro: shortText.optional(),\n columns: z.number().int().min(1).max(4).default(3),\n items: z\n .array(\n z.object({\n imageUrl: z.string().max(2000).default(\"\"),\n title: shortText.default(\"\"),\n category: shortText.optional(),\n description: shortText.optional(),\n href: z.string().max(2000).optional(),\n }),\n )\n .max(60)\n .default([]),\n /** Filterbalk op categorieën (alleen zichtbaar als er categorieën zijn). */\n showFilter: z.boolean().default(true).describe(\"Filterbalk op categorieën\"),\n lightbox: z.boolean().default(true).describe(\"Lightbox bij klikken\"),\n});\n\n/** Vacatures met JobPosting-JSON-LD (Google Jobs). */\nexport const JobsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"jobs\"),\n heading: shortText.optional(),\n intro: shortText.optional(),\n items: z\n .array(\n z.object({\n title: shortText.default(\"\"),\n location: shortText.optional(),\n /** bv. \"Fulltime\", \"Parttime\", \"BBL\". */\n employmentType: shortText.optional(),\n description: shortText.optional(),\n salary: shortText.optional(),\n applyUrl: z.string().max(2000).optional(),\n /** ISO-datum van plaatsing (voor Google Jobs). */\n datePosted: shortText.optional(),\n }),\n )\n .max(30)\n .default([]),\n jsonLd: z.boolean().default(true).describe(\"JSON-LD (Google Jobs)\"),\n});\n\n/** Kruimelpad, afgeleid van de URL, met BreadcrumbList-JSON-LD. */\nexport const BreadcrumbsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"breadcrumbs\"),\n homeLabel: shortText.default(\"Home\"),\n jsonLd: z.boolean().default(true).describe(\"JSON-LD (BreadcrumbList)\"),\n});\n\n/* ════════════════════ Widgets (compacte zijbalk-varianten) ════════════════════ */\n\n/** Compacte lijst met de laatste nieuwsartikelen (haalt live uit dezelfde nieuws-collectie). */\nexport const NewsWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"newsWidget\"),\n heading: shortText.optional(),\n limit: z.number().int().min(1).max(12).default(5),\n basePath: z.string().max(200).default(\"/nieuws\"),\n showImages: z.boolean().default(false),\n});\n\n/** Compacte lijst met de eerstvolgende evenementen (zelfde events + datumlogica als het Agenda-blok). */\nexport const AgendaWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"agendaWidget\"),\n heading: shortText.optional(),\n limit: z.number().int().min(1).max(12).default(5),\n events: z\n .array(\n z.object({\n title: shortText.default(\"\"),\n start: z.string().max(40).default(\"\"),\n end: z.string().max(40).optional(),\n location: shortText.optional(),\n url: z.string().max(2000).optional(),\n }),\n )\n .max(100)\n .default([]),\n hidePast: z.boolean().default(true),\n});\n\n/** Compacte openingstijden met \"vandaag\" gemarkeerd (zelfde rijen als het Openingstijden-blok). */\nexport const OpeningHoursWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"openingHoursWidget\"),\n heading: shortText.optional(),\n rows: z\n .array(z.object({ day: shortText.default(\"\"), hours: shortText.default(\"\") }))\n .max(14)\n .default([]),\n highlightToday: z.boolean().default(true),\n});\n\n/** Compacte contactgegevens (NAW) voor in de zijbalk. */\nexport const ContactWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"contactWidget\"),\n heading: shortText.optional(),\n address: shortText.optional(),\n phone: shortText.optional(),\n email: z.string().max(320).optional(),\n});\n\n/** Compacte social-iconenrij. */\nexport const SocialWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"socialWidget\"),\n heading: shortText.optional(),\n items: z\n .array(z.object({ platform: shortText.default(\"\"), href: z.string().max(2000).default(\"\") }))\n .max(12)\n .default([]),\n});\n\n/** Compacte nieuwsbrief-aanmelding (zelfde provider-action als het Nieuwsbrief-blok). */\nexport const NewsletterWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"newsletterWidget\"),\n heading: shortText.optional(),\n text: shortText.optional(),\n buttonLabel: shortText.default(\"Aanmelden\"),\n actionUrl: z.string().max(2000).optional(),\n});\n\n/** Compacte call-to-action-kaart. */\nexport const CtaWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"ctaWidget\"),\n title: shortText.default(\"\"),\n text: shortText.optional(),\n buttonLabel: shortText.default(\"Lees meer\"),\n buttonHref: z.string().max(2000).default(\"#\"),\n backgroundColor: z.string().max(40).optional(),\n});\n\n/** Compacte fotostrip (zelfde items als de Galerij). */\nexport const GalleryWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"galleryWidget\"),\n heading: shortText.optional(),\n items: z\n .array(z.object({ url: z.string().max(2000).optional(), alt: shortText.default(\"\") }))\n .max(24)\n .default([]),\n columns: z.number().int().min(2).max(4).default(3),\n});\n\n/** Compacte review/quote (zelfde items als Reviews). */\nexport const TestimonialsWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"testimonialsWidget\"),\n heading: shortText.optional(),\n items: z\n .array(z.object({ quote: shortText.default(\"\"), author: shortText.default(\"\"), rating: z.number().int().min(1).max(5).optional() }))\n .max(20)\n .default([]),\n});\n\n/** Compacte diensten-/kaartenlijst (zelfde kaarten als het Diensten-blok). */\nexport const CardsWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"cardsWidget\"),\n heading: shortText.optional(),\n items: z\n .array(z.object({ icon: shortText.optional(), title: shortText.default(\"\"), text: shortText.optional(), href: z.string().max(2000).optional() }))\n .max(10)\n .default([]),\n});\n\n/** Compacte downloadlijst (zelfde documenten als het Downloads-blok). */\nexport const DownloadsWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"downloadsWidget\"),\n heading: shortText.optional(),\n limit: z.number().int().min(1).max(12).default(5),\n items: z\n .array(z.object({ label: shortText.default(\"\"), href: z.string().max(2000).default(\"\"), meta: shortText.optional() }))\n .max(60)\n .default([]),\n});\n\n/** Compacte aftelteller. */\nexport const CountdownWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"countdownWidget\"),\n heading: shortText.optional(),\n target: z.string().max(40).default(\"\"),\n expiredText: shortText.default(\"Het is zover!\"),\n});\n\n/** Verwijzing naar een gedeeld symbool (5.0): de sectie leeft in sites/{siteId}/symbols en\n * propageert naar élke pagina die ernaar verwijst. Loskoppelen (editor) maakt er een kloon van. */\nexport const SymbolRefBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"symbolRef\"),\n // Leeg = nog geen symbool gekozen (vers blok); render en server-expansie slaan dat stil over.\n symbolId: z.string().max(120).default(\"\").describe(\"Symbool\"),\n});\n\n/** Discriminated union over alle ingebouwde block-types. */\nexport const BuiltinBlockSchema = z.discriminatedUnion(\"_type\", [\n HeroBlockSchema,\n RichTextBlockSchema,\n ImageBlockSchema,\n GalleryBlockSchema,\n CtaBlockSchema,\n FaqBlockSchema,\n OpeningHoursBlockSchema,\n PricingBlockSchema,\n NewsListBlockSchema,\n FormBlockSchema,\n SpacerBlockSchema,\n ColumnsBlockSchema,\n TestimonialsBlockSchema,\n TeamBlockSchema,\n AgendaBlockSchema,\n SearchBlockSchema,\n VideoBlockSchema,\n FeatureBlockSchema,\n BannerBlockSchema,\n CountersBlockSchema,\n LogosBlockSchema,\n TimelineBlockSchema,\n ContactBlockSchema,\n MapBlockSchema,\n SocialBlockSchema,\n NewsletterBlockSchema,\n BookingBlockSchema,\n ButtonsBlockSchema,\n QuoteBlockSchema,\n DividerBlockSchema,\n AccordionBlockSchema,\n EmbedBlockSchema,\n // Indeling\n WithSidebarBlockSchema,\n SymbolRefBlockSchema,\n TabsBlockSchema,\n // Nieuwe modules\n CardsBlockSchema,\n DownloadsBlockSchema,\n PdfBlockSchema,\n CountdownBlockSchema,\n SliderBlockSchema,\n WhatsappChatBlockSchema,\n BeforeAfterBlockSchema,\n PortfolioBlockSchema,\n JobsBlockSchema,\n BreadcrumbsBlockSchema,\n // Widgets (compacte varianten)\n NewsWidgetSchema,\n AgendaWidgetSchema,\n OpeningHoursWidgetSchema,\n ContactWidgetSchema,\n SocialWidgetSchema,\n NewsletterWidgetSchema,\n CtaWidgetSchema,\n GalleryWidgetSchema,\n TestimonialsWidgetSchema,\n CardsWidgetSchema,\n DownloadsWidgetSchema,\n CountdownWidgetSchema,\n]);\nexport type BuiltinBlock = z.infer<typeof BuiltinBlockSchema>;\n\n/** Een willekeurig block (built-in of klant-specifiek). */\nexport const AnyBlockSchema = z.union([BuiltinBlockSchema, BlockBaseSchema]);\nexport type AnyBlock = z.infer<typeof AnyBlockSchema>;\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/schema/blocks.ts"],"sourcesContent":["import { z } from \"zod\";\n\n/**\n * Block-schema's (Zod) — de bron van waarheid voor content-structuur, gedeeld door core,\n * de server-helpers en de Cloud Functions. Pure data: geen React, geen Firebase.\n *\n * Elk block heeft een stabiele `_key` (voor reorder/diff) en een `_type` (registry-sleutel).\n * Built-ins staan hieronder; klant-blokken brengen hun eigen schema mee via `defineBlock`\n * (de registry valideert die per type — zie blocks/registry.ts `validateBlocks`).\n */\n\n/**\n * Gedeelde, optionele blokstijl die ELK block kan dragen (via `blockBase`): verticale ruimte,\n * achtergrond, breedte, uitlijning en een anker-id. Toegepast centraal in `BlockRenderer` zodat\n * elk block deze opties krijgt zonder zijn Render te wijzigen. Volledig update-veilig (optioneel).\n */\nexport const BlockStyleSchema = z.object({\n paddingY: z.enum([\"none\", \"sm\", \"md\", \"lg\", \"xl\"]).optional(),\n background: z.string().max(40).optional(),\n width: z.enum([\"container\", \"full\", \"narrow\"]).optional(),\n align: z.enum([\"left\", \"center\", \"right\"]).optional(),\n anchorId: z.string().max(60).optional(),\n /** Subtiele binnenkomst-animatie bij scrollen (progressief + respecteert reduced-motion). */\n animate: z.enum([\"fade\", \"up\"]).optional(),\n});\nexport type BlockStyle = z.infer<typeof BlockStyleSchema>;\n\nexport const blockBase = {\n _key: z.string().min(1).max(64),\n /** Optionele gedeelde blokstijl (ruimte/achtergrond/breedte/uitlijning/anker). */\n _style: BlockStyleSchema.optional(),\n};\n\n/** Losse vorm voor onbekende/klant-blokken: alleen _key + _type vereist, rest vrij. */\nexport const BlockBaseSchema = z\n .object({ ...blockBase, _type: z.string().min(1).max(60) })\n .passthrough();\nexport type BlockBase = z.infer<typeof BlockBaseSchema>;\n\n/** Korte, veilige id voor verwijzingen naar media-items / overige refs. */\nconst ref = z.string().max(256);\nconst richText = z.string().max(100_000); // gesanitizede HTML (zie server/sanitize.ts)\nconst shortText = z.string().max(2000);\n\n/** Knop met label, link en stijlvariant (gedeeld door hero/cta). */\nconst ButtonSchema = z.object({\n label: shortText.default(\"\"),\n href: z.string().max(2000).default(\"#\"),\n variant: z.enum([\"primary\", \"secondary\", \"outline\"]).default(\"primary\"),\n});\n\nexport const HeroBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"hero\"),\n /** Kicker/eyebrow: klein regeltje bóven de titel (bv. \"Hoveniers sinds 2001\"). */\n eyebrow: shortText.optional().describe(\"Regeltje boven de titel\"),\n title: shortText.default(\"\"),\n subtitle: shortText.optional(),\n imageUrl: z.string().max(2000).optional(),\n /** Videoachtergrond (mp4/webm); overschrijft de afbeelding als gezet. */\n videoUrl: z.string().max(2000).optional(),\n /** Kopniveau: \"1\" voor dé hoofdkop; \"2\" voor een tweede hero op dezelfde pagina\n * (twee h1's = slechte SEO/a11y). */\n headingLevel: z.enum([\"1\", \"2\"]).default(\"1\").describe(\"Kopniveau (h1/h2)\"),\n align: z.enum([\"left\", \"center\"]).default(\"left\"),\n /** Verticale uitlijning van de inhoud binnen de hero. */\n vAlign: z.enum([\"top\", \"center\", \"bottom\"]).default(\"center\"),\n /** Hoogte: sm/md/lg of volledige viewport. */\n minHeight: z.enum([\"auto\", \"sm\", \"md\", \"lg\", \"full\"]).default(\"auto\"),\n /** Donkere/gekleurde overlay over het beeld voor leesbaar contrast. */\n overlayColor: z.string().max(40).optional(),\n overlayOpacity: z.number().min(0).max(100).default(0),\n /** Gradient-overlay (donker onderaan → transparant boven) voor leesbare tekst op foto's. */\n overlayGradient: z.boolean().default(false).describe(\"Gradient-overlay\"),\n /** Ingebouwde call-to-action-knoppen. */\n buttons: z.array(ButtonSchema).max(3).default([]),\n});\n\nexport const RichTextBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"richText\"),\n html: richText.default(\"\"),\n});\n\nexport const ImageBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"image\"),\n url: z.string().max(2000).optional(),\n alt: shortText.default(\"\"),\n caption: shortText.optional(),\n /** Maak de afbeelding klikbaar. */\n href: z.string().max(2000).optional(),\n /** Uitlijning binnen de kolom. */\n align: z.enum([\"left\", \"center\", \"right\"]).default(\"center\"),\n /** Forceer een beeldverhouding (anders natuurlijk). */\n aspectRatio: z.enum([\"auto\", \"16/9\", \"4/3\", \"1/1\", \"3/2\"]).default(\"auto\"),\n});\n\nexport const GalleryBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"gallery\"),\n items: z\n .array(\n z.object({\n url: z.string().max(2000).optional(),\n alt: shortText.default(\"\"),\n // Update-veilig toegevoegd (Galerij+): optioneel bijschrift onder de foto / in de lightbox.\n caption: shortText.optional(),\n /** Categorie/label voor de filterbalk (bv. \"tuinen\", \"bestrating\"). */\n tag: shortText.optional(),\n }),\n )\n .max(60)\n .default([]),\n /** Filterbalk op item-tags tonen (alleen zichtbaar als er tags zijn). */\n showFilter: z.boolean().default(false).describe(\"Filterbalk op tags\"),\n /** Aantal kolommen in het grid (0 = volg de module-instelling). */\n columns: z.number().int().min(0).max(6).default(0),\n /** Klikken opent een lightbox (0 = volg de module-instelling). */\n lightbox: z.enum([\"inherit\", \"on\", \"off\"]).default(\"inherit\"),\n /** Beeldverhouding van de thumbnails. \"auto\" behoudt de eigen verhouding. */\n aspectRatio: z.enum([\"1/1\", \"4/3\", \"3/2\", \"16/9\", \"auto\"]).default(\"1/1\"),\n});\n\nexport const CtaBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"cta\"),\n title: shortText.default(\"\"),\n text: shortText.optional(),\n buttonLabel: shortText.default(\"Neem contact op\"),\n buttonHref: z.string().max(2000).default(\"#contact\"),\n /** Stijl van de hoofdknop. */\n buttonVariant: z.enum([\"primary\", \"secondary\", \"outline\"]).default(\"primary\"),\n /** Optionele tweede knop. */\n button2Label: shortText.optional(),\n button2Href: z.string().max(2000).optional(),\n /** Achtergrondkleur (CSS-waarde); leeg = thema-default. */\n backgroundColor: z.string().max(40).optional(),\n /** Toon de CTA als vaste balk onderaan het scherm (sticky). */\n sticky: z.boolean().default(false),\n});\n\nexport const FaqBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"faq\"),\n heading: shortText.optional(),\n items: z\n .array(z.object({\n q: shortText.default(\"\"),\n a: shortText.default(\"\"),\n /** Optioneel rich-text-antwoord (HTML, met links/lijsten); wint van `a` als gezet. */\n aHtml: richText.optional(),\n }))\n .max(50)\n .default([]),\n /** FAQ+: toon een zoekveld dat de vragen filtert (handig bij lange lijsten). */\n searchable: z.boolean().default(false),\n /** FAQ+: voeg FAQPage-JSON-LD toe voor rich results in Google. */\n jsonLd: z.boolean().default(false),\n /** Of items standaard open staan. Default dicht (gebruikelijke FAQ-UX). */\n defaultOpen: z.boolean().default(false),\n});\n\nexport const OpeningHoursBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"openingHours\"),\n heading: shortText.optional(),\n rows: z\n .array(z.object({ day: shortText.default(\"\"), hours: shortText.default(\"\") }))\n .max(14)\n .default([]),\n /** Live \"Nu geopend/gesloten\"-badge (werkt bij herkenbare tijden zoals \"09:00 – 17:00\"). */\n showStatus: z.boolean().default(false).describe(\"'Nu geopend'-badge tonen\"),\n /** OpeningHoursSpecification-JSON-LD voor zoekmachines. */\n jsonLd: z.boolean().default(false).describe(\"JSON-LD (openingstijden)\"),\n});\n\nexport const PricingBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"pricing\"),\n heading: shortText.optional(),\n items: z\n .array(\n z.object({\n label: shortText.default(\"\"),\n price: shortText.default(\"\"),\n detail: shortText.optional(),\n /** Inbegrepen features (lijst met vinkjes). */\n features: z.array(shortText).max(20).optional(),\n /** Per-tier knop. */\n ctaLabel: shortText.optional(),\n ctaHref: z.string().max(2000).optional(),\n /** Markeer als uitgelichte tier. */\n highlighted: z.boolean().default(false),\n /** bv. \"/maand\". */\n billingPeriod: shortText.optional(),\n }),\n )\n .max(30)\n .default([]),\n note: shortText.optional(),\n /** ISO-valutacode voor de JSON-LD (bv. \"EUR\", \"USD\"). */\n currency: z.string().max(8).default(\"EUR\").describe(\"Valuta (ISO-code)\"),\n /** Voeg Product/Offer-JSON-LD toe. */\n jsonLd: z.boolean().default(false),\n});\n\nexport const NewsListBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"newsList\"),\n heading: shortText.optional(),\n limit: z.number().int().min(1).max(50).default(6),\n /** Toon eerst dit aantal en de rest via \"Meer laden\" (0 = alles ineens, huidig gedrag). */\n pageSize: z.number().int().min(0).max(24).default(0).describe(\"Per pagina (0 = alles)\"),\n basePath: z.string().max(200).default(\"/nieuws\"),\n});\n\nexport const FormBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"form\"),\n formId: ref,\n heading: shortText.optional(),\n});\n\nexport const SpacerBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"spacer\"),\n size: z.enum([\"sm\", \"md\", \"lg\", \"xl\"]).default(\"md\"),\n});\n\nexport const TestimonialsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"testimonials\"),\n heading: shortText.optional(),\n items: z\n .array(\n z.object({\n quote: shortText.default(\"\"),\n author: shortText.default(\"\"),\n role: shortText.optional(),\n rating: z.number().int().min(1).max(5).optional(),\n avatarUrl: z.string().max(2000).optional(),\n }),\n )\n .max(40)\n .default([]),\n /** Weergave: lijst (kaarten) of grid. */\n layout: z.enum([\"list\", \"grid\"]).default(\"grid\"),\n /** Voeg Review-JSON-LD toe (rich results). */\n jsonLd: z.boolean().default(false),\n});\n\nexport const TeamBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"team\"),\n heading: shortText.optional(),\n members: z\n .array(\n z.object({\n name: shortText.default(\"\"),\n role: shortText.optional(),\n photoUrl: z.string().max(2000).optional(),\n bio: shortText.optional(),\n email: z.string().max(320).optional(),\n phone: shortText.optional(),\n social: z.array(z.object({ platform: shortText, href: z.string().max(2000) })).max(6).optional(),\n /** Afdeling/team voor groepering (bv. \"Keuken\", \"Bediening\"). */\n department: shortText.optional(),\n }),\n )\n .max(60)\n .default([]),\n /** Voeg Person-JSON-LD per lid toe. */\n jsonLd: z.boolean().default(false),\n /** Groepeer leden per afdeling (kopje per afdeling). */\n groupByDepartment: z.boolean().default(false).describe(\"Groeperen per afdeling\"),\n});\n\nexport const AgendaBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"agenda\"),\n heading: shortText.optional(),\n events: z\n .array(\n z.object({\n title: shortText.default(\"\"),\n /** ISO-datum of -datetime, bv. \"2026-07-01\" of \"2026-07-01T19:30\". */\n start: z.string().max(40).default(\"\"),\n end: z.string().max(40).optional(),\n location: shortText.optional(),\n description: shortText.optional(),\n url: z.string().max(2000).optional(),\n }),\n )\n .max(100)\n .default([]),\n /** Verberg events waarvan de startdatum in het verleden ligt. */\n hidePast: z.boolean().default(true),\n /** Voeg Event-JSON-LD toe. */\n jsonLd: z.boolean().default(false),\n});\n\nexport const SearchBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"search\"),\n placeholder: shortText.default(\"Zoeken…\"),\n /** Ook nieuwsartikelen doorzoeken (naast pagina's). */\n includeNews: z.boolean().default(true),\n});\n\nexport const VideoBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"video\"),\n provider: z.enum([\"youtube\", \"vimeo\", \"file\"]).default(\"youtube\"),\n /** YouTube/Vimeo-id of -URL, of een mp4/webm-URL bij \"file\". */\n src: z.string().max(2000).default(\"\"),\n title: shortText.optional(),\n caption: shortText.optional(),\n /** Voorvertoningsbeeld (bij provider \"file\" als poster; met facade ook voor embeds). */\n posterUrl: z.string().max(2000).optional().describe(\"Voorvertoningsbeeld\"),\n /** Click-to-play: toon eerst een thumbnail met play-knop; de speler laadt pas na een klik\n * (sneller laden, minder third-party requests). */\n facade: z.boolean().default(false).describe(\"Click-to-play (laad speler pas na klik)\"),\n /** Toon pas na cookie-consent (categorie \"marketing\"). */\n consentGated: z.boolean().default(true),\n});\n\nexport const FeatureBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"feature\"),\n heading: shortText.optional(),\n /** Rich text (veldnaam \"html\" zodat het server-side gesanitized wordt bij publiceren). */\n html: richText.default(\"\"),\n imageUrl: z.string().max(2000).optional(),\n imagePosition: z.enum([\"left\", \"right\"]).default(\"left\"),\n buttonLabel: shortText.optional(),\n buttonHref: z.string().max(2000).optional(),\n});\n\nexport const BannerBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"banner\"),\n text: shortText.default(\"\"),\n href: z.string().max(2000).optional(),\n linkLabel: shortText.optional(),\n tone: z.enum([\"info\", \"success\", \"warning\"]).default(\"info\"),\n dismissible: z.boolean().default(true),\n /** Wijzig deze waarde (bv. \"2\") als de tekst verandert — wie de oude balk wegklikte ziet de nieuwe weer. */\n dismissVersion: shortText.optional().describe(\"Versie (wijzig om balk opnieuw te tonen)\"),\n});\n\nexport const CountersBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"counters\"),\n heading: shortText.optional(),\n items: z\n .array(z.object({ value: shortText.default(\"\"), label: shortText.default(\"\"), prefix: shortText.optional(), suffix: shortText.optional() }))\n .max(8)\n .default([]),\n /** Tel omhoog wanneer het blok in beeld scrolt (respecteert prefers-reduced-motion). */\n animate: z.boolean().default(true).describe(\"Tel-animatie\"),\n});\n\nexport const LogosBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"logos\"),\n heading: shortText.optional(),\n items: z\n .array(z.object({ src: z.string().max(2000).default(\"\"), alt: shortText.default(\"\"), href: z.string().max(2000).optional() }))\n .max(40)\n .default([]),\n grayscale: z.boolean().default(true),\n /** Doorlopende band (marquee) i.p.v. statische rij; pauzeert bij hover, statisch bij reduced-motion. */\n marquee: z.boolean().default(false).describe(\"Doorlopende band\"),\n});\n\nexport const TimelineBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"timeline\"),\n heading: shortText.optional(),\n items: z\n .array(z.object({ title: shortText.default(\"\"), date: shortText.optional(), text: shortText.optional(), icon: shortText.optional() }))\n .max(40)\n .default([]),\n /** Alternerende links/rechts-layout op bredere schermen. */\n alternate: z.boolean().default(false).describe(\"Alternerende layout\"),\n});\n\nexport const ContactBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"contact\"),\n heading: shortText.optional(),\n address: shortText.optional(),\n phone: shortText.optional(),\n email: z.string().max(320).optional(),\n hours: shortText.optional(),\n /** Coördinaten voor de JSON-LD (Google toont het bedrijf dan op de juiste plek). */\n geo: z.object({ lat: z.number().min(-90).max(90), lng: z.number().min(-180).max(180) }).optional(),\n /** Voeg ContactPoint/LocalBusiness-JSON-LD toe. */\n jsonLd: z.boolean().default(false),\n});\n\nexport const MapBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"map\"),\n provider: z.enum([\"osm\", \"google\"]).default(\"osm\"),\n /** Adres/zoekterm (osm, legacy-fallback) of volledige embed-URL (google). */\n query: shortText.default(\"\"),\n /** OSM-coördinaten; hieruit + zoom bouwt de render een echte bbox (geen wereldkaart meer). */\n lat: z.number().min(-90).max(90).optional().describe(\"Breedtegraad (lat)\"),\n lng: z.number().min(-180).max(180).optional().describe(\"Lengtegraad (lng)\"),\n zoom: z.number().int().min(1).max(20).default(14),\n height: z.number().int().min(150).max(800).default(360),\n consentGated: z.boolean().default(true),\n});\n\nexport const SocialBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"social\"),\n heading: shortText.optional(),\n items: z\n .array(z.object({ platform: shortText.default(\"\"), href: z.string().max(2000).default(\"\") }))\n .max(12)\n .default([]),\n});\n\nexport const NewsletterBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"newsletter\"),\n heading: shortText.optional(),\n text: shortText.optional(),\n buttonLabel: shortText.default(\"Aanmelden\"),\n /** Waar het e-mailadres heen gaat (extern aanmeld-endpoint, POST email). Leeg = XiCMS-formulier. */\n actionUrl: z.string().max(2000).optional(),\n /** Formulier-id voor opslag via XiCMS (als actionUrl leeg is). */\n formId: ref.optional(),\n /** AVG: indien gezet verschijnt een verplichte akkoord-checkbox met deze tekst. */\n consentText: shortText.optional().describe(\"AVG-akkoordtekst (leeg = geen checkbox)\"),\n});\n\n/** Bekende reserveer-/afspraaksystemen (preset; \"custom\" = vrije embed-URL). */\nexport const BookingProviderSchema = z.enum([\n \"custom\",\n \"calendly\",\n \"cal\",\n \"formitable\",\n \"resengo\",\n \"thefork\",\n \"treatwell\",\n \"salonized\",\n \"tablebooker\",\n \"bookingkit\",\n]);\n\nexport const BookingBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"booking\"),\n heading: shortText.optional(),\n /** Welk reserveersysteem; bepaalt de embed-helper en uitleg in de editor. */\n provider: BookingProviderSchema.default(\"custom\"),\n /** Embed-URL of account/slug bij een preset-provider (bv. Calendly-link, Formitable-restaurant-id). */\n embedUrl: z.string().max(2000).default(\"\"),\n height: z.number().int().min(300).max(1200).default(630),\n consentGated: z.boolean().default(true),\n});\n\nexport const ButtonsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"buttons\"),\n align: z.enum([\"left\", \"center\", \"right\"]).default(\"left\"),\n items: z\n .array(z.object({ label: shortText.default(\"\"), href: z.string().max(2000).default(\"#\"), variant: z.enum([\"primary\", \"secondary\", \"outline\"]).default(\"primary\") }))\n .max(6)\n .default([]),\n});\n\nexport const QuoteBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"quote\"),\n text: shortText.default(\"\"),\n author: shortText.optional(),\n role: shortText.optional(),\n});\n\nexport const DividerBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"divider\"),\n variant: z.enum([\"line\", \"dots\", \"space\"]).default(\"line\"),\n spacing: z.enum([\"sm\", \"md\", \"lg\"]).default(\"md\"),\n});\n\nexport const AccordionBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"accordion\"),\n heading: shortText.optional(),\n items: z\n .array(z.object({\n title: shortText.default(\"\"),\n body: shortText.default(\"\"),\n /** Optioneel rich-text-paneel (HTML); wint van `body` als gezet. */\n bodyHtml: richText.optional(),\n }))\n .max(50)\n .default([]),\n /** Sta toe dat meerdere panelen tegelijk open staan. */\n multiple: z.boolean().default(false),\n});\n\nexport const EmbedBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"embed\"),\n url: z.string().max(2000).default(\"\"),\n title: shortText.optional(),\n height: z.number().int().min(150).max(1200).default(420),\n /** Beeldverhouding; \"fixed\" gebruikt de vaste hoogte (huidig gedrag). */\n aspectRatio: z.enum([\"fixed\", \"16/9\", \"4/3\", \"1/1\"]).default(\"fixed\").describe(\"Beeldverhouding\"),\n /** Toon pas na cookie-toestemming (categorie \"marketing\"). */\n consentGated: z.boolean().default(true),\n});\n\nexport const ColumnsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"columns\"),\n columns: z\n .array(z.object({ blocks: z.array(BlockBaseSchema).max(50).default([]) }))\n .min(1)\n .max(4)\n .default([]),\n});\n\n/**\n * Indelingsblok \"Met zijbalk\": een brede hoofdkolom met blokken plus een smalle (sticky) zijbalk\n * waarin je widgets zet (laatste nieuws, komende agenda, contact, …). Beide kanten bevatten gewone\n * blokken; de zijbalk is bedoeld voor de compacte widget-varianten.\n */\nexport const WithSidebarBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"withSidebar\"),\n main: z.array(BlockBaseSchema).max(50).default([]),\n aside: z.array(BlockBaseSchema).max(30).default([]),\n side: z.enum([\"left\", \"right\"]).default(\"right\"),\n sidebarWidth: z.enum([\"sm\", \"md\", \"lg\"]).default(\"md\"),\n sticky: z.boolean().default(true),\n});\n\n/**\n * Tabbladen: per tab een eigen set blokken. Indelingsblok (layout) — handig om veel informatie\n * compact aan te bieden (bv. \"Beschrijving / Specificaties / Reviews\").\n */\nexport const TabsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"tabs\"),\n tabs: z\n .array(z.object({ label: shortText.default(\"Tab\"), blocks: z.array(BlockBaseSchema).max(30).default([]) }))\n .min(1)\n .max(10)\n .default([]),\n});\n\n/* ════════════════════ Nieuwe modules (volwaardig) ════════════════════ */\n\n/** Diensten/uitgelichte kaarten in een grid (icoon of beeld + titel + tekst + link). */\nexport const CardsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"cards\"),\n heading: shortText.optional(),\n intro: shortText.optional(),\n columns: z.number().int().min(1).max(4).default(3),\n /** \"cover\" = beeld edge-to-edge bovenaan de kaart (postkaart-stijl); \"inset\" = ingekaderd. */\n imageStyle: z.enum([\"inset\", \"cover\"]).default(\"inset\"),\n items: z\n .array(\n z.object({\n icon: shortText.optional(),\n imageUrl: z.string().max(2000).optional(),\n title: shortText.default(\"\"),\n text: shortText.optional(),\n href: z.string().max(2000).optional(),\n linkLabel: shortText.optional(),\n /** Uitgelichte kaart (accentrand + subtiele schaal). */\n featured: z.boolean().default(false),\n }),\n )\n .max(24)\n .default([]),\n});\n\n/** Downloadbare documenten (brochures, prijslijsten, voorwaarden). */\nexport const DownloadsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"downloads\"),\n heading: shortText.optional(),\n items: z\n .array(z.object({ label: shortText.default(\"\"), href: z.string().max(2000).default(\"\"), meta: shortText.optional() }))\n .max(60)\n .default([]),\n});\n\n/** Inline PDF-lezer voor één of meerdere documenten (bv. lunch-/diner-/wijnkaart). */\nexport const PdfBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"pdf\"),\n heading: shortText.optional(),\n /** Eén of meer PDF's; bij meerdere verschijnen tabs (label) om te wisselen. */\n documents: z\n .array(z.object({ label: shortText.default(\"\"), url: z.string().max(2000).default(\"\") }))\n .max(12)\n .default([]),\n height: z.number().int().min(300).max(1600).default(820),\n /** Toon een \"Open/Download\"-link onder de viewer. */\n showDownload: z.boolean().default(true),\n});\n\n/** Afteltimer naar een datum/tijd (lancering, evenement, aanbieding). Client-side telling. */\nexport const CountdownBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"countdown\"),\n heading: shortText.optional(),\n /** ISO-datetime, bv. \"2026-12-31T23:59\". */\n target: z.string().max(40).default(\"\"),\n expiredText: shortText.default(\"Het is zover!\"),\n showLabels: z.boolean().default(true),\n /** Wat er gebeurt als de teller afloopt: melding tonen of het hele blok verbergen. */\n onExpire: z.enum([\"message\", \"hide\"]).default(\"message\").describe(\"Na afloop\"),\n});\n\n/** Beeld-/contentcarrousel (slider). Client-side; optioneel autoplay (respecteert reduced-motion). */\nexport const SliderBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"slider\"),\n slides: z\n .array(\n z.object({\n imageUrl: z.string().max(2000).optional(),\n alt: shortText.default(\"\"),\n caption: shortText.optional(),\n href: z.string().max(2000).optional(),\n }),\n )\n .max(20)\n .default([]),\n autoplay: z.boolean().default(false),\n /** Interval in seconden bij autoplay. */\n interval: z.number().int().min(2).max(20).default(5),\n showDots: z.boolean().default(true),\n showArrows: z.boolean().default(true),\n aspectRatio: z.enum([\"16/9\", \"4/3\", \"3/2\", \"1/1\", \"21/9\"]).default(\"16/9\"),\n});\n\n/* ── 4.16: nieuwe modules ─────────────────────────────────────────────────── */\n\n/** Zwevende WhatsApp-/contactknop (wa.me-link; geen embed, dus geen consent nodig). */\nexport const WhatsappChatBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"whatsappChat\"),\n /** Telefoonnummer, internationaal (bv. \"31612345678\" of \"+31 6 12345678\"). */\n phone: shortText.default(\"\").describe(\"Telefoonnummer (internationaal)\"),\n /** Vooringevuld bericht in WhatsApp. */\n prefilledText: shortText.optional().describe(\"Vooringevuld bericht\"),\n /** Tekstlabel naast het icoon (leeg = alleen icoon). */\n label: shortText.optional().describe(\"Label (optioneel)\"),\n position: z.enum([\"br\", \"bl\"]).default(\"br\").describe(\"Positie (rechts-/linksonder)\"),\n});\n\n/** Voor/na-vergelijker: twee foto's met een sleepbare scheiding. */\nexport const BeforeAfterBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"beforeAfter\"),\n heading: shortText.optional(),\n beforeUrl: z.string().max(2000).default(\"\"),\n afterUrl: z.string().max(2000).default(\"\"),\n beforeLabel: shortText.default(\"Voor\"),\n afterLabel: shortText.default(\"Na\"),\n alt: shortText.default(\"\"),\n aspectRatio: z.enum([\"16/9\", \"4/3\", \"3/2\", \"1/1\"]).default(\"4/3\"),\n});\n\n/** Portfolio/projecten-grid met categorie-filter en lightbox. */\nexport const PortfolioBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"portfolio\"),\n heading: shortText.optional(),\n intro: shortText.optional(),\n columns: z.number().int().min(1).max(4).default(3),\n items: z\n .array(\n z.object({\n imageUrl: z.string().max(2000).default(\"\"),\n title: shortText.default(\"\"),\n category: shortText.optional(),\n description: shortText.optional(),\n href: z.string().max(2000).optional(),\n }),\n )\n .max(60)\n .default([]),\n /** Filterbalk op categorieën (alleen zichtbaar als er categorieën zijn). */\n showFilter: z.boolean().default(true).describe(\"Filterbalk op categorieën\"),\n lightbox: z.boolean().default(true).describe(\"Lightbox bij klikken\"),\n});\n\n/** Vacatures met JobPosting-JSON-LD (Google Jobs). */\nexport const JobsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"jobs\"),\n heading: shortText.optional(),\n intro: shortText.optional(),\n items: z\n .array(\n z.object({\n title: shortText.default(\"\"),\n location: shortText.optional(),\n /** bv. \"Fulltime\", \"Parttime\", \"BBL\". */\n employmentType: shortText.optional(),\n description: shortText.optional(),\n salary: shortText.optional(),\n applyUrl: z.string().max(2000).optional(),\n /** ISO-datum van plaatsing (voor Google Jobs). */\n datePosted: shortText.optional(),\n }),\n )\n .max(30)\n .default([]),\n jsonLd: z.boolean().default(true).describe(\"JSON-LD (Google Jobs)\"),\n});\n\n/** Kruimelpad, afgeleid van de URL, met BreadcrumbList-JSON-LD. */\nexport const BreadcrumbsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"breadcrumbs\"),\n homeLabel: shortText.default(\"Home\"),\n jsonLd: z.boolean().default(true).describe(\"JSON-LD (BreadcrumbList)\"),\n});\n\n/* ════════════════════ Widgets (compacte zijbalk-varianten) ════════════════════ */\n\n/** Compacte lijst met de laatste nieuwsartikelen (haalt live uit dezelfde nieuws-collectie). */\nexport const NewsWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"newsWidget\"),\n heading: shortText.optional(),\n limit: z.number().int().min(1).max(12).default(5),\n basePath: z.string().max(200).default(\"/nieuws\"),\n showImages: z.boolean().default(false),\n});\n\n/** Compacte lijst met de eerstvolgende evenementen (zelfde events + datumlogica als het Agenda-blok). */\nexport const AgendaWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"agendaWidget\"),\n heading: shortText.optional(),\n limit: z.number().int().min(1).max(12).default(5),\n events: z\n .array(\n z.object({\n title: shortText.default(\"\"),\n start: z.string().max(40).default(\"\"),\n end: z.string().max(40).optional(),\n location: shortText.optional(),\n url: z.string().max(2000).optional(),\n }),\n )\n .max(100)\n .default([]),\n hidePast: z.boolean().default(true),\n});\n\n/** Compacte openingstijden met \"vandaag\" gemarkeerd (zelfde rijen als het Openingstijden-blok). */\nexport const OpeningHoursWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"openingHoursWidget\"),\n heading: shortText.optional(),\n rows: z\n .array(z.object({ day: shortText.default(\"\"), hours: shortText.default(\"\") }))\n .max(14)\n .default([]),\n highlightToday: z.boolean().default(true),\n});\n\n/** Compacte contactgegevens (NAW) voor in de zijbalk. */\nexport const ContactWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"contactWidget\"),\n heading: shortText.optional(),\n address: shortText.optional(),\n phone: shortText.optional(),\n email: z.string().max(320).optional(),\n});\n\n/** Compacte social-iconenrij. */\nexport const SocialWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"socialWidget\"),\n heading: shortText.optional(),\n items: z\n .array(z.object({ platform: shortText.default(\"\"), href: z.string().max(2000).default(\"\") }))\n .max(12)\n .default([]),\n});\n\n/** Compacte nieuwsbrief-aanmelding (zelfde provider-action als het Nieuwsbrief-blok). */\nexport const NewsletterWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"newsletterWidget\"),\n heading: shortText.optional(),\n text: shortText.optional(),\n buttonLabel: shortText.default(\"Aanmelden\"),\n actionUrl: z.string().max(2000).optional(),\n});\n\n/** Compacte call-to-action-kaart. */\nexport const CtaWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"ctaWidget\"),\n title: shortText.default(\"\"),\n text: shortText.optional(),\n buttonLabel: shortText.default(\"Lees meer\"),\n buttonHref: z.string().max(2000).default(\"#\"),\n backgroundColor: z.string().max(40).optional(),\n});\n\n/** Compacte fotostrip (zelfde items als de Galerij). */\nexport const GalleryWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"galleryWidget\"),\n heading: shortText.optional(),\n items: z\n .array(z.object({ url: z.string().max(2000).optional(), alt: shortText.default(\"\") }))\n .max(24)\n .default([]),\n columns: z.number().int().min(2).max(4).default(3),\n});\n\n/** Compacte review/quote (zelfde items als Reviews). */\nexport const TestimonialsWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"testimonialsWidget\"),\n heading: shortText.optional(),\n items: z\n .array(z.object({ quote: shortText.default(\"\"), author: shortText.default(\"\"), rating: z.number().int().min(1).max(5).optional() }))\n .max(20)\n .default([]),\n});\n\n/** Compacte diensten-/kaartenlijst (zelfde kaarten als het Diensten-blok). */\nexport const CardsWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"cardsWidget\"),\n heading: shortText.optional(),\n items: z\n .array(z.object({ icon: shortText.optional(), title: shortText.default(\"\"), text: shortText.optional(), href: z.string().max(2000).optional() }))\n .max(10)\n .default([]),\n});\n\n/** Compacte downloadlijst (zelfde documenten als het Downloads-blok). */\nexport const DownloadsWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"downloadsWidget\"),\n heading: shortText.optional(),\n limit: z.number().int().min(1).max(12).default(5),\n items: z\n .array(z.object({ label: shortText.default(\"\"), href: z.string().max(2000).default(\"\"), meta: shortText.optional() }))\n .max(60)\n .default([]),\n});\n\n/** Compacte aftelteller. */\nexport const CountdownWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"countdownWidget\"),\n heading: shortText.optional(),\n target: z.string().max(40).default(\"\"),\n expiredText: shortText.default(\"Het is zover!\"),\n});\n\n/** Verwijzing naar een gedeeld symbool (5.0): de sectie leeft in sites/{siteId}/symbols en\n * propageert naar élke pagina die ernaar verwijst. Loskoppelen (editor) maakt er een kloon van. */\nexport const SymbolRefBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"symbolRef\"),\n // Leeg = nog geen symbool gekozen (vers blok); render en server-expansie slaan dat stil over.\n symbolId: z.string().max(120).default(\"\").describe(\"Symbool\"),\n});\n\n/** Discriminated union over alle ingebouwde block-types. */\nexport const BuiltinBlockSchema = z.discriminatedUnion(\"_type\", [\n HeroBlockSchema,\n RichTextBlockSchema,\n ImageBlockSchema,\n GalleryBlockSchema,\n CtaBlockSchema,\n FaqBlockSchema,\n OpeningHoursBlockSchema,\n PricingBlockSchema,\n NewsListBlockSchema,\n FormBlockSchema,\n SpacerBlockSchema,\n ColumnsBlockSchema,\n TestimonialsBlockSchema,\n TeamBlockSchema,\n AgendaBlockSchema,\n SearchBlockSchema,\n VideoBlockSchema,\n FeatureBlockSchema,\n BannerBlockSchema,\n CountersBlockSchema,\n LogosBlockSchema,\n TimelineBlockSchema,\n ContactBlockSchema,\n MapBlockSchema,\n SocialBlockSchema,\n NewsletterBlockSchema,\n BookingBlockSchema,\n ButtonsBlockSchema,\n QuoteBlockSchema,\n DividerBlockSchema,\n AccordionBlockSchema,\n EmbedBlockSchema,\n // Indeling\n WithSidebarBlockSchema,\n SymbolRefBlockSchema,\n TabsBlockSchema,\n // Nieuwe modules\n CardsBlockSchema,\n DownloadsBlockSchema,\n PdfBlockSchema,\n CountdownBlockSchema,\n SliderBlockSchema,\n WhatsappChatBlockSchema,\n BeforeAfterBlockSchema,\n PortfolioBlockSchema,\n JobsBlockSchema,\n BreadcrumbsBlockSchema,\n // Widgets (compacte varianten)\n NewsWidgetSchema,\n AgendaWidgetSchema,\n OpeningHoursWidgetSchema,\n ContactWidgetSchema,\n SocialWidgetSchema,\n NewsletterWidgetSchema,\n CtaWidgetSchema,\n GalleryWidgetSchema,\n TestimonialsWidgetSchema,\n CardsWidgetSchema,\n DownloadsWidgetSchema,\n CountdownWidgetSchema,\n]);\nexport type BuiltinBlock = z.infer<typeof BuiltinBlockSchema>;\n\n/** Een willekeurig block (built-in of klant-specifiek). */\nexport const AnyBlockSchema = z.union([BuiltinBlockSchema, BlockBaseSchema]);\nexport type AnyBlock = z.infer<typeof AnyBlockSchema>;\n"],"mappings":"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","names":[]}
|
|
@@ -300,7 +300,7 @@ export declare const ModulesSettingsSchema: z.ZodRecord<z.ZodString, z.ZodUnion<
|
|
|
300
300
|
/** Het `sites/{siteId}/settings/site`-document: alle bewerkbare site-instellingen. */
|
|
301
301
|
export declare const SiteSettingsSchema: z.ZodObject<{
|
|
302
302
|
name: z.ZodOptional<z.ZodString>;
|
|
303
|
-
domain: z.ZodOptional<z.ZodString>;
|
|
303
|
+
domain: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
|
|
304
304
|
contactEmail: z.ZodOptional<z.ZodString>;
|
|
305
305
|
nav: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
306
306
|
label: z.ZodString;
|
|
@@ -485,25 +485,6 @@ export declare const SiteSettingsSchema: z.ZodObject<{
|
|
|
485
485
|
fromName?: string | undefined;
|
|
486
486
|
notifyTo?: string | undefined;
|
|
487
487
|
}>>;
|
|
488
|
-
features: z.ZodOptional<z.ZodObject<{
|
|
489
|
-
pages: z.ZodOptional<z.ZodBoolean>;
|
|
490
|
-
news: z.ZodOptional<z.ZodBoolean>;
|
|
491
|
-
media: z.ZodOptional<z.ZodBoolean>;
|
|
492
|
-
forms: z.ZodOptional<z.ZodBoolean>;
|
|
493
|
-
stats: z.ZodOptional<z.ZodBoolean>;
|
|
494
|
-
}, "strip", z.ZodTypeAny, {
|
|
495
|
-
forms?: boolean | undefined;
|
|
496
|
-
pages?: boolean | undefined;
|
|
497
|
-
news?: boolean | undefined;
|
|
498
|
-
media?: boolean | undefined;
|
|
499
|
-
stats?: boolean | undefined;
|
|
500
|
-
}, {
|
|
501
|
-
forms?: boolean | undefined;
|
|
502
|
-
pages?: boolean | undefined;
|
|
503
|
-
news?: boolean | undefined;
|
|
504
|
-
media?: boolean | undefined;
|
|
505
|
-
stats?: boolean | undefined;
|
|
506
|
-
}>>;
|
|
507
488
|
footer: z.ZodOptional<z.ZodObject<{
|
|
508
489
|
columns: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
509
490
|
heading: z.ZodOptional<z.ZodString>;
|
|
@@ -635,13 +616,6 @@ export declare const SiteSettingsSchema: z.ZodObject<{
|
|
|
635
616
|
fromName?: string | undefined;
|
|
636
617
|
notifyTo?: string | undefined;
|
|
637
618
|
} | undefined;
|
|
638
|
-
features?: {
|
|
639
|
-
forms?: boolean | undefined;
|
|
640
|
-
pages?: boolean | undefined;
|
|
641
|
-
news?: boolean | undefined;
|
|
642
|
-
media?: boolean | undefined;
|
|
643
|
-
stats?: boolean | undefined;
|
|
644
|
-
} | undefined;
|
|
645
619
|
footer?: {
|
|
646
620
|
columns?: {
|
|
647
621
|
links: {
|
|
@@ -714,13 +688,6 @@ export declare const SiteSettingsSchema: z.ZodObject<{
|
|
|
714
688
|
fromName?: string | undefined;
|
|
715
689
|
notifyTo?: string | undefined;
|
|
716
690
|
} | undefined;
|
|
717
|
-
features?: {
|
|
718
|
-
forms?: boolean | undefined;
|
|
719
|
-
pages?: boolean | undefined;
|
|
720
|
-
news?: boolean | undefined;
|
|
721
|
-
media?: boolean | undefined;
|
|
722
|
-
stats?: boolean | undefined;
|
|
723
|
-
} | undefined;
|
|
724
691
|
footer?: {
|
|
725
692
|
columns?: {
|
|
726
693
|
heading?: string | undefined;
|
package/dist/schema/settings.js
CHANGED
|
@@ -78,19 +78,13 @@ const ModulesSettingsSchema = z.record(
|
|
|
78
78
|
);
|
|
79
79
|
const SiteSettingsSchema = z.object({
|
|
80
80
|
name: z.string().min(1).max(160).optional(),
|
|
81
|
-
domain
|
|
81
|
+
// Zelfde hostname-regel als SiteConfigSchema.domain (geen protocol/pad).
|
|
82
|
+
domain: z.string().max(255).regex(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/i, "alleen een hostname, bv. 'www.klant.nl' (zonder https:// of pad)").optional().or(z.literal("")),
|
|
82
83
|
contactEmail: z.string().email().optional(),
|
|
83
84
|
nav: z.array(NavItemSchema).max(50).optional(),
|
|
84
85
|
theme: ThemeSchema.optional(),
|
|
85
86
|
seoDefaults: SeoSchema.optional(),
|
|
86
87
|
forms: FormsSenderSchema.optional(),
|
|
87
|
-
features: z.object({
|
|
88
|
-
pages: z.boolean().optional(),
|
|
89
|
-
news: z.boolean().optional(),
|
|
90
|
-
media: z.boolean().optional(),
|
|
91
|
-
forms: z.boolean().optional(),
|
|
92
|
-
stats: z.boolean().optional()
|
|
93
|
-
}).optional(),
|
|
94
88
|
footer: FooterSettingsSchema.optional(),
|
|
95
89
|
modules: ModulesSettingsSchema.optional()
|
|
96
90
|
});
|