@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
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { meetLeesbaarheid, paginaTekst } from "./leesbaarheid.js";
|
|
2
|
+
const BEELD = /\.(jpe?g|png|webp|gif|avif|svg)(\?|$)|firebasestorage|storage\.googleapis|images\.unsplash/i;
|
|
3
|
+
const LINKTEKST = ["label", "ctaLabel", "buttonLabel", "text"];
|
|
4
|
+
const VOORBEELD = /* @__PURE__ */ new Set([
|
|
5
|
+
"Dienst \xE9\xE9n",
|
|
6
|
+
"Dienst twee",
|
|
7
|
+
"Dienst drie",
|
|
8
|
+
"Korte omschrijving van wat je biedt.",
|
|
9
|
+
"Korte omschrijving.",
|
|
10
|
+
"Naam Medewerker",
|
|
11
|
+
"Top geholpen!",
|
|
12
|
+
"Echt een aanrader!",
|
|
13
|
+
"Tevreden klant",
|
|
14
|
+
"Een krachtige uitspraak.",
|
|
15
|
+
"Een vraag?",
|
|
16
|
+
"Het antwoord.",
|
|
17
|
+
"Inhoud\u2026",
|
|
18
|
+
"Tekst\u2026",
|
|
19
|
+
"Vacaturetitel",
|
|
20
|
+
"\u20AC 00",
|
|
21
|
+
"Nieuw: \u2026",
|
|
22
|
+
"Kop van deze sectie"
|
|
23
|
+
]);
|
|
24
|
+
function isObj(v) {
|
|
25
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
26
|
+
}
|
|
27
|
+
function eigenPad(href) {
|
|
28
|
+
if (!href.startsWith("/") || href.startsWith("//")) return null;
|
|
29
|
+
const pad = href.split(/[?#]/)[0].replace(/\/+$/, "") || "/";
|
|
30
|
+
if (pad.startsWith("/api/") || pad.startsWith("/beheer") || pad.startsWith("/_next")) return null;
|
|
31
|
+
return pad;
|
|
32
|
+
}
|
|
33
|
+
function controleerPagina(page, ctx = {}) {
|
|
34
|
+
let zonderAlt = 0;
|
|
35
|
+
const doodLinks = /* @__PURE__ */ new Set();
|
|
36
|
+
const conceptLinks = /* @__PURE__ */ new Set();
|
|
37
|
+
const ankerLinks = /* @__PURE__ */ new Set();
|
|
38
|
+
let legeLinks = 0;
|
|
39
|
+
const voorbeelden = /* @__PURE__ */ new Set();
|
|
40
|
+
const norm = (p) => p.replace(/\/+$/, "") || "/";
|
|
41
|
+
const bekend = ctx.bekendePaden ? new Set(ctx.bekendePaden.map(norm)) : null;
|
|
42
|
+
const live = ctx.livePaden ? new Set(ctx.livePaden.map(norm)) : null;
|
|
43
|
+
const omgeleid = new Set((ctx.redirects ?? []).map((r) => r.from));
|
|
44
|
+
const ankers = /* @__PURE__ */ new Set();
|
|
45
|
+
const zoekAnkers = (v, d) => {
|
|
46
|
+
if (d > 12 || v == null || typeof v !== "object") return;
|
|
47
|
+
if (Array.isArray(v)) return v.forEach((x) => zoekAnkers(x, d + 1));
|
|
48
|
+
const o = v;
|
|
49
|
+
const id = o._style?.anchorId;
|
|
50
|
+
if (id) ankers.add(id);
|
|
51
|
+
Object.values(o).forEach((x) => zoekAnkers(x, d + 1));
|
|
52
|
+
};
|
|
53
|
+
zoekAnkers(page.blocks ?? [], 0);
|
|
54
|
+
const bekijkHref = (href) => {
|
|
55
|
+
const h = href.trim();
|
|
56
|
+
if (h.startsWith("#") && h.length > 1) {
|
|
57
|
+
if (!ankers.has(decodeURIComponent(h.slice(1)))) ankerLinks.add(h);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const pad = eigenPad(h);
|
|
61
|
+
if (!pad || omgeleid.has(pad)) return;
|
|
62
|
+
if (bekend && !bekend.has(pad)) doodLinks.add(pad);
|
|
63
|
+
else if (live && !live.has(pad)) conceptLinks.add(pad);
|
|
64
|
+
};
|
|
65
|
+
const loop = (v, diepte) => {
|
|
66
|
+
if (diepte > 12 || v == null) return;
|
|
67
|
+
if (Array.isArray(v)) return v.forEach((x) => loop(x, diepte + 1));
|
|
68
|
+
if (!isObj(v)) return;
|
|
69
|
+
if ("alt" in v) {
|
|
70
|
+
const heeftBeeld = Object.entries(v).some(([k, x]) => k !== "alt" && typeof x === "string" && BEELD.test(x));
|
|
71
|
+
if (heeftBeeld && !String(v.alt ?? "").trim()) zonderAlt++;
|
|
72
|
+
}
|
|
73
|
+
for (const [k, x] of Object.entries(v)) {
|
|
74
|
+
if (typeof x !== "string") continue;
|
|
75
|
+
const t = x.trim();
|
|
76
|
+
if (VOORBEELD.has(t) || /^Nieuw: \S/.test(t)) voorbeelden.add(t);
|
|
77
|
+
if (/href$/i.test(k)) {
|
|
78
|
+
bekijkHref(x);
|
|
79
|
+
if ((!x.trim() || x.trim() === "#") && LINKTEKST.some((t2) => typeof v[t2] === "string" && String(v[t2]).trim())) legeLinks++;
|
|
80
|
+
} else if ((k === "html" || /Html$/.test(k)) && x.includes("href")) {
|
|
81
|
+
for (const m of x.matchAll(/href\s*=\s*["']([^"']*)["']/gi)) bekijkHref(m[1]);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
for (const x of Object.values(v)) if (typeof x === "object") loop(x, diepte + 1);
|
|
85
|
+
};
|
|
86
|
+
loop(page.blocks ?? [], 0);
|
|
87
|
+
const uit = [];
|
|
88
|
+
if (zonderAlt > 0) {
|
|
89
|
+
uit.push({ soort: "alt", tekst: zonderAlt === 1 ? "1 foto heeft geen beschrijving (alt-tekst) voor slechtzienden en Google." : `${zonderAlt} foto's hebben geen beschrijving (alt-tekst) voor slechtzienden en Google.` });
|
|
90
|
+
}
|
|
91
|
+
for (const pad of doodLinks) uit.push({ soort: "link", tekst: `Er staat een link naar ${pad}, maar die pagina bestaat niet.` });
|
|
92
|
+
for (const pad of conceptLinks) uit.push({ soort: "linkConcept", tekst: `Er staat een link naar ${pad}, maar die pagina staat nog niet live \u2014 bezoekers krijgen dan een foutpagina.` });
|
|
93
|
+
for (const a of ankerLinks) uit.push({ soort: "anker", tekst: `Een link springt naar ${a}, maar geen blok op deze pagina heeft die sprongnaam (Blokstijl \u2192 Sprongnaam).` });
|
|
94
|
+
if (voorbeelden.size > 0) {
|
|
95
|
+
const eerste = [...voorbeelden].slice(0, 2).map((t) => `\u201C${t}\u201D`).join(" en ");
|
|
96
|
+
uit.push({ soort: "voorbeeld", tekst: `Er staat nog voorbeeldtekst op deze pagina (${eerste}).` });
|
|
97
|
+
}
|
|
98
|
+
const blokken = page.blocks ?? [];
|
|
99
|
+
if (blokken.length === 0) uit.push({ soort: "leeg", tekst: "Deze pagina heeft nog geen inhoud." });
|
|
100
|
+
const h1s = blokken.filter((b) => b._type === "hero" && String(b.title ?? "").trim() && String(b.headingLevel ?? "1") === "1").length;
|
|
101
|
+
if (h1s > 1) uit.push({ soort: "kop", tekst: `Er staan ${h1s} hoofdkoppen op deze pagina. Zet bij de tweede hero \u201CKopniveau\u201D op 2.` });
|
|
102
|
+
if (legeLinks > 0) uit.push({ soort: "linkLeeg", tekst: legeLinks === 1 ? "Een knop of link heeft tekst maar geen bestemming." : `${legeLinks} knoppen of links hebben tekst maar geen bestemming.` });
|
|
103
|
+
const lees = meetLeesbaarheid(paginaTekst(page.blocks ?? []));
|
|
104
|
+
if (lees.woorden >= 80 && lees.score < 30) {
|
|
105
|
+
uit.push({ soort: "leesbaarheid", tekst: `De tekst is ${lees.niveau.naam.toLowerCase()} leesbaar (score ${lees.score}). Kortere zinnen en gewone woorden helpen; zie Leesbaarheid in de pagina-instellingen.` });
|
|
106
|
+
}
|
|
107
|
+
if (!page.seo?.description?.trim()) uit.push({ soort: "seo", tekst: "Er is geen omschrijving voor Google (pagina-instellingen)." });
|
|
108
|
+
if (page.seo?.noindex) uit.push({ soort: "noindex", tekst: "Deze pagina staat op \u201Cniet in Google\u201D." });
|
|
109
|
+
return uit;
|
|
110
|
+
}
|
|
111
|
+
export {
|
|
112
|
+
controleerPagina
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=publicatieCheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/lib/publicatieCheck.ts"],"sourcesContent":["import { meetLeesbaarheid, paginaTekst } from \"./leesbaarheid\";\n\n/**\n * Controle vóór publiceren (8.4) — waarschuwingen, nooit een blokkade. Puur (geen Firestore), zodat\n * hij testbaar is en in de editor én de pagina-instellingen hetzelfde zegt.\n *\n * Gezocht wordt generiek door de blokdata (elk bloktype, ook maatwerk), op vormen die vrijwel zeker\n * iets betekenen: een object met een beeld-URL en een leeg `alt`, een `href` naar een eigen pad dat\n * niet bestaat, een knop met tekst maar zonder link.\n */\nexport interface Waarschuwing {\n soort: \"alt\" | \"link\" | \"linkConcept\" | \"linkLeeg\" | \"anker\" | \"kop\" | \"leeg\" | \"voorbeeld\" | \"seo\" | \"noindex\" | \"leesbaarheid\";\n tekst: string;\n}\n\nconst BEELD = /\\.(jpe?g|png|webp|gif|avif|svg)(\\?|$)|firebasestorage|storage\\.googleapis|images\\.unsplash/i;\nconst LINKTEKST = [\"label\", \"ctaLabel\", \"buttonLabel\", \"text\"];\n\n/**\n * Voorbeeldteksten uit de standaardinhoud van nieuwe blokken (8.12). Een nieuw Diensten-blok\n * begint met \"Dienst één\" en \"Korte omschrijving van wat je biedt.\" — handig om te zien hoe het\n * eruit komt, gênant als het zo live gaat. Exacte teksten, zodat echte inhoud nooit meetelt.\n */\nconst VOORBEELD = new Set([\n \"Dienst één\", \"Dienst twee\", \"Dienst drie\", \"Korte omschrijving van wat je biedt.\", \"Korte omschrijving.\",\n \"Naam Medewerker\", \"Top geholpen!\", \"Echt een aanrader!\", \"Tevreden klant\", \"Een krachtige uitspraak.\",\n \"Een vraag?\", \"Het antwoord.\", \"Inhoud…\", \"Tekst…\", \"Vacaturetitel\", \"€ 00\", \"Nieuw: …\", \"Kop van deze sectie\",\n]);\n\nfunction isObj(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction eigenPad(href: string): string | null {\n if (!href.startsWith(\"/\") || href.startsWith(\"//\")) return null;\n const pad = href.split(/[?#]/)[0].replace(/\\/+$/, \"\") || \"/\";\n if (pad.startsWith(\"/api/\") || pad.startsWith(\"/beheer\") || pad.startsWith(\"/_next\")) return null;\n return pad;\n}\n\nexport function controleerPagina(\n page: { blocks?: unknown[]; seo?: { description?: string; noindex?: boolean } },\n ctx: { bekendePaden?: string[]; livePaden?: string[]; redirects?: { from: string }[] } = {},\n): Waarschuwing[] {\n let zonderAlt = 0;\n const doodLinks = new Set<string>();\n const conceptLinks = new Set<string>();\n const ankerLinks = new Set<string>();\n let legeLinks = 0;\n const voorbeelden = new Set<string>();\n const norm = (p: string) => p.replace(/\\/+$/, \"\") || \"/\";\n const bekend = ctx.bekendePaden ? new Set(ctx.bekendePaden.map(norm)) : null;\n const live = ctx.livePaden ? new Set(ctx.livePaden.map(norm)) : null;\n const omgeleid = new Set((ctx.redirects ?? []).map((r) => r.from));\n // Sprongnamen op deze pagina (8.10): een knop naar \"#contact\" zonder blok dat zo heet doet niets.\n const ankers = new Set<string>();\n const zoekAnkers = (v: unknown, d: number) => {\n if (d > 12 || v == null || typeof v !== \"object\") return;\n if (Array.isArray(v)) return v.forEach((x) => zoekAnkers(x, d + 1));\n const o = v as Record<string, unknown>;\n const id = (o._style as { anchorId?: string } | undefined)?.anchorId;\n if (id) ankers.add(id);\n Object.values(o).forEach((x) => zoekAnkers(x, d + 1));\n };\n zoekAnkers(page.blocks ?? [], 0);\n\n const bekijkHref = (href: string) => {\n const h = href.trim();\n if (h.startsWith(\"#\") && h.length > 1) {\n if (!ankers.has(decodeURIComponent(h.slice(1)))) ankerLinks.add(h);\n return;\n }\n const pad = eigenPad(h);\n if (!pad || omgeleid.has(pad)) return;\n if (bekend && !bekend.has(pad)) doodLinks.add(pad);\n else if (live && !live.has(pad)) conceptLinks.add(pad);\n };\n\n const loop = (v: unknown, diepte: number) => {\n if (diepte > 12 || v == null) return;\n if (Array.isArray(v)) return v.forEach((x) => loop(x, diepte + 1));\n if (!isObj(v)) return;\n if (\"alt\" in v) {\n const heeftBeeld = Object.entries(v).some(([k, x]) => k !== \"alt\" && typeof x === \"string\" && BEELD.test(x));\n if (heeftBeeld && !String(v.alt ?? \"\").trim()) zonderAlt++;\n }\n for (const [k, x] of Object.entries(v)) {\n if (typeof x !== \"string\") continue;\n const t = x.trim();\n if (VOORBEELD.has(t) || /^Nieuw: \\S/.test(t)) voorbeelden.add(t);\n if (/href$/i.test(k)) {\n bekijkHref(x);\n // Knop met tekst maar zonder bestemming: \"Lees meer\" die nergens heen gaat. \"#\" is de\n // standaard van een nieuwe knop en telt dus ook als leeg (8.10).\n if ((!x.trim() || x.trim() === \"#\") && LINKTEKST.some((t) => typeof v[t] === \"string\" && String(v[t]).trim())) legeLinks++;\n } else if ((k === \"html\" || /Html$/.test(k)) && x.includes(\"href\")) {\n // 8.10: ook links ín lopende tekst — daar staan de meeste.\n for (const m of x.matchAll(/href\\s*=\\s*[\"']([^\"']*)[\"']/gi)) bekijkHref(m[1]);\n }\n }\n for (const x of Object.values(v)) if (typeof x === \"object\") loop(x, diepte + 1);\n };\n loop(page.blocks ?? [], 0);\n\n const uit: Waarschuwing[] = [];\n if (zonderAlt > 0) {\n uit.push({ soort: \"alt\", tekst: zonderAlt === 1 ? \"1 foto heeft geen beschrijving (alt-tekst) voor slechtzienden en Google.\" : `${zonderAlt} foto's hebben geen beschrijving (alt-tekst) voor slechtzienden en Google.` });\n }\n for (const pad of doodLinks) uit.push({ soort: \"link\", tekst: `Er staat een link naar ${pad}, maar die pagina bestaat niet.` });\n for (const pad of conceptLinks) uit.push({ soort: \"linkConcept\", tekst: `Er staat een link naar ${pad}, maar die pagina staat nog niet live — bezoekers krijgen dan een foutpagina.` });\n for (const a of ankerLinks) uit.push({ soort: \"anker\", tekst: `Een link springt naar ${a}, maar geen blok op deze pagina heeft die sprongnaam (Blokstijl → Sprongnaam).` });\n if (voorbeelden.size > 0) {\n const eerste = [...voorbeelden].slice(0, 2).map((t) => `“${t}”`).join(\" en \");\n uit.push({ soort: \"voorbeeld\", tekst: `Er staat nog voorbeeldtekst op deze pagina (${eerste}).` });\n }\n const blokken = (page.blocks ?? []) as Record<string, unknown>[];\n if (blokken.length === 0) uit.push({ soort: \"leeg\", tekst: \"Deze pagina heeft nog geen inhoud.\" });\n // Eén hoofdkop per pagina (8.10): twee hero's betekent twee h1's, slecht voor Google en voor wie\n // met een schermlezer navigeert.\n const h1s = blokken.filter((b) => b._type === \"hero\" && String(b.title ?? \"\").trim() && String(b.headingLevel ?? \"1\") === \"1\").length;\n if (h1s > 1) uit.push({ soort: \"kop\", tekst: `Er staan ${h1s} hoofdkoppen op deze pagina. Zet bij de tweede hero “Kopniveau” op 2.` });\n if (legeLinks > 0) uit.push({ soort: \"linkLeeg\", tekst: legeLinks === 1 ? \"Een knop of link heeft tekst maar geen bestemming.\" : `${legeLinks} knoppen of links hebben tekst maar geen bestemming.` });\n // 8.5: alleen bij echt lastige tekst, en pas vanaf een stuk of tachtig woorden (daaronder zegt de\n // score weinig).\n const lees = meetLeesbaarheid(paginaTekst(page.blocks ?? []));\n if (lees.woorden >= 80 && lees.score < 30) {\n uit.push({ soort: \"leesbaarheid\", tekst: `De tekst is ${lees.niveau.naam.toLowerCase()} leesbaar (score ${lees.score}). Kortere zinnen en gewone woorden helpen; zie Leesbaarheid in de pagina-instellingen.` });\n }\n if (!page.seo?.description?.trim()) uit.push({ soort: \"seo\", tekst: \"Er is geen omschrijving voor Google (pagina-instellingen).\" });\n if (page.seo?.noindex) uit.push({ soort: \"noindex\", tekst: \"Deze pagina staat op “niet in Google”.\" });\n return uit;\n}\n"],"mappings":"AAAA,SAAS,kBAAkB,mBAAmB;AAe9C,MAAM,QAAQ;AACd,MAAM,YAAY,CAAC,SAAS,YAAY,eAAe,MAAM;AAO7D,MAAM,YAAY,oBAAI,IAAI;AAAA,EACxB;AAAA,EAAc;AAAA,EAAe;AAAA,EAAe;AAAA,EAAwC;AAAA,EACpF;AAAA,EAAmB;AAAA,EAAiB;AAAA,EAAsB;AAAA,EAAkB;AAAA,EAC5E;AAAA,EAAc;AAAA,EAAiB;AAAA,EAAW;AAAA,EAAU;AAAA,EAAiB;AAAA,EAAQ;AAAA,EAAY;AAC3F,CAAC;AAED,SAAS,MAAM,GAA0C;AACvD,SAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,CAAC;AAChE;AAEA,SAAS,SAAS,MAA6B;AAC7C,MAAI,CAAC,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,IAAI,EAAG,QAAO;AAC3D,QAAM,MAAM,KAAK,MAAM,MAAM,EAAE,CAAC,EAAE,QAAQ,QAAQ,EAAE,KAAK;AACzD,MAAI,IAAI,WAAW,OAAO,KAAK,IAAI,WAAW,SAAS,KAAK,IAAI,WAAW,QAAQ,EAAG,QAAO;AAC7F,SAAO;AACT;AAEO,SAAS,iBACd,MACA,MAAyF,CAAC,GAC1E;AAChB,MAAI,YAAY;AAChB,QAAM,YAAY,oBAAI,IAAY;AAClC,QAAM,eAAe,oBAAI,IAAY;AACrC,QAAM,aAAa,oBAAI,IAAY;AACnC,MAAI,YAAY;AAChB,QAAM,cAAc,oBAAI,IAAY;AACpC,QAAM,OAAO,CAAC,MAAc,EAAE,QAAQ,QAAQ,EAAE,KAAK;AACrD,QAAM,SAAS,IAAI,eAAe,IAAI,IAAI,IAAI,aAAa,IAAI,IAAI,CAAC,IAAI;AACxE,QAAM,OAAO,IAAI,YAAY,IAAI,IAAI,IAAI,UAAU,IAAI,IAAI,CAAC,IAAI;AAChE,QAAM,WAAW,IAAI,KAAK,IAAI,aAAa,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAEjE,QAAM,SAAS,oBAAI,IAAY;AAC/B,QAAM,aAAa,CAAC,GAAY,MAAc;AAC5C,QAAI,IAAI,MAAM,KAAK,QAAQ,OAAO,MAAM,SAAU;AAClD,QAAI,MAAM,QAAQ,CAAC,EAAG,QAAO,EAAE,QAAQ,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC;AAClE,UAAM,IAAI;AACV,UAAM,KAAM,EAAE,QAA8C;AAC5D,QAAI,GAAI,QAAO,IAAI,EAAE;AACrB,WAAO,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC;AAAA,EACtD;AACA,aAAW,KAAK,UAAU,CAAC,GAAG,CAAC;AAE/B,QAAM,aAAa,CAAC,SAAiB;AACnC,UAAM,IAAI,KAAK,KAAK;AACpB,QAAI,EAAE,WAAW,GAAG,KAAK,EAAE,SAAS,GAAG;AACrC,UAAI,CAAC,OAAO,IAAI,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC,EAAG,YAAW,IAAI,CAAC;AACjE;AAAA,IACF;AACA,UAAM,MAAM,SAAS,CAAC;AACtB,QAAI,CAAC,OAAO,SAAS,IAAI,GAAG,EAAG;AAC/B,QAAI,UAAU,CAAC,OAAO,IAAI,GAAG,EAAG,WAAU,IAAI,GAAG;AAAA,aACxC,QAAQ,CAAC,KAAK,IAAI,GAAG,EAAG,cAAa,IAAI,GAAG;AAAA,EACvD;AAEA,QAAM,OAAO,CAAC,GAAY,WAAmB;AAC3C,QAAI,SAAS,MAAM,KAAK,KAAM;AAC9B,QAAI,MAAM,QAAQ,CAAC,EAAG,QAAO,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC;AACjE,QAAI,CAAC,MAAM,CAAC,EAAG;AACf,QAAI,SAAS,GAAG;AACd,YAAM,aAAa,OAAO,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,MAAM,SAAS,OAAO,MAAM,YAAY,MAAM,KAAK,CAAC,CAAC;AAC3G,UAAI,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,EAAG;AAAA,IACjD;AACA,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,CAAC,GAAG;AACtC,UAAI,OAAO,MAAM,SAAU;AAC3B,YAAM,IAAI,EAAE,KAAK;AACjB,UAAI,UAAU,IAAI,CAAC,KAAK,aAAa,KAAK,CAAC,EAAG,aAAY,IAAI,CAAC;AAC/D,UAAI,SAAS,KAAK,CAAC,GAAG;AACpB,mBAAW,CAAC;AAGZ,aAAK,CAAC,EAAE,KAAK,KAAK,EAAE,KAAK,MAAM,QAAQ,UAAU,KAAK,CAACA,OAAM,OAAO,EAAEA,EAAC,MAAM,YAAY,OAAO,EAAEA,EAAC,CAAC,EAAE,KAAK,CAAC,EAAG;AAAA,MACjH,YAAY,MAAM,UAAU,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,GAAG;AAElE,mBAAW,KAAK,EAAE,SAAS,+BAA+B,EAAG,YAAW,EAAE,CAAC,CAAC;AAAA,MAC9E;AAAA,IACF;AACA,eAAW,KAAK,OAAO,OAAO,CAAC,EAAG,KAAI,OAAO,MAAM,SAAU,MAAK,GAAG,SAAS,CAAC;AAAA,EACjF;AACA,OAAK,KAAK,UAAU,CAAC,GAAG,CAAC;AAEzB,QAAM,MAAsB,CAAC;AAC7B,MAAI,YAAY,GAAG;AACjB,QAAI,KAAK,EAAE,OAAO,OAAO,OAAO,cAAc,IAAI,6EAA6E,GAAG,SAAS,6EAA6E,CAAC;AAAA,EAC3N;AACA,aAAW,OAAO,UAAW,KAAI,KAAK,EAAE,OAAO,QAAQ,OAAO,0BAA0B,GAAG,kCAAkC,CAAC;AAC9H,aAAW,OAAO,aAAc,KAAI,KAAK,EAAE,OAAO,eAAe,OAAO,0BAA0B,GAAG,qFAAgF,CAAC;AACtL,aAAW,KAAK,WAAY,KAAI,KAAK,EAAE,OAAO,SAAS,OAAO,yBAAyB,CAAC,sFAAiF,CAAC;AAC1K,MAAI,YAAY,OAAO,GAAG;AACxB,UAAM,SAAS,CAAC,GAAG,WAAW,EAAE,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,SAAI,CAAC,QAAG,EAAE,KAAK,MAAM;AAC5E,QAAI,KAAK,EAAE,OAAO,aAAa,OAAO,+CAA+C,MAAM,KAAK,CAAC;AAAA,EACnG;AACA,QAAM,UAAW,KAAK,UAAU,CAAC;AACjC,MAAI,QAAQ,WAAW,EAAG,KAAI,KAAK,EAAE,OAAO,QAAQ,OAAO,qCAAqC,CAAC;AAGjG,QAAM,MAAM,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,UAAU,OAAO,EAAE,SAAS,EAAE,EAAE,KAAK,KAAK,OAAO,EAAE,gBAAgB,GAAG,MAAM,GAAG,EAAE;AAC/H,MAAI,MAAM,EAAG,KAAI,KAAK,EAAE,OAAO,OAAO,OAAO,YAAY,GAAG,kFAAwE,CAAC;AACrI,MAAI,YAAY,EAAG,KAAI,KAAK,EAAE,OAAO,YAAY,OAAO,cAAc,IAAI,uDAAuD,GAAG,SAAS,uDAAuD,CAAC;AAGrM,QAAM,OAAO,iBAAiB,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC;AAC5D,MAAI,KAAK,WAAW,MAAM,KAAK,QAAQ,IAAI;AACzC,QAAI,KAAK,EAAE,OAAO,gBAAgB,OAAO,eAAe,KAAK,OAAO,KAAK,YAAY,CAAC,oBAAoB,KAAK,KAAK,0FAA0F,CAAC;AAAA,EACjN;AACA,MAAI,CAAC,KAAK,KAAK,aAAa,KAAK,EAAG,KAAI,KAAK,EAAE,OAAO,OAAO,OAAO,6DAA6D,CAAC;AAClI,MAAI,KAAK,KAAK,QAAS,KAAI,KAAK,EAAE,OAAO,WAAW,OAAO,mDAAyC,CAAC;AACrG,SAAO;AACT;","names":["t"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lijst + detail op een telefoon (8.2). Pagina's, Formulieren en Producten zetten de lijst boven het
|
|
3
|
+
* detail; wie op een item tikte zag niets veranderen, want het detail verscheen ver onder de vouw.
|
|
4
|
+
* Bij een nieuwe keuze op een smal scherm scrollen we het detail in beeld (niet bij het openen).
|
|
5
|
+
*/
|
|
6
|
+
export declare function useScrollNaarDetail<T extends HTMLElement = HTMLDivElement>(gekozen: string | null): import("react").RefObject<T | null>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEffect, useRef } from "react";
|
|
3
|
+
function useScrollNaarDetail(gekozen) {
|
|
4
|
+
const ref = useRef(null);
|
|
5
|
+
const eerste = useRef(true);
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
if (eerste.current) {
|
|
8
|
+
eerste.current = false;
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
if (!gekozen || typeof window === "undefined") return;
|
|
12
|
+
if (!window.matchMedia?.("(max-width: 767px)").matches) return;
|
|
13
|
+
ref.current?.scrollIntoView({ behavior: "smooth", block: "start" });
|
|
14
|
+
}, [gekozen]);
|
|
15
|
+
return ref;
|
|
16
|
+
}
|
|
17
|
+
export {
|
|
18
|
+
useScrollNaarDetail
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=scrollNaarDetail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/lib/scrollNaarDetail.ts"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef } from \"react\";\n\n/**\n * Lijst + detail op een telefoon (8.2). Pagina's, Formulieren en Producten zetten de lijst boven het\n * detail; wie op een item tikte zag niets veranderen, want het detail verscheen ver onder de vouw.\n * Bij een nieuwe keuze op een smal scherm scrollen we het detail in beeld (niet bij het openen).\n */\nexport function useScrollNaarDetail<T extends HTMLElement = HTMLDivElement>(gekozen: string | null) {\n const ref = useRef<T>(null);\n const eerste = useRef(true);\n useEffect(() => {\n if (eerste.current) {\n eerste.current = false;\n return;\n }\n if (!gekozen || typeof window === \"undefined\") return;\n if (!window.matchMedia?.(\"(max-width: 767px)\").matches) return;\n ref.current?.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n }, [gekozen]);\n return ref;\n}\n"],"mappings":";AAEA,SAAS,WAAW,cAAc;AAO3B,SAAS,oBAA4D,SAAwB;AAClG,QAAM,MAAM,OAAU,IAAI;AAC1B,QAAM,SAAS,OAAO,IAAI;AAC1B,YAAU,MAAM;AACd,QAAI,OAAO,SAAS;AAClB,aAAO,UAAU;AACjB;AAAA,IACF;AACA,QAAI,CAAC,WAAW,OAAO,WAAW,YAAa;AAC/C,QAAI,CAAC,OAAO,aAAa,oBAAoB,EAAE,QAAS;AACxD,QAAI,SAAS,eAAe,EAAE,UAAU,UAAU,OAAO,QAAQ,CAAC;AAAA,EACpE,GAAG,CAAC,OAAO,CAAC;AACZ,SAAO;AACT;","names":[]}
|
|
@@ -6,8 +6,18 @@ export declare function saveSymbol(input: {
|
|
|
6
6
|
symbolId?: string;
|
|
7
7
|
name: string;
|
|
8
8
|
blocks: Record<string, unknown>[];
|
|
9
|
+
translations?: Record<string, Record<string, string>>;
|
|
9
10
|
}): Promise<{
|
|
10
11
|
id: string;
|
|
11
12
|
message?: string;
|
|
12
13
|
}>;
|
|
13
14
|
export declare function deleteSymbol(siteId: string, symbolId: string): Promise<void>;
|
|
15
|
+
export interface SymboolVersie {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
blocks: Record<string, unknown>[];
|
|
19
|
+
translations?: Record<string, Record<string, string>>;
|
|
20
|
+
savedAt?: unknown;
|
|
21
|
+
}
|
|
22
|
+
/** De laatste versies van een symbool (8.10; geschreven door saveSymbol vóór elke overschrijving). */
|
|
23
|
+
export declare function subscribeSymbolVersions(siteId: string, symbolId: string, cb: (v: SymboolVersie[]) => void): () => void;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { collection, doc, getDoc, onSnapshot } from "firebase/firestore";
|
|
2
|
+
import { collection, doc, getDoc, limit, onSnapshot, orderBy, query } from "firebase/firestore";
|
|
3
3
|
import { callable } from "../../firebase/functionsClient.js";
|
|
4
4
|
import { getDb, getFirebaseApp } from "../../firebase/client.js";
|
|
5
5
|
import { SymbolSchema } from "../../schema/symbols.js";
|
|
@@ -41,10 +41,23 @@ async function deleteSymbol(siteId, symbolId) {
|
|
|
41
41
|
if (!app) throw new Error("Firebase niet geconfigureerd.");
|
|
42
42
|
await callable(app, "deleteSymbol")({ siteId, symbolId });
|
|
43
43
|
}
|
|
44
|
+
function subscribeSymbolVersions(siteId, symbolId, cb) {
|
|
45
|
+
const db = getDb();
|
|
46
|
+
if (!db || !symbolId) {
|
|
47
|
+
cb([]);
|
|
48
|
+
return () => void 0;
|
|
49
|
+
}
|
|
50
|
+
return onSnapshot(
|
|
51
|
+
query(collection(db, "sites", siteId, "symbols", symbolId, "versions"), orderBy("savedAt", "desc"), limit(10)),
|
|
52
|
+
(snap) => cb(snap.docs.map((d) => ({ id: d.id, ...d.data() }))),
|
|
53
|
+
() => cb([])
|
|
54
|
+
);
|
|
55
|
+
}
|
|
44
56
|
export {
|
|
45
57
|
deleteSymbol,
|
|
46
58
|
getSymbolOnce,
|
|
47
59
|
saveSymbol,
|
|
60
|
+
subscribeSymbolVersions,
|
|
48
61
|
subscribeSymbols
|
|
49
62
|
};
|
|
50
63
|
//# sourceMappingURL=symbolsClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/admin/lib/symbolsClient.ts"],"sourcesContent":["\"use client\";\n\n/** Dataclient voor symbolen (5.0): live lijst + opslaan/verwijderen via de callables. */\nimport { collection, doc, getDoc, onSnapshot } from \"firebase/firestore\";\nimport { callable } from \"../../firebase/functionsClient\";\nimport { getDb, getFirebaseApp } from \"../../firebase/client\";\nimport { SymbolSchema, type StoredSymbol } from \"../../schema/symbols\";\n\nexport function subscribeSymbols(siteId: string, cb: (symbols: StoredSymbol[]) => void): () => void {\n const db = getDb();\n if (!db) {\n cb([]);\n return () => undefined;\n }\n return onSnapshot(\n collection(db, \"sites\", siteId, \"symbols\"),\n (snap) => {\n const out: StoredSymbol[] = [];\n snap.forEach((d) => {\n const res = SymbolSchema.safeParse(d.data());\n if (res.success) out.push({ id: d.id, ...res.data });\n });\n cb(out.sort((a, b) => a.name.localeCompare(b.name)));\n },\n () => cb([]),\n );\n}\n\nexport async function getSymbolOnce(siteId: string, symbolId: string): Promise<StoredSymbol | null> {\n const db = getDb();\n if (!db) return null;\n const snap = await getDoc(doc(db, \"sites\", siteId, \"symbols\", symbolId));\n if (!snap.exists()) return null;\n const res = SymbolSchema.safeParse(snap.data());\n return res.success ? { id: snap.id, ...res.data } : null;\n}\n\nexport async function saveSymbol(input: {\n siteId: string;\n symbolId?: string;\n name: string;\n blocks: Record<string, unknown>[];\n}): Promise<{ id: string; message?: string }> {\n const app = getFirebaseApp();\n if (!app) throw new Error(\"Firebase niet geconfigureerd.\");\n const fn = callable<typeof input, { id: string; message?: string }>(app, \"saveSymbol\");\n return (await fn(input)).data;\n}\n\nexport async function deleteSymbol(siteId: string, symbolId: string): Promise<void> {\n const app = getFirebaseApp();\n if (!app) throw new Error(\"Firebase niet geconfigureerd.\");\n await callable(app, \"deleteSymbol\")({ siteId, symbolId });\n}\n"],"mappings":";AAGA,SAAS,YAAY,KAAK,QAAQ,
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/lib/symbolsClient.ts"],"sourcesContent":["\"use client\";\n\n/** Dataclient voor symbolen (5.0): live lijst + opslaan/verwijderen via de callables. */\nimport { collection, doc, getDoc, limit, onSnapshot, orderBy, query } from \"firebase/firestore\";\nimport { callable } from \"../../firebase/functionsClient\";\nimport { getDb, getFirebaseApp } from \"../../firebase/client\";\nimport { SymbolSchema, type StoredSymbol } from \"../../schema/symbols\";\n\nexport function subscribeSymbols(siteId: string, cb: (symbols: StoredSymbol[]) => void): () => void {\n const db = getDb();\n if (!db) {\n cb([]);\n return () => undefined;\n }\n return onSnapshot(\n collection(db, \"sites\", siteId, \"symbols\"),\n (snap) => {\n const out: StoredSymbol[] = [];\n snap.forEach((d) => {\n const res = SymbolSchema.safeParse(d.data());\n if (res.success) out.push({ id: d.id, ...res.data });\n });\n cb(out.sort((a, b) => a.name.localeCompare(b.name)));\n },\n () => cb([]),\n );\n}\n\nexport async function getSymbolOnce(siteId: string, symbolId: string): Promise<StoredSymbol | null> {\n const db = getDb();\n if (!db) return null;\n const snap = await getDoc(doc(db, \"sites\", siteId, \"symbols\", symbolId));\n if (!snap.exists()) return null;\n const res = SymbolSchema.safeParse(snap.data());\n return res.success ? { id: snap.id, ...res.data } : null;\n}\n\nexport async function saveSymbol(input: {\n siteId: string;\n symbolId?: string;\n name: string;\n blocks: Record<string, unknown>[];\n translations?: Record<string, Record<string, string>>;\n}): Promise<{ id: string; message?: string }> {\n const app = getFirebaseApp();\n if (!app) throw new Error(\"Firebase niet geconfigureerd.\");\n const fn = callable<typeof input, { id: string; message?: string }>(app, \"saveSymbol\");\n return (await fn(input)).data;\n}\n\nexport async function deleteSymbol(siteId: string, symbolId: string): Promise<void> {\n const app = getFirebaseApp();\n if (!app) throw new Error(\"Firebase niet geconfigureerd.\");\n await callable(app, \"deleteSymbol\")({ siteId, symbolId });\n}\n\nexport interface SymboolVersie {\n id: string;\n name: string;\n blocks: Record<string, unknown>[];\n translations?: Record<string, Record<string, string>>;\n savedAt?: unknown;\n}\n\n/** De laatste versies van een symbool (8.10; geschreven door saveSymbol vóór elke overschrijving). */\nexport function subscribeSymbolVersions(siteId: string, symbolId: string, cb: (v: SymboolVersie[]) => void): () => void {\n const db = getDb();\n if (!db || !symbolId) {\n cb([]);\n return () => undefined;\n }\n return onSnapshot(\n query(collection(db, \"sites\", siteId, \"symbols\", symbolId, \"versions\"), orderBy(\"savedAt\", \"desc\"), limit(10)),\n (snap) => cb(snap.docs.map((d) => ({ id: d.id, ...(d.data() as Omit<SymboolVersie, \"id\">) }))),\n () => cb([]),\n );\n}\n"],"mappings":";AAGA,SAAS,YAAY,KAAK,QAAQ,OAAO,YAAY,SAAS,aAAa;AAC3E,SAAS,gBAAgB;AACzB,SAAS,OAAO,sBAAsB;AACtC,SAAS,oBAAuC;AAEzC,SAAS,iBAAiB,QAAgB,IAAmD;AAClG,QAAM,KAAK,MAAM;AACjB,MAAI,CAAC,IAAI;AACP,OAAG,CAAC,CAAC;AACL,WAAO,MAAM;AAAA,EACf;AACA,SAAO;AAAA,IACL,WAAW,IAAI,SAAS,QAAQ,SAAS;AAAA,IACzC,CAAC,SAAS;AACR,YAAM,MAAsB,CAAC;AAC7B,WAAK,QAAQ,CAAC,MAAM;AAClB,cAAM,MAAM,aAAa,UAAU,EAAE,KAAK,CAAC;AAC3C,YAAI,IAAI,QAAS,KAAI,KAAK,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,CAAC;AAAA,MACrD,CAAC;AACD,SAAG,IAAI,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,CAAC;AAAA,IACrD;AAAA,IACA,MAAM,GAAG,CAAC,CAAC;AAAA,EACb;AACF;AAEA,eAAsB,cAAc,QAAgB,UAAgD;AAClG,QAAM,KAAK,MAAM;AACjB,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,OAAO,MAAM,OAAO,IAAI,IAAI,SAAS,QAAQ,WAAW,QAAQ,CAAC;AACvE,MAAI,CAAC,KAAK,OAAO,EAAG,QAAO;AAC3B,QAAM,MAAM,aAAa,UAAU,KAAK,KAAK,CAAC;AAC9C,SAAO,IAAI,UAAU,EAAE,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI;AACtD;AAEA,eAAsB,WAAW,OAMa;AAC5C,QAAM,MAAM,eAAe;AAC3B,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,+BAA+B;AACzD,QAAM,KAAK,SAAyD,KAAK,YAAY;AACrF,UAAQ,MAAM,GAAG,KAAK,GAAG;AAC3B;AAEA,eAAsB,aAAa,QAAgB,UAAiC;AAClF,QAAM,MAAM,eAAe;AAC3B,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,+BAA+B;AACzD,QAAM,SAAS,KAAK,cAAc,EAAE,EAAE,QAAQ,SAAS,CAAC;AAC1D;AAWO,SAAS,wBAAwB,QAAgB,UAAkB,IAA8C;AACtH,QAAM,KAAK,MAAM;AACjB,MAAI,CAAC,MAAM,CAAC,UAAU;AACpB,OAAG,CAAC,CAAC;AACL,WAAO,MAAM;AAAA,EACf;AACA,SAAO;AAAA,IACL,MAAM,WAAW,IAAI,SAAS,QAAQ,WAAW,UAAU,UAAU,GAAG,QAAQ,WAAW,MAAM,GAAG,MAAM,EAAE,CAAC;AAAA,IAC7G,CAAC,SAAS,GAAG,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,GAAI,EAAE,KAAK,EAAgC,EAAE,CAAC;AAAA,IAC7F,MAAM,GAAG,CAAC,CAAC;AAAA,EACb;AACF;","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inline bewerken (8.11): alleen echte tekstvelden worden contentEditable.
|
|
3
|
+
*
|
|
4
|
+
* Foto's dragen dezelfde `data-xicms-edit`-haak als tekst (voor de wijzigingsmarkering en "Foto
|
|
5
|
+
* wijzigen"). Als tekstveld gebonden werd een foto contentEditable, en bij het verlaten schreef de
|
|
6
|
+
* lege tekst over het foto-adres heen: één klik op het potlood van een hero wiste de foto.
|
|
7
|
+
*/
|
|
8
|
+
export declare function isTekstVeld(el: Element, field: string): boolean;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
function isTekstVeld(el, field) {
|
|
2
|
+
if (/(^|\.)\w*(url|Url|href|Href|src|Src)$/.test(field)) return false;
|
|
3
|
+
if (/^(IMG|PICTURE|VIDEO|SOURCE|IFRAME|SVG)$/i.test(el.tagName)) return false;
|
|
4
|
+
if (el.querySelector("img, picture, video, iframe") && !(el.textContent ?? "").trim()) return false;
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
export {
|
|
8
|
+
isTekstVeld
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=tekstVeld.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/lib/tekstVeld.ts"],"sourcesContent":["/**\n * Inline bewerken (8.11): alleen echte tekstvelden worden contentEditable.\n *\n * Foto's dragen dezelfde `data-xicms-edit`-haak als tekst (voor de wijzigingsmarkering en \"Foto\n * wijzigen\"). Als tekstveld gebonden werd een foto contentEditable, en bij het verlaten schreef de\n * lege tekst over het foto-adres heen: één klik op het potlood van een hero wiste de foto.\n */\nexport function isTekstVeld(el: Element, field: string): boolean {\n if (/(^|\\.)\\w*(url|Url|href|Href|src|Src)$/.test(field)) return false;\n if (/^(IMG|PICTURE|VIDEO|SOURCE|IFRAME|SVG)$/i.test(el.tagName)) return false;\n if (el.querySelector(\"img, picture, video, iframe\") && !(el.textContent ?? \"\").trim()) return false;\n return true;\n}\n\n"],"mappings":"AAOO,SAAS,YAAY,IAAa,OAAwB;AAC/D,MAAI,wCAAwC,KAAK,KAAK,EAAG,QAAO;AAChE,MAAI,2CAA2C,KAAK,GAAG,OAAO,EAAG,QAAO;AACxE,MAAI,GAAG,cAAc,6BAA6B,KAAK,EAAE,GAAG,eAAe,IAAI,KAAK,EAAG,QAAO;AAC9F,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useAuth } from "../../auth/AuthProvider.js";
|
|
3
|
+
function useIsSuperadmin() {
|
|
4
|
+
try {
|
|
5
|
+
return useAuth().role === "superadmin";
|
|
6
|
+
} catch {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export {
|
|
11
|
+
useIsSuperadmin
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=useIsSuperadmin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/lib/useIsSuperadmin.ts"],"sourcesContent":["\"use client\";\n\nimport { useAuth } from \"../../auth/AuthProvider\";\n\n/** Is de ingelogde gebruiker superadmin? Buiten de provider (tests, losse render): nee — de veilige kant. */\nexport function useIsSuperadmin(): boolean {\n try {\n return useAuth().role === \"superadmin\";\n } catch {\n return false;\n }\n}\n"],"mappings":";AAEA,SAAS,eAAe;AAGjB,SAAS,kBAA2B;AACzC,MAAI;AACF,WAAO,QAAQ,EAAE,SAAS;AAAA,EAC5B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Field } from "../../schema/fields.js";
|
|
2
|
+
/** Velden die alleen Xi Webdesign hoeft te zien (technisch, of met gevolgen buiten de pagina). */
|
|
3
|
+
export declare const TECHNISCHE_VELDEN: Set<string>;
|
|
4
|
+
/** "imageStyle" → "Image style" als het echt nergens staat — beter dan een camelCase-sleutel. */
|
|
5
|
+
export declare function mensVanSleutel(sleutel: string): string;
|
|
6
|
+
export declare function optieLabel(veld: string, waarde: string): string;
|
|
7
|
+
/** Het Nederlandse label voor een veldsleutel (de laatste schakel van een pad). */
|
|
8
|
+
export declare function veldLabel(sleutel: string): string;
|
|
9
|
+
export declare function itemNaam(blokType: string, pad: string): string | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Vertaalt een afgeleide Field-IR. Alleen waar het schema/de hint niets zei: een label dat gelijk
|
|
12
|
+
* is aan de sleutel gold als "niet gezet". Recursief door groepen en lijsten.
|
|
13
|
+
*/
|
|
14
|
+
export declare function vertaalVelden(velden: Field[], blokType: string, pad?: string): Field[];
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
const LABELS = {
|
|
2
|
+
heading: "Kop",
|
|
3
|
+
intro: "Inleiding",
|
|
4
|
+
title: "Titel",
|
|
5
|
+
subtitle: "Ondertitel",
|
|
6
|
+
eyebrow: "Regeltje boven de titel",
|
|
7
|
+
text: "Tekst",
|
|
8
|
+
description: "Omschrijving",
|
|
9
|
+
body: "Tekst",
|
|
10
|
+
bio: "Over deze persoon",
|
|
11
|
+
quote: "Citaat",
|
|
12
|
+
author: "Naam",
|
|
13
|
+
role: "Functie of plaats",
|
|
14
|
+
name: "Naam",
|
|
15
|
+
label: "Tekst",
|
|
16
|
+
linkLabel: "Tekst van de link",
|
|
17
|
+
buttonLabel: "Knoptekst",
|
|
18
|
+
buttonHref: "Knoplink",
|
|
19
|
+
buttonVariant: "Knopstijl",
|
|
20
|
+
button2Label: "Tweede knop: tekst",
|
|
21
|
+
button2Href: "Tweede knop: link",
|
|
22
|
+
ctaLabel: "Knoptekst",
|
|
23
|
+
ctaHref: "Knoplink",
|
|
24
|
+
href: "Link",
|
|
25
|
+
url: "Adres",
|
|
26
|
+
applyUrl: "Link om te solliciteren",
|
|
27
|
+
icon: "Icoon",
|
|
28
|
+
imageUrl: "Foto",
|
|
29
|
+
photoUrl: "Foto",
|
|
30
|
+
avatarUrl: "Foto",
|
|
31
|
+
beforeUrl: "Foto v\xF3\xF3r",
|
|
32
|
+
afterUrl: "Foto na",
|
|
33
|
+
beforeLabel: "Label v\xF3\xF3r",
|
|
34
|
+
afterLabel: "Label na",
|
|
35
|
+
src: "Logo",
|
|
36
|
+
alt: "Beschrijving van de foto",
|
|
37
|
+
columns: "Kolommen",
|
|
38
|
+
imageStyle: "Fotostijl",
|
|
39
|
+
layout: "Weergave",
|
|
40
|
+
align: "Uitlijning",
|
|
41
|
+
variant: "Stijl",
|
|
42
|
+
tone: "Kleur",
|
|
43
|
+
size: "Grootte",
|
|
44
|
+
spacing: "Ruimte",
|
|
45
|
+
height: "Hoogte",
|
|
46
|
+
aspectRatio: "Verhouding",
|
|
47
|
+
position: "Plaats op het scherm",
|
|
48
|
+
items: "Onderdelen",
|
|
49
|
+
members: "Teamleden",
|
|
50
|
+
rows: "Regels",
|
|
51
|
+
documents: "Documenten",
|
|
52
|
+
social: "Social media",
|
|
53
|
+
platform: "Platform",
|
|
54
|
+
featured: "Uitgelicht",
|
|
55
|
+
rating: "Sterren",
|
|
56
|
+
value: "Getal",
|
|
57
|
+
prefix: "V\xF3\xF3r het getal",
|
|
58
|
+
suffix: "Na het getal",
|
|
59
|
+
animate: "Laten optellen bij in beeld komen",
|
|
60
|
+
day: "Dag",
|
|
61
|
+
hours: "Tijden",
|
|
62
|
+
date: "Datum",
|
|
63
|
+
datePosted: "Geplaatst op",
|
|
64
|
+
category: "Categorie",
|
|
65
|
+
location: "Plaats",
|
|
66
|
+
employmentType: "Soort dienstverband",
|
|
67
|
+
salary: "Salaris",
|
|
68
|
+
department: "Afdeling",
|
|
69
|
+
email: "E-mailadres",
|
|
70
|
+
phone: "Telefoonnummer",
|
|
71
|
+
meta: "Extra info (bv. 'PDF \xB7 2 MB')",
|
|
72
|
+
prefilledText: "Begintekst van het bericht",
|
|
73
|
+
placeholder: "Tekst in het zoekveld",
|
|
74
|
+
homeLabel: "Naam van de homepage",
|
|
75
|
+
dismissible: "Bezoeker kan de balk wegklikken",
|
|
76
|
+
dismissVersion: "Versie (voor opnieuw tonen)",
|
|
77
|
+
showStatus: "Toon 'nu open / gesloten'",
|
|
78
|
+
showFilter: "Filterknoppen per categorie",
|
|
79
|
+
lightbox: "Foto groot openen bij klikken",
|
|
80
|
+
showDownload: "Downloadknop tonen",
|
|
81
|
+
includeNews: "Ook nieuwsberichten doorzoeken",
|
|
82
|
+
grayscale: "Logo's in grijstinten",
|
|
83
|
+
marquee: "Laten doorschuiven",
|
|
84
|
+
alternate: "Afwisselend links en rechts",
|
|
85
|
+
groupByDepartment: "Groeperen per afdeling",
|
|
86
|
+
sticky: "Vast onderaan het scherm",
|
|
87
|
+
jsonLd: "Laat Google dit herkennen",
|
|
88
|
+
sections: "Onderdelen",
|
|
89
|
+
note: "Toelichting",
|
|
90
|
+
footnote: "Kleine lettertjes onderaan",
|
|
91
|
+
price: "Prijs",
|
|
92
|
+
duration: "Duur",
|
|
93
|
+
tags: "Labels (met komma's)",
|
|
94
|
+
vAlign: "Tekst verticaal",
|
|
95
|
+
trust: "Vertrouwenspunten (\u2713)",
|
|
96
|
+
status: "Status",
|
|
97
|
+
start: "Begint op",
|
|
98
|
+
end: "Eindigt op",
|
|
99
|
+
address: "Adres (als het niet bij jou is)",
|
|
100
|
+
events: "Activiteiten",
|
|
101
|
+
icalUrl: "iCal-link (agenda-export)",
|
|
102
|
+
months: "Aantal maanden",
|
|
103
|
+
minNights: "Minimaal aantal nachten",
|
|
104
|
+
requestPath: "Pagina met het aanvraagformulier",
|
|
105
|
+
requestLabel: "Tekst op de knop",
|
|
106
|
+
periodField: "Formulierveld voor de periode (technische naam)",
|
|
107
|
+
unitField: "Formulierveld voor de accommodatie (technische naam)",
|
|
108
|
+
reviewKnop: "Knop \u2018Laat een review achter\u2019 (link uit Instellingen \u2192 Bedrijf)",
|
|
109
|
+
minHeight: "Hoogte",
|
|
110
|
+
headingLevel: "Kopniveau",
|
|
111
|
+
overlayOpacity: "Donker maken (%)",
|
|
112
|
+
overlayGradient: "Verloop voor leesbare tekst",
|
|
113
|
+
overlayColor: "Kleur over de foto",
|
|
114
|
+
videoUrl: "Video (mp4)"
|
|
115
|
+
};
|
|
116
|
+
const HINTS = {
|
|
117
|
+
jsonLd: "Gestructureerde gegevens voor Google (bijvoorbeeld openingstijden of vacatures in de zoekresultaten).",
|
|
118
|
+
dismissVersion: "Verhoog dit getal om de balk opnieuw te tonen aan bezoekers die hem al wegklikten.",
|
|
119
|
+
alt: "Voor slechtzienden en Google: wat staat er op de foto?",
|
|
120
|
+
icon: "Een emoji, bijvoorbeeld \u{1F331} of \u2702\uFE0F",
|
|
121
|
+
prefilledText: "Staat alvast in het WhatsApp-bericht van de bezoeker."
|
|
122
|
+
};
|
|
123
|
+
const TECHNISCHE_VELDEN = /* @__PURE__ */ new Set(["dismissVersion"]);
|
|
124
|
+
const LANGE_TEKST = /* @__PURE__ */ new Set(["text", "description", "bio", "quote", "intro", "body", "prefilledText", "detail", "note"]);
|
|
125
|
+
const FOTO = /* @__PURE__ */ new Set(["beforeUrl", "afterUrl", "src"]);
|
|
126
|
+
const ICOON = /* @__PURE__ */ new Set(["icon"]);
|
|
127
|
+
const DATUM = /* @__PURE__ */ new Set(["datePosted", "date"]);
|
|
128
|
+
const OPTIES = {
|
|
129
|
+
tone: { info: "Informatie (blauw)", success: "Positief (groen)", warning: "Let op (oranje)" },
|
|
130
|
+
imageStyle: { inset: "Ingekaderd", cover: "Over de hele kaart" },
|
|
131
|
+
variant: { line: "Lijn", dots: "Puntjes", space: "Alleen ruimte", primary: "Primair", secondary: "Secundair", outline: "Omlijnd", lijst: "Lijst", menu: "Menukaart", kolommen: "Kolommen" },
|
|
132
|
+
buttonVariant: { primary: "Primair", secondary: "Secundair", outline: "Omlijnd" },
|
|
133
|
+
position: { br: "Rechtsonder", bl: "Linksonder" },
|
|
134
|
+
align: { left: "Links", center: "Midden", right: "Rechts" },
|
|
135
|
+
headingLevel: { "1": "Hoofdkop (H1)", "2": "Tussenkop (H2)" },
|
|
136
|
+
status: { afgelast: "Afgelast", verplaatst: "Verplaatst", online: "Online" },
|
|
137
|
+
layout: { list: "Lijst", grid: "Raster", overlay: "Tekst op de foto", naast: "Tekst naast de foto" }
|
|
138
|
+
};
|
|
139
|
+
const ALGEMEEN = {
|
|
140
|
+
sm: "Klein",
|
|
141
|
+
md: "Normaal",
|
|
142
|
+
lg: "Groot",
|
|
143
|
+
xl: "Extra groot",
|
|
144
|
+
full: "Volledig scherm",
|
|
145
|
+
auto: "Automatisch",
|
|
146
|
+
"16/9": "Breed (16:9)",
|
|
147
|
+
"4/3": "Standaard (4:3)",
|
|
148
|
+
"3/2": "Foto (3:2)",
|
|
149
|
+
"1/1": "Vierkant",
|
|
150
|
+
"21/9": "Panorama (21:9)",
|
|
151
|
+
fixed: "Vaste hoogte",
|
|
152
|
+
top: "Boven",
|
|
153
|
+
center: "Midden",
|
|
154
|
+
bottom: "Onder",
|
|
155
|
+
left: "Links",
|
|
156
|
+
right: "Rechts",
|
|
157
|
+
youtube: "YouTube",
|
|
158
|
+
vimeo: "Vimeo",
|
|
159
|
+
file: "Eigen bestand",
|
|
160
|
+
osm: "OpenStreetMap",
|
|
161
|
+
google: "Google Maps",
|
|
162
|
+
inherit: "Zoals de rest van de site",
|
|
163
|
+
on: "Aan",
|
|
164
|
+
off: "Uit",
|
|
165
|
+
message: "Melding tonen",
|
|
166
|
+
hide: "Verbergen"
|
|
167
|
+
};
|
|
168
|
+
const ITEMNAAM = {
|
|
169
|
+
hero: { buttons: "Knop" },
|
|
170
|
+
availability: { units: "Accommodatie" },
|
|
171
|
+
priceList: { sections: "Onderdeel", "sections.items": "Regel" },
|
|
172
|
+
faq: { items: "Vraag" },
|
|
173
|
+
accordion: { items: "Onderdeel" },
|
|
174
|
+
pricing: { items: "Pakket" },
|
|
175
|
+
gallery: { images: "Foto" },
|
|
176
|
+
slider: { slides: "Slide" },
|
|
177
|
+
cards: { items: "Kaart" },
|
|
178
|
+
counters: { items: "Getal" },
|
|
179
|
+
testimonials: { items: "Review" },
|
|
180
|
+
team: { members: "Teamlid", "members.social": "Social-link" },
|
|
181
|
+
timeline: { items: "Stap" },
|
|
182
|
+
jobs: { items: "Vacature" },
|
|
183
|
+
logos: { items: "Logo" },
|
|
184
|
+
downloads: { items: "Document" },
|
|
185
|
+
pdf: { documents: "Document" },
|
|
186
|
+
portfolio: { items: "Project" },
|
|
187
|
+
buttons: { items: "Knop" },
|
|
188
|
+
social: { items: "Social-link" },
|
|
189
|
+
openingHours: { rows: "Regel" }
|
|
190
|
+
};
|
|
191
|
+
const LIJSTNAAM = {
|
|
192
|
+
cards: { items: "Kaarten" },
|
|
193
|
+
availability: { units: "Accommodaties" },
|
|
194
|
+
priceList: { sections: "Onderdelen van de lijst", "sections.items": "Regels" },
|
|
195
|
+
counters: { items: "Getallen" },
|
|
196
|
+
testimonials: { items: "Reviews" },
|
|
197
|
+
timeline: { items: "Stappen" },
|
|
198
|
+
jobs: { items: "Vacatures" },
|
|
199
|
+
logos: { items: "Logo's" },
|
|
200
|
+
downloads: { items: "Documenten" },
|
|
201
|
+
portfolio: { items: "Projecten" },
|
|
202
|
+
buttons: { items: "Knoppen" },
|
|
203
|
+
social: { items: "Links" },
|
|
204
|
+
openingHours: { rows: "Openingstijden" }
|
|
205
|
+
};
|
|
206
|
+
function mensVanSleutel(sleutel) {
|
|
207
|
+
const woorden = sleutel.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/[_-]+/g, " ").toLowerCase();
|
|
208
|
+
return woorden.charAt(0).toUpperCase() + woorden.slice(1);
|
|
209
|
+
}
|
|
210
|
+
function optieLabel(veld, waarde) {
|
|
211
|
+
return OPTIES[veld]?.[waarde] ?? ALGEMEEN[waarde] ?? waarde;
|
|
212
|
+
}
|
|
213
|
+
function veldLabel(sleutel) {
|
|
214
|
+
return LABELS[sleutel] ?? mensVanSleutel(sleutel);
|
|
215
|
+
}
|
|
216
|
+
function itemNaam(blokType, pad) {
|
|
217
|
+
return ITEMNAAM[blokType]?.[pad];
|
|
218
|
+
}
|
|
219
|
+
function vertaalVelden(velden, blokType, pad = "") {
|
|
220
|
+
return velden.map((f) => {
|
|
221
|
+
const vol = pad ? `${pad}.${f.key}` : f.key;
|
|
222
|
+
const labelGezet = f.label && f.label !== f.key;
|
|
223
|
+
const label = labelGezet ? f.label : LIJSTNAAM[blokType]?.[vol] ?? veldLabel(f.key);
|
|
224
|
+
let uit = { ...f, label, hint: f.hint ?? HINTS[f.key] };
|
|
225
|
+
if (uit.type === "textarea" && !LANGE_TEKST.has(f.key)) uit = { ...uit, type: "text" };
|
|
226
|
+
if ((uit.type === "text" || uit.type === "textarea" || uit.type === "url") && FOTO.has(f.key)) uit = { ...uit, type: "image" };
|
|
227
|
+
if ((uit.type === "text" || uit.type === "textarea") && ICOON.has(f.key)) uit = { ...uit, type: "icon" };
|
|
228
|
+
if ((uit.type === "text" || uit.type === "textarea") && DATUM.has(f.key)) uit = { ...uit, type: "date" };
|
|
229
|
+
if (uit.type === "select") {
|
|
230
|
+
uit = { ...uit, options: uit.options.map((o) => ({ value: o.value, label: o.label && o.label !== o.value ? o.label : optieLabel(f.key, o.value) })) };
|
|
231
|
+
}
|
|
232
|
+
if ((uit.type === "repeater" || uit.type === "group") && "fields" in uit) {
|
|
233
|
+
const sub = vertaalVelden(uit.fields, blokType, vol);
|
|
234
|
+
uit = { ...uit, fields: sub, ...uit.type === "repeater" && !uit.itemLabel ? { itemLabel: itemNaam(blokType, vol) ?? "Onderdeel" } : {} };
|
|
235
|
+
}
|
|
236
|
+
return uit;
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
export {
|
|
240
|
+
TECHNISCHE_VELDEN,
|
|
241
|
+
itemNaam,
|
|
242
|
+
mensVanSleutel,
|
|
243
|
+
optieLabel,
|
|
244
|
+
veldLabel,
|
|
245
|
+
vertaalVelden
|
|
246
|
+
};
|
|
247
|
+
//# sourceMappingURL=veldTaal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/lib/veldTaal.ts"],"sourcesContent":["import type { Field } from \"../../schema/fields\";\n\n/**\n * De taallaag van de blokinstellingen (8.11).\n *\n * Het automatische formulier (GenericEditor) leidt zijn velden af uit het Zod-schema, en daar staan\n * sleutels: \"heading\", \"imageStyle\", \"items\". 22 van de 57 ingebouwde blokken hebben geen eigen\n * editor, dus een klant zag bij Diensten, Team, Reviews of Openingstijden letterlijk die Engelse\n * sleutels — en keuzes als \"inset\" en \"cover\". Dit bestand vertaalt ze, op één plek, voor alle\n * blokken tegelijk (ook maatwerkblokken die dezelfde sleutels gebruiken). Een `.describe()` op het\n * schema of een `fields`-hint van het blok wint altijd: dit is de terugval, niet de baas.\n *\n * Ook het TYPE wordt hier rechtgezet waar de afleiding raadt: elke korte tekst in de schema's mag\n * 2000 tekens, en \"langer dan 500 = tekstvak\" maakte van elke kop een groot invoervak. Alleen velden\n * die echt lopende tekst zijn, worden een tekstvak.\n */\n\nconst LABELS: Record<string, string> = {\n heading: \"Kop\",\n intro: \"Inleiding\",\n title: \"Titel\",\n subtitle: \"Ondertitel\",\n eyebrow: \"Regeltje boven de titel\",\n text: \"Tekst\",\n description: \"Omschrijving\",\n body: \"Tekst\",\n bio: \"Over deze persoon\",\n quote: \"Citaat\",\n author: \"Naam\",\n role: \"Functie of plaats\",\n name: \"Naam\",\n label: \"Tekst\",\n linkLabel: \"Tekst van de link\",\n buttonLabel: \"Knoptekst\",\n buttonHref: \"Knoplink\",\n buttonVariant: \"Knopstijl\",\n button2Label: \"Tweede knop: tekst\",\n button2Href: \"Tweede knop: link\",\n ctaLabel: \"Knoptekst\",\n ctaHref: \"Knoplink\",\n href: \"Link\",\n url: \"Adres\",\n applyUrl: \"Link om te solliciteren\",\n icon: \"Icoon\",\n imageUrl: \"Foto\",\n photoUrl: \"Foto\",\n avatarUrl: \"Foto\",\n beforeUrl: \"Foto vóór\",\n afterUrl: \"Foto na\",\n beforeLabel: \"Label vóór\",\n afterLabel: \"Label na\",\n src: \"Logo\",\n alt: \"Beschrijving van de foto\",\n columns: \"Kolommen\",\n imageStyle: \"Fotostijl\",\n layout: \"Weergave\",\n align: \"Uitlijning\",\n variant: \"Stijl\",\n tone: \"Kleur\",\n size: \"Grootte\",\n spacing: \"Ruimte\",\n height: \"Hoogte\",\n aspectRatio: \"Verhouding\",\n position: \"Plaats op het scherm\",\n items: \"Onderdelen\",\n members: \"Teamleden\",\n rows: \"Regels\",\n documents: \"Documenten\",\n social: \"Social media\",\n platform: \"Platform\",\n featured: \"Uitgelicht\",\n rating: \"Sterren\",\n value: \"Getal\",\n prefix: \"Vóór het getal\",\n suffix: \"Na het getal\",\n animate: \"Laten optellen bij in beeld komen\",\n day: \"Dag\",\n hours: \"Tijden\",\n date: \"Datum\",\n datePosted: \"Geplaatst op\",\n category: \"Categorie\",\n location: \"Plaats\",\n employmentType: \"Soort dienstverband\",\n salary: \"Salaris\",\n department: \"Afdeling\",\n email: \"E-mailadres\",\n phone: \"Telefoonnummer\",\n meta: \"Extra info (bv. 'PDF · 2 MB')\",\n prefilledText: \"Begintekst van het bericht\",\n placeholder: \"Tekst in het zoekveld\",\n homeLabel: \"Naam van de homepage\",\n dismissible: \"Bezoeker kan de balk wegklikken\",\n dismissVersion: \"Versie (voor opnieuw tonen)\",\n showStatus: \"Toon 'nu open / gesloten'\",\n showFilter: \"Filterknoppen per categorie\",\n lightbox: \"Foto groot openen bij klikken\",\n showDownload: \"Downloadknop tonen\",\n includeNews: \"Ook nieuwsberichten doorzoeken\",\n grayscale: \"Logo's in grijstinten\",\n marquee: \"Laten doorschuiven\",\n alternate: \"Afwisselend links en rechts\",\n groupByDepartment: \"Groeperen per afdeling\",\n sticky: \"Vast onderaan het scherm\",\n jsonLd: \"Laat Google dit herkennen\",\n sections: \"Onderdelen\",\n note: \"Toelichting\",\n footnote: \"Kleine lettertjes onderaan\",\n price: \"Prijs\",\n duration: \"Duur\",\n tags: \"Labels (met komma's)\",\n vAlign: \"Tekst verticaal\",\n trust: \"Vertrouwenspunten (✓)\",\n status: \"Status\",\n start: \"Begint op\",\n end: \"Eindigt op\",\n address: \"Adres (als het niet bij jou is)\",\n events: \"Activiteiten\",\n icalUrl: \"iCal-link (agenda-export)\",\n months: \"Aantal maanden\",\n minNights: \"Minimaal aantal nachten\",\n requestPath: \"Pagina met het aanvraagformulier\",\n requestLabel: \"Tekst op de knop\",\n periodField: \"Formulierveld voor de periode (technische naam)\",\n unitField: \"Formulierveld voor de accommodatie (technische naam)\",\n reviewKnop: \"Knop ‘Laat een review achter’ (link uit Instellingen → Bedrijf)\",\n minHeight: \"Hoogte\",\n headingLevel: \"Kopniveau\",\n overlayOpacity: \"Donker maken (%)\",\n overlayGradient: \"Verloop voor leesbare tekst\",\n overlayColor: \"Kleur over de foto\",\n videoUrl: \"Video (mp4)\",\n};\n\n/** Uitleg onder een veld, waar het label alleen niet genoeg zegt. */\nconst HINTS: Record<string, string> = {\n jsonLd: \"Gestructureerde gegevens voor Google (bijvoorbeeld openingstijden of vacatures in de zoekresultaten).\",\n dismissVersion: \"Verhoog dit getal om de balk opnieuw te tonen aan bezoekers die hem al wegklikten.\",\n alt: \"Voor slechtzienden en Google: wat staat er op de foto?\",\n icon: \"Een emoji, bijvoorbeeld 🌱 of ✂️\",\n prefilledText: \"Staat alvast in het WhatsApp-bericht van de bezoeker.\",\n};\n\n/** Velden die alleen Xi Webdesign hoeft te zien (technisch, of met gevolgen buiten de pagina). */\nexport const TECHNISCHE_VELDEN = new Set([\"dismissVersion\"]);\n\n/** Velden met lopende tekst → tekstvak; al het andere tekstachtige wordt een gewoon invoerveld. */\nconst LANGE_TEKST = new Set([\"text\", \"description\", \"bio\", \"quote\", \"intro\", \"body\", \"prefilledText\", \"detail\", \"note\"]);\n\n/** Velden die een foto zijn, ook als de sleutel dat niet verraadt. */\nconst FOTO = new Set([\"beforeUrl\", \"afterUrl\", \"src\"]);\nconst ICOON = new Set([\"icon\"]);\nconst DATUM = new Set([\"datePosted\", \"date\"]);\n\nconst OPTIES: Record<string, Record<string, string>> = {\n tone: { info: \"Informatie (blauw)\", success: \"Positief (groen)\", warning: \"Let op (oranje)\" },\n imageStyle: { inset: \"Ingekaderd\", cover: \"Over de hele kaart\" },\n variant: { line: \"Lijn\", dots: \"Puntjes\", space: \"Alleen ruimte\", primary: \"Primair\", secondary: \"Secundair\", outline: \"Omlijnd\", lijst: \"Lijst\", menu: \"Menukaart\", kolommen: \"Kolommen\" },\n buttonVariant: { primary: \"Primair\", secondary: \"Secundair\", outline: \"Omlijnd\" },\n position: { br: \"Rechtsonder\", bl: \"Linksonder\" },\n align: { left: \"Links\", center: \"Midden\", right: \"Rechts\" },\n headingLevel: { \"1\": \"Hoofdkop (H1)\", \"2\": \"Tussenkop (H2)\" },\n status: { afgelast: \"Afgelast\", verplaatst: \"Verplaatst\", online: \"Online\" },\n layout: { list: \"Lijst\", grid: \"Raster\", overlay: \"Tekst op de foto\", naast: \"Tekst naast de foto\" },\n};\n/** Waarden die overal hetzelfde betekenen. */\nconst ALGEMEEN: Record<string, string> = {\n sm: \"Klein\",\n md: \"Normaal\",\n lg: \"Groot\",\n xl: \"Extra groot\",\n full: \"Volledig scherm\",\n auto: \"Automatisch\",\n \"16/9\": \"Breed (16:9)\",\n \"4/3\": \"Standaard (4:3)\",\n \"3/2\": \"Foto (3:2)\",\n \"1/1\": \"Vierkant\",\n \"21/9\": \"Panorama (21:9)\",\n fixed: \"Vaste hoogte\",\n top: \"Boven\",\n center: \"Midden\",\n bottom: \"Onder\",\n left: \"Links\",\n right: \"Rechts\",\n youtube: \"YouTube\",\n vimeo: \"Vimeo\",\n file: \"Eigen bestand\",\n osm: \"OpenStreetMap\",\n google: \"Google Maps\",\n inherit: \"Zoals de rest van de site\",\n on: \"Aan\",\n off: \"Uit\",\n message: \"Melding tonen\",\n hide: \"Verbergen\",\n};\n\n/** Hoe heet één onderdeel van een lijst, per blok (\"+ Kaart\", \"+ Teamlid\"). */\nconst ITEMNAAM: Record<string, Record<string, string>> = {\n hero: { buttons: \"Knop\" },\n availability: { units: \"Accommodatie\" },\n priceList: { sections: \"Onderdeel\", \"sections.items\": \"Regel\" },\n faq: { items: \"Vraag\" },\n accordion: { items: \"Onderdeel\" },\n pricing: { items: \"Pakket\" },\n gallery: { images: \"Foto\" },\n slider: { slides: \"Slide\" },\n cards: { items: \"Kaart\" },\n counters: { items: \"Getal\" },\n testimonials: { items: \"Review\" },\n team: { members: \"Teamlid\", \"members.social\": \"Social-link\" },\n timeline: { items: \"Stap\" },\n jobs: { items: \"Vacature\" },\n logos: { items: \"Logo\" },\n downloads: { items: \"Document\" },\n pdf: { documents: \"Document\" },\n portfolio: { items: \"Project\" },\n buttons: { items: \"Knop\" },\n social: { items: \"Social-link\" },\n openingHours: { rows: \"Regel\" },\n};\n/** En de lijst zelf, per blok. */\nconst LIJSTNAAM: Record<string, Record<string, string>> = {\n cards: { items: \"Kaarten\" },\n availability: { units: \"Accommodaties\" },\n priceList: { sections: \"Onderdelen van de lijst\", \"sections.items\": \"Regels\" },\n counters: { items: \"Getallen\" },\n testimonials: { items: \"Reviews\" },\n timeline: { items: \"Stappen\" },\n jobs: { items: \"Vacatures\" },\n logos: { items: \"Logo's\" },\n downloads: { items: \"Documenten\" },\n portfolio: { items: \"Projecten\" },\n buttons: { items: \"Knoppen\" },\n social: { items: \"Links\" },\n openingHours: { rows: \"Openingstijden\" },\n};\n\n/** \"imageStyle\" → \"Image style\" als het echt nergens staat — beter dan een camelCase-sleutel. */\nexport function mensVanSleutel(sleutel: string): string {\n const woorden = sleutel.replace(/([a-z])([A-Z])/g, \"$1 $2\").replace(/[_-]+/g, \" \").toLowerCase();\n return woorden.charAt(0).toUpperCase() + woorden.slice(1);\n}\n\nexport function optieLabel(veld: string, waarde: string): string {\n return OPTIES[veld]?.[waarde] ?? ALGEMEEN[waarde] ?? waarde;\n}\n\n/** Het Nederlandse label voor een veldsleutel (de laatste schakel van een pad). */\nexport function veldLabel(sleutel: string): string {\n return LABELS[sleutel] ?? mensVanSleutel(sleutel);\n}\n\nexport function itemNaam(blokType: string, pad: string): string | undefined {\n return ITEMNAAM[blokType]?.[pad];\n}\n\n/**\n * Vertaalt een afgeleide Field-IR. Alleen waar het schema/de hint niets zei: een label dat gelijk\n * is aan de sleutel gold als \"niet gezet\". Recursief door groepen en lijsten.\n */\nexport function vertaalVelden(velden: Field[], blokType: string, pad = \"\"): Field[] {\n return velden.map((f) => {\n const vol = pad ? `${pad}.${f.key}` : f.key;\n const labelGezet = f.label && f.label !== f.key;\n const label = labelGezet ? f.label : (LIJSTNAAM[blokType]?.[vol] ?? veldLabel(f.key));\n let uit = { ...f, label, hint: f.hint ?? HINTS[f.key] } as Field;\n\n if (uit.type === \"textarea\" && !LANGE_TEKST.has(f.key)) uit = { ...uit, type: \"text\" } as Field;\n if ((uit.type === \"text\" || uit.type === \"textarea\" || uit.type === \"url\") && FOTO.has(f.key)) uit = { ...uit, type: \"image\" } as Field;\n if ((uit.type === \"text\" || uit.type === \"textarea\") && ICOON.has(f.key)) uit = { ...uit, type: \"icon\" } as Field;\n if ((uit.type === \"text\" || uit.type === \"textarea\") && DATUM.has(f.key)) uit = { ...uit, type: \"date\" } as Field;\n\n if (uit.type === \"select\") {\n uit = { ...uit, options: uit.options.map((o) => ({ value: o.value, label: o.label && o.label !== o.value ? o.label : optieLabel(f.key, o.value) })) };\n }\n if ((uit.type === \"repeater\" || uit.type === \"group\") && \"fields\" in uit) {\n const sub = vertaalVelden(uit.fields as Field[], blokType, vol);\n uit = { ...uit, fields: sub, ...(uit.type === \"repeater\" && !uit.itemLabel ? { itemLabel: itemNaam(blokType, vol) ?? \"Onderdeel\" } : {}) } as Field;\n }\n return uit;\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface Versie {
|
|
2
|
+
title?: string;
|
|
3
|
+
path?: string;
|
|
4
|
+
blocks?: unknown[];
|
|
5
|
+
seo?: {
|
|
6
|
+
title?: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* "Wat verandert er als ik deze versie terugzet?" (8.4) — in zinnen, vóór je op Herstellen drukt.
|
|
12
|
+
* Eerst was herstellen blind: je zag alleen een datum. Bouwt op dezelfde blokvergelijking als de
|
|
13
|
+
* rode markeringen in de editor (`bepaalWijzigingen`), met de versie als "werk" en de huidige
|
|
14
|
+
* werkversie als maatstaf.
|
|
15
|
+
*/
|
|
16
|
+
export declare function vergelijkVersie(huidig: Versie, versie: Versie, labelVoor: (type: string) => string): string[];
|
|
17
|
+
export {};
|