@xiwebdesign/xicms-core 4.17.1 → 4.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/dist/XiCMSProvider.js +3 -1
  2. package/dist/XiCMSProvider.js.map +1 -1
  3. package/dist/admin/blockEditors/index.js +47 -14
  4. package/dist/admin/blockEditors/index.js.map +1 -1
  5. package/dist/admin/lib/compressImage.d.ts +4 -2
  6. package/dist/admin/lib/compressImage.js +7 -5
  7. package/dist/admin/lib/compressImage.js.map +1 -1
  8. package/dist/admin/lib/mediaUsage.d.ts +4 -3
  9. package/dist/admin/lib/mediaUsage.js +21 -10
  10. package/dist/admin/lib/mediaUsage.js.map +1 -1
  11. package/dist/admin/lib/upload.d.ts +4 -0
  12. package/dist/admin/lib/upload.js +26 -6
  13. package/dist/admin/lib/upload.js.map +1 -1
  14. package/dist/admin/media/MediaManager.js +23 -7
  15. package/dist/admin/media/MediaManager.js.map +1 -1
  16. package/dist/admin/media/MediaPicker.js +12 -2
  17. package/dist/admin/media/MediaPicker.js.map +1 -1
  18. package/dist/admin/settings/SettingsPanel.js +4 -1
  19. package/dist/admin/settings/SettingsPanel.js.map +1 -1
  20. package/dist/admin/visual/VisualEditor.js +4 -1
  21. package/dist/admin/visual/VisualEditor.js.map +1 -1
  22. package/dist/blocks/builtins/Agenda.d.ts +6 -0
  23. package/dist/blocks/builtins/Agenda.js +14 -6
  24. package/dist/blocks/builtins/Agenda.js.map +1 -1
  25. package/dist/blocks/builtins/Breadcrumbs.js +5 -1
  26. package/dist/blocks/builtins/Breadcrumbs.js.map +1 -1
  27. package/dist/blocks/builtins/Cards.js +3 -2
  28. package/dist/blocks/builtins/Cards.js.map +1 -1
  29. package/dist/blocks/builtins/Contact.js +2 -1
  30. package/dist/blocks/builtins/Contact.js.map +1 -1
  31. package/dist/blocks/builtins/Faq.js +5 -4
  32. package/dist/blocks/builtins/Faq.js.map +1 -1
  33. package/dist/blocks/builtins/Gallery.js +2 -2
  34. package/dist/blocks/builtins/Gallery.js.map +1 -1
  35. package/dist/blocks/builtins/Jobs.d.ts +8 -1
  36. package/dist/blocks/builtins/Jobs.js +37 -21
  37. package/dist/blocks/builtins/Jobs.js.map +1 -1
  38. package/dist/blocks/builtins/MapBlock.js +31 -4
  39. package/dist/blocks/builtins/MapBlock.js.map +1 -1
  40. package/dist/blocks/builtins/PdfBlock.js +2 -3
  41. package/dist/blocks/builtins/PdfBlock.js.map +1 -1
  42. package/dist/blocks/builtins/Portfolio.js +2 -2
  43. package/dist/blocks/builtins/Portfolio.js.map +1 -1
  44. package/dist/blocks/builtins/Pricing.d.ts +2 -0
  45. package/dist/blocks/builtins/Pricing.js +18 -10
  46. package/dist/blocks/builtins/Pricing.js.map +1 -1
  47. package/dist/blocks/builtins/Sections.js +3 -2
  48. package/dist/blocks/builtins/Sections.js.map +1 -1
  49. package/dist/blocks/builtins/Slider.js +21 -3
  50. package/dist/blocks/builtins/Slider.js.map +1 -1
  51. package/dist/blocks/builtins/Testimonials.js +21 -18
  52. package/dist/blocks/builtins/Testimonials.js.map +1 -1
  53. package/dist/blocks/builtins/WhatsappChat.js +1 -1
  54. package/dist/blocks/builtins/WhatsappChat.js.map +1 -1
  55. package/dist/blocks/builtins/Widgets.js +2 -3
  56. package/dist/blocks/builtins/Widgets.js.map +1 -1
  57. package/dist/blocks/builtins/lib/ics.js +1 -1
  58. package/dist/blocks/builtins/lib/ics.js.map +1 -1
  59. package/dist/blocks/builtins/lib/openingHours.d.ts +4 -1
  60. package/dist/blocks/builtins/lib/openingHours.js +11 -5
  61. package/dist/blocks/builtins/lib/openingHours.js.map +1 -1
  62. package/dist/demo/demoStore.d.ts +11 -1
  63. package/dist/demo/demoStore.js +50 -0
  64. package/dist/demo/demoStore.js.map +1 -1
  65. package/dist/firebase/client.js +2 -1
  66. package/dist/firebase/client.js.map +1 -1
  67. package/dist/index.d.ts +1 -1
  68. package/dist/index.js +2 -0
  69. package/dist/index.js.map +1 -1
  70. package/dist/modules/builtins.js +1 -1
  71. package/dist/modules/builtins.js.map +1 -1
  72. package/dist/modules/consent/useConsent.js +15 -3
  73. package/dist/modules/consent/useConsent.js.map +1 -1
  74. package/dist/schema/blocks.d.ts +24 -3
  75. package/dist/schema/blocks.js +4 -1
  76. package/dist/schema/blocks.js.map +1 -1
  77. package/dist/server/seo.d.ts +2 -0
  78. package/dist/server/seo.js +1 -1
  79. package/dist/server/seo.js.map +1 -1
  80. package/dist/styles.css +35 -6
  81. package/package.json +1 -1
