@xiwebdesign/xicms-core 7.30.0 → 8.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/XiCMSProvider.js +22 -7
- package/dist/XiCMSProvider.js.map +1 -1
- package/dist/admin/AdminApp.js +175 -93
- package/dist/admin/AdminApp.js.map +1 -1
- package/dist/admin/AdminHelp.d.ts +1 -1
- package/dist/admin/AdminHelp.js +44 -36
- package/dist/admin/AdminHelp.js.map +1 -1
- package/dist/admin/CoreVersion.d.ts +6 -3
- package/dist/admin/CoreVersion.js +60 -24
- package/dist/admin/CoreVersion.js.map +1 -1
- package/dist/admin/NewsEditor.d.ts +7 -0
- package/dist/admin/NewsEditor.js +117 -75
- package/dist/admin/NewsEditor.js.map +1 -1
- package/dist/admin/SuperadminPanel.js +1 -1
- package/dist/admin/SuperadminPanel.js.map +1 -1
- package/dist/admin/ZoekPalet.d.ts +15 -0
- package/dist/admin/ZoekPalet.js +123 -0
- package/dist/admin/ZoekPalet.js.map +1 -0
- package/dist/admin/blockEditors/GenericEditor.js +36 -18
- package/dist/admin/blockEditors/GenericEditor.js.map +1 -1
- package/dist/admin/blockEditors/StyleEditor.js +37 -3
- package/dist/admin/blockEditors/StyleEditor.js.map +1 -1
- package/dist/admin/blockEditors/SymbolRefEditor.js +44 -2
- package/dist/admin/blockEditors/SymbolRefEditor.js.map +1 -1
- package/dist/admin/blockEditors/index.js +154 -73
- package/dist/admin/blockEditors/index.js.map +1 -1
- package/dist/admin/customBlocks/CustomBlocksPanel.js +18 -7
- package/dist/admin/customBlocks/CustomBlocksPanel.js.map +1 -1
- package/dist/admin/dashboard/DashboardPanel.js +26 -16
- package/dist/admin/dashboard/DashboardPanel.js.map +1 -1
- package/dist/admin/editors/RichTextEditor.d.ts +4 -3
- package/dist/admin/editors/RichTextEditor.js +19 -56
- package/dist/admin/editors/RichTextEditor.js.map +1 -1
- package/dist/admin/editors/fontSizeExtension.js +7 -1
- package/dist/admin/editors/fontSizeExtension.js.map +1 -1
- package/dist/admin/editors/slashMenu.d.ts +18 -0
- package/dist/admin/editors/slashMenu.js +34 -0
- package/dist/admin/editors/slashMenu.js.map +1 -0
- package/dist/admin/editors/useRijkeTekst.d.ts +48 -0
- package/dist/admin/editors/useRijkeTekst.js +310 -0
- package/dist/admin/editors/useRijkeTekst.js.map +1 -0
- package/dist/admin/forms/FormsPanel.d.ts +11 -2
- package/dist/admin/forms/FormsPanel.js +218 -65
- package/dist/admin/forms/FormsPanel.js.map +1 -1
- package/dist/admin/lib/blokInfo.d.ts +17 -0
- package/dist/admin/lib/blokInfo.js +80 -0
- package/dist/admin/lib/blokInfo.js.map +1 -0
- package/dist/admin/lib/foutNaarMens.d.ts +1 -0
- package/dist/admin/lib/foutNaarMens.js +22 -0
- package/dist/admin/lib/foutNaarMens.js.map +1 -0
- package/dist/admin/lib/gewisteVelden.d.ts +13 -0
- package/dist/admin/lib/gewisteVelden.js +31 -0
- package/dist/admin/lib/gewisteVelden.js.map +1 -0
- package/dist/admin/lib/heroHulp.d.ts +11 -0
- package/dist/admin/lib/heroHulp.js +18 -0
- package/dist/admin/lib/heroHulp.js.map +1 -0
- package/dist/admin/lib/kleur.js +2 -3
- package/dist/admin/lib/kleur.js.map +1 -1
- package/dist/admin/lib/leesbaarheid.d.ts +34 -0
- package/dist/admin/lib/leesbaarheid.js +82 -0
- package/dist/admin/lib/leesbaarheid.js.map +1 -0
- package/dist/admin/lib/lengteAdvies.d.ts +1 -0
- package/dist/admin/lib/lengteAdvies.js +16 -0
- package/dist/admin/lib/lengteAdvies.js.map +1 -0
- package/dist/admin/lib/mediaLijst.d.ts +26 -0
- package/dist/admin/lib/mediaLijst.js +42 -0
- package/dist/admin/lib/mediaLijst.js.map +1 -0
- package/dist/admin/lib/mediaUsage.d.ts +12 -1
- package/dist/admin/lib/mediaUsage.js +43 -33
- package/dist/admin/lib/mediaUsage.js.map +1 -1
- package/dist/admin/lib/menuHulp.d.ts +16 -0
- package/dist/admin/lib/menuHulp.js +41 -0
- package/dist/admin/lib/menuHulp.js.map +1 -0
- package/dist/admin/lib/onopgeslagen.d.ts +10 -0
- package/dist/admin/lib/onopgeslagen.js +35 -0
- package/dist/admin/lib/onopgeslagen.js.map +1 -0
- package/dist/admin/lib/pagesClient.d.ts +55 -2
- package/dist/admin/lib/pagesClient.js +126 -28
- package/dist/admin/lib/pagesClient.js.map +1 -1
- package/dist/admin/lib/paginaGebruik.d.ts +56 -0
- package/dist/admin/lib/paginaGebruik.js +109 -0
- package/dist/admin/lib/paginaGebruik.js.map +1 -0
- package/dist/admin/lib/publicatieCheck.d.ts +25 -0
- package/dist/admin/lib/publicatieCheck.js +114 -0
- package/dist/admin/lib/publicatieCheck.js.map +1 -0
- package/dist/admin/lib/scrollNaarDetail.d.ts +6 -0
- package/dist/admin/lib/scrollNaarDetail.js +20 -0
- package/dist/admin/lib/scrollNaarDetail.js.map +1 -0
- package/dist/admin/lib/symbolsClient.d.ts +10 -0
- package/dist/admin/lib/symbolsClient.js +14 -1
- package/dist/admin/lib/symbolsClient.js.map +1 -1
- package/dist/admin/lib/tekstVeld.d.ts +8 -0
- package/dist/admin/lib/tekstVeld.js +10 -0
- package/dist/admin/lib/tekstVeld.js.map +1 -0
- package/dist/admin/lib/useIsSuperadmin.d.ts +2 -0
- package/dist/admin/lib/useIsSuperadmin.js +13 -0
- package/dist/admin/lib/useIsSuperadmin.js.map +1 -0
- package/dist/admin/lib/veldTaal.d.ts +14 -0
- package/dist/admin/lib/veldTaal.js +247 -0
- package/dist/admin/lib/veldTaal.js.map +1 -0
- package/dist/admin/lib/versieVergelijk.d.ts +17 -0
- package/dist/admin/lib/versieVergelijk.js +24 -0
- package/dist/admin/lib/versieVergelijk.js.map +1 -0
- package/dist/admin/lib/zodFields.js +22 -4
- package/dist/admin/lib/zodFields.js.map +1 -1
- package/dist/admin/lib/zodFout.d.ts +9 -0
- package/dist/admin/lib/zodFout.js +63 -0
- package/dist/admin/lib/zodFout.js.map +1 -0
- package/dist/admin/media/MediaManager.js +162 -32
- package/dist/admin/media/MediaManager.js.map +1 -1
- package/dist/admin/media/MediaPicker.d.ts +3 -0
- package/dist/admin/media/MediaPicker.js +84 -31
- package/dist/admin/media/MediaPicker.js.map +1 -1
- package/dist/admin/menu/MenuPanel.js +144 -83
- package/dist/admin/menu/MenuPanel.js.map +1 -1
- package/dist/admin/navContext.d.ts +3 -0
- package/dist/admin/navContext.js +13 -1
- package/dist/admin/navContext.js.map +1 -1
- package/dist/admin/pages/PageEditor.js +146 -30
- package/dist/admin/pages/PageEditor.js.map +1 -1
- package/dist/admin/pages/PagesPanel.js +215 -61
- package/dist/admin/pages/PagesPanel.js.map +1 -1
- package/dist/admin/pages/StarterKiezer.d.ts +12 -0
- package/dist/admin/pages/StarterKiezer.js +113 -0
- package/dist/admin/pages/StarterKiezer.js.map +1 -0
- package/dist/admin/panelRegistry.d.ts +1 -1
- package/dist/admin/panelRegistry.js +2 -1
- package/dist/admin/panelRegistry.js.map +1 -1
- package/dist/admin/patterns/PatternInserter.js +1 -1
- package/dist/admin/patterns/PatternInserter.js.map +1 -1
- package/dist/admin/settings/BedrijfInstellingen.d.ts +20 -0
- package/dist/admin/settings/BedrijfInstellingen.js +144 -0
- package/dist/admin/settings/BedrijfInstellingen.js.map +1 -0
- package/dist/admin/settings/MailSettings.js +2 -2
- package/dist/admin/settings/MailSettings.js.map +1 -1
- package/dist/admin/settings/MailTemplates.js +5 -4
- package/dist/admin/settings/MailTemplates.js.map +1 -1
- package/dist/admin/settings/SettingsPanel.js +120 -78
- package/dist/admin/settings/SettingsPanel.js.map +1 -1
- package/dist/admin/settings/SnapshotsCard.js +4 -4
- package/dist/admin/settings/SnapshotsCard.js.map +1 -1
- package/dist/admin/settings/VorigeTerugzetten.d.ts +15 -0
- package/dist/admin/settings/VorigeTerugzetten.js +89 -0
- package/dist/admin/settings/VorigeTerugzetten.js.map +1 -0
- package/dist/admin/shop/CategoriesTab.js +6 -4
- package/dist/admin/shop/CategoriesTab.js.map +1 -1
- package/dist/admin/shop/DiscountsTab.js +4 -2
- package/dist/admin/shop/DiscountsTab.js.map +1 -1
- package/dist/admin/shop/OrdersTab.js +57 -19
- package/dist/admin/shop/OrdersTab.js.map +1 -1
- package/dist/admin/shop/ProductPaneel.js +2 -1
- package/dist/admin/shop/ProductPaneel.js.map +1 -1
- package/dist/admin/shop/ProductsTab.js +40 -19
- package/dist/admin/shop/ProductsTab.js.map +1 -1
- package/dist/admin/shop/ShopPanel.js +13 -1
- package/dist/admin/shop/ShopPanel.js.map +1 -1
- package/dist/admin/shop/ShopSettingsTab.js +27 -1
- package/dist/admin/shop/ShopSettingsTab.js.map +1 -1
- package/dist/admin/shop/productClient.js +7 -3
- package/dist/admin/shop/productClient.js.map +1 -1
- package/dist/admin/stats/NietGevonden.d.ts +10 -0
- package/dist/admin/stats/NietGevonden.js +78 -0
- package/dist/admin/stats/NietGevonden.js.map +1 -0
- package/dist/admin/stats/StatsPanel.js +6 -1
- package/dist/admin/stats/StatsPanel.js.map +1 -1
- package/dist/admin/stats/lib.d.ts +2 -0
- package/dist/admin/stats/lib.js.map +1 -1
- package/dist/admin/ui/ConfirmDialog.js +10 -1
- package/dist/admin/ui/ConfirmDialog.js.map +1 -1
- package/dist/admin/ui/Icon.d.ts +34 -0
- package/dist/admin/ui/Icon.js +44 -0
- package/dist/admin/ui/Icon.js.map +1 -0
- package/dist/admin/ui/ImageField.d.ts +15 -0
- package/dist/admin/ui/ImageField.js +67 -0
- package/dist/admin/ui/ImageField.js.map +1 -0
- package/dist/admin/ui/KleurVeld.d.ts +25 -0
- package/dist/admin/ui/KleurVeld.js +76 -0
- package/dist/admin/ui/KleurVeld.js.map +1 -0
- package/dist/admin/ui/LaadStaat.d.ts +21 -0
- package/dist/admin/ui/LaadStaat.js +43 -0
- package/dist/admin/ui/LaadStaat.js.map +1 -0
- package/dist/admin/ui/LeesbaarheidPaneel.d.ts +10 -0
- package/dist/admin/ui/LeesbaarheidPaneel.js +68 -0
- package/dist/admin/ui/LeesbaarheidPaneel.js.map +1 -0
- package/dist/admin/ui/LinkDialog.d.ts +22 -0
- package/dist/admin/ui/LinkDialog.js +131 -0
- package/dist/admin/ui/LinkDialog.js.map +1 -0
- package/dist/admin/ui/LinkVeld.d.ts +14 -0
- package/dist/admin/ui/LinkVeld.js +49 -0
- package/dist/admin/ui/LinkVeld.js.map +1 -0
- package/dist/admin/ui/PreviewLinkResultaat.d.ts +14 -0
- package/dist/admin/ui/PreviewLinkResultaat.js +52 -0
- package/dist/admin/ui/PreviewLinkResultaat.js.map +1 -0
- package/dist/admin/ui/charts.js +5 -5
- package/dist/admin/ui/charts.js.map +1 -1
- package/dist/admin/ui/primitives.d.ts +16 -6
- package/dist/admin/ui/primitives.js +98 -26
- package/dist/admin/ui/primitives.js.map +1 -1
- package/dist/admin/ui/select.js +5 -2
- package/dist/admin/ui/select.js.map +1 -1
- package/dist/admin/ui/switch.d.ts +3 -1
- package/dist/admin/ui/switch.js +6 -3
- package/dist/admin/ui/switch.js.map +1 -1
- package/dist/admin/ui/toast.d.ts +2 -1
- package/dist/admin/ui/toast.js +17 -11
- package/dist/admin/ui/toast.js.map +1 -1
- package/dist/admin/visual/BlokKiezer.d.ts +34 -0
- package/dist/admin/visual/BlokKiezer.js +225 -0
- package/dist/admin/visual/BlokKiezer.js.map +1 -0
- package/dist/admin/visual/InlineGereedschap.d.ts +52 -0
- package/dist/admin/visual/InlineGereedschap.js +356 -0
- package/dist/admin/visual/InlineGereedschap.js.map +1 -0
- package/dist/admin/visual/InlineRijkeTekst.d.ts +23 -0
- package/dist/admin/visual/InlineRijkeTekst.js +152 -0
- package/dist/admin/visual/InlineRijkeTekst.js.map +1 -0
- package/dist/admin/visual/VisualEditor.js +273 -125
- package/dist/admin/visual/VisualEditor.js.map +1 -1
- package/dist/admin.css +1 -1
- package/dist/bedrijf/bedrijf.d.ts +36 -0
- package/dist/bedrijf/bedrijf.js +110 -0
- package/dist/bedrijf/bedrijf.js.map +1 -0
- package/dist/blocks/BlockRenderer.js +11 -1
- package/dist/blocks/BlockRenderer.js.map +1 -1
- package/dist/blocks/blockStyle.d.ts +7 -0
- package/dist/blocks/blockStyle.js +16 -3
- package/dist/blocks/blockStyle.js.map +1 -1
- package/dist/blocks/builtinSchemas.js +6 -0
- package/dist/blocks/builtinSchemas.js.map +1 -1
- package/dist/blocks/builtins/AgendaRender.d.ts +22 -0
- package/dist/blocks/builtins/AgendaRender.js +69 -9
- package/dist/blocks/builtins/AgendaRender.js.map +1 -1
- package/dist/blocks/builtins/Availability.d.ts +1 -0
- package/dist/blocks/builtins/Availability.js +23 -0
- package/dist/blocks/builtins/Availability.js.map +1 -0
- package/dist/blocks/builtins/AvailabilityRender.d.ts +12 -0
- package/dist/blocks/builtins/AvailabilityRender.js +105 -0
- package/dist/blocks/builtins/AvailabilityRender.js.map +1 -0
- package/dist/blocks/builtins/BeforeAfterRender.js +4 -3
- package/dist/blocks/builtins/BeforeAfterRender.js.map +1 -1
- package/dist/blocks/builtins/Booking.js +1 -1
- package/dist/blocks/builtins/Booking.js.map +1 -1
- package/dist/blocks/builtins/BreadcrumbsRender.d.ts +4 -3
- package/dist/blocks/builtins/BreadcrumbsRender.js +14 -8
- package/dist/blocks/builtins/BreadcrumbsRender.js.map +1 -1
- package/dist/blocks/builtins/ColumnsRender.d.ts +1 -1
- package/dist/blocks/builtins/ColumnsRender.js +3 -1
- package/dist/blocks/builtins/ColumnsRender.js.map +1 -1
- package/dist/blocks/builtins/Contact.js +1 -1
- package/dist/blocks/builtins/Contact.js.map +1 -1
- package/dist/blocks/builtins/ContactRender.d.ts +1 -1
- package/dist/blocks/builtins/ContactRender.js +29 -8
- package/dist/blocks/builtins/ContactRender.js.map +1 -1
- package/dist/blocks/builtins/Cta.js +1 -1
- package/dist/blocks/builtins/Cta.js.map +1 -1
- package/dist/blocks/builtins/CtaRender.d.ts +1 -1
- package/dist/blocks/builtins/CtaRender.js +5 -4
- package/dist/blocks/builtins/CtaRender.js.map +1 -1
- package/dist/blocks/builtins/Embed.js +1 -1
- package/dist/blocks/builtins/Embed.js.map +1 -1
- package/dist/blocks/builtins/FormBlock.js +1 -0
- package/dist/blocks/builtins/FormBlock.js.map +1 -1
- package/dist/blocks/builtins/FormBlockRender.d.ts +6 -0
- package/dist/blocks/builtins/FormBlockRender.js +88 -16
- package/dist/blocks/builtins/FormBlockRender.js.map +1 -1
- package/dist/blocks/builtins/GalleryRender.js +3 -2
- package/dist/blocks/builtins/GalleryRender.js.map +1 -1
- package/dist/blocks/builtins/Hero.js +1 -1
- package/dist/blocks/builtins/Hero.js.map +1 -1
- package/dist/blocks/builtins/HeroRender.js +7 -3
- package/dist/blocks/builtins/HeroRender.js.map +1 -1
- package/dist/blocks/builtins/OpenNowBadge.d.ts +4 -2
- package/dist/blocks/builtins/OpenNowBadge.js +6 -6
- package/dist/blocks/builtins/OpenNowBadge.js.map +1 -1
- package/dist/blocks/builtins/OpeningHoursRender.d.ts +8 -2
- package/dist/blocks/builtins/OpeningHoursRender.js +27 -6
- package/dist/blocks/builtins/OpeningHoursRender.js.map +1 -1
- package/dist/blocks/builtins/PriceList.d.ts +1 -0
- package/dist/blocks/builtins/PriceList.js +25 -0
- package/dist/blocks/builtins/PriceList.js.map +1 -0
- package/dist/blocks/builtins/PriceListRender.d.ts +17 -0
- package/dist/blocks/builtins/PriceListRender.js +87 -0
- package/dist/blocks/builtins/PriceListRender.js.map +1 -0
- package/dist/blocks/builtins/RichTextBlockRender.js +6 -1
- package/dist/blocks/builtins/RichTextBlockRender.js.map +1 -1
- package/dist/blocks/builtins/SectionHeading.d.ts +1 -0
- package/dist/blocks/builtins/SectionHeading.js +14 -0
- package/dist/blocks/builtins/SectionHeading.js.map +1 -0
- package/dist/blocks/builtins/SectionHeadingRender.d.ts +7 -0
- package/dist/blocks/builtins/SectionHeadingRender.js +14 -0
- package/dist/blocks/builtins/SectionHeadingRender.js.map +1 -0
- package/dist/blocks/builtins/SliderRender.js +3 -2
- package/dist/blocks/builtins/SliderRender.js.map +1 -1
- package/dist/blocks/builtins/SymbolRef.js +1 -1
- package/dist/blocks/builtins/SymbolRef.js.map +1 -1
- package/dist/blocks/builtins/TeamRender.js +6 -1
- package/dist/blocks/builtins/TeamRender.js.map +1 -1
- package/dist/blocks/builtins/Testimonials.js +3 -1
- package/dist/blocks/builtins/Testimonials.js.map +1 -1
- package/dist/blocks/builtins/TestimonialsRender.js +4 -0
- package/dist/blocks/builtins/TestimonialsRender.js.map +1 -1
- package/dist/blocks/builtins/WhatsappChatRender.d.ts +1 -1
- package/dist/blocks/builtins/WhatsappChatRender.js +1 -1
- package/dist/blocks/builtins/WhatsappChatRender.js.map +1 -1
- package/dist/blocks/builtins/Widgets.js +2 -2
- package/dist/blocks/builtins/Widgets.js.map +1 -1
- package/dist/blocks/builtins/WidgetsRender.js +3 -1
- package/dist/blocks/builtins/WidgetsRender.js.map +1 -1
- package/dist/blocks/builtins/index.d.ts +3 -0
- package/dist/blocks/builtins/index.js +6 -0
- package/dist/blocks/builtins/index.js.map +1 -1
- package/dist/blocks/builtins/lib/autoComplete.d.ts +7 -0
- package/dist/blocks/builtins/lib/autoComplete.js +20 -0
- package/dist/blocks/builtins/lib/autoComplete.js.map +1 -0
- package/dist/blocks/builtins/lib/bookingUrl.d.ts +2 -2
- package/dist/blocks/builtins/lib/bookingUrl.js +1 -1
- package/dist/blocks/builtins/lib/bookingUrl.js.map +1 -1
- package/dist/blocks/builtins/lib/ical.d.ts +24 -0
- package/dist/blocks/builtins/lib/ical.js +82 -0
- package/dist/blocks/builtins/lib/ical.js.map +1 -0
- package/dist/blocks/builtins/lib/vandaag.d.ts +8 -0
- package/dist/blocks/builtins/lib/vandaag.js +22 -0
- package/dist/blocks/builtins/lib/vandaag.js.map +1 -0
- package/dist/blocks/registry.d.ts +6 -0
- package/dist/blocks/registry.js.map +1 -1
- package/dist/blocks/ui/index.js +1 -0
- package/dist/blocks/ui/index.js.map +1 -1
- package/dist/components/EditBar.js +2 -4
- package/dist/components/EditBar.js.map +1 -1
- package/dist/components/News.js +26 -18
- package/dist/components/News.js.map +1 -1
- package/dist/components/PageView.d.ts +7 -1
- package/dist/components/PageView.js +17 -0
- package/dist/components/PageView.js.map +1 -1
- package/dist/components/ResponsiveImage.js +18 -20
- package/dist/components/ResponsiveImage.js.map +1 -1
- package/dist/components/site/SiteFooter.d.ts +6 -1
- package/dist/components/site/SiteFooter.js +61 -9
- package/dist/components/site/SiteFooter.js.map +1 -1
- package/dist/components/site/SiteHeader.d.ts +15 -0
- package/dist/components/site/SiteHeader.js +70 -0
- package/dist/components/site/SiteHeader.js.map +1 -0
- package/dist/components/site/SiteNav.d.ts +2 -0
- package/dist/components/site/SiteNav.js +29 -5
- package/dist/components/site/SiteNav.js.map +1 -1
- package/dist/demo/DemoStudio.js +2 -2
- package/dist/demo/DemoStudio.js.map +1 -1
- package/dist/demo/demoStore.d.ts +13 -0
- package/dist/demo/demoStore.js +36 -0
- package/dist/demo/demoStore.js.map +1 -1
- package/dist/editor/EditorProvider.js +15 -4
- package/dist/editor/EditorProvider.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +16 -1
- package/dist/index.js.map +1 -1
- package/dist/media/ImageContext.d.ts +17 -0
- package/dist/media/ImageContext.js +65 -20
- package/dist/media/ImageContext.js.map +1 -1
- package/dist/media/altInHtml.d.ts +9 -0
- package/dist/media/altInHtml.js +17 -0
- package/dist/media/altInHtml.js.map +1 -0
- package/dist/media/srcset.d.ts +12 -0
- package/dist/media/srcset.js +13 -0
- package/dist/media/srcset.js.map +1 -0
- package/dist/modules/builtins.d.ts +1 -0
- package/dist/modules/builtins.js +16 -3
- package/dist/modules/builtins.js.map +1 -1
- package/dist/modules/shop/blocks/Cart.js +5 -3
- package/dist/modules/shop/blocks/Cart.js.map +1 -1
- package/dist/modules/shop/blocks/Checkout.js +56 -35
- package/dist/modules/shop/blocks/Checkout.js.map +1 -1
- package/dist/modules/shop/blocks/Donation.js +4 -4
- package/dist/modules/shop/blocks/Donation.js.map +1 -1
- package/dist/modules/shop/blocks/ProductDetail.js +19 -3
- package/dist/modules/shop/blocks/ProductDetail.js.map +1 -1
- package/dist/modules/shop/blocks/ProductGrid.d.ts +3 -1
- package/dist/modules/shop/blocks/ProductGrid.js +8 -4
- package/dist/modules/shop/blocks/ProductGrid.js.map +1 -1
- package/dist/modules/shop/blocks/ShopCategories.js +4 -3
- package/dist/modules/shop/blocks/ShopCategories.js.map +1 -1
- package/dist/modules/shop/lib.d.ts +4 -0
- package/dist/modules/shop/lib.js +14 -0
- package/dist/modules/shop/lib.js.map +1 -1
- package/dist/modules/shop/settings.d.ts +3 -0
- package/dist/modules/shop/settings.js +14 -0
- package/dist/modules/shop/settings.js.map +1 -1
- package/dist/modules/shop/strings.d.ts +4 -0
- package/dist/modules/shop/strings.js +8 -0
- package/dist/modules/shop/strings.js.map +1 -1
- package/dist/next/envCheck.d.ts +42 -0
- package/dist/next/envCheck.js +106 -0
- package/dist/next/envCheck.js.map +1 -0
- package/dist/next/index.cjs +185 -2
- package/dist/next/index.d.ts +2 -0
- package/dist/next/index.js +8 -1
- package/dist/next/index.js.map +1 -1
- package/dist/next/securityHeaders.d.ts +36 -0
- package/dist/next/securityHeaders.js +74 -0
- package/dist/next/securityHeaders.js.map +1 -0
- package/dist/patterns/builtins.d.ts +7 -0
- package/dist/patterns/builtins.js +138 -3
- package/dist/patterns/builtins.js.map +1 -1
- package/dist/releaseNotes.js +140 -0
- package/dist/releaseNotes.js.map +1 -1
- package/dist/render/PublishedPage.d.ts +2 -1
- package/dist/render/PublishedPage.js +10 -4
- package/dist/render/PublishedPage.js.map +1 -1
- package/dist/schema/blocks.d.ts +470 -0
- package/dist/schema/blocks.js +102 -4
- package/dist/schema/blocks.js.map +1 -1
- package/dist/schema/business.d.ts +117 -0
- package/dist/schema/business.js +73 -0
- package/dist/schema/business.js.map +1 -0
- package/dist/schema/fields.d.ts +2 -1
- package/dist/schema/fields.js.map +1 -1
- package/dist/schema/forms.d.ts +18 -0
- package/dist/schema/forms.js +18 -3
- package/dist/schema/forms.js.map +1 -1
- package/dist/schema/mail.d.ts +10 -0
- package/dist/schema/mail.js +7 -0
- package/dist/schema/mail.js.map +1 -1
- package/dist/schema/settings.d.ts +101 -0
- package/dist/schema/settings.js +24 -3
- package/dist/schema/settings.js.map +1 -1
- package/dist/schema/shop.d.ts +2 -0
- package/dist/schema/shop.js +4 -0
- package/dist/schema/shop.js.map +1 -1
- package/dist/schema/shopGeld.d.ts +1 -0
- package/dist/schema/shopGeld.js +1 -0
- package/dist/schema/shopGeld.js.map +1 -1
- package/dist/schema/siteConfig.d.ts +68 -1
- package/dist/schema/siteConfig.js +7 -2
- package/dist/schema/siteConfig.js.map +1 -1
- package/dist/server/blockData.d.ts +1 -1
- package/dist/server/blockData.js +74 -18
- package/dist/server/blockData.js.map +1 -1
- package/dist/server/cspRapport.d.ts +20 -0
- package/dist/server/cspRapport.js +56 -0
- package/dist/server/cspRapport.js.map +1 -0
- package/dist/server/fonts.d.ts +3 -0
- package/dist/server/fonts.js +39 -0
- package/dist/server/fonts.js.map +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.js +8 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/sanitize.js +15 -2
- package/dist/server/sanitize.js.map +1 -1
- package/dist/settings/useSiteSettings.js +4 -1
- package/dist/settings/useSiteSettings.js.map +1 -1
- package/dist/starters/starters.d.ts +69 -0
- package/dist/starters/starters.js +171 -0
- package/dist/starters/starters.js.map +1 -0
- package/dist/styles.css +1149 -208
- package/dist/theme/color.d.ts +10 -0
- package/dist/theme/color.js +17 -1
- package/dist/theme/color.js.map +1 -1
- package/dist/theme/fontFallback.d.ts +23 -0
- package/dist/theme/fontFallback.js +58 -0
- package/dist/theme/fontFallback.js.map +1 -0
- package/dist/theme/fonts.d.ts +11 -0
- package/dist/theme/fonts.js +16 -0
- package/dist/theme/fonts.js.map +1 -0
- package/dist/version.js +1 -1
- package/package.json +6 -4
package/dist/next/index.cjs
CHANGED
|
@@ -20,8 +20,13 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/next/index.ts
|
|
21
21
|
var index_exports = {};
|
|
22
22
|
__export(index_exports, {
|
|
23
|
+
bouwCsp: () => bouwCsp,
|
|
24
|
+
controleerSiteEnv: () => controleerSiteEnv,
|
|
25
|
+
envIsStrikt: () => envIsStrikt,
|
|
23
26
|
xicmsAuthHeaders: () => xicmsAuthHeaders,
|
|
24
|
-
xicmsAuthRewrites: () => xicmsAuthRewrites
|
|
27
|
+
xicmsAuthRewrites: () => xicmsAuthRewrites,
|
|
28
|
+
xicmsEnvCheck: () => xicmsEnvCheck,
|
|
29
|
+
xicmsSecurityHeaders: () => xicmsSecurityHeaders
|
|
25
30
|
});
|
|
26
31
|
module.exports = __toCommonJS(index_exports);
|
|
27
32
|
|
|
@@ -52,8 +57,186 @@ function xicmsAuthRewrites() {
|
|
|
52
57
|
{ source: "/__/firebase/:path*", destination: `${doel}/__/firebase/:path*` }
|
|
53
58
|
];
|
|
54
59
|
}
|
|
60
|
+
|
|
61
|
+
// src/next/envCheck.ts
|
|
62
|
+
var FIREBASE_PUBLIEK = [
|
|
63
|
+
"NEXT_PUBLIC_FIREBASE_API_KEY",
|
|
64
|
+
"NEXT_PUBLIC_FIREBASE_PROJECT_ID",
|
|
65
|
+
"NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET",
|
|
66
|
+
"NEXT_PUBLIC_FIREBASE_APP_ID"
|
|
67
|
+
];
|
|
68
|
+
var FIREBASE_ADMIN = ["FIREBASE_PROJECT_ID", "FIREBASE_CLIENT_EMAIL", "FIREBASE_PRIVATE_KEY"];
|
|
69
|
+
var LEEG_UITLEG = "staat er wel, maar is leeg. Op Vercel betekent dat meestal dat hij Sensitive is (die komen bij `vercel pull` leeg binnen). Een NEXT_PUBLIC-waarde is publiek: maak hem opnieuw met `vercel env add <NAAM> production --no-sensitive --force`.";
|
|
70
|
+
function controleerSiteEnv(env, opties = {}) {
|
|
71
|
+
const m = [];
|
|
72
|
+
const heeft = (k) => typeof env[k] === "string" && env[k].trim() !== "";
|
|
73
|
+
const leeg = (k) => typeof env[k] === "string" && env[k].trim() === "";
|
|
74
|
+
const aanwezig = FIREBASE_PUBLIEK.filter(heeft);
|
|
75
|
+
if (aanwezig.length === 0 && !FIREBASE_PUBLIEK.some(leeg)) {
|
|
76
|
+
if (!opties.demo) {
|
|
77
|
+
m.push({
|
|
78
|
+
naam: "NEXT_PUBLIC_FIREBASE_*",
|
|
79
|
+
ernst: "fout",
|
|
80
|
+
tekst: "Geen Firebase-config. Zonder deze waarden werken inloggen, het beheer en formulieren niet. (Een demo-site zonder Firebase: `xicmsEnvCheck({ demo: true })`.)"
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
} else {
|
|
84
|
+
for (const k of FIREBASE_PUBLIEK) {
|
|
85
|
+
if (leeg(k)) m.push({ naam: k, ernst: "fout", tekst: `${k} ${LEEG_UITLEG}` });
|
|
86
|
+
else if (!heeft(k)) m.push({ naam: k, ernst: "fout", tekst: `${k} ontbreekt, terwijl de rest van de Firebase-config er w\xE9l is.` });
|
|
87
|
+
}
|
|
88
|
+
const sameOrigin = env.NEXT_PUBLIC_FIREBASE_AUTH_SAME_ORIGIN === "1";
|
|
89
|
+
if (leeg("NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN") && !sameOrigin) {
|
|
90
|
+
m.push({ naam: "NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN", ernst: "fout", tekst: `NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN ${LEEG_UITLEG}` });
|
|
91
|
+
} else if (!heeft("NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN") && !sameOrigin) {
|
|
92
|
+
m.push({
|
|
93
|
+
naam: "NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN",
|
|
94
|
+
ernst: "waarschuwing",
|
|
95
|
+
tekst: "NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN ontbreekt en NEXT_PUBLIC_FIREBASE_AUTH_SAME_ORIGIN staat niet op 1: inloggen met Google werkt dan niet."
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
for (const k of Object.keys(env)) {
|
|
100
|
+
if (k.startsWith("NEXT_PUBLIC_") && !k.startsWith("NEXT_PUBLIC_VERCEL_") && !FIREBASE_PUBLIEK.includes(k) && k !== "NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN" && leeg(k)) {
|
|
101
|
+
m.push({ naam: k, ernst: "waarschuwing", tekst: `${k} ${LEEG_UITLEG} (Is leeg hier bedoeld, haal hem dan weg.)` });
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const so = env.NEXT_PUBLIC_FIREBASE_AUTH_SAME_ORIGIN;
|
|
105
|
+
if (so !== void 0 && so !== "" && so !== "1" && so !== "0") {
|
|
106
|
+
m.push({ naam: "NEXT_PUBLIC_FIREBASE_AUTH_SAME_ORIGIN", ernst: "waarschuwing", tekst: `NEXT_PUBLIC_FIREBASE_AUTH_SAME_ORIGIN is "${so}"; alleen "1" zet hem aan.` });
|
|
107
|
+
}
|
|
108
|
+
const regio = env.NEXT_PUBLIC_FIREBASE_FUNCTIONS_REGION;
|
|
109
|
+
if (heeft("NEXT_PUBLIC_FIREBASE_FUNCTIONS_REGION") && !/^[a-z]+-[a-z]+\d$/.test(regio.trim())) {
|
|
110
|
+
m.push({ naam: "NEXT_PUBLIC_FIREBASE_FUNCTIONS_REGION", ernst: "waarschuwing", tekst: `NEXT_PUBLIC_FIREBASE_FUNCTIONS_REGION "${regio}" lijkt geen Google-regio (zoals europe-west1).` });
|
|
111
|
+
}
|
|
112
|
+
const admin = FIREBASE_ADMIN.filter(heeft);
|
|
113
|
+
if (admin.length > 0 && admin.length < FIREBASE_ADMIN.length) {
|
|
114
|
+
const mist = FIREBASE_ADMIN.filter((k) => !heeft(k));
|
|
115
|
+
m.push({ naam: mist.join(", "), ernst: "fout", tekst: `Firebase Admin is half ingesteld: ${mist.join(" en ")} ontbreekt. De server kan dan geen content lezen.` });
|
|
116
|
+
} else if (admin.length === 0 && !opties.demo && aanwezig.length > 0) {
|
|
117
|
+
m.push({
|
|
118
|
+
naam: "FIREBASE_*",
|
|
119
|
+
ernst: "waarschuwing",
|
|
120
|
+
tekst: "Geen Firebase Admin-sleutels (FIREBASE_PROJECT_ID/CLIENT_EMAIL/PRIVATE_KEY): de server leest dan alleen de gebundelde content, niet de live database."
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
if (heeft("FIREBASE_PRIVATE_KEY") && !env.FIREBASE_PRIVATE_KEY.includes("PRIVATE KEY")) {
|
|
124
|
+
m.push({ naam: "FIREBASE_PRIVATE_KEY", ernst: "fout", tekst: "FIREBASE_PRIVATE_KEY heeft niet de vorm van een sleutel (geen 'BEGIN PRIVATE KEY'). Plak de hele waarde uit het service-account-JSON, met de \\n's." });
|
|
125
|
+
}
|
|
126
|
+
if (heeft("FIREBASE_PROJECT_ID") && heeft("NEXT_PUBLIC_FIREBASE_PROJECT_ID") && env.FIREBASE_PROJECT_ID.trim() !== env.NEXT_PUBLIC_FIREBASE_PROJECT_ID.trim()) {
|
|
127
|
+
m.push({
|
|
128
|
+
naam: "FIREBASE_PROJECT_ID",
|
|
129
|
+
ernst: "fout",
|
|
130
|
+
tekst: `FIREBASE_PROJECT_ID (${env.FIREBASE_PROJECT_ID}) is een ander project dan NEXT_PUBLIC_FIREBASE_PROJECT_ID (${env.NEXT_PUBLIC_FIREBASE_PROJECT_ID}): de server en de browser zouden verschillende databases lezen.`
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
if (admin.length === FIREBASE_ADMIN.length && !heeft("XICMS_REVALIDATE_SECRET")) {
|
|
134
|
+
m.push({
|
|
135
|
+
naam: "XICMS_REVALIDATE_SECRET",
|
|
136
|
+
ernst: "waarschuwing",
|
|
137
|
+
tekst: "XICMS_REVALIDATE_SECRET ontbreekt: gepubliceerde wijzigingen verschijnen pas na het ISR-vangnet (tot een uur), niet binnen seconden."
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
return m;
|
|
141
|
+
}
|
|
142
|
+
function envIsStrikt(env) {
|
|
143
|
+
return env.XICMS_ENV_STRIKT === "1" || env.VERCEL_ENV === "production" && env.XICMS_ENV_STRIKT !== "0";
|
|
144
|
+
}
|
|
145
|
+
function xicmsEnvCheck(opties = {}) {
|
|
146
|
+
const env = process.env;
|
|
147
|
+
const meldingen = controleerSiteEnv(env, opties);
|
|
148
|
+
if (meldingen.length === 0) return meldingen;
|
|
149
|
+
const fouten = meldingen.filter((x) => x.ernst === "fout");
|
|
150
|
+
const regels = meldingen.map((x) => ` ${x.ernst === "fout" ? "\u2717" : "!"} ${x.tekst}`).join("\n");
|
|
151
|
+
const kop = `[xicms] Controle van de env-variabelen: ${fouten.length} fout(en), ${meldingen.length - fouten.length} waarschuwing(en)`;
|
|
152
|
+
if (fouten.length > 0 && envIsStrikt(env)) {
|
|
153
|
+
throw new Error(`${kop}
|
|
154
|
+
${regels}
|
|
155
|
+
|
|
156
|
+
De build is gestopt zodat er geen kapotte site live gaat. Bewust negeren: XICMS_ENV_STRIKT=0.`);
|
|
157
|
+
}
|
|
158
|
+
console.warn(`${kop}
|
|
159
|
+
${regels}`);
|
|
160
|
+
return meldingen;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// src/next/securityHeaders.ts
|
|
164
|
+
function basis(dev) {
|
|
165
|
+
return {
|
|
166
|
+
"default-src": ["'self'"],
|
|
167
|
+
// reCAPTCHA v3 = App Check; apis.google.com laadt Firebase Auth voor de login-popup.
|
|
168
|
+
// vercel.live = de commentaar-toolbar die Vercel op preview-deploys invoegt.
|
|
169
|
+
"script-src": ["'self'", "'unsafe-inline'", "https://www.google.com/recaptcha/", "https://www.gstatic.com/recaptcha/", "https://apis.google.com", "https://vercel.live", ...dev ? ["'unsafe-eval'"] : []],
|
|
170
|
+
// Astryx en Next zetten inline stijlen; Google Fonts als de site niet zelf host.
|
|
171
|
+
"style-src": ["'self'", "'unsafe-inline'", "https://fonts.googleapis.com", "https://vercel.live"],
|
|
172
|
+
"font-src": ["'self'", "data:", "https://fonts.gstatic.com", "https://vercel.live", "https://assets.vercel.com"],
|
|
173
|
+
// Foto's komen uit Storage, Unsplash, YouTube-thumbnails, … — beelden kunnen geen code draaien.
|
|
174
|
+
"img-src": ["'self'", "data:", "blob:", "https:"],
|
|
175
|
+
"media-src": ["'self'", "blob:", "https:"],
|
|
176
|
+
"connect-src": [
|
|
177
|
+
"'self'",
|
|
178
|
+
"https://*.googleapis.com",
|
|
179
|
+
"https://*.cloudfunctions.net",
|
|
180
|
+
"https://*.run.app",
|
|
181
|
+
"https://*.firebaseio.com",
|
|
182
|
+
"wss://*.firebaseio.com",
|
|
183
|
+
"https://*.firebaseapp.com",
|
|
184
|
+
"https://www.google.com",
|
|
185
|
+
// De engine-versie in /beheer komt rechtstreeks van npm (CoreVersion).
|
|
186
|
+
"https://registry.npmjs.org",
|
|
187
|
+
"https://vercel.live",
|
|
188
|
+
"wss://ws-us3.pusher.com",
|
|
189
|
+
...dev ? ["ws:", "http://localhost:*", "http://127.0.0.1:*"] : []
|
|
190
|
+
],
|
|
191
|
+
// Embeds (video, kaart, agenda, boekingswidgets) zijn iframes naar willekeurige diensten;
|
|
192
|
+
// die draaien in hun eigen origin. Ook de Firebase-login-handler en reCAPTCHA.
|
|
193
|
+
"frame-src": ["'self'", "https:"],
|
|
194
|
+
"worker-src": ["'self'", "blob:"],
|
|
195
|
+
// Het PDF-blok gebruikt bewust <object> (fallback met open-knop op mobiel). Browsers hebben geen
|
|
196
|
+
// plug-ins meer behalve de PDF-viewer, dus https: kost hier weinig; 'none' brak het PDF-blok.
|
|
197
|
+
"object-src": ["'self'", "https:"],
|
|
198
|
+
"base-uri": ["'self'"],
|
|
199
|
+
"form-action": ["'self'", "https:"],
|
|
200
|
+
// Niemand anders mag de site in een frame zetten (clickjacking).
|
|
201
|
+
"frame-ancestors": ["'self'"]
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
function bouwCsp(opties = {}) {
|
|
205
|
+
const dev = opties.dev ?? process.env.NODE_ENV !== "production";
|
|
206
|
+
const d = basis(dev);
|
|
207
|
+
for (const [k, bronnen] of Object.entries(opties.extra ?? {})) {
|
|
208
|
+
d[k] = [.../* @__PURE__ */ new Set([...d[k] ?? [], ...bronnen])];
|
|
209
|
+
}
|
|
210
|
+
const delen = Object.entries(d).map(([k, v]) => `${k} ${v.join(" ")}`);
|
|
211
|
+
if (opties.afdwingen && !dev) delen.push("upgrade-insecure-requests");
|
|
212
|
+
const pad = opties.rapportPad === void 0 ? "/api/csp-rapport" : opties.rapportPad;
|
|
213
|
+
if (pad) {
|
|
214
|
+
delen.push(`report-uri ${pad}`);
|
|
215
|
+
delen.push("report-to csp");
|
|
216
|
+
}
|
|
217
|
+
return delen.join("; ");
|
|
218
|
+
}
|
|
219
|
+
function xicmsSecurityHeaders(opties = {}) {
|
|
220
|
+
const pad = opties.rapportPad === void 0 ? "/api/csp-rapport" : opties.rapportPad;
|
|
221
|
+
const headers = [
|
|
222
|
+
{ key: opties.afdwingen ? "Content-Security-Policy" : "Content-Security-Policy-Report-Only", value: bouwCsp(opties) },
|
|
223
|
+
// Geen MIME-gokken: een geüpload "plaatje" kan zo nooit als script draaien.
|
|
224
|
+
{ key: "X-Content-Type-Options", value: "nosniff" },
|
|
225
|
+
// Externe sites zien alleen het domein, niet het volledige pad (privacy van bezoekers).
|
|
226
|
+
{ key: "Referrer-Policy", value: "strict-origin-when-cross-origin" },
|
|
227
|
+
// Een klantsite heeft geen camera, microfoon of betaal-API nodig. Locatie: alleen de site zelf.
|
|
228
|
+
{ key: "Permissions-Policy", value: "camera=(), microphone=(), payment=(), usb=(), geolocation=(self)" }
|
|
229
|
+
];
|
|
230
|
+
if (pad) headers.push({ key: "Reporting-Endpoints", value: `csp="${pad}"` });
|
|
231
|
+
return [{ source: "/:path*", headers }];
|
|
232
|
+
}
|
|
55
233
|
// Annotate the CommonJS export names for ESM import in node:
|
|
56
234
|
0 && (module.exports = {
|
|
235
|
+
bouwCsp,
|
|
236
|
+
controleerSiteEnv,
|
|
237
|
+
envIsStrikt,
|
|
57
238
|
xicmsAuthHeaders,
|
|
58
|
-
xicmsAuthRewrites
|
|
239
|
+
xicmsAuthRewrites,
|
|
240
|
+
xicmsEnvCheck,
|
|
241
|
+
xicmsSecurityHeaders
|
|
59
242
|
});
|
package/dist/next/index.d.ts
CHANGED
|
@@ -3,3 +3,5 @@
|
|
|
3
3
|
* niet in de browser, en mag dus niets uit de React-bundel meetrekken.
|
|
4
4
|
*/
|
|
5
5
|
export { xicmsAuthRewrites, xicmsAuthHeaders, type XicmsRewrite, type XicmsHeader } from "./authRewrites.js";
|
|
6
|
+
export { xicmsEnvCheck, controleerSiteEnv, envIsStrikt, type EnvMelding, type EnvErnst } from "./envCheck.js";
|
|
7
|
+
export { xicmsSecurityHeaders, bouwCsp, type CspOpties, type CspDirective } from "./securityHeaders.js";
|
package/dist/next/index.js
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { xicmsAuthRewrites, xicmsAuthHeaders } from "./authRewrites.js";
|
|
2
|
+
import { xicmsEnvCheck, controleerSiteEnv, envIsStrikt } from "./envCheck.js";
|
|
3
|
+
import { xicmsSecurityHeaders, bouwCsp } from "./securityHeaders.js";
|
|
2
4
|
export {
|
|
5
|
+
bouwCsp,
|
|
6
|
+
controleerSiteEnv,
|
|
7
|
+
envIsStrikt,
|
|
3
8
|
xicmsAuthHeaders,
|
|
4
|
-
xicmsAuthRewrites
|
|
9
|
+
xicmsAuthRewrites,
|
|
10
|
+
xicmsEnvCheck,
|
|
11
|
+
xicmsSecurityHeaders
|
|
5
12
|
};
|
|
6
13
|
//# sourceMappingURL=index.js.map
|
package/dist/next/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/next/index.ts"],"sourcesContent":["/**\n * Helpers voor `next.config.ts`. Bewust een eigen ingang: dit draait in Node tijdens de build,\n * niet in de browser, en mag dus niets uit de React-bundel meetrekken.\n */\nexport { xicmsAuthRewrites, xicmsAuthHeaders, type XicmsRewrite, type XicmsHeader } from \"./authRewrites\";\n"],"mappings":"AAIA,SAAS,mBAAmB,wBAA6D;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/next/index.ts"],"sourcesContent":["/**\n * Helpers voor `next.config.ts`. Bewust een eigen ingang: dit draait in Node tijdens de build,\n * niet in de browser, en mag dus niets uit de React-bundel meetrekken.\n */\nexport { xicmsAuthRewrites, xicmsAuthHeaders, type XicmsRewrite, type XicmsHeader } from \"./authRewrites\";\nexport { xicmsEnvCheck, controleerSiteEnv, envIsStrikt, type EnvMelding, type EnvErnst } from \"./envCheck\";\nexport { xicmsSecurityHeaders, bouwCsp, type CspOpties, type CspDirective } from \"./securityHeaders\";\n"],"mappings":"AAIA,SAAS,mBAAmB,wBAA6D;AACzF,SAAS,eAAe,mBAAmB,mBAAmD;AAC9F,SAAS,sBAAsB,eAAkD;","names":[]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Beveiligingsheaders met een Content Security Policy (8.7) — naar het idee van Astro's
|
|
3
|
+
* `security.csp`. Een CSP vertelt de browser welke bronnen een pagina mag laden. Komt er toch een
|
|
4
|
+
* vreemd script binnen (via geplakte HTML, een gehackte embed, een kwaadwillende extensie die de
|
|
5
|
+
* DOM aanpast), dan weigert de browser het.
|
|
6
|
+
*
|
|
7
|
+
* Standaard ALLEEN RAPPORTEREN (`Content-Security-Policy-Report-Only`): de browser blokkeert niets,
|
|
8
|
+
* maar meldt elke overtreding aan `/api/csp-rapport` (zie `cspRapportPOST`), zodat die in de
|
|
9
|
+
* Vercel-logs staan. Laat dat een week lopen, vul `extra` aan met wat legitiem bleek, en zet dan
|
|
10
|
+
* `afdwingen: true`.
|
|
11
|
+
*
|
|
12
|
+
* Waarom 'unsafe-inline' voor scripts: Next zet inline scripts in statisch gegenereerde pagina's.
|
|
13
|
+
* Nonces vragen een dynamische render per verzoek, en dat kost ons de SSG-snelheid. De rest van de
|
|
14
|
+
* policy (geen vreemde hosts, geen object/embed, geen framing door anderen, base-uri vast) blijft
|
|
15
|
+
* waardevol; Astro maakt dezelfde afweging niet omdat het de scripts kan hashen.
|
|
16
|
+
*
|
|
17
|
+
* Gebruik in next.config.ts:
|
|
18
|
+
*
|
|
19
|
+
* async headers() { return [...xicmsAuthHeaders(), ...xicmsSecurityHeaders()]; }
|
|
20
|
+
*/
|
|
21
|
+
import type { XicmsHeader } from "./authRewrites.js";
|
|
22
|
+
export type CspDirective = "default-src" | "script-src" | "style-src" | "font-src" | "img-src" | "media-src" | "connect-src" | "frame-src" | "worker-src" | "object-src" | "base-uri" | "form-action" | "frame-ancestors";
|
|
23
|
+
export interface CspOpties {
|
|
24
|
+
/** true = blokkeren; standaard alleen rapporteren. */
|
|
25
|
+
afdwingen?: boolean;
|
|
26
|
+
/** Waar de browser overtredingen meldt; `false` = nergens (alleen de console). */
|
|
27
|
+
rapportPad?: string | false;
|
|
28
|
+
/** Extra bronnen per directive, bv. `{ "script-src": ["https://plausible.io"] }`. */
|
|
29
|
+
extra?: Partial<Record<CspDirective, string[]>>;
|
|
30
|
+
/** Ontwikkelmodus (HMR, eval, emulators). Standaard: NODE_ENV !== "production". */
|
|
31
|
+
dev?: boolean;
|
|
32
|
+
}
|
|
33
|
+
/** Bouwt de policy-string. Puur, voor tests en voor wie hem elders nodig heeft. */
|
|
34
|
+
export declare function bouwCsp(opties?: CspOpties): string;
|
|
35
|
+
/** Headers voor de hele site: CSP (rapport of afdwingen) plus een paar goedkope basisheaders. */
|
|
36
|
+
export declare function xicmsSecurityHeaders(opties?: CspOpties): XicmsHeader[];
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
function basis(dev) {
|
|
2
|
+
return {
|
|
3
|
+
"default-src": ["'self'"],
|
|
4
|
+
// reCAPTCHA v3 = App Check; apis.google.com laadt Firebase Auth voor de login-popup.
|
|
5
|
+
// vercel.live = de commentaar-toolbar die Vercel op preview-deploys invoegt.
|
|
6
|
+
"script-src": ["'self'", "'unsafe-inline'", "https://www.google.com/recaptcha/", "https://www.gstatic.com/recaptcha/", "https://apis.google.com", "https://vercel.live", ...dev ? ["'unsafe-eval'"] : []],
|
|
7
|
+
// Astryx en Next zetten inline stijlen; Google Fonts als de site niet zelf host.
|
|
8
|
+
"style-src": ["'self'", "'unsafe-inline'", "https://fonts.googleapis.com", "https://vercel.live"],
|
|
9
|
+
"font-src": ["'self'", "data:", "https://fonts.gstatic.com", "https://vercel.live", "https://assets.vercel.com"],
|
|
10
|
+
// Foto's komen uit Storage, Unsplash, YouTube-thumbnails, … — beelden kunnen geen code draaien.
|
|
11
|
+
"img-src": ["'self'", "data:", "blob:", "https:"],
|
|
12
|
+
"media-src": ["'self'", "blob:", "https:"],
|
|
13
|
+
"connect-src": [
|
|
14
|
+
"'self'",
|
|
15
|
+
"https://*.googleapis.com",
|
|
16
|
+
"https://*.cloudfunctions.net",
|
|
17
|
+
"https://*.run.app",
|
|
18
|
+
"https://*.firebaseio.com",
|
|
19
|
+
"wss://*.firebaseio.com",
|
|
20
|
+
"https://*.firebaseapp.com",
|
|
21
|
+
"https://www.google.com",
|
|
22
|
+
// De engine-versie in /beheer komt rechtstreeks van npm (CoreVersion).
|
|
23
|
+
"https://registry.npmjs.org",
|
|
24
|
+
"https://vercel.live",
|
|
25
|
+
"wss://ws-us3.pusher.com",
|
|
26
|
+
...dev ? ["ws:", "http://localhost:*", "http://127.0.0.1:*"] : []
|
|
27
|
+
],
|
|
28
|
+
// Embeds (video, kaart, agenda, boekingswidgets) zijn iframes naar willekeurige diensten;
|
|
29
|
+
// die draaien in hun eigen origin. Ook de Firebase-login-handler en reCAPTCHA.
|
|
30
|
+
"frame-src": ["'self'", "https:"],
|
|
31
|
+
"worker-src": ["'self'", "blob:"],
|
|
32
|
+
// Het PDF-blok gebruikt bewust <object> (fallback met open-knop op mobiel). Browsers hebben geen
|
|
33
|
+
// plug-ins meer behalve de PDF-viewer, dus https: kost hier weinig; 'none' brak het PDF-blok.
|
|
34
|
+
"object-src": ["'self'", "https:"],
|
|
35
|
+
"base-uri": ["'self'"],
|
|
36
|
+
"form-action": ["'self'", "https:"],
|
|
37
|
+
// Niemand anders mag de site in een frame zetten (clickjacking).
|
|
38
|
+
"frame-ancestors": ["'self'"]
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function bouwCsp(opties = {}) {
|
|
42
|
+
const dev = opties.dev ?? process.env.NODE_ENV !== "production";
|
|
43
|
+
const d = basis(dev);
|
|
44
|
+
for (const [k, bronnen] of Object.entries(opties.extra ?? {})) {
|
|
45
|
+
d[k] = [.../* @__PURE__ */ new Set([...d[k] ?? [], ...bronnen])];
|
|
46
|
+
}
|
|
47
|
+
const delen = Object.entries(d).map(([k, v]) => `${k} ${v.join(" ")}`);
|
|
48
|
+
if (opties.afdwingen && !dev) delen.push("upgrade-insecure-requests");
|
|
49
|
+
const pad = opties.rapportPad === void 0 ? "/api/csp-rapport" : opties.rapportPad;
|
|
50
|
+
if (pad) {
|
|
51
|
+
delen.push(`report-uri ${pad}`);
|
|
52
|
+
delen.push("report-to csp");
|
|
53
|
+
}
|
|
54
|
+
return delen.join("; ");
|
|
55
|
+
}
|
|
56
|
+
function xicmsSecurityHeaders(opties = {}) {
|
|
57
|
+
const pad = opties.rapportPad === void 0 ? "/api/csp-rapport" : opties.rapportPad;
|
|
58
|
+
const headers = [
|
|
59
|
+
{ key: opties.afdwingen ? "Content-Security-Policy" : "Content-Security-Policy-Report-Only", value: bouwCsp(opties) },
|
|
60
|
+
// Geen MIME-gokken: een geüpload "plaatje" kan zo nooit als script draaien.
|
|
61
|
+
{ key: "X-Content-Type-Options", value: "nosniff" },
|
|
62
|
+
// Externe sites zien alleen het domein, niet het volledige pad (privacy van bezoekers).
|
|
63
|
+
{ key: "Referrer-Policy", value: "strict-origin-when-cross-origin" },
|
|
64
|
+
// Een klantsite heeft geen camera, microfoon of betaal-API nodig. Locatie: alleen de site zelf.
|
|
65
|
+
{ key: "Permissions-Policy", value: "camera=(), microphone=(), payment=(), usb=(), geolocation=(self)" }
|
|
66
|
+
];
|
|
67
|
+
if (pad) headers.push({ key: "Reporting-Endpoints", value: `csp="${pad}"` });
|
|
68
|
+
return [{ source: "/:path*", headers }];
|
|
69
|
+
}
|
|
70
|
+
export {
|
|
71
|
+
bouwCsp,
|
|
72
|
+
xicmsSecurityHeaders
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=securityHeaders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/next/securityHeaders.ts"],"sourcesContent":["/**\n * Beveiligingsheaders met een Content Security Policy (8.7) — naar het idee van Astro's\n * `security.csp`. Een CSP vertelt de browser welke bronnen een pagina mag laden. Komt er toch een\n * vreemd script binnen (via geplakte HTML, een gehackte embed, een kwaadwillende extensie die de\n * DOM aanpast), dan weigert de browser het.\n *\n * Standaard ALLEEN RAPPORTEREN (`Content-Security-Policy-Report-Only`): de browser blokkeert niets,\n * maar meldt elke overtreding aan `/api/csp-rapport` (zie `cspRapportPOST`), zodat die in de\n * Vercel-logs staan. Laat dat een week lopen, vul `extra` aan met wat legitiem bleek, en zet dan\n * `afdwingen: true`.\n *\n * Waarom 'unsafe-inline' voor scripts: Next zet inline scripts in statisch gegenereerde pagina's.\n * Nonces vragen een dynamische render per verzoek, en dat kost ons de SSG-snelheid. De rest van de\n * policy (geen vreemde hosts, geen object/embed, geen framing door anderen, base-uri vast) blijft\n * waardevol; Astro maakt dezelfde afweging niet omdat het de scripts kan hashen.\n *\n * Gebruik in next.config.ts:\n *\n * async headers() { return [...xicmsAuthHeaders(), ...xicmsSecurityHeaders()]; }\n */\nimport type { XicmsHeader } from \"./authRewrites\";\n\nexport type CspDirective =\n | \"default-src\"\n | \"script-src\"\n | \"style-src\"\n | \"font-src\"\n | \"img-src\"\n | \"media-src\"\n | \"connect-src\"\n | \"frame-src\"\n | \"worker-src\"\n | \"object-src\"\n | \"base-uri\"\n | \"form-action\"\n | \"frame-ancestors\";\n\nexport interface CspOpties {\n /** true = blokkeren; standaard alleen rapporteren. */\n afdwingen?: boolean;\n /** Waar de browser overtredingen meldt; `false` = nergens (alleen de console). */\n rapportPad?: string | false;\n /** Extra bronnen per directive, bv. `{ \"script-src\": [\"https://plausible.io\"] }`. */\n extra?: Partial<Record<CspDirective, string[]>>;\n /** Ontwikkelmodus (HMR, eval, emulators). Standaard: NODE_ENV !== \"production\". */\n dev?: boolean;\n}\n\n/** De basis: wat XiCMS zelf nodig heeft (Firebase, App Check, Google Fonts, embeds). */\nfunction basis(dev: boolean): Record<CspDirective, string[]> {\n return {\n \"default-src\": [\"'self'\"],\n // reCAPTCHA v3 = App Check; apis.google.com laadt Firebase Auth voor de login-popup.\n // vercel.live = de commentaar-toolbar die Vercel op preview-deploys invoegt.\n \"script-src\": [\"'self'\", \"'unsafe-inline'\", \"https://www.google.com/recaptcha/\", \"https://www.gstatic.com/recaptcha/\", \"https://apis.google.com\", \"https://vercel.live\", ...(dev ? [\"'unsafe-eval'\"] : [])],\n // Astryx en Next zetten inline stijlen; Google Fonts als de site niet zelf host.\n \"style-src\": [\"'self'\", \"'unsafe-inline'\", \"https://fonts.googleapis.com\", \"https://vercel.live\"],\n \"font-src\": [\"'self'\", \"data:\", \"https://fonts.gstatic.com\", \"https://vercel.live\", \"https://assets.vercel.com\"],\n // Foto's komen uit Storage, Unsplash, YouTube-thumbnails, … — beelden kunnen geen code draaien.\n \"img-src\": [\"'self'\", \"data:\", \"blob:\", \"https:\"],\n \"media-src\": [\"'self'\", \"blob:\", \"https:\"],\n \"connect-src\": [\n \"'self'\",\n \"https://*.googleapis.com\",\n \"https://*.cloudfunctions.net\",\n \"https://*.run.app\",\n \"https://*.firebaseio.com\",\n \"wss://*.firebaseio.com\",\n \"https://*.firebaseapp.com\",\n \"https://www.google.com\",\n // De engine-versie in /beheer komt rechtstreeks van npm (CoreVersion).\n \"https://registry.npmjs.org\",\n \"https://vercel.live\",\n \"wss://ws-us3.pusher.com\",\n ...(dev ? [\"ws:\", \"http://localhost:*\", \"http://127.0.0.1:*\"] : []),\n ],\n // Embeds (video, kaart, agenda, boekingswidgets) zijn iframes naar willekeurige diensten;\n // die draaien in hun eigen origin. Ook de Firebase-login-handler en reCAPTCHA.\n \"frame-src\": [\"'self'\", \"https:\"],\n \"worker-src\": [\"'self'\", \"blob:\"],\n // Het PDF-blok gebruikt bewust <object> (fallback met open-knop op mobiel). Browsers hebben geen\n // plug-ins meer behalve de PDF-viewer, dus https: kost hier weinig; 'none' brak het PDF-blok.\n \"object-src\": [\"'self'\", \"https:\"],\n \"base-uri\": [\"'self'\"],\n \"form-action\": [\"'self'\", \"https:\"],\n // Niemand anders mag de site in een frame zetten (clickjacking).\n \"frame-ancestors\": [\"'self'\"],\n };\n}\n\n/** Bouwt de policy-string. Puur, voor tests en voor wie hem elders nodig heeft. */\nexport function bouwCsp(opties: CspOpties = {}): string {\n const dev = opties.dev ?? process.env.NODE_ENV !== \"production\";\n const d = basis(dev);\n for (const [k, bronnen] of Object.entries(opties.extra ?? {}) as [CspDirective, string[]][]) {\n d[k] = [...new Set([...(d[k] ?? []), ...bronnen])];\n }\n const delen = Object.entries(d).map(([k, v]) => `${k} ${v.join(\" \")}`);\n // In report-only negeert de browser deze (met een waarschuwing), dus alleen bij afdwingen.\n if (opties.afdwingen && !dev) delen.push(\"upgrade-insecure-requests\");\n const pad = opties.rapportPad === undefined ? \"/api/csp-rapport\" : opties.rapportPad;\n if (pad) {\n delen.push(`report-uri ${pad}`);\n delen.push(\"report-to csp\");\n }\n return delen.join(\"; \");\n}\n\n/** Headers voor de hele site: CSP (rapport of afdwingen) plus een paar goedkope basisheaders. */\nexport function xicmsSecurityHeaders(opties: CspOpties = {}): XicmsHeader[] {\n const pad = opties.rapportPad === undefined ? \"/api/csp-rapport\" : opties.rapportPad;\n const headers = [\n { key: opties.afdwingen ? \"Content-Security-Policy\" : \"Content-Security-Policy-Report-Only\", value: bouwCsp(opties) },\n // Geen MIME-gokken: een geüpload \"plaatje\" kan zo nooit als script draaien.\n { key: \"X-Content-Type-Options\", value: \"nosniff\" },\n // Externe sites zien alleen het domein, niet het volledige pad (privacy van bezoekers).\n { key: \"Referrer-Policy\", value: \"strict-origin-when-cross-origin\" },\n // Een klantsite heeft geen camera, microfoon of betaal-API nodig. Locatie: alleen de site zelf.\n { key: \"Permissions-Policy\", value: \"camera=(), microphone=(), payment=(), usb=(), geolocation=(self)\" },\n ];\n if (pad) headers.push({ key: \"Reporting-Endpoints\", value: `csp=\"${pad}\"` });\n return [{ source: \"/:path*\", headers }];\n}\n"],"mappings":"AAiDA,SAAS,MAAM,KAA8C;AAC3D,SAAO;AAAA,IACL,eAAe,CAAC,QAAQ;AAAA;AAAA;AAAA,IAGxB,cAAc,CAAC,UAAU,mBAAmB,qCAAqC,sCAAsC,2BAA2B,uBAAuB,GAAI,MAAM,CAAC,eAAe,IAAI,CAAC,CAAE;AAAA;AAAA,IAE1M,aAAa,CAAC,UAAU,mBAAmB,gCAAgC,qBAAqB;AAAA,IAChG,YAAY,CAAC,UAAU,SAAS,6BAA6B,uBAAuB,2BAA2B;AAAA;AAAA,IAE/G,WAAW,CAAC,UAAU,SAAS,SAAS,QAAQ;AAAA,IAChD,aAAa,CAAC,UAAU,SAAS,QAAQ;AAAA,IACzC,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,MAAM,CAAC,OAAO,sBAAsB,oBAAoB,IAAI,CAAC;AAAA,IACnE;AAAA;AAAA;AAAA,IAGA,aAAa,CAAC,UAAU,QAAQ;AAAA,IAChC,cAAc,CAAC,UAAU,OAAO;AAAA;AAAA;AAAA,IAGhC,cAAc,CAAC,UAAU,QAAQ;AAAA,IACjC,YAAY,CAAC,QAAQ;AAAA,IACrB,eAAe,CAAC,UAAU,QAAQ;AAAA;AAAA,IAElC,mBAAmB,CAAC,QAAQ;AAAA,EAC9B;AACF;AAGO,SAAS,QAAQ,SAAoB,CAAC,GAAW;AACtD,QAAM,MAAM,OAAO,OAAO,QAAQ,IAAI,aAAa;AACnD,QAAM,IAAI,MAAM,GAAG;AACnB,aAAW,CAAC,GAAG,OAAO,KAAK,OAAO,QAAQ,OAAO,SAAS,CAAC,CAAC,GAAiC;AAC3F,MAAE,CAAC,IAAI,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAI,EAAE,CAAC,KAAK,CAAC,GAAI,GAAG,OAAO,CAAC,CAAC;AAAA,EACnD;AACA,QAAM,QAAQ,OAAO,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE;AAErE,MAAI,OAAO,aAAa,CAAC,IAAK,OAAM,KAAK,2BAA2B;AACpE,QAAM,MAAM,OAAO,eAAe,SAAY,qBAAqB,OAAO;AAC1E,MAAI,KAAK;AACP,UAAM,KAAK,cAAc,GAAG,EAAE;AAC9B,UAAM,KAAK,eAAe;AAAA,EAC5B;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAGO,SAAS,qBAAqB,SAAoB,CAAC,GAAkB;AAC1E,QAAM,MAAM,OAAO,eAAe,SAAY,qBAAqB,OAAO;AAC1E,QAAM,UAAU;AAAA,IACd,EAAE,KAAK,OAAO,YAAY,4BAA4B,uCAAuC,OAAO,QAAQ,MAAM,EAAE;AAAA;AAAA,IAEpH,EAAE,KAAK,0BAA0B,OAAO,UAAU;AAAA;AAAA,IAElD,EAAE,KAAK,mBAAmB,OAAO,kCAAkC;AAAA;AAAA,IAEnE,EAAE,KAAK,sBAAsB,OAAO,mEAAmE;AAAA,EACzG;AACA,MAAI,IAAK,SAAQ,KAAK,EAAE,KAAK,uBAAuB,OAAO,QAAQ,GAAG,IAAI,CAAC;AAC3E,SAAO,CAAC,EAAE,QAAQ,WAAW,QAAQ,CAAC;AACxC;","names":[]}
|
|
@@ -27,5 +27,12 @@ export declare const pageLanding: Pattern;
|
|
|
27
27
|
export declare const pageServices: Pattern;
|
|
28
28
|
export declare const pageAbout: Pattern;
|
|
29
29
|
export declare const pageContact: Pattern;
|
|
30
|
+
export declare const pageTarieven: Pattern;
|
|
31
|
+
export declare const pageMenukaart: Pattern;
|
|
32
|
+
export declare const pageReserveren: Pattern;
|
|
33
|
+
export declare const pageTeam: Pattern;
|
|
34
|
+
export declare const pageVerhuur: Pattern;
|
|
35
|
+
export declare const pagePortfolio: Pattern;
|
|
36
|
+
export declare const pageAgenda: Pattern;
|
|
30
37
|
/** Alle ingebouwde patronen. */
|
|
31
38
|
export declare const builtinPatterns: Pattern[];
|
|
@@ -353,14 +353,135 @@ const pageContact = definePattern({
|
|
|
353
353
|
{
|
|
354
354
|
_type: "columns",
|
|
355
355
|
_style: { paddingY: "md" },
|
|
356
|
+
// 8.14: contact en tijden komen uit het bedrijfsprofiel (Instellingen → Bedrijf): één keer
|
|
357
|
+
// invullen, en deze pagina klopt vanzelf mee.
|
|
356
358
|
columns: [
|
|
357
|
-
{ blocks: [{ _type: "
|
|
358
|
-
{ blocks: [{ _type: "openingHours", heading: "Openingstijden", rows: [
|
|
359
|
+
{ blocks: [{ _type: "contact", heading: "Neem contact op" }] },
|
|
360
|
+
{ blocks: [{ _type: "openingHours", heading: "Openingstijden", rows: [], showStatus: true }] }
|
|
359
361
|
]
|
|
360
362
|
},
|
|
361
363
|
...ctaBanner.blocks
|
|
362
364
|
]
|
|
363
365
|
});
|
|
366
|
+
const pageTarieven = definePattern({
|
|
367
|
+
id: "page-tarieven",
|
|
368
|
+
label: "Tarieven / prijslijst",
|
|
369
|
+
category: "Pagina's",
|
|
370
|
+
description: "Prijslijst met behandelingen of diensten, toelichting en een knop om te boeken.",
|
|
371
|
+
blocks: [
|
|
372
|
+
{ _type: "hero", title: "Tarieven", subtitle: "Duidelijke prijzen, zonder verrassingen.", align: "center", vAlign: "center", minHeight: "sm" },
|
|
373
|
+
{
|
|
374
|
+
_type: "priceList",
|
|
375
|
+
variant: "kolommen",
|
|
376
|
+
sections: [
|
|
377
|
+
{ title: "Behandelingen", items: [{ name: "Dienst \xE9\xE9n", description: "Korte omschrijving.", price: "\u20AC 25", duration: "30 min" }, { name: "Dienst twee", description: "Korte omschrijving.", price: "\u20AC 40", duration: "45 min" }] },
|
|
378
|
+
{ title: "Extra's", items: [{ name: "Dienst drie", description: "Korte omschrijving.", price: "\u20AC 10", duration: "15 min" }] }
|
|
379
|
+
],
|
|
380
|
+
footnote: "Prijzen zijn inclusief btw."
|
|
381
|
+
},
|
|
382
|
+
...ctaBanner.blocks
|
|
383
|
+
]
|
|
384
|
+
});
|
|
385
|
+
const pageMenukaart = definePattern({
|
|
386
|
+
id: "page-menukaart",
|
|
387
|
+
label: "Menukaart",
|
|
388
|
+
category: "Pagina's",
|
|
389
|
+
description: "Menukaart met voorgerechten, hoofdgerechten en desserts, plus openingstijden.",
|
|
390
|
+
blocks: [
|
|
391
|
+
{ _type: "hero", title: "Onze kaart", subtitle: "Seizoensgebonden en met zorg bereid.", align: "center", vAlign: "center", minHeight: "sm" },
|
|
392
|
+
{
|
|
393
|
+
_type: "priceList",
|
|
394
|
+
variant: "menu",
|
|
395
|
+
sections: [
|
|
396
|
+
{ title: "Voorgerechten", items: [{ name: "Dienst \xE9\xE9n", description: "Korte omschrijving.", price: "\u20AC 9" }] },
|
|
397
|
+
{ title: "Hoofdgerechten", items: [{ name: "Dienst twee", description: "Korte omschrijving.", price: "\u20AC 22", tags: "vegetarisch" }] },
|
|
398
|
+
{ title: "Desserts", items: [{ name: "Dienst drie", description: "Korte omschrijving.", price: "\u20AC 8" }] }
|
|
399
|
+
],
|
|
400
|
+
footnote: "Allergie\xEBn of dieetwensen? Laat het ons weten.",
|
|
401
|
+
jsonLd: true
|
|
402
|
+
},
|
|
403
|
+
{ _type: "openingHours", heading: "Openingstijden", rows: [], showStatus: true, _style: { width: "narrow" } }
|
|
404
|
+
]
|
|
405
|
+
});
|
|
406
|
+
const pageReserveren = definePattern({
|
|
407
|
+
id: "page-reserveren",
|
|
408
|
+
label: "Reserveren / afspraak maken",
|
|
409
|
+
category: "Pagina's",
|
|
410
|
+
description: "Online afspraak maken of reserveren, met contact en openingstijden ernaast.",
|
|
411
|
+
blocks: [
|
|
412
|
+
{ _type: "hero", title: "Afspraak maken", subtitle: "Kies zelf een moment dat jou uitkomt.", align: "center", vAlign: "center", minHeight: "sm" },
|
|
413
|
+
{ _type: "booking", heading: "Online plannen", provider: "custom", embedUrl: "" },
|
|
414
|
+
{
|
|
415
|
+
_type: "columns",
|
|
416
|
+
columns: [
|
|
417
|
+
{ blocks: [{ _type: "contact", heading: "Liever bellen?" }] },
|
|
418
|
+
{ blocks: [{ _type: "openingHours", heading: "Openingstijden", rows: [], showStatus: true }] }
|
|
419
|
+
]
|
|
420
|
+
}
|
|
421
|
+
]
|
|
422
|
+
});
|
|
423
|
+
const pageTeam = definePattern({
|
|
424
|
+
id: "page-team",
|
|
425
|
+
label: "Ons team",
|
|
426
|
+
category: "Pagina's",
|
|
427
|
+
description: "De mensen achter je bedrijf, met een korte inleiding en reviews.",
|
|
428
|
+
blocks: [
|
|
429
|
+
{ _type: "hero", title: "Ons team", subtitle: "Met wie je te maken krijgt.", align: "center", vAlign: "center", minHeight: "sm" },
|
|
430
|
+
...teamSection.blocks,
|
|
431
|
+
...testimonialsSection.blocks
|
|
432
|
+
]
|
|
433
|
+
});
|
|
434
|
+
const pageVerhuur = definePattern({
|
|
435
|
+
id: "page-verhuur",
|
|
436
|
+
label: "Verblijf / accommodatie",
|
|
437
|
+
category: "Pagina's",
|
|
438
|
+
description: "Foto's, voorzieningen, prijzen per periode, veelgestelde vragen en boeken.",
|
|
439
|
+
blocks: [
|
|
440
|
+
{ _type: "hero", title: "Ons verblijf", subtitle: "Rust, ruimte en alles wat je nodig hebt.", align: "center", vAlign: "center", minHeight: "md" },
|
|
441
|
+
...gallerySection.blocks,
|
|
442
|
+
{
|
|
443
|
+
_type: "cards",
|
|
444
|
+
heading: "Voorzieningen",
|
|
445
|
+
columns: 3,
|
|
446
|
+
items: [
|
|
447
|
+
{ icon: "\u{1F6CF}\uFE0F", title: "Slaapkamers", text: "Korte omschrijving." },
|
|
448
|
+
{ icon: "\u{1F373}", title: "Keuken", text: "Korte omschrijving." },
|
|
449
|
+
{ icon: "\u{1F333}", title: "Tuin", text: "Korte omschrijving." }
|
|
450
|
+
]
|
|
451
|
+
},
|
|
452
|
+
{
|
|
453
|
+
_type: "priceList",
|
|
454
|
+
heading: "Prijzen",
|
|
455
|
+
variant: "lijst",
|
|
456
|
+
sections: [{ title: "Per nacht", items: [{ name: "Laagseizoen", price: "\u20AC 00", description: "Minimaal 2 nachten." }, { name: "Hoogseizoen", price: "\u20AC 00", description: "Minimaal 7 nachten." }] }]
|
|
457
|
+
},
|
|
458
|
+
{ _type: "availability", heading: "Beschikbaarheid", units: [{ label: "Ons verblijf", icalUrl: "" }], months: 4, minNights: 2, requestPath: "/contact" },
|
|
459
|
+
...faqSection.blocks
|
|
460
|
+
]
|
|
461
|
+
});
|
|
462
|
+
const pagePortfolio = definePattern({
|
|
463
|
+
id: "page-portfolio",
|
|
464
|
+
label: "Werk / portfolio",
|
|
465
|
+
category: "Pagina's",
|
|
466
|
+
description: "Projecten met filter per categorie, een uitgelichte review en een CTA.",
|
|
467
|
+
blocks: [
|
|
468
|
+
{ _type: "hero", title: "Ons werk", subtitle: "Een greep uit recente projecten.", align: "center", vAlign: "center", minHeight: "sm" },
|
|
469
|
+
...portfolioSection.blocks,
|
|
470
|
+
...quoteSection.blocks,
|
|
471
|
+
...ctaBanner.blocks
|
|
472
|
+
]
|
|
473
|
+
});
|
|
474
|
+
const pageAgenda = definePattern({
|
|
475
|
+
id: "page-agenda",
|
|
476
|
+
label: "Agenda",
|
|
477
|
+
category: "Pagina's",
|
|
478
|
+
description: "Komende activiteiten met datum en plaats \u2014 ook in Google en toe te voegen aan de agenda.",
|
|
479
|
+
blocks: [
|
|
480
|
+
{ _type: "hero", title: "Agenda", subtitle: "Wat er binnenkort te doen is.", align: "center", vAlign: "center", minHeight: "sm" },
|
|
481
|
+
{ _type: "agenda", heading: "Komende activiteiten", events: [{ title: "Eerste activiteit", start: "2026-12-01T19:30", location: "Plaats", description: "Korte omschrijving." }] },
|
|
482
|
+
...newsletterSection.blocks
|
|
483
|
+
]
|
|
484
|
+
});
|
|
364
485
|
const builtinPatterns = [
|
|
365
486
|
heroCentered,
|
|
366
487
|
featuresThree,
|
|
@@ -384,7 +505,14 @@ const builtinPatterns = [
|
|
|
384
505
|
pageLanding,
|
|
385
506
|
pageServices,
|
|
386
507
|
pageAbout,
|
|
387
|
-
pageContact
|
|
508
|
+
pageContact,
|
|
509
|
+
pageTarieven,
|
|
510
|
+
pageMenukaart,
|
|
511
|
+
pageReserveren,
|
|
512
|
+
pageTeam,
|
|
513
|
+
pageVerhuur,
|
|
514
|
+
pagePortfolio,
|
|
515
|
+
pageAgenda
|
|
388
516
|
];
|
|
389
517
|
export {
|
|
390
518
|
aboutImageText,
|
|
@@ -402,9 +530,16 @@ export {
|
|
|
402
530
|
logosSection,
|
|
403
531
|
newsletterSection,
|
|
404
532
|
pageAbout,
|
|
533
|
+
pageAgenda,
|
|
405
534
|
pageContact,
|
|
406
535
|
pageLanding,
|
|
536
|
+
pageMenukaart,
|
|
537
|
+
pagePortfolio,
|
|
538
|
+
pageReserveren,
|
|
407
539
|
pageServices,
|
|
540
|
+
pageTarieven,
|
|
541
|
+
pageTeam,
|
|
542
|
+
pageVerhuur,
|
|
408
543
|
portfolioSection,
|
|
409
544
|
pricingThree,
|
|
410
545
|
quoteSection,
|