@xiwebdesign/xicms-core 7.12.1 → 7.13.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 (127) hide show
  1. package/dist/admin/AdminApp.js +2 -0
  2. package/dist/admin/AdminApp.js.map +1 -1
  3. package/dist/admin/lib/zodFields.d.ts +2 -2
  4. package/dist/admin/lib/zodFields.js +2 -0
  5. package/dist/admin/lib/zodFields.js.map +1 -1
  6. package/dist/admin/ui/toast.d.ts +4 -0
  7. package/dist/admin/ui/toast.js +9 -3
  8. package/dist/admin/ui/toast.js.map +1 -1
  9. package/dist/admin/visual/VisualEditor.js +32 -2
  10. package/dist/admin/visual/VisualEditor.js.map +1 -1
  11. package/dist/blocks/builtinSchemas.d.ts +23 -0
  12. package/dist/blocks/builtinSchemas.js +138 -0
  13. package/dist/blocks/builtinSchemas.js.map +1 -0
  14. package/dist/blocks/builtins/Accordion.js +0 -2
  15. package/dist/blocks/builtins/Accordion.js.map +1 -1
  16. package/dist/blocks/builtins/Agenda.js +0 -2
  17. package/dist/blocks/builtins/Agenda.js.map +1 -1
  18. package/dist/blocks/builtins/Banner.js +0 -2
  19. package/dist/blocks/builtins/Banner.js.map +1 -1
  20. package/dist/blocks/builtins/BeforeAfter.js +0 -2
  21. package/dist/blocks/builtins/BeforeAfter.js.map +1 -1
  22. package/dist/blocks/builtins/Booking.js +0 -2
  23. package/dist/blocks/builtins/Booking.js.map +1 -1
  24. package/dist/blocks/builtins/Breadcrumbs.js +0 -2
  25. package/dist/blocks/builtins/Breadcrumbs.js.map +1 -1
  26. package/dist/blocks/builtins/Cards.js +0 -2
  27. package/dist/blocks/builtins/Cards.js.map +1 -1
  28. package/dist/blocks/builtins/Columns.js +0 -2
  29. package/dist/blocks/builtins/Columns.js.map +1 -1
  30. package/dist/blocks/builtins/Contact.d.ts +1 -1
  31. package/dist/blocks/builtins/Contact.js +0 -3
  32. package/dist/blocks/builtins/Contact.js.map +1 -1
  33. package/dist/blocks/builtins/Countdown.js +0 -2
  34. package/dist/blocks/builtins/Countdown.js.map +1 -1
  35. package/dist/blocks/builtins/Cta.js +0 -2
  36. package/dist/blocks/builtins/Cta.js.map +1 -1
  37. package/dist/blocks/builtins/Downloads.js +0 -2
  38. package/dist/blocks/builtins/Downloads.js.map +1 -1
  39. package/dist/blocks/builtins/Elements.js +0 -4
  40. package/dist/blocks/builtins/Elements.js.map +1 -1
  41. package/dist/blocks/builtins/Embed.js +0 -2
  42. package/dist/blocks/builtins/Embed.js.map +1 -1
  43. package/dist/blocks/builtins/Faq.js +0 -2
  44. package/dist/blocks/builtins/Faq.js.map +1 -1
  45. package/dist/blocks/builtins/FormBlock.js +0 -2
  46. package/dist/blocks/builtins/FormBlock.js.map +1 -1
  47. package/dist/blocks/builtins/Gallery.d.ts +1 -1
  48. package/dist/blocks/builtins/Gallery.js +0 -2
  49. package/dist/blocks/builtins/Gallery.js.map +1 -1
  50. package/dist/blocks/builtins/Hero.js +0 -2
  51. package/dist/blocks/builtins/Hero.js.map +1 -1
  52. package/dist/blocks/builtins/ImageBlock.js +0 -2
  53. package/dist/blocks/builtins/ImageBlock.js.map +1 -1
  54. package/dist/blocks/builtins/Jobs.d.ts +1 -1
  55. package/dist/blocks/builtins/Jobs.js +0 -2
  56. package/dist/blocks/builtins/Jobs.js.map +1 -1
  57. package/dist/blocks/builtins/Layout.js +0 -3
  58. package/dist/blocks/builtins/Layout.js.map +1 -1
  59. package/dist/blocks/builtins/MapBlock.js +0 -2
  60. package/dist/blocks/builtins/MapBlock.js.map +1 -1
  61. package/dist/blocks/builtins/NewsListBlock.js +0 -2
  62. package/dist/blocks/builtins/NewsListBlock.js.map +1 -1
  63. package/dist/blocks/builtins/Newsletter.js +0 -2
  64. package/dist/blocks/builtins/Newsletter.js.map +1 -1
  65. package/dist/blocks/builtins/OpeningHours.js +0 -2
  66. package/dist/blocks/builtins/OpeningHours.js.map +1 -1
  67. package/dist/blocks/builtins/PdfBlock.js +0 -2
  68. package/dist/blocks/builtins/PdfBlock.js.map +1 -1
  69. package/dist/blocks/builtins/Portfolio.js +0 -2
  70. package/dist/blocks/builtins/Portfolio.js.map +1 -1
  71. package/dist/blocks/builtins/Pricing.d.ts +1 -1
  72. package/dist/blocks/builtins/Pricing.js +0 -2
  73. package/dist/blocks/builtins/Pricing.js.map +1 -1
  74. package/dist/blocks/builtins/RichTextBlock.js +0 -2
  75. package/dist/blocks/builtins/RichTextBlock.js.map +1 -1
  76. package/dist/blocks/builtins/Search.js +0 -2
  77. package/dist/blocks/builtins/Search.js.map +1 -1
  78. package/dist/blocks/builtins/Sections.js +0 -10
  79. package/dist/blocks/builtins/Sections.js.map +1 -1
  80. package/dist/blocks/builtins/Slider.js +0 -2
  81. package/dist/blocks/builtins/Slider.js.map +1 -1
  82. package/dist/blocks/builtins/Spacer.js +0 -2
  83. package/dist/blocks/builtins/Spacer.js.map +1 -1
  84. package/dist/blocks/builtins/SymbolRef.js +3 -5
  85. package/dist/blocks/builtins/SymbolRef.js.map +1 -1
  86. package/dist/blocks/builtins/Team.js +0 -2
  87. package/dist/blocks/builtins/Team.js.map +1 -1
  88. package/dist/blocks/builtins/Testimonials.d.ts +1 -1
  89. package/dist/blocks/builtins/Testimonials.js +0 -2
  90. package/dist/blocks/builtins/Testimonials.js.map +1 -1
  91. package/dist/blocks/builtins/Video.d.ts +1 -1
  92. package/dist/blocks/builtins/Video.js +0 -2
  93. package/dist/blocks/builtins/Video.js.map +1 -1
  94. package/dist/blocks/builtins/WhatsappChat.js +0 -2
  95. package/dist/blocks/builtins/WhatsappChat.js.map +1 -1
  96. package/dist/blocks/builtins/Widgets.js +0 -26
  97. package/dist/blocks/builtins/Widgets.js.map +1 -1
  98. package/dist/blocks/customTemplate/definition.js +1 -1
  99. package/dist/blocks/customTemplate/definition.js.map +1 -1
  100. package/dist/blocks/registry.d.ts +24 -13
  101. package/dist/blocks/registry.js +15 -4
  102. package/dist/blocks/registry.js.map +1 -1
  103. package/dist/media/ImageContext.js +24 -1
  104. package/dist/media/ImageContext.js.map +1 -1
  105. package/dist/schema/blockBase.d.ts +99 -0
  106. package/dist/schema/blockBase.js +22 -0
  107. package/dist/schema/blockBase.js.map +1 -0
  108. package/dist/schema/blocks.d.ts +1 -91
  109. package/dist/schema/blocks.js +64 -77
  110. package/dist/schema/blocks.js.map +1 -1
  111. package/dist/schema/pages.js +1 -1
  112. package/dist/schema/pages.js.map +1 -1
  113. package/dist/schema/shop.js +1 -1
  114. package/dist/schema/shop.js.map +1 -1
  115. package/dist/schema/symbols.js +1 -1
  116. package/dist/schema/symbols.js.map +1 -1
  117. package/dist/server/blockData.js +14 -1
  118. package/dist/server/blockData.js.map +1 -1
  119. package/dist/server/index.d.ts +1 -1
  120. package/dist/server/index.js +2 -1
  121. package/dist/server/index.js.map +1 -1
  122. package/dist/server/pages.d.ts +16 -0
  123. package/dist/server/pages.js +9 -0
  124. package/dist/server/pages.js.map +1 -1
  125. package/dist/styles.css +45 -0
  126. package/dist/version.js +1 -1
  127. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/schema/blocks.ts"],"sourcesContent":["import * as z from \"zod/mini\";\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.optional(z.enum([\"none\", \"sm\", \"md\", \"lg\", \"xl\"])),\n background: z.optional(z.string().check(z.maxLength(40))),\n width: z.optional(z.enum([\"container\", \"full\", \"narrow\"])),\n align: z.optional(z.enum([\"left\", \"center\", \"right\"])),\n anchorId: z.optional(z.string().check(z.maxLength(60))),\n /** Subtiele binnenkomst-animatie bij scrollen (progressief + respecteert reduced-motion). */\n animate: z.optional(z.enum([\"fade\", \"up\"])),\n});\nexport type BlockStyle = z.infer<typeof BlockStyleSchema>;\n\nexport const blockBase = {\n _key: z.string().check(z.minLength(1)).check(z.maxLength(64)),\n /** Optionele gedeelde blokstijl (ruimte/achtergrond/breedte/uitlijning/anker). */\n _style: z.optional(BlockStyleSchema),\n};\n\n/** Losse vorm voor onbekende/klant-blokken: alleen _key + _type vereist, rest vrij. */\nexport const BlockBaseSchema = z.looseObject({ ...blockBase, _type: z.string().check(z.minLength(1)).check(z.maxLength(60)) });\nexport type BlockBase = z.infer<typeof BlockBaseSchema>;\n\n/** Korte, veilige id voor verwijzingen naar media-items / overige refs. */\nconst ref = z.string().check(z.maxLength(256));\nconst richText = z.string().check(z.maxLength(100_000)); // gesanitizede HTML (zie server/sanitize.ts)\nconst shortText = z.string().check(z.maxLength(2000));\n\n/** Knop met label, link en stijlvariant (gedeeld door hero/cta). */\nconst ButtonSchema = z.object({\n label: z._default(shortText, \"\"),\n href: z._default(z.string().check(z.maxLength(2000)), \"#\"),\n variant: z._default(z.enum([\"primary\", \"secondary\", \"outline\"]), \"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: z.optional(shortText).register(z.globalRegistry, { description: \"Regeltje boven de titel\" }),\n title: z._default(shortText, \"\"),\n subtitle: z.optional(shortText),\n imageUrl: z.optional(z.string().check(z.maxLength(2000))),\n /** Videoachtergrond (mp4/webm); overschrijft de afbeelding als gezet. */\n videoUrl: z.optional(z.string().check(z.maxLength(2000))),\n /** Kopniveau: \"1\" voor dé hoofdkop; \"2\" voor een tweede hero op dezelfde pagina\n * (twee h1's = slechte SEO/a11y). */\n headingLevel: z._default(z.enum([\"1\", \"2\"]), \"1\").register(z.globalRegistry, { description: \"Kopniveau (h1/h2)\" }),\n align: z._default(z.enum([\"left\", \"center\"]), \"left\"),\n /** Verticale uitlijning van de inhoud binnen de hero. */\n vAlign: z._default(z.enum([\"top\", \"center\", \"bottom\"]), \"center\"),\n /** Hoogte: sm/md/lg of volledige viewport. */\n minHeight: z._default(z.enum([\"auto\", \"sm\", \"md\", \"lg\", \"full\"]), \"auto\"),\n /** Donkere/gekleurde overlay over het beeld voor leesbaar contrast. */\n overlayColor: z.optional(z.string().check(z.maxLength(40))),\n overlayOpacity: z._default(z.number().check(z.minimum(0)).check(z.maximum(100)), 0),\n /** Gradient-overlay (donker onderaan → transparant boven) voor leesbare tekst op foto's. */\n overlayGradient: z._default(z.boolean(), false).register(z.globalRegistry, { description: \"Gradient-overlay\" }),\n /** Ingebouwde call-to-action-knoppen. */\n buttons: z._default(z.array(ButtonSchema).check(z.maxLength(3)), []),\n});\n\nexport const RichTextBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"richText\"),\n html: z._default(richText, \"\"),\n});\n\nexport const ImageBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"image\"),\n url: z.optional(z.string().check(z.maxLength(2000))),\n alt: z._default(shortText, \"\"),\n caption: z.optional(shortText),\n /** Maak de afbeelding klikbaar. */\n href: z.optional(z.string().check(z.maxLength(2000))),\n /** Uitlijning binnen de kolom. */\n align: z._default(z.enum([\"left\", \"center\", \"right\"]), \"center\"),\n /** Forceer een beeldverhouding (anders natuurlijk). */\n aspectRatio: z._default(z.enum([\"auto\", \"16/9\", \"4/3\", \"1/1\", \"3/2\"]), \"auto\"),\n});\n\nexport const GalleryBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"gallery\"),\n items: z._default(z.array(z.object({\n url: z.optional(z.string().check(z.maxLength(2000))),\n alt: z._default(shortText, \"\"),\n // Update-veilig toegevoegd (Galerij+): optioneel bijschrift onder de foto / in de lightbox.\n caption: z.optional(shortText),\n /** Categorie/label voor de filterbalk (bv. \"tuinen\", \"bestrating\"). */\n tag: z.optional(shortText),\n })).check(z.maxLength(60)), []),\n /** Filterbalk op item-tags tonen (alleen zichtbaar als er tags zijn). */\n showFilter: z._default(z.boolean(), false).register(z.globalRegistry, { description: \"Filterbalk op tags\" }),\n /** Aantal kolommen in het grid (0 = volg de module-instelling). */\n columns: z._default(z.int().check(z.minimum(0)).check(z.maximum(6)), 0),\n /** Klikken opent een lightbox (0 = volg de module-instelling). */\n lightbox: z._default(z.enum([\"inherit\", \"on\", \"off\"]), \"inherit\"),\n /** Beeldverhouding van de thumbnails. \"auto\" behoudt de eigen verhouding. */\n aspectRatio: z._default(z.enum([\"1/1\", \"4/3\", \"3/2\", \"16/9\", \"auto\"]), \"1/1\"),\n});\n\nexport const CtaBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"cta\"),\n title: z._default(shortText, \"\"),\n text: z.optional(shortText),\n buttonLabel: z._default(shortText, \"Neem contact op\"),\n buttonHref: z._default(z.string().check(z.maxLength(2000)), \"#contact\"),\n /** Stijl van de hoofdknop. */\n buttonVariant: z._default(z.enum([\"primary\", \"secondary\", \"outline\"]), \"primary\"),\n /** Optionele tweede knop. */\n button2Label: z.optional(shortText),\n button2Href: z.optional(z.string().check(z.maxLength(2000))),\n /** Achtergrondkleur (CSS-waarde); leeg = thema-default. */\n backgroundColor: z.optional(z.string().check(z.maxLength(40))),\n /** Toon de CTA als vaste balk onderaan het scherm (sticky). */\n sticky: z._default(z.boolean(), false),\n});\n\nexport const FaqBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"faq\"),\n heading: z.optional(shortText),\n items: z._default(z.array(z.object({\n q: z._default(shortText, \"\"),\n a: z._default(shortText, \"\"),\n /** Optioneel rich-text-antwoord (HTML, met links/lijsten); wint van `a` als gezet. */\n aHtml: z.optional(richText),\n })).check(z.maxLength(50)), []),\n /** FAQ+: toon een zoekveld dat de vragen filtert (handig bij lange lijsten). */\n searchable: z._default(z.boolean(), false),\n /** FAQ+: voeg FAQPage-JSON-LD toe voor rich results in Google. */\n jsonLd: z._default(z.boolean(), false),\n /** Of items standaard open staan. Default dicht (gebruikelijke FAQ-UX). */\n defaultOpen: z._default(z.boolean(), false),\n});\n\nexport const OpeningHoursBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"openingHours\"),\n heading: z.optional(shortText),\n rows: z._default(z.array(z.object({ day: z._default(shortText, \"\"), hours: z._default(shortText, \"\") })).check(z.maxLength(14)), []),\n /** Live \"Nu geopend/gesloten\"-badge (werkt bij herkenbare tijden zoals \"09:00 – 17:00\"). */\n showStatus: z._default(z.boolean(), false).register(z.globalRegistry, { description: \"'Nu geopend'-badge tonen\" }),\n /** OpeningHoursSpecification-JSON-LD voor zoekmachines. */\n jsonLd: z._default(z.boolean(), false).register(z.globalRegistry, { description: \"JSON-LD (openingstijden)\" }),\n});\n\nexport const PricingBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"pricing\"),\n heading: z.optional(shortText),\n items: z._default(z.array(z.object({\n label: z._default(shortText, \"\"),\n price: z._default(shortText, \"\"),\n detail: z.optional(shortText),\n /** Inbegrepen features (lijst met vinkjes). */\n features: z.optional(z.array(shortText).check(z.maxLength(20))),\n /** Per-tier knop. */\n ctaLabel: z.optional(shortText),\n ctaHref: z.optional(z.string().check(z.maxLength(2000))),\n /** Markeer als uitgelichte tier. */\n highlighted: z._default(z.boolean(), false),\n /** bv. \"/maand\". */\n billingPeriod: z.optional(shortText),\n })).check(z.maxLength(30)), []),\n note: z.optional(shortText),\n /** ISO-valutacode voor de JSON-LD (bv. \"EUR\", \"USD\"). */\n currency: z._default(z.string().check(z.maxLength(8)), \"EUR\").register(z.globalRegistry, { description: \"Valuta (ISO-code)\" }),\n /** Voeg Product/Offer-JSON-LD toe. */\n jsonLd: z._default(z.boolean(), false),\n});\n\nexport const NewsListBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"newsList\"),\n heading: z.optional(shortText),\n limit: z._default(z.int().check(z.minimum(1)).check(z.maximum(50)), 6),\n /** Toon eerst dit aantal en de rest via \"Meer laden\" (0 = alles ineens, huidig gedrag). */\n pageSize: z._default(z.int().check(z.minimum(0)).check(z.maximum(24)), 0).register(z.globalRegistry, { description: \"Per pagina (0 = alles)\" }),\n basePath: z._default(z.string().check(z.maxLength(200)), \"/nieuws\"),\n});\n\nexport const FormBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"form\"),\n formId: ref,\n heading: z.optional(shortText),\n});\n\nexport const SpacerBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"spacer\"),\n size: z._default(z.enum([\"sm\", \"md\", \"lg\", \"xl\"]), \"md\"),\n});\n\nexport const TestimonialsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"testimonials\"),\n heading: z.optional(shortText),\n items: z._default(z.array(z.object({\n quote: z._default(shortText, \"\"),\n author: z._default(shortText, \"\"),\n role: z.optional(shortText),\n rating: z.optional(z.int().check(z.minimum(1)).check(z.maximum(5))),\n avatarUrl: z.optional(z.string().check(z.maxLength(2000))),\n })).check(z.maxLength(40)), []),\n /** Weergave: lijst (kaarten) of grid. */\n layout: z._default(z.enum([\"list\", \"grid\"]), \"grid\"),\n /** Voeg Review-JSON-LD toe (rich results). */\n jsonLd: z._default(z.boolean(), false),\n});\n\nexport const TeamBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"team\"),\n heading: z.optional(shortText),\n members: z._default(z.array(z.object({\n name: z._default(shortText, \"\"),\n role: z.optional(shortText),\n photoUrl: z.optional(z.string().check(z.maxLength(2000))),\n bio: z.optional(shortText),\n email: z.optional(z.string().check(z.maxLength(320))),\n phone: z.optional(shortText),\n social: z.optional(z.array(z.object({ platform: shortText, href: z.string().check(z.maxLength(2000)) })).check(z.maxLength(6))),\n /** Afdeling/team voor groepering (bv. \"Keuken\", \"Bediening\"). */\n department: z.optional(shortText),\n })).check(z.maxLength(60)), []),\n /** Voeg Person-JSON-LD per lid toe. */\n jsonLd: z._default(z.boolean(), false),\n /** Groepeer leden per afdeling (kopje per afdeling). */\n groupByDepartment: z._default(z.boolean(), false).register(z.globalRegistry, { description: \"Groeperen per afdeling\" }),\n});\n\nexport const AgendaBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"agenda\"),\n heading: z.optional(shortText),\n events: z._default(z.array(z.object({\n title: z._default(shortText, \"\"),\n /** ISO-datum of -datetime, bv. \"2026-07-01\" of \"2026-07-01T19:30\". */\n start: z._default(z.string().check(z.maxLength(40)), \"\"),\n end: z.optional(z.string().check(z.maxLength(40))),\n location: z.optional(shortText),\n description: z.optional(shortText),\n url: z.optional(z.string().check(z.maxLength(2000))),\n })).check(z.maxLength(100)), []),\n /** Verberg events waarvan de startdatum in het verleden ligt. */\n hidePast: z._default(z.boolean(), true),\n /** Voeg Event-JSON-LD toe. */\n jsonLd: z._default(z.boolean(), false),\n});\n\nexport const SearchBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"search\"),\n placeholder: z._default(shortText, \"Zoeken…\"),\n /** Ook nieuwsartikelen doorzoeken (naast pagina's). */\n includeNews: z._default(z.boolean(), true),\n});\n\nexport const VideoBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"video\"),\n provider: z._default(z.enum([\"youtube\", \"vimeo\", \"file\"]), \"youtube\"),\n /** YouTube/Vimeo-id of -URL, of een mp4/webm-URL bij \"file\". */\n src: z._default(z.string().check(z.maxLength(2000)), \"\"),\n title: z.optional(shortText),\n caption: z.optional(shortText),\n /** Voorvertoningsbeeld (bij provider \"file\" als poster; met facade ook voor embeds). */\n posterUrl: z.optional(z.string().check(z.maxLength(2000))).register(z.globalRegistry, { description: \"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._default(z.boolean(), false).register(z.globalRegistry, { description: \"Click-to-play (laad speler pas na klik)\" }),\n /** Toon pas na cookie-consent (categorie \"marketing\"). */\n consentGated: z._default(z.boolean(), true),\n});\n\nexport const FeatureBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"feature\"),\n heading: z.optional(shortText),\n /** Rich text (veldnaam \"html\" zodat het server-side gesanitized wordt bij publiceren). */\n html: z._default(richText, \"\"),\n imageUrl: z.optional(z.string().check(z.maxLength(2000))),\n imagePosition: z._default(z.enum([\"left\", \"right\"]), \"left\"),\n buttonLabel: z.optional(shortText),\n buttonHref: z.optional(z.string().check(z.maxLength(2000))),\n});\n\nexport const BannerBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"banner\"),\n text: z._default(shortText, \"\"),\n href: z.optional(z.string().check(z.maxLength(2000))),\n linkLabel: z.optional(shortText),\n tone: z._default(z.enum([\"info\", \"success\", \"warning\"]), \"info\"),\n dismissible: z._default(z.boolean(), true),\n /** Wijzig deze waarde (bv. \"2\") als de tekst verandert — wie de oude balk wegklikte ziet de nieuwe weer. */\n dismissVersion: z.optional(shortText).register(z.globalRegistry, { description: \"Versie (wijzig om balk opnieuw te tonen)\" }),\n});\n\nexport const CountersBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"counters\"),\n heading: z.optional(shortText),\n items: z._default(z.array(z.object({ value: z._default(shortText, \"\"), label: z._default(shortText, \"\"), prefix: z.optional(shortText), suffix: z.optional(shortText) })).check(z.maxLength(8)), []),\n /** Tel omhoog wanneer het blok in beeld scrolt (respecteert prefers-reduced-motion). */\n animate: z._default(z.boolean(), true).register(z.globalRegistry, { description: \"Tel-animatie\" }),\n});\n\nexport const LogosBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"logos\"),\n heading: z.optional(shortText),\n items: z._default(z.array(z.object({ src: z._default(z.string().check(z.maxLength(2000)), \"\"), alt: z._default(shortText, \"\"), href: z.optional(z.string().check(z.maxLength(2000))) })).check(z.maxLength(40)), []),\n grayscale: z._default(z.boolean(), true),\n /** Doorlopende band (marquee) i.p.v. statische rij; pauzeert bij hover, statisch bij reduced-motion. */\n marquee: z._default(z.boolean(), false).register(z.globalRegistry, { description: \"Doorlopende band\" }),\n});\n\nexport const TimelineBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"timeline\"),\n heading: z.optional(shortText),\n items: z._default(z.array(z.object({ title: z._default(shortText, \"\"), date: z.optional(shortText), text: z.optional(shortText), icon: z.optional(shortText) })).check(z.maxLength(40)), []),\n /** Alternerende links/rechts-layout op bredere schermen. */\n alternate: z._default(z.boolean(), false).register(z.globalRegistry, { description: \"Alternerende layout\" }),\n});\n\nexport const ContactBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"contact\"),\n heading: z.optional(shortText),\n address: z.optional(shortText),\n phone: z.optional(shortText),\n email: z.optional(z.string().check(z.maxLength(320))),\n hours: z.optional(shortText),\n /** Coördinaten voor de JSON-LD (Google toont het bedrijf dan op de juiste plek). */\n geo: z.optional(z.object({ lat: z.number().check(z.minimum(-90)).check(z.maximum(90)), lng: z.number().check(z.minimum(-180)).check(z.maximum(180)) })),\n /** Voeg ContactPoint/LocalBusiness-JSON-LD toe. */\n jsonLd: z._default(z.boolean(), false),\n});\n\nexport const MapBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"map\"),\n provider: z._default(z.enum([\"osm\", \"google\"]), \"osm\"),\n /** Adres/zoekterm (osm, legacy-fallback) of volledige embed-URL (google). */\n query: z._default(shortText, \"\"),\n /** OSM-coördinaten; hieruit + zoom bouwt de render een echte bbox (geen wereldkaart meer). */\n lat: z.optional(z.number().check(z.minimum(-90)).check(z.maximum(90))).register(z.globalRegistry, { description: \"Breedtegraad (lat)\" }),\n lng: z.optional(z.number().check(z.minimum(-180)).check(z.maximum(180))).register(z.globalRegistry, { description: \"Lengtegraad (lng)\" }),\n zoom: z._default(z.int().check(z.minimum(1)).check(z.maximum(20)), 14),\n height: z._default(z.int().check(z.minimum(150)).check(z.maximum(800)), 360),\n consentGated: z._default(z.boolean(), true),\n});\n\nexport const SocialBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"social\"),\n heading: z.optional(shortText),\n items: z._default(z.array(z.object({ platform: z._default(shortText, \"\"), href: z._default(z.string().check(z.maxLength(2000)), \"\") })).check(z.maxLength(12)), []),\n});\n\nexport const NewsletterBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"newsletter\"),\n heading: z.optional(shortText),\n text: z.optional(shortText),\n buttonLabel: z._default(shortText, \"Aanmelden\"),\n /** Waar het e-mailadres heen gaat (extern aanmeld-endpoint, POST email). Leeg = XiCMS-formulier. */\n actionUrl: z.optional(z.string().check(z.maxLength(2000))),\n /** Formulier-id voor opslag via XiCMS (als actionUrl leeg is). */\n formId: z.optional(ref),\n /** AVG: indien gezet verschijnt een verplichte akkoord-checkbox met deze tekst. */\n consentText: z.optional(shortText).register(z.globalRegistry, { description: \"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: z.optional(shortText),\n /** Welk reserveersysteem; bepaalt de embed-helper en uitleg in de editor. */\n provider: z._default(BookingProviderSchema, \"custom\"),\n /** Embed-URL of account/slug bij een preset-provider (bv. Calendly-link, Formitable-restaurant-id). */\n embedUrl: z._default(z.string().check(z.maxLength(2000)), \"\"),\n height: z._default(z.int().check(z.minimum(300)).check(z.maximum(1200)), 630),\n consentGated: z._default(z.boolean(), true),\n});\n\nexport const ButtonsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"buttons\"),\n align: z._default(z.enum([\"left\", \"center\", \"right\"]), \"left\"),\n items: z._default(z.array(z.object({ label: z._default(shortText, \"\"), href: z._default(z.string().check(z.maxLength(2000)), \"#\"), variant: z._default(z.enum([\"primary\", \"secondary\", \"outline\"]), \"primary\") })).check(z.maxLength(6)), []),\n});\n\nexport const QuoteBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"quote\"),\n text: z._default(shortText, \"\"),\n author: z.optional(shortText),\n role: z.optional(shortText),\n});\n\nexport const DividerBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"divider\"),\n variant: z._default(z.enum([\"line\", \"dots\", \"space\"]), \"line\"),\n spacing: z._default(z.enum([\"sm\", \"md\", \"lg\"]), \"md\"),\n});\n\nexport const AccordionBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"accordion\"),\n heading: z.optional(shortText),\n items: z._default(z.array(z.object({\n title: z._default(shortText, \"\"),\n body: z._default(shortText, \"\"),\n /** Optioneel rich-text-paneel (HTML); wint van `body` als gezet. */\n bodyHtml: z.optional(richText),\n })).check(z.maxLength(50)), []),\n /** Sta toe dat meerdere panelen tegelijk open staan. */\n multiple: z._default(z.boolean(), false),\n});\n\nexport const EmbedBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"embed\"),\n url: z._default(z.string().check(z.maxLength(2000)), \"\"),\n title: z.optional(shortText),\n height: z._default(z.int().check(z.minimum(150)).check(z.maximum(1200)), 420),\n /** Beeldverhouding; \"fixed\" gebruikt de vaste hoogte (huidig gedrag). */\n aspectRatio: z._default(z.enum([\"fixed\", \"16/9\", \"4/3\", \"1/1\"]), \"fixed\").register(z.globalRegistry, { description: \"Beeldverhouding\" }),\n /** Toon pas na cookie-toestemming (categorie \"marketing\"). */\n consentGated: z._default(z.boolean(), true),\n});\n\nexport const ColumnsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"columns\"),\n columns: z._default(z.array(z.object({ blocks: z._default(z.array(BlockBaseSchema).check(z.maxLength(50)), []) })).check(z.minLength(1)).check(z.maxLength(4)), []),\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._default(z.array(BlockBaseSchema).check(z.maxLength(50)), []),\n aside: z._default(z.array(BlockBaseSchema).check(z.maxLength(30)), []),\n side: z._default(z.enum([\"left\", \"right\"]), \"right\"),\n sidebarWidth: z._default(z.enum([\"sm\", \"md\", \"lg\"]), \"md\"),\n sticky: z._default(z.boolean(), 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._default(z.array(z.object({ label: z._default(shortText, \"Tab\"), blocks: z._default(z.array(BlockBaseSchema).check(z.maxLength(30)), []) })).check(z.minLength(1)).check(z.maxLength(10)), []),\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: z.optional(shortText),\n intro: z.optional(shortText),\n columns: z._default(z.int().check(z.minimum(1)).check(z.maximum(4)), 3),\n /** \"cover\" = beeld edge-to-edge bovenaan de kaart (postkaart-stijl); \"inset\" = ingekaderd. */\n imageStyle: z._default(z.enum([\"inset\", \"cover\"]), \"inset\"),\n items: z._default(z.array(z.object({\n icon: z.optional(shortText),\n imageUrl: z.optional(z.string().check(z.maxLength(2000))),\n title: z._default(shortText, \"\"),\n text: z.optional(shortText),\n href: z.optional(z.string().check(z.maxLength(2000))),\n linkLabel: z.optional(shortText),\n /** Uitgelichte kaart (accentrand + subtiele schaal). */\n featured: z._default(z.boolean(), false),\n })).check(z.maxLength(24)), []),\n});\n\n/** Downloadbare documenten (brochures, prijslijsten, voorwaarden). */\nexport const DownloadsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"downloads\"),\n heading: z.optional(shortText),\n items: z._default(z.array(z.object({ label: z._default(shortText, \"\"), href: z._default(z.string().check(z.maxLength(2000)), \"\"), meta: z.optional(shortText) })).check(z.maxLength(60)), []),\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: z.optional(shortText),\n /** Eén of meer PDF's; bij meerdere verschijnen tabs (label) om te wisselen. */\n documents: z._default(z.array(z.object({ label: z._default(shortText, \"\"), url: z._default(z.string().check(z.maxLength(2000)), \"\") })).check(z.maxLength(12)), []),\n height: z._default(z.int().check(z.minimum(300)).check(z.maximum(1600)), 820),\n /** Toon een \"Open/Download\"-link onder de viewer. */\n showDownload: z._default(z.boolean(), 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: z.optional(shortText),\n /** ISO-datetime, bv. \"2026-12-31T23:59\". */\n target: z._default(z.string().check(z.maxLength(40)), \"\"),\n expiredText: z._default(shortText, \"Het is zover!\"),\n showLabels: z._default(z.boolean(), true),\n /** Wat er gebeurt als de teller afloopt: melding tonen of het hele blok verbergen. */\n onExpire: z._default(z.enum([\"message\", \"hide\"]), \"message\").register(z.globalRegistry, { description: \"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._default(z.array(z.object({\n imageUrl: z.optional(z.string().check(z.maxLength(2000))),\n alt: z._default(shortText, \"\"),\n caption: z.optional(shortText),\n href: z.optional(z.string().check(z.maxLength(2000))),\n })).check(z.maxLength(20)), []),\n autoplay: z._default(z.boolean(), false),\n /** Interval in seconden bij autoplay. */\n interval: z._default(z.int().check(z.minimum(2)).check(z.maximum(20)), 5),\n showDots: z._default(z.boolean(), true),\n showArrows: z._default(z.boolean(), true),\n aspectRatio: z._default(z.enum([\"16/9\", \"4/3\", \"3/2\", \"1/1\", \"21/9\"]), \"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: z._default(shortText, \"\").register(z.globalRegistry, { description: \"Telefoonnummer (internationaal)\" }),\n /** Vooringevuld bericht in WhatsApp. */\n prefilledText: z.optional(shortText).register(z.globalRegistry, { description: \"Vooringevuld bericht\" }),\n /** Tekstlabel naast het icoon (leeg = alleen icoon). */\n label: z.optional(shortText).register(z.globalRegistry, { description: \"Label (optioneel)\" }),\n position: z._default(z.enum([\"br\", \"bl\"]), \"br\").register(z.globalRegistry, { description: \"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: z.optional(shortText),\n beforeUrl: z._default(z.string().check(z.maxLength(2000)), \"\"),\n afterUrl: z._default(z.string().check(z.maxLength(2000)), \"\"),\n beforeLabel: z._default(shortText, \"Voor\"),\n afterLabel: z._default(shortText, \"Na\"),\n alt: z._default(shortText, \"\"),\n aspectRatio: z._default(z.enum([\"16/9\", \"4/3\", \"3/2\", \"1/1\"]), \"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: z.optional(shortText),\n intro: z.optional(shortText),\n columns: z._default(z.int().check(z.minimum(1)).check(z.maximum(4)), 3),\n items: z._default(z.array(z.object({\n imageUrl: z._default(z.string().check(z.maxLength(2000)), \"\"),\n title: z._default(shortText, \"\"),\n category: z.optional(shortText),\n description: z.optional(shortText),\n href: z.optional(z.string().check(z.maxLength(2000))),\n })).check(z.maxLength(60)), []),\n /** Filterbalk op categorieën (alleen zichtbaar als er categorieën zijn). */\n showFilter: z._default(z.boolean(), true).register(z.globalRegistry, { description: \"Filterbalk op categorieën\" }),\n lightbox: z._default(z.boolean(), true).register(z.globalRegistry, { description: \"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: z.optional(shortText),\n intro: z.optional(shortText),\n items: z._default(z.array(z.object({\n title: z._default(shortText, \"\"),\n location: z.optional(shortText),\n /** bv. \"Fulltime\", \"Parttime\", \"BBL\". */\n employmentType: z.optional(shortText),\n description: z.optional(shortText),\n salary: z.optional(shortText),\n applyUrl: z.optional(z.string().check(z.maxLength(2000))),\n /** ISO-datum van plaatsing (voor Google Jobs). */\n datePosted: z.optional(shortText),\n })).check(z.maxLength(30)), []),\n jsonLd: z._default(z.boolean(), true).register(z.globalRegistry, { description: \"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: z._default(shortText, \"Home\"),\n jsonLd: z._default(z.boolean(), true).register(z.globalRegistry, { description: \"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: z.optional(shortText),\n limit: z._default(z.int().check(z.minimum(1)).check(z.maximum(12)), 5),\n basePath: z._default(z.string().check(z.maxLength(200)), \"/nieuws\"),\n showImages: z._default(z.boolean(), 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: z.optional(shortText),\n limit: z._default(z.int().check(z.minimum(1)).check(z.maximum(12)), 5),\n events: z._default(z.array(z.object({\n title: z._default(shortText, \"\"),\n start: z._default(z.string().check(z.maxLength(40)), \"\"),\n end: z.optional(z.string().check(z.maxLength(40))),\n location: z.optional(shortText),\n url: z.optional(z.string().check(z.maxLength(2000))),\n })).check(z.maxLength(100)), []),\n hidePast: z._default(z.boolean(), 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: z.optional(shortText),\n rows: z._default(z.array(z.object({ day: z._default(shortText, \"\"), hours: z._default(shortText, \"\") })).check(z.maxLength(14)), []),\n highlightToday: z._default(z.boolean(), 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: z.optional(shortText),\n address: z.optional(shortText),\n phone: z.optional(shortText),\n email: z.optional(z.string().check(z.maxLength(320))),\n});\n\n/** Compacte social-iconenrij. */\nexport const SocialWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"socialWidget\"),\n heading: z.optional(shortText),\n items: z._default(z.array(z.object({ platform: z._default(shortText, \"\"), href: z._default(z.string().check(z.maxLength(2000)), \"\") })).check(z.maxLength(12)), []),\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: z.optional(shortText),\n text: z.optional(shortText),\n buttonLabel: z._default(shortText, \"Aanmelden\"),\n actionUrl: z.optional(z.string().check(z.maxLength(2000))),\n});\n\n/** Compacte call-to-action-kaart. */\nexport const CtaWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"ctaWidget\"),\n title: z._default(shortText, \"\"),\n text: z.optional(shortText),\n buttonLabel: z._default(shortText, \"Lees meer\"),\n buttonHref: z._default(z.string().check(z.maxLength(2000)), \"#\"),\n backgroundColor: z.optional(z.string().check(z.maxLength(40))),\n});\n\n/** Compacte fotostrip (zelfde items als de Galerij). */\nexport const GalleryWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"galleryWidget\"),\n heading: z.optional(shortText),\n items: z._default(z.array(z.object({ url: z.optional(z.string().check(z.maxLength(2000))), alt: z._default(shortText, \"\") })).check(z.maxLength(24)), []),\n columns: z._default(z.int().check(z.minimum(2)).check(z.maximum(4)), 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: z.optional(shortText),\n items: z._default(z.array(z.object({ quote: z._default(shortText, \"\"), author: z._default(shortText, \"\"), rating: z.optional(z.int().check(z.minimum(1)).check(z.maximum(5))) })).check(z.maxLength(20)), []),\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: z.optional(shortText),\n items: z._default(z.array(z.object({ icon: z.optional(shortText), title: z._default(shortText, \"\"), text: z.optional(shortText), href: z.optional(z.string().check(z.maxLength(2000))) })).check(z.maxLength(10)), []),\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: z.optional(shortText),\n limit: z._default(z.int().check(z.minimum(1)).check(z.maximum(12)), 5),\n items: z._default(z.array(z.object({ label: z._default(shortText, \"\"), href: z._default(z.string().check(z.maxLength(2000)), \"\"), meta: z.optional(shortText) })).check(z.maxLength(60)), []),\n});\n\n/** Compacte aftelteller. */\nexport const CountdownWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"countdownWidget\"),\n heading: z.optional(shortText),\n target: z._default(z.string().check(z.maxLength(40)), \"\"),\n expiredText: z._default(shortText, \"Het is zover!\"),\n});\n\n/** Verwijzing naar een gedeeld symbool (5.0): de sectie leeft in sites/{siteId}/symbols en\n * propageert naar élke pagina die ernaar verwijst. Loskoppelen (editor) maakt er een kloon van. */\nexport const SymbolRefBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"symbolRef\"),\n // Leeg = nog geen symbool gekozen (vers blok); render en server-expansie slaan dat stil over.\n symbolId: z._default(z.string().check(z.maxLength(120)), \"\").register(z.globalRegistry, { description: \"Symbool\" }),\n});\n\n/** Discriminated union over alle ingebouwde block-types. */\nexport const BuiltinBlockSchema = z.discriminatedUnion(\"_type\", [\n HeroBlockSchema,\n RichTextBlockSchema,\n ImageBlockSchema,\n GalleryBlockSchema,\n CtaBlockSchema,\n FaqBlockSchema,\n OpeningHoursBlockSchema,\n PricingBlockSchema,\n NewsListBlockSchema,\n FormBlockSchema,\n SpacerBlockSchema,\n ColumnsBlockSchema,\n TestimonialsBlockSchema,\n TeamBlockSchema,\n AgendaBlockSchema,\n SearchBlockSchema,\n VideoBlockSchema,\n FeatureBlockSchema,\n BannerBlockSchema,\n CountersBlockSchema,\n LogosBlockSchema,\n TimelineBlockSchema,\n ContactBlockSchema,\n MapBlockSchema,\n SocialBlockSchema,\n NewsletterBlockSchema,\n BookingBlockSchema,\n ButtonsBlockSchema,\n QuoteBlockSchema,\n DividerBlockSchema,\n AccordionBlockSchema,\n EmbedBlockSchema,\n // Indeling\n WithSidebarBlockSchema,\n SymbolRefBlockSchema,\n TabsBlockSchema,\n // Nieuwe modules\n CardsBlockSchema,\n DownloadsBlockSchema,\n PdfBlockSchema,\n CountdownBlockSchema,\n SliderBlockSchema,\n WhatsappChatBlockSchema,\n BeforeAfterBlockSchema,\n PortfolioBlockSchema,\n JobsBlockSchema,\n BreadcrumbsBlockSchema,\n // Widgets (compacte varianten)\n NewsWidgetSchema,\n AgendaWidgetSchema,\n OpeningHoursWidgetSchema,\n ContactWidgetSchema,\n SocialWidgetSchema,\n NewsletterWidgetSchema,\n CtaWidgetSchema,\n GalleryWidgetSchema,\n TestimonialsWidgetSchema,\n CardsWidgetSchema,\n DownloadsWidgetSchema,\n CountdownWidgetSchema,\n]);\nexport type BuiltinBlock = z.infer<typeof BuiltinBlockSchema>;\n\n/** Een willekeurig block (built-in of klant-specifiek). */\nexport const AnyBlockSchema = z.union([BuiltinBlockSchema, BlockBaseSchema]);\nexport type AnyBlock = z.infer<typeof AnyBlockSchema>;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/schema/blocks.ts"],"sourcesContent":["import * as z from \"zod/mini\";\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\nexport { BlockStyleSchema, blockBase, BlockBaseSchema, type BlockStyle, type BlockBase } from \"./blockBase\";\nimport { blockBase, BlockBaseSchema } from \"./blockBase\";\n\n/** Korte, veilige id voor verwijzingen naar media-items / overige refs. */\nconst ref = z.string().check(z.maxLength(256));\nconst richText = z.string().check(z.maxLength(100_000)); // gesanitizede HTML (zie server/sanitize.ts)\nconst shortText = z.string().check(z.maxLength(2000));\n\n/** Knop met label, link en stijlvariant (gedeeld door hero/cta). */\nconst ButtonSchema = z.object({\n label: z._default(shortText, \"\"),\n href: z._default(z.string().check(z.maxLength(2000)), \"#\"),\n variant: z._default(z.enum([\"primary\", \"secondary\", \"outline\"]), \"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: z.optional(shortText).register(z.globalRegistry, { description: \"Regeltje boven de titel\" }),\n title: z._default(shortText, \"\"),\n subtitle: z.optional(shortText),\n imageUrl: z.optional(z.string().check(z.maxLength(2000))),\n /** Videoachtergrond (mp4/webm); overschrijft de afbeelding als gezet. */\n videoUrl: z.optional(z.string().check(z.maxLength(2000))),\n /** Kopniveau: \"1\" voor dé hoofdkop; \"2\" voor een tweede hero op dezelfde pagina\n * (twee h1's = slechte SEO/a11y). */\n headingLevel: z._default(z.enum([\"1\", \"2\"]), \"1\").register(z.globalRegistry, { description: \"Kopniveau (h1/h2)\" }),\n align: z._default(z.enum([\"left\", \"center\"]), \"left\"),\n /** Verticale uitlijning van de inhoud binnen de hero. */\n vAlign: z._default(z.enum([\"top\", \"center\", \"bottom\"]), \"center\"),\n /** Hoogte: sm/md/lg of volledige viewport. */\n minHeight: z._default(z.enum([\"auto\", \"sm\", \"md\", \"lg\", \"full\"]), \"auto\"),\n /** Donkere/gekleurde overlay over het beeld voor leesbaar contrast. */\n overlayColor: z.optional(z.string().check(z.maxLength(40))),\n overlayOpacity: z._default(z.number().check(z.minimum(0)).check(z.maximum(100)), 0),\n /** Gradient-overlay (donker onderaan → transparant boven) voor leesbare tekst op foto's. */\n overlayGradient: z._default(z.boolean(), false).register(z.globalRegistry, { description: \"Gradient-overlay\" }),\n /** Ingebouwde call-to-action-knoppen. */\n buttons: z._default(z.array(ButtonSchema).check(z.maxLength(3)), []),\n});\n\nexport const RichTextBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"richText\"),\n html: z._default(richText, \"\"),\n});\n\nexport const ImageBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"image\"),\n url: z.optional(z.string().check(z.maxLength(2000))),\n alt: z._default(shortText, \"\"),\n caption: z.optional(shortText),\n /** Maak de afbeelding klikbaar. */\n href: z.optional(z.string().check(z.maxLength(2000))),\n /** Uitlijning binnen de kolom. */\n align: z._default(z.enum([\"left\", \"center\", \"right\"]), \"center\"),\n /** Forceer een beeldverhouding (anders natuurlijk). */\n aspectRatio: z._default(z.enum([\"auto\", \"16/9\", \"4/3\", \"1/1\", \"3/2\"]), \"auto\"),\n});\n\nexport const GalleryBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"gallery\"),\n items: z._default(z.array(z.object({\n url: z.optional(z.string().check(z.maxLength(2000))),\n alt: z._default(shortText, \"\"),\n // Update-veilig toegevoegd (Galerij+): optioneel bijschrift onder de foto / in de lightbox.\n caption: z.optional(shortText),\n /** Categorie/label voor de filterbalk (bv. \"tuinen\", \"bestrating\"). */\n tag: z.optional(shortText),\n })).check(z.maxLength(60)), []),\n /** Filterbalk op item-tags tonen (alleen zichtbaar als er tags zijn). */\n showFilter: z._default(z.boolean(), false).register(z.globalRegistry, { description: \"Filterbalk op tags\" }),\n /** Aantal kolommen in het grid (0 = volg de module-instelling). */\n columns: z._default(z.int().check(z.minimum(0)).check(z.maximum(6)), 0),\n /** Klikken opent een lightbox (0 = volg de module-instelling). */\n lightbox: z._default(z.enum([\"inherit\", \"on\", \"off\"]), \"inherit\"),\n /** Beeldverhouding van de thumbnails. \"auto\" behoudt de eigen verhouding. */\n aspectRatio: z._default(z.enum([\"1/1\", \"4/3\", \"3/2\", \"16/9\", \"auto\"]), \"1/1\"),\n});\n\nexport const CtaBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"cta\"),\n title: z._default(shortText, \"\"),\n text: z.optional(shortText),\n buttonLabel: z._default(shortText, \"Neem contact op\"),\n buttonHref: z._default(z.string().check(z.maxLength(2000)), \"#contact\"),\n /** Stijl van de hoofdknop. */\n buttonVariant: z._default(z.enum([\"primary\", \"secondary\", \"outline\"]), \"primary\"),\n /** Optionele tweede knop. */\n button2Label: z.optional(shortText),\n button2Href: z.optional(z.string().check(z.maxLength(2000))),\n /** Achtergrondkleur (CSS-waarde); leeg = thema-default. */\n backgroundColor: z.optional(z.string().check(z.maxLength(40))),\n /** Toon de CTA als vaste balk onderaan het scherm (sticky). */\n sticky: z._default(z.boolean(), false),\n});\n\nexport const FaqBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"faq\"),\n heading: z.optional(shortText),\n items: z._default(z.array(z.object({\n q: z._default(shortText, \"\"),\n a: z._default(shortText, \"\"),\n /** Optioneel rich-text-antwoord (HTML, met links/lijsten); wint van `a` als gezet. */\n aHtml: z.optional(richText),\n })).check(z.maxLength(50)), []),\n /** FAQ+: toon een zoekveld dat de vragen filtert (handig bij lange lijsten). */\n searchable: z._default(z.boolean(), false),\n /** FAQ+: voeg FAQPage-JSON-LD toe voor rich results in Google. */\n jsonLd: z._default(z.boolean(), false),\n /** Of items standaard open staan. Default dicht (gebruikelijke FAQ-UX). */\n defaultOpen: z._default(z.boolean(), false),\n});\n\nexport const OpeningHoursBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"openingHours\"),\n heading: z.optional(shortText),\n rows: z._default(z.array(z.object({ day: z._default(shortText, \"\"), hours: z._default(shortText, \"\") })).check(z.maxLength(14)), []),\n /** Live \"Nu geopend/gesloten\"-badge (werkt bij herkenbare tijden zoals \"09:00 – 17:00\"). */\n showStatus: z._default(z.boolean(), false).register(z.globalRegistry, { description: \"'Nu geopend'-badge tonen\" }),\n /** OpeningHoursSpecification-JSON-LD voor zoekmachines. */\n jsonLd: z._default(z.boolean(), false).register(z.globalRegistry, { description: \"JSON-LD (openingstijden)\" }),\n});\n\nexport const PricingBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"pricing\"),\n heading: z.optional(shortText),\n items: z._default(z.array(z.object({\n label: z._default(shortText, \"\"),\n price: z._default(shortText, \"\"),\n detail: z.optional(shortText),\n /** Inbegrepen features (lijst met vinkjes). */\n features: z.optional(z.array(shortText).check(z.maxLength(20))),\n /** Per-tier knop. */\n ctaLabel: z.optional(shortText),\n ctaHref: z.optional(z.string().check(z.maxLength(2000))),\n /** Markeer als uitgelichte tier. */\n highlighted: z._default(z.boolean(), false),\n /** bv. \"/maand\". */\n billingPeriod: z.optional(shortText),\n })).check(z.maxLength(30)), []),\n note: z.optional(shortText),\n /** ISO-valutacode voor de JSON-LD (bv. \"EUR\", \"USD\"). */\n currency: z._default(z.string().check(z.maxLength(8)), \"EUR\").register(z.globalRegistry, { description: \"Valuta (ISO-code)\" }),\n /** Voeg Product/Offer-JSON-LD toe. */\n jsonLd: z._default(z.boolean(), false),\n});\n\nexport const NewsListBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"newsList\"),\n heading: z.optional(shortText),\n limit: z._default(z.int().check(z.minimum(1)).check(z.maximum(50)), 6),\n /** Toon eerst dit aantal en de rest via \"Meer laden\" (0 = alles ineens, huidig gedrag). */\n pageSize: z._default(z.int().check(z.minimum(0)).check(z.maximum(24)), 0).register(z.globalRegistry, { description: \"Per pagina (0 = alles)\" }),\n basePath: z._default(z.string().check(z.maxLength(200)), \"/nieuws\"),\n});\n\nexport const FormBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"form\"),\n formId: ref,\n heading: z.optional(shortText),\n});\n\nexport const SpacerBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"spacer\"),\n size: z._default(z.enum([\"sm\", \"md\", \"lg\", \"xl\"]), \"md\"),\n});\n\nexport const TestimonialsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"testimonials\"),\n heading: z.optional(shortText),\n items: z._default(z.array(z.object({\n quote: z._default(shortText, \"\"),\n author: z._default(shortText, \"\"),\n role: z.optional(shortText),\n rating: z.optional(z.int().check(z.minimum(1)).check(z.maximum(5))),\n avatarUrl: z.optional(z.string().check(z.maxLength(2000))),\n })).check(z.maxLength(40)), []),\n /** Weergave: lijst (kaarten) of grid. */\n layout: z._default(z.enum([\"list\", \"grid\"]), \"grid\"),\n /** Voeg Review-JSON-LD toe (rich results). */\n jsonLd: z._default(z.boolean(), false),\n});\n\nexport const TeamBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"team\"),\n heading: z.optional(shortText),\n members: z._default(z.array(z.object({\n name: z._default(shortText, \"\"),\n role: z.optional(shortText),\n photoUrl: z.optional(z.string().check(z.maxLength(2000))),\n bio: z.optional(shortText),\n email: z.optional(z.string().check(z.maxLength(320))),\n phone: z.optional(shortText),\n social: z.optional(z.array(z.object({ platform: shortText, href: z.string().check(z.maxLength(2000)) })).check(z.maxLength(6))),\n /** Afdeling/team voor groepering (bv. \"Keuken\", \"Bediening\"). */\n department: z.optional(shortText),\n })).check(z.maxLength(60)), []),\n /** Voeg Person-JSON-LD per lid toe. */\n jsonLd: z._default(z.boolean(), false),\n /** Groepeer leden per afdeling (kopje per afdeling). */\n groupByDepartment: z._default(z.boolean(), false).register(z.globalRegistry, { description: \"Groeperen per afdeling\" }),\n});\n\nexport const AgendaBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"agenda\"),\n heading: z.optional(shortText),\n events: z._default(z.array(z.object({\n title: z._default(shortText, \"\"),\n /** ISO-datum of -datetime, bv. \"2026-07-01\" of \"2026-07-01T19:30\". */\n start: z._default(z.string().check(z.maxLength(40)), \"\"),\n end: z.optional(z.string().check(z.maxLength(40))),\n location: z.optional(shortText),\n description: z.optional(shortText),\n url: z.optional(z.string().check(z.maxLength(2000))),\n })).check(z.maxLength(100)), []),\n /** Verberg events waarvan de startdatum in het verleden ligt. */\n hidePast: z._default(z.boolean(), true),\n /** Voeg Event-JSON-LD toe. */\n jsonLd: z._default(z.boolean(), false),\n});\n\nexport const SearchBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"search\"),\n placeholder: z._default(shortText, \"Zoeken…\"),\n /** Ook nieuwsartikelen doorzoeken (naast pagina's). */\n includeNews: z._default(z.boolean(), true),\n});\n\nexport const VideoBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"video\"),\n provider: z._default(z.enum([\"youtube\", \"vimeo\", \"file\"]), \"youtube\"),\n /** YouTube/Vimeo-id of -URL, of een mp4/webm-URL bij \"file\". */\n src: z._default(z.string().check(z.maxLength(2000)), \"\"),\n title: z.optional(shortText),\n caption: z.optional(shortText),\n /** Voorvertoningsbeeld (bij provider \"file\" als poster; met facade ook voor embeds). */\n posterUrl: z.optional(z.string().check(z.maxLength(2000))).register(z.globalRegistry, { description: \"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._default(z.boolean(), false).register(z.globalRegistry, { description: \"Click-to-play (laad speler pas na klik)\" }),\n /** Toon pas na cookie-consent (categorie \"marketing\"). */\n consentGated: z._default(z.boolean(), true),\n});\n\nexport const FeatureBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"feature\"),\n heading: z.optional(shortText),\n /** Rich text (veldnaam \"html\" zodat het server-side gesanitized wordt bij publiceren). */\n html: z._default(richText, \"\"),\n imageUrl: z.optional(z.string().check(z.maxLength(2000))),\n imagePosition: z._default(z.enum([\"left\", \"right\"]), \"left\"),\n buttonLabel: z.optional(shortText),\n buttonHref: z.optional(z.string().check(z.maxLength(2000))),\n});\n\nexport const BannerBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"banner\"),\n text: z._default(shortText, \"\"),\n href: z.optional(z.string().check(z.maxLength(2000))),\n linkLabel: z.optional(shortText),\n tone: z._default(z.enum([\"info\", \"success\", \"warning\"]), \"info\"),\n dismissible: z._default(z.boolean(), true),\n /** Wijzig deze waarde (bv. \"2\") als de tekst verandert — wie de oude balk wegklikte ziet de nieuwe weer. */\n dismissVersion: z.optional(shortText).register(z.globalRegistry, { description: \"Versie (wijzig om balk opnieuw te tonen)\" }),\n});\n\nexport const CountersBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"counters\"),\n heading: z.optional(shortText),\n items: z._default(z.array(z.object({ value: z._default(shortText, \"\"), label: z._default(shortText, \"\"), prefix: z.optional(shortText), suffix: z.optional(shortText) })).check(z.maxLength(8)), []),\n /** Tel omhoog wanneer het blok in beeld scrolt (respecteert prefers-reduced-motion). */\n animate: z._default(z.boolean(), true).register(z.globalRegistry, { description: \"Tel-animatie\" }),\n});\n\nexport const LogosBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"logos\"),\n heading: z.optional(shortText),\n items: z._default(z.array(z.object({ src: z._default(z.string().check(z.maxLength(2000)), \"\"), alt: z._default(shortText, \"\"), href: z.optional(z.string().check(z.maxLength(2000))) })).check(z.maxLength(40)), []),\n grayscale: z._default(z.boolean(), true),\n /** Doorlopende band (marquee) i.p.v. statische rij; pauzeert bij hover, statisch bij reduced-motion. */\n marquee: z._default(z.boolean(), false).register(z.globalRegistry, { description: \"Doorlopende band\" }),\n});\n\nexport const TimelineBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"timeline\"),\n heading: z.optional(shortText),\n items: z._default(z.array(z.object({ title: z._default(shortText, \"\"), date: z.optional(shortText), text: z.optional(shortText), icon: z.optional(shortText) })).check(z.maxLength(40)), []),\n /** Alternerende links/rechts-layout op bredere schermen. */\n alternate: z._default(z.boolean(), false).register(z.globalRegistry, { description: \"Alternerende layout\" }),\n});\n\nexport const ContactBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"contact\"),\n heading: z.optional(shortText),\n address: z.optional(shortText),\n phone: z.optional(shortText),\n email: z.optional(z.string().check(z.maxLength(320))),\n hours: z.optional(shortText),\n /** Coördinaten voor de JSON-LD (Google toont het bedrijf dan op de juiste plek). */\n geo: z.optional(z.object({ lat: z.number().check(z.minimum(-90)).check(z.maximum(90)), lng: z.number().check(z.minimum(-180)).check(z.maximum(180)) })),\n /** Voeg ContactPoint/LocalBusiness-JSON-LD toe. */\n jsonLd: z._default(z.boolean(), false),\n});\n\nexport const MapBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"map\"),\n provider: z._default(z.enum([\"osm\", \"google\"]), \"osm\"),\n /** Adres/zoekterm (osm, legacy-fallback) of volledige embed-URL (google). */\n query: z._default(shortText, \"\"),\n /** OSM-coördinaten; hieruit + zoom bouwt de render een echte bbox (geen wereldkaart meer). */\n lat: z.optional(z.number().check(z.minimum(-90)).check(z.maximum(90))).register(z.globalRegistry, { description: \"Breedtegraad (lat)\" }),\n lng: z.optional(z.number().check(z.minimum(-180)).check(z.maximum(180))).register(z.globalRegistry, { description: \"Lengtegraad (lng)\" }),\n zoom: z._default(z.int().check(z.minimum(1)).check(z.maximum(20)), 14),\n height: z._default(z.int().check(z.minimum(150)).check(z.maximum(800)), 360),\n consentGated: z._default(z.boolean(), true),\n});\n\nexport const SocialBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"social\"),\n heading: z.optional(shortText),\n items: z._default(z.array(z.object({ platform: z._default(shortText, \"\"), href: z._default(z.string().check(z.maxLength(2000)), \"\") })).check(z.maxLength(12)), []),\n});\n\nexport const NewsletterBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"newsletter\"),\n heading: z.optional(shortText),\n text: z.optional(shortText),\n buttonLabel: z._default(shortText, \"Aanmelden\"),\n /** Waar het e-mailadres heen gaat (extern aanmeld-endpoint, POST email). Leeg = XiCMS-formulier. */\n actionUrl: z.optional(z.string().check(z.maxLength(2000))),\n /** Formulier-id voor opslag via XiCMS (als actionUrl leeg is). */\n formId: z.optional(ref),\n /** AVG: indien gezet verschijnt een verplichte akkoord-checkbox met deze tekst. */\n consentText: z.optional(shortText).register(z.globalRegistry, { description: \"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: z.optional(shortText),\n /** Welk reserveersysteem; bepaalt de embed-helper en uitleg in de editor. */\n provider: z._default(BookingProviderSchema, \"custom\"),\n /** Embed-URL of account/slug bij een preset-provider (bv. Calendly-link, Formitable-restaurant-id). */\n embedUrl: z._default(z.string().check(z.maxLength(2000)), \"\"),\n height: z._default(z.int().check(z.minimum(300)).check(z.maximum(1200)), 630),\n consentGated: z._default(z.boolean(), true),\n});\n\nexport const ButtonsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"buttons\"),\n align: z._default(z.enum([\"left\", \"center\", \"right\"]), \"left\"),\n items: z._default(z.array(z.object({ label: z._default(shortText, \"\"), href: z._default(z.string().check(z.maxLength(2000)), \"#\"), variant: z._default(z.enum([\"primary\", \"secondary\", \"outline\"]), \"primary\") })).check(z.maxLength(6)), []),\n});\n\nexport const QuoteBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"quote\"),\n text: z._default(shortText, \"\"),\n author: z.optional(shortText),\n role: z.optional(shortText),\n});\n\nexport const DividerBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"divider\"),\n variant: z._default(z.enum([\"line\", \"dots\", \"space\"]), \"line\"),\n spacing: z._default(z.enum([\"sm\", \"md\", \"lg\"]), \"md\"),\n});\n\nexport const AccordionBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"accordion\"),\n heading: z.optional(shortText),\n items: z._default(z.array(z.object({\n title: z._default(shortText, \"\"),\n body: z._default(shortText, \"\"),\n /** Optioneel rich-text-paneel (HTML); wint van `body` als gezet. */\n bodyHtml: z.optional(richText),\n })).check(z.maxLength(50)), []),\n /** Sta toe dat meerdere panelen tegelijk open staan. */\n multiple: z._default(z.boolean(), false),\n});\n\nexport const EmbedBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"embed\"),\n url: z._default(z.string().check(z.maxLength(2000)), \"\"),\n title: z.optional(shortText),\n height: z._default(z.int().check(z.minimum(150)).check(z.maximum(1200)), 420),\n /** Beeldverhouding; \"fixed\" gebruikt de vaste hoogte (huidig gedrag). */\n aspectRatio: z._default(z.enum([\"fixed\", \"16/9\", \"4/3\", \"1/1\"]), \"fixed\").register(z.globalRegistry, { description: \"Beeldverhouding\" }),\n /** Toon pas na cookie-toestemming (categorie \"marketing\"). */\n consentGated: z._default(z.boolean(), true),\n});\n\nexport const ColumnsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"columns\"),\n columns: z._default(z.array(z.object({ blocks: z._default(z.array(BlockBaseSchema).check(z.maxLength(50)), []) })).check(z.minLength(1)).check(z.maxLength(4)), []),\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._default(z.array(BlockBaseSchema).check(z.maxLength(50)), []),\n aside: z._default(z.array(BlockBaseSchema).check(z.maxLength(30)), []),\n side: z._default(z.enum([\"left\", \"right\"]), \"right\"),\n sidebarWidth: z._default(z.enum([\"sm\", \"md\", \"lg\"]), \"md\"),\n sticky: z._default(z.boolean(), 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._default(z.array(z.object({ label: z._default(shortText, \"Tab\"), blocks: z._default(z.array(BlockBaseSchema).check(z.maxLength(30)), []) })).check(z.minLength(1)).check(z.maxLength(10)), []),\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: z.optional(shortText),\n intro: z.optional(shortText),\n columns: z._default(z.int().check(z.minimum(1)).check(z.maximum(4)), 3),\n /** \"cover\" = beeld edge-to-edge bovenaan de kaart (postkaart-stijl); \"inset\" = ingekaderd. */\n imageStyle: z._default(z.enum([\"inset\", \"cover\"]), \"inset\"),\n items: z._default(z.array(z.object({\n icon: z.optional(shortText),\n imageUrl: z.optional(z.string().check(z.maxLength(2000))),\n title: z._default(shortText, \"\"),\n text: z.optional(shortText),\n href: z.optional(z.string().check(z.maxLength(2000))),\n linkLabel: z.optional(shortText),\n /** Uitgelichte kaart (accentrand + subtiele schaal). */\n featured: z._default(z.boolean(), false),\n })).check(z.maxLength(24)), []),\n});\n\n/** Downloadbare documenten (brochures, prijslijsten, voorwaarden). */\nexport const DownloadsBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"downloads\"),\n heading: z.optional(shortText),\n items: z._default(z.array(z.object({ label: z._default(shortText, \"\"), href: z._default(z.string().check(z.maxLength(2000)), \"\"), meta: z.optional(shortText) })).check(z.maxLength(60)), []),\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: z.optional(shortText),\n /** Eén of meer PDF's; bij meerdere verschijnen tabs (label) om te wisselen. */\n documents: z._default(z.array(z.object({ label: z._default(shortText, \"\"), url: z._default(z.string().check(z.maxLength(2000)), \"\") })).check(z.maxLength(12)), []),\n height: z._default(z.int().check(z.minimum(300)).check(z.maximum(1600)), 820),\n /** Toon een \"Open/Download\"-link onder de viewer. */\n showDownload: z._default(z.boolean(), 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: z.optional(shortText),\n /** ISO-datetime, bv. \"2026-12-31T23:59\". */\n target: z._default(z.string().check(z.maxLength(40)), \"\"),\n expiredText: z._default(shortText, \"Het is zover!\"),\n showLabels: z._default(z.boolean(), true),\n /** Wat er gebeurt als de teller afloopt: melding tonen of het hele blok verbergen. */\n onExpire: z._default(z.enum([\"message\", \"hide\"]), \"message\").register(z.globalRegistry, { description: \"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._default(z.array(z.object({\n imageUrl: z.optional(z.string().check(z.maxLength(2000))),\n alt: z._default(shortText, \"\"),\n caption: z.optional(shortText),\n href: z.optional(z.string().check(z.maxLength(2000))),\n })).check(z.maxLength(20)), []),\n autoplay: z._default(z.boolean(), false),\n /** Interval in seconden bij autoplay. */\n interval: z._default(z.int().check(z.minimum(2)).check(z.maximum(20)), 5),\n showDots: z._default(z.boolean(), true),\n showArrows: z._default(z.boolean(), true),\n aspectRatio: z._default(z.enum([\"16/9\", \"4/3\", \"3/2\", \"1/1\", \"21/9\"]), \"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: z._default(shortText, \"\").register(z.globalRegistry, { description: \"Telefoonnummer (internationaal)\" }),\n /** Vooringevuld bericht in WhatsApp. */\n prefilledText: z.optional(shortText).register(z.globalRegistry, { description: \"Vooringevuld bericht\" }),\n /** Tekstlabel naast het icoon (leeg = alleen icoon). */\n label: z.optional(shortText).register(z.globalRegistry, { description: \"Label (optioneel)\" }),\n position: z._default(z.enum([\"br\", \"bl\"]), \"br\").register(z.globalRegistry, { description: \"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: z.optional(shortText),\n beforeUrl: z._default(z.string().check(z.maxLength(2000)), \"\"),\n afterUrl: z._default(z.string().check(z.maxLength(2000)), \"\"),\n beforeLabel: z._default(shortText, \"Voor\"),\n afterLabel: z._default(shortText, \"Na\"),\n alt: z._default(shortText, \"\"),\n aspectRatio: z._default(z.enum([\"16/9\", \"4/3\", \"3/2\", \"1/1\"]), \"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: z.optional(shortText),\n intro: z.optional(shortText),\n columns: z._default(z.int().check(z.minimum(1)).check(z.maximum(4)), 3),\n items: z._default(z.array(z.object({\n imageUrl: z._default(z.string().check(z.maxLength(2000)), \"\"),\n title: z._default(shortText, \"\"),\n category: z.optional(shortText),\n description: z.optional(shortText),\n href: z.optional(z.string().check(z.maxLength(2000))),\n })).check(z.maxLength(60)), []),\n /** Filterbalk op categorieën (alleen zichtbaar als er categorieën zijn). */\n showFilter: z._default(z.boolean(), true).register(z.globalRegistry, { description: \"Filterbalk op categorieën\" }),\n lightbox: z._default(z.boolean(), true).register(z.globalRegistry, { description: \"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: z.optional(shortText),\n intro: z.optional(shortText),\n items: z._default(z.array(z.object({\n title: z._default(shortText, \"\"),\n location: z.optional(shortText),\n /** bv. \"Fulltime\", \"Parttime\", \"BBL\". */\n employmentType: z.optional(shortText),\n description: z.optional(shortText),\n salary: z.optional(shortText),\n applyUrl: z.optional(z.string().check(z.maxLength(2000))),\n /** ISO-datum van plaatsing (voor Google Jobs). */\n datePosted: z.optional(shortText),\n })).check(z.maxLength(30)), []),\n jsonLd: z._default(z.boolean(), true).register(z.globalRegistry, { description: \"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: z._default(shortText, \"Home\"),\n jsonLd: z._default(z.boolean(), true).register(z.globalRegistry, { description: \"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: z.optional(shortText),\n limit: z._default(z.int().check(z.minimum(1)).check(z.maximum(12)), 5),\n basePath: z._default(z.string().check(z.maxLength(200)), \"/nieuws\"),\n showImages: z._default(z.boolean(), 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: z.optional(shortText),\n limit: z._default(z.int().check(z.minimum(1)).check(z.maximum(12)), 5),\n events: z._default(z.array(z.object({\n title: z._default(shortText, \"\"),\n start: z._default(z.string().check(z.maxLength(40)), \"\"),\n end: z.optional(z.string().check(z.maxLength(40))),\n location: z.optional(shortText),\n url: z.optional(z.string().check(z.maxLength(2000))),\n })).check(z.maxLength(100)), []),\n hidePast: z._default(z.boolean(), 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: z.optional(shortText),\n rows: z._default(z.array(z.object({ day: z._default(shortText, \"\"), hours: z._default(shortText, \"\") })).check(z.maxLength(14)), []),\n highlightToday: z._default(z.boolean(), 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: z.optional(shortText),\n address: z.optional(shortText),\n phone: z.optional(shortText),\n email: z.optional(z.string().check(z.maxLength(320))),\n});\n\n/** Compacte social-iconenrij. */\nexport const SocialWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"socialWidget\"),\n heading: z.optional(shortText),\n items: z._default(z.array(z.object({ platform: z._default(shortText, \"\"), href: z._default(z.string().check(z.maxLength(2000)), \"\") })).check(z.maxLength(12)), []),\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: z.optional(shortText),\n text: z.optional(shortText),\n buttonLabel: z._default(shortText, \"Aanmelden\"),\n actionUrl: z.optional(z.string().check(z.maxLength(2000))),\n});\n\n/** Compacte call-to-action-kaart. */\nexport const CtaWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"ctaWidget\"),\n title: z._default(shortText, \"\"),\n text: z.optional(shortText),\n buttonLabel: z._default(shortText, \"Lees meer\"),\n buttonHref: z._default(z.string().check(z.maxLength(2000)), \"#\"),\n backgroundColor: z.optional(z.string().check(z.maxLength(40))),\n});\n\n/** Compacte fotostrip (zelfde items als de Galerij). */\nexport const GalleryWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"galleryWidget\"),\n heading: z.optional(shortText),\n items: z._default(z.array(z.object({ url: z.optional(z.string().check(z.maxLength(2000))), alt: z._default(shortText, \"\") })).check(z.maxLength(24)), []),\n columns: z._default(z.int().check(z.minimum(2)).check(z.maximum(4)), 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: z.optional(shortText),\n items: z._default(z.array(z.object({ quote: z._default(shortText, \"\"), author: z._default(shortText, \"\"), rating: z.optional(z.int().check(z.minimum(1)).check(z.maximum(5))) })).check(z.maxLength(20)), []),\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: z.optional(shortText),\n items: z._default(z.array(z.object({ icon: z.optional(shortText), title: z._default(shortText, \"\"), text: z.optional(shortText), href: z.optional(z.string().check(z.maxLength(2000))) })).check(z.maxLength(10)), []),\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: z.optional(shortText),\n limit: z._default(z.int().check(z.minimum(1)).check(z.maximum(12)), 5),\n items: z._default(z.array(z.object({ label: z._default(shortText, \"\"), href: z._default(z.string().check(z.maxLength(2000)), \"\"), meta: z.optional(shortText) })).check(z.maxLength(60)), []),\n});\n\n/** Compacte aftelteller. */\nexport const CountdownWidgetSchema = z.object({\n ...blockBase,\n _type: z.literal(\"countdownWidget\"),\n heading: z.optional(shortText),\n target: z._default(z.string().check(z.maxLength(40)), \"\"),\n expiredText: z._default(shortText, \"Het is zover!\"),\n});\n\n/** Verwijzing naar een gedeeld symbool (5.0): de sectie leeft in sites/{siteId}/symbols en\n * propageert naar élke pagina die ernaar verwijst. Loskoppelen (editor) maakt er een kloon van. */\nexport const SymbolRefBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"symbolRef\"),\n // Leeg = nog geen symbool gekozen (vers blok); render en server-expansie slaan dat stil over.\n symbolId: z._default(z.string().check(z.maxLength(120)), \"\").register(z.globalRegistry, { description: \"Symbool\" }),\n});\n\n/** Discriminated union over alle ingebouwde block-types. */\nexport const BuiltinBlockSchema = z.discriminatedUnion(\"_type\", [\n HeroBlockSchema,\n RichTextBlockSchema,\n ImageBlockSchema,\n GalleryBlockSchema,\n CtaBlockSchema,\n FaqBlockSchema,\n OpeningHoursBlockSchema,\n PricingBlockSchema,\n NewsListBlockSchema,\n FormBlockSchema,\n SpacerBlockSchema,\n ColumnsBlockSchema,\n TestimonialsBlockSchema,\n TeamBlockSchema,\n AgendaBlockSchema,\n SearchBlockSchema,\n VideoBlockSchema,\n FeatureBlockSchema,\n BannerBlockSchema,\n CountersBlockSchema,\n LogosBlockSchema,\n TimelineBlockSchema,\n ContactBlockSchema,\n MapBlockSchema,\n SocialBlockSchema,\n NewsletterBlockSchema,\n BookingBlockSchema,\n ButtonsBlockSchema,\n QuoteBlockSchema,\n DividerBlockSchema,\n AccordionBlockSchema,\n EmbedBlockSchema,\n // Indeling\n WithSidebarBlockSchema,\n SymbolRefBlockSchema,\n TabsBlockSchema,\n // Nieuwe modules\n CardsBlockSchema,\n DownloadsBlockSchema,\n PdfBlockSchema,\n CountdownBlockSchema,\n SliderBlockSchema,\n WhatsappChatBlockSchema,\n BeforeAfterBlockSchema,\n PortfolioBlockSchema,\n JobsBlockSchema,\n BreadcrumbsBlockSchema,\n // Widgets (compacte varianten)\n NewsWidgetSchema,\n AgendaWidgetSchema,\n OpeningHoursWidgetSchema,\n ContactWidgetSchema,\n SocialWidgetSchema,\n NewsletterWidgetSchema,\n CtaWidgetSchema,\n GalleryWidgetSchema,\n TestimonialsWidgetSchema,\n CardsWidgetSchema,\n DownloadsWidgetSchema,\n CountdownWidgetSchema,\n]);\nexport type BuiltinBlock = z.infer<typeof BuiltinBlockSchema>;\n\n/** Een willekeurig block (built-in of klant-specifiek). */\nexport const AnyBlockSchema = z.union([BuiltinBlockSchema, BlockBaseSchema]);\nexport type AnyBlock = z.infer<typeof AnyBlockSchema>;\n"],"mappings":"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","names":["blockBase","BlockBaseSchema"]}
