@xiwebdesign/xicms-core 7.31.0 → 8.16.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 +23 -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 -60
- 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 +248 -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 +159 -0
- package/dist/admin/settings/BedrijfInstellingen.js.map +1 -0
- 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 +56 -17
- 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/auth/AuthProvider.js +1 -0
- package/dist/auth/AuthProvider.js.map +1 -1
- package/dist/bedrijf/bedrijf.d.ts +44 -0
- package/dist/bedrijf/bedrijf.js +125 -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 +37 -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 +3 -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/consentEmbed.js +26 -9
- package/dist/blocks/builtins/consentEmbed.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/onderOffset.d.ts +13 -0
- package/dist/components/onderOffset.js +74 -0
- package/dist/components/onderOffset.js.map +1 -0
- package/dist/components/site/Bedrijfsnummers.d.ts +9 -0
- package/dist/components/site/Bedrijfsnummers.js +12 -0
- package/dist/components/site/Bedrijfsnummers.js.map +1 -0
- package/dist/components/site/SiteFooter.d.ts +6 -1
- package/dist/components/site/SiteFooter.js +62 -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/firebase/functionsClient.js +5 -1
- package/dist/firebase/functionsClient.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +20 -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 +22 -9
- package/dist/modules/builtins.js.map +1 -1
- package/dist/modules/consent/ConsentBanner.d.ts +5 -0
- package/dist/modules/consent/ConsentBanner.js +8 -7
- package/dist/modules/consent/ConsentBanner.js.map +1 -1
- package/dist/modules/consent/standaard.d.ts +12 -0
- package/dist/modules/consent/standaard.js +10 -0
- package/dist/modules/consent/standaard.js.map +1 -0
- package/dist/modules/consent/useConsent.d.ts +4 -0
- package/dist/modules/consent/useConsent.js +30 -1
- package/dist/modules/consent/useConsent.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 +148 -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 +473 -0
- package/dist/schema/blocks.js +105 -5
- package/dist/schema/blocks.js.map +1 -1
- package/dist/schema/business.d.ts +118 -0
- package/dist/schema/business.js +75 -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 +103 -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 +69 -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 +2 -0
- 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 +1181 -212
- 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 +5 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/admin/ui/ConfirmDialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, useCallback, useContext, useRef, useState, type ReactNode } from \"react\";\nimport { AlertDialog } from \"@astryxdesign/core/AlertDialog\";\n\n/**\n * Eén bevestigingsdialoog voor de hele admin, op de **Astryx AlertDialog** (role=\"alertdialog\",\n * niet weg te klikken). `useConfirm()` geeft een functie die een Promise<bool> teruggeeft — zo\n * vervang je een onveilige directe verwijdering door een nette \"weet je het zeker?\". Monteer\n * `<ConfirmHost/>` één keer in `AdminApp`. De API blijft gelijk (geen call-site-wijziging).\n */\nexport interface ConfirmOptions {\n title: string;\n description?: ReactNode;\n confirmLabel?: string;\n cancelLabel?: string;\n /** \"danger\" = destructieve (rode) bevestigingsknop (verwijderen e.d.). */\n tone?: \"default\" | \"danger\";\n}\n\ntype ConfirmFn = (opts: ConfirmOptions) => Promise<boolean>;\n\nconst ConfirmContext = createContext<ConfirmFn | null>(null);\n\nexport function ConfirmHost({ children }: { children: ReactNode }) {\n const [open, setOpen] = useState(false);\n const [opts, setOpts] = useState<ConfirmOptions | null>(null);\n const resolver = useRef<((v: boolean) => void) | null>(null);\n\n const confirm = useCallback<ConfirmFn>((o) => {\n setOpts(o);\n setOpen(true);\n return new Promise<boolean>((resolve) => {\n resolver.current = resolve;\n });\n }, []);\n\n const close = useCallback((value: boolean) => {\n setOpen(false);\n resolver.current?.(value);\n resolver.current = null;\n }, []);\n\n return (\n <ConfirmContext.Provider value={confirm}>\n {children}\n {opts && (\n <AlertDialog\n isOpen={open}\n onOpenChange={(o) => !o && close(false)}\n title={opts.title}\n description={typeof opts.description === \"string\" ? opts.description : \" \"}\n cancelLabel={opts.cancelLabel ?? \"Annuleren\"}\n actionLabel={opts.confirmLabel ?? \"Bevestigen\"}\n actionVariant={opts.tone === \"danger\" ? \"destructive\" : \"primary\"}\n onAction={() => close(true)}\n />\n )}\n </ConfirmContext.Provider>\n );\n}\n\n/** Geeft een `confirm(opts) => Promise<boolean>`. Buiten een `ConfirmHost` valt het terug op `false`. */\nexport function useConfirm(): ConfirmFn {\n const ctx = useContext(ConfirmContext);\n return ctx ?? (async () => false);\n}\n"],"mappings":";
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/ui/ConfirmDialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, useCallback, useContext, useRef, useState, type ReactNode } from \"react\";\nimport { AlertDialog } from \"@astryxdesign/core/AlertDialog\";\nimport { Dialog, DialogContent, DialogFooter } from \"./dialog\";\nimport { Button } from \"./primitives\";\n\n/**\n * Eén bevestigingsdialoog voor de hele admin, op de **Astryx AlertDialog** (role=\"alertdialog\",\n * niet weg te klikken). `useConfirm()` geeft een functie die een Promise<bool> teruggeeft — zo\n * vervang je een onveilige directe verwijdering door een nette \"weet je het zeker?\". Monteer\n * `<ConfirmHost/>` één keer in `AdminApp`. De API blijft gelijk (geen call-site-wijziging).\n */\nexport interface ConfirmOptions {\n title: string;\n description?: ReactNode;\n confirmLabel?: string;\n cancelLabel?: string;\n /** \"danger\" = destructieve (rode) bevestigingsknop (verwijderen e.d.). */\n tone?: \"default\" | \"danger\";\n}\n\ntype ConfirmFn = (opts: ConfirmOptions) => Promise<boolean>;\n\nconst ConfirmContext = createContext<ConfirmFn | null>(null);\n\nexport function ConfirmHost({ children }: { children: ReactNode }) {\n const [open, setOpen] = useState(false);\n const [opts, setOpts] = useState<ConfirmOptions | null>(null);\n const resolver = useRef<((v: boolean) => void) | null>(null);\n\n const confirm = useCallback<ConfirmFn>((o) => {\n setOpts(o);\n setOpen(true);\n return new Promise<boolean>((resolve) => {\n resolver.current = resolve;\n });\n }, []);\n\n const close = useCallback((value: boolean) => {\n setOpen(false);\n resolver.current?.(value);\n resolver.current = null;\n }, []);\n\n return (\n <ConfirmContext.Provider value={confirm}>\n {children}\n {/* Een beschrijving met opmaak (lijstje wijzigingen, waarschuwingen vóór publiceren): de\n Astryx-AlertDialog neemt alleen een string — tot 8.10 werd zo'n beschrijving daarom als\n een spatie getoond, en zag niemand de waarschuwingen. Dan een gewone dialoog met dezelfde\n twee knoppen. */}\n {opts && typeof opts.description !== \"string\" && opts.description != null && (\n <Dialog open={open} onOpenChange={(o) => !o && close(false)}>\n <DialogContent title={opts.title} width=\"min(92vw, 34rem)\">\n <div role=\"alert\" className=\"max-h-[60vh] overflow-y-auto text-sm text-slate-700\">{opts.description}</div>\n <DialogFooter>\n <Button variant=\"ghost\" onClick={() => close(false)}>{opts.cancelLabel ?? \"Annuleren\"}</Button>\n <Button variant={opts.tone === \"danger\" ? \"danger\" : \"primary\"} onClick={() => close(true)}>\n {opts.confirmLabel ?? \"Bevestigen\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )}\n {opts && (typeof opts.description === \"string\" || opts.description == null) && (\n <AlertDialog\n isOpen={open}\n onOpenChange={(o) => !o && close(false)}\n title={opts.title}\n description={typeof opts.description === \"string\" ? opts.description : \" \"}\n cancelLabel={opts.cancelLabel ?? \"Annuleren\"}\n actionLabel={opts.confirmLabel ?? \"Bevestigen\"}\n actionVariant={opts.tone === \"danger\" ? \"destructive\" : \"primary\"}\n onAction={() => close(true)}\n />\n )}\n </ConfirmContext.Provider>\n );\n}\n\n/** Geeft een `confirm(opts) => Promise<boolean>`. Buiten een `ConfirmHost` valt het terug op `false`. */\nexport function useConfirm(): ConfirmFn {\n const ctx = useContext(ConfirmContext);\n return ctx ?? (async () => false);\n}\n"],"mappings":";AAuDY,cACA,YADA;AArDZ,SAAS,eAAe,aAAa,YAAY,QAAQ,gBAAgC;AACzF,SAAS,mBAAmB;AAC5B,SAAS,QAAQ,eAAe,oBAAoB;AACpD,SAAS,cAAc;AAmBvB,MAAM,iBAAiB,cAAgC,IAAI;AAEpD,SAAS,YAAY,EAAE,SAAS,GAA4B;AACjE,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,CAAC,MAAM,OAAO,IAAI,SAAgC,IAAI;AAC5D,QAAM,WAAW,OAAsC,IAAI;AAE3D,QAAM,UAAU,YAAuB,CAAC,MAAM;AAC5C,YAAQ,CAAC;AACT,YAAQ,IAAI;AACZ,WAAO,IAAI,QAAiB,CAAC,YAAY;AACvC,eAAS,UAAU;AAAA,IACrB,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQ,YAAY,CAAC,UAAmB;AAC5C,YAAQ,KAAK;AACb,aAAS,UAAU,KAAK;AACxB,aAAS,UAAU;AAAA,EACrB,GAAG,CAAC,CAAC;AAEL,SACE,qBAAC,eAAe,UAAf,EAAwB,OAAO,SAC7B;AAAA;AAAA,IAKA,QAAQ,OAAO,KAAK,gBAAgB,YAAY,KAAK,eAAe,QACnE,oBAAC,UAAO,MAAY,cAAc,CAAC,MAAM,CAAC,KAAK,MAAM,KAAK,GACxD,+BAAC,iBAAc,OAAO,KAAK,OAAO,OAAM,oBACtC;AAAA,0BAAC,SAAI,MAAK,SAAQ,WAAU,uDAAuD,eAAK,aAAY;AAAA,MACpG,qBAAC,gBACC;AAAA,4BAAC,UAAO,SAAQ,SAAQ,SAAS,MAAM,MAAM,KAAK,GAAI,eAAK,eAAe,aAAY;AAAA,QACtF,oBAAC,UAAO,SAAS,KAAK,SAAS,WAAW,WAAW,WAAW,SAAS,MAAM,MAAM,IAAI,GACtF,eAAK,gBAAgB,cACxB;AAAA,SACF;AAAA,OACF,GACF;AAAA,IAED,SAAS,OAAO,KAAK,gBAAgB,YAAY,KAAK,eAAe,SACpE;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,cAAc,CAAC,MAAM,CAAC,KAAK,MAAM,KAAK;AAAA,QACtC,OAAO,KAAK;AAAA,QACZ,aAAa,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc;AAAA,QACvE,aAAa,KAAK,eAAe;AAAA,QACjC,aAAa,KAAK,gBAAgB;AAAA,QAClC,eAAe,KAAK,SAAS,WAAW,gBAAgB;AAAA,QACxD,UAAU,MAAM,MAAM,IAAI;AAAA;AAAA,IAC5B;AAAA,KAEJ;AAEJ;AAGO,SAAS,aAAwB;AACtC,QAAM,MAAM,WAAW,cAAc;AACrC,SAAO,QAAQ,YAAY;AAC7B;","names":[]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Eén lijn-icoonset voor beheer en editor (8.12).
|
|
3
|
+
*
|
|
4
|
+
* Er liepen drie idiomen door elkaar: SVG in de zijbalk, Unicode-tekens (⚙ ↶ ↷ ↗) in de balk en
|
|
5
|
+
* emoji (🔍 🌐 🔗) op knoppen. Emoji zien er per besturingssysteem anders uit, kleuren niet mee met
|
|
6
|
+
* de tekst en ogen op 14px als een vlek. Zelfde stijl als `PanelIcon` (1.6 lijn, currentColor),
|
|
7
|
+
* zonder icoonpakket: het zijn een paar paden.
|
|
8
|
+
*/
|
|
9
|
+
declare const PADEN: {
|
|
10
|
+
readonly zoek: "M11 18a7 7 0 100-14 7 7 0 000 14z M20 20l-4-4";
|
|
11
|
+
readonly extern: "M14 4h6v6 M20 4l-9 9 M18 14v5a1 1 0 01-1 1H5a1 1 0 01-1-1V7a1 1 0 011-1h5";
|
|
12
|
+
readonly ongedaan: "M9 14L4 9l5-5 M4 9h11a5 5 0 010 10h-3";
|
|
13
|
+
readonly opnieuw: "M15 14l5-5-5-5 M20 9H9a5 5 0 000 10h3";
|
|
14
|
+
readonly tandwiel: "M12 15a3 3 0 100-6 3 3 0 000 6z M19.4 15a1.6 1.6 0 00.3 1.8l.1.1a2 2 0 11-2.8 2.8l-.1-.1a1.6 1.6 0 00-2.7 1.1V21a2 2 0 11-4 0v-.1A1.6 1.6 0 007.5 19.4l-.1.1a2 2 0 11-2.8-2.8l.1-.1A1.6 1.6 0 003 14.6H3a2 2 0 110-4h.1A1.6 1.6 0 004.6 7.5l-.1-.1a2 2 0 112.8-2.8l.1.1a1.6 1.6 0 001.8.3H9.4a1.6 1.6 0 001-1.5V3a2 2 0 114 0v.1a1.6 1.6 0 001 1.5 1.6 1.6 0 001.8-.3l.1-.1a2 2 0 112.8 2.8l-.1.1a1.6 1.6 0 00-.3 1.8v.1a1.6 1.6 0 001.5 1H21a2 2 0 110 4h-.1a1.6 1.6 0 00-1.5 1z";
|
|
15
|
+
readonly potlood: "M4 20h4L19.5 8.5a2.1 2.1 0 00-3-3L5 17v3z M14.5 6.5l3 3";
|
|
16
|
+
readonly plus: "M12 5v14 M5 12h14";
|
|
17
|
+
readonly prullenbak: "M3 6h18 M8 6V4a1 1 0 011-1h6a1 1 0 011 1v2 M6 6l1 14a2 2 0 002 2h6a2 2 0 002-2l1-14";
|
|
18
|
+
readonly link: "M10 14a4 4 0 005.7 0l3-3a4 4 0 00-5.7-5.7l-1 1 M14 10a4 4 0 00-5.7 0l-3 3a4 4 0 005.7 5.7l1-1";
|
|
19
|
+
readonly foto: "M3 5h18v14H3z M3 15l5-5 4 4 3-3 6 6 M15.5 9.5a1 1 0 100-2 1 1 0 000 2z";
|
|
20
|
+
readonly wereld: "M12 21a9 9 0 100-18 9 9 0 000 18z M3 12h18 M12 3a14 14 0 010 18 M12 3a14 14 0 000 18";
|
|
21
|
+
readonly vink: "M20 6L9 17l-5-5";
|
|
22
|
+
readonly kruis: "M6 6l12 12 M18 6L6 18";
|
|
23
|
+
readonly info: "M12 21a9 9 0 100-18 9 9 0 000 18z M12 11v5 M12 8h.01";
|
|
24
|
+
readonly let: "M12 3l10 18H2z M12 10v4 M12 17h.01";
|
|
25
|
+
readonly leeg: "M4 7h16v12H4z M4 7l2-3h12l2 3 M9 12h6";
|
|
26
|
+
};
|
|
27
|
+
export type IconNaam = keyof typeof PADEN;
|
|
28
|
+
export declare function Icon({ naam, grootte, className, label }: {
|
|
29
|
+
naam: IconNaam;
|
|
30
|
+
grootte?: number;
|
|
31
|
+
className?: string;
|
|
32
|
+
label?: string;
|
|
33
|
+
}): import("react").JSX.Element;
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
const PADEN = {
|
|
4
|
+
zoek: "M11 18a7 7 0 100-14 7 7 0 000 14z M20 20l-4-4",
|
|
5
|
+
extern: "M14 4h6v6 M20 4l-9 9 M18 14v5a1 1 0 01-1 1H5a1 1 0 01-1-1V7a1 1 0 011-1h5",
|
|
6
|
+
ongedaan: "M9 14L4 9l5-5 M4 9h11a5 5 0 010 10h-3",
|
|
7
|
+
opnieuw: "M15 14l5-5-5-5 M20 9H9a5 5 0 000 10h3",
|
|
8
|
+
tandwiel: "M12 15a3 3 0 100-6 3 3 0 000 6z M19.4 15a1.6 1.6 0 00.3 1.8l.1.1a2 2 0 11-2.8 2.8l-.1-.1a1.6 1.6 0 00-2.7 1.1V21a2 2 0 11-4 0v-.1A1.6 1.6 0 007.5 19.4l-.1.1a2 2 0 11-2.8-2.8l.1-.1A1.6 1.6 0 003 14.6H3a2 2 0 110-4h.1A1.6 1.6 0 004.6 7.5l-.1-.1a2 2 0 112.8-2.8l.1.1a1.6 1.6 0 001.8.3H9.4a1.6 1.6 0 001-1.5V3a2 2 0 114 0v.1a1.6 1.6 0 001 1.5 1.6 1.6 0 001.8-.3l.1-.1a2 2 0 112.8 2.8l-.1.1a1.6 1.6 0 00-.3 1.8v.1a1.6 1.6 0 001.5 1H21a2 2 0 110 4h-.1a1.6 1.6 0 00-1.5 1z",
|
|
9
|
+
potlood: "M4 20h4L19.5 8.5a2.1 2.1 0 00-3-3L5 17v3z M14.5 6.5l3 3",
|
|
10
|
+
plus: "M12 5v14 M5 12h14",
|
|
11
|
+
prullenbak: "M3 6h18 M8 6V4a1 1 0 011-1h6a1 1 0 011 1v2 M6 6l1 14a2 2 0 002 2h6a2 2 0 002-2l1-14",
|
|
12
|
+
link: "M10 14a4 4 0 005.7 0l3-3a4 4 0 00-5.7-5.7l-1 1 M14 10a4 4 0 00-5.7 0l-3 3a4 4 0 005.7 5.7l1-1",
|
|
13
|
+
foto: "M3 5h18v14H3z M3 15l5-5 4 4 3-3 6 6 M15.5 9.5a1 1 0 100-2 1 1 0 000 2z",
|
|
14
|
+
wereld: "M12 21a9 9 0 100-18 9 9 0 000 18z M3 12h18 M12 3a14 14 0 010 18 M12 3a14 14 0 000 18",
|
|
15
|
+
vink: "M20 6L9 17l-5-5",
|
|
16
|
+
kruis: "M6 6l12 12 M18 6L6 18",
|
|
17
|
+
info: "M12 21a9 9 0 100-18 9 9 0 000 18z M12 11v5 M12 8h.01",
|
|
18
|
+
let: "M12 3l10 18H2z M12 10v4 M12 17h.01",
|
|
19
|
+
leeg: "M4 7h16v12H4z M4 7l2-3h12l2 3 M9 12h6"
|
|
20
|
+
};
|
|
21
|
+
function Icon({ naam, grootte = 16, className, label }) {
|
|
22
|
+
return /* @__PURE__ */ jsx(
|
|
23
|
+
"svg",
|
|
24
|
+
{
|
|
25
|
+
"aria-hidden": label ? void 0 : true,
|
|
26
|
+
"aria-label": label,
|
|
27
|
+
role: label ? "img" : void 0,
|
|
28
|
+
viewBox: "0 0 24 24",
|
|
29
|
+
width: grootte,
|
|
30
|
+
height: grootte,
|
|
31
|
+
fill: "none",
|
|
32
|
+
stroke: "currentColor",
|
|
33
|
+
strokeWidth: "1.6",
|
|
34
|
+
strokeLinecap: "round",
|
|
35
|
+
strokeLinejoin: "round",
|
|
36
|
+
className: ["shrink-0", className].filter(Boolean).join(" "),
|
|
37
|
+
children: /* @__PURE__ */ jsx("path", { d: PADEN[naam] })
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
export {
|
|
42
|
+
Icon
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=Icon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/ui/Icon.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * Eén lijn-icoonset voor beheer en editor (8.12).\n *\n * Er liepen drie idiomen door elkaar: SVG in de zijbalk, Unicode-tekens (⚙ ↶ ↷ ↗) in de balk en\n * emoji (🔍 🌐 🔗) op knoppen. Emoji zien er per besturingssysteem anders uit, kleuren niet mee met\n * de tekst en ogen op 14px als een vlek. Zelfde stijl als `PanelIcon` (1.6 lijn, currentColor),\n * zonder icoonpakket: het zijn een paar paden.\n */\nconst PADEN = {\n zoek: \"M11 18a7 7 0 100-14 7 7 0 000 14z M20 20l-4-4\",\n extern: \"M14 4h6v6 M20 4l-9 9 M18 14v5a1 1 0 01-1 1H5a1 1 0 01-1-1V7a1 1 0 011-1h5\",\n ongedaan: \"M9 14L4 9l5-5 M4 9h11a5 5 0 010 10h-3\",\n opnieuw: \"M15 14l5-5-5-5 M20 9H9a5 5 0 000 10h3\",\n tandwiel: \"M12 15a3 3 0 100-6 3 3 0 000 6z M19.4 15a1.6 1.6 0 00.3 1.8l.1.1a2 2 0 11-2.8 2.8l-.1-.1a1.6 1.6 0 00-2.7 1.1V21a2 2 0 11-4 0v-.1A1.6 1.6 0 007.5 19.4l-.1.1a2 2 0 11-2.8-2.8l.1-.1A1.6 1.6 0 003 14.6H3a2 2 0 110-4h.1A1.6 1.6 0 004.6 7.5l-.1-.1a2 2 0 112.8-2.8l.1.1a1.6 1.6 0 001.8.3H9.4a1.6 1.6 0 001-1.5V3a2 2 0 114 0v.1a1.6 1.6 0 001 1.5 1.6 1.6 0 001.8-.3l.1-.1a2 2 0 112.8 2.8l-.1.1a1.6 1.6 0 00-.3 1.8v.1a1.6 1.6 0 001.5 1H21a2 2 0 110 4h-.1a1.6 1.6 0 00-1.5 1z\",\n potlood: \"M4 20h4L19.5 8.5a2.1 2.1 0 00-3-3L5 17v3z M14.5 6.5l3 3\",\n plus: \"M12 5v14 M5 12h14\",\n prullenbak: \"M3 6h18 M8 6V4a1 1 0 011-1h6a1 1 0 011 1v2 M6 6l1 14a2 2 0 002 2h6a2 2 0 002-2l1-14\",\n link: \"M10 14a4 4 0 005.7 0l3-3a4 4 0 00-5.7-5.7l-1 1 M14 10a4 4 0 00-5.7 0l-3 3a4 4 0 005.7 5.7l1-1\",\n foto: \"M3 5h18v14H3z M3 15l5-5 4 4 3-3 6 6 M15.5 9.5a1 1 0 100-2 1 1 0 000 2z\",\n wereld: \"M12 21a9 9 0 100-18 9 9 0 000 18z M3 12h18 M12 3a14 14 0 010 18 M12 3a14 14 0 000 18\",\n vink: \"M20 6L9 17l-5-5\",\n kruis: \"M6 6l12 12 M18 6L6 18\",\n info: \"M12 21a9 9 0 100-18 9 9 0 000 18z M12 11v5 M12 8h.01\",\n let: \"M12 3l10 18H2z M12 10v4 M12 17h.01\",\n leeg: \"M4 7h16v12H4z M4 7l2-3h12l2 3 M9 12h6\",\n} as const;\n\nexport type IconNaam = keyof typeof PADEN;\n\nexport function Icon({ naam, grootte = 16, className, label }: { naam: IconNaam; grootte?: number; className?: string; label?: string }) {\n return (\n <svg\n aria-hidden={label ? undefined : true}\n aria-label={label}\n role={label ? \"img\" : undefined}\n viewBox=\"0 0 24 24\"\n width={grootte}\n height={grootte}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={[\"shrink-0\", className].filter(Boolean).join(\" \")}\n >\n <path d={PADEN[naam]} />\n </svg>\n );\n}\n"],"mappings":";AA+CM;AArCN,MAAM,QAAQ;AAAA,EACZ,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS;AAAA,EACT,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AACR;AAIO,SAAS,KAAK,EAAE,MAAM,UAAU,IAAI,WAAW,MAAM,GAA6E;AACvI,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAa,QAAQ,SAAY;AAAA,MACjC,cAAY;AAAA,MACZ,MAAM,QAAQ,QAAQ;AAAA,MACtB,SAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,WAAW,CAAC,YAAY,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAE3D,8BAAC,UAAK,GAAG,MAAM,IAAI,GAAG;AAAA;AAAA,EACxB;AAEJ;","names":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type PickedMedia } from "../media/MediaPicker.js";
|
|
2
|
+
/**
|
|
3
|
+
* Fotoveld (8.2): wat de klant ziet is de FOTO, niet een URL. Eerst was elk beeldveld een
|
|
4
|
+
* tekstvak met "URL of kies →" en een knop ernaast — de meest gebruikte handeling ("foto
|
|
5
|
+
* wijzigen") begon met een onleesbaar adres. Nu: een miniatuur, "Wijzigen" via de mediabibliotheek
|
|
6
|
+
* en "Weghalen". Een adres plakken kan nog onder "Ander adres" (voor een externe afbeelding).
|
|
7
|
+
*/
|
|
8
|
+
export declare function ImageField({ siteId, value, onChange, wat, verwijderbaar, }: {
|
|
9
|
+
siteId: string;
|
|
10
|
+
value: string | undefined;
|
|
11
|
+
onChange: (url: string | undefined, media?: PickedMedia) => void;
|
|
12
|
+
/** Hoe het beeld heet in knoppen ("foto", "logo", "achtergrond"). */
|
|
13
|
+
wat?: string;
|
|
14
|
+
verwijderbaar?: boolean;
|
|
15
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useId } from "react";
|
|
4
|
+
import { MediaPickerButton } from "../media/MediaPicker.js";
|
|
5
|
+
import { Button, Input } from "./primitives.js";
|
|
6
|
+
function ImageField({
|
|
7
|
+
siteId,
|
|
8
|
+
value,
|
|
9
|
+
onChange,
|
|
10
|
+
wat = "foto",
|
|
11
|
+
verwijderbaar = true
|
|
12
|
+
}) {
|
|
13
|
+
const id = useId();
|
|
14
|
+
const url = value?.trim() || void 0;
|
|
15
|
+
return /* @__PURE__ */ jsxs("div", { className: "grid gap-2", children: [
|
|
16
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
17
|
+
url ? (
|
|
18
|
+
// eslint-disable-next-line @next/next/no-img-element
|
|
19
|
+
/* @__PURE__ */ jsx(
|
|
20
|
+
"img",
|
|
21
|
+
{
|
|
22
|
+
src: url,
|
|
23
|
+
alt: "",
|
|
24
|
+
className: "h-16 w-16 shrink-0 rounded-lg border border-slate-200 object-cover",
|
|
25
|
+
style: { background: "var(--color-background-muted)" }
|
|
26
|
+
}
|
|
27
|
+
)
|
|
28
|
+
) : /* @__PURE__ */ jsx(
|
|
29
|
+
"div",
|
|
30
|
+
{
|
|
31
|
+
"aria-hidden": true,
|
|
32
|
+
className: "grid h-16 w-16 shrink-0 place-items-center rounded-lg border border-dashed border-slate-300 text-xl text-slate-400",
|
|
33
|
+
children: "\u{1F5BC}"
|
|
34
|
+
}
|
|
35
|
+
),
|
|
36
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-2", children: [
|
|
37
|
+
/* @__PURE__ */ jsx(
|
|
38
|
+
MediaPickerButton,
|
|
39
|
+
{
|
|
40
|
+
siteId,
|
|
41
|
+
label: url ? "Wijzigen" : `Kies een ${wat}`,
|
|
42
|
+
variant: url ? "secondary" : "primary",
|
|
43
|
+
onSelect: (m) => onChange(m.url, m)
|
|
44
|
+
}
|
|
45
|
+
),
|
|
46
|
+
url && verwijderbaar && /* @__PURE__ */ jsx(Button, { type: "button", size: "sm", variant: "ghost", onClick: () => onChange(void 0), children: "Weghalen" })
|
|
47
|
+
] })
|
|
48
|
+
] }),
|
|
49
|
+
/* @__PURE__ */ jsxs("details", { className: "text-xs text-slate-500", children: [
|
|
50
|
+
/* @__PURE__ */ jsx("summary", { className: "cursor-pointer select-none", children: "Ander adres (externe afbeelding)" }),
|
|
51
|
+
/* @__PURE__ */ jsx("div", { className: "mt-2", children: /* @__PURE__ */ jsx(
|
|
52
|
+
Input,
|
|
53
|
+
{
|
|
54
|
+
id,
|
|
55
|
+
"aria-label": `Adres van de ${wat}`,
|
|
56
|
+
value: value ?? "",
|
|
57
|
+
onChange: (e) => onChange(e.target.value || void 0),
|
|
58
|
+
placeholder: "https://\u2026"
|
|
59
|
+
}
|
|
60
|
+
) })
|
|
61
|
+
] })
|
|
62
|
+
] });
|
|
63
|
+
}
|
|
64
|
+
export {
|
|
65
|
+
ImageField
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=ImageField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/ui/ImageField.tsx"],"sourcesContent":["\"use client\";\n\nimport { useId } from \"react\";\nimport { MediaPickerButton, type PickedMedia } from \"../media/MediaPicker\";\nimport { Button, Input } from \"./primitives\";\n\n/**\n * Fotoveld (8.2): wat de klant ziet is de FOTO, niet een URL. Eerst was elk beeldveld een\n * tekstvak met \"URL of kies →\" en een knop ernaast — de meest gebruikte handeling (\"foto\n * wijzigen\") begon met een onleesbaar adres. Nu: een miniatuur, \"Wijzigen\" via de mediabibliotheek\n * en \"Weghalen\". Een adres plakken kan nog onder \"Ander adres\" (voor een externe afbeelding).\n */\nexport function ImageField({\n siteId,\n value,\n onChange,\n wat = \"foto\",\n verwijderbaar = true,\n}: {\n siteId: string;\n value: string | undefined;\n onChange: (url: string | undefined, media?: PickedMedia) => void;\n /** Hoe het beeld heet in knoppen (\"foto\", \"logo\", \"achtergrond\"). */\n wat?: string;\n verwijderbaar?: boolean;\n}) {\n const id = useId();\n const url = value?.trim() || undefined;\n return (\n <div className=\"grid gap-2\">\n <div className=\"flex items-center gap-3\">\n {url ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img\n src={url}\n alt=\"\"\n className=\"h-16 w-16 shrink-0 rounded-lg border border-slate-200 object-cover\"\n style={{ background: \"var(--color-background-muted)\" }}\n />\n ) : (\n <div\n aria-hidden\n className=\"grid h-16 w-16 shrink-0 place-items-center rounded-lg border border-dashed border-slate-300 text-xl text-slate-400\"\n >\n 🖼\n </div>\n )}\n <div className=\"flex flex-wrap gap-2\">\n <MediaPickerButton\n siteId={siteId}\n label={url ? \"Wijzigen\" : `Kies een ${wat}`}\n variant={url ? \"secondary\" : \"primary\"}\n onSelect={(m) => onChange(m.url, m)}\n />\n {url && verwijderbaar && (\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={() => onChange(undefined)}>\n Weghalen\n </Button>\n )}\n </div>\n </div>\n <details className=\"text-xs text-slate-500\">\n <summary className=\"cursor-pointer select-none\">Ander adres (externe afbeelding)</summary>\n <div className=\"mt-2\">\n <Input\n id={id}\n aria-label={`Adres van de ${wat}`}\n value={value ?? \"\"}\n onChange={(e) => onChange(e.target.value || undefined)}\n placeholder=\"https://…\"\n />\n </div>\n </details>\n </div>\n );\n}\n"],"mappings":";AAiCU,cAcF,YAdE;AA/BV,SAAS,aAAa;AACtB,SAAS,yBAA2C;AACpD,SAAS,QAAQ,aAAa;AAQvB,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAM;AAAA,EACN,gBAAgB;AAClB,GAOG;AACD,QAAM,KAAK,MAAM;AACjB,QAAM,MAAM,OAAO,KAAK,KAAK;AAC7B,SACE,qBAAC,SAAI,WAAU,cACb;AAAA,yBAAC,SAAI,WAAU,2BACZ;AAAA;AAAA;AAAA,QAEC;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,KAAI;AAAA,YACJ,WAAU;AAAA,YACV,OAAO,EAAE,YAAY,gCAAgC;AAAA;AAAA,QACvD;AAAA,UAEA;AAAA,QAAC;AAAA;AAAA,UACC,eAAW;AAAA,UACX,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,MAEF,qBAAC,SAAI,WAAU,wBACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,OAAO,MAAM,aAAa,YAAY,GAAG;AAAA,YACzC,SAAS,MAAM,cAAc;AAAA,YAC7B,UAAU,CAAC,MAAM,SAAS,EAAE,KAAK,CAAC;AAAA;AAAA,QACpC;AAAA,QACC,OAAO,iBACN,oBAAC,UAAO,MAAK,UAAS,MAAK,MAAK,SAAQ,SAAQ,SAAS,MAAM,SAAS,MAAS,GAAG,sBAEpF;AAAA,SAEJ;AAAA,OACF;AAAA,IACA,qBAAC,aAAQ,WAAU,0BACjB;AAAA,0BAAC,aAAQ,WAAU,8BAA6B,8CAAgC;AAAA,MAChF,oBAAC,SAAI,WAAU,QACb;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,cAAY,gBAAgB,GAAG;AAAA,UAC/B,OAAO,SAAS;AAAA,UAChB,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,SAAS,MAAS;AAAA,UACrD,aAAY;AAAA;AAAA,MACd,GACF;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kleurveld (7.24, gedeeld sinds 8.2): een echte kleurkiezer naast het hex-veld. De hex blijft
|
|
3
|
+
* (plakken uit een huisstijlgids), de kiezer erbij voorkomt "#ff00" en oranje-dat-geel-moest-zijn.
|
|
4
|
+
* Met `stalen` toont hij eerst de huisstijlkleuren van de site als één-klik-keuze — wie een
|
|
5
|
+
* blokachtergrond kiest, wil meestal een kleur die al in de site zit.
|
|
6
|
+
*/
|
|
7
|
+
export declare function KleurVeld({ label, hint, value, placeholder, onChange, stalen, wisbaar, }: {
|
|
8
|
+
label: string;
|
|
9
|
+
hint?: string;
|
|
10
|
+
value: string;
|
|
11
|
+
placeholder?: string;
|
|
12
|
+
onChange: (v: string) => void;
|
|
13
|
+
stalen?: {
|
|
14
|
+
label: string;
|
|
15
|
+
kleur: string;
|
|
16
|
+
}[];
|
|
17
|
+
/** Toon een "Geen"-knop die de kleur leegmaakt. */
|
|
18
|
+
wisbaar?: boolean;
|
|
19
|
+
}): import("react").JSX.Element;
|
|
20
|
+
/** Contrastregel onder de merkkleur: knoptekst op de merkkleur, en merkkleur op de achtergrond. */
|
|
21
|
+
export declare function ContrastRegel({ primary, background, foreground }: {
|
|
22
|
+
primary: string;
|
|
23
|
+
background?: string;
|
|
24
|
+
foreground?: string;
|
|
25
|
+
}): import("react").JSX.Element | null;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { contrast, contrastOordeel, naarHex6, tekstOp } from "../lib/kleur.js";
|
|
4
|
+
import { Field, Input } from "./primitives.js";
|
|
5
|
+
function KleurVeld({
|
|
6
|
+
label,
|
|
7
|
+
hint,
|
|
8
|
+
value,
|
|
9
|
+
placeholder,
|
|
10
|
+
onChange,
|
|
11
|
+
stalen,
|
|
12
|
+
wisbaar
|
|
13
|
+
}) {
|
|
14
|
+
const bruikbaar = (stalen ?? []).filter((x) => /^#[0-9a-f]{3,8}$/i.test(x.kleur.trim()));
|
|
15
|
+
return /* @__PURE__ */ jsx(Field, { label, hint, children: /* @__PURE__ */ jsxs("div", { className: "grid gap-2", children: [
|
|
16
|
+
bruikbaar.length > 0 && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-1.5", role: "group", "aria-label": `${label}: huisstijlkleuren`, children: [
|
|
17
|
+
bruikbaar.map((x) => /* @__PURE__ */ jsx(
|
|
18
|
+
"button",
|
|
19
|
+
{
|
|
20
|
+
type: "button",
|
|
21
|
+
title: x.label,
|
|
22
|
+
"aria-label": `${x.label} (${x.kleur})`,
|
|
23
|
+
"aria-pressed": value.toLowerCase() === x.kleur.toLowerCase(),
|
|
24
|
+
onClick: () => onChange(x.kleur),
|
|
25
|
+
className: "xicms-admin-btn h-7 w-7 rounded-full border border-slate-300 aria-[pressed=true]:ring-2 aria-[pressed=true]:ring-slate-900",
|
|
26
|
+
style: { background: x.kleur }
|
|
27
|
+
},
|
|
28
|
+
x.label
|
|
29
|
+
)),
|
|
30
|
+
wisbaar && /* @__PURE__ */ jsx("button", { type: "button", onClick: () => onChange(""), className: "xicms-admin-btn ml-1 rounded px-2 py-1 text-xs text-slate-600 hover:bg-slate-100", children: "Geen" })
|
|
31
|
+
] }),
|
|
32
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
33
|
+
/* @__PURE__ */ jsx(
|
|
34
|
+
"input",
|
|
35
|
+
{
|
|
36
|
+
type: "color",
|
|
37
|
+
"aria-label": `${label} kiezen`,
|
|
38
|
+
value: naarHex6(value || placeholder, "#ffffff"),
|
|
39
|
+
onChange: (e) => onChange(e.target.value),
|
|
40
|
+
className: "h-9 w-11 shrink-0 cursor-pointer rounded-md border border-slate-200 bg-transparent p-0.5"
|
|
41
|
+
}
|
|
42
|
+
),
|
|
43
|
+
/* @__PURE__ */ jsx(Input, { value, placeholder, onChange: (e) => onChange(e.target.value), "aria-label": `${label} (kleurcode)` })
|
|
44
|
+
] })
|
|
45
|
+
] }) });
|
|
46
|
+
}
|
|
47
|
+
function ContrastRegel({ primary, background, foreground }) {
|
|
48
|
+
const knop = contrastOordeel(contrast(primary, tekstOp(primary)));
|
|
49
|
+
const opAchtergrond = contrastOordeel(contrast(primary, background || "#ffffff"));
|
|
50
|
+
const tekst = foreground ? contrastOordeel(contrast(foreground, background || "#ffffff")) : null;
|
|
51
|
+
if (!knop && !opAchtergrond && !tekst) return null;
|
|
52
|
+
const kleur = (t) => t === "goed" ? "text-emerald-700" : t === "matig" ? "text-amber-700" : "text-red-700";
|
|
53
|
+
return /* @__PURE__ */ jsxs("div", { className: "grid gap-1 text-xs", children: [
|
|
54
|
+
knop && /* @__PURE__ */ jsxs("p", { className: kleur(knop.toon), children: [
|
|
55
|
+
"Knoptekst op merkkleur: ",
|
|
56
|
+
knop.tekst.replace(/^Contrast /, "")
|
|
57
|
+
] }),
|
|
58
|
+
opAchtergrond && /* @__PURE__ */ jsxs("p", { className: kleur(opAchtergrond.toon), children: [
|
|
59
|
+
"Merkkleur als tekst op de achtergrond: ",
|
|
60
|
+
opAchtergrond.tekst.replace(/^Contrast /, "")
|
|
61
|
+
] }),
|
|
62
|
+
tekst && /* @__PURE__ */ jsxs("p", { className: kleur(tekst.toon === "matig" ? "slecht" : tekst.toon), children: [
|
|
63
|
+
"Tekst op de achtergrond: ",
|
|
64
|
+
tekst.tekst.replace(/^Contrast /, "").replace(/voldoende voor knoppen en koppen, krap voor kleine tekst/, "te weinig voor lopende tekst (minimaal 4,5)")
|
|
65
|
+
] }),
|
|
66
|
+
/* @__PURE__ */ jsxs("p", { className: "text-slate-500", children: [
|
|
67
|
+
"Voorbeeld: ",
|
|
68
|
+
/* @__PURE__ */ jsx("span", { className: "rounded-md px-2 py-0.5 font-medium", style: { background: primary, color: tekstOp(primary) }, children: "Knop" })
|
|
69
|
+
] })
|
|
70
|
+
] });
|
|
71
|
+
}
|
|
72
|
+
export {
|
|
73
|
+
ContrastRegel,
|
|
74
|
+
KleurVeld
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=KleurVeld.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/ui/KleurVeld.tsx"],"sourcesContent":["\"use client\";\n\nimport { contrast, contrastOordeel, naarHex6, tekstOp } from \"../lib/kleur\";\nimport { Field, Input } from \"./primitives\";\n\n/**\n * Kleurveld (7.24, gedeeld sinds 8.2): een echte kleurkiezer naast het hex-veld. De hex blijft\n * (plakken uit een huisstijlgids), de kiezer erbij voorkomt \"#ff00\" en oranje-dat-geel-moest-zijn.\n * Met `stalen` toont hij eerst de huisstijlkleuren van de site als één-klik-keuze — wie een\n * blokachtergrond kiest, wil meestal een kleur die al in de site zit.\n */\nexport function KleurVeld({\n label,\n hint,\n value,\n placeholder,\n onChange,\n stalen,\n wisbaar,\n}: {\n label: string;\n hint?: string;\n value: string;\n placeholder?: string;\n onChange: (v: string) => void;\n stalen?: { label: string; kleur: string }[];\n /** Toon een \"Geen\"-knop die de kleur leegmaakt. */\n wisbaar?: boolean;\n}) {\n const bruikbaar = (stalen ?? []).filter((x) => /^#[0-9a-f]{3,8}$/i.test(x.kleur.trim()));\n return (\n <Field label={label} hint={hint}>\n <div className=\"grid gap-2\">\n {bruikbaar.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-1.5\" role=\"group\" aria-label={`${label}: huisstijlkleuren`}>\n {bruikbaar.map((x) => (\n <button\n key={x.label}\n type=\"button\"\n title={x.label}\n aria-label={`${x.label} (${x.kleur})`}\n aria-pressed={value.toLowerCase() === x.kleur.toLowerCase()}\n onClick={() => onChange(x.kleur)}\n className=\"xicms-admin-btn h-7 w-7 rounded-full border border-slate-300 aria-[pressed=true]:ring-2 aria-[pressed=true]:ring-slate-900\"\n style={{ background: x.kleur }}\n />\n ))}\n {wisbaar && (\n <button type=\"button\" onClick={() => onChange(\"\")} className=\"xicms-admin-btn ml-1 rounded px-2 py-1 text-xs text-slate-600 hover:bg-slate-100\">\n Geen\n </button>\n )}\n </div>\n )}\n <div className=\"flex items-center gap-2\">\n <input\n type=\"color\"\n aria-label={`${label} kiezen`}\n value={naarHex6(value || placeholder, \"#ffffff\")}\n onChange={(e) => onChange(e.target.value)}\n className=\"h-9 w-11 shrink-0 cursor-pointer rounded-md border border-slate-200 bg-transparent p-0.5\"\n />\n <Input value={value} placeholder={placeholder} onChange={(e) => onChange(e.target.value)} aria-label={`${label} (kleurcode)`} />\n </div>\n </div>\n </Field>\n );\n}\n\n/** Contrastregel onder de merkkleur: knoptekst op de merkkleur, en merkkleur op de achtergrond. */\nexport function ContrastRegel({ primary, background, foreground }: { primary: string; background?: string; foreground?: string }) {\n const knop = contrastOordeel(contrast(primary, tekstOp(primary)));\n const opAchtergrond = contrastOordeel(contrast(primary, background || \"#ffffff\"));\n // 8.10: ook de gewone tekst op de achtergrond — lichtgrijze tekst op wit ging ongemerkt live.\n const tekst = foreground ? contrastOordeel(contrast(foreground, background || \"#ffffff\")) : null;\n if (!knop && !opAchtergrond && !tekst) return null;\n const kleur = (t: \"goed\" | \"matig\" | \"slecht\") => (t === \"goed\" ? \"text-emerald-700\" : t === \"matig\" ? \"text-amber-700\" : \"text-red-700\");\n return (\n <div className=\"grid gap-1 text-xs\">\n {knop && <p className={kleur(knop.toon)}>Knoptekst op merkkleur: {knop.tekst.replace(/^Contrast /, \"\")}</p>}\n {opAchtergrond && <p className={kleur(opAchtergrond.toon)}>Merkkleur als tekst op de achtergrond: {opAchtergrond.tekst.replace(/^Contrast /, \"\")}</p>}\n {tekst && <p className={kleur(tekst.toon === \"matig\" ? \"slecht\" : tekst.toon)}>Tekst op de achtergrond: {tekst.tekst.replace(/^Contrast /, \"\").replace(/voldoende voor knoppen en koppen, krap voor kleine tekst/, \"te weinig voor lopende tekst (minimaal 4,5)\")}</p>}\n <p className=\"text-slate-500\">Voorbeeld: <span className=\"rounded-md px-2 py-0.5 font-medium\" style={{ background: primary, color: tekstOp(primary) }}>Knop</span></p>\n </div>\n );\n}\n\n"],"mappings":";AAkCU,SAEI,KAFJ;AAhCV,SAAS,UAAU,iBAAiB,UAAU,eAAe;AAC7D,SAAS,OAAO,aAAa;AAQtB,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GASG;AACD,QAAM,aAAa,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,oBAAoB,KAAK,EAAE,MAAM,KAAK,CAAC,CAAC;AACvF,SACE,oBAAC,SAAM,OAAc,MACnB,+BAAC,SAAI,WAAU,cACZ;AAAA,cAAU,SAAS,KAClB,qBAAC,SAAI,WAAU,uCAAsC,MAAK,SAAQ,cAAY,GAAG,KAAK,sBACnF;AAAA,gBAAU,IAAI,CAAC,MACd;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,OAAO,EAAE;AAAA,UACT,cAAY,GAAG,EAAE,KAAK,KAAK,EAAE,KAAK;AAAA,UAClC,gBAAc,MAAM,YAAY,MAAM,EAAE,MAAM,YAAY;AAAA,UAC1D,SAAS,MAAM,SAAS,EAAE,KAAK;AAAA,UAC/B,WAAU;AAAA,UACV,OAAO,EAAE,YAAY,EAAE,MAAM;AAAA;AAAA,QAPxB,EAAE;AAAA,MAQT,CACD;AAAA,MACA,WACC,oBAAC,YAAO,MAAK,UAAS,SAAS,MAAM,SAAS,EAAE,GAAG,WAAU,oFAAmF,kBAEhJ;AAAA,OAEJ;AAAA,IAEF,qBAAC,SAAI,WAAU,2BACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,cAAY,GAAG,KAAK;AAAA,UACpB,OAAO,SAAS,SAAS,aAAa,SAAS;AAAA,UAC/C,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,UACxC,WAAU;AAAA;AAAA,MACZ;AAAA,MACA,oBAAC,SAAM,OAAc,aAA0B,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK,GAAG,cAAY,GAAG,KAAK,gBAAgB;AAAA,OAChI;AAAA,KACF,GACF;AAEJ;AAGO,SAAS,cAAc,EAAE,SAAS,YAAY,WAAW,GAAkE;AAChI,QAAM,OAAO,gBAAgB,SAAS,SAAS,QAAQ,OAAO,CAAC,CAAC;AAChE,QAAM,gBAAgB,gBAAgB,SAAS,SAAS,cAAc,SAAS,CAAC;AAEhF,QAAM,QAAQ,aAAa,gBAAgB,SAAS,YAAY,cAAc,SAAS,CAAC,IAAI;AAC5F,MAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAO,QAAO;AAC9C,QAAM,QAAQ,CAAC,MAAoC,MAAM,SAAS,qBAAqB,MAAM,UAAU,mBAAmB;AAC1H,SACE,qBAAC,SAAI,WAAU,sBACZ;AAAA,YAAQ,qBAAC,OAAE,WAAW,MAAM,KAAK,IAAI,GAAG;AAAA;AAAA,MAAyB,KAAK,MAAM,QAAQ,cAAc,EAAE;AAAA,OAAE;AAAA,IACtG,iBAAiB,qBAAC,OAAE,WAAW,MAAM,cAAc,IAAI,GAAG;AAAA;AAAA,MAAwC,cAAc,MAAM,QAAQ,cAAc,EAAE;AAAA,OAAE;AAAA,IAChJ,SAAS,qBAAC,OAAE,WAAW,MAAM,MAAM,SAAS,UAAU,WAAW,MAAM,IAAI,GAAG;AAAA;AAAA,MAA0B,MAAM,MAAM,QAAQ,cAAc,EAAE,EAAE,QAAQ,4DAA4D,6CAA6C;AAAA,OAAE;AAAA,IAClQ,qBAAC,OAAE,WAAU,kBAAiB;AAAA;AAAA,MAAW,oBAAC,UAAK,WAAU,sCAAqC,OAAO,EAAE,YAAY,SAAS,OAAO,QAAQ,OAAO,EAAE,GAAG,kBAAI;AAAA,OAAO;AAAA,KACpK;AAEJ;","names":[]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Drie toestanden voor elke live lijst in /beheer (8.1): laden, fout, data. Eerst kenden de meeste
|
|
4
|
+
* lijsten alleen "data": tijdens het laden én na een fout (rechten, App Check, geen verbinding)
|
|
5
|
+
* stond er "Nog geen pagina's — maak je eerste", wat een klant letterlijk nam.
|
|
6
|
+
*/
|
|
7
|
+
export declare function LaadStaat({ laden, fout, opnieuw, wat, children, }: {
|
|
8
|
+
laden: boolean;
|
|
9
|
+
fout: string | null;
|
|
10
|
+
opnieuw?: () => void;
|
|
11
|
+
/** Wat er geladen wordt, in een zin als "De pagina's konden niet worden geladen." */
|
|
12
|
+
wat?: string;
|
|
13
|
+
children: ReactNode;
|
|
14
|
+
}): import("react").JSX.Element;
|
|
15
|
+
export declare function FoutMelding({ wat, detail, opnieuw }: {
|
|
16
|
+
wat: string;
|
|
17
|
+
detail?: string;
|
|
18
|
+
opnieuw?: () => void;
|
|
19
|
+
}): import("react").JSX.Element;
|
|
20
|
+
/** Foutmelding uit een Firestore-/callable-fout, voor in `LaadStaat`. */
|
|
21
|
+
export declare function foutTekst(e: unknown): string;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Button, Card } from "./primitives.js";
|
|
4
|
+
import { isDemoActive } from "../../demo/demoStore.js";
|
|
5
|
+
function LaadStaat({
|
|
6
|
+
laden,
|
|
7
|
+
fout,
|
|
8
|
+
opnieuw,
|
|
9
|
+
wat = "gegevens",
|
|
10
|
+
children
|
|
11
|
+
}) {
|
|
12
|
+
if (fout) return /* @__PURE__ */ jsx(FoutMelding, { wat, detail: fout, opnieuw });
|
|
13
|
+
if (laden) {
|
|
14
|
+
return /* @__PURE__ */ jsx("p", { className: "py-2 text-sm text-slate-500", role: "status", "aria-live": "polite", children: `${hoofdletter(wat)} laden\u2026` });
|
|
15
|
+
}
|
|
16
|
+
return /* @__PURE__ */ jsx(Fragment, { children });
|
|
17
|
+
}
|
|
18
|
+
function FoutMelding({ wat, detail, opnieuw }) {
|
|
19
|
+
if (isDemoActive()) {
|
|
20
|
+
return /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs("p", { className: "text-sm text-slate-600", role: "status", children: [
|
|
21
|
+
"In deze demo is dit onderdeel leeg. Bij je eigen site zie je hier ",
|
|
22
|
+
wat,
|
|
23
|
+
"."
|
|
24
|
+
] }) });
|
|
25
|
+
}
|
|
26
|
+
return /* @__PURE__ */ jsx(Card, { className: "border-red-200", children: /* @__PURE__ */ jsxs("div", { role: "alert", className: "grid gap-2", children: [
|
|
27
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-red-800", children: `${hoofdletter(wat)} konden niet worden geladen.` }),
|
|
28
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-slate-600", children: /permission|insufficient/i.test(detail ?? "") ? "Je account heeft hier (nog) geen toegang toe. Log opnieuw in; helpt dat niet, neem dan contact op met Xi Webdesign." : "Controleer je internetverbinding en probeer het opnieuw." }),
|
|
29
|
+
opnieuw && /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Button, { size: "sm", variant: "secondary", onClick: opnieuw, children: "Opnieuw proberen" }) })
|
|
30
|
+
] }) });
|
|
31
|
+
}
|
|
32
|
+
function foutTekst(e) {
|
|
33
|
+
return e instanceof Error ? e.message : String(e);
|
|
34
|
+
}
|
|
35
|
+
function hoofdletter(s) {
|
|
36
|
+
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
37
|
+
}
|
|
38
|
+
export {
|
|
39
|
+
FoutMelding,
|
|
40
|
+
LaadStaat,
|
|
41
|
+
foutTekst
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=LaadStaat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/ui/LaadStaat.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { Button, Card } from \"./primitives\";\nimport { isDemoActive } from \"../../demo/demoStore\";\n\n/**\n * Drie toestanden voor elke live lijst in /beheer (8.1): laden, fout, data. Eerst kenden de meeste\n * lijsten alleen \"data\": tijdens het laden én na een fout (rechten, App Check, geen verbinding)\n * stond er \"Nog geen pagina's — maak je eerste\", wat een klant letterlijk nam.\n */\nexport function LaadStaat({\n laden,\n fout,\n opnieuw,\n wat = \"gegevens\",\n children,\n}: {\n laden: boolean;\n fout: string | null;\n opnieuw?: () => void;\n /** Wat er geladen wordt, in een zin als \"De pagina's konden niet worden geladen.\" */\n wat?: string;\n children: ReactNode;\n}) {\n if (fout) return <FoutMelding wat={wat} detail={fout} opnieuw={opnieuw} />;\n if (laden) {\n return (\n <p className=\"py-2 text-sm text-slate-500\" role=\"status\" aria-live=\"polite\">\n {`${hoofdletter(wat)} laden…`}\n </p>\n );\n }\n return <>{children}</>;\n}\n\nexport function FoutMelding({ wat, detail, opnieuw }: { wat: string; detail?: string; opnieuw?: () => void }) {\n // In de demo is er geen database om uit te lezen; een rode foutmelding zou een proefklant\n // afschrikken voor iets wat bij een echte site gewoon werkt.\n if (isDemoActive()) {\n return (\n <Card>\n <p className=\"text-sm text-slate-600\" role=\"status\">\n In deze demo is dit onderdeel leeg. Bij je eigen site zie je hier {wat}.\n </p>\n </Card>\n );\n }\n return (\n <Card className=\"border-red-200\">\n <div role=\"alert\" className=\"grid gap-2\">\n <p className=\"text-sm font-medium text-red-800\">{`${hoofdletter(wat)} konden niet worden geladen.`}</p>\n <p className=\"text-xs text-slate-600\">\n {/permission|insufficient/i.test(detail ?? \"\")\n ? \"Je account heeft hier (nog) geen toegang toe. Log opnieuw in; helpt dat niet, neem dan contact op met Xi Webdesign.\"\n : \"Controleer je internetverbinding en probeer het opnieuw.\"}\n </p>\n {opnieuw && (\n <div>\n <Button size=\"sm\" variant=\"secondary\" onClick={opnieuw}>Opnieuw proberen</Button>\n </div>\n )}\n </div>\n </Card>\n );\n}\n\n/** Foutmelding uit een Firestore-/callable-fout, voor in `LaadStaat`. */\nexport function foutTekst(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n\nfunction hoofdletter(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n"],"mappings":";AAyBmB,SAQV,UARU,KAiBX,YAjBW;AAtBnB,SAAS,QAAQ,YAAY;AAC7B,SAAS,oBAAoB;AAOtB,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAM;AAAA,EACN;AACF,GAOG;AACD,MAAI,KAAM,QAAO,oBAAC,eAAY,KAAU,QAAQ,MAAM,SAAkB;AACxE,MAAI,OAAO;AACT,WACE,oBAAC,OAAE,WAAU,+BAA8B,MAAK,UAAS,aAAU,UAChE,aAAG,YAAY,GAAG,CAAC,gBACtB;AAAA,EAEJ;AACA,SAAO,gCAAG,UAAS;AACrB;AAEO,SAAS,YAAY,EAAE,KAAK,QAAQ,QAAQ,GAA2D;AAG5G,MAAI,aAAa,GAAG;AAClB,WACE,oBAAC,QACC,+BAAC,OAAE,WAAU,0BAAyB,MAAK,UAAS;AAAA;AAAA,MACiB;AAAA,MAAI;AAAA,OACzE,GACF;AAAA,EAEJ;AACA,SACE,oBAAC,QAAK,WAAU,kBACd,+BAAC,SAAI,MAAK,SAAQ,WAAU,cAC1B;AAAA,wBAAC,OAAE,WAAU,oCAAoC,aAAG,YAAY,GAAG,CAAC,gCAA+B;AAAA,IACnG,oBAAC,OAAE,WAAU,0BACV,qCAA2B,KAAK,UAAU,EAAE,IACzC,wHACA,4DACN;AAAA,IACC,WACC,oBAAC,SACC,8BAAC,UAAO,MAAK,MAAK,SAAQ,aAAY,SAAS,SAAS,8BAAgB,GAC1E;AAAA,KAEJ,GACF;AAEJ;AAGO,SAAS,UAAU,GAAoB;AAC5C,SAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AAClD;AAEA,SAAS,YAAY,GAAmB;AACtC,SAAO,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC;AAC9C;","names":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Leesbaarheid van een tekst (8.5): score, niveau, woorden, leestijd en concrete tips. Rekent
|
|
3
|
+
* lokaal (geen netwerk), uitgesteld zodat typen nooit hapert. Ingeklapt toont hij één regel; open
|
|
4
|
+
* de details voor de tips.
|
|
5
|
+
*/
|
|
6
|
+
export declare function LeesbaarheidPaneel({ html, tekst, titel }: {
|
|
7
|
+
html?: string;
|
|
8
|
+
tekst?: string;
|
|
9
|
+
titel?: string;
|
|
10
|
+
}): import("react").JSX.Element | null;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useDeferredValue, useMemo } from "react";
|
|
4
|
+
import { htmlNaarTekst, meetLeesbaarheid } from "../lib/leesbaarheid.js";
|
|
5
|
+
const KLEUR = { goed: "#15803d", matig: "#b45309", slecht: "#b91c1c" };
|
|
6
|
+
function LeesbaarheidPaneel({ html, tekst, titel = "Leesbaarheid" }) {
|
|
7
|
+
const bron = useDeferredValue(tekst ?? htmlNaarTekst(html ?? ""));
|
|
8
|
+
const r = useMemo(() => meetLeesbaarheid(bron), [bron]);
|
|
9
|
+
if (r.woorden === 0) return null;
|
|
10
|
+
const kleur = KLEUR[r.niveau.toon];
|
|
11
|
+
return /* @__PURE__ */ jsxs("details", { className: "rounded-lg border border-slate-200 bg-white px-3 py-2 text-sm", children: [
|
|
12
|
+
/* @__PURE__ */ jsxs("summary", { className: "flex cursor-pointer select-none flex-wrap items-center gap-x-3 gap-y-1", children: [
|
|
13
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-slate-800", children: titel }),
|
|
14
|
+
/* @__PURE__ */ jsxs(
|
|
15
|
+
"span",
|
|
16
|
+
{
|
|
17
|
+
className: "inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-xs font-medium",
|
|
18
|
+
style: { background: `${kleur}14`, color: kleur },
|
|
19
|
+
children: [
|
|
20
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "inline-block h-2 w-2 rounded-full", style: { background: kleur } }),
|
|
21
|
+
r.niveau.naam,
|
|
22
|
+
" \xB7 ",
|
|
23
|
+
r.score,
|
|
24
|
+
"/100"
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
),
|
|
28
|
+
/* @__PURE__ */ jsxs("span", { className: "text-xs text-slate-500", children: [
|
|
29
|
+
r.woorden,
|
|
30
|
+
" woorden \xB7 ca. ",
|
|
31
|
+
r.leestijd,
|
|
32
|
+
" min lezen"
|
|
33
|
+
] }),
|
|
34
|
+
r.tips.length > 0 && /* @__PURE__ */ jsxs("span", { className: "text-xs text-slate-600", children: [
|
|
35
|
+
"\xB7 ",
|
|
36
|
+
r.tips.length,
|
|
37
|
+
" ",
|
|
38
|
+
r.tips.length === 1 ? "tip" : "tips"
|
|
39
|
+
] })
|
|
40
|
+
] }),
|
|
41
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-3 grid gap-3", children: [
|
|
42
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
43
|
+
/* @__PURE__ */ jsx("div", { className: "relative h-2 overflow-hidden rounded-full bg-slate-100", role: "meter", "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": r.score, "aria-label": "Leesbaarheidsscore", children: /* @__PURE__ */ jsx("div", { className: "absolute inset-y-0 left-0 rounded-full", style: { width: `${r.score}%`, background: kleur } }) }),
|
|
44
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-1 flex justify-between text-[11px] text-slate-500", children: [
|
|
45
|
+
/* @__PURE__ */ jsx("span", { children: "moeilijk" }),
|
|
46
|
+
/* @__PURE__ */ jsx("span", { children: "B1 (streven)" }),
|
|
47
|
+
/* @__PURE__ */ jsx("span", { children: "makkelijk" })
|
|
48
|
+
] })
|
|
49
|
+
] }),
|
|
50
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-slate-600", children: r.niveau.uitleg }),
|
|
51
|
+
/* @__PURE__ */ jsx("dl", { className: "grid grid-cols-2 gap-2 text-xs sm:grid-cols-4", children: [
|
|
52
|
+
["Woorden", r.woorden],
|
|
53
|
+
["Zinnen", r.zinnen],
|
|
54
|
+
["Woorden per zin", r.woordenPerZin],
|
|
55
|
+
["Leestijd", `${r.leestijd} min`]
|
|
56
|
+
].map(([k, v]) => /* @__PURE__ */ jsxs("div", { className: "rounded-md bg-slate-50 px-2 py-1.5", children: [
|
|
57
|
+
/* @__PURE__ */ jsx("dt", { className: "text-slate-500", children: k }),
|
|
58
|
+
/* @__PURE__ */ jsx("dd", { className: "font-medium text-slate-800", children: v })
|
|
59
|
+
] }, String(k))) }),
|
|
60
|
+
r.tips.length > 0 && /* @__PURE__ */ jsx("ul", { className: "grid list-disc gap-1 pl-5 text-xs text-slate-700", children: r.tips.map((t, i) => /* @__PURE__ */ jsx("li", { children: t }, i)) }),
|
|
61
|
+
/* @__PURE__ */ jsx("p", { className: "text-[11px] text-slate-500", children: "Een indicatie (Flesch-Douma), geen oordeel: korte zinnen en gewone woorden lezen het prettigst." })
|
|
62
|
+
] })
|
|
63
|
+
] });
|
|
64
|
+
}
|
|
65
|
+
export {
|
|
66
|
+
LeesbaarheidPaneel
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=LeesbaarheidPaneel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/ui/LeesbaarheidPaneel.tsx"],"sourcesContent":["\"use client\";\n\nimport { useDeferredValue, useMemo } from \"react\";\nimport { htmlNaarTekst, meetLeesbaarheid } from \"../lib/leesbaarheid\";\n\nconst KLEUR = { goed: \"#15803d\", matig: \"#b45309\", slecht: \"#b91c1c\" } as const;\n\n/**\n * Leesbaarheid van een tekst (8.5): score, niveau, woorden, leestijd en concrete tips. Rekent\n * lokaal (geen netwerk), uitgesteld zodat typen nooit hapert. Ingeklapt toont hij één regel; open\n * de details voor de tips.\n */\nexport function LeesbaarheidPaneel({ html, tekst, titel = \"Leesbaarheid\" }: { html?: string; tekst?: string; titel?: string }) {\n const bron = useDeferredValue(tekst ?? htmlNaarTekst(html ?? \"\"));\n const r = useMemo(() => meetLeesbaarheid(bron), [bron]);\n if (r.woorden === 0) return null;\n const kleur = KLEUR[r.niveau.toon];\n return (\n <details className=\"rounded-lg border border-slate-200 bg-white px-3 py-2 text-sm\">\n <summary className=\"flex cursor-pointer select-none flex-wrap items-center gap-x-3 gap-y-1\">\n <span className=\"font-medium text-slate-800\">{titel}</span>\n <span\n className=\"inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-xs font-medium\"\n style={{ background: `${kleur}14`, color: kleur }}\n >\n <span aria-hidden className=\"inline-block h-2 w-2 rounded-full\" style={{ background: kleur }} />\n {r.niveau.naam} · {r.score}/100\n </span>\n <span className=\"text-xs text-slate-500\">\n {r.woorden} woorden · ca. {r.leestijd} min lezen\n </span>\n {r.tips.length > 0 && <span className=\"text-xs text-slate-600\">· {r.tips.length} {r.tips.length === 1 ? \"tip\" : \"tips\"}</span>}\n </summary>\n <div className=\"mt-3 grid gap-3\">\n <div>\n <div className=\"relative h-2 overflow-hidden rounded-full bg-slate-100\" role=\"meter\" aria-valuemin={0} aria-valuemax={100} aria-valuenow={r.score} aria-label=\"Leesbaarheidsscore\">\n <div className=\"absolute inset-y-0 left-0 rounded-full\" style={{ width: `${r.score}%`, background: kleur }} />\n </div>\n <div className=\"mt-1 flex justify-between text-[11px] text-slate-500\">\n <span>moeilijk</span>\n <span>B1 (streven)</span>\n <span>makkelijk</span>\n </div>\n </div>\n <p className=\"text-xs text-slate-600\">{r.niveau.uitleg}</p>\n <dl className=\"grid grid-cols-2 gap-2 text-xs sm:grid-cols-4\">\n {[\n [\"Woorden\", r.woorden],\n [\"Zinnen\", r.zinnen],\n [\"Woorden per zin\", r.woordenPerZin],\n [\"Leestijd\", `${r.leestijd} min`],\n ].map(([k, v]) => (\n <div key={String(k)} className=\"rounded-md bg-slate-50 px-2 py-1.5\">\n <dt className=\"text-slate-500\">{k}</dt>\n <dd className=\"font-medium text-slate-800\">{v}</dd>\n </div>\n ))}\n </dl>\n {r.tips.length > 0 && (\n <ul className=\"grid list-disc gap-1 pl-5 text-xs text-slate-700\">\n {r.tips.map((t, i) => (\n <li key={i}>{t}</li>\n ))}\n </ul>\n )}\n <p className=\"text-[11px] text-slate-500\">Een indicatie (Flesch-Douma), geen oordeel: korte zinnen en gewone woorden lezen het prettigst.</p>\n </div>\n </details>\n );\n}\n"],"mappings":";AAoBQ,cACA,YADA;AAlBR,SAAS,kBAAkB,eAAe;AAC1C,SAAS,eAAe,wBAAwB;AAEhD,MAAM,QAAQ,EAAE,MAAM,WAAW,OAAO,WAAW,QAAQ,UAAU;AAO9D,SAAS,mBAAmB,EAAE,MAAM,OAAO,QAAQ,eAAe,GAAsD;AAC7H,QAAM,OAAO,iBAAiB,SAAS,cAAc,QAAQ,EAAE,CAAC;AAChE,QAAM,IAAI,QAAQ,MAAM,iBAAiB,IAAI,GAAG,CAAC,IAAI,CAAC;AACtD,MAAI,EAAE,YAAY,EAAG,QAAO;AAC5B,QAAM,QAAQ,MAAM,EAAE,OAAO,IAAI;AACjC,SACE,qBAAC,aAAQ,WAAU,iEACjB;AAAA,yBAAC,aAAQ,WAAU,0EACjB;AAAA,0BAAC,UAAK,WAAU,8BAA8B,iBAAM;AAAA,MACpD;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,YAAY,GAAG,KAAK,MAAM,OAAO,MAAM;AAAA,UAEhD;AAAA,gCAAC,UAAK,eAAW,MAAC,WAAU,qCAAoC,OAAO,EAAE,YAAY,MAAM,GAAG;AAAA,YAC7F,EAAE,OAAO;AAAA,YAAK;AAAA,YAAI,EAAE;AAAA,YAAM;AAAA;AAAA;AAAA,MAC7B;AAAA,MACA,qBAAC,UAAK,WAAU,0BACb;AAAA,UAAE;AAAA,QAAQ;AAAA,QAAgB,EAAE;AAAA,QAAS;AAAA,SACxC;AAAA,MACC,EAAE,KAAK,SAAS,KAAK,qBAAC,UAAK,WAAU,0BAAyB;AAAA;AAAA,QAAG,EAAE,KAAK;AAAA,QAAO;AAAA,QAAE,EAAE,KAAK,WAAW,IAAI,QAAQ;AAAA,SAAO;AAAA,OACzH;AAAA,IACA,qBAAC,SAAI,WAAU,mBACb;AAAA,2BAAC,SACC;AAAA,4BAAC,SAAI,WAAU,0DAAyD,MAAK,SAAQ,iBAAe,GAAG,iBAAe,KAAK,iBAAe,EAAE,OAAO,cAAW,sBAC5J,8BAAC,SAAI,WAAU,0CAAyC,OAAO,EAAE,OAAO,GAAG,EAAE,KAAK,KAAK,YAAY,MAAM,GAAG,GAC9G;AAAA,QACA,qBAAC,SAAI,WAAU,wDACb;AAAA,8BAAC,UAAK,sBAAQ;AAAA,UACd,oBAAC,UAAK,0BAAY;AAAA,UAClB,oBAAC,UAAK,uBAAS;AAAA,WACjB;AAAA,SACF;AAAA,MACA,oBAAC,OAAE,WAAU,0BAA0B,YAAE,OAAO,QAAO;AAAA,MACvD,oBAAC,QAAG,WAAU,iDACX;AAAA,QACC,CAAC,WAAW,EAAE,OAAO;AAAA,QACrB,CAAC,UAAU,EAAE,MAAM;AAAA,QACnB,CAAC,mBAAmB,EAAE,aAAa;AAAA,QACnC,CAAC,YAAY,GAAG,EAAE,QAAQ,MAAM;AAAA,MAClC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MACV,qBAAC,SAAoB,WAAU,sCAC7B;AAAA,4BAAC,QAAG,WAAU,kBAAkB,aAAE;AAAA,QAClC,oBAAC,QAAG,WAAU,8BAA8B,aAAE;AAAA,WAFtC,OAAO,CAAC,CAGlB,CACD,GACH;AAAA,MACC,EAAE,KAAK,SAAS,KACf,oBAAC,QAAG,WAAU,oDACX,YAAE,KAAK,IAAI,CAAC,GAAG,MACd,oBAAC,QAAY,eAAJ,CAAM,CAChB,GACH;AAAA,MAEF,oBAAC,OAAE,WAAU,8BAA6B,6GAA+F;AAAA,OAC3I;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Link plaatsen of wijzigen (8.2). Verving `window.prompt("Link-URL")` in de inline editor en de
|
|
3
|
+
* rich-text-editor: geen keuze uit eigen pagina's (dus typefouten → 404), niet te stijlen, en op
|
|
4
|
+
* een telefoon nauwelijks bruikbaar. Hier kies je een pagina van de site, of typ je een webadres
|
|
5
|
+
* of e-mailadres; "www.voorbeeld.nl" wordt vanzelf "https://www.voorbeeld.nl".
|
|
6
|
+
*/
|
|
7
|
+
export declare function LinkDialog({ open, onOpenChange, siteId, huidig, huidigNieuwTabblad, onKlaar, }: {
|
|
8
|
+
open: boolean;
|
|
9
|
+
onOpenChange: (v: boolean) => void;
|
|
10
|
+
/** Zonder siteId (bv. een editor buiten een site) alleen het webadres-tabblad. */
|
|
11
|
+
siteId?: string;
|
|
12
|
+
/** De link die er nu staat (leeg = nieuwe link). */
|
|
13
|
+
huidig?: string;
|
|
14
|
+
/** Opende de bestaande link in een nieuw tabblad? */
|
|
15
|
+
huidigNieuwTabblad?: boolean;
|
|
16
|
+
/** `null` = link weghalen. */
|
|
17
|
+
onKlaar: (href: string | null, opties?: {
|
|
18
|
+
nieuwTabblad: boolean;
|
|
19
|
+
}) => void;
|
|
20
|
+
}): import("react").JSX.Element;
|
|
21
|
+
/** "www.x.nl" → "https://www.x.nl", "a@b.nl" → "mailto:a@b.nl"; gevaarlijke schema's weigeren. */
|
|
22
|
+
export declare function normaliseerAdres(ruw: string): string;
|