@@ -1967,8 +1967,11 @@ export declare const ContactBlockSchema: z.ZodObject<{
1967
1967
  export declare const MapBlockSchema: z.ZodObject<{
1968
1968
  _type: z.ZodLiteral<"map">;
1969
1969
  provider: z.ZodDefault<z.ZodEnum<["osm", "google"]>>;
1970
- /** Adres/zoekterm (osm) of volledige embed-URL (google). */
1970
+ /** Adres/zoekterm (osm, legacy-fallback) of volledige embed-URL (google). */
1971
1971
  query: z.ZodDefault<z.ZodString>;
1972
+ /** OSM-coördinaten; hieruit + zoom bouwt de render een echte bbox (geen wereldkaart meer). */
1973
+ lat: z.ZodOptional<z.ZodNumber>;
1974
+ lng: z.ZodOptional<z.ZodNumber>;
1972
1975
  zoom: z.ZodDefault<z.ZodNumber>;
1973
1976
  height: z.ZodDefault<z.ZodNumber>;
1974
1977
  consentGated: z.ZodDefault<z.ZodBoolean>;
@@ -2013,6 +2016,8 @@ export declare const MapBlockSchema: z.ZodObject<{
2013
2016
  anchorId?: string | undefined;
2014
2017
  animate?: "fade" | "up" | undefined;
2015
2018
  } | undefined;
2019
+ lat?: number | undefined;
2020
+ lng?: number | undefined;
2016
2021
  }, {
2017
2022
  _type: "map";
2018
2023
  _key: string;
@@ -2026,6 +2031,8 @@ export declare const MapBlockSchema: z.ZodObject<{
2026
2031
  } | undefined;
2027
2032
  provider?: "osm" | "google" | undefined;
2028
2033
  consentGated?: boolean | undefined;
2034
+ lat?: number | undefined;
2035
+ lng?: number | undefined;
2029
2036
  query?: string | undefined;
2030
2037
  zoom?: number | undefined;
2031
2038
  height?: number | undefined;
@@ -7195,8 +7202,11 @@ export declare const BuiltinBlockSchema: z.ZodDiscriminatedUnion<"_type", [z.Zod
7195
7202
  }>, z.ZodObject<{
7196
7203
  _type: z.ZodLiteral<"map">;
7197
7204
  provider: z.ZodDefault<z.ZodEnum<["osm", "google"]>>;
7198
- /** Adres/zoekterm (osm) of volledige embed-URL (google). */
7205
+ /** Adres/zoekterm (osm, legacy-fallback) of volledige embed-URL (google). */
7199
7206
  query: z.ZodDefault<z.ZodString>;
7207
+ /** OSM-coördinaten; hieruit + zoom bouwt de render een echte bbox (geen wereldkaart meer). */
7208
+ lat: z.ZodOptional<z.ZodNumber>;
7209
+ lng: z.ZodOptional<z.ZodNumber>;
7200
7210
  zoom: z.ZodDefault<z.ZodNumber>;
7201
7211
  height: z.ZodDefault<z.ZodNumber>;
7202
7212
  consentGated: z.ZodDefault<z.ZodBoolean>;
@@ -7241,6 +7251,8 @@ export declare const BuiltinBlockSchema: z.ZodDiscriminatedUnion<"_type", [z.Zod
7241
7251
  anchorId?: string | undefined;
7242
7252
  animate?: "fade" | "up" | undefined;
7243
7253
  } | undefined;
7254
+ lat?: number | undefined;
7255
+ lng?: number | undefined;
7244
7256
  }, {
7245
7257
  _type: "map";
7246
7258
  _key: string;
@@ -7254,6 +7266,8 @@ export declare const BuiltinBlockSchema: z.ZodDiscriminatedUnion<"_type", [z.Zod
7254
7266
  } | undefined;
7255
7267
  provider?: "osm" | "google" | undefined;
7256
7268
  consentGated?: boolean | undefined;
7269
+ lat?: number | undefined;
7270
+ lng?: number | undefined;
7257
7271
  query?: string | undefined;
7258
7272
  zoom?: number | undefined;
7259
7273
  height?: number | undefined;
@@ -12107,8 +12121,11 @@ export declare const AnyBlockSchema: z.ZodUnion<[z.ZodDiscriminatedUnion<"_type"
12107
12121
  }>, z.ZodObject<{
12108
12122
  _type: z.ZodLiteral<"map">;
12109
12123
  provider: z.ZodDefault<z.ZodEnum<["osm", "google"]>>;
12110
- /** Adres/zoekterm (osm) of volledige embed-URL (google). */
12124
+ /** Adres/zoekterm (osm, legacy-fallback) of volledige embed-URL (google). */
12111
12125
  query: z.ZodDefault<z.ZodString>;
12126
+ /** OSM-coördinaten; hieruit + zoom bouwt de render een echte bbox (geen wereldkaart meer). */
12127
+ lat: z.ZodOptional<z.ZodNumber>;
12128
+ lng: z.ZodOptional<z.ZodNumber>;
12112
12129
  zoom: z.ZodDefault<z.ZodNumber>;
12113
12130
  height: z.ZodDefault<z.ZodNumber>;
12114
12131
  consentGated: z.ZodDefault<z.ZodBoolean>;
@@ -12153,6 +12170,8 @@ export declare const AnyBlockSchema: z.ZodUnion<[z.ZodDiscriminatedUnion<"_type"
12153
12170
  anchorId?: string | undefined;
12154
12171
  animate?: "fade" | "up" | undefined;
12155
12172
  } | undefined;
12173
+ lat?: number | undefined;
12174
+ lng?: number | undefined;
12156
12175
  }, {
12157
12176
  _type: "map";
12158
12177
  _key: string;
@@ -12166,6 +12185,8 @@ export declare const AnyBlockSchema: z.ZodUnion<[z.ZodDiscriminatedUnion<"_type"
12166
12185
  } | undefined;
12167
12186
  provider?: "osm" | "google" | undefined;
12168
12187
  consentGated?: boolean | undefined;
12188
+ lat?: number | undefined;
12189
+ lng?: number | undefined;
12169
12190
  query?: string | undefined;
12170
12191
  zoom?: number | undefined;
12171
12192
  height?: number | undefined;
@@ -325,8 +325,11 @@ const MapBlockSchema = z.object({
325
325
  ...blockBase,
326
326
  _type: z.literal("map"),
327
327
  provider: z.enum(["osm", "google"]).default("osm"),
328
- /** Adres/zoekterm (osm) of volledige embed-URL (google). */
328
+ /** Adres/zoekterm (osm, legacy-fallback) of volledige embed-URL (google). */
329
329
  query: shortText.default(""),
330
+ /** OSM-coördinaten; hieruit + zoom bouwt de render een echte bbox (geen wereldkaart meer). */
331
+ lat: z.number().min(-90).max(90).optional().describe("Breedtegraad (lat)"),
332
+ lng: z.number().min(-180).max(180).optional().describe("Lengtegraad (lng)"),
330
333
  zoom: z.number().int().min(1).max(20).default(14),
331
334
  height: z.number().int().min(150).max(800).default(360),
332
335
  consentGated: z.boolean().default(true)
@@ -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 imageId: ref.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 mediaId: ref.optional(),\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 mediaId: ref.optional(),\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) of volledige embed-URL (google). */\n query: shortText.default(\"\"),\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 mediaId: ref.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 mediaId: ref.optional(),\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(), mediaId: ref.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/** 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 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":"AAAA,SAAS,SAAS;AAgBX,MAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,UAAU,EAAE,KAAK,CAAC,QAAQ,MAAM,MAAM,MAAM,IAAI,CAAC,EAAE,SAAS;AAAA,EAC5D,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,EACxC,OAAO,EAAE,KAAK,CAAC,aAAa,QAAQ,QAAQ,CAAC,EAAE,SAAS;AAAA,EACxD,OAAO,EAAE,KAAK,CAAC,QAAQ,UAAU,OAAO,CAAC,EAAE,SAAS;AAAA,EACpD,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA;AAAA,EAEtC,SAAS,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC,EAAE,SAAS;AAC3C,CAAC;AAGM,MAAM,YAAY;AAAA,EACvB,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA;AAAA,EAE9B,QAAQ,iBAAiB,SAAS;AACpC;AAGO,MAAM,kBAAkB,EAC5B,OAAO,EAAE,GAAG,WAAW,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,EACzD,YAAY;AAIf,MAAM,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG;AAC9B,MAAM,WAAW,EAAE,OAAO,EAAE,IAAI,GAAO;AACvC,MAAM,YAAY,EAAE,OAAO,EAAE,IAAI,GAAI;AAGrC,MAAM,eAAe,EAAE,OAAO;AAAA,EAC5B,OAAO,UAAU,QAAQ,EAAE;AAAA,EAC3B,MAAM,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,QAAQ,GAAG;AAAA,EACtC,SAAS,EAAE,KAAK,CAAC,WAAW,aAAa,SAAS,CAAC,EAAE,QAAQ,SAAS;AACxE,CAAC;AAEM,MAAM,kBAAkB,EAAE,OAAO;AAAA,EACtC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,MAAM;AAAA;AAAA,EAEvB,SAAS,UAAU,SAAS,EAAE,SAAS,yBAAyB;AAAA,EAChE,OAAO,UAAU,QAAQ,EAAE;AAAA,EAC3B,UAAU,UAAU,SAAS;AAAA,EAC7B,SAAS,IAAI,SAAS;AAAA,EACtB,UAAU,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA;AAAA,EAExC,UAAU,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA,EACxC,OAAO,EAAE,KAAK,CAAC,QAAQ,QAAQ,CAAC,EAAE,QAAQ,MAAM;AAAA;AAAA,EAEhD,QAAQ,EAAE,KAAK,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,QAAQ,QAAQ;AAAA;AAAA,EAE5D,WAAW,EAAE,KAAK,CAAC,QAAQ,MAAM,MAAM,MAAM,MAAM,CAAC,EAAE,QAAQ,MAAM;AAAA;AAAA,EAEpE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,EAC1C,gBAAgB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,CAAC;AAAA;AAAA,EAEpD,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,KAAK,EAAE,SAAS,kBAAkB;AAAA;AAAA,EAEvE,SAAS,EAAE,MAAM,YAAY,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;AAClD,CAAC;AAEM,MAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,UAAU;AAAA,EAC3B,MAAM,SAAS,QAAQ,EAAE;AAC3B,CAAC;AAEM,MAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,OAAO;AAAA,EACxB,SAAS,IAAI,SAAS;AAAA,EACtB,KAAK,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA,EACnC,KAAK,UAAU,QAAQ,EAAE;AAAA,EACzB,SAAS,UAAU,SAAS;AAAA;AAAA,EAE5B,MAAM,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA;AAAA,EAEpC,OAAO,EAAE,KAAK,CAAC,QAAQ,UAAU,OAAO,CAAC,EAAE,QAAQ,QAAQ;AAAA;AAAA,EAE3D,aAAa,EAAE,KAAK,CAAC,QAAQ,QAAQ,OAAO,OAAO,KAAK,CAAC,EAAE,QAAQ,MAAM;AAC3E,CAAC;AAEM,MAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,SAAS;AAAA,EAC1B,OAAO,EACJ;AAAA,IACC,EAAE,OAAO;AAAA,MACP,SAAS,IAAI,SAAS;AAAA,MACtB,KAAK,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA,MACnC,KAAK,UAAU,QAAQ,EAAE;AAAA;AAAA,MAEzB,SAAS,UAAU,SAAS;AAAA;AAAA,MAE5B,KAAK,UAAU,SAAS;AAAA,IAC1B,CAAC;AAAA,EACH,EACC,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AAAA;AAAA,EAEb,YAAY,EAAE,QAAQ,EAAE,QAAQ,KAAK,EAAE,SAAS,oBAAoB;AAAA;AAAA,EAEpE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA;AAAA,EAEjD,UAAU,EAAE,KAAK,CAAC,WAAW,MAAM,KAAK,CAAC,EAAE,QAAQ,SAAS;AAAA;AAAA,EAE5D,aAAa,EAAE,KAAK,CAAC,OAAO,OAAO,OAAO,QAAQ,MAAM,CAAC,EAAE,QAAQ,KAAK;AAC1E,CAAC;AAEM,MAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,KAAK;AAAA,EACtB,OAAO,UAAU,QAAQ,EAAE;AAAA,EAC3B,MAAM,UAAU,SAAS;AAAA,EACzB,aAAa,UAAU,QAAQ,iBAAiB;AAAA,EAChD,YAAY,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,QAAQ,UAAU;AAAA;AAAA,EAEnD,eAAe,EAAE,KAAK,CAAC,WAAW,aAAa,SAAS,CAAC,EAAE,QAAQ,SAAS;AAAA;AAAA,EAE5E,cAAc,UAAU,SAAS;AAAA,EACjC,aAAa,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA;AAAA,EAE3C,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA;AAAA,EAE7C,QAAQ,EAAE,QAAQ,EAAE,QAAQ,KAAK;AACnC,CAAC;AAEM,MAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,KAAK;AAAA,EACtB,SAAS,UAAU,SAAS;AAAA,EAC5B,OAAO,EACJ,MAAM,EAAE,OAAO;AAAA,IACd,GAAG,UAAU,QAAQ,EAAE;AAAA,IACvB,GAAG,UAAU,QAAQ,EAAE;AAAA;AAAA,IAEvB,OAAO,SAAS,SAAS;AAAA,EAC3B,CAAC,CAAC,EACD,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AAAA;AAAA,EAEb,YAAY,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAErC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAEjC,aAAa,EAAE,QAAQ,EAAE,QAAQ,KAAK;AACxC,CAAC;AAEM,MAAM,0BAA0B,EAAE,OAAO;AAAA,EAC9C,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,cAAc;AAAA,EAC/B,SAAS,UAAU,SAAS;AAAA,EAC5B,MAAM,EACH,MAAM,EAAE,OAAO,EAAE,KAAK,UAAU,QAAQ,EAAE,GAAG,OAAO,UAAU,QAAQ,EAAE,EAAE,CAAC,CAAC,EAC5E,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AAAA;AAAA,EAEb,YAAY,EAAE,QAAQ,EAAE,QAAQ,KAAK,EAAE,SAAS,0BAA0B;AAAA;AAAA,EAE1E,QAAQ,EAAE,QAAQ,EAAE,QAAQ,KAAK,EAAE,SAAS,0BAA0B;AACxE,CAAC;AAEM,MAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,SAAS;AAAA,EAC1B,SAAS,UAAU,SAAS;AAAA,EAC5B,OAAO,EACJ;AAAA,IACC,EAAE,OAAO;AAAA,MACP,OAAO,UAAU,QAAQ,EAAE;AAAA,MAC3B,OAAO,UAAU,QAAQ,EAAE;AAAA,MAC3B,QAAQ,UAAU,SAAS;AAAA;AAAA,MAE3B,UAAU,EAAE,MAAM,SAAS,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA;AAAA,MAE9C,UAAU,UAAU,SAAS;AAAA,MAC7B,SAAS,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA;AAAA,MAEvC,aAAa,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,MAEtC,eAAe,UAAU,SAAS;AAAA,IACpC,CAAC;AAAA,EACH,EACC,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AAAA,EACb,MAAM,UAAU,SAAS;AAAA;AAAA,EAEzB,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ,KAAK,EAAE,SAAS,mBAAmB;AAAA;AAAA,EAEvE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,KAAK;AACnC,CAAC;AAEM,MAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,UAAU;AAAA,EAC3B,SAAS,UAAU,SAAS;AAAA,EAC5B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC;AAAA;AAAA,EAEhD,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,EAAE,SAAS,wBAAwB;AAAA,EACtF,UAAU,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,QAAQ,SAAS;AACjD,CAAC;AAEM,MAAM,kBAAkB,EAAE,OAAO;AAAA,EACtC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,MAAM;AAAA,EACvB,QAAQ;AAAA,EACR,SAAS,UAAU,SAAS;AAC9B,CAAC;AAEM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,QAAQ;AAAA,EACzB,MAAM,EAAE,KAAK,CAAC,MAAM,MAAM,MAAM,IAAI,CAAC,EAAE,QAAQ,IAAI;AACrD,CAAC;AAEM,MAAM,0BAA0B,EAAE,OAAO;AAAA,EAC9C,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,cAAc;AAAA,EAC/B,SAAS,UAAU,SAAS;AAAA,EAC5B,OAAO,EACJ;AAAA,IACC,EAAE,OAAO;AAAA,MACP,OAAO,UAAU,QAAQ,EAAE;AAAA,MAC3B,QAAQ,UAAU,QAAQ,EAAE;AAAA,MAC5B,MAAM,UAAU,SAAS;AAAA,MACzB,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,MAChD,WAAW,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA,IAC3C,CAAC;AAAA,EACH,EACC,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AAAA;AAAA,EAEb,QAAQ,EAAE,KAAK,CAAC,QAAQ,MAAM,CAAC,EAAE,QAAQ,MAAM;AAAA;AAAA,EAE/C,QAAQ,EAAE,QAAQ,EAAE,QAAQ,KAAK;AACnC,CAAC;AAEM,MAAM,kBAAkB,EAAE,OAAO;AAAA,EACtC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,MAAM;AAAA,EACvB,SAAS,UAAU,SAAS;AAAA,EAC5B,SAAS,EACN;AAAA,IACC,EAAE,OAAO;AAAA,MACP,MAAM,UAAU,QAAQ,EAAE;AAAA,MAC1B,MAAM,UAAU,SAAS;AAAA,MACzB,UAAU,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA,MACxC,KAAK,UAAU,SAAS;AAAA,MACxB,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,MACpC,OAAO,UAAU,SAAS;AAAA,MAC1B,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,WAAW,MAAM,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA,MAE/F,YAAY,UAAU,SAAS;AAAA,IACjC,CAAC;AAAA,EACH,EACC,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AAAA;AAAA,EAEb,QAAQ,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAEjC,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,KAAK,EAAE,SAAS,wBAAwB;AACjF,CAAC;AAEM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,QAAQ;AAAA,EACzB,SAAS,UAAU,SAAS;AAAA,EAC5B,QAAQ,EACL;AAAA,IACC,EAAE,OAAO;AAAA,MACP,OAAO,UAAU,QAAQ,EAAE;AAAA;AAAA,MAE3B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE;AAAA,MACpC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,MACjC,UAAU,UAAU,SAAS;AAAA,MAC7B,aAAa,UAAU,SAAS;AAAA,MAChC,KAAK,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA,IACrC,CAAC;AAAA,EACH,EACC,IAAI,GAAG,EACP,QAAQ,CAAC,CAAC;AAAA;AAAA,EAEb,UAAU,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA,EAElC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,KAAK;AACnC,CAAC;AAEM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,QAAQ;AAAA,EACzB,aAAa,UAAU,QAAQ,cAAS;AAAA;AAAA,EAExC,aAAa,EAAE,QAAQ,EAAE,QAAQ,IAAI;AACvC,CAAC;AAEM,MAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,OAAO;AAAA,EACxB,UAAU,EAAE,KAAK,CAAC,WAAW,SAAS,MAAM,CAAC,EAAE,QAAQ,SAAS;AAAA;AAAA,EAEhE,KAAK,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,QAAQ,EAAE;AAAA,EACpC,OAAO,UAAU,SAAS;AAAA,EAC1B,SAAS,UAAU,SAAS;AAAA;AAAA,EAE5B,WAAW,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS,EAAE,SAAS,qBAAqB;AAAA;AAAA;AAAA,EAGzE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,KAAK,EAAE,SAAS,yCAAyC;AAAA;AAAA,EAErF,cAAc,EAAE,QAAQ,EAAE,QAAQ,IAAI;AACxC,CAAC;AAEM,MAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,SAAS;AAAA,EAC1B,SAAS,UAAU,SAAS;AAAA;AAAA,EAE5B,MAAM,SAAS,QAAQ,EAAE;AAAA,EACzB,UAAU,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA,EACxC,eAAe,EAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,EACvD,aAAa,UAAU,SAAS;AAAA,EAChC,YAAY,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAC5C,CAAC;AAEM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,QAAQ;AAAA,EACzB,MAAM,UAAU,QAAQ,EAAE;AAAA,EAC1B,MAAM,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA,EACpC,WAAW,UAAU,SAAS;AAAA,EAC9B,MAAM,EAAE,KAAK,CAAC,QAAQ,WAAW,SAAS,CAAC,EAAE,QAAQ,MAAM;AAAA,EAC3D,aAAa,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA,EAErC,gBAAgB,UAAU,SAAS,EAAE,SAAS,0CAA0C;AAC1F,CAAC;AAEM,MAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,UAAU;AAAA,EAC3B,SAAS,UAAU,SAAS;AAAA,EAC5B,OAAO,EACJ,MAAM,EAAE,OAAO,EAAE,OAAO,UAAU,QAAQ,EAAE,GAAG,OAAO,UAAU,QAAQ,EAAE,GAAG,QAAQ,UAAU,SAAS,GAAG,QAAQ,UAAU,SAAS,EAAE,CAAC,CAAC,EAC1I,IAAI,CAAC,EACL,QAAQ,CAAC,CAAC;AAAA;AAAA,EAEb,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,cAAc;AAC5D,CAAC;AAEM,MAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,OAAO;AAAA,EACxB,SAAS,UAAU,SAAS;AAAA,EAC5B,OAAO,EACJ,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,UAAU,QAAQ,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS,EAAE,CAAC,CAAC,EAC5H,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AAAA,EACb,WAAW,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA,EAEnC,SAAS,EAAE,QAAQ,EAAE,QAAQ,KAAK,EAAE,SAAS,kBAAkB;AACjE,CAAC;AAEM,MAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,UAAU;AAAA,EAC3B,SAAS,UAAU,SAAS;AAAA,EAC5B,OAAO,EACJ,MAAM,EAAE,OAAO,EAAE,OAAO,UAAU,QAAQ,EAAE,GAAG,MAAM,UAAU,SAAS,GAAG,MAAM,UAAU,SAAS,GAAG,MAAM,UAAU,SAAS,EAAE,CAAC,CAAC,EACpI,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AAAA;AAAA,EAEb,WAAW,EAAE,QAAQ,EAAE,QAAQ,KAAK,EAAE,SAAS,qBAAqB;AACtE,CAAC;AAEM,MAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,SAAS;AAAA,EAC1B,SAAS,UAAU,SAAS;AAAA,EAC5B,SAAS,UAAU,SAAS;AAAA,EAC5B,OAAO,UAAU,SAAS;AAAA,EAC1B,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,EACpC,OAAO,UAAU,SAAS;AAAA;AAAA,EAE1B,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,EAAE,SAAS;AAAA;AAAA,EAEjG,QAAQ,EAAE,QAAQ,EAAE,QAAQ,KAAK;AACnC,CAAC;AAEM,MAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,KAAK;AAAA,EACtB,UAAU,EAAE,KAAK,CAAC,OAAO,QAAQ,CAAC,EAAE,QAAQ,KAAK;AAAA;AAAA,EAEjD,OAAO,UAAU,QAAQ,EAAE;AAAA,EAC3B,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE;AAAA,EAChD,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,GAAG,EAAE,QAAQ,GAAG;AAAA,EACtD,cAAc,EAAE,QAAQ,EAAE,QAAQ,IAAI;AACxC,CAAC;AAEM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,QAAQ;AAAA,EACzB,SAAS,UAAU,SAAS;AAAA,EAC5B,OAAO,EACJ,MAAM,EAAE,OAAO,EAAE,UAAU,UAAU,QAAQ,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,EAC3F,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AACf,CAAC;AAEM,MAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,YAAY;AAAA,EAC7B,SAAS,UAAU,SAAS;AAAA,EAC5B,MAAM,UAAU,SAAS;AAAA,EACzB,aAAa,UAAU,QAAQ,WAAW;AAAA;AAAA,EAE1C,WAAW,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA;AAAA,EAEzC,QAAQ,IAAI,SAAS;AAAA;AAAA,EAErB,aAAa,UAAU,SAAS,EAAE,SAAS,yCAAyC;AACtF,CAAC;AAGM,MAAM,wBAAwB,EAAE,KAAK;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,MAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,SAAS;AAAA,EAC1B,SAAS,UAAU,SAAS;AAAA;AAAA,EAE5B,UAAU,sBAAsB,QAAQ,QAAQ;AAAA;AAAA,EAEhD,UAAU,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,QAAQ,EAAE;AAAA,EACzC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,EAAE,QAAQ,GAAG;AAAA,EACvD,cAAc,EAAE,QAAQ,EAAE,QAAQ,IAAI;AACxC,CAAC;AAEM,MAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,SAAS;AAAA,EAC1B,OAAO,EAAE,KAAK,CAAC,QAAQ,UAAU,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,EACzD,OAAO,EACJ,MAAM,EAAE,OAAO,EAAE,OAAO,UAAU,QAAQ,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,QAAQ,GAAG,GAAG,SAAS,EAAE,KAAK,CAAC,WAAW,aAAa,SAAS,CAAC,EAAE,QAAQ,SAAS,EAAE,CAAC,CAAC,EAClK,IAAI,CAAC,EACL,QAAQ,CAAC,CAAC;AACf,CAAC;AAEM,MAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,OAAO;AAAA,EACxB,MAAM,UAAU,QAAQ,EAAE;AAAA,EAC1B,QAAQ,UAAU,SAAS;AAAA,EAC3B,MAAM,UAAU,SAAS;AAC3B,CAAC;AAEM,MAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,SAAS;AAAA,EAC1B,SAAS,EAAE,KAAK,CAAC,QAAQ,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,EACzD,SAAS,EAAE,KAAK,CAAC,MAAM,MAAM,IAAI,CAAC,EAAE,QAAQ,IAAI;AAClD,CAAC;AAEM,MAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,WAAW;AAAA,EAC5B,SAAS,UAAU,SAAS;AAAA,EAC5B,OAAO,EACJ,MAAM,EAAE,OAAO;AAAA,IACd,OAAO,UAAU,QAAQ,EAAE;AAAA,IAC3B,MAAM,UAAU,QAAQ,EAAE;AAAA;AAAA,IAE1B,UAAU,SAAS,SAAS;AAAA,EAC9B,CAAC,CAAC,EACD,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AAAA;AAAA,EAEb,UAAU,EAAE,QAAQ,EAAE,QAAQ,KAAK;AACrC,CAAC;AAEM,MAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,OAAO;AAAA,EACxB,KAAK,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,QAAQ,EAAE;AAAA,EACpC,OAAO,UAAU,SAAS;AAAA,EAC1B,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,EAAE,QAAQ,GAAG;AAAA;AAAA,EAEvD,aAAa,EAAE,KAAK,CAAC,SAAS,QAAQ,OAAO,KAAK,CAAC,EAAE,QAAQ,OAAO,EAAE,SAAS,iBAAiB;AAAA;AAAA,EAEhG,cAAc,EAAE,QAAQ,EAAE,QAAQ,IAAI;AACxC,CAAC;AAEM,MAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,SAAS;AAAA,EAC1B,SAAS,EACN,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EACxE,IAAI,CAAC,EACL,IAAI,CAAC,EACL,QAAQ,CAAC,CAAC;AACf,CAAC;AAOM,MAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,aAAa;AAAA,EAC9B,MAAM,EAAE,MAAM,eAAe,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;AAAA,EACjD,OAAO,EAAE,MAAM,eAAe,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;AAAA,EAClD,MAAM,EAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,QAAQ,OAAO;AAAA,EAC/C,cAAc,EAAE,KAAK,CAAC,MAAM,MAAM,IAAI,CAAC,EAAE,QAAQ,IAAI;AAAA,EACrD,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAClC,CAAC;AAMM,MAAM,kBAAkB,EAAE,OAAO;AAAA,EACtC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,MAAM;AAAA,EACvB,MAAM,EACH,MAAM,EAAE,OAAO,EAAE,OAAO,UAAU,QAAQ,KAAK,GAAG,QAAQ,EAAE,MAAM,eAAe,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EACzG,IAAI,CAAC,EACL,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AACf,CAAC;AAKM,MAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,OAAO;AAAA,EACxB,SAAS,UAAU,SAAS;AAAA,EAC5B,OAAO,UAAU,SAAS;AAAA,EAC1B,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA;AAAA,EAEjD,YAAY,EAAE,KAAK,CAAC,SAAS,OAAO,CAAC,EAAE,QAAQ,OAAO;AAAA,EACtD,OAAO,EACJ;AAAA,IACC,EAAE,OAAO;AAAA,MACP,MAAM,UAAU,SAAS;AAAA,MACzB,UAAU,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA,MACxC,OAAO,UAAU,QAAQ,EAAE;AAAA,MAC3B,MAAM,UAAU,SAAS;AAAA,MACzB,MAAM,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA,MACpC,WAAW,UAAU,SAAS;AAAA;AAAA,MAE9B,UAAU,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,IACrC,CAAC;AAAA,EACH,EACC,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AACf,CAAC;AAGM,MAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,WAAW;AAAA,EAC5B,SAAS,UAAU,SAAS;AAAA,EAC5B,OAAO,EACJ,MAAM,EAAE,OAAO,EAAE,OAAO,UAAU,QAAQ,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,UAAU,SAAS,EAAE,CAAC,CAAC,EACpH,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AACf,CAAC;AAGM,MAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,KAAK;AAAA,EACtB,SAAS,UAAU,SAAS;AAAA;AAAA,EAE5B,WAAW,EACR,MAAM,EAAE,OAAO,EAAE,OAAO,UAAU,QAAQ,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,EACvF,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AAAA,EACb,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,EAAE,QAAQ,GAAG;AAAA;AAAA,EAEvD,cAAc,EAAE,QAAQ,EAAE,QAAQ,IAAI;AACxC,CAAC;AAGM,MAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,WAAW;AAAA,EAC5B,SAAS,UAAU,SAAS;AAAA;AAAA,EAE5B,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE;AAAA,EACrC,aAAa,UAAU,QAAQ,eAAe;AAAA,EAC9C,YAAY,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA,EAEpC,UAAU,EAAE,KAAK,CAAC,WAAW,MAAM,CAAC,EAAE,QAAQ,SAAS,EAAE,SAAS,WAAW;AAC/E,CAAC;AAGM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,QAAQ;AAAA,EACzB,QAAQ,EACL;AAAA,IACC,EAAE,OAAO;AAAA,MACP,UAAU,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA,MACxC,SAAS,IAAI,SAAS;AAAA,MACtB,KAAK,UAAU,QAAQ,EAAE;AAAA,MACzB,SAAS,UAAU,SAAS;AAAA,MAC5B,MAAM,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA,IACtC,CAAC;AAAA,EACH,EACC,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AAAA,EACb,UAAU,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAEnC,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC;AAAA,EACnD,UAAU,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAClC,YAAY,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACpC,aAAa,EAAE,KAAK,CAAC,QAAQ,OAAO,OAAO,OAAO,MAAM,CAAC,EAAE,QAAQ,MAAM;AAC3E,CAAC;AAKM,MAAM,0BAA0B,EAAE,OAAO;AAAA,EAC9C,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,cAAc;AAAA;AAAA,EAE/B,OAAO,UAAU,QAAQ,EAAE,EAAE,SAAS,iCAAiC;AAAA;AAAA,EAEvE,eAAe,UAAU,SAAS,EAAE,SAAS,sBAAsB;AAAA;AAAA,EAEnE,OAAO,UAAU,SAAS,EAAE,SAAS,mBAAmB;AAAA,EACxD,UAAU,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,QAAQ,IAAI,EAAE,SAAS,8BAA8B;AACtF,CAAC;AAGM,MAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,aAAa;AAAA,EAC9B,SAAS,UAAU,SAAS;AAAA,EAC5B,WAAW,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,QAAQ,EAAE;AAAA,EAC1C,UAAU,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,QAAQ,EAAE;AAAA,EACzC,aAAa,UAAU,QAAQ,MAAM;AAAA,EACrC,YAAY,UAAU,QAAQ,IAAI;AAAA,EAClC,KAAK,UAAU,QAAQ,EAAE;AAAA,EACzB,aAAa,EAAE,KAAK,CAAC,QAAQ,OAAO,OAAO,KAAK,CAAC,EAAE,QAAQ,KAAK;AAClE,CAAC;AAGM,MAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,WAAW;AAAA,EAC5B,SAAS,UAAU,SAAS;AAAA,EAC5B,OAAO,UAAU,SAAS;AAAA,EAC1B,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EACjD,OAAO,EACJ;AAAA,IACC,EAAE,OAAO;AAAA,MACP,UAAU,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,QAAQ,EAAE;AAAA,MACzC,SAAS,IAAI,SAAS;AAAA,MACtB,OAAO,UAAU,QAAQ,EAAE;AAAA,MAC3B,UAAU,UAAU,SAAS;AAAA,MAC7B,aAAa,UAAU,SAAS;AAAA,MAChC,MAAM,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA,IACtC,CAAC;AAAA,EACH,EACC,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AAAA;AAAA,EAEb,YAAY,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,8BAA2B;AAAA,EAC1E,UAAU,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,sBAAsB;AACrE,CAAC;AAGM,MAAM,kBAAkB,EAAE,OAAO;AAAA,EACtC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,MAAM;AAAA,EACvB,SAAS,UAAU,SAAS;AAAA,EAC5B,OAAO,UAAU,SAAS;AAAA,EAC1B,OAAO,EACJ;AAAA,IACC,EAAE,OAAO;AAAA,MACP,OAAO,UAAU,QAAQ,EAAE;AAAA,MAC3B,UAAU,UAAU,SAAS;AAAA;AAAA,MAE7B,gBAAgB,UAAU,SAAS;AAAA,MACnC,aAAa,UAAU,SAAS;AAAA,MAChC,QAAQ,UAAU,SAAS;AAAA,MAC3B,UAAU,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA;AAAA,MAExC,YAAY,UAAU,SAAS;AAAA,IACjC,CAAC;AAAA,EACH,EACC,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AAAA,EACb,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,uBAAuB;AACpE,CAAC;AAGM,MAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,aAAa;AAAA,EAC9B,WAAW,UAAU,QAAQ,MAAM;AAAA,EACnC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,0BAA0B;AACvE,CAAC;AAKM,MAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,YAAY;AAAA,EAC7B,SAAS,UAAU,SAAS;AAAA,EAC5B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC;AAAA,EAChD,UAAU,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,QAAQ,SAAS;AAAA,EAC/C,YAAY,EAAE,QAAQ,EAAE,QAAQ,KAAK;AACvC,CAAC;AAGM,MAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,cAAc;AAAA,EAC/B,SAAS,UAAU,SAAS;AAAA,EAC5B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC;AAAA,EAChD,QAAQ,EACL;AAAA,IACC,EAAE,OAAO;AAAA,MACP,OAAO,UAAU,QAAQ,EAAE;AAAA,MAC3B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE;AAAA,MACpC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,MACjC,UAAU,UAAU,SAAS;AAAA,MAC7B,KAAK,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA,IACrC,CAAC;AAAA,EACH,EACC,IAAI,GAAG,EACP,QAAQ,CAAC,CAAC;AAAA,EACb,UAAU,EAAE,QAAQ,EAAE,QAAQ,IAAI;AACpC,CAAC;AAGM,MAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,oBAAoB;AAAA,EACrC,SAAS,UAAU,SAAS;AAAA,EAC5B,MAAM,EACH,MAAM,EAAE,OAAO,EAAE,KAAK,UAAU,QAAQ,EAAE,GAAG,OAAO,UAAU,QAAQ,EAAE,EAAE,CAAC,CAAC,EAC5E,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AAAA,EACb,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAC1C,CAAC;AAGM,MAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,eAAe;AAAA,EAChC,SAAS,UAAU,SAAS;AAAA,EAC5B,SAAS,UAAU,SAAS;AAAA,EAC5B,OAAO,UAAU,SAAS;AAAA,EAC1B,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS;AACtC,CAAC;AAGM,MAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,cAAc;AAAA,EAC/B,SAAS,UAAU,SAAS;AAAA,EAC5B,OAAO,EACJ,MAAM,EAAE,OAAO,EAAE,UAAU,UAAU,QAAQ,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,EAC3F,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AACf,CAAC;AAGM,MAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,kBAAkB;AAAA,EACnC,SAAS,UAAU,SAAS;AAAA,EAC5B,MAAM,UAAU,SAAS;AAAA,EACzB,aAAa,UAAU,QAAQ,WAAW;AAAA,EAC1C,WAAW,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAC3C,CAAC;AAGM,MAAM,kBAAkB,EAAE,OAAO;AAAA,EACtC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,WAAW;AAAA,EAC5B,OAAO,UAAU,QAAQ,EAAE;AAAA,EAC3B,MAAM,UAAU,SAAS;AAAA,EACzB,aAAa,UAAU,QAAQ,WAAW;AAAA,EAC1C,YAAY,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,QAAQ,GAAG;AAAA,EAC5C,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS;AAC/C,CAAC;AAGM,MAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,eAAe;AAAA,EAChC,SAAS,UAAU,SAAS;AAAA,EAC5B,OAAO,EACJ,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS,GAAG,SAAS,IAAI,SAAS,GAAG,KAAK,UAAU,QAAQ,EAAE,EAAE,CAAC,CAAC,EAC7G,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AAAA,EACb,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AACnD,CAAC;AAGM,MAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,oBAAoB;AAAA,EACrC,SAAS,UAAU,SAAS;AAAA,EAC5B,OAAO,EACJ,MAAM,EAAE,OAAO,EAAE,OAAO,UAAU,QAAQ,EAAE,GAAG,QAAQ,UAAU,QAAQ,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAClI,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AACf,CAAC;AAGM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,aAAa;AAAA,EAC9B,SAAS,UAAU,SAAS;AAAA,EAC5B,OAAO,EACJ,MAAM,EAAE,OAAO,EAAE,MAAM,UAAU,SAAS,GAAG,OAAO,UAAU,QAAQ,EAAE,GAAG,MAAM,UAAU,SAAS,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS,EAAE,CAAC,CAAC,EAC/I,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AACf,CAAC;AAGM,MAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,iBAAiB;AAAA,EAClC,SAAS,UAAU,SAAS;AAAA,EAC5B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC;AAAA,EAChD,OAAO,EACJ,MAAM,EAAE,OAAO,EAAE,OAAO,UAAU,QAAQ,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,UAAU,SAAS,EAAE,CAAC,CAAC,EACpH,IAAI,EAAE,EACN,QAAQ,CAAC,CAAC;AACf,CAAC;AAGM,MAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,GAAG;AAAA,EACH,OAAO,EAAE,QAAQ,iBAAiB;AAAA,EAClC,SAAS,UAAU,SAAS;AAAA,EAC5B,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE;AAAA,EACrC,aAAa,UAAU,QAAQ,eAAe;AAChD,CAAC;AAGM,MAAM,qBAAqB,EAAE,mBAAmB,SAAS;AAAA,EAC9D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAIM,MAAM,iBAAiB,EAAE,MAAM,CAAC,oBAAoB,eAAe,CAAC;","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 imageId: ref.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 mediaId: ref.optional(),\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 mediaId: ref.optional(),\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 mediaId: ref.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 mediaId: ref.optional(),\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(), mediaId: ref.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/** 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 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":[]}
@@ -32,6 +32,8 @@ export declare function buildRobots(site: {
32
32
  interface SeoSiteContext {
33
33
  name: string;
34
34
  domain?: string;
35
+ /** "demo" zet elke pagina op noindex (robots.txt-disallow alleen is geen noindex). */
36
+ mode?: string;
35
37
  seoDefaults?: Seo;
36
38
  }
37
39
  /** Bouwt Next `Metadata` voor een pagina, met fallback op site-defaults. */
@@ -36,7 +36,7 @@ function buildMetadata(page, site) {
36
36
  description,
37
37
  metadataBase: origin ? new URL(origin) : void 0,
38
38
  alternates: { canonical },
39
- robots: seo.noindex ? { index: false, follow: false } : void 0,
39
+ robots: seo.noindex || site.mode === "demo" ? { index: false, follow: false } : void 0,
40
40
  openGraph: {
41
41
  title,
42
42
  description,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/seo.ts"],"sourcesContent":["import \"server-only\";\n\nimport type { Metadata, MetadataRoute } from \"next\";\nimport type { Seo } from \"../schema/seo\";\nimport type { Page } from \"../schema/pages\";\n\n/** Absolute origin (https://domein) uit de site-config; \"\" als er geen domein is. */\nexport function siteOrigin(site: { domain?: string }): string {\n return site.domain ? `https://${site.domain.replace(/^https?:\\/\\//, \"\").replace(/\\/$/, \"\")}` : \"\";\n}\n\n/**\n * Bouwt een Next `sitemap.xml` uit een lijst pagina's. Gebruik in `app/sitemap.ts`:\n * export default function sitemap() { return buildSitemap(pages, siteConfig); }\n */\nexport function buildSitemap(\n pages: Array<{ path: string; updatedAt?: string | number | Date; seo?: { noindex?: boolean } }>,\n site: { domain?: string },\n): MetadataRoute.Sitemap {\n const origin = siteOrigin(site);\n return pages\n .filter((p) => !p.seo?.noindex)\n .map((p) => ({\n url: `${origin}${p.path === \"/\" ? \"/\" : p.path}`,\n lastModified: p.updatedAt ? new Date(p.updatedAt) : undefined,\n changeFrequency: p.path === \"/\" ? (\"weekly\" as const) : (\"monthly\" as const),\n priority: p.path === \"/\" ? 1 : 0.7,\n }));\n}\n\n/**\n * Bouwt een Next `robots.txt`. In `mode:\"demo\"` wordt de hele site op noindex gezet; anders alles\n * toegestaan behalve de beheerpaden, met verwijzing naar de sitemap. Gebruik in `app/robots.ts`.\n */\nexport function buildRobots(\n site: { domain?: string; mode?: string },\n opts?: { disallow?: string[] },\n): MetadataRoute.Robots {\n const origin = siteOrigin(site);\n if (site.mode === \"demo\") {\n return { rules: { userAgent: \"*\", disallow: \"/\" } }; // demo niet indexeren\n }\n return {\n rules: { userAgent: \"*\", allow: \"/\", disallow: opts?.disallow ?? [\"/beheer\", \"/login\"] },\n ...(origin ? { sitemap: `${origin}/sitemap.xml`, host: origin } : {}),\n };\n}\n\ninterface SeoSiteContext {\n name: string;\n domain?: string;\n seoDefaults?: Seo;\n}\n\n/** Bouwt Next `Metadata` voor een pagina, met fallback op site-defaults. */\nexport function buildMetadata(page: Pick<Page, \"title\" | \"path\" | \"seo\">, site: SeoSiteContext): Metadata {\n const seo = page.seo ?? {};\n const d = site.seoDefaults ?? {};\n const title = seo.title ?? page.title ?? site.name;\n const description = seo.description ?? d.description;\n // Absolute canonical/OG-URL (Google prefereert absoluut) wanneer het domein bekend is.\n const origin = site.domain ? `https://${site.domain.replace(/^https?:\\/\\//, \"\").replace(/\\/$/, \"\")}` : \"\";\n const path = seo.canonical ?? page.path;\n const canonical = /^https?:\\/\\//.test(path) ? path : `${origin}${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`;\n const ogImage = seo.ogImage ?? d.ogImage;\n // OG-afbeeldingen met afmetingen (1200×630) → betere previews op social.\n const images = ogImage ? [{ url: ogImage, width: 1200, height: 630 }] : undefined;\n\n return {\n title,\n description,\n metadataBase: origin ? new URL(origin) : undefined,\n alternates: { canonical },\n robots: seo.noindex ? { index: false, follow: false } : undefined,\n openGraph: {\n title,\n description,\n url: canonical,\n siteName: site.name,\n type: \"website\",\n ...(images ? { images } : {}),\n },\n twitter: {\n card: images ? \"summary_large_image\" : \"summary\",\n title,\n description,\n ...(images ? { images: [ogImage as string] } : {}),\n },\n };\n}\n\n/** Bedrijfsgegevens voor gestructureerde data (schema.org LocalBusiness e.d.). */\nexport interface BusinessInfo {\n /** schema.org-type, bv. \"LocalBusiness\", \"LodgingBusiness\", \"Restaurant\", \"Store\". */\n type?: string;\n name: string;\n description?: string;\n url?: string;\n telephone?: string;\n email?: string;\n image?: string;\n /** Indicatie prijsniveau, bv. \"€€\". */\n priceRange?: string;\n address?: {\n street?: string;\n locality?: string;\n region?: string;\n postalCode?: string;\n country?: string;\n };\n geo?: { lat: number; lng: number };\n /** schema.org openingHours, bv. [\"Mo-Fr 09:00-17:00\", \"Sa 10:00-16:00\"]. */\n openingHours?: string[];\n /** Externe profielen (social, etc.). */\n sameAs?: string[];\n}\n\n/**\n * Bouwt gestructureerde data voor een lokaal bedrijf (herbruikbaar per branche). Plaats het\n * resultaat als JSON-LD in de layout: <script type=\"application/ld+json\">JSON.stringify(...)</script>\n */\nexport function businessJsonLd(info: BusinessInfo): Record<string, unknown> {\n const out: Record<string, unknown> = {\n \"@context\": \"https://schema.org\",\n \"@type\": info.type ?? \"LocalBusiness\",\n // Zelfde relatieve @id als de contact-/openingstijden-blokken: zo voegen zoekmachines de\n // layout-brede en blok-specifieke LocalBusiness-JSON-LD samen tot één entiteit per pagina.\n \"@id\": \"#business\",\n name: info.name,\n };\n if (info.description) out.description = info.description;\n if (info.url) out.url = info.url;\n if (info.telephone) out.telephone = info.telephone;\n if (info.email) out.email = info.email;\n if (info.image) out.image = info.image;\n if (info.priceRange) out.priceRange = info.priceRange;\n if (info.address) {\n out.address = {\n \"@type\": \"PostalAddress\",\n streetAddress: info.address.street,\n addressLocality: info.address.locality,\n addressRegion: info.address.region,\n postalCode: info.address.postalCode,\n addressCountry: info.address.country,\n };\n }\n if (info.geo) out.geo = { \"@type\": \"GeoCoordinates\", latitude: info.geo.lat, longitude: info.geo.lng };\n if (info.openingHours?.length) out.openingHours = info.openingHours;\n if (info.sameAs?.length) out.sameAs = info.sameAs;\n return out;\n}\n\n/** Breadcrumb-trail (schema.org BreadcrumbList) — voor genest navigeren + rich results. */\nexport function breadcrumbListJsonLd(items: { name: string; url: string }[]): Record<string, unknown> {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"BreadcrumbList\",\n itemListElement: items.map((it, i) => ({\n \"@type\": \"ListItem\",\n position: i + 1,\n name: it.name,\n item: it.url,\n })),\n };\n}\n\n/** Article-JSON-LD voor nieuws/blog. */\nexport function articleJsonLd(a: {\n title: string;\n description?: string;\n author?: string;\n datePublished?: string;\n image?: string;\n url?: string;\n}): Record<string, unknown> {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"Article\",\n headline: a.title,\n ...(a.description ? { description: a.description } : {}),\n ...(a.author ? { author: { \"@type\": \"Person\", name: a.author } } : {}),\n ...(a.datePublished ? { datePublished: a.datePublished } : {}),\n ...(a.image ? { image: a.image } : {}),\n ...(a.url ? { url: a.url } : {}),\n };\n}\n\n/** Product/Offer-JSON-LD. */\nexport function productJsonLd(p: {\n name: string;\n description?: string;\n price?: string | number;\n currency?: string;\n image?: string;\n availability?: string;\n}): Record<string, unknown> {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"Product\",\n name: p.name,\n ...(p.description ? { description: p.description } : {}),\n ...(p.image ? { image: p.image } : {}),\n ...(p.price != null\n ? {\n offers: {\n \"@type\": \"Offer\",\n price: String(p.price),\n priceCurrency: p.currency ?? \"EUR\",\n ...(p.availability ? { availability: `https://schema.org/${p.availability}` } : {}),\n },\n }\n : {}),\n };\n}\n\n/** OpeningHoursSpecification — bv. `[{ days:[\"Mo\",\"Tu\"], opens:\"09:00\", closes:\"17:00\" }]`. */\nexport function openingHoursJsonLd(\n spec: { days: string[]; opens: string; closes: string }[],\n): Record<string, unknown>[] {\n return spec.map((s) => ({\n \"@type\": \"OpeningHoursSpecification\",\n dayOfWeek: s.days,\n opens: s.opens,\n closes: s.closes,\n }));\n}\n\n/** ImageGallery-JSON-LD voor een fotogalerij. */\nexport function galleryJsonLd(items: { url: string; caption?: string }[]): Record<string, unknown> {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"ImageGallery\",\n image: items.map((it) => ({ \"@type\": \"ImageObject\", contentUrl: it.url, ...(it.caption ? { caption: it.caption } : {}) })),\n };\n}\n\n/** VideoObject-JSON-LD. */\nexport function videoObjectJsonLd(v: {\n name: string;\n description?: string;\n thumbnailUrl?: string;\n contentUrl?: string;\n uploadDate?: string;\n}): Record<string, unknown> {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"VideoObject\",\n name: v.name,\n ...(v.description ? { description: v.description } : {}),\n ...(v.thumbnailUrl ? { thumbnailUrl: v.thumbnailUrl } : {}),\n ...(v.contentUrl ? { contentUrl: v.contentUrl } : {}),\n ...(v.uploadDate ? { uploadDate: v.uploadDate } : {}),\n };\n}\n\n/** Bouwt een JSON-LD-object voor een pagina (schema.org). */\nexport function buildJsonLd(\n page: Pick<Page, \"title\" | \"path\" | \"seo\">,\n site: SeoSiteContext,\n): Record<string, unknown> {\n const type = page.seo?.jsonLdType ?? \"WebPage\";\n const base = site.domain ? `https://${site.domain.replace(/^https?:\\/\\//, \"\")}` : \"\";\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": type,\n name: page.seo?.title ?? page.title,\n description: page.seo?.description ?? site.seoDefaults?.description,\n url: base + page.path,\n publisher: { \"@type\": \"Organization\", name: site.name },\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/server/seo.ts"],"sourcesContent":["import \"server-only\";\n\nimport type { Metadata, MetadataRoute } from \"next\";\nimport type { Seo } from \"../schema/seo\";\nimport type { Page } from \"../schema/pages\";\n\n/** Absolute origin (https://domein) uit de site-config; \"\" als er geen domein is. */\nexport function siteOrigin(site: { domain?: string }): string {\n return site.domain ? `https://${site.domain.replace(/^https?:\\/\\//, \"\").replace(/\\/$/, \"\")}` : \"\";\n}\n\n/**\n * Bouwt een Next `sitemap.xml` uit een lijst pagina's. Gebruik in `app/sitemap.ts`:\n * export default function sitemap() { return buildSitemap(pages, siteConfig); }\n */\nexport function buildSitemap(\n pages: Array<{ path: string; updatedAt?: string | number | Date; seo?: { noindex?: boolean } }>,\n site: { domain?: string },\n): MetadataRoute.Sitemap {\n const origin = siteOrigin(site);\n return pages\n .filter((p) => !p.seo?.noindex)\n .map((p) => ({\n url: `${origin}${p.path === \"/\" ? \"/\" : p.path}`,\n lastModified: p.updatedAt ? new Date(p.updatedAt) : undefined,\n changeFrequency: p.path === \"/\" ? (\"weekly\" as const) : (\"monthly\" as const),\n priority: p.path === \"/\" ? 1 : 0.7,\n }));\n}\n\n/**\n * Bouwt een Next `robots.txt`. In `mode:\"demo\"` wordt de hele site op noindex gezet; anders alles\n * toegestaan behalve de beheerpaden, met verwijzing naar de sitemap. Gebruik in `app/robots.ts`.\n */\nexport function buildRobots(\n site: { domain?: string; mode?: string },\n opts?: { disallow?: string[] },\n): MetadataRoute.Robots {\n const origin = siteOrigin(site);\n if (site.mode === \"demo\") {\n // Let op: disallow blokkeert alleen het CRAWLEN — de URL kan alsnog (kaal) geïndexeerd\n // raken. buildMetadata zet in demo-modus daarom óók robots.index=false op elke pagina.\n return { rules: { userAgent: \"*\", disallow: \"/\" } };\n }\n return {\n rules: { userAgent: \"*\", allow: \"/\", disallow: opts?.disallow ?? [\"/beheer\", \"/login\"] },\n ...(origin ? { sitemap: `${origin}/sitemap.xml`, host: origin } : {}),\n };\n}\n\ninterface SeoSiteContext {\n name: string;\n domain?: string;\n /** \"demo\" zet elke pagina op noindex (robots.txt-disallow alleen is geen noindex). */\n mode?: string;\n seoDefaults?: Seo;\n}\n\n/** Bouwt Next `Metadata` voor een pagina, met fallback op site-defaults. */\nexport function buildMetadata(page: Pick<Page, \"title\" | \"path\" | \"seo\">, site: SeoSiteContext): Metadata {\n const seo = page.seo ?? {};\n const d = site.seoDefaults ?? {};\n const title = seo.title ?? page.title ?? site.name;\n const description = seo.description ?? d.description;\n // Absolute canonical/OG-URL (Google prefereert absoluut) wanneer het domein bekend is.\n const origin = site.domain ? `https://${site.domain.replace(/^https?:\\/\\//, \"\").replace(/\\/$/, \"\")}` : \"\";\n const path = seo.canonical ?? page.path;\n const canonical = /^https?:\\/\\//.test(path) ? path : `${origin}${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`;\n const ogImage = seo.ogImage ?? d.ogImage;\n // OG-afbeeldingen met afmetingen (1200×630) → betere previews op social.\n const images = ogImage ? [{ url: ogImage, width: 1200, height: 630 }] : undefined;\n\n return {\n title,\n description,\n metadataBase: origin ? new URL(origin) : undefined,\n alternates: { canonical },\n robots: seo.noindex || site.mode === \"demo\" ? { index: false, follow: false } : undefined,\n openGraph: {\n title,\n description,\n url: canonical,\n siteName: site.name,\n type: \"website\",\n ...(images ? { images } : {}),\n },\n twitter: {\n card: images ? \"summary_large_image\" : \"summary\",\n title,\n description,\n ...(images ? { images: [ogImage as string] } : {}),\n },\n };\n}\n\n/** Bedrijfsgegevens voor gestructureerde data (schema.org LocalBusiness e.d.). */\nexport interface BusinessInfo {\n /** schema.org-type, bv. \"LocalBusiness\", \"LodgingBusiness\", \"Restaurant\", \"Store\". */\n type?: string;\n name: string;\n description?: string;\n url?: string;\n telephone?: string;\n email?: string;\n image?: string;\n /** Indicatie prijsniveau, bv. \"€€\". */\n priceRange?: string;\n address?: {\n street?: string;\n locality?: string;\n region?: string;\n postalCode?: string;\n country?: string;\n };\n geo?: { lat: number; lng: number };\n /** schema.org openingHours, bv. [\"Mo-Fr 09:00-17:00\", \"Sa 10:00-16:00\"]. */\n openingHours?: string[];\n /** Externe profielen (social, etc.). */\n sameAs?: string[];\n}\n\n/**\n * Bouwt gestructureerde data voor een lokaal bedrijf (herbruikbaar per branche). Plaats het\n * resultaat als JSON-LD in de layout: <script type=\"application/ld+json\">JSON.stringify(...)</script>\n */\nexport function businessJsonLd(info: BusinessInfo): Record<string, unknown> {\n const out: Record<string, unknown> = {\n \"@context\": \"https://schema.org\",\n \"@type\": info.type ?? \"LocalBusiness\",\n // Zelfde relatieve @id als de contact-/openingstijden-blokken: zo voegen zoekmachines de\n // layout-brede en blok-specifieke LocalBusiness-JSON-LD samen tot één entiteit per pagina.\n \"@id\": \"#business\",\n name: info.name,\n };\n if (info.description) out.description = info.description;\n if (info.url) out.url = info.url;\n if (info.telephone) out.telephone = info.telephone;\n if (info.email) out.email = info.email;\n if (info.image) out.image = info.image;\n if (info.priceRange) out.priceRange = info.priceRange;\n if (info.address) {\n out.address = {\n \"@type\": \"PostalAddress\",\n streetAddress: info.address.street,\n addressLocality: info.address.locality,\n addressRegion: info.address.region,\n postalCode: info.address.postalCode,\n addressCountry: info.address.country,\n };\n }\n if (info.geo) out.geo = { \"@type\": \"GeoCoordinates\", latitude: info.geo.lat, longitude: info.geo.lng };\n if (info.openingHours?.length) out.openingHours = info.openingHours;\n if (info.sameAs?.length) out.sameAs = info.sameAs;\n return out;\n}\n\n/** Breadcrumb-trail (schema.org BreadcrumbList) — voor genest navigeren + rich results. */\nexport function breadcrumbListJsonLd(items: { name: string; url: string }[]): Record<string, unknown> {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"BreadcrumbList\",\n itemListElement: items.map((it, i) => ({\n \"@type\": \"ListItem\",\n position: i + 1,\n name: it.name,\n item: it.url,\n })),\n };\n}\n\n/** Article-JSON-LD voor nieuws/blog. */\nexport function articleJsonLd(a: {\n title: string;\n description?: string;\n author?: string;\n datePublished?: string;\n image?: string;\n url?: string;\n}): Record<string, unknown> {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"Article\",\n headline: a.title,\n ...(a.description ? { description: a.description } : {}),\n ...(a.author ? { author: { \"@type\": \"Person\", name: a.author } } : {}),\n ...(a.datePublished ? { datePublished: a.datePublished } : {}),\n ...(a.image ? { image: a.image } : {}),\n ...(a.url ? { url: a.url } : {}),\n };\n}\n\n/** Product/Offer-JSON-LD. */\nexport function productJsonLd(p: {\n name: string;\n description?: string;\n price?: string | number;\n currency?: string;\n image?: string;\n availability?: string;\n}): Record<string, unknown> {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"Product\",\n name: p.name,\n ...(p.description ? { description: p.description } : {}),\n ...(p.image ? { image: p.image } : {}),\n ...(p.price != null\n ? {\n offers: {\n \"@type\": \"Offer\",\n price: String(p.price),\n priceCurrency: p.currency ?? \"EUR\",\n ...(p.availability ? { availability: `https://schema.org/${p.availability}` } : {}),\n },\n }\n : {}),\n };\n}\n\n/** OpeningHoursSpecification — bv. `[{ days:[\"Mo\",\"Tu\"], opens:\"09:00\", closes:\"17:00\" }]`. */\nexport function openingHoursJsonLd(\n spec: { days: string[]; opens: string; closes: string }[],\n): Record<string, unknown>[] {\n return spec.map((s) => ({\n \"@type\": \"OpeningHoursSpecification\",\n dayOfWeek: s.days,\n opens: s.opens,\n closes: s.closes,\n }));\n}\n\n/** ImageGallery-JSON-LD voor een fotogalerij. */\nexport function galleryJsonLd(items: { url: string; caption?: string }[]): Record<string, unknown> {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"ImageGallery\",\n image: items.map((it) => ({ \"@type\": \"ImageObject\", contentUrl: it.url, ...(it.caption ? { caption: it.caption } : {}) })),\n };\n}\n\n/** VideoObject-JSON-LD. */\nexport function videoObjectJsonLd(v: {\n name: string;\n description?: string;\n thumbnailUrl?: string;\n contentUrl?: string;\n uploadDate?: string;\n}): Record<string, unknown> {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"VideoObject\",\n name: v.name,\n ...(v.description ? { description: v.description } : {}),\n ...(v.thumbnailUrl ? { thumbnailUrl: v.thumbnailUrl } : {}),\n ...(v.contentUrl ? { contentUrl: v.contentUrl } : {}),\n ...(v.uploadDate ? { uploadDate: v.uploadDate } : {}),\n };\n}\n\n/** Bouwt een JSON-LD-object voor een pagina (schema.org). */\nexport function buildJsonLd(\n page: Pick<Page, \"title\" | \"path\" | \"seo\">,\n site: SeoSiteContext,\n): Record<string, unknown> {\n const type = page.seo?.jsonLdType ?? \"WebPage\";\n const base = site.domain ? `https://${site.domain.replace(/^https?:\\/\\//, \"\")}` : \"\";\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": type,\n name: page.seo?.title ?? page.title,\n description: page.seo?.description ?? site.seoDefaults?.description,\n url: base + page.path,\n publisher: { \"@type\": \"Organization\", name: site.name },\n };\n}\n"],"mappings":"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","names":[]}
package/dist/styles.css CHANGED
@@ -63,6 +63,30 @@
63
63
  :is(.xicms-lightbox__close, .xicms-lightbox__nav):focus-visible {
64
64
  outline-color: #fff;
65
65
  }
66
+ /* De carrousel-regio zelf is focusbaar (pijltjesbediening) - focus moet zichtbaar zijn. */
67
+ .xicms-slider:focus-visible {
68
+ outline: 2px solid var(--xicms-primary, #4f46e5);
69
+ outline-offset: 2px;
70
+ }
71
+ .xicms-slider__pause {
72
+ position: absolute;
73
+ right: 0.6rem;
74
+ bottom: 0.6rem;
75
+ width: 2.75rem;
76
+ height: 2.75rem;
77
+ border-radius: 999px;
78
+ border: 0;
79
+ background: rgba(255, 255, 255, 0.85);
80
+ color: #111;
81
+ font-size: 1rem;
82
+ cursor: pointer;
83
+ display: grid;
84
+ place-items: center;
85
+ }
86
+ .xicms-slider__pause:focus-visible {
87
+ outline: 2px solid var(--xicms-primary, #4f46e5);
88
+ outline-offset: 2px;
89
+ }
66
90
 
67
91
  /* Koppen volgen een optioneel apart display/serif-font (theme.headingFont). */
68
92
  .xicms-root :is(h1, h2, h3),
@@ -519,7 +543,7 @@
519
543
  border: none;
520
544
  border-radius: var(--xicms-radius, 10px);
521
545
  background: var(--xicms-primary, #4f46e5);
522
- color: #fff;
546
+ color: var(--xicms-on-primary, #fff);
523
547
  font: inherit;
524
548
  font-weight: 600;
525
549
  cursor: pointer;
@@ -949,9 +973,12 @@
949
973
  font-weight: 600;
950
974
  font-size: 0.95rem;
951
975
  }
952
- .xicms-form input,
953
- .xicms-form textarea,
954
- .xicms-form select {
976
+ /* Alléén de door XiCMS zélf gerenderde native velden (date/number → .xicms-input).
977
+ NIET de blanket `.xicms-form input/textarea/select`: die selector lekte over de
978
+ Astryx-<input> binnen `.astryx-text-input` heen → dubbele rand/padding (zichtbaar als
979
+ een rare tweede rand rechts). Astryx-velden stijlen zichzelf via hun eigen tokens. */
980
+ .xicms-form .xicms-input {
981
+ box-sizing: border-box;
955
982
  width: 100%;
956
983
  padding: 0.6rem 0.7rem;
957
984
  border: 1px solid var(--xicms-border-strong, rgba(0, 0, 0, 0.18));
@@ -2310,7 +2337,7 @@
2310
2337
  padding: 0.7rem 0.9rem;
2311
2338
  border-radius: 999px;
2312
2339
  background: #25d366;
2313
- color: #fff;
2340
+ color: #0b3d2e; /* donkergroen op WhatsApp-groen: leesbaar (wit haalde geen 3:1, laat staan 4.5:1) */
2314
2341
  text-decoration: none;
2315
2342
  font-weight: 600;
2316
2343
  box-shadow: 0 6px 20px rgba(0, 0, 0, 0.22);
@@ -2400,7 +2427,9 @@
2400
2427
  margin: 0;
2401
2428
  opacity: 0;
2402
2429
  cursor: ew-resize;
2403
- touch-action: none;
2430
+ /* pan-y: horizontaal slepen bedient de slider, verticaal vegen blijft gewoon scrollen -
2431
+ touch-action:none maakte het hele beeldvlak een scroll-val op mobiel. */
2432
+ touch-action: pan-y;
2404
2433
  }
2405
2434
  /* :has i.p.v. ~: de divider staat in de DOM vóór de range-input. */
2406
2435
  .xicms-beforeafter__stage:has(.xicms-beforeafter__range:focus-visible) .xicms-beforeafter__handle {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xiwebdesign/xicms-core",
3
- "version": "4.17.1",
3
+ "version": "4.18.0",
4
4
  "description": "XiCMS engine: gestructureerde content, pagina's, draft/publish, admin (TipTap+Radix), SEO en beveiliging voor klantsites.",
5
5
  "license": "UNLICENSED",
6
6
  "repository": {