@@ -1,6 +1,6 @@
1
1
  import * as z from "zod/mini";
2
2
  import { SeoSchema } from "./seo.js";
3
- import { BlockBaseSchema } from "./blocks.js";
3
+ import { BlockBaseSchema } from "./blockBase.js";
4
4
  import { TranslationsSchema } from "../i18n/overlay.js";
5
5
  const PageStatusSchema = z.enum(["draft", "published"]);
6
6
  const PageSchema = z.object({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/schema/pages.ts"],"sourcesContent":["import * as z from \"zod/mini\";\nimport { SeoSchema } from \"./seo\";\nimport { BlockBaseSchema } from \"./blocks\";\nimport { TranslationsSchema } from \"../i18n/overlay\";\n\nexport const PageStatusSchema = z.enum([\"draft\", \"published\"]);\nexport type PageStatus = z.infer<typeof PageStatusSchema>;\n\n/**\n * Een pagina: metadata + SEO + een lijst blocks. Blocks worden hier los (BlockBaseSchema)\n * gevalideerd; strikte per-type-validatie gebeurt via de registry (`validateBlocks`).\n */\nexport const PageSchema = z.object({\n /** URL-segment binnen de ouder, bv. \"over-ons\". */\n slug: z.string().check(z.minLength(1)).check(z.maxLength(120)).check(z.regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, \"slug mag alleen kleine letters, cijfers en koppeltekens bevatten\")),\n /** Volledig pad vanaf de root, bv. \"/diensten/onderhoud\". */\n path: z.string().check(z.minLength(1)).check(z.maxLength(400)),\n parentId: z._default(z.nullable(z.string().check(z.maxLength(64))), null),\n /**\n * Sorteersleutel binnen de ouder. De bovengrens stond op 100.000, maar `createPage` zet\n * `order: Date.now()` (≈1,79·10¹²) om een nieuwe pagina achteraan te zetten — die twee spraken\n * elkaar tegen. Gevolg: élke via \"+ Nieuw\" aangemaakte pagina zakte bij het LEZEN door de\n * validatie en werd stil overgeslagen (server/pages.ts), dus onzichtbaar op de publieke site én\n * afwezig in generateStaticParams. Nooit opgevallen omdat bestaande sites hun pagina's uit een\n * gezaaide bundel kregen, met nette kleine ordinalen; gevonden op de staging-deploy van groenhof.\n *\n * De grens is nu MAX_SAFE_INTEGER: `order` is puur een sorteersleutel en draagt geen\n * veiligheidsbetekenis, terwijl een te krappe grens content laat verdwijnen.\n */\n order: z._default(z.int().check(z.minimum(0)).check(z.maximum(Number.MAX_SAFE_INTEGER)), 0),\n status: z._default(PageStatusSchema, \"draft\"),\n title: z.string().check(z.minLength(1)).check(z.maxLength(200)),\n seo: z.optional(SeoSchema),\n blocks: z._default(z.array(BlockBaseSchema).check(z.maxLength(200)), []),\n /** Taal-overlay (5.0): per locale gepunte veldpaden → vertaalde tekst (zie i18n/overlay.ts). */\n translations: z.optional(TranslationsSchema),\n});\nexport type Page = z.infer<typeof PageSchema>;\n\n/** Invoer bij het aanmaken/bijwerken van een draft (geen serverside velden). */\nexport const PageDraftInputSchema = z.pick(PageSchema, {\n slug: true,\n path: true,\n parentId: true,\n order: true,\n title: true,\n seo: true,\n blocks: true,\n translations: true,\n});\nexport type PageDraftInput = z.infer<typeof PageDraftInputSchema>;\n\n/** Een versie-snapshot (history). */\nexport const PageVersionSchema = z.object({\n snapshot: PageSchema,\n kind: z.enum([\"autosave\", \"publish\", \"manual\"]),\n label: z.optional(z.string().check(z.maxLength(200))),\n});\nexport type PageVersion = z.infer<typeof PageVersionSchema>;\n"],"mappings":"AAAA,YAAY,OAAO;AACnB,SAAS,iBAAiB;AAC1B,SAAS,uBAAuB;AAChC,SAAS,0BAA0B;AAE5B,MAAM,mBAAmB,EAAE,KAAK,CAAC,SAAS,WAAW,CAAC;AAOtD,MAAM,aAAa,EAAE,OAAO;AAAA;AAAA,EAEjC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,8BAA8B,kEAAkE,CAAC;AAAA;AAAA,EAE9K,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC;AAAA,EAC7D,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,GAAG,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYxE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,OAAO,gBAAgB,CAAC,GAAG,CAAC;AAAA,EAC1F,QAAQ,EAAE,SAAS,kBAAkB,OAAO;AAAA,EAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC;AAAA,EAC9D,KAAK,EAAE,SAAS,SAAS;AAAA,EACzB,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;AAAA;AAAA,EAEvE,cAAc,EAAE,SAAS,kBAAkB;AAC7C,CAAC;AAIM,MAAM,uBAAuB,EAAE,KAAK,YAAY;AAAA,EACrD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,cAAc;AAChB,CAAC;AAIM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,UAAU;AAAA,EACV,MAAM,EAAE,KAAK,CAAC,YAAY,WAAW,QAAQ,CAAC;AAAA,EAC9C,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC,CAAC;AACtD,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../src/schema/pages.ts"],"sourcesContent":["import * as z from \"zod/mini\";\nimport { SeoSchema } from \"./seo\";\nimport { BlockBaseSchema } from \"./blockBase\";\nimport { TranslationsSchema } from \"../i18n/overlay\";\n\nexport const PageStatusSchema = z.enum([\"draft\", \"published\"]);\nexport type PageStatus = z.infer<typeof PageStatusSchema>;\n\n/**\n * Een pagina: metadata + SEO + een lijst blocks. Blocks worden hier los (BlockBaseSchema)\n * gevalideerd; strikte per-type-validatie gebeurt via de registry (`validateBlocks`).\n */\nexport const PageSchema = z.object({\n /** URL-segment binnen de ouder, bv. \"over-ons\". */\n slug: z.string().check(z.minLength(1)).check(z.maxLength(120)).check(z.regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, \"slug mag alleen kleine letters, cijfers en koppeltekens bevatten\")),\n /** Volledig pad vanaf de root, bv. \"/diensten/onderhoud\". */\n path: z.string().check(z.minLength(1)).check(z.maxLength(400)),\n parentId: z._default(z.nullable(z.string().check(z.maxLength(64))), null),\n /**\n * Sorteersleutel binnen de ouder. De bovengrens stond op 100.000, maar `createPage` zet\n * `order: Date.now()` (≈1,79·10¹²) om een nieuwe pagina achteraan te zetten — die twee spraken\n * elkaar tegen. Gevolg: élke via \"+ Nieuw\" aangemaakte pagina zakte bij het LEZEN door de\n * validatie en werd stil overgeslagen (server/pages.ts), dus onzichtbaar op de publieke site én\n * afwezig in generateStaticParams. Nooit opgevallen omdat bestaande sites hun pagina's uit een\n * gezaaide bundel kregen, met nette kleine ordinalen; gevonden op de staging-deploy van groenhof.\n *\n * De grens is nu MAX_SAFE_INTEGER: `order` is puur een sorteersleutel en draagt geen\n * veiligheidsbetekenis, terwijl een te krappe grens content laat verdwijnen.\n */\n order: z._default(z.int().check(z.minimum(0)).check(z.maximum(Number.MAX_SAFE_INTEGER)), 0),\n status: z._default(PageStatusSchema, \"draft\"),\n title: z.string().check(z.minLength(1)).check(z.maxLength(200)),\n seo: z.optional(SeoSchema),\n blocks: z._default(z.array(BlockBaseSchema).check(z.maxLength(200)), []),\n /** Taal-overlay (5.0): per locale gepunte veldpaden → vertaalde tekst (zie i18n/overlay.ts). */\n translations: z.optional(TranslationsSchema),\n});\nexport type Page = z.infer<typeof PageSchema>;\n\n/** Invoer bij het aanmaken/bijwerken van een draft (geen serverside velden). */\nexport const PageDraftInputSchema = z.pick(PageSchema, {\n slug: true,\n path: true,\n parentId: true,\n order: true,\n title: true,\n seo: true,\n blocks: true,\n translations: true,\n});\nexport type PageDraftInput = z.infer<typeof PageDraftInputSchema>;\n\n/** Een versie-snapshot (history). */\nexport const PageVersionSchema = z.object({\n snapshot: PageSchema,\n kind: z.enum([\"autosave\", \"publish\", \"manual\"]),\n label: z.optional(z.string().check(z.maxLength(200))),\n});\nexport type PageVersion = z.infer<typeof PageVersionSchema>;\n"],"mappings":"AAAA,YAAY,OAAO;AACnB,SAAS,iBAAiB;AAC1B,SAAS,uBAAuB;AAChC,SAAS,0BAA0B;AAE5B,MAAM,mBAAmB,EAAE,KAAK,CAAC,SAAS,WAAW,CAAC;AAOtD,MAAM,aAAa,EAAE,OAAO;AAAA;AAAA,EAEjC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,8BAA8B,kEAAkE,CAAC;AAAA;AAAA,EAE9K,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC;AAAA,EAC7D,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,GAAG,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYxE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,OAAO,gBAAgB,CAAC,GAAG,CAAC;AAAA,EAC1F,QAAQ,EAAE,SAAS,kBAAkB,OAAO;AAAA,EAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC;AAAA,EAC9D,KAAK,EAAE,SAAS,SAAS;AAAA,EACzB,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;AAAA;AAAA,EAEvE,cAAc,EAAE,SAAS,kBAAkB;AAC7C,CAAC;AAIM,MAAM,uBAAuB,EAAE,KAAK,YAAY;AAAA,EACrD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,cAAc;AAChB,CAAC;AAIM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,UAAU;AAAA,EACV,MAAM,EAAE,KAAK,CAAC,YAAY,WAAW,QAAQ,CAAC;AAAA,EAC9C,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC,CAAC;AACtD,CAAC;","names":[]}
