@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,356 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
4
|
+
import { introspectToFields } from "../lib/zodFields.js";
|
|
5
|
+
import { itemNaam, vertaalVelden, TECHNISCHE_VELDEN } from "../lib/veldTaal.js";
|
|
6
|
+
import { LinkDialog } from "../ui/LinkDialog.js";
|
|
7
|
+
function veiligeBovenkant() {
|
|
8
|
+
let onder = 0;
|
|
9
|
+
for (const el of Array.from(document.querySelectorAll("header, [class*='header'], [class*='nav'], body > div > *"))) {
|
|
10
|
+
const pos = getComputedStyle(el).position;
|
|
11
|
+
if (pos !== "fixed" && pos !== "sticky") continue;
|
|
12
|
+
if (el.closest("[data-xicms-tooling], .xicms-ve")) continue;
|
|
13
|
+
const r = el.getBoundingClientRect();
|
|
14
|
+
if (r.height === 0 || r.top > 4 || r.height > window.innerHeight / 3) continue;
|
|
15
|
+
onder = Math.max(onder, r.bottom);
|
|
16
|
+
}
|
|
17
|
+
return onder;
|
|
18
|
+
}
|
|
19
|
+
function rect(el) {
|
|
20
|
+
const r = el.getBoundingClientRect();
|
|
21
|
+
return { top: r.top, left: r.left, width: r.width, height: r.height };
|
|
22
|
+
}
|
|
23
|
+
function zelfde(a, b) {
|
|
24
|
+
return !!a && !!b && a.top === b.top && a.left === b.left && a.width === b.width && a.height === b.height;
|
|
25
|
+
}
|
|
26
|
+
function gemeenschappelijk(els, grens) {
|
|
27
|
+
let kand = els[0];
|
|
28
|
+
while (kand && kand !== grens && !els.every((e) => kand.contains(e))) kand = kand.parentElement;
|
|
29
|
+
return kand ?? grens;
|
|
30
|
+
}
|
|
31
|
+
function vindLijstItems(host) {
|
|
32
|
+
const perItem = /* @__PURE__ */ new Map();
|
|
33
|
+
for (const el of Array.from(host.querySelectorAll("[data-xicms-edit]"))) {
|
|
34
|
+
const pad = el.dataset.xicmsEdit ?? "";
|
|
35
|
+
const re = /\.(\d+)\./g;
|
|
36
|
+
let m;
|
|
37
|
+
while (m = re.exec(pad)) {
|
|
38
|
+
const lijst = pad.slice(0, m.index);
|
|
39
|
+
if (!/^[A-Za-z]/.test(lijst)) continue;
|
|
40
|
+
const sleutel = `${lijst}|${m[1]}`;
|
|
41
|
+
perItem.set(sleutel, [...perItem.get(sleutel) ?? [], el]);
|
|
42
|
+
re.lastIndex = m.index + 1;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const uit = [];
|
|
46
|
+
for (const [sleutel, els] of perItem) {
|
|
47
|
+
const [lijst, idx] = sleutel.split("|");
|
|
48
|
+
const anderen = [...perItem].filter(([k]) => k !== sleutel && k.startsWith(`${lijst}|`)).flatMap(([, v]) => v);
|
|
49
|
+
let el = gemeenschappelijk(els, host);
|
|
50
|
+
while (el.parentElement && el.parentElement !== host && !anderen.some((a) => el.parentElement.contains(a))) {
|
|
51
|
+
if (el.parentElement.hasAttribute("data-xicms-block")) break;
|
|
52
|
+
el = el.parentElement;
|
|
53
|
+
}
|
|
54
|
+
uit.push({ lijst, index: Number(idx), el });
|
|
55
|
+
}
|
|
56
|
+
return uit.sort((a, b) => a.lijst === b.lijst ? a.index - b.index : a.lijst.localeCompare(b.lijst));
|
|
57
|
+
}
|
|
58
|
+
function lijstVorm(lijst) {
|
|
59
|
+
return lijst.replace(/\.\d+(?=\.|$)/g, "");
|
|
60
|
+
}
|
|
61
|
+
function linkVeldVoor(veld, blok) {
|
|
62
|
+
const kandidaten = [];
|
|
63
|
+
if (/(^|\.)label$/.test(veld)) kandidaten.push(veld.replace(/label$/, "href"));
|
|
64
|
+
if (/(^|\.)linkLabel$/.test(veld)) kandidaten.push(veld.replace(/linkLabel$/, "href"));
|
|
65
|
+
if (/Label$/.test(veld)) kandidaten.push(veld.replace(/Label$/, "Href"));
|
|
66
|
+
for (const k of kandidaten) {
|
|
67
|
+
const waarde = k.split(".").reduce((o, s) => o == null ? void 0 : o[s], blok);
|
|
68
|
+
if (waarde !== void 0) return k;
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
function haal(o, pad) {
|
|
73
|
+
return pad.split(".").reduce((x, k) => x == null ? void 0 : x[k], o);
|
|
74
|
+
}
|
|
75
|
+
function zet(o, pad, waarde) {
|
|
76
|
+
const delen = pad.split(".");
|
|
77
|
+
const kloon = (v) => Array.isArray(v) ? [...v] : v && typeof v === "object" ? { ...v } : v;
|
|
78
|
+
const wortel = kloon(o);
|
|
79
|
+
let cur = wortel;
|
|
80
|
+
for (let i = 0; i < delen.length - 1; i++) {
|
|
81
|
+
cur[delen[i]] = kloon(cur[delen[i]] ?? {});
|
|
82
|
+
cur = cur[delen[i]];
|
|
83
|
+
}
|
|
84
|
+
cur[delen[delen.length - 1]] = waarde;
|
|
85
|
+
return wortel;
|
|
86
|
+
}
|
|
87
|
+
function snelleKeuzes(velden) {
|
|
88
|
+
const uitgesloten = /jsonLd|consent|dismiss|sticky|^lightbox$|^showDownload$|^includeNews$|^headingLevel$/;
|
|
89
|
+
return velden.filter((f) => !TECHNISCHE_VELDEN.has(f.key) && !uitgesloten.test(f.key)).filter(
|
|
90
|
+
(f) => f.type === "select" && f.options.length >= 2 && f.options.length <= 5 || f.type === "number" && f.min !== void 0 && f.max !== void 0 && f.max - f.min <= 4 && f.key !== "rating"
|
|
91
|
+
).slice(0, 3);
|
|
92
|
+
}
|
|
93
|
+
function InlineGereedschap({
|
|
94
|
+
blok,
|
|
95
|
+
def,
|
|
96
|
+
siteId,
|
|
97
|
+
onWijzig,
|
|
98
|
+
onInstellingen,
|
|
99
|
+
onStartVeld,
|
|
100
|
+
onVerwijderd
|
|
101
|
+
}) {
|
|
102
|
+
const [host, setHost] = useState(null);
|
|
103
|
+
const [items, setItems] = useState([]);
|
|
104
|
+
const [hover, setHover] = useState(null);
|
|
105
|
+
const [blokRect, setBlokRect] = useState(null);
|
|
106
|
+
const [linkDoel, setLinkDoel] = useState(null);
|
|
107
|
+
const [linkOpen, setLinkOpen] = useState(false);
|
|
108
|
+
const [veilig, setVeilig] = useState(0);
|
|
109
|
+
useEffect(() => {
|
|
110
|
+
const herijk = () => setVeilig(veiligeBovenkant());
|
|
111
|
+
herijk();
|
|
112
|
+
window.addEventListener("resize", herijk);
|
|
113
|
+
return () => window.removeEventListener("resize", herijk);
|
|
114
|
+
}, []);
|
|
115
|
+
const velden = useMemo(() => {
|
|
116
|
+
if (!def?.schema) return [];
|
|
117
|
+
try {
|
|
118
|
+
return vertaalVelden(introspectToFields(def.schema, def.fields), def.type);
|
|
119
|
+
} catch {
|
|
120
|
+
return [];
|
|
121
|
+
}
|
|
122
|
+
}, [def]);
|
|
123
|
+
const keuzes = useMemo(() => snelleKeuzes(velden), [velden]);
|
|
124
|
+
const [gevonden, setGevonden] = useState(null);
|
|
125
|
+
useEffect(() => {
|
|
126
|
+
let pogingen = 0;
|
|
127
|
+
let frame = 0;
|
|
128
|
+
const zoek = () => {
|
|
129
|
+
const el = document.querySelector(`[data-xicms-block="${CSS.escape(blok._key)}"]`);
|
|
130
|
+
if (el) setGevonden(el);
|
|
131
|
+
else if (++pogingen < 120) frame = requestAnimationFrame(zoek);
|
|
132
|
+
};
|
|
133
|
+
zoek();
|
|
134
|
+
return () => cancelAnimationFrame(frame);
|
|
135
|
+
}, [blok._key]);
|
|
136
|
+
useEffect(() => {
|
|
137
|
+
const el = gevonden;
|
|
138
|
+
setHost(el);
|
|
139
|
+
if (!el) return;
|
|
140
|
+
let frame = 0;
|
|
141
|
+
const meet = () => {
|
|
142
|
+
const gevonden2 = vindLijstItems(el).map((it) => ({ lijst: it.lijst, index: it.index, r: rect(it.el) }));
|
|
143
|
+
setItems((v) => v.length === gevonden2.length && v.every((x, i) => x.lijst === gevonden2[i].lijst && x.index === gevonden2[i].index && zelfde(x.r, gevonden2[i].r)) ? v : gevonden2);
|
|
144
|
+
let r = rect(el);
|
|
145
|
+
if (r.width === 0 && r.height === 0) {
|
|
146
|
+
const kids = Array.from(el.children).map(rect).filter((k) => k.width || k.height);
|
|
147
|
+
if (kids.length) {
|
|
148
|
+
const top = Math.min(...kids.map((k) => k.top));
|
|
149
|
+
const left = Math.min(...kids.map((k) => k.left));
|
|
150
|
+
r = { top, left, width: Math.max(...kids.map((k) => k.left + k.width)) - left, height: Math.max(...kids.map((k) => k.top + k.height)) - top };
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
setBlokRect((v) => zelfde(v, r) ? v : r);
|
|
154
|
+
};
|
|
155
|
+
const plan = () => {
|
|
156
|
+
cancelAnimationFrame(frame);
|
|
157
|
+
frame = requestAnimationFrame(meet);
|
|
158
|
+
};
|
|
159
|
+
meet();
|
|
160
|
+
const obs = new MutationObserver(plan);
|
|
161
|
+
obs.observe(el, { childList: true, subtree: true, characterData: true });
|
|
162
|
+
window.addEventListener("scroll", plan, { capture: true, passive: true });
|
|
163
|
+
window.addEventListener("resize", plan);
|
|
164
|
+
return () => {
|
|
165
|
+
cancelAnimationFrame(frame);
|
|
166
|
+
obs.disconnect();
|
|
167
|
+
window.removeEventListener("scroll", plan, { capture: true });
|
|
168
|
+
window.removeEventListener("resize", plan);
|
|
169
|
+
};
|
|
170
|
+
}, [gevonden]);
|
|
171
|
+
useEffect(() => {
|
|
172
|
+
if (!host) return;
|
|
173
|
+
const kijk = (doel) => {
|
|
174
|
+
if (!doel) return;
|
|
175
|
+
const it = vindLijstItems(host).filter((x) => x.el.contains(doel)).sort((a, b) => b.lijst.split(".").length - a.lijst.split(".").length)[0];
|
|
176
|
+
setHover(it ? { lijst: it.lijst, index: it.index } : null);
|
|
177
|
+
const veldEl = doel.closest("[data-xicms-edit]");
|
|
178
|
+
const veld = veldEl?.dataset.xicmsEdit;
|
|
179
|
+
const hrefVeld = veld ? linkVeldVoor(veld, blok) : null;
|
|
180
|
+
if (veldEl && veld && hrefVeld) setLinkDoel({ veld, hrefVeld, r: rect(veldEl) });
|
|
181
|
+
};
|
|
182
|
+
const opOver = (e) => kijk(e.target);
|
|
183
|
+
host.addEventListener("mouseover", opOver);
|
|
184
|
+
host.addEventListener("focusin", opOver);
|
|
185
|
+
return () => {
|
|
186
|
+
host.removeEventListener("mouseover", opOver);
|
|
187
|
+
host.removeEventListener("focusin", opOver);
|
|
188
|
+
};
|
|
189
|
+
}, [host, blok]);
|
|
190
|
+
useEffect(() => {
|
|
191
|
+
if (!linkDoel || !host) return;
|
|
192
|
+
const herpositioneer = () => {
|
|
193
|
+
const el = host.querySelector(`[data-xicms-edit="${CSS.escape(linkDoel.veld)}"]`);
|
|
194
|
+
if (!el) return setLinkDoel(null);
|
|
195
|
+
const r = rect(el);
|
|
196
|
+
setLinkDoel((v) => v && !zelfde(v.r, r) ? { ...v, r } : v);
|
|
197
|
+
};
|
|
198
|
+
window.addEventListener("scroll", herpositioneer, { capture: true, passive: true });
|
|
199
|
+
return () => window.removeEventListener("scroll", herpositioneer, { capture: true });
|
|
200
|
+
}, [linkDoel, host]);
|
|
201
|
+
const lijstActie = useCallback(
|
|
202
|
+
(lijst, index, actie) => {
|
|
203
|
+
const arr = [...haal(blok, lijst) ?? []];
|
|
204
|
+
if (actie === "omhoog" && index > 0) [arr[index - 1], arr[index]] = [arr[index], arr[index - 1]];
|
|
205
|
+
else if (actie === "omlaag" && index < arr.length - 1) [arr[index + 1], arr[index]] = [arr[index], arr[index + 1]];
|
|
206
|
+
else if (actie === "dupliceer") arr.splice(index + 1, 0, structuredClone(arr[index]));
|
|
207
|
+
else if (actie === "weg") arr.splice(index, 1);
|
|
208
|
+
else return;
|
|
209
|
+
onWijzig(zet(blok, lijst, arr));
|
|
210
|
+
if (actie === "weg") onVerwijderd(itemNaam(blok._type, lijstVorm(lijst)) ?? "Onderdeel");
|
|
211
|
+
setHover(null);
|
|
212
|
+
},
|
|
213
|
+
[blok, onWijzig, onVerwijderd]
|
|
214
|
+
);
|
|
215
|
+
const voegToe = useCallback(
|
|
216
|
+
(lijst) => {
|
|
217
|
+
const arr = [...haal(blok, lijst) ?? []];
|
|
218
|
+
const voorbeeld = arr[arr.length - 1] ?? haal(def?.defaults?.() ?? {}, lijstVorm(lijst))?.[0] ?? {};
|
|
219
|
+
const nieuw = structuredClone(voorbeeld);
|
|
220
|
+
const naam = (itemNaam(blok._type, lijstVorm(lijst)) ?? "onderdeel").toLowerCase();
|
|
221
|
+
const eerste = ["title", "name", "label", "question", "q", "author", "day"].find((k) => typeof nieuw[k] === "string");
|
|
222
|
+
if (eerste) nieuw[eerste] = `Nieuw: ${naam}`;
|
|
223
|
+
for (const k of ["featured", "highlighted"]) if (k in nieuw) nieuw[k] = false;
|
|
224
|
+
arr.push(nieuw);
|
|
225
|
+
onWijzig(zet(blok, lijst, arr));
|
|
226
|
+
if (eerste) onStartVeld(`${lijst}.${arr.length - 1}.${eerste}`);
|
|
227
|
+
},
|
|
228
|
+
[blok, def, onWijzig, onStartVeld]
|
|
229
|
+
);
|
|
230
|
+
const laatste = useMemo(() => {
|
|
231
|
+
const m = /* @__PURE__ */ new Map();
|
|
232
|
+
for (const it of items) m.set(it.lijst, it.r);
|
|
233
|
+
return m;
|
|
234
|
+
}, [items]);
|
|
235
|
+
const hoverItem = hover ? items.find((x) => x.lijst === hover.lijst && x.index === hover.index) : void 0;
|
|
236
|
+
const aantal = (lijst) => (haal(blok, lijst) ?? []).length;
|
|
237
|
+
const hrefNu = linkDoel ? String(haal(blok, linkDoel.hrefVeld) ?? "") : "";
|
|
238
|
+
const zichtbaar = (r) => r.top + r.height > veilig && r.top < window.innerHeight;
|
|
239
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
240
|
+
blokRect && zichtbaar(blokRect) && keuzes.length > 0 && /* @__PURE__ */ jsxs(
|
|
241
|
+
"div",
|
|
242
|
+
{
|
|
243
|
+
className: "xicms-ve-snel",
|
|
244
|
+
role: "toolbar",
|
|
245
|
+
"aria-label": `Snel aanpassen: ${def?.label ?? ""}`,
|
|
246
|
+
style: { top: blokRect.top - 46 > veilig + 4 ? blokRect.top - 46 : Math.max(blokRect.top + 8, veilig + 8), left: Math.max(blokRect.left, 8) },
|
|
247
|
+
onMouseDown: (e) => e.preventDefault(),
|
|
248
|
+
children: [
|
|
249
|
+
keuzes.map((f) => {
|
|
250
|
+
const huidig = blok[f.key];
|
|
251
|
+
const opties = f.type === "select" ? f.options.map((o) => ({ value: o.value, label: o.label })) : Array.from({ length: f.max - f.min + 1 }, (_, i) => {
|
|
252
|
+
const n = f.min + i;
|
|
253
|
+
return { value: n, label: String(n) };
|
|
254
|
+
});
|
|
255
|
+
const actief = huidig ?? (f.type === "select" ? f.standaard ?? f.options[0]?.value : void 0);
|
|
256
|
+
return /* @__PURE__ */ jsxs("span", { className: "xicms-ve-snel__groep", role: "radiogroup", "aria-label": f.label, children: [
|
|
257
|
+
/* @__PURE__ */ jsx("span", { className: "xicms-ve-snel__label", children: f.label }),
|
|
258
|
+
opties.map((o) => /* @__PURE__ */ jsx(
|
|
259
|
+
"button",
|
|
260
|
+
{
|
|
261
|
+
type: "button",
|
|
262
|
+
role: "radio",
|
|
263
|
+
"aria-checked": actief === o.value,
|
|
264
|
+
className: "xicms-ve-snel__knop",
|
|
265
|
+
onClick: () => onWijzig({ ...blok, [f.key]: o.value }),
|
|
266
|
+
children: o.label
|
|
267
|
+
},
|
|
268
|
+
String(o.value)
|
|
269
|
+
))
|
|
270
|
+
] }, f.key);
|
|
271
|
+
}),
|
|
272
|
+
/* @__PURE__ */ jsx("button", { type: "button", className: "xicms-ve-snel__meer", onClick: onInstellingen, title: "Alle instellingen in de zijbalk", children: "Meer \u2699" })
|
|
273
|
+
]
|
|
274
|
+
}
|
|
275
|
+
),
|
|
276
|
+
hoverItem && zichtbaar(hoverItem.r) && /* @__PURE__ */ jsx(
|
|
277
|
+
"div",
|
|
278
|
+
{
|
|
279
|
+
className: "xicms-ve-item",
|
|
280
|
+
role: "toolbar",
|
|
281
|
+
"aria-label": `${itemNaam(blok._type, lijstVorm(hoverItem.lijst)) ?? "Onderdeel"} ${hoverItem.index + 1}`,
|
|
282
|
+
style: { top: Math.max(hoverItem.r.top + 6, veilig + 8), left: Math.max(hoverItem.r.left + hoverItem.r.width - 6, 120) },
|
|
283
|
+
onMouseDown: (e) => e.preventDefault(),
|
|
284
|
+
children: (() => {
|
|
285
|
+
const naam = itemNaam(blok._type, lijstVorm(hoverItem.lijst)) ?? "Onderdeel";
|
|
286
|
+
const n = aantal(hoverItem.lijst);
|
|
287
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
288
|
+
/* @__PURE__ */ jsx("button", { type: "button", title: `${naam} naar voren`, "aria-label": `${naam} naar voren`, disabled: hoverItem.index === 0, onClick: () => lijstActie(hoverItem.lijst, hoverItem.index, "omhoog"), children: "\u2191" }),
|
|
289
|
+
/* @__PURE__ */ jsx("button", { type: "button", title: `${naam} naar achteren`, "aria-label": `${naam} naar achteren`, disabled: hoverItem.index >= n - 1, onClick: () => lijstActie(hoverItem.lijst, hoverItem.index, "omlaag"), children: "\u2193" }),
|
|
290
|
+
/* @__PURE__ */ jsx("button", { type: "button", title: `${naam} dupliceren`, "aria-label": `${naam} dupliceren`, onClick: () => lijstActie(hoverItem.lijst, hoverItem.index, "dupliceer"), children: "\u29C9" }),
|
|
291
|
+
/* @__PURE__ */ jsx("button", { type: "button", className: "is-gevaar", title: `${naam} weghalen`, "aria-label": `${naam} weghalen`, onClick: () => lijstActie(hoverItem.lijst, hoverItem.index, "weg"), children: "\u{1F5D1}" })
|
|
292
|
+
] });
|
|
293
|
+
})()
|
|
294
|
+
}
|
|
295
|
+
),
|
|
296
|
+
[...laatste].map(([lijst, r]) => {
|
|
297
|
+
const diepte = lijst.split(".").length;
|
|
298
|
+
const botst = [...laatste].some(([ander, ar]) => ander !== lijst && ander.split(".").length > diepte && Math.abs(ar.top + ar.height - (r.top + r.height)) < 30);
|
|
299
|
+
return [lijst, botst ? { ...r, height: r.height + 40 } : r];
|
|
300
|
+
}).map(
|
|
301
|
+
([lijst, r]) => (
|
|
302
|
+
// Alleen als de onderkant van de lijst in beeld is — anders zweeft "+ Kaart" los onderaan.
|
|
303
|
+
r.top + r.height > veilig && r.top + r.height + 46 < window.innerHeight ? /* @__PURE__ */ jsxs(
|
|
304
|
+
"button",
|
|
305
|
+
{
|
|
306
|
+
type: "button",
|
|
307
|
+
className: "xicms-ve-plus",
|
|
308
|
+
style: { top: r.top + r.height + 6, left: r.left + r.width / 2 },
|
|
309
|
+
onMouseDown: (e) => e.preventDefault(),
|
|
310
|
+
onClick: () => voegToe(lijst),
|
|
311
|
+
children: [
|
|
312
|
+
"+ ",
|
|
313
|
+
itemNaam(blok._type, lijstVorm(lijst)) ?? "Toevoegen"
|
|
314
|
+
]
|
|
315
|
+
},
|
|
316
|
+
lijst
|
|
317
|
+
) : null
|
|
318
|
+
)
|
|
319
|
+
),
|
|
320
|
+
linkDoel && zichtbaar(linkDoel.r) && /* @__PURE__ */ jsxs(
|
|
321
|
+
"button",
|
|
322
|
+
{
|
|
323
|
+
type: "button",
|
|
324
|
+
className: "xicms-ve-linkchip",
|
|
325
|
+
style: { top: linkDoel.r.top + linkDoel.r.height + 4, left: linkDoel.r.left },
|
|
326
|
+
onMouseDown: (e) => e.preventDefault(),
|
|
327
|
+
onClick: () => setLinkOpen(true),
|
|
328
|
+
title: "Waar gaat deze knop heen?",
|
|
329
|
+
children: [
|
|
330
|
+
"\u{1F517} ",
|
|
331
|
+
!hrefNu || hrefNu === "#" ? "Kies waar deze knop heen gaat" : hrefNu.replace(/^https?:\/\//, "")
|
|
332
|
+
]
|
|
333
|
+
}
|
|
334
|
+
),
|
|
335
|
+
/* @__PURE__ */ jsx(
|
|
336
|
+
LinkDialog,
|
|
337
|
+
{
|
|
338
|
+
open: linkOpen,
|
|
339
|
+
onOpenChange: setLinkOpen,
|
|
340
|
+
siteId,
|
|
341
|
+
huidig: hrefNu === "#" ? "" : hrefNu,
|
|
342
|
+
onKlaar: (href) => {
|
|
343
|
+
if (linkDoel) onWijzig(zet(blok, linkDoel.hrefVeld, href ?? ""));
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
)
|
|
347
|
+
] });
|
|
348
|
+
}
|
|
349
|
+
export {
|
|
350
|
+
InlineGereedschap,
|
|
351
|
+
lijstVorm,
|
|
352
|
+
linkVeldVoor,
|
|
353
|
+
snelleKeuzes,
|
|
354
|
+
vindLijstItems
|
|
355
|
+
};
|
|
356
|
+
//# sourceMappingURL=InlineGereedschap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/visual/InlineGereedschap.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { BlockDefinition } from \"../../blocks/registry\";\nimport type { Field } from \"../../schema/fields\";\nimport { introspectToFields } from \"../lib/zodFields\";\nimport { itemNaam, vertaalVelden, TECHNISCHE_VELDEN } from \"../lib/veldTaal\";\nimport { LinkDialog } from \"../ui/LinkDialog\";\n\n/**\n * Bewerken op de pagina, voorbij de tekst (8.11): het POTLOOD.\n *\n * De wens: potlood = op de pagina zelf bewerken, tandwiel = de zijbalk. Tot nu toe deed het potlood\n * alleen tekst; voor al het andere moest je toch naar de zijbalk — een kaart toevoegen, een knop\n * naar een andere pagina laten wijzen, van drie naar vier kolommen. Dit gereedschap verschijnt bij\n * het geselecteerde blok en doet precies dat, op de plek zelf:\n *\n * - **Lijsten** (kaarten, teamleden, reviews, stappen …): bij het onderdeel onder je muis ↑ ↓ ⧉ 🗑,\n * en onder de lijst \"+ Kaart\". De onderdelen worden gevonden via de veldhaken die de blokken al\n * zetten (`data-xicms-edit=\"items.2.title\"`) — geen wijziging aan een Render nodig, ook niet aan\n * maatwerkblokken.\n * - **Links**: wie een knoptekst aanwijst of bewerkt, krijgt eronder \"🔗 Contact\" — klik, en kies\n * een pagina of adres.\n * - **Snelle keuzes**: de paar keuzes die het uiterlijk van het blok bepalen (kolommen, stijl,\n * uitlijning), als een balkje boven het blok. Alles daarbuiten blijft in de zijbalk.\n */\n\ntype Blok = Record<string, unknown> & { _key: string; _type: string };\n\ninterface Rect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/** Onderkant van wat er bovenaan het scherm vast hangt (sticky header): daaronder tekenen we. */\nfunction veiligeBovenkant(): number {\n let onder = 0;\n for (const el of Array.from(document.querySelectorAll<HTMLElement>(\"header, [class*='header'], [class*='nav'], body > div > *\"))) {\n const pos = getComputedStyle(el).position;\n if (pos !== \"fixed\" && pos !== \"sticky\") continue;\n if (el.closest(\"[data-xicms-tooling], .xicms-ve\")) continue;\n const r = el.getBoundingClientRect();\n if (r.height === 0 || r.top > 4 || r.height > window.innerHeight / 3) continue;\n onder = Math.max(onder, r.bottom);\n }\n return onder;\n}\n\nfunction rect(el: Element): Rect {\n const r = el.getBoundingClientRect();\n return { top: r.top, left: r.left, width: r.width, height: r.height };\n}\n\nfunction zelfde(a: Rect | null, b: Rect | null): boolean {\n return !!a && !!b && a.top === b.top && a.left === b.left && a.width === b.width && a.height === b.height;\n}\n\n/** Laagste gemeenschappelijke voorouder van een set elementen (binnen `grens`). */\nfunction gemeenschappelijk(els: HTMLElement[], grens: HTMLElement): HTMLElement {\n let kand: HTMLElement | null = els[0];\n while (kand && kand !== grens && !els.every((e) => kand!.contains(e))) kand = kand.parentElement;\n return kand ?? grens;\n}\n\nexport interface LijstItem {\n lijst: string;\n index: number;\n el: HTMLElement;\n}\n\n/**\n * Vind de onderdelen van de lijsten in een blok, via de veldhaken. Per onderdeel: de laagste\n * voorouder die al zijn velden bevat, en dan zo ver omhoog als kan zonder een ánder onderdeel van\n * dezelfde lijst te raken — dat is de kaart, de rij, het teamlid.\n */\nexport function vindLijstItems(host: HTMLElement): LijstItem[] {\n // Per onderdeel (\"lijstpad|index\") de velden. Geneste lijsten (8.13: een prijslijst heeft\n // onderdelen met regels) leveren voor één veld meerdere onderdelen op:\n // \"sections.0.items.2.name\" hoort bij \"sections\" #0 én bij \"sections.0.items\" #2.\n const perItem = new Map<string, HTMLElement[]>();\n for (const el of Array.from(host.querySelectorAll<HTMLElement>(\"[data-xicms-edit]\"))) {\n const pad = el.dataset.xicmsEdit ?? \"\";\n const re = /\\.(\\d+)\\./g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(pad))) {\n const lijst = pad.slice(0, m.index);\n if (!/^[A-Za-z]/.test(lijst)) continue;\n const sleutel = `${lijst}|${m[1]}`;\n perItem.set(sleutel, [...(perItem.get(sleutel) ?? []), el]);\n re.lastIndex = m.index + 1;\n }\n }\n const uit: LijstItem[] = [];\n for (const [sleutel, els] of perItem) {\n const [lijst, idx] = sleutel.split(\"|\");\n const anderen = [...perItem].filter(([k]) => k !== sleutel && k.startsWith(`${lijst}|`)).flatMap(([, v]) => v);\n let el = gemeenschappelijk(els, host);\n while (el.parentElement && el.parentElement !== host && !anderen.some((a) => el.parentElement!.contains(a))) {\n // Niet voorbij een display:contents-wrapper van het blok zelf.\n if (el.parentElement.hasAttribute(\"data-xicms-block\")) break;\n el = el.parentElement;\n }\n uit.push({ lijst, index: Number(idx), el });\n }\n return uit.sort((a, b) => (a.lijst === b.lijst ? a.index - b.index : a.lijst.localeCompare(b.lijst)));\n}\n\n/** \"sections.0.items\" → \"sections.items\": de vorm waarop lijst- en onderdeelnamen per blok staan. */\nexport function lijstVorm(lijst: string): string {\n return lijst.replace(/\\.\\d+(?=\\.|$)/g, \"\");\n}\n\n/** Bij een knoptekst-veld: welk veld bevat de link? `null` = geen link bij dit veld. */\nexport function linkVeldVoor(veld: string, blok: Record<string, unknown>): string | null {\n const kandidaten: string[] = [];\n if (/(^|\\.)label$/.test(veld)) kandidaten.push(veld.replace(/label$/, \"href\"));\n if (/(^|\\.)linkLabel$/.test(veld)) kandidaten.push(veld.replace(/linkLabel$/, \"href\"));\n if (/Label$/.test(veld)) kandidaten.push(veld.replace(/Label$/, \"Href\"));\n for (const k of kandidaten) {\n const waarde = k.split(\".\").reduce<unknown>((o, s) => (o == null ? undefined : (o as Record<string, unknown>)[s]), blok);\n if (waarde !== undefined) return k;\n }\n return null;\n}\n\nfunction haal(o: unknown, pad: string): unknown {\n return pad.split(\".\").reduce<unknown>((x, k) => (x == null ? undefined : (x as Record<string, unknown>)[k]), o);\n}\nfunction zet<T>(o: T, pad: string, waarde: unknown): T {\n const delen = pad.split(\".\");\n const kloon = (v: unknown): any => (Array.isArray(v) ? [...v] : v && typeof v === \"object\" ? { ...(v as object) } : v); // eslint-disable-line @typescript-eslint/no-explicit-any\n const wortel = kloon(o);\n let cur = wortel;\n for (let i = 0; i < delen.length - 1; i++) {\n cur[delen[i]] = kloon(cur[delen[i]] ?? {});\n cur = cur[delen[i]];\n }\n cur[delen[delen.length - 1]] = waarde;\n return wortel as T;\n}\n\n/** De snelle keuzes van een blok: keuzelijsten, kleine getallen en schakelaars die het uiterlijk bepalen. */\nexport function snelleKeuzes(velden: Field[]): Field[] {\n // Alleen wat het UITERLIJK bepaalt; techniek en SEO (kopniveau, Google) horen in de zijbalk.\n const uitgesloten = /jsonLd|consent|dismiss|sticky|^lightbox$|^showDownload$|^includeNews$|^headingLevel$/;\n return velden\n .filter((f) => !TECHNISCHE_VELDEN.has(f.key) && !uitgesloten.test(f.key))\n .filter(\n (f) =>\n (f.type === \"select\" && f.options.length >= 2 && f.options.length <= 5) ||\n (f.type === \"number\" && f.min !== undefined && f.max !== undefined && f.max - f.min <= 4 && f.key !== \"rating\"),\n )\n .slice(0, 3);\n}\n\nexport function InlineGereedschap({\n blok,\n def,\n siteId,\n onWijzig,\n onInstellingen,\n onStartVeld,\n onVerwijderd,\n}: {\n blok: Blok;\n def: BlockDefinition | undefined;\n siteId: string;\n /** Nieuwe versie van het blok (één ongedaan-maak-stap). */\n onWijzig: (volgend: Blok) => void;\n onInstellingen: () => void;\n /** Zet het bewerken van een veld aan (na het toevoegen van een onderdeel). */\n onStartVeld: (veld: string) => void;\n onVerwijderd: (wat: string) => void;\n}) {\n const [host, setHost] = useState<HTMLElement | null>(null);\n const [items, setItems] = useState<{ lijst: string; index: number; r: Rect }[]>([]);\n const [hover, setHover] = useState<{ lijst: string; index: number } | null>(null);\n const [blokRect, setBlokRect] = useState<Rect | null>(null);\n const [linkDoel, setLinkDoel] = useState<{ veld: string; hrefVeld: string; r: Rect } | null>(null);\n const [linkOpen, setLinkOpen] = useState(false);\n const [veilig, setVeilig] = useState(0);\n useEffect(() => {\n const herijk = () => setVeilig(veiligeBovenkant());\n herijk();\n window.addEventListener(\"resize\", herijk);\n return () => window.removeEventListener(\"resize\", herijk);\n }, []);\n\n const velden = useMemo(() => {\n if (!def?.schema) return [] as Field[];\n try {\n return vertaalVelden(introspectToFields(def.schema, def.fields), def.type);\n } catch {\n return [] as Field[];\n }\n }, [def]);\n const keuzes = useMemo(() => snelleKeuzes(velden), [velden]);\n\n // Meten: het blok, zijn onderdelen. Bij scrollen, resizen en elke DOM-wijziging in het blok.\n // Het blok kan nog niet op de pagina staan (net ingevoegd: de werkversie rendert een frame\n // later). Dan even wachten in plaats van voorgoed zonder gereedschap te blijven.\n const [gevonden, setGevonden] = useState<HTMLElement | null>(null);\n useEffect(() => {\n let pogingen = 0;\n let frame = 0;\n const zoek = () => {\n const el = document.querySelector<HTMLElement>(`[data-xicms-block=\"${CSS.escape(blok._key)}\"]`);\n if (el) setGevonden(el);\n else if (++pogingen < 120) frame = requestAnimationFrame(zoek);\n };\n zoek();\n return () => cancelAnimationFrame(frame);\n }, [blok._key]);\n\n useEffect(() => {\n const el = gevonden;\n setHost(el);\n if (!el) return;\n let frame = 0;\n const meet = () => {\n const gevonden = vindLijstItems(el).map((it) => ({ lijst: it.lijst, index: it.index, r: rect(it.el) }));\n setItems((v) => (v.length === gevonden.length && v.every((x, i) => x.lijst === gevonden[i].lijst && x.index === gevonden[i].index && zelfde(x.r, gevonden[i].r)) ? v : gevonden));\n // Een display:contents-wrapper meet 0×0: dan de omtrek van de kinderen.\n let r = rect(el);\n if (r.width === 0 && r.height === 0) {\n const kids = Array.from(el.children).map(rect).filter((k) => k.width || k.height);\n if (kids.length) {\n const top = Math.min(...kids.map((k) => k.top));\n const left = Math.min(...kids.map((k) => k.left));\n r = { top, left, width: Math.max(...kids.map((k) => k.left + k.width)) - left, height: Math.max(...kids.map((k) => k.top + k.height)) - top };\n }\n }\n setBlokRect((v) => (zelfde(v, r) ? v : r));\n };\n const plan = () => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(meet);\n };\n meet();\n const obs = new MutationObserver(plan);\n obs.observe(el, { childList: true, subtree: true, characterData: true });\n window.addEventListener(\"scroll\", plan, { capture: true, passive: true });\n window.addEventListener(\"resize\", plan);\n return () => {\n cancelAnimationFrame(frame);\n obs.disconnect();\n window.removeEventListener(\"scroll\", plan, { capture: true });\n window.removeEventListener(\"resize\", plan);\n };\n }, [gevonden]);\n\n // Aanwijzen: welk onderdeel, en staat er een knoptekst met een link onder de muis/focus?\n useEffect(() => {\n if (!host) return;\n const kijk = (doel: HTMLElement | null) => {\n if (!doel) return;\n // Het binnenste onderdeel wint (de regel, niet het hele onderdeel waar hij in staat).\n const it = vindLijstItems(host)\n .filter((x) => x.el.contains(doel))\n .sort((a, b) => b.lijst.split(\".\").length - a.lijst.split(\".\").length)[0];\n setHover(it ? { lijst: it.lijst, index: it.index } : null);\n const veldEl = doel.closest<HTMLElement>(\"[data-xicms-edit]\");\n const veld = veldEl?.dataset.xicmsEdit;\n const hrefVeld = veld ? linkVeldVoor(veld, blok) : null;\n if (veldEl && veld && hrefVeld) setLinkDoel({ veld, hrefVeld, r: rect(veldEl) });\n };\n const opOver = (e: Event) => kijk(e.target as HTMLElement);\n host.addEventListener(\"mouseover\", opOver);\n host.addEventListener(\"focusin\", opOver);\n return () => {\n host.removeEventListener(\"mouseover\", opOver);\n host.removeEventListener(\"focusin\", opOver);\n };\n }, [host, blok]);\n // De link-chip volgt zijn knop bij scrollen.\n useEffect(() => {\n if (!linkDoel || !host) return;\n const herpositioneer = () => {\n const el = host.querySelector<HTMLElement>(`[data-xicms-edit=\"${CSS.escape(linkDoel.veld)}\"]`);\n if (!el) return setLinkDoel(null);\n const r = rect(el);\n setLinkDoel((v) => (v && !zelfde(v.r, r) ? { ...v, r } : v));\n };\n window.addEventListener(\"scroll\", herpositioneer, { capture: true, passive: true });\n return () => window.removeEventListener(\"scroll\", herpositioneer, { capture: true });\n }, [linkDoel, host]);\n\n const lijstActie = useCallback(\n (lijst: string, index: number, actie: \"omhoog\" | \"omlaag\" | \"dupliceer\" | \"weg\") => {\n const arr = [...((haal(blok, lijst) as unknown[]) ?? [])];\n if (actie === \"omhoog\" && index > 0) [arr[index - 1], arr[index]] = [arr[index], arr[index - 1]];\n else if (actie === \"omlaag\" && index < arr.length - 1) [arr[index + 1], arr[index]] = [arr[index], arr[index + 1]];\n else if (actie === \"dupliceer\") arr.splice(index + 1, 0, structuredClone(arr[index]));\n else if (actie === \"weg\") arr.splice(index, 1);\n else return;\n onWijzig(zet(blok, lijst, arr));\n if (actie === \"weg\") onVerwijderd(itemNaam(blok._type, lijstVorm(lijst)) ?? \"Onderdeel\");\n setHover(null);\n },\n [blok, onWijzig, onVerwijderd],\n );\n\n const voegToe = useCallback(\n (lijst: string) => {\n const arr = [...((haal(blok, lijst) as Record<string, unknown>[]) ?? [])];\n const voorbeeld = arr[arr.length - 1] ?? (haal(def?.defaults?.() ?? {}, lijstVorm(lijst)) as Record<string, unknown>[] | undefined)?.[0] ?? {};\n const nieuw = structuredClone(voorbeeld) as Record<string, unknown>;\n // Zichtbaar nieuw: de eerste tekst krijgt \"Nieuw …\", zodat je ziet wélk onderdeel erbij kwam.\n const naam = (itemNaam(blok._type, lijstVorm(lijst)) ?? \"onderdeel\").toLowerCase();\n const eerste = [\"title\", \"name\", \"label\", \"question\", \"q\", \"author\", \"day\"].find((k) => typeof nieuw[k] === \"string\");\n if (eerste) nieuw[eerste] = `Nieuw: ${naam}`;\n for (const k of [\"featured\", \"highlighted\"]) if (k in nieuw) nieuw[k] = false;\n arr.push(nieuw);\n onWijzig(zet(blok, lijst, arr));\n if (eerste) onStartVeld(`${lijst}.${arr.length - 1}.${eerste}`);\n },\n [blok, def, onWijzig, onStartVeld],\n );\n\n // Per lijst het laatste onderdeel (daaronder de \"+\"-knop).\n const laatste = useMemo(() => {\n const m = new Map<string, Rect>();\n for (const it of items) m.set(it.lijst, it.r);\n return m;\n }, [items]);\n const hoverItem = hover ? items.find((x) => x.lijst === hover.lijst && x.index === hover.index) : undefined;\n const aantal = (lijst: string) => ((haal(blok, lijst) as unknown[]) ?? []).length;\n\n const hrefNu = linkDoel ? String(haal(blok, linkDoel.hrefVeld) ?? \"\") : \"\";\n const zichtbaar = (r: Rect) => r.top + r.height > veilig && r.top < window.innerHeight;\n\n return (\n <>\n {/* Snelle keuzes: linksboven het blok (rechtsboven staan potlood en tandwiel). */}\n {blokRect && zichtbaar(blokRect) && keuzes.length > 0 && (\n <div\n className=\"xicms-ve-snel\"\n role=\"toolbar\"\n aria-label={`Snel aanpassen: ${def?.label ?? \"\"}`}\n // Boven het blok (net buiten de rand), zodat het de kop van het blok niet afdekt; is daar\n // geen ruimte (blok bovenaan in beeld), dan binnen de bovenrand.\n style={{ top: blokRect.top - 46 > veilig + 4 ? blokRect.top - 46 : Math.max(blokRect.top + 8, veilig + 8), left: Math.max(blokRect.left, 8) }}\n onMouseDown={(e) => e.preventDefault()}\n >\n {keuzes.map((f) => {\n const huidig = blok[f.key];\n const opties =\n f.type === \"select\"\n ? f.options.map((o) => ({ value: o.value as unknown, label: o.label }))\n : Array.from({ length: (f as { max: number }).max - (f as { min: number }).min + 1 }, (_, i) => {\n const n = (f as { min: number }).min + i;\n return { value: n as unknown, label: String(n) };\n });\n const actief = huidig ?? (f.type === \"select\" ? (f.standaard ?? f.options[0]?.value) : undefined);\n return (\n <span key={f.key} className=\"xicms-ve-snel__groep\" role=\"radiogroup\" aria-label={f.label}>\n <span className=\"xicms-ve-snel__label\">{f.label}</span>\n {opties.map((o) => (\n <button\n key={String(o.value)}\n type=\"button\"\n role=\"radio\"\n aria-checked={actief === o.value}\n className=\"xicms-ve-snel__knop\"\n onClick={() => onWijzig({ ...blok, [f.key]: o.value })}\n >\n {o.label}\n </button>\n ))}\n </span>\n );\n })}\n <button type=\"button\" className=\"xicms-ve-snel__meer\" onClick={onInstellingen} title=\"Alle instellingen in de zijbalk\">\n Meer ⚙\n </button>\n </div>\n )}\n\n {/* Het onderdeel onder de muis: verplaatsen, dupliceren, weghalen. */}\n {hoverItem && zichtbaar(hoverItem.r) && (\n <div\n className=\"xicms-ve-item\"\n role=\"toolbar\"\n aria-label={`${itemNaam(blok._type, lijstVorm(hoverItem.lijst)) ?? \"Onderdeel\"} ${hoverItem.index + 1}`}\n style={{ top: Math.max(hoverItem.r.top + 6, veilig + 8), left: Math.max(hoverItem.r.left + hoverItem.r.width - 6, 120) }}\n onMouseDown={(e) => e.preventDefault()}\n >\n {(() => {\n const naam = itemNaam(blok._type, lijstVorm(hoverItem.lijst)) ?? \"Onderdeel\";\n const n = aantal(hoverItem.lijst);\n return (\n <>\n <button type=\"button\" title={`${naam} naar voren`} aria-label={`${naam} naar voren`} disabled={hoverItem.index === 0} onClick={() => lijstActie(hoverItem.lijst, hoverItem.index, \"omhoog\")}>\n ↑\n </button>\n <button type=\"button\" title={`${naam} naar achteren`} aria-label={`${naam} naar achteren`} disabled={hoverItem.index >= n - 1} onClick={() => lijstActie(hoverItem.lijst, hoverItem.index, \"omlaag\")}>\n ↓\n </button>\n <button type=\"button\" title={`${naam} dupliceren`} aria-label={`${naam} dupliceren`} onClick={() => lijstActie(hoverItem.lijst, hoverItem.index, \"dupliceer\")}>\n ⧉\n </button>\n <button type=\"button\" className=\"is-gevaar\" title={`${naam} weghalen`} aria-label={`${naam} weghalen`} onClick={() => lijstActie(hoverItem.lijst, hoverItem.index, \"weg\")}>\n 🗑\n </button>\n </>\n );\n })()}\n </div>\n )}\n\n {/* \"+ Kaart\" onder het laatste onderdeel van elke lijst. */}\n {[...laatste].map(([lijst, r]) => {\n // Een buitenste lijst waarvan het laatste onderdeel samen eindigt met een binnenste lijst\n // (laatste regel van het laatste onderdeel) schuift een knophoogte op, anders liggen\n // \"+ Regel\" en \"+ Onderdeel\" op elkaar.\n const diepte = lijst.split(\".\").length;\n const botst = [...laatste].some(([ander, ar]) => ander !== lijst && ander.split(\".\").length > diepte && Math.abs(ar.top + ar.height - (r.top + r.height)) < 30);\n return [lijst, botst ? { ...r, height: r.height + 40 } : r] as const;\n }).map(([lijst, r]) =>\n // Alleen als de onderkant van de lijst in beeld is — anders zweeft \"+ Kaart\" los onderaan.\n r.top + r.height > veilig && r.top + r.height + 46 < window.innerHeight ? (\n <button\n key={lijst}\n type=\"button\"\n className=\"xicms-ve-plus\"\n style={{ top: r.top + r.height + 6, left: r.left + r.width / 2 }}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => voegToe(lijst)}\n >\n + {itemNaam(blok._type, lijstVorm(lijst)) ?? \"Toevoegen\"}\n </button>\n ) : null,\n )}\n\n {/* Link bij een knop: waar hij heen gaat, en wijzigen met één klik. */}\n {linkDoel && zichtbaar(linkDoel.r) && (\n <button\n type=\"button\"\n className=\"xicms-ve-linkchip\"\n style={{ top: linkDoel.r.top + linkDoel.r.height + 4, left: linkDoel.r.left }}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setLinkOpen(true)}\n title=\"Waar gaat deze knop heen?\"\n >\n 🔗 {!hrefNu || hrefNu === \"#\" ? \"Kies waar deze knop heen gaat\" : hrefNu.replace(/^https?:\\/\\//, \"\")}\n </button>\n )}\n <LinkDialog\n open={linkOpen}\n onOpenChange={setLinkOpen}\n siteId={siteId}\n huidig={hrefNu === \"#\" ? \"\" : hrefNu}\n onKlaar={(href) => {\n if (linkDoel) onWijzig(zet(blok, linkDoel.hrefVeld, href ?? \"\"));\n }}\n />\n </>\n );\n}\n"],"mappings":"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","names":["gevonden"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Markeert de vervanger, zodat de inline-binding van de editor hem niet als nieuw veld ziet. */
|
|
2
|
+
export declare const RIJK_ATTR = "data-xicms-ve-rijk";
|
|
3
|
+
/**
|
|
4
|
+
* Rich-text bewerken OP DE SITE (8.6) met dezelfde editor als het beheer: slash-menu,
|
|
5
|
+
* selectie-werkbalk, koppen, lijsten, tabellen, foto's plakken/slepen, links met nieuw tabblad.
|
|
6
|
+
*
|
|
7
|
+
* Hoe: het tekstelement van het blok blijft van React (de render van de klant). We verbergen het en
|
|
8
|
+
* zetten er een vervanger naast met dezelfde klassen, zodat de tekst exact de opmaak van de site
|
|
9
|
+
* houdt (WYSIWYG). TipTap komt via een portal in die vervanger. Wijzigingen gaan doorlopend
|
|
10
|
+
* (gedebounced) naar de werkversie — het verborgen origineel mag dus gewoon her-renderen. Bij
|
|
11
|
+
* "klaar" verdwijnt de vervanger en staat het origineel weer, met de nieuwe tekst.
|
|
12
|
+
*/
|
|
13
|
+
export declare function InlineRijkeTekst({ el, siteId, onCommit, onKlaar, flushRef, }: {
|
|
14
|
+
/** Het `.xicms-richtext`-element van het blok. */
|
|
15
|
+
el: HTMLElement;
|
|
16
|
+
siteId?: string;
|
|
17
|
+
/** Schrijf de (gesanitizede) HTML naar de werkversie. */
|
|
18
|
+
onCommit: (html: string) => void;
|
|
19
|
+
/** Bewerken afgerond (Escape, klik ernaast, ✓). */
|
|
20
|
+
onKlaar: () => void;
|
|
21
|
+
/** Voor de editor: alles wat nog in de debounce zit nú wegschrijven (vóór opslaan/publiceren). */
|
|
22
|
+
flushRef: React.MutableRefObject<(() => void) | null>;
|
|
23
|
+
}): import("react").JSX.Element | null;
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { EditorContent } from "@tiptap/react";
|
|
4
|
+
import DOMPurify from "dompurify";
|
|
5
|
+
import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
|
|
6
|
+
import { createPortal } from "react-dom";
|
|
7
|
+
import { RteKnop, useRijkeTekst } from "../editors/useRijkeTekst.js";
|
|
8
|
+
const RIJK_ATTR = "data-xicms-ve-rijk";
|
|
9
|
+
function InlineRijkeTekst({
|
|
10
|
+
el,
|
|
11
|
+
siteId,
|
|
12
|
+
onCommit,
|
|
13
|
+
onKlaar,
|
|
14
|
+
flushRef
|
|
15
|
+
}) {
|
|
16
|
+
const [wrap, setWrap] = useState(null);
|
|
17
|
+
const beginHtml = useRef(el.innerHTML);
|
|
18
|
+
const laatsteRef = useRef(null);
|
|
19
|
+
const timerRef = useRef(void 0);
|
|
20
|
+
const balkRef = useRef(null);
|
|
21
|
+
const [pos, setPos] = useState(null);
|
|
22
|
+
const flush = useCallback(() => {
|
|
23
|
+
window.clearTimeout(timerRef.current);
|
|
24
|
+
const html = laatsteRef.current;
|
|
25
|
+
if (html === null) return;
|
|
26
|
+
laatsteRef.current = null;
|
|
27
|
+
onCommit(html);
|
|
28
|
+
}, [onCommit]);
|
|
29
|
+
const flushLatest = useRef(flush);
|
|
30
|
+
flushLatest.current = flush;
|
|
31
|
+
const { editor, overlays, openLink, openFoto, ietsOpen } = useRijkeTekst({
|
|
32
|
+
value: beginHtml.current,
|
|
33
|
+
siteId,
|
|
34
|
+
autofocus: true,
|
|
35
|
+
editorClass: "xicms-ve-rijk__oppervlak",
|
|
36
|
+
onEscape: onKlaar,
|
|
37
|
+
alleenVensterScroll: true,
|
|
38
|
+
onChange: (html) => {
|
|
39
|
+
laatsteRef.current = DOMPurify.sanitize(html);
|
|
40
|
+
window.clearTimeout(timerRef.current);
|
|
41
|
+
timerRef.current = window.setTimeout(() => flushLatest.current(), 600);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
useLayoutEffect(() => {
|
|
45
|
+
const w = document.createElement("div");
|
|
46
|
+
w.className = el.className;
|
|
47
|
+
w.classList.remove("is-editing", "is-hover", "xicms-ve-inline", "xicms-ve-gewijzigd");
|
|
48
|
+
w.classList.add("xicms-ve-rijk");
|
|
49
|
+
w.setAttribute(RIJK_ATTR, "");
|
|
50
|
+
el.after(w);
|
|
51
|
+
const oudeDisplay = el.style.display;
|
|
52
|
+
el.style.display = "none";
|
|
53
|
+
setWrap(w);
|
|
54
|
+
return () => {
|
|
55
|
+
w.remove();
|
|
56
|
+
el.style.display = oudeDisplay;
|
|
57
|
+
};
|
|
58
|
+
}, [el]);
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
flushRef.current = () => flushLatest.current();
|
|
61
|
+
return () => {
|
|
62
|
+
flushLatest.current();
|
|
63
|
+
flushRef.current = null;
|
|
64
|
+
};
|
|
65
|
+
}, [flushRef]);
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
if (!wrap) return;
|
|
68
|
+
let frame = 0;
|
|
69
|
+
const meet = () => {
|
|
70
|
+
const r = wrap.getBoundingClientRect();
|
|
71
|
+
const breedte = balkRef.current?.offsetWidth ?? 420;
|
|
72
|
+
const hoogte = balkRef.current?.offsetHeight ?? 40;
|
|
73
|
+
setPos({
|
|
74
|
+
top: Math.min(Math.max(56, r.top - hoogte - 8), Math.max(56, r.bottom - 8)),
|
|
75
|
+
left: Math.min(Math.max(8, r.left), Math.max(8, window.innerWidth - breedte - 8))
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
const opnieuw = () => {
|
|
79
|
+
cancelAnimationFrame(frame);
|
|
80
|
+
frame = requestAnimationFrame(meet);
|
|
81
|
+
};
|
|
82
|
+
meet();
|
|
83
|
+
const ro = new ResizeObserver(opnieuw);
|
|
84
|
+
ro.observe(wrap);
|
|
85
|
+
window.addEventListener("scroll", opnieuw, { capture: true, passive: true });
|
|
86
|
+
window.addEventListener("resize", opnieuw, { passive: true });
|
|
87
|
+
return () => {
|
|
88
|
+
cancelAnimationFrame(frame);
|
|
89
|
+
ro.disconnect();
|
|
90
|
+
window.removeEventListener("scroll", opnieuw, { capture: true });
|
|
91
|
+
window.removeEventListener("resize", opnieuw);
|
|
92
|
+
};
|
|
93
|
+
}, [wrap]);
|
|
94
|
+
const ietsOpenRef = useRef(ietsOpen);
|
|
95
|
+
ietsOpenRef.current = ietsOpen;
|
|
96
|
+
useEffect(() => {
|
|
97
|
+
if (!wrap) return;
|
|
98
|
+
const opKlik = (e) => {
|
|
99
|
+
const t = e.target;
|
|
100
|
+
if (!t || ietsOpenRef.current) return;
|
|
101
|
+
if (wrap.contains(t) || balkRef.current?.contains(t)) return;
|
|
102
|
+
if (t.closest(".xicms-bubbel, .xicms-slash, [role='dialog'], [role='listbox'], .xicms-ve-pencil, .xicms-toast, [data-radix-popper-content-wrapper]")) return;
|
|
103
|
+
onKlaar();
|
|
104
|
+
};
|
|
105
|
+
document.addEventListener("pointerdown", opKlik, true);
|
|
106
|
+
return () => document.removeEventListener("pointerdown", opKlik, true);
|
|
107
|
+
}, [wrap, onKlaar]);
|
|
108
|
+
if (!wrap || !editor) return null;
|
|
109
|
+
const k = "xicms-ve-fmtbar__knop";
|
|
110
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
111
|
+
createPortal(/* @__PURE__ */ jsx(EditorContent, { editor }), wrap),
|
|
112
|
+
/* @__PURE__ */ jsxs(
|
|
113
|
+
"div",
|
|
114
|
+
{
|
|
115
|
+
ref: balkRef,
|
|
116
|
+
className: "xicms-ve-fmtbar",
|
|
117
|
+
style: pos ? { top: pos.top, left: pos.left } : { visibility: "hidden" },
|
|
118
|
+
role: "toolbar",
|
|
119
|
+
"aria-label": "Tekstopmaak",
|
|
120
|
+
children: [
|
|
121
|
+
/* @__PURE__ */ jsx(RteKnop, { className: k, on: () => editor.chain().focus().toggleBold().run(), active: editor.isActive("bold"), label: /* @__PURE__ */ jsx("b", { children: "B" }), title: "Vet (Ctrl/Cmd+B)" }),
|
|
122
|
+
/* @__PURE__ */ jsx(RteKnop, { className: k, on: () => editor.chain().focus().toggleItalic().run(), active: editor.isActive("italic"), label: /* @__PURE__ */ jsx("i", { children: "I" }), title: "Cursief (Ctrl/Cmd+I)" }),
|
|
123
|
+
/* @__PURE__ */ jsx(RteKnop, { className: k, on: () => editor.chain().focus().toggleUnderline().run(), active: editor.isActive("underline"), label: /* @__PURE__ */ jsx("u", { children: "U" }), title: "Onderstrepen (Ctrl/Cmd+U)" }),
|
|
124
|
+
/* @__PURE__ */ jsx(RteKnop, { className: k, on: openLink, active: editor.isActive("link"), label: "\u{1F517}", title: "Link" }),
|
|
125
|
+
/* @__PURE__ */ jsx("span", { className: "xicms-ve-fmtbar__sep", "aria-hidden": true }),
|
|
126
|
+
/* @__PURE__ */ jsx(RteKnop, { className: k, on: () => editor.chain().focus().toggleHeading({ level: 2 }).run(), active: editor.isActive("heading", { level: 2 }), label: "H2", title: "Kop" }),
|
|
127
|
+
/* @__PURE__ */ jsx(RteKnop, { className: k, on: () => editor.chain().focus().toggleHeading({ level: 3 }).run(), active: editor.isActive("heading", { level: 3 }), label: "H3", title: "Subkop" }),
|
|
128
|
+
/* @__PURE__ */ jsx(RteKnop, { className: k, on: () => editor.chain().focus().setParagraph().run(), active: editor.isActive("paragraph"), label: "\xB6", title: "Gewone tekst" }),
|
|
129
|
+
/* @__PURE__ */ jsx("span", { className: "xicms-ve-fmtbar__sep", "aria-hidden": true }),
|
|
130
|
+
/* @__PURE__ */ jsx(RteKnop, { className: k, on: () => editor.chain().focus().toggleBulletList().run(), active: editor.isActive("bulletList"), label: "\u2022", title: "Opsomming" }),
|
|
131
|
+
/* @__PURE__ */ jsx(RteKnop, { className: k, on: () => editor.chain().focus().toggleOrderedList().run(), active: editor.isActive("orderedList"), label: "1.", title: "Genummerde lijst" }),
|
|
132
|
+
/* @__PURE__ */ jsx(RteKnop, { className: k, on: () => editor.chain().focus().toggleBlockquote().run(), active: editor.isActive("blockquote"), label: "\u275D", title: "Citaat" }),
|
|
133
|
+
siteId && /* @__PURE__ */ jsx(RteKnop, { className: k, on: openFoto, label: "\u{1F5BC}", title: "Foto invoegen (of plak/sleep een foto in de tekst)" }),
|
|
134
|
+
/* @__PURE__ */ jsx("span", { className: "xicms-ve-fmtbar__sep", "aria-hidden": true }),
|
|
135
|
+
/* @__PURE__ */ jsx(RteKnop, { className: k, on: () => editor.chain().focus().undo().run(), label: "\u21B6", title: "Ongedaan maken (Ctrl/Cmd+Z)" }),
|
|
136
|
+
/* @__PURE__ */ jsx(RteKnop, { className: `${k} xicms-ve-fmtbar__klaar`, on: onKlaar, label: "Klaar", title: "Klaar met deze tekst (Esc)" }),
|
|
137
|
+
/* @__PURE__ */ jsxs("span", { className: "xicms-ve-fmtbar__tip", "aria-hidden": true, children: [
|
|
138
|
+
"typ ",
|
|
139
|
+
/* @__PURE__ */ jsx("kbd", { children: "/" }),
|
|
140
|
+
" voor meer"
|
|
141
|
+
] })
|
|
142
|
+
]
|
|
143
|
+
}
|
|
144
|
+
),
|
|
145
|
+
overlays
|
|
146
|
+
] });
|
|
147
|
+
}
|
|
148
|
+
export {
|
|
149
|
+
InlineRijkeTekst,
|
|
150
|
+
RIJK_ATTR
|
|
151
|
+
};
|
|
152
|
+
//# sourceMappingURL=InlineRijkeTekst.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/visual/InlineRijkeTekst.tsx"],"sourcesContent":["\"use client\";\n\nimport { EditorContent } from \"@tiptap/react\";\nimport DOMPurify from \"dompurify\";\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { RteKnop, useRijkeTekst } from \"../editors/useRijkeTekst\";\n\n/** Markeert de vervanger, zodat de inline-binding van de editor hem niet als nieuw veld ziet. */\nexport const RIJK_ATTR = \"data-xicms-ve-rijk\";\n\n/**\n * Rich-text bewerken OP DE SITE (8.6) met dezelfde editor als het beheer: slash-menu,\n * selectie-werkbalk, koppen, lijsten, tabellen, foto's plakken/slepen, links met nieuw tabblad.\n *\n * Hoe: het tekstelement van het blok blijft van React (de render van de klant). We verbergen het en\n * zetten er een vervanger naast met dezelfde klassen, zodat de tekst exact de opmaak van de site\n * houdt (WYSIWYG). TipTap komt via een portal in die vervanger. Wijzigingen gaan doorlopend\n * (gedebounced) naar de werkversie — het verborgen origineel mag dus gewoon her-renderen. Bij\n * \"klaar\" verdwijnt de vervanger en staat het origineel weer, met de nieuwe tekst.\n */\nexport function InlineRijkeTekst({\n el,\n siteId,\n onCommit,\n onKlaar,\n flushRef,\n}: {\n /** Het `.xicms-richtext`-element van het blok. */\n el: HTMLElement;\n siteId?: string;\n /** Schrijf de (gesanitizede) HTML naar de werkversie. */\n onCommit: (html: string) => void;\n /** Bewerken afgerond (Escape, klik ernaast, ✓). */\n onKlaar: () => void;\n /** Voor de editor: alles wat nog in de debounce zit nú wegschrijven (vóór opslaan/publiceren). */\n flushRef: React.MutableRefObject<(() => void) | null>;\n}) {\n const [wrap, setWrap] = useState<HTMLElement | null>(null);\n const beginHtml = useRef(el.innerHTML);\n const laatsteRef = useRef<string | null>(null);\n const timerRef = useRef<number | undefined>(undefined);\n const balkRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<{ top: number; left: number } | null>(null);\n\n const flush = useCallback(() => {\n window.clearTimeout(timerRef.current);\n const html = laatsteRef.current;\n if (html === null) return;\n laatsteRef.current = null;\n onCommit(html);\n }, [onCommit]);\n const flushLatest = useRef(flush);\n flushLatest.current = flush;\n\n const { editor, overlays, openLink, openFoto, ietsOpen } = useRijkeTekst({\n value: beginHtml.current,\n siteId,\n autofocus: true,\n editorClass: \"xicms-ve-rijk__oppervlak\",\n onEscape: onKlaar,\n alleenVensterScroll: true,\n onChange: (html) => {\n laatsteRef.current = DOMPurify.sanitize(html);\n window.clearTimeout(timerRef.current);\n timerRef.current = window.setTimeout(() => flushLatest.current(), 600);\n },\n });\n\n // Vervanger plaatsen vóór de eerste paint (geen flits van de oude tekst), origineel verbergen.\n useLayoutEffect(() => {\n const w = document.createElement(\"div\");\n w.className = el.className;\n w.classList.remove(\"is-editing\", \"is-hover\", \"xicms-ve-inline\", \"xicms-ve-gewijzigd\");\n w.classList.add(\"xicms-ve-rijk\");\n w.setAttribute(RIJK_ATTR, \"\");\n el.after(w);\n const oudeDisplay = el.style.display;\n el.style.display = \"none\";\n setWrap(w);\n return () => {\n w.remove();\n el.style.display = oudeDisplay;\n };\n }, [el]);\n\n // Bij afronden of wegnavigeren: laatste wijziging niet kwijtraken.\n useEffect(() => {\n flushRef.current = () => flushLatest.current();\n return () => {\n flushLatest.current();\n flushRef.current = null;\n };\n }, [flushRef]);\n\n // Werkbalk boven het veld; blijft in beeld als het veld hoger is dan het scherm.\n useEffect(() => {\n if (!wrap) return;\n let frame = 0;\n const meet = () => {\n const r = wrap.getBoundingClientRect();\n const breedte = balkRef.current?.offsetWidth ?? 420;\n // Echte hoogte: op een telefoon loopt de balk over twee regels en lag hij anders over de tekst.\n const hoogte = balkRef.current?.offsetHeight ?? 40;\n setPos({\n top: Math.min(Math.max(56, r.top - hoogte - 8), Math.max(56, r.bottom - 8)),\n left: Math.min(Math.max(8, r.left), Math.max(8, window.innerWidth - breedte - 8)),\n });\n };\n const opnieuw = () => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(meet);\n };\n meet();\n const ro = new ResizeObserver(opnieuw);\n ro.observe(wrap);\n window.addEventListener(\"scroll\", opnieuw, { capture: true, passive: true });\n window.addEventListener(\"resize\", opnieuw, { passive: true });\n return () => {\n cancelAnimationFrame(frame);\n ro.disconnect();\n window.removeEventListener(\"scroll\", opnieuw, { capture: true });\n window.removeEventListener(\"resize\", opnieuw);\n };\n }, [wrap]);\n\n // Klik ernaast = klaar. Niet bij klikken in de editor, zijn werkbalk, menu's of dialogen.\n const ietsOpenRef = useRef(ietsOpen);\n ietsOpenRef.current = ietsOpen;\n useEffect(() => {\n if (!wrap) return;\n const opKlik = (e: PointerEvent) => {\n const t = e.target as Element | null;\n if (!t || ietsOpenRef.current) return;\n if (wrap.contains(t) || balkRef.current?.contains(t)) return;\n if (t.closest(\".xicms-bubbel, .xicms-slash, [role='dialog'], [role='listbox'], .xicms-ve-pencil, .xicms-toast, [data-radix-popper-content-wrapper]\")) return;\n onKlaar();\n };\n document.addEventListener(\"pointerdown\", opKlik, true);\n return () => document.removeEventListener(\"pointerdown\", opKlik, true);\n }, [wrap, onKlaar]);\n\n if (!wrap || !editor) return null;\n const k = \"xicms-ve-fmtbar__knop\";\n return (\n <>\n {createPortal(<EditorContent editor={editor} />, wrap)}\n <div\n ref={balkRef}\n className=\"xicms-ve-fmtbar\"\n style={pos ? { top: pos.top, left: pos.left } : { visibility: \"hidden\" }}\n role=\"toolbar\"\n aria-label=\"Tekstopmaak\"\n >\n <RteKnop className={k} on={() => editor.chain().focus().toggleBold().run()} active={editor.isActive(\"bold\")} label={<b>B</b>} title=\"Vet (Ctrl/Cmd+B)\" />\n <RteKnop className={k} on={() => editor.chain().focus().toggleItalic().run()} active={editor.isActive(\"italic\")} label={<i>I</i>} title=\"Cursief (Ctrl/Cmd+I)\" />\n <RteKnop className={k} on={() => editor.chain().focus().toggleUnderline().run()} active={editor.isActive(\"underline\")} label={<u>U</u>} title=\"Onderstrepen (Ctrl/Cmd+U)\" />\n <RteKnop className={k} on={openLink} active={editor.isActive(\"link\")} label=\"🔗\" title=\"Link\" />\n <span className=\"xicms-ve-fmtbar__sep\" aria-hidden />\n <RteKnop className={k} on={() => editor.chain().focus().toggleHeading({ level: 2 }).run()} active={editor.isActive(\"heading\", { level: 2 })} label=\"H2\" title=\"Kop\" />\n <RteKnop className={k} on={() => editor.chain().focus().toggleHeading({ level: 3 }).run()} active={editor.isActive(\"heading\", { level: 3 })} label=\"H3\" title=\"Subkop\" />\n <RteKnop className={k} on={() => editor.chain().focus().setParagraph().run()} active={editor.isActive(\"paragraph\")} label=\"¶\" title=\"Gewone tekst\" />\n <span className=\"xicms-ve-fmtbar__sep\" aria-hidden />\n <RteKnop className={k} on={() => editor.chain().focus().toggleBulletList().run()} active={editor.isActive(\"bulletList\")} label=\"•\" title=\"Opsomming\" />\n <RteKnop className={k} on={() => editor.chain().focus().toggleOrderedList().run()} active={editor.isActive(\"orderedList\")} label=\"1.\" title=\"Genummerde lijst\" />\n <RteKnop className={k} on={() => editor.chain().focus().toggleBlockquote().run()} active={editor.isActive(\"blockquote\")} label=\"❝\" title=\"Citaat\" />\n {siteId && <RteKnop className={k} on={openFoto} label=\"🖼\" title=\"Foto invoegen (of plak/sleep een foto in de tekst)\" />}\n <span className=\"xicms-ve-fmtbar__sep\" aria-hidden />\n <RteKnop className={k} on={() => editor.chain().focus().undo().run()} label=\"↶\" title=\"Ongedaan maken (Ctrl/Cmd+Z)\" />\n <RteKnop className={`${k} xicms-ve-fmtbar__klaar`} on={onKlaar} label=\"Klaar\" title=\"Klaar met deze tekst (Esc)\" />\n <span className=\"xicms-ve-fmtbar__tip\" aria-hidden>\n typ <kbd>/</kbd> voor meer\n </span>\n </div>\n {overlays}\n </>\n );\n}\n"],"mappings":"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","names":[]}
|