@@ -1,5 +1,5 @@
1
1
  import * as z from "zod/mini";
2
- import { blockBase } from "./blocks.js";
2
+ import { blockBase } from "./blockBase.js";
3
3
  const ShopCategorySchema = z.object({
4
4
  name: z.string().check(z.minLength(1)).check(z.maxLength(120)),
5
5
  slug: z.string().check(z.minLength(1)).check(z.maxLength(120)).check(z.regex(/^[a-z0-9-]+$/, "slug: alleen kleine letters, cijfers en streepjes")),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/schema/shop.ts"],"sourcesContent":["import * as z from \"zod/mini\";\nimport { blockBase } from \"./blocks\";\n\n/**\n * Shop-schema's (5.5) — webwinkel + donaties. Pure Zod: gedeeld door core, admin en Functions.\n *\n * Datamodel per tenant:\n * sites/{siteId}/shopCategories/{id} — categorieën (editor-write, publiek leesbaar)\n * sites/{siteId}/products/{id} — producten (editor-write, publiek leesbaar als actief)\n * sites/{siteId}/orders/{id} — bestellingen (ALLEEN via Functions; editor leest,\n * en mag alleen status/verzendvelden muteren)\n * sites/{siteId}/private/shop — geheimen (Stripe-key, SMTP) — deny-all, alleen Functions\n *\n * Geld is ALTIJD een integer in centen (nooit floats). Publieke shopconfig (verzendkosten,\n * paden, donatie-grenzen) leeft in de module-settings van de `shop`-module\n * (settings/public.modules.shop.config) — zie modules/shop/module.ts.\n */\n\n/* ── Categorieën ─────────────────────────────────────────────────────────── */\n\nexport const ShopCategorySchema = z.object({\n name: z.string().check(z.minLength(1)).check(z.maxLength(120)),\n slug: z.string().check(z.minLength(1)).check(z.maxLength(120)).check(z.regex(/^[a-z0-9-]+$/, \"slug: alleen kleine letters, cijfers en streepjes\")),\n description: z.optional(z.string().check(z.maxLength(2000))),\n imageUrl: z.optional(z.string().check(z.maxLength(2000))),\n order: z._default(z.int().check(z.minimum(0)).check(z.maximum(9999)), 0),\n visible: z._default(z.boolean(), true),\n});\nexport type ShopCategory = z.infer<typeof ShopCategorySchema>;\n\n/* ── Producten ───────────────────────────────────────────────────────────── */\n\n/** Optie-as, bv. { name: \"Maat\", values: [\"56\",\"62\",\"68\",\"74\"] }. Max 3 assen per product. */\nexport const ProductOptionSchema = z.object({\n name: z.string().check(z.minLength(1)).check(z.maxLength(40)),\n values: z.array(z.string().check(z.minLength(1)).check(z.maxLength(60))).check(z.minLength(1)).check(z.maxLength(30)),\n /**\n * 5.6: afbeelding per optieWAARDE (praktijk: de kleur-as) — `{ \"Roze\": \"https://…\" }`.\n * De detailpagina wisselt het hoofdbeeld mee met de keuze; bewust per as en niet per\n * variant-combinatie (maat × kleur zou het aantal afbeeldingen laten exploderen).\n */\n images: z.optional(z.record(z.string(), z.string().check(z.maxLength(2000)))),\n});\nexport type ProductOption = z.infer<typeof ProductOptionSchema>;\n\n/**\n * Personalisatie-veld (5.6): de klant geeft eigen tekst of een eigen afbeelding op\n * (bv. \"rompertje met naam\"). Meerprijs telt server-side mee in `createOrder`.\n */\nexport const PersonalizationFieldSchema = z.object({\n key: z.string().check(z.minLength(1)).check(z.maxLength(40)).check(z.regex(/^[a-zA-Z][a-zA-Z0-9_]*$/, \"sleutel: letters/cijfers/underscore, beginnend met een letter\")),\n label: z.string().check(z.minLength(1)).check(z.maxLength(120)),\n type: z.enum([\"text\", \"image\"]),\n required: z._default(z.boolean(), false),\n /** Alleen voor type \"text\". */\n maxLength: z._default(z.int().check(z.minimum(1)).check(z.maximum(200)), 40),\n /** Meerprijs in centen (per stuk). */\n priceCents: z._default(z.int().check(z.minimum(0)).check(z.maximum(1_000_000_00)), 0),\n helpText: z.optional(z.string().check(z.maxLength(200))),\n});\nexport type PersonalizationField = z.infer<typeof PersonalizationFieldSchema>;\n\n/** Ingevulde personalisatie op een orderregel/cartregel: per veld-key tekst of upload-pad. */\nexport const PersonalizationValueSchema = z.record(\n z.string(),\n z.object({\n text: z.optional(z.string().check(z.maxLength(200))),\n /** Storage-pad uit de uploadPersonalization-callable (géén vrije URL). */\n imagePath: z.optional(z.string().check(z.maxLength(400))),\n /** Oorspronkelijke bestandsnaam (weergave in beheer/mail). */\n fileName: z.optional(z.string().check(z.maxLength(200))),\n }),\n);\nexport type PersonalizationValue = z.infer<typeof PersonalizationValueSchema>;\n\n/**\n * Variant = één combinatie van optiewaarden. `key` is de waarden gejoined met \"|\" in\n * optie-volgorde (bv. \"68|Roze\"). Alleen aanwezig waar hij afwijkt van de product-defaults.\n */\nexport const ProductVariantSchema = z.object({\n key: z.string().check(z.minLength(1)).check(z.maxLength(200)),\n priceCents: z.optional(z.int().check(z.minimum(0)).check(z.maximum(1_000_000_00))),\n stock: z.optional(z.int().check(z.minimum(0)).check(z.maximum(1_000_000))),\n sku: z.optional(z.string().check(z.maxLength(60))),\n active: z._default(z.boolean(), true),\n});\nexport type ProductVariant = z.infer<typeof ProductVariantSchema>;\n\nexport const ProductStatusSchema = z.enum([\"draft\", \"active\", \"archived\"]);\nexport type ProductStatus = z.infer<typeof ProductStatusSchema>;\n\nexport const ProductSchema = z.object({\n name: z.string().check(z.minLength(1)).check(z.maxLength(200)),\n slug: z.string().check(z.minLength(1)).check(z.maxLength(120)).check(z.regex(/^[a-z0-9-]+$/, \"slug: alleen kleine letters, cijfers en streepjes\")),\n /**\n * Beschrijving als platte tekst (regeleinden blijven behouden). Bewust géén HTML:\n * producten worden client-side door editors geschreven (rules-pad, niet via de\n * publish-sanitizer), dus HTML zou hier een XSS-route zijn.\n */\n description: z._default(z.string().check(z.maxLength(20_000)), \"\"),\n categoryIds: z._default(z.array(z.string().check(z.maxLength(80))).check(z.maxLength(20)), []),\n /** Afbeeldings-URL's (via de mediabibliotheek). Eerste = hoofdbeeld. */\n images: z._default(z.array(z.string().check(z.maxLength(2000))).check(z.maxLength(12)), []),\n /** Prijs incl. btw, in centen. */\n priceCents: z._default(z.int().check(z.minimum(0)).check(z.maximum(1_000_000_00)), 0),\n /** Doorgestreepte \"van\"-prijs (optioneel). */\n compareAtCents: z.optional(z.int().check(z.minimum(0)).check(z.maximum(1_000_000_00))),\n /** Btw-tarief (NL): 21, 9 of 0. Prijzen zijn inclusief. */\n vatRate: z._default(z.union([z.literal(21), z.literal(9), z.literal(0)]), 21),\n options: z._default(z.array(ProductOptionSchema).check(z.maxLength(3)), []),\n variants: z._default(z.array(ProductVariantSchema).check(z.maxLength(200)), []),\n /** Voorraad bijhouden? false = altijd bestelbaar (op-maat/print-on-demand). */\n trackStock: z._default(z.boolean(), false),\n /** Voorraad voor producten zónder varianten (met varianten telt de variant-stock). */\n stock: z.optional(z.int().check(z.minimum(0)).check(z.maximum(1_000_000))),\n status: z._default(ProductStatusSchema, \"draft\"),\n /** Sorteervolgorde binnen een categorie (laag = eerst). */\n order: z._default(z.int().check(z.minimum(0)).check(z.maximum(9999)), 0),\n featured: z._default(z.boolean(), false),\n /** 5.6: personalisatie-velden (eigen naam/logo) — max 3 per product. */\n personalization: z.optional(z.array(PersonalizationFieldSchema).check(z.maxLength(3))),\n});\nexport type Product = z.infer<typeof ProductSchema>;\n\n/* ── Kortingscodes ───────────────────────────────────────────────────────── */\n\n/** `sites/{siteId}/discountCodes/{CODE}` (doc-id = code in hoofdletters; editor beheert). */\nexport const DiscountCodeSchema = z.object({\n code: z.string().check(z.minLength(3)).check(z.maxLength(30)).check(z.regex(/^[A-Z0-9-]+$/, \"code: hoofdletters, cijfers en streepjes\")),\n type: z.enum([\"percent\", \"fixed\"]),\n /** percent: 1–100; fixed: bedrag in centen. */\n value: z.int().check(z.minimum(1)).check(z.maximum(1_000_000_00)),\n minOrderCents: z._default(z.int().check(z.minimum(0)).check(z.maximum(1_000_000_00)), 0),\n freeShipping: z._default(z.boolean(), false),\n active: z._default(z.boolean(), true),\n /** ISO-datums (yyyy-mm-dd); leeg = geen grens. */\n startsAt: z.optional(z.string().check(z.maxLength(10))),\n endsAt: z.optional(z.string().check(z.maxLength(10))),\n /** 0 = onbeperkt. `usedCount` wordt door de webhook transactioneel opgehoogd. */\n maxUses: z._default(z.int().check(z.minimum(0)).check(z.maximum(1_000_000)), 0),\n usedCount: z._default(z.int().check(z.minimum(0)), 0),\n});\nexport type DiscountCode = z.infer<typeof DiscountCodeSchema>;\n\n/* ── Mail-templates ──────────────────────────────────────────────────────── */\n\n// Mailtemplates zijn site-breed (ook zonder shop) — de canonieke definitie staat in `./mail`.\n// Hier her-geëxporteerd voor backward-compat van bestaande shop-importeurs.\nexport {\n MAIL_TEMPLATE_KEYS,\n MAIL_TEMPLATE_DEFS,\n MailTemplateSchema,\n MailTemplatesSchema,\n type MailTemplateKey,\n type MailTemplates,\n} from \"./mail\";\n\n/* ── Bestellingen ────────────────────────────────────────────────────────── */\n\nexport const OrderStatusSchema = z.enum([\"pending\", \"paid\", \"shipped\", \"cancelled\", \"refunded\"]);\nexport type OrderStatus = z.infer<typeof OrderStatusSchema>;\n\n/** Orderregel: snapshot van naam/prijs op besteldatum — blijft kloppen als het product wijzigt. */\nexport const OrderItemSchema = z.object({\n kind: z._default(z.enum([\"product\", \"donation\"]), \"product\"),\n productId: z.optional(z.string().check(z.maxLength(80))),\n name: z.string().check(z.minLength(1)).check(z.maxLength(240)),\n variantKey: z.optional(z.string().check(z.maxLength(200))),\n qty: z.int().check(z.minimum(1)).check(z.maximum(999)),\n /** Incl. eventuele personalisatie-meerprijs. */\n unitPriceCents: z.int().check(z.minimum(0)).check(z.maximum(1_000_000_00)),\n vatRate: z._default(z.union([z.literal(21), z.literal(9), z.literal(0)]), 21),\n /** 5.6: ingevulde personalisatie (\"Naam: Boaz\", upload-pad). */\n personalization: z.optional(PersonalizationValueSchema),\n});\nexport type OrderItem = z.infer<typeof OrderItemSchema>;\n\nexport const OrderAddressSchema = z.object({\n address: z.string().check(z.minLength(1)).check(z.maxLength(200)),\n zip: z.string().check(z.minLength(1)).check(z.maxLength(20)),\n city: z.string().check(z.minLength(1)).check(z.maxLength(120)),\n country: z._default(z.string().check(z.minLength(2)).check(z.maxLength(2)), \"NL\"),\n});\nexport type OrderAddress = z.infer<typeof OrderAddressSchema>;\n\nexport const OrderCustomerSchema = z.object({\n email: z.email().check(z.maxLength(200)),\n name: z.string().check(z.minLength(1)).check(z.maxLength(200)),\n phone: z.optional(z.string().check(z.maxLength(40))),\n});\nexport type OrderCustomer = z.infer<typeof OrderCustomerSchema>;\n\n/** Volledige order zoals door Functions geschreven (timestamps komen daarbovenop). */\nexport const OrderSchema = z.object({\n number: z.string().check(z.minLength(1)).check(z.maxLength(40)),\n status: OrderStatusSchema,\n items: z.array(OrderItemSchema).check(z.minLength(1)).check(z.maxLength(50)),\n amount: z.object({\n itemsCents: z.int().check(z.minimum(0)),\n shippingCents: z.int().check(z.minimum(0)),\n /** 5.6: toegepaste korting (0 = geen). */\n discountCents: z._default(z.int().check(z.minimum(0)), 0),\n totalCents: z.int().check(z.minimum(0)),\n }),\n /** 5.6: toegepaste kortingscode (snapshot). */\n discount: z.optional(z.object({\n code: z.string().check(z.maxLength(30)),\n type: z.enum([\"percent\", \"fixed\"]),\n value: z.int(),\n freeShipping: z._default(z.boolean(), false),\n })),\n customer: OrderCustomerSchema,\n shipping: z.optional(OrderAddressSchema),\n note: z.optional(z.string().check(z.maxLength(2000))),\n /** 5.6: track & trace-link (gezet bij \"verzonden\"). */\n trackingUrl: z.optional(z.string().check(z.maxLength(500))),\n /** 5.6: factuur-pad in Storage (gezet door de webhook). */\n invoicePath: z.optional(z.string().check(z.maxLength(400))),\n stripe: z._default(z.object({\n sessionId: z.optional(z.string().check(z.maxLength(200))),\n paymentIntentId: z.optional(z.string().check(z.maxLength(200))),\n }), {}),\n});\nexport type Order = z.infer<typeof OrderSchema>;\n\n/* ── Callable-input (checkout) ───────────────────────────────────────────── */\n\n/**\n * Input van de `createOrder`-callable. Client-prijzen worden NOOIT vertrouwd: de functie\n * herrekent alles tegen de opgeslagen product-docs. Alleen `donationCents` komt van de\n * client (binnen de per-site ingestelde min/max van het donatie-block).\n */\nexport const CreateOrderItemInputSchema = z.object({\n productId: z.optional(z.string().check(z.minLength(1)).check(z.maxLength(80))),\n variantKey: z.optional(z.string().check(z.maxLength(200))),\n qty: z._default(z.int().check(z.minimum(1)).check(z.maximum(999)), 1),\n /** Alleen voor donaties (zonder productId). */\n donationCents: z.optional(z.int().check(z.minimum(50)).check(z.maximum(1_000_000_00))),\n /** 5.6: personalisatie-invoer (gevalideerd tegen product.personalization). */\n personalization: z.optional(PersonalizationValueSchema),\n});\n\nexport const CreateOrderInputSchema = z.object({\n siteId: z.string().check(z.minLength(1)).check(z.maxLength(80)),\n items: z.array(CreateOrderItemInputSchema).check(z.minLength(1)).check(z.maxLength(50)),\n customer: OrderCustomerSchema,\n shipping: z.optional(OrderAddressSchema),\n note: z.optional(z.string().check(z.maxLength(2000))),\n /** 5.6: kortingscode (server-side gevalideerd en verrekend). */\n discountCode: z.optional(z.string().check(z.maxLength(30))),\n /** Paden op de klantsite waarheen Stripe terug redirect. */\n successPath: z._default(z.string().check(z.maxLength(400)), \"/bedankt\"),\n cancelPath: z._default(z.string().check(z.maxLength(400)), \"/winkelwagen\"),\n /** Honeypot — moet leeg zijn (bot-detectie). */\n _hp: z.optional(z.string().check(z.maxLength(0))),\n});\nexport type CreateOrderInput = z.infer<typeof CreateOrderInputSchema>;\n\n/* ── Block-schema's ──────────────────────────────────────────────────────── */\n\nexport const ShopCategoriesBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"shopCategories\"),\n heading: z.optional(z.string().check(z.maxLength(200))),\n columns: z._default(z.int().check(z.minimum(2)).check(z.maximum(4)), 3),\n});\n\nexport const ProductGridBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"productGrid\"),\n heading: z.optional(z.string().check(z.maxLength(200))),\n /** Vast categorie-filter (slug). Leeg + useQueryCategory → filter via `?cat=` in de URL. */\n categorySlug: z.optional(z.string().check(z.maxLength(120))),\n useQueryCategory: z._default(z.boolean(), true),\n featuredOnly: z._default(z.boolean(), false),\n columns: z._default(z.int().check(z.minimum(2)).check(z.maximum(4)), 3),\n limit: z._default(z.int().check(z.minimum(1)).check(z.maximum(200)), 60),\n sort: z._default(z.enum([\"order\", \"name\", \"priceAsc\", \"priceDesc\"]), \"order\"),\n /** 5.6: filterchips (kleur/maat) + sorteerkeuze boven het grid. */\n showFilters: z._default(z.boolean(), false),\n});\n\nexport const ProductDetailBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"productDetail\"),\n /** Vast product (slug); leeg → product uit `?p=` in de URL (één generieke detailpagina). */\n slug: z.optional(z.string().check(z.maxLength(120))),\n /** 5.6: \"Ook leuk\"-rij met producten uit dezelfde categorie. */\n showRelated: z._default(z.boolean(), true),\n});\n\nexport const CartBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"cart\"),\n heading: z.optional(z.string().check(z.maxLength(200))),\n});\n\nexport const CheckoutBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"checkout\"),\n heading: z.optional(z.string().check(z.maxLength(200))),\n introText: z.optional(z.string().check(z.maxLength(2000))),\n});\n\nexport const DonationBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"donation\"),\n heading: z.optional(z.string().check(z.maxLength(200))),\n introText: z.optional(z.string().check(z.maxLength(2000))),\n /** Voorgestelde bedragen in centen. */\n amountsCents: z._default(z.array(z.int().check(z.minimum(50)).check(z.maximum(1_000_000_00))).check(z.maxLength(8)), [500, 1000, 2500]),\n allowCustom: z._default(z.boolean(), true),\n customMinCents: z._default(z.int().check(z.minimum(50)), 100),\n customMaxCents: z._default(z.int().check(z.maximum(1_000_000_00)), 100_000),\n buttonLabel: z._default(z.string().check(z.maxLength(80)), \"Doneer\"),\n});\n\nexport const OrderStatusBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"orderStatus\"),\n successTitle: z._default(z.string().check(z.maxLength(200)), \"Bedankt voor je bestelling!\"),\n successText: z._default(z.string().check(z.maxLength(2000)), \"Je ontvangt zo een bevestiging per e-mail.\"),\n cancelledTitle: z._default(z.string().check(z.maxLength(200)), \"Betaling niet afgerond\"),\n cancelledText: z._default(z.string().check(z.maxLength(2000)), \"Je bestelling is niet betaald. Probeer het gerust opnieuw.\"),\n});\n\n/* ── Helpers (gedeeld client/server) ─────────────────────────────────────── */\n\n/** Variant-key uit gekozen optiewaarden, in optie-volgorde: [\"68\",\"Roze\"] → \"68|Roze\". */\nexport function variantKeyFor(values: string[]): string {\n return values.join(\"|\");\n}\n\n/** Effectieve prijs van een product(-variant) in centen. */\nexport function productPriceCents(product: Pick<Product, \"priceCents\" | \"variants\">, variantKey?: string): number {\n if (variantKey) {\n const v = product.variants?.find((x) => x.key === variantKey);\n if (v?.priceCents !== undefined) return v.priceCents;\n }\n return product.priceCents;\n}\n\n/** Verzendkosten volgens de publieke shopconfig (flat + gratis-vanaf). Donatie-only = gratis. */\nexport function shippingCentsFor(\n itemsCents: number,\n cfg: { shippingFlatCents?: number; shippingFreeFromCents?: number },\n hasShippableItems: boolean,\n): number {\n if (!hasShippableItems) return 0;\n const flat = cfg.shippingFlatCents ?? 0;\n const freeFrom = cfg.shippingFreeFromCents;\n if (freeFrom !== undefined && freeFrom > 0 && itemsCents >= freeFrom) return 0;\n return flat;\n}\n\n/** Centen → \"€ 13,95\" (nl-NL). */\nexport function formatCents(cents: number, currency = \"EUR\"): string {\n return new Intl.NumberFormat(\"nl-NL\", { style: \"currency\", currency }).format(cents / 100);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/schema/shop.ts"],"sourcesContent":["import * as z from \"zod/mini\";\nimport { blockBase } from \"./blockBase\";\n\n/**\n * Shop-schema's (5.5) — webwinkel + donaties. Pure Zod: gedeeld door core, admin en Functions.\n *\n * Datamodel per tenant:\n * sites/{siteId}/shopCategories/{id} — categorieën (editor-write, publiek leesbaar)\n * sites/{siteId}/products/{id} — producten (editor-write, publiek leesbaar als actief)\n * sites/{siteId}/orders/{id} — bestellingen (ALLEEN via Functions; editor leest,\n * en mag alleen status/verzendvelden muteren)\n * sites/{siteId}/private/shop — geheimen (Stripe-key, SMTP) — deny-all, alleen Functions\n *\n * Geld is ALTIJD een integer in centen (nooit floats). Publieke shopconfig (verzendkosten,\n * paden, donatie-grenzen) leeft in de module-settings van de `shop`-module\n * (settings/public.modules.shop.config) — zie modules/shop/module.ts.\n */\n\n/* ── Categorieën ─────────────────────────────────────────────────────────── */\n\nexport const ShopCategorySchema = z.object({\n name: z.string().check(z.minLength(1)).check(z.maxLength(120)),\n slug: z.string().check(z.minLength(1)).check(z.maxLength(120)).check(z.regex(/^[a-z0-9-]+$/, \"slug: alleen kleine letters, cijfers en streepjes\")),\n description: z.optional(z.string().check(z.maxLength(2000))),\n imageUrl: z.optional(z.string().check(z.maxLength(2000))),\n order: z._default(z.int().check(z.minimum(0)).check(z.maximum(9999)), 0),\n visible: z._default(z.boolean(), true),\n});\nexport type ShopCategory = z.infer<typeof ShopCategorySchema>;\n\n/* ── Producten ───────────────────────────────────────────────────────────── */\n\n/** Optie-as, bv. { name: \"Maat\", values: [\"56\",\"62\",\"68\",\"74\"] }. Max 3 assen per product. */\nexport const ProductOptionSchema = z.object({\n name: z.string().check(z.minLength(1)).check(z.maxLength(40)),\n values: z.array(z.string().check(z.minLength(1)).check(z.maxLength(60))).check(z.minLength(1)).check(z.maxLength(30)),\n /**\n * 5.6: afbeelding per optieWAARDE (praktijk: de kleur-as) — `{ \"Roze\": \"https://…\" }`.\n * De detailpagina wisselt het hoofdbeeld mee met de keuze; bewust per as en niet per\n * variant-combinatie (maat × kleur zou het aantal afbeeldingen laten exploderen).\n */\n images: z.optional(z.record(z.string(), z.string().check(z.maxLength(2000)))),\n});\nexport type ProductOption = z.infer<typeof ProductOptionSchema>;\n\n/**\n * Personalisatie-veld (5.6): de klant geeft eigen tekst of een eigen afbeelding op\n * (bv. \"rompertje met naam\"). Meerprijs telt server-side mee in `createOrder`.\n */\nexport const PersonalizationFieldSchema = z.object({\n key: z.string().check(z.minLength(1)).check(z.maxLength(40)).check(z.regex(/^[a-zA-Z][a-zA-Z0-9_]*$/, \"sleutel: letters/cijfers/underscore, beginnend met een letter\")),\n label: z.string().check(z.minLength(1)).check(z.maxLength(120)),\n type: z.enum([\"text\", \"image\"]),\n required: z._default(z.boolean(), false),\n /** Alleen voor type \"text\". */\n maxLength: z._default(z.int().check(z.minimum(1)).check(z.maximum(200)), 40),\n /** Meerprijs in centen (per stuk). */\n priceCents: z._default(z.int().check(z.minimum(0)).check(z.maximum(1_000_000_00)), 0),\n helpText: z.optional(z.string().check(z.maxLength(200))),\n});\nexport type PersonalizationField = z.infer<typeof PersonalizationFieldSchema>;\n\n/** Ingevulde personalisatie op een orderregel/cartregel: per veld-key tekst of upload-pad. */\nexport const PersonalizationValueSchema = z.record(\n z.string(),\n z.object({\n text: z.optional(z.string().check(z.maxLength(200))),\n /** Storage-pad uit de uploadPersonalization-callable (géén vrije URL). */\n imagePath: z.optional(z.string().check(z.maxLength(400))),\n /** Oorspronkelijke bestandsnaam (weergave in beheer/mail). */\n fileName: z.optional(z.string().check(z.maxLength(200))),\n }),\n);\nexport type PersonalizationValue = z.infer<typeof PersonalizationValueSchema>;\n\n/**\n * Variant = één combinatie van optiewaarden. `key` is de waarden gejoined met \"|\" in\n * optie-volgorde (bv. \"68|Roze\"). Alleen aanwezig waar hij afwijkt van de product-defaults.\n */\nexport const ProductVariantSchema = z.object({\n key: z.string().check(z.minLength(1)).check(z.maxLength(200)),\n priceCents: z.optional(z.int().check(z.minimum(0)).check(z.maximum(1_000_000_00))),\n stock: z.optional(z.int().check(z.minimum(0)).check(z.maximum(1_000_000))),\n sku: z.optional(z.string().check(z.maxLength(60))),\n active: z._default(z.boolean(), true),\n});\nexport type ProductVariant = z.infer<typeof ProductVariantSchema>;\n\nexport const ProductStatusSchema = z.enum([\"draft\", \"active\", \"archived\"]);\nexport type ProductStatus = z.infer<typeof ProductStatusSchema>;\n\nexport const ProductSchema = z.object({\n name: z.string().check(z.minLength(1)).check(z.maxLength(200)),\n slug: z.string().check(z.minLength(1)).check(z.maxLength(120)).check(z.regex(/^[a-z0-9-]+$/, \"slug: alleen kleine letters, cijfers en streepjes\")),\n /**\n * Beschrijving als platte tekst (regeleinden blijven behouden). Bewust géén HTML:\n * producten worden client-side door editors geschreven (rules-pad, niet via de\n * publish-sanitizer), dus HTML zou hier een XSS-route zijn.\n */\n description: z._default(z.string().check(z.maxLength(20_000)), \"\"),\n categoryIds: z._default(z.array(z.string().check(z.maxLength(80))).check(z.maxLength(20)), []),\n /** Afbeeldings-URL's (via de mediabibliotheek). Eerste = hoofdbeeld. */\n images: z._default(z.array(z.string().check(z.maxLength(2000))).check(z.maxLength(12)), []),\n /** Prijs incl. btw, in centen. */\n priceCents: z._default(z.int().check(z.minimum(0)).check(z.maximum(1_000_000_00)), 0),\n /** Doorgestreepte \"van\"-prijs (optioneel). */\n compareAtCents: z.optional(z.int().check(z.minimum(0)).check(z.maximum(1_000_000_00))),\n /** Btw-tarief (NL): 21, 9 of 0. Prijzen zijn inclusief. */\n vatRate: z._default(z.union([z.literal(21), z.literal(9), z.literal(0)]), 21),\n options: z._default(z.array(ProductOptionSchema).check(z.maxLength(3)), []),\n variants: z._default(z.array(ProductVariantSchema).check(z.maxLength(200)), []),\n /** Voorraad bijhouden? false = altijd bestelbaar (op-maat/print-on-demand). */\n trackStock: z._default(z.boolean(), false),\n /** Voorraad voor producten zónder varianten (met varianten telt de variant-stock). */\n stock: z.optional(z.int().check(z.minimum(0)).check(z.maximum(1_000_000))),\n status: z._default(ProductStatusSchema, \"draft\"),\n /** Sorteervolgorde binnen een categorie (laag = eerst). */\n order: z._default(z.int().check(z.minimum(0)).check(z.maximum(9999)), 0),\n featured: z._default(z.boolean(), false),\n /** 5.6: personalisatie-velden (eigen naam/logo) — max 3 per product. */\n personalization: z.optional(z.array(PersonalizationFieldSchema).check(z.maxLength(3))),\n});\nexport type Product = z.infer<typeof ProductSchema>;\n\n/* ── Kortingscodes ───────────────────────────────────────────────────────── */\n\n/** `sites/{siteId}/discountCodes/{CODE}` (doc-id = code in hoofdletters; editor beheert). */\nexport const DiscountCodeSchema = z.object({\n code: z.string().check(z.minLength(3)).check(z.maxLength(30)).check(z.regex(/^[A-Z0-9-]+$/, \"code: hoofdletters, cijfers en streepjes\")),\n type: z.enum([\"percent\", \"fixed\"]),\n /** percent: 1–100; fixed: bedrag in centen. */\n value: z.int().check(z.minimum(1)).check(z.maximum(1_000_000_00)),\n minOrderCents: z._default(z.int().check(z.minimum(0)).check(z.maximum(1_000_000_00)), 0),\n freeShipping: z._default(z.boolean(), false),\n active: z._default(z.boolean(), true),\n /** ISO-datums (yyyy-mm-dd); leeg = geen grens. */\n startsAt: z.optional(z.string().check(z.maxLength(10))),\n endsAt: z.optional(z.string().check(z.maxLength(10))),\n /** 0 = onbeperkt. `usedCount` wordt door de webhook transactioneel opgehoogd. */\n maxUses: z._default(z.int().check(z.minimum(0)).check(z.maximum(1_000_000)), 0),\n usedCount: z._default(z.int().check(z.minimum(0)), 0),\n});\nexport type DiscountCode = z.infer<typeof DiscountCodeSchema>;\n\n/* ── Mail-templates ──────────────────────────────────────────────────────── */\n\n// Mailtemplates zijn site-breed (ook zonder shop) — de canonieke definitie staat in `./mail`.\n// Hier her-geëxporteerd voor backward-compat van bestaande shop-importeurs.\nexport {\n MAIL_TEMPLATE_KEYS,\n MAIL_TEMPLATE_DEFS,\n MailTemplateSchema,\n MailTemplatesSchema,\n type MailTemplateKey,\n type MailTemplates,\n} from \"./mail\";\n\n/* ── Bestellingen ────────────────────────────────────────────────────────── */\n\nexport const OrderStatusSchema = z.enum([\"pending\", \"paid\", \"shipped\", \"cancelled\", \"refunded\"]);\nexport type OrderStatus = z.infer<typeof OrderStatusSchema>;\n\n/** Orderregel: snapshot van naam/prijs op besteldatum — blijft kloppen als het product wijzigt. */\nexport const OrderItemSchema = z.object({\n kind: z._default(z.enum([\"product\", \"donation\"]), \"product\"),\n productId: z.optional(z.string().check(z.maxLength(80))),\n name: z.string().check(z.minLength(1)).check(z.maxLength(240)),\n variantKey: z.optional(z.string().check(z.maxLength(200))),\n qty: z.int().check(z.minimum(1)).check(z.maximum(999)),\n /** Incl. eventuele personalisatie-meerprijs. */\n unitPriceCents: z.int().check(z.minimum(0)).check(z.maximum(1_000_000_00)),\n vatRate: z._default(z.union([z.literal(21), z.literal(9), z.literal(0)]), 21),\n /** 5.6: ingevulde personalisatie (\"Naam: Boaz\", upload-pad). */\n personalization: z.optional(PersonalizationValueSchema),\n});\nexport type OrderItem = z.infer<typeof OrderItemSchema>;\n\nexport const OrderAddressSchema = z.object({\n address: z.string().check(z.minLength(1)).check(z.maxLength(200)),\n zip: z.string().check(z.minLength(1)).check(z.maxLength(20)),\n city: z.string().check(z.minLength(1)).check(z.maxLength(120)),\n country: z._default(z.string().check(z.minLength(2)).check(z.maxLength(2)), \"NL\"),\n});\nexport type OrderAddress = z.infer<typeof OrderAddressSchema>;\n\nexport const OrderCustomerSchema = z.object({\n email: z.email().check(z.maxLength(200)),\n name: z.string().check(z.minLength(1)).check(z.maxLength(200)),\n phone: z.optional(z.string().check(z.maxLength(40))),\n});\nexport type OrderCustomer = z.infer<typeof OrderCustomerSchema>;\n\n/** Volledige order zoals door Functions geschreven (timestamps komen daarbovenop). */\nexport const OrderSchema = z.object({\n number: z.string().check(z.minLength(1)).check(z.maxLength(40)),\n status: OrderStatusSchema,\n items: z.array(OrderItemSchema).check(z.minLength(1)).check(z.maxLength(50)),\n amount: z.object({\n itemsCents: z.int().check(z.minimum(0)),\n shippingCents: z.int().check(z.minimum(0)),\n /** 5.6: toegepaste korting (0 = geen). */\n discountCents: z._default(z.int().check(z.minimum(0)), 0),\n totalCents: z.int().check(z.minimum(0)),\n }),\n /** 5.6: toegepaste kortingscode (snapshot). */\n discount: z.optional(z.object({\n code: z.string().check(z.maxLength(30)),\n type: z.enum([\"percent\", \"fixed\"]),\n value: z.int(),\n freeShipping: z._default(z.boolean(), false),\n })),\n customer: OrderCustomerSchema,\n shipping: z.optional(OrderAddressSchema),\n note: z.optional(z.string().check(z.maxLength(2000))),\n /** 5.6: track & trace-link (gezet bij \"verzonden\"). */\n trackingUrl: z.optional(z.string().check(z.maxLength(500))),\n /** 5.6: factuur-pad in Storage (gezet door de webhook). */\n invoicePath: z.optional(z.string().check(z.maxLength(400))),\n stripe: z._default(z.object({\n sessionId: z.optional(z.string().check(z.maxLength(200))),\n paymentIntentId: z.optional(z.string().check(z.maxLength(200))),\n }), {}),\n});\nexport type Order = z.infer<typeof OrderSchema>;\n\n/* ── Callable-input (checkout) ───────────────────────────────────────────── */\n\n/**\n * Input van de `createOrder`-callable. Client-prijzen worden NOOIT vertrouwd: de functie\n * herrekent alles tegen de opgeslagen product-docs. Alleen `donationCents` komt van de\n * client (binnen de per-site ingestelde min/max van het donatie-block).\n */\nexport const CreateOrderItemInputSchema = z.object({\n productId: z.optional(z.string().check(z.minLength(1)).check(z.maxLength(80))),\n variantKey: z.optional(z.string().check(z.maxLength(200))),\n qty: z._default(z.int().check(z.minimum(1)).check(z.maximum(999)), 1),\n /** Alleen voor donaties (zonder productId). */\n donationCents: z.optional(z.int().check(z.minimum(50)).check(z.maximum(1_000_000_00))),\n /** 5.6: personalisatie-invoer (gevalideerd tegen product.personalization). */\n personalization: z.optional(PersonalizationValueSchema),\n});\n\nexport const CreateOrderInputSchema = z.object({\n siteId: z.string().check(z.minLength(1)).check(z.maxLength(80)),\n items: z.array(CreateOrderItemInputSchema).check(z.minLength(1)).check(z.maxLength(50)),\n customer: OrderCustomerSchema,\n shipping: z.optional(OrderAddressSchema),\n note: z.optional(z.string().check(z.maxLength(2000))),\n /** 5.6: kortingscode (server-side gevalideerd en verrekend). */\n discountCode: z.optional(z.string().check(z.maxLength(30))),\n /** Paden op de klantsite waarheen Stripe terug redirect. */\n successPath: z._default(z.string().check(z.maxLength(400)), \"/bedankt\"),\n cancelPath: z._default(z.string().check(z.maxLength(400)), \"/winkelwagen\"),\n /** Honeypot — moet leeg zijn (bot-detectie). */\n _hp: z.optional(z.string().check(z.maxLength(0))),\n});\nexport type CreateOrderInput = z.infer<typeof CreateOrderInputSchema>;\n\n/* ── Block-schema's ──────────────────────────────────────────────────────── */\n\nexport const ShopCategoriesBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"shopCategories\"),\n heading: z.optional(z.string().check(z.maxLength(200))),\n columns: z._default(z.int().check(z.minimum(2)).check(z.maximum(4)), 3),\n});\n\nexport const ProductGridBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"productGrid\"),\n heading: z.optional(z.string().check(z.maxLength(200))),\n /** Vast categorie-filter (slug). Leeg + useQueryCategory → filter via `?cat=` in de URL. */\n categorySlug: z.optional(z.string().check(z.maxLength(120))),\n useQueryCategory: z._default(z.boolean(), true),\n featuredOnly: z._default(z.boolean(), false),\n columns: z._default(z.int().check(z.minimum(2)).check(z.maximum(4)), 3),\n limit: z._default(z.int().check(z.minimum(1)).check(z.maximum(200)), 60),\n sort: z._default(z.enum([\"order\", \"name\", \"priceAsc\", \"priceDesc\"]), \"order\"),\n /** 5.6: filterchips (kleur/maat) + sorteerkeuze boven het grid. */\n showFilters: z._default(z.boolean(), false),\n});\n\nexport const ProductDetailBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"productDetail\"),\n /** Vast product (slug); leeg → product uit `?p=` in de URL (één generieke detailpagina). */\n slug: z.optional(z.string().check(z.maxLength(120))),\n /** 5.6: \"Ook leuk\"-rij met producten uit dezelfde categorie. */\n showRelated: z._default(z.boolean(), true),\n});\n\nexport const CartBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"cart\"),\n heading: z.optional(z.string().check(z.maxLength(200))),\n});\n\nexport const CheckoutBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"checkout\"),\n heading: z.optional(z.string().check(z.maxLength(200))),\n introText: z.optional(z.string().check(z.maxLength(2000))),\n});\n\nexport const DonationBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"donation\"),\n heading: z.optional(z.string().check(z.maxLength(200))),\n introText: z.optional(z.string().check(z.maxLength(2000))),\n /** Voorgestelde bedragen in centen. */\n amountsCents: z._default(z.array(z.int().check(z.minimum(50)).check(z.maximum(1_000_000_00))).check(z.maxLength(8)), [500, 1000, 2500]),\n allowCustom: z._default(z.boolean(), true),\n customMinCents: z._default(z.int().check(z.minimum(50)), 100),\n customMaxCents: z._default(z.int().check(z.maximum(1_000_000_00)), 100_000),\n buttonLabel: z._default(z.string().check(z.maxLength(80)), \"Doneer\"),\n});\n\nexport const OrderStatusBlockSchema = z.object({\n ...blockBase,\n _type: z.literal(\"orderStatus\"),\n successTitle: z._default(z.string().check(z.maxLength(200)), \"Bedankt voor je bestelling!\"),\n successText: z._default(z.string().check(z.maxLength(2000)), \"Je ontvangt zo een bevestiging per e-mail.\"),\n cancelledTitle: z._default(z.string().check(z.maxLength(200)), \"Betaling niet afgerond\"),\n cancelledText: z._default(z.string().check(z.maxLength(2000)), \"Je bestelling is niet betaald. Probeer het gerust opnieuw.\"),\n});\n\n/* ── Helpers (gedeeld client/server) ─────────────────────────────────────── */\n\n/** Variant-key uit gekozen optiewaarden, in optie-volgorde: [\"68\",\"Roze\"] → \"68|Roze\". */\nexport function variantKeyFor(values: string[]): string {\n return values.join(\"|\");\n}\n\n/** Effectieve prijs van een product(-variant) in centen. */\nexport function productPriceCents(product: Pick<Product, \"priceCents\" | \"variants\">, variantKey?: string): number {\n if (variantKey) {\n const v = product.variants?.find((x) => x.key === variantKey);\n if (v?.priceCents !== undefined) return v.priceCents;\n }\n return product.priceCents;\n}\n\n/** Verzendkosten volgens de publieke shopconfig (flat + gratis-vanaf). Donatie-only = gratis. */\nexport function shippingCentsFor(\n itemsCents: number,\n cfg: { shippingFlatCents?: number; shippingFreeFromCents?: number },\n hasShippableItems: boolean,\n): number {\n if (!hasShippableItems) return 0;\n const flat = cfg.shippingFlatCents ?? 0;\n const freeFrom = cfg.shippingFreeFromCents;\n if (freeFrom !== undefined && freeFrom > 0 && itemsCents >= freeFrom) return 0;\n return flat;\n}\n\n/** Centen → \"€ 13,95\" (nl-NL). */\nexport function formatCents(cents: number, currency = \"EUR\"): string {\n return new Intl.NumberFormat(\"nl-NL\", { style: \"currency\", currency }).format(cents / 100);\n}\n"],"mappings":"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","names":[]}
@@ -1,5 +1,5 @@
1
1
  import * as z from "zod/mini";
2
- import { BlockBaseSchema } from "./blocks.js";
2
+ import { BlockBaseSchema } from "./blockBase.js";
3
3
  import { TranslationsSchema } from "../i18n/overlay.js";
4
4
  const SymbolSchema = z.object({
5
5
  name: z.string().check(z.minLength(1)).check(z.maxLength(120)).register(z.globalRegistry, { description: "Naam" }),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/schema/symbols.ts"],"sourcesContent":["/**\n * Symbols (5.0, primo-concept): een symbol is een benoemde, gedeelde sectie — een compositie van\n * gewone blokken — die op meerdere pagina's als **referentie** wordt ingevoegd (`symbolRef`-blok).\n * Wijzig het symbol → alle pagina's die ernaar verwijzen bewegen mee (i.t.t. patterns, die bij\n * invoegen worden gekloond). \"Loskoppelen\" in de editor zet een referentie om in een kloon.\n *\n * Opslag: `sites/{siteId}/symbols/{symbolId}` — publiek leesbaar (de live site leest ze bij het\n * renderen), schrijven alleen via de `saveSymbol`-callable (sanitize + validatie + audit).\n * Een symbol mag GEEN symbolRef bevatten (geen recursie) — afgedwongen in schema én callable.\n */\nimport * as z from \"zod/mini\";\nimport { BlockBaseSchema } from \"./blocks\";\nimport { TranslationsSchema } from \"../i18n/overlay\";\n\nexport const SymbolSchema = z.object({\n name: z.string().check(z.minLength(1)).check(z.maxLength(120)).register(z.globalRegistry, { description: \"Naam\" }),\n /** De blok-compositie van het symbol (zelfde vorm als page.blocks). */\n blocks: z._default(z.array(BlockBaseSchema).check(z.maxLength(50)), []).check((ctx) => {\n if (ctx.value.some((b) => b._type === \"symbolRef\")) {\n ctx.issues.push({ code: \"custom\", input: ctx.value, message: \"Een symbool kan geen ander symbool bevatten.\" });\n }\n }),\n /** Taal-overlay (5.0): per locale gepunte veldpaden → vertaalde tekst (zie i18n/overlay.ts). */\n translations: z.optional(TranslationsSchema),\n});\n// \"SymbolDefinition\", niet \"Symbol\": dat schaduwde de JS-global Symbol in elke consumer-import.\nexport type SymbolDefinition = z.infer<typeof SymbolSchema>;\nexport type StoredSymbol = SymbolDefinition & { id: string };\n"],"mappings":"AAUA,YAAY,OAAO;AACnB,SAAS,uBAAuB;AAChC,SAAS,0BAA0B;AAE5B,MAAM,eAAe,EAAE,OAAO;AAAA,EACnC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,aAAa,OAAO,CAAC;AAAA;AAAA,EAEjH,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ;AACnF,QAAI,IAAI,MAAM,KAAK,CAAC,MAAM,EAAE,UAAU,WAAW,GAAG;AAClD,UAAI,OAAO,KAAK,EAAE,MAAM,UAAU,OAAO,IAAI,OAAO,SAAS,+CAA+C,CAAC;AAAA,IAC/G;AAAA,EACF,CAAC;AAAA;AAAA,EAEH,cAAc,EAAE,SAAS,kBAAkB;AAC7C,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../src/schema/symbols.ts"],"sourcesContent":["/**\n * Symbols (5.0, primo-concept): een symbol is een benoemde, gedeelde sectie — een compositie van\n * gewone blokken — die op meerdere pagina's als **referentie** wordt ingevoegd (`symbolRef`-blok).\n * Wijzig het symbol → alle pagina's die ernaar verwijzen bewegen mee (i.t.t. patterns, die bij\n * invoegen worden gekloond). \"Loskoppelen\" in de editor zet een referentie om in een kloon.\n *\n * Opslag: `sites/{siteId}/symbols/{symbolId}` — publiek leesbaar (de live site leest ze bij het\n * renderen), schrijven alleen via de `saveSymbol`-callable (sanitize + validatie + audit).\n * Een symbol mag GEEN symbolRef bevatten (geen recursie) — afgedwongen in schema én callable.\n */\nimport * as z from \"zod/mini\";\nimport { BlockBaseSchema } from \"./blockBase\";\nimport { TranslationsSchema } from \"../i18n/overlay\";\n\nexport const SymbolSchema = z.object({\n name: z.string().check(z.minLength(1)).check(z.maxLength(120)).register(z.globalRegistry, { description: \"Naam\" }),\n /** De blok-compositie van het symbol (zelfde vorm als page.blocks). */\n blocks: z._default(z.array(BlockBaseSchema).check(z.maxLength(50)), []).check((ctx) => {\n if (ctx.value.some((b) => b._type === \"symbolRef\")) {\n ctx.issues.push({ code: \"custom\", input: ctx.value, message: \"Een symbool kan geen ander symbool bevatten.\" });\n }\n }),\n /** Taal-overlay (5.0): per locale gepunte veldpaden → vertaalde tekst (zie i18n/overlay.ts). */\n translations: z.optional(TranslationsSchema),\n});\n// \"SymbolDefinition\", niet \"Symbol\": dat schaduwde de JS-global Symbol in elke consumer-import.\nexport type SymbolDefinition = z.infer<typeof SymbolSchema>;\nexport type StoredSymbol = SymbolDefinition & { id: string };\n"],"mappings":"AAUA,YAAY,OAAO;AACnB,SAAS,uBAAuB;AAChC,SAAS,0BAA0B;AAE5B,MAAM,eAAe,EAAE,OAAO;AAAA,EACnC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,aAAa,OAAO,CAAC;AAAA;AAAA,EAEjH,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ;AACnF,QAAI,IAAI,MAAM,KAAK,CAAC,MAAM,EAAE,UAAU,WAAW,GAAG;AAClD,UAAI,OAAO,KAAK,EAAE,MAAM,UAAU,OAAO,IAAI,OAAO,SAAS,+CAA+C,CAAC;AAAA,IAC/G;AAAA,EACF,CAAC;AAAA;AAAA,EAEH,cAAc,EAAE,SAAS,kBAAkB;AAC7C,CAAC;","names":[]}
@@ -1,5 +1,5 @@
1
1
  import "server-only";
2
- import { listPublishedPages, listPublishedNews, listFormDefinitions } from "./pages.js";
2
+ import { listPublishedPages, listPublishedNews, listFormDefinitions, listSiteMedia } from "./pages.js";
3
3
  import { blocksToText } from "../blocks/searchText.js";
4
4
  const SHOP_TYPES = /* @__PURE__ */ new Set(["productGrid", "shopCategories", "productDetail", "cart", "checkout", "donation", "orderStatus"]);
5
5
  const NEWS_TYPES = /* @__PURE__ */ new Set(["newsList", "newsWidget"]);
@@ -64,6 +64,19 @@ async function getPageBlockData(siteId, page, opts) {
64
64
  for (const f of alle) if (formIds.has(f.id)) map[f.id] = f;
65
65
  data.forms = map;
66
66
  }),
67
+ zacht("media", async () => {
68
+ const blokTekst = JSON.stringify(page.blocks ?? []);
69
+ if (!blokTekst.includes("firebasestorage") && !blokTekst.includes("storage.googleapis")) return;
70
+ const alle = await listSiteMedia(siteId);
71
+ const map = {};
72
+ for (const m of alle) {
73
+ const url = typeof m.url === "string" ? m.url : "";
74
+ const varianten = m.variants;
75
+ if (!url || !varianten?.sizes?.length || m.status === "processing") continue;
76
+ if (blokTekst.includes(url)) map[url] = { variants: m.variants, width: m.width, height: m.height };
77
+ }
78
+ if (Object.keys(map).length > 0) data.media = map;
79
+ }),
67
80
  zacht("search", async () => {
68
81
  if (!wilSearch) return;
69
82
  const [pages, news] = await Promise.all([