@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,14 @@
|
|
|
1
|
+
export interface PreviewLink {
|
|
2
|
+
url: string;
|
|
3
|
+
/** Epoch-ms; ontbreekt bij een oude functions-versie. */
|
|
4
|
+
expiresAt?: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Gedeelde weergave van een gemaakte preview-link (8.5): adres, kopiëren, openen, delen
|
|
8
|
+
* (telefoon: WhatsApp/mail via het deelmenu) en tot wanneer hij werkt. Eerst stond er alleen
|
|
9
|
+
* een los invoerveld en moest de klant zelf selecteren en kopiëren.
|
|
10
|
+
*/
|
|
11
|
+
export declare function PreviewLinkResultaat({ link, titel }: {
|
|
12
|
+
link: PreviewLink;
|
|
13
|
+
titel?: string;
|
|
14
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { Button, Input } from "./primitives.js";
|
|
5
|
+
import { useToast } from "./toast.js";
|
|
6
|
+
function PreviewLinkResultaat({ link, titel }) {
|
|
7
|
+
const { toast } = useToast();
|
|
8
|
+
const [gekopieerd, setGekopieerd] = useState(false);
|
|
9
|
+
const kanDelen = typeof navigator !== "undefined" && typeof navigator.share === "function";
|
|
10
|
+
const tot = link.expiresAt ? new Date(link.expiresAt).toLocaleString("nl-NL", { weekday: "long", day: "numeric", month: "long", hour: "2-digit", minute: "2-digit" }) : null;
|
|
11
|
+
async function kopieer() {
|
|
12
|
+
try {
|
|
13
|
+
await navigator.clipboard.writeText(link.url);
|
|
14
|
+
setGekopieerd(true);
|
|
15
|
+
setTimeout(() => setGekopieerd(false), 2e3);
|
|
16
|
+
} catch {
|
|
17
|
+
toast({ title: "Kopi\xEBren lukte niet", description: "Selecteer het adres en kopieer het zelf.", tone: "error" });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async function deel() {
|
|
21
|
+
try {
|
|
22
|
+
await navigator.share({ title: titel ? `Voorbeeld: ${titel}` : "Voorbeeld van de website", url: link.url });
|
|
23
|
+
} catch {
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return /* @__PURE__ */ jsxs("div", { className: "grid gap-2", children: [
|
|
27
|
+
/* @__PURE__ */ jsx(
|
|
28
|
+
Input,
|
|
29
|
+
{
|
|
30
|
+
readOnly: true,
|
|
31
|
+
value: link.url,
|
|
32
|
+
"aria-label": "Voorbeeldlink",
|
|
33
|
+
className: "min-w-0 text-xs",
|
|
34
|
+
onFocus: (e) => e.currentTarget.select()
|
|
35
|
+
}
|
|
36
|
+
),
|
|
37
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-1", children: [
|
|
38
|
+
/* @__PURE__ */ jsx(Button, { variant: "secondary", size: "sm", onClick: () => void kopieer(), children: gekopieerd ? "\u2713 Gekopieerd" : "Kopi\xEBren" }),
|
|
39
|
+
/* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: () => window.open(link.url, "_blank", "noopener"), children: "Openen \u2197" }),
|
|
40
|
+
kanDelen && /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: () => void deel(), children: "Delen\u2026" })
|
|
41
|
+
] }),
|
|
42
|
+
tot && /* @__PURE__ */ jsxs("p", { className: "text-xs text-slate-500", children: [
|
|
43
|
+
"Werkt tot ",
|
|
44
|
+
tot,
|
|
45
|
+
". Daarna maak je eenvoudig een nieuwe."
|
|
46
|
+
] })
|
|
47
|
+
] });
|
|
48
|
+
}
|
|
49
|
+
export {
|
|
50
|
+
PreviewLinkResultaat
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=PreviewLinkResultaat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/ui/PreviewLinkResultaat.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Button, Input } from \"./primitives\";\nimport { useToast } from \"./toast\";\n\nexport interface PreviewLink {\n url: string;\n /** Epoch-ms; ontbreekt bij een oude functions-versie. */\n expiresAt?: number;\n}\n\n/**\n * Gedeelde weergave van een gemaakte preview-link (8.5): adres, kopiëren, openen, delen\n * (telefoon: WhatsApp/mail via het deelmenu) en tot wanneer hij werkt. Eerst stond er alleen\n * een los invoerveld en moest de klant zelf selecteren en kopiëren.\n */\nexport function PreviewLinkResultaat({ link, titel }: { link: PreviewLink; titel?: string }) {\n const { toast } = useToast();\n const [gekopieerd, setGekopieerd] = useState(false);\n const kanDelen = typeof navigator !== \"undefined\" && typeof navigator.share === \"function\";\n const tot = link.expiresAt\n ? new Date(link.expiresAt).toLocaleString(\"nl-NL\", { weekday: \"long\", day: \"numeric\", month: \"long\", hour: \"2-digit\", minute: \"2-digit\" })\n : null;\n\n async function kopieer() {\n try {\n await navigator.clipboard.writeText(link.url);\n setGekopieerd(true);\n setTimeout(() => setGekopieerd(false), 2000);\n } catch {\n toast({ title: \"Kopiëren lukte niet\", description: \"Selecteer het adres en kopieer het zelf.\", tone: \"error\" });\n }\n }\n\n async function deel() {\n try {\n await navigator.share({ title: titel ? `Voorbeeld: ${titel}` : \"Voorbeeld van de website\", url: link.url });\n } catch {\n /* geannuleerd */\n }\n }\n\n return (\n <div className=\"grid gap-2\">\n <Input\n readOnly\n value={link.url}\n aria-label=\"Voorbeeldlink\"\n className=\"min-w-0 text-xs\"\n onFocus={(e) => e.currentTarget.select()}\n />\n <div className=\"flex flex-wrap gap-1\">\n <Button variant=\"secondary\" size=\"sm\" onClick={() => void kopieer()}>\n {gekopieerd ? \"✓ Gekopieerd\" : \"Kopiëren\"}\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => window.open(link.url, \"_blank\", \"noopener\")}>\n Openen ↗\n </Button>\n {kanDelen && (\n <Button variant=\"ghost\" size=\"sm\" onClick={() => void deel()}>\n Delen…\n </Button>\n )}\n </div>\n {tot && <p className=\"text-xs text-slate-500\">Werkt tot {tot}. Daarna maak je eenvoudig een nieuwe.</p>}\n </div>\n );\n}\n"],"mappings":";AA6CM,cAOA,YAPA;AA3CN,SAAS,gBAAgB;AACzB,SAAS,QAAQ,aAAa;AAC9B,SAAS,gBAAgB;AAalB,SAAS,qBAAqB,EAAE,MAAM,MAAM,GAA0C;AAC3F,QAAM,EAAE,MAAM,IAAI,SAAS;AAC3B,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAClD,QAAM,WAAW,OAAO,cAAc,eAAe,OAAO,UAAU,UAAU;AAChF,QAAM,MAAM,KAAK,YACb,IAAI,KAAK,KAAK,SAAS,EAAE,eAAe,SAAS,EAAE,SAAS,QAAQ,KAAK,WAAW,OAAO,QAAQ,MAAM,WAAW,QAAQ,UAAU,CAAC,IACvI;AAEJ,iBAAe,UAAU;AACvB,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,KAAK,GAAG;AAC5C,oBAAc,IAAI;AAClB,iBAAW,MAAM,cAAc,KAAK,GAAG,GAAI;AAAA,IAC7C,QAAQ;AACN,YAAM,EAAE,OAAO,0BAAuB,aAAa,4CAA4C,MAAM,QAAQ,CAAC;AAAA,IAChH;AAAA,EACF;AAEA,iBAAe,OAAO;AACpB,QAAI;AACF,YAAM,UAAU,MAAM,EAAE,OAAO,QAAQ,cAAc,KAAK,KAAK,4BAA4B,KAAK,KAAK,IAAI,CAAC;AAAA,IAC5G,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SACE,qBAAC,SAAI,WAAU,cACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,UAAQ;AAAA,QACR,OAAO,KAAK;AAAA,QACZ,cAAW;AAAA,QACX,WAAU;AAAA,QACV,SAAS,CAAC,MAAM,EAAE,cAAc,OAAO;AAAA;AAAA,IACzC;AAAA,IACA,qBAAC,SAAI,WAAU,wBACb;AAAA,0BAAC,UAAO,SAAQ,aAAY,MAAK,MAAK,SAAS,MAAM,KAAK,QAAQ,GAC/D,uBAAa,sBAAiB,eACjC;AAAA,MACA,oBAAC,UAAO,SAAQ,SAAQ,MAAK,MAAK,SAAS,MAAM,OAAO,KAAK,KAAK,KAAK,UAAU,UAAU,GAAG,2BAE9F;AAAA,MACC,YACC,oBAAC,UAAO,SAAQ,SAAQ,MAAK,MAAK,SAAS,MAAM,KAAK,KAAK,GAAG,yBAE9D;AAAA,OAEJ;AAAA,IACC,OAAO,qBAAC,OAAE,WAAU,0BAAyB;AAAA;AAAA,MAAW;AAAA,MAAI;AAAA,OAAsC;AAAA,KACrG;AAEJ;","names":[]}
|
package/dist/admin/ui/charts.js
CHANGED
|
@@ -99,7 +99,7 @@ function DagStaven({
|
|
|
99
99
|
},
|
|
100
100
|
i
|
|
101
101
|
)) }),
|
|
102
|
-
/* @__PURE__ */ jsx("div", { "aria-hidden": "true", className: "pointer-events-none absolute inset-x-0", style: { top: plotH + 3 }, children: [0, 9, 19, n - 1].filter((v, i, a) => v >= 0 && v < n && a.indexOf(v) === i).map((i) => /* @__PURE__ */ jsx("span", { className: "absolute -translate-x-1/2 text-[10px] text-slate-
|
|
102
|
+
/* @__PURE__ */ jsx("div", { "aria-hidden": "true", className: "pointer-events-none absolute inset-x-0", style: { top: plotH + 3 }, children: [0, 9, 19, n - 1].filter((v, i, a) => v >= 0 && v < n && a.indexOf(v) === i).map((i) => /* @__PURE__ */ jsx("span", { className: "absolute -translate-x-1/2 text-[10px] text-slate-500", style: { left: `${(i + 0.5) / n * 100}%` }, children: i + 1 }, i)) }),
|
|
103
103
|
maxWaarde > 0 && hover === null && /* @__PURE__ */ jsx(
|
|
104
104
|
"span",
|
|
105
105
|
{
|
|
@@ -109,7 +109,7 @@ function DagStaven({
|
|
|
109
109
|
children: nf.format(maxWaarde)
|
|
110
110
|
}
|
|
111
111
|
),
|
|
112
|
-
/* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "pointer-events-none absolute -top-0.5 right-0 bg-white pl-1 text-[10px] text-slate-
|
|
112
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "pointer-events-none absolute -top-0.5 right-0 bg-white pl-1 text-[10px] text-slate-500", style: { fontVariantNumeric: "tabular-nums" }, children: nf.format(max) })
|
|
113
113
|
] });
|
|
114
114
|
}
|
|
115
115
|
function MaandLijn({
|
|
@@ -167,7 +167,7 @@ function MaandLijn({
|
|
|
167
167
|
/* @__PURE__ */ jsx("div", { "aria-hidden": "true", className: "pointer-events-none absolute inset-x-0", style: { top: plotH + 3 }, children: [0, Math.floor((n - 1) / 2), n - 1].filter((v, i, a) => a.indexOf(v) === i).map((i) => /* @__PURE__ */ jsx(
|
|
168
168
|
"span",
|
|
169
169
|
{
|
|
170
|
-
className: "absolute text-[10px] text-slate-
|
|
170
|
+
className: "absolute text-[10px] text-slate-500",
|
|
171
171
|
style: { left: `${px(i)}%`, transform: i === 0 ? "none" : i === n - 1 ? "translateX(-100%)" : "translateX(-50%)" },
|
|
172
172
|
children: punten[i].label
|
|
173
173
|
},
|
|
@@ -182,7 +182,7 @@ function MaandLijn({
|
|
|
182
182
|
children: nf.format(punten[n - 1].waarde)
|
|
183
183
|
}
|
|
184
184
|
),
|
|
185
|
-
/* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "pointer-events-none absolute -top-0.5 right-0 bg-white pl-1 text-[10px] text-slate-
|
|
185
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "pointer-events-none absolute -top-0.5 right-0 bg-white pl-1 text-[10px] text-slate-500", style: { fontVariantNumeric: "tabular-nums" }, children: nf.format(max) })
|
|
186
186
|
] });
|
|
187
187
|
}
|
|
188
188
|
function BalkjesLijst({ items }) {
|
|
@@ -216,7 +216,7 @@ function StatTegel({
|
|
|
216
216
|
}
|
|
217
217
|
function AlsTabel({ kop, rijen }) {
|
|
218
218
|
return /* @__PURE__ */ jsxs("details", { className: "mt-2", children: [
|
|
219
|
-
/* @__PURE__ */ jsx("summary", { className: "cursor-pointer text-xs text-slate-
|
|
219
|
+
/* @__PURE__ */ jsx("summary", { className: "cursor-pointer text-xs text-slate-500 hover:text-slate-600", children: "Bekijk als tabel" }),
|
|
220
220
|
/* @__PURE__ */ jsxs("table", { className: "mt-2 w-full text-sm", children: [
|
|
221
221
|
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { className: "text-left text-xs text-slate-500", children: [
|
|
222
222
|
/* @__PURE__ */ jsx("th", { className: "py-1 font-medium", children: kop[0] }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/admin/ui/charts.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * Lichte grafieken voor het beheer (7.17) — geen chart-library: dit is een editor-chunk en\n * drie vormen (kolommen, lijn, balkjeslijst) rechtvaardigen geen dependency in elke klantsite.\n *\n * Vaste GEREEDSCHAPSKLEUREN, bewust niet de merkkleur: `--color-brand` volgt `--xicms-primary`\n * van de klant en kan licht zijn (goud, lime) — dan verdwijnen de staven op een witte kaart.\n * Dit blauwpaar is met de dataviz-validator doorgerekend op wit (lichtheid, chroma, CVD-ΔE 18.9,\n * normaal-zicht-ΔE 19.2, contrast ≥ 3:1 — alles groen). Zelfde filosofie als de editor-balk:\n * gereedschap ziet er op elke site hetzelfde uit.\n *\n * Vormregels die hier vastliggen (dataviz-methode):\n * - kolommen: ronde datakant (4px), vlakke voet op de basislijn, ≤ 24px dik, 2px lucht ertussen;\n * - lijn: 2px met ronde joins, vulling als wash (10%), punten ≥ 8px met witte ring;\n * - raster: haarlijnen één stap van het oppervlak af, nooit gestreept, recessief;\n * - tekst draagt tekstkleuren, nooit de seriekleur — identiteit zit in de mark ernaast;\n * - hover hoort erbij: ruime hit-zones met tooltip, en alles wat de tooltip toont is óók\n * zonder muis bereikbaar (as-ticks, selectieve labels, de tabel-uitklapper).\n *\n * Bewust HTML-marks (divs) waar het kan: een SVG met `preserveAspectRatio=\"none\"` schaalt\n * niet-uniform, waardoor rondingen en cirkels vervormen — divs met border-radius blijven\n * pixel-zuiver op elke kaartbreedte. Alleen het lijnpad zelf is SVG (met non-scaling-stroke).\n */\nimport { useId, useRef, useState } from \"react\";\n\nexport const CHART = {\n serie: \"#3987e5\",\n accent: \"#184f95\",\n wash: \"rgba(57, 135, 229, 0.10)\",\n track: \"#e9f1fc\",\n grid: \"#e2e8f0\",\n as: \"#cbd5e1\",\n} as const;\n\nconst nf = new Intl.NumberFormat(\"nl-NL\");\n\n/** Nette bovengrens voor de y-as (1/2/5 × macht van 10), zodat de schaal-tick rond is. */\nfunction netteMax(max: number): number {\n if (max <= 4) return 4;\n const macht = 10 ** Math.floor(Math.log10(max));\n for (const f of [1, 2, 5, 10]) if (max <= f * macht) return f * macht;\n return 10 * macht;\n}\n\ninterface TooltipStand {\n x: number;\n y: number;\n titel: string;\n waarde: number;\n}\n\n/** Zwevende uitlezing. Waarde voorop en zwaar, label secundair — de lezer wil het getal. */\nfunction Tooltip({ t }: { t: TooltipStand | null }) {\n if (!t) return null;\n return (\n <div\n className=\"pointer-events-none absolute z-10 rounded-lg border border-slate-200 bg-white px-2.5 py-1.5 whitespace-nowrap shadow-md\"\n style={{ left: t.x, top: Math.max(26, t.y), transform: \"translate(-50%, calc(-100% - 8px))\" }}\n role=\"status\"\n >\n <span className=\"text-sm font-semibold text-slate-900\">{nf.format(t.waarde)}</span>\n <span className=\"ml-1.5 text-xs text-slate-500\">{t.titel}</span>\n </div>\n );\n}\n\n/** Recessief raster: haarlijnen op 50% en 100% van de schaal + de basislijn. */\nfunction Raster({ plotH }: { plotH: number }) {\n return (\n <div aria-hidden=\"true\" className=\"pointer-events-none absolute inset-x-0 top-0\" style={{ height: plotH }}>\n <div className=\"absolute inset-x-0\" style={{ top: 0, borderTop: `1px solid ${CHART.grid}` }} />\n <div className=\"absolute inset-x-0\" style={{ top: plotH / 2, borderTop: `1px solid ${CHART.grid}` }} />\n <div className=\"absolute inset-x-0\" style={{ top: plotH, borderTop: `1px solid ${CHART.as}` }} />\n </div>\n );\n}\n\n/**\n * Kolomgrafiek voor één maand: dag 1..N. `accentIndex` (bv. vandaag) kleurt één kolom in de\n * donkere stap van dezelfde ramp — zelfde reeks, gemarkeerd, geen tweede kleur.\n */\nexport function DagStaven({\n waarden,\n accentIndex,\n hoogte = 150,\n titel,\n labelVan,\n}: {\n /** Waarde per dag, index 0 = dag 1. */\n waarden: number[];\n accentIndex?: number;\n hoogte?: number;\n titel: string;\n /** Tooltiplabel per index (standaard \"dag N\"). */\n labelVan?: (i: number) => string;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const [tip, setTip] = useState<TooltipStand | null>(null);\n const [hover, setHover] = useState<number | null>(null);\n const uid = useId();\n\n const n = Math.max(1, waarden.length);\n const max = netteMax(Math.max(1, ...waarden));\n const plotH = hoogte - 18;\n const maxWaarde = Math.max(...waarden);\n const maxIdx = waarden.indexOf(maxWaarde);\n const label = labelVan ?? ((i: number) => `dag ${i + 1}`);\n\n const move = (i: number) => {\n const host = ref.current;\n if (!host) return;\n const r = host.getBoundingClientRect();\n setHover(i);\n setTip({ x: ((i + 0.5) / n) * r.width, y: plotH * (1 - waarden[i] / max), titel: label(i), waarde: waarden[i] });\n };\n const leave = () => {\n setHover(null);\n setTip(null);\n };\n\n return (\n <div ref={ref} className=\"relative\" role=\"img\" aria-labelledby={`${uid}-t`} style={{ height: hoogte }}>\n <span id={`${uid}-t`} className=\"sr-only\">{titel}</span>\n <Tooltip t={tip} />\n <Raster plotH={plotH} />\n {/* De kolommen zelf: flex-sloten met 2px lucht; de balk groeit vanaf de basislijn en is\n nooit dikker dan 24px — de rest van het slot blijft lucht. */}\n <div className=\"absolute inset-x-0 top-0 flex items-end\" style={{ height: plotH, gap: 2 }}>\n {waarden.map((v, i) => (\n <button\n key={i}\n type=\"button\"\n tabIndex={v > 0 ? 0 : -1}\n aria-label={`${label(i)}: ${nf.format(v)} weergaven`}\n className=\"flex h-full min-w-0 flex-1 cursor-default items-end justify-center focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600\"\n onPointerMove={() => move(i)}\n onFocus={() => move(i)}\n onPointerLeave={leave}\n onBlur={leave}\n >\n {v > 0 && (\n <span\n aria-hidden=\"true\"\n className=\"block w-full\"\n style={{\n maxWidth: 24,\n height: Math.max(3, (v / max) * (plotH - 6)),\n borderRadius: \"4px 4px 0 0\",\n background: i === accentIndex ? CHART.accent : CHART.serie,\n opacity: hover === null || hover === i ? 1 : 0.45,\n transition: \"opacity 0.1s\",\n }}\n />\n )}\n </button>\n ))}\n </div>\n {/* Daglabels: spaarzaam (1 · 10 · 20 · einde). */}\n <div aria-hidden=\"true\" className=\"pointer-events-none absolute inset-x-0\" style={{ top: plotH + 3 }}>\n {[0, 9, 19, n - 1]\n .filter((v, i, a) => v >= 0 && v < n && a.indexOf(v) === i)\n .map((i) => (\n <span key={i} className=\"absolute -translate-x-1/2 text-[10px] text-slate-400\" style={{ left: `${((i + 0.5) / n) * 100}%` }}>\n {i + 1}\n </span>\n ))}\n </div>\n {/* Selectief direct label: alleen de piek — de rest draagt de tooltip en de schaal-tick. */}\n {maxWaarde > 0 && hover === null && (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute -translate-x-1/2 text-[10px] font-medium text-slate-500\"\n style={{ left: `${((maxIdx + 0.5) / n) * 100}%`, top: Math.max(0, plotH * (1 - maxWaarde / max) - 16) }}\n >\n {nf.format(maxWaarde)}\n </span>\n )}\n <span aria-hidden=\"true\" className=\"pointer-events-none absolute -top-0.5 right-0 bg-white pl-1 text-[10px] text-slate-400\" style={{ fontVariantNumeric: \"tabular-nums\" }}>\n {nf.format(max)}\n </span>\n </div>\n );\n}\n\n/** Lijngrafiek over maanden: 2px lijn, wash-vulling, crosshair-tooltip, eindpunt gemarkeerd. */\nexport function MaandLijn({\n punten,\n hoogte = 150,\n titel,\n}: {\n punten: { label: string; waarde: number }[];\n hoogte?: number;\n titel: string;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const [tip, setTip] = useState<TooltipStand | null>(null);\n const [kruis, setKruis] = useState<number | null>(null);\n const uid = useId();\n\n const n = punten.length;\n const max = netteMax(Math.max(1, ...punten.map((p) => p.waarde)));\n const plotH = hoogte - 18;\n // x in procenten (2% marge), y in pixels — de SVG rekt alleen horizontaal.\n const px = (i: number) => (n === 1 ? 50 : 2 + (i / (n - 1)) * 96);\n const py = (v: number) => 6 + (plotH - 12) * (1 - v / max);\n const pad = punten.map((p, i) => `${i === 0 ? \"M\" : \"L\"} ${px(i)} ${py(p.waarde)}`).join(\" \");\n\n const move = (e: React.PointerEvent) => {\n const host = ref.current;\n if (!host || n === 0) return;\n const r = host.getBoundingClientRect();\n const fx = ((e.clientX - r.left) / r.width) * 100;\n const i = Math.max(0, Math.min(n - 1, Math.round(((fx - 2) / 96) * (n - 1))));\n setKruis(i);\n setTip({ x: (px(i) / 100) * r.width, y: py(punten[i].waarde), titel: punten[i].label, waarde: punten[i].waarde });\n };\n const leave = () => {\n setKruis(null);\n setTip(null);\n };\n\n if (n === 0) return null;\n const focus = kruis ?? n - 1;\n\n return (\n <div ref={ref} className=\"relative\" role=\"img\" aria-labelledby={`${uid}-t`} style={{ height: hoogte }} onPointerMove={move} onPointerLeave={leave}>\n <span id={`${uid}-t`} className=\"sr-only\">{titel}</span>\n <Tooltip t={tip} />\n <Raster plotH={plotH} />\n <svg viewBox={`0 0 100 ${plotH}`} preserveAspectRatio=\"none\" className=\"absolute inset-x-0 top-0 block w-full\" style={{ height: plotH }} aria-hidden=\"true\">\n {/* Wash onder de lijn: de seriekleur op 10% — een waas, nooit een vlak. */}\n <path d={`${pad} L ${px(n - 1)} ${plotH} L ${px(0)} ${plotH} Z`} fill={CHART.wash} />\n <path d={pad} fill=\"none\" stroke={CHART.serie} strokeWidth=\"2\" strokeLinejoin=\"round\" strokeLinecap=\"round\" vectorEffect=\"non-scaling-stroke\" />\n {kruis !== null && (\n <line x1={px(kruis)} x2={px(kruis)} y1=\"0\" y2={plotH} stroke={CHART.as} strokeWidth=\"1\" vectorEffect=\"non-scaling-stroke\" />\n )}\n </svg>\n {/* Punt als HTML-dot (8px + 2px witte ring): een SVG-cirkel vervormt onder de niet-uniforme\n schaal. Alleen het focuspunt draagt een dot — een dot op elk punt is ruis. */}\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute h-2 w-2 -translate-x-1/2 -translate-y-1/2 rounded-full\"\n style={{\n left: `${px(focus)}%`,\n top: py(punten[focus].waarde),\n background: focus === n - 1 ? CHART.accent : CHART.serie,\n boxShadow: \"0 0 0 2px #ffffff\",\n }}\n />\n <div aria-hidden=\"true\" className=\"pointer-events-none absolute inset-x-0\" style={{ top: plotH + 3 }}>\n {[0, Math.floor((n - 1) / 2), n - 1]\n .filter((v, i, a) => a.indexOf(v) === i)\n .map((i) => (\n <span\n key={i}\n className=\"absolute text-[10px] text-slate-400\"\n style={{ left: `${px(i)}%`, transform: i === 0 ? \"none\" : i === n - 1 ? \"translateX(-100%)\" : \"translateX(-50%)\" }}\n >\n {punten[i].label}\n </span>\n ))}\n </div>\n {/* Direct label op het eindpunt — de waarde waar het verhaal om draait. */}\n {kruis === null && (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute text-[11px] font-semibold text-slate-700\"\n style={{ left: `${px(n - 1)}%`, top: Math.max(0, py(punten[n - 1].waarde) - 20), transform: \"translateX(-100%)\" }}\n >\n {nf.format(punten[n - 1].waarde)}\n </span>\n )}\n <span aria-hidden=\"true\" className=\"pointer-events-none absolute -top-0.5 right-0 bg-white pl-1 text-[10px] text-slate-400\" style={{ fontVariantNumeric: \"tabular-nums\" }}>\n {nf.format(max)}\n </span>\n </div>\n );\n}\n\n/** Horizontale balkjeslijst (toppagina's): label · waarde · balk. De track is een lichtere stap\n * van dezelfde ramp, zodat einden vergelijkbaar zijn zonder raster. */\nexport function BalkjesLijst({ items }: { items: { label: string; waarde: number }[] }) {\n const max = Math.max(1, ...items.map((i) => i.waarde));\n return (\n <ul className=\"grid gap-2.5\">\n {items.map((it) => (\n <li key={it.label} className=\"grid grid-cols-[minmax(0,1fr)_auto] items-center gap-x-3 gap-y-1\">\n <span className=\"truncate text-sm text-slate-700\" title={it.label}>{it.label}</span>\n <span className=\"text-sm font-medium text-slate-900\" style={{ fontVariantNumeric: \"tabular-nums\" }}>\n {nf.format(it.waarde)}\n </span>\n <span aria-hidden=\"true\" className=\"col-span-2 block h-1.5 w-full overflow-hidden rounded-full\" style={{ background: CHART.track }}>\n <span className=\"block h-full rounded-full\" style={{ width: `${(it.waarde / max) * 100}%`, background: CHART.serie }} />\n </span>\n </li>\n ))}\n </ul>\n );\n}\n\n/** Stat-tegel: label · grote waarde (proportionele cijfers) · optionele delta t.o.v. een genoemde periode. */\nexport function StatTegel({\n label,\n waarde,\n delta,\n deltaLabel,\n}: {\n label: string;\n waarde: number | string;\n /** Relatief verschil in procenten (bv. +12) — kleur volgt de richting (meer bezoek = goed). */\n delta?: number | null;\n deltaLabel?: string;\n}) {\n return (\n <div className=\"rounded-xl border border-slate-200 bg-white p-4\">\n <p className=\"text-sm text-slate-500\">{label}</p>\n <p className=\"mt-1 text-3xl font-semibold text-slate-900\">\n {typeof waarde === \"number\" ? nf.format(waarde) : waarde}\n </p>\n {delta != null && Number.isFinite(delta) && (\n <p className={`mt-1 text-xs font-medium ${delta >= 0 ? \"text-emerald-700\" : \"text-red-700\"}`}>\n <span aria-hidden=\"true\">{delta >= 0 ? \"▲\" : \"▼\"}</span> {Math.abs(Math.round(delta))}%\n {deltaLabel ? <span className=\"font-normal text-slate-500\"> {deltaLabel}</span> : null}\n </p>\n )}\n </div>\n );\n}\n\n/** Toegankelijke tabelweergave achter een uitklapper — alles wat een grafiek toont, zonder muis. */\nexport function AlsTabel({ kop, rijen }: { kop: [string, string]; rijen: [string, number][] }) {\n return (\n <details className=\"mt-2\">\n <summary className=\"cursor-pointer text-xs text-slate-400 hover:text-slate-600\">Bekijk als tabel</summary>\n <table className=\"mt-2 w-full text-sm\">\n <thead>\n <tr className=\"text-left text-xs text-slate-500\">\n <th className=\"py-1 font-medium\">{kop[0]}</th>\n <th className=\"py-1 text-right font-medium\">{kop[1]}</th>\n </tr>\n </thead>\n <tbody>\n {rijen.map(([l, w]) => (\n <tr key={l} className=\"border-t border-slate-100\">\n <td className=\"py-1 text-slate-700\">{l}</td>\n <td className=\"py-1 text-right text-slate-900\" style={{ fontVariantNumeric: \"tabular-nums\" }}>{nf.format(w)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </details>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/ui/charts.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * Lichte grafieken voor het beheer (7.17) — geen chart-library: dit is een editor-chunk en\n * drie vormen (kolommen, lijn, balkjeslijst) rechtvaardigen geen dependency in elke klantsite.\n *\n * Vaste GEREEDSCHAPSKLEUREN, bewust niet de merkkleur: `--color-brand` volgt `--xicms-primary`\n * van de klant en kan licht zijn (goud, lime) — dan verdwijnen de staven op een witte kaart.\n * Dit blauwpaar is met de dataviz-validator doorgerekend op wit (lichtheid, chroma, CVD-ΔE 18.9,\n * normaal-zicht-ΔE 19.2, contrast ≥ 3:1 — alles groen). Zelfde filosofie als de editor-balk:\n * gereedschap ziet er op elke site hetzelfde uit.\n *\n * Vormregels die hier vastliggen (dataviz-methode):\n * - kolommen: ronde datakant (4px), vlakke voet op de basislijn, ≤ 24px dik, 2px lucht ertussen;\n * - lijn: 2px met ronde joins, vulling als wash (10%), punten ≥ 8px met witte ring;\n * - raster: haarlijnen één stap van het oppervlak af, nooit gestreept, recessief;\n * - tekst draagt tekstkleuren, nooit de seriekleur — identiteit zit in de mark ernaast;\n * - hover hoort erbij: ruime hit-zones met tooltip, en alles wat de tooltip toont is óók\n * zonder muis bereikbaar (as-ticks, selectieve labels, de tabel-uitklapper).\n *\n * Bewust HTML-marks (divs) waar het kan: een SVG met `preserveAspectRatio=\"none\"` schaalt\n * niet-uniform, waardoor rondingen en cirkels vervormen — divs met border-radius blijven\n * pixel-zuiver op elke kaartbreedte. Alleen het lijnpad zelf is SVG (met non-scaling-stroke).\n */\nimport { useId, useRef, useState } from \"react\";\n\nexport const CHART = {\n serie: \"#3987e5\",\n accent: \"#184f95\",\n wash: \"rgba(57, 135, 229, 0.10)\",\n track: \"#e9f1fc\",\n grid: \"#e2e8f0\",\n as: \"#cbd5e1\",\n} as const;\n\nconst nf = new Intl.NumberFormat(\"nl-NL\");\n\n/** Nette bovengrens voor de y-as (1/2/5 × macht van 10), zodat de schaal-tick rond is. */\nfunction netteMax(max: number): number {\n if (max <= 4) return 4;\n const macht = 10 ** Math.floor(Math.log10(max));\n for (const f of [1, 2, 5, 10]) if (max <= f * macht) return f * macht;\n return 10 * macht;\n}\n\ninterface TooltipStand {\n x: number;\n y: number;\n titel: string;\n waarde: number;\n}\n\n/** Zwevende uitlezing. Waarde voorop en zwaar, label secundair — de lezer wil het getal. */\nfunction Tooltip({ t }: { t: TooltipStand | null }) {\n if (!t) return null;\n return (\n <div\n className=\"pointer-events-none absolute z-10 rounded-lg border border-slate-200 bg-white px-2.5 py-1.5 whitespace-nowrap shadow-md\"\n style={{ left: t.x, top: Math.max(26, t.y), transform: \"translate(-50%, calc(-100% - 8px))\" }}\n role=\"status\"\n >\n <span className=\"text-sm font-semibold text-slate-900\">{nf.format(t.waarde)}</span>\n <span className=\"ml-1.5 text-xs text-slate-500\">{t.titel}</span>\n </div>\n );\n}\n\n/** Recessief raster: haarlijnen op 50% en 100% van de schaal + de basislijn. */\nfunction Raster({ plotH }: { plotH: number }) {\n return (\n <div aria-hidden=\"true\" className=\"pointer-events-none absolute inset-x-0 top-0\" style={{ height: plotH }}>\n <div className=\"absolute inset-x-0\" style={{ top: 0, borderTop: `1px solid ${CHART.grid}` }} />\n <div className=\"absolute inset-x-0\" style={{ top: plotH / 2, borderTop: `1px solid ${CHART.grid}` }} />\n <div className=\"absolute inset-x-0\" style={{ top: plotH, borderTop: `1px solid ${CHART.as}` }} />\n </div>\n );\n}\n\n/**\n * Kolomgrafiek voor één maand: dag 1..N. `accentIndex` (bv. vandaag) kleurt één kolom in de\n * donkere stap van dezelfde ramp — zelfde reeks, gemarkeerd, geen tweede kleur.\n */\nexport function DagStaven({\n waarden,\n accentIndex,\n hoogte = 150,\n titel,\n labelVan,\n}: {\n /** Waarde per dag, index 0 = dag 1. */\n waarden: number[];\n accentIndex?: number;\n hoogte?: number;\n titel: string;\n /** Tooltiplabel per index (standaard \"dag N\"). */\n labelVan?: (i: number) => string;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const [tip, setTip] = useState<TooltipStand | null>(null);\n const [hover, setHover] = useState<number | null>(null);\n const uid = useId();\n\n const n = Math.max(1, waarden.length);\n const max = netteMax(Math.max(1, ...waarden));\n const plotH = hoogte - 18;\n const maxWaarde = Math.max(...waarden);\n const maxIdx = waarden.indexOf(maxWaarde);\n const label = labelVan ?? ((i: number) => `dag ${i + 1}`);\n\n const move = (i: number) => {\n const host = ref.current;\n if (!host) return;\n const r = host.getBoundingClientRect();\n setHover(i);\n setTip({ x: ((i + 0.5) / n) * r.width, y: plotH * (1 - waarden[i] / max), titel: label(i), waarde: waarden[i] });\n };\n const leave = () => {\n setHover(null);\n setTip(null);\n };\n\n return (\n <div ref={ref} className=\"relative\" role=\"img\" aria-labelledby={`${uid}-t`} style={{ height: hoogte }}>\n <span id={`${uid}-t`} className=\"sr-only\">{titel}</span>\n <Tooltip t={tip} />\n <Raster plotH={plotH} />\n {/* De kolommen zelf: flex-sloten met 2px lucht; de balk groeit vanaf de basislijn en is\n nooit dikker dan 24px — de rest van het slot blijft lucht. */}\n <div className=\"absolute inset-x-0 top-0 flex items-end\" style={{ height: plotH, gap: 2 }}>\n {waarden.map((v, i) => (\n <button\n key={i}\n type=\"button\"\n tabIndex={v > 0 ? 0 : -1}\n aria-label={`${label(i)}: ${nf.format(v)} weergaven`}\n className=\"flex h-full min-w-0 flex-1 cursor-default items-end justify-center focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600\"\n onPointerMove={() => move(i)}\n onFocus={() => move(i)}\n onPointerLeave={leave}\n onBlur={leave}\n >\n {v > 0 && (\n <span\n aria-hidden=\"true\"\n className=\"block w-full\"\n style={{\n maxWidth: 24,\n height: Math.max(3, (v / max) * (plotH - 6)),\n borderRadius: \"4px 4px 0 0\",\n background: i === accentIndex ? CHART.accent : CHART.serie,\n opacity: hover === null || hover === i ? 1 : 0.45,\n transition: \"opacity 0.1s\",\n }}\n />\n )}\n </button>\n ))}\n </div>\n {/* Daglabels: spaarzaam (1 · 10 · 20 · einde). */}\n <div aria-hidden=\"true\" className=\"pointer-events-none absolute inset-x-0\" style={{ top: plotH + 3 }}>\n {[0, 9, 19, n - 1]\n .filter((v, i, a) => v >= 0 && v < n && a.indexOf(v) === i)\n .map((i) => (\n <span key={i} className=\"absolute -translate-x-1/2 text-[10px] text-slate-500\" style={{ left: `${((i + 0.5) / n) * 100}%` }}>\n {i + 1}\n </span>\n ))}\n </div>\n {/* Selectief direct label: alleen de piek — de rest draagt de tooltip en de schaal-tick. */}\n {maxWaarde > 0 && hover === null && (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute -translate-x-1/2 text-[10px] font-medium text-slate-500\"\n style={{ left: `${((maxIdx + 0.5) / n) * 100}%`, top: Math.max(0, plotH * (1 - maxWaarde / max) - 16) }}\n >\n {nf.format(maxWaarde)}\n </span>\n )}\n <span aria-hidden=\"true\" className=\"pointer-events-none absolute -top-0.5 right-0 bg-white pl-1 text-[10px] text-slate-500\" style={{ fontVariantNumeric: \"tabular-nums\" }}>\n {nf.format(max)}\n </span>\n </div>\n );\n}\n\n/** Lijngrafiek over maanden: 2px lijn, wash-vulling, crosshair-tooltip, eindpunt gemarkeerd. */\nexport function MaandLijn({\n punten,\n hoogte = 150,\n titel,\n}: {\n punten: { label: string; waarde: number }[];\n hoogte?: number;\n titel: string;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const [tip, setTip] = useState<TooltipStand | null>(null);\n const [kruis, setKruis] = useState<number | null>(null);\n const uid = useId();\n\n const n = punten.length;\n const max = netteMax(Math.max(1, ...punten.map((p) => p.waarde)));\n const plotH = hoogte - 18;\n // x in procenten (2% marge), y in pixels — de SVG rekt alleen horizontaal.\n const px = (i: number) => (n === 1 ? 50 : 2 + (i / (n - 1)) * 96);\n const py = (v: number) => 6 + (plotH - 12) * (1 - v / max);\n const pad = punten.map((p, i) => `${i === 0 ? \"M\" : \"L\"} ${px(i)} ${py(p.waarde)}`).join(\" \");\n\n const move = (e: React.PointerEvent) => {\n const host = ref.current;\n if (!host || n === 0) return;\n const r = host.getBoundingClientRect();\n const fx = ((e.clientX - r.left) / r.width) * 100;\n const i = Math.max(0, Math.min(n - 1, Math.round(((fx - 2) / 96) * (n - 1))));\n setKruis(i);\n setTip({ x: (px(i) / 100) * r.width, y: py(punten[i].waarde), titel: punten[i].label, waarde: punten[i].waarde });\n };\n const leave = () => {\n setKruis(null);\n setTip(null);\n };\n\n if (n === 0) return null;\n const focus = kruis ?? n - 1;\n\n return (\n <div ref={ref} className=\"relative\" role=\"img\" aria-labelledby={`${uid}-t`} style={{ height: hoogte }} onPointerMove={move} onPointerLeave={leave}>\n <span id={`${uid}-t`} className=\"sr-only\">{titel}</span>\n <Tooltip t={tip} />\n <Raster plotH={plotH} />\n <svg viewBox={`0 0 100 ${plotH}`} preserveAspectRatio=\"none\" className=\"absolute inset-x-0 top-0 block w-full\" style={{ height: plotH }} aria-hidden=\"true\">\n {/* Wash onder de lijn: de seriekleur op 10% — een waas, nooit een vlak. */}\n <path d={`${pad} L ${px(n - 1)} ${plotH} L ${px(0)} ${plotH} Z`} fill={CHART.wash} />\n <path d={pad} fill=\"none\" stroke={CHART.serie} strokeWidth=\"2\" strokeLinejoin=\"round\" strokeLinecap=\"round\" vectorEffect=\"non-scaling-stroke\" />\n {kruis !== null && (\n <line x1={px(kruis)} x2={px(kruis)} y1=\"0\" y2={plotH} stroke={CHART.as} strokeWidth=\"1\" vectorEffect=\"non-scaling-stroke\" />\n )}\n </svg>\n {/* Punt als HTML-dot (8px + 2px witte ring): een SVG-cirkel vervormt onder de niet-uniforme\n schaal. Alleen het focuspunt draagt een dot — een dot op elk punt is ruis. */}\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute h-2 w-2 -translate-x-1/2 -translate-y-1/2 rounded-full\"\n style={{\n left: `${px(focus)}%`,\n top: py(punten[focus].waarde),\n background: focus === n - 1 ? CHART.accent : CHART.serie,\n boxShadow: \"0 0 0 2px #ffffff\",\n }}\n />\n <div aria-hidden=\"true\" className=\"pointer-events-none absolute inset-x-0\" style={{ top: plotH + 3 }}>\n {[0, Math.floor((n - 1) / 2), n - 1]\n .filter((v, i, a) => a.indexOf(v) === i)\n .map((i) => (\n <span\n key={i}\n className=\"absolute text-[10px] text-slate-500\"\n style={{ left: `${px(i)}%`, transform: i === 0 ? \"none\" : i === n - 1 ? \"translateX(-100%)\" : \"translateX(-50%)\" }}\n >\n {punten[i].label}\n </span>\n ))}\n </div>\n {/* Direct label op het eindpunt — de waarde waar het verhaal om draait. */}\n {kruis === null && (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute text-[11px] font-semibold text-slate-700\"\n style={{ left: `${px(n - 1)}%`, top: Math.max(0, py(punten[n - 1].waarde) - 20), transform: \"translateX(-100%)\" }}\n >\n {nf.format(punten[n - 1].waarde)}\n </span>\n )}\n <span aria-hidden=\"true\" className=\"pointer-events-none absolute -top-0.5 right-0 bg-white pl-1 text-[10px] text-slate-500\" style={{ fontVariantNumeric: \"tabular-nums\" }}>\n {nf.format(max)}\n </span>\n </div>\n );\n}\n\n/** Horizontale balkjeslijst (toppagina's): label · waarde · balk. De track is een lichtere stap\n * van dezelfde ramp, zodat einden vergelijkbaar zijn zonder raster. */\nexport function BalkjesLijst({ items }: { items: { label: string; waarde: number }[] }) {\n const max = Math.max(1, ...items.map((i) => i.waarde));\n return (\n <ul className=\"grid gap-2.5\">\n {items.map((it) => (\n <li key={it.label} className=\"grid grid-cols-[minmax(0,1fr)_auto] items-center gap-x-3 gap-y-1\">\n <span className=\"truncate text-sm text-slate-700\" title={it.label}>{it.label}</span>\n <span className=\"text-sm font-medium text-slate-900\" style={{ fontVariantNumeric: \"tabular-nums\" }}>\n {nf.format(it.waarde)}\n </span>\n <span aria-hidden=\"true\" className=\"col-span-2 block h-1.5 w-full overflow-hidden rounded-full\" style={{ background: CHART.track }}>\n <span className=\"block h-full rounded-full\" style={{ width: `${(it.waarde / max) * 100}%`, background: CHART.serie }} />\n </span>\n </li>\n ))}\n </ul>\n );\n}\n\n/** Stat-tegel: label · grote waarde (proportionele cijfers) · optionele delta t.o.v. een genoemde periode. */\nexport function StatTegel({\n label,\n waarde,\n delta,\n deltaLabel,\n}: {\n label: string;\n waarde: number | string;\n /** Relatief verschil in procenten (bv. +12) — kleur volgt de richting (meer bezoek = goed). */\n delta?: number | null;\n deltaLabel?: string;\n}) {\n return (\n <div className=\"rounded-xl border border-slate-200 bg-white p-4\">\n <p className=\"text-sm text-slate-500\">{label}</p>\n <p className=\"mt-1 text-3xl font-semibold text-slate-900\">\n {typeof waarde === \"number\" ? nf.format(waarde) : waarde}\n </p>\n {delta != null && Number.isFinite(delta) && (\n <p className={`mt-1 text-xs font-medium ${delta >= 0 ? \"text-emerald-700\" : \"text-red-700\"}`}>\n <span aria-hidden=\"true\">{delta >= 0 ? \"▲\" : \"▼\"}</span> {Math.abs(Math.round(delta))}%\n {deltaLabel ? <span className=\"font-normal text-slate-500\"> {deltaLabel}</span> : null}\n </p>\n )}\n </div>\n );\n}\n\n/** Toegankelijke tabelweergave achter een uitklapper — alles wat een grafiek toont, zonder muis. */\nexport function AlsTabel({ kop, rijen }: { kop: [string, string]; rijen: [string, number][] }) {\n return (\n <details className=\"mt-2\">\n <summary className=\"cursor-pointer text-xs text-slate-500 hover:text-slate-600\">Bekijk als tabel</summary>\n <table className=\"mt-2 w-full text-sm\">\n <thead>\n <tr className=\"text-left text-xs text-slate-500\">\n <th className=\"py-1 font-medium\">{kop[0]}</th>\n <th className=\"py-1 text-right font-medium\">{kop[1]}</th>\n </tr>\n </thead>\n <tbody>\n {rijen.map(([l, w]) => (\n <tr key={l} className=\"border-t border-slate-100\">\n <td className=\"py-1 text-slate-700\">{l}</td>\n <td className=\"py-1 text-right text-slate-900\" style={{ fontVariantNumeric: \"tabular-nums\" }}>{nf.format(w)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </details>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ButtonHTMLAttributes, type InputHTMLAttributes, type TextareaHTMLAttributes } from "react";
|
|
1
|
+
import { type ButtonHTMLAttributes, type InputHTMLAttributes, type ReactNode, type TextareaHTMLAttributes } from "react";
|
|
2
2
|
/**
|
|
3
3
|
* Admin-primitieven op het **Astryx design system**. Form-controls (Input/Textarea) renderen echte
|
|
4
4
|
* Astryx-componenten; bijzondere input-types (datetime-local, file…) die Astryx niet kent vallen
|
|
@@ -6,21 +6,31 @@ import { type ButtonHTMLAttributes, type InputHTMLAttributes, type TextareaHTMLA
|
|
|
6
6
|
* Astryx-huisstijl) — bewust geen Astryx Button (die werkt op `label`/`clickAction` i.p.v. children/
|
|
7
7
|
* onClick, wat de ~honderd editor-call-sites zou breken). De API blijft gelijk → robuust.
|
|
8
8
|
*/
|
|
9
|
-
type Variant = "primary" | "secondary" | "ghost" | "danger";
|
|
9
|
+
type Variant = "primary" | "secondary" | "ghost" | "danger" | "dangerGhost";
|
|
10
10
|
type Size = "sm" | "md";
|
|
11
11
|
export declare const Button: import("react").ForwardRefExoticComponent<ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
12
12
|
variant?: Variant;
|
|
13
13
|
size?: Size;
|
|
14
|
+
/**
|
|
15
|
+
* 8.12: bezig. Toont een draaiertje vóór het label en zet de knop uit — het label blijft staan.
|
|
16
|
+
* Tot nu toe werd de tekst "Bezig…": de knop sprong van breedte en je zag niet meer wát er bezig was.
|
|
17
|
+
*/
|
|
18
|
+
loading?: boolean;
|
|
14
19
|
} & import("react").RefAttributes<HTMLButtonElement>>;
|
|
15
20
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* `Field`; hier dus `isLabelHidden`.
|
|
21
|
+
* Een lege lijst als uitnodiging (8.12): icoon, één zin en de eerste stap — in plaats van een kale
|
|
22
|
+
* grijze regel "Nog geen media." waar de klant niets mee kon.
|
|
19
23
|
*/
|
|
24
|
+
export declare function LegeStaat({ titel, tekst, actie }: {
|
|
25
|
+
titel: string;
|
|
26
|
+
tekst?: ReactNode;
|
|
27
|
+
actie?: ReactNode;
|
|
28
|
+
}): import("react").JSX.Element;
|
|
29
|
+
export declare function useFieldLabel(fallback: string): string;
|
|
20
30
|
export declare const Input: import("react").ForwardRefExoticComponent<InputHTMLAttributes<HTMLInputElement> & import("react").RefAttributes<HTMLInputElement>>;
|
|
21
31
|
export declare const Textarea: import("react").ForwardRefExoticComponent<TextareaHTMLAttributes<HTMLTextAreaElement> & import("react").RefAttributes<HTMLTextAreaElement>>;
|
|
22
32
|
/** Label-wrapper. Een `<div>` (geen `<label>`) zodat het geen geneste label vormt met de
|
|
23
|
-
* Astryx-controls
|
|
33
|
+
* Astryx-controls; het label gaat via context naar de control zelf (toegankelijke naam). */
|
|
24
34
|
export declare function Field({ label, children, hint }: {
|
|
25
35
|
label: string;
|
|
26
36
|
children: React.ReactNode;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { forwardRef } from "react";
|
|
3
|
+
import { createContext, forwardRef, useContext } from "react";
|
|
4
4
|
import { cn } from "./cn.js";
|
|
5
5
|
import { TextInput } from "@astryxdesign/core/TextInput";
|
|
6
6
|
import { NumberInput } from "@astryxdesign/core/NumberInput";
|
|
@@ -9,7 +9,9 @@ const VARIANT_STYLE = {
|
|
|
9
9
|
primary: { background: "var(--color-accent)", color: "var(--color-on-accent, #fff)" },
|
|
10
10
|
secondary: { background: "var(--color-background-muted)", color: "var(--color-text-primary)", border: "1px solid var(--color-border)" },
|
|
11
11
|
ghost: { background: "transparent", color: "var(--color-text-primary)" },
|
|
12
|
-
danger: { background: "var(--color-error, #dc2626)", color: "#fff" }
|
|
12
|
+
danger: { background: "var(--color-error, #dc2626)", color: "#fff" },
|
|
13
|
+
/** Verwijderen binnen een lijst (8.2): rustig, maar herkenbaar rood. Eén stijl i.p.v. drie. */
|
|
14
|
+
dangerGhost: { background: "transparent", color: "var(--color-error, #b91c1c)" }
|
|
13
15
|
};
|
|
14
16
|
const SIZES = {
|
|
15
17
|
sm: "h-8 px-3 text-sm",
|
|
@@ -21,51 +23,94 @@ const controlStyle = {
|
|
|
21
23
|
background: "var(--color-background-body, #fff)",
|
|
22
24
|
color: "var(--color-text-primary)"
|
|
23
25
|
};
|
|
24
|
-
const Button = forwardRef(function Button2({ className, variant = "primary", size = "md", style, ...props }, ref) {
|
|
25
|
-
return /* @__PURE__ */
|
|
26
|
+
const Button = forwardRef(function Button2({ className, variant = "primary", size = "md", style, loading, disabled, children, ...props }, ref) {
|
|
27
|
+
return /* @__PURE__ */ jsxs(
|
|
26
28
|
"button",
|
|
27
29
|
{
|
|
28
30
|
ref,
|
|
29
31
|
className: cn(
|
|
30
|
-
"inline-flex items-center justify-center gap-2 font-medium transition-[filter] hover:brightness-95
|
|
32
|
+
"xicms-admin-btn inline-flex items-center justify-center gap-2 font-medium transition-[filter] hover:brightness-95 disabled:cursor-not-allowed disabled:opacity-50",
|
|
31
33
|
SIZES[size],
|
|
34
|
+
loading && "disabled:opacity-80",
|
|
32
35
|
className
|
|
33
36
|
),
|
|
34
37
|
style: { borderRadius: "var(--radius-element, 8px)", ...VARIANT_STYLE[variant], ...style },
|
|
35
|
-
|
|
38
|
+
disabled: disabled || loading,
|
|
39
|
+
"aria-busy": loading || void 0,
|
|
40
|
+
...props,
|
|
41
|
+
children: [
|
|
42
|
+
loading && /* @__PURE__ */ jsx("span", { className: "xicms-admin-spinner", "aria-hidden": true }),
|
|
43
|
+
children
|
|
44
|
+
]
|
|
36
45
|
}
|
|
37
46
|
);
|
|
38
47
|
});
|
|
48
|
+
function LegeStaat({ titel, tekst, actie }) {
|
|
49
|
+
return /* @__PURE__ */ jsxs("div", { className: "col-span-full grid justify-items-center gap-2 rounded-xl border border-dashed border-slate-300 px-4 py-8 text-center", children: [
|
|
50
|
+
/* @__PURE__ */ jsx("span", { className: "grid h-10 w-10 place-items-center rounded-full bg-slate-100 text-slate-500", "aria-hidden": true, children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", width: "20", height: "20", fill: "none", stroke: "currentColor", strokeWidth: "1.6", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M4 7h16v12H4z M4 7l2-3h12l2 3 M9 12h6" }) }) }),
|
|
51
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-slate-700", children: titel }),
|
|
52
|
+
tekst && /* @__PURE__ */ jsx("p", { className: "max-w-sm text-sm text-slate-500", children: tekst }),
|
|
53
|
+
actie && /* @__PURE__ */ jsx("div", { className: "mt-1", children: actie })
|
|
54
|
+
] });
|
|
55
|
+
}
|
|
39
56
|
function syntheticEvent(value) {
|
|
40
57
|
return { target: { value }, currentTarget: { value } };
|
|
41
58
|
}
|
|
59
|
+
const FieldLabelContext = createContext(null);
|
|
60
|
+
function useFieldLabel(fallback) {
|
|
61
|
+
return useContext(FieldLabelContext) ?? fallback;
|
|
62
|
+
}
|
|
63
|
+
function doorgeef(rest) {
|
|
64
|
+
const uit = {};
|
|
65
|
+
for (const [k, v] of Object.entries(rest)) {
|
|
66
|
+
if (v === void 0) continue;
|
|
67
|
+
if (["id", "onBlur", "onFocus", "onKeyDown", "onPaste", "title", "role", "tabIndex"].includes(k) || k.startsWith("aria-") || k.startsWith("data-")) {
|
|
68
|
+
uit[k] = v;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return uit;
|
|
72
|
+
}
|
|
73
|
+
const TEXT_TYPES = /* @__PURE__ */ new Set(["text", "email", "password"]);
|
|
42
74
|
const Input = forwardRef(
|
|
43
|
-
function Input2({ className, style, type = "text", value, onChange, placeholder, ...rest }, ref) {
|
|
44
|
-
const lbl = rest["aria-label"] || placeholder || "
|
|
75
|
+
function Input2({ className, style, type = "text", value, onChange, placeholder, readOnly, disabled, required, name, autoFocus, autoComplete, maxLength, min, max, step, ...rest }, ref) {
|
|
76
|
+
const lbl = useFieldLabel(rest["aria-label"] || placeholder || "Invoer");
|
|
77
|
+
const gemeen = {
|
|
78
|
+
ref,
|
|
79
|
+
label: lbl,
|
|
80
|
+
isLabelHidden: true,
|
|
81
|
+
placeholder,
|
|
82
|
+
isReadOnly: readOnly || void 0,
|
|
83
|
+
isDisabled: disabled || void 0,
|
|
84
|
+
isRequired: required || void 0,
|
|
85
|
+
htmlName: name,
|
|
86
|
+
hasAutoFocus: autoFocus || void 0,
|
|
87
|
+
autoComplete,
|
|
88
|
+
containerClassName: className,
|
|
89
|
+
containerStyle: style,
|
|
90
|
+
...doorgeef(rest)
|
|
91
|
+
};
|
|
45
92
|
if (type === "number") {
|
|
93
|
+
const getal = (x) => x === void 0 || x === "" ? void 0 : Number(x);
|
|
46
94
|
return /* @__PURE__ */ jsx(
|
|
47
95
|
NumberInput,
|
|
48
96
|
{
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
97
|
+
...gemeen,
|
|
98
|
+
min: getal(min),
|
|
99
|
+
max: getal(max),
|
|
100
|
+
step: getal(step),
|
|
53
101
|
value: value === "" || value == null ? void 0 : Number(value),
|
|
54
102
|
onChange: (n) => onChange?.(syntheticEvent(n == null ? "" : String(n)))
|
|
55
103
|
}
|
|
56
104
|
);
|
|
57
105
|
}
|
|
58
|
-
if (type
|
|
106
|
+
if (TEXT_TYPES.has(type)) {
|
|
59
107
|
return /* @__PURE__ */ jsx(
|
|
60
108
|
TextInput,
|
|
61
109
|
{
|
|
62
|
-
|
|
63
|
-
label: lbl,
|
|
64
|
-
isLabelHidden: true,
|
|
110
|
+
...gemeen,
|
|
65
111
|
type,
|
|
66
|
-
placeholder,
|
|
67
112
|
value: String(value ?? ""),
|
|
68
|
-
onChange: (v) => onChange?.(syntheticEvent(v))
|
|
113
|
+
onChange: (v) => onChange?.(syntheticEvent(maxLength != null && maxLength >= 0 ? v.slice(0, maxLength) : v))
|
|
69
114
|
}
|
|
70
115
|
);
|
|
71
116
|
}
|
|
@@ -77,7 +122,18 @@ const Input = forwardRef(
|
|
|
77
122
|
value,
|
|
78
123
|
onChange,
|
|
79
124
|
placeholder,
|
|
80
|
-
|
|
125
|
+
readOnly,
|
|
126
|
+
disabled,
|
|
127
|
+
required,
|
|
128
|
+
name,
|
|
129
|
+
autoFocus,
|
|
130
|
+
autoComplete,
|
|
131
|
+
maxLength,
|
|
132
|
+
min,
|
|
133
|
+
max,
|
|
134
|
+
step,
|
|
135
|
+
"aria-label": lbl,
|
|
136
|
+
className: cn("xicms-admin-native h-10 w-full px-3 text-sm", className),
|
|
81
137
|
style: { ...controlStyle, ...style },
|
|
82
138
|
...rest
|
|
83
139
|
}
|
|
@@ -85,26 +141,40 @@ const Input = forwardRef(
|
|
|
85
141
|
}
|
|
86
142
|
);
|
|
87
143
|
const Textarea = forwardRef(
|
|
88
|
-
function Textarea2({ value, onChange, placeholder, rows = 4,
|
|
89
|
-
|
|
144
|
+
function Textarea2({ value, onChange, placeholder, rows = 4, className, style, readOnly, disabled, required, name, autoFocus, autoComplete, maxLength, spellCheck, ...rest }, ref) {
|
|
145
|
+
const lbl = useFieldLabel(rest["aria-label"] || placeholder || "Tekst");
|
|
90
146
|
return /* @__PURE__ */ jsx(
|
|
91
147
|
TextArea,
|
|
92
148
|
{
|
|
93
149
|
ref,
|
|
94
|
-
label:
|
|
150
|
+
label: lbl,
|
|
95
151
|
isLabelHidden: true,
|
|
96
152
|
rows,
|
|
97
153
|
placeholder,
|
|
154
|
+
isReadOnly: readOnly || void 0,
|
|
155
|
+
isDisabled: disabled || void 0,
|
|
156
|
+
isRequired: required || void 0,
|
|
157
|
+
htmlName: name,
|
|
158
|
+
hasAutoFocus: autoFocus || void 0,
|
|
159
|
+
autoComplete,
|
|
160
|
+
maxLength,
|
|
161
|
+
hasSpellCheck: spellCheck === void 0 ? void 0 : Boolean(spellCheck),
|
|
162
|
+
containerClassName: className,
|
|
163
|
+
containerStyle: style,
|
|
164
|
+
...doorgeef(rest),
|
|
98
165
|
value: String(value ?? ""),
|
|
99
|
-
onChange: (
|
|
166
|
+
onChange: (raw) => {
|
|
167
|
+
const v = maxLength != null && maxLength >= 0 ? raw.slice(0, maxLength) : raw;
|
|
168
|
+
onChange?.({ target: { value: v }, currentTarget: { value: v } });
|
|
169
|
+
}
|
|
100
170
|
}
|
|
101
171
|
);
|
|
102
172
|
}
|
|
103
173
|
);
|
|
104
174
|
function Field({ label, children, hint }) {
|
|
105
175
|
return /* @__PURE__ */ jsxs("div", { className: "grid gap-1.5", children: [
|
|
106
|
-
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", style: { color: "var(--color-text-primary)" }, children: label }),
|
|
107
|
-
children,
|
|
176
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", style: { color: "var(--color-text-primary)" }, "aria-hidden": true, children: label }),
|
|
177
|
+
/* @__PURE__ */ jsx(FieldLabelContext.Provider, { value: label, children }),
|
|
108
178
|
hint && /* @__PURE__ */ jsx("span", { className: "text-xs", style: { color: "var(--color-text-secondary)" }, children: hint })
|
|
109
179
|
] });
|
|
110
180
|
}
|
|
@@ -132,6 +202,8 @@ export {
|
|
|
132
202
|
Card,
|
|
133
203
|
Field,
|
|
134
204
|
Input,
|
|
135
|
-
|
|
205
|
+
LegeStaat,
|
|
206
|
+
Textarea,
|
|
207
|
+
useFieldLabel
|
|
136
208
|
};
|
|
137
209
|
//# sourceMappingURL=primitives.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/admin/ui/primitives.tsx"],"sourcesContent":["\"use client\";\n\nimport { forwardRef, type ButtonHTMLAttributes, type ChangeEvent, type CSSProperties, type InputHTMLAttributes, type TextareaHTMLAttributes } from \"react\";\nimport { cn } from \"./cn\";\nimport { TextInput } from \"@astryxdesign/core/TextInput\";\nimport { NumberInput } from \"@astryxdesign/core/NumberInput\";\nimport { TextArea } from \"@astryxdesign/core/TextArea\";\n\n/**\n * Admin-primitieven op het **Astryx design system**. Form-controls (Input/Textarea) renderen echte\n * Astryx-componenten; bijzondere input-types (datetime-local, file…) die Astryx niet kent vallen\n * robuust terug op een token-gestylede native input. Button/Card/Badge zijn token-gestyled (zelfde\n * Astryx-huisstijl) — bewust geen Astryx Button (die werkt op `label`/`clickAction` i.p.v. children/\n * onClick, wat de ~honderd editor-call-sites zou breken). De API blijft gelijk → robuust.\n */\n\ntype Variant = \"primary\" | \"secondary\" | \"ghost\" | \"danger\";\ntype Size = \"sm\" | \"md\";\n\nconst VARIANT_STYLE: Record<Variant, CSSProperties> = {\n primary: { background: \"var(--color-accent)\", color: \"var(--color-on-accent, #fff)\" },\n secondary: { background: \"var(--color-background-muted)\", color: \"var(--color-text-primary)\", border: \"1px solid var(--color-border)\" },\n ghost: { background: \"transparent\", color: \"var(--color-text-primary)\" },\n danger: { background: \"var(--color-error, #dc2626)\", color: \"#fff\" },\n};\nconst SIZES: Record<Size, string> = {\n sm: \"h-8 px-3 text-sm\",\n md: \"h-10 px-4 text-sm\",\n};\n\nconst controlStyle: CSSProperties = {\n borderRadius: \"var(--radius-element, 8px)\",\n border: \"1px solid var(--color-border)\",\n background: \"var(--color-background-body, #fff)\",\n color: \"var(--color-text-primary)\",\n};\n\nexport const Button = forwardRef<\n HTMLButtonElement,\n ButtonHTMLAttributes<HTMLButtonElement> & { variant?: Variant; size?: Size }\n>(function Button({ className, variant = \"primary\", size = \"md\", style, ...props }, ref) {\n return (\n <button\n ref={ref}\n className={cn(\n \"inline-flex items-center justify-center gap-2 font-medium transition-[filter] hover:brightness-95 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50\",\n SIZES[size],\n className,\n )}\n style={{ borderRadius: \"var(--radius-element, 8px)\", ...VARIANT_STYLE[variant], ...style }}\n {...props}\n />\n );\n});\n\n/** Bouwt een minimale synthetische change-event zodat bestaande `onChange={(e)=>…e.target.value}` blijft werken. */\nfunction syntheticEvent(value: string) {\n return { target: { value }, currentTarget: { value } } as unknown as ChangeEvent<HTMLInputElement>;\n}\n\n/**\n * Tekstinvoer. text/email → Astryx TextInput; number → Astryx NumberInput; overige types\n * (datetime-local, search, …) → token-gestylede native input. Het label komt van het omliggende\n * `Field`; hier dus `isLabelHidden`.\n */\nexport const Input = forwardRef<HTMLInputElement, InputHTMLAttributes<HTMLInputElement>>(\n function Input({ className, style, type = \"text\", value, onChange, placeholder, ...rest }, ref) {\n const lbl = (rest[\"aria-label\"] as string) || placeholder || \"Veld\";\n if (type === \"number\") {\n return (\n <NumberInput\n ref={ref}\n label={lbl}\n isLabelHidden\n placeholder={placeholder}\n value={value === \"\" || value == null ? undefined : Number(value)}\n onChange={(n) => onChange?.(syntheticEvent(n == null ? \"\" : String(n)))}\n />\n );\n }\n if (type === \"text\" || type === \"email\" || type === \"password\") {\n return (\n <TextInput\n ref={ref}\n label={lbl}\n isLabelHidden\n type={type as \"text\" | \"email\" | \"password\"}\n placeholder={placeholder}\n value={String(value ?? \"\")}\n onChange={(v) => onChange?.(syntheticEvent(v))}\n />\n );\n }\n // datetime-local, search, url, file, … → native, in de Astryx-huisstijl getokeniseerd.\n return (\n <input\n ref={ref}\n type={type}\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n className={cn(\"h-10 w-full px-3 text-sm outline-none focus:ring-2\", className)}\n style={{ ...controlStyle, ...style }}\n {...rest}\n />\n );\n },\n);\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaHTMLAttributes<HTMLTextAreaElement>>(\n function Textarea({ value, onChange, placeholder, rows = 4, \"aria-label\": ariaLabel, ...rest }, ref) {\n void rest;\n return (\n <TextArea\n ref={ref}\n label={(ariaLabel as string) || placeholder || \"Tekst\"}\n isLabelHidden\n rows={rows}\n placeholder={placeholder}\n value={String(value ?? \"\")}\n onChange={(v) =>\n onChange?.({ target: { value: v }, currentTarget: { value: v } } as unknown as ChangeEvent<HTMLTextAreaElement>)\n }\n />\n );\n },\n);\n\n/** Label-wrapper. Een `<div>` (geen `<label>`) zodat het geen geneste label vormt met de\n * Astryx-controls (die hun eigen, verborgen label dragen). */\nexport function Field({ label, children, hint }: { label: string; children: React.ReactNode; hint?: string }) {\n return (\n <div className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium\" style={{ color: \"var(--color-text-primary)\" }}>{label}</span>\n {children}\n {hint && <span className=\"text-xs\" style={{ color: \"var(--color-text-secondary)\" }}>{hint}</span>}\n </div>\n );\n}\n\nexport function Card({ className, children }: { className?: string; children: React.ReactNode }) {\n return (\n <div\n className={cn(\"p-5\", className)}\n style={{ borderRadius: \"var(--radius-container, 14px)\", border: \"1px solid var(--color-border)\", background: \"var(--color-background-card)\" }}\n >\n {children}\n </div>\n );\n}\n\nexport function Badge({ children, tone = \"slate\" }: { children: React.ReactNode; tone?: \"slate\" | \"green\" | \"amber\" }) {\n const tones: Record<string, CSSProperties> = {\n slate: { background: \"var(--color-background-muted)\", color: \"var(--color-text-secondary)\" },\n green: { background: \"var(--color-background-green, #dcfce7)\", color: \"var(--color-text-green, #15803d)\" },\n amber: { background: \"var(--color-background-orange, #ffedd5)\", color: \"var(--color-text-orange, #c2410c)\" },\n };\n return (\n <span className=\"rounded-full px-2 py-0.5 text-xs font-medium\" style={tones[tone]}>\n {children}\n </span>\n );\n}\n"],"mappings":"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","names":["Button","Input","Textarea"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/ui/primitives.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, forwardRef, useContext, type ButtonHTMLAttributes, type ChangeEvent, type CSSProperties, type InputHTMLAttributes, type ReactNode, type TextareaHTMLAttributes } from \"react\";\nimport { cn } from \"./cn\";\nimport { TextInput } from \"@astryxdesign/core/TextInput\";\nimport { NumberInput } from \"@astryxdesign/core/NumberInput\";\nimport { TextArea } from \"@astryxdesign/core/TextArea\";\n\n/**\n * Admin-primitieven op het **Astryx design system**. Form-controls (Input/Textarea) renderen echte\n * Astryx-componenten; bijzondere input-types (datetime-local, file…) die Astryx niet kent vallen\n * robuust terug op een token-gestylede native input. Button/Card/Badge zijn token-gestyled (zelfde\n * Astryx-huisstijl) — bewust geen Astryx Button (die werkt op `label`/`clickAction` i.p.v. children/\n * onClick, wat de ~honderd editor-call-sites zou breken). De API blijft gelijk → robuust.\n */\n\ntype Variant = \"primary\" | \"secondary\" | \"ghost\" | \"danger\" | \"dangerGhost\";\ntype Size = \"sm\" | \"md\";\n\nconst VARIANT_STYLE: Record<Variant, CSSProperties> = {\n primary: { background: \"var(--color-accent)\", color: \"var(--color-on-accent, #fff)\" },\n secondary: { background: \"var(--color-background-muted)\", color: \"var(--color-text-primary)\", border: \"1px solid var(--color-border)\" },\n ghost: { background: \"transparent\", color: \"var(--color-text-primary)\" },\n danger: { background: \"var(--color-error, #dc2626)\", color: \"#fff\" },\n /** Verwijderen binnen een lijst (8.2): rustig, maar herkenbaar rood. Eén stijl i.p.v. drie. */\n dangerGhost: { background: \"transparent\", color: \"var(--color-error, #b91c1c)\" },\n};\nconst SIZES: Record<Size, string> = {\n sm: \"h-8 px-3 text-sm\",\n md: \"h-10 px-4 text-sm\",\n};\n\nconst controlStyle: CSSProperties = {\n borderRadius: \"var(--radius-element, 8px)\",\n border: \"1px solid var(--color-border)\",\n background: \"var(--color-background-body, #fff)\",\n color: \"var(--color-text-primary)\",\n};\n\nexport const Button = forwardRef<\n HTMLButtonElement,\n ButtonHTMLAttributes<HTMLButtonElement> & {\n variant?: Variant;\n size?: Size;\n /**\n * 8.12: bezig. Toont een draaiertje vóór het label en zet de knop uit — het label blijft staan.\n * Tot nu toe werd de tekst \"Bezig…\": de knop sprong van breedte en je zag niet meer wát er bezig was.\n */\n loading?: boolean;\n }\n>(function Button({ className, variant = \"primary\", size = \"md\", style, loading, disabled, children, ...props }, ref) {\n return (\n <button\n ref={ref}\n className={cn(\n \"xicms-admin-btn inline-flex items-center justify-center gap-2 font-medium transition-[filter] hover:brightness-95 disabled:cursor-not-allowed disabled:opacity-50\",\n SIZES[size],\n loading && \"disabled:opacity-80\",\n className,\n )}\n style={{ borderRadius: \"var(--radius-element, 8px)\", ...VARIANT_STYLE[variant], ...style }}\n disabled={disabled || loading}\n aria-busy={loading || undefined}\n {...props}\n >\n {loading && <span className=\"xicms-admin-spinner\" aria-hidden />}\n {children}\n </button>\n );\n});\n\n/**\n * Een lege lijst als uitnodiging (8.12): icoon, één zin en de eerste stap — in plaats van een kale\n * grijze regel \"Nog geen media.\" waar de klant niets mee kon.\n */\nexport function LegeStaat({ titel, tekst, actie }: { titel: string; tekst?: ReactNode; actie?: ReactNode }) {\n return (\n <div className=\"col-span-full grid justify-items-center gap-2 rounded-xl border border-dashed border-slate-300 px-4 py-8 text-center\">\n <span className=\"grid h-10 w-10 place-items-center rounded-full bg-slate-100 text-slate-500\" aria-hidden>\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 7h16v12H4z M4 7l2-3h12l2 3 M9 12h6\" />\n </svg>\n </span>\n <p className=\"text-sm font-medium text-slate-700\">{titel}</p>\n {tekst && <p className=\"max-w-sm text-sm text-slate-500\">{tekst}</p>}\n {actie && <div className=\"mt-1\">{actie}</div>}\n </div>\n );\n}\n\n/** Bouwt een minimale synthetische change-event zodat bestaande `onChange={(e)=>…e.target.value}` blijft werken. */\nfunction syntheticEvent(value: string) {\n return { target: { value }, currentTarget: { value } } as unknown as ChangeEvent<HTMLInputElement>;\n}\n\n/**\n * Het label van het omliggende `Field` (8.0). Vroeger kregen controls `aria-label = placeholder ||\n * \"Veld\"`, dus een schermlezer hoorde \"Veld\" of \"bv. Over ons\" in plaats van \"Paginatitel\". Nu\n * geeft `Field` zijn label door en draagt de Astryx-control het als (visueel verborgen) label.\n */\nconst FieldLabelContext = createContext<string | null>(null);\nexport function useFieldLabel(fallback: string): string {\n return useContext(FieldLabelContext) ?? fallback;\n}\n\n/**\n * DOM-props die Astryx' inputs gewoon doorgeven (via BaseProps). Tot 8.0 gooiden `Input` en\n * `Textarea` álles behalve value/onChange/placeholder weg: `onBlur` (alt-tekst opslaan, adres\n * normaliseren), `readOnly` (previewlink), `disabled` en `className` deden stilletjes niets.\n */\ntype Doorgeef = Pick<\n InputHTMLAttributes<HTMLElement>,\n \"id\" | \"onBlur\" | \"onFocus\" | \"onKeyDown\" | \"onPaste\" | \"title\" | \"role\" | \"tabIndex\" | \"aria-describedby\" | \"aria-invalid\"\n>;\nfunction doorgeef(rest: Record<string, unknown>): Doorgeef & Record<`data-${string}`, unknown> {\n const uit: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(rest)) {\n if (v === undefined) continue;\n if ([\"id\", \"onBlur\", \"onFocus\", \"onKeyDown\", \"onPaste\", \"title\", \"role\", \"tabIndex\"].includes(k) || k.startsWith(\"aria-\") || k.startsWith(\"data-\")) {\n uit[k] = v;\n }\n }\n return uit as Doorgeef & Record<`data-${string}`, unknown>;\n}\n\n/**\n * Tekstinvoer. text/email/password → Astryx TextInput (meer types kent die niet); number → Astryx NumberInput;\n * overige types (tel, url, datetime-local, date, file, …) → token-gestylede native input. Het zichtbare label\n * komt van het omliggende `Field`; hier dus `isLabelHidden`.\n */\nconst TEXT_TYPES = new Set([\"text\", \"email\", \"password\"]);\n\nexport const Input = forwardRef<HTMLInputElement, InputHTMLAttributes<HTMLInputElement>>(\n function Input(\n { className, style, type = \"text\", value, onChange, placeholder, readOnly, disabled, required, name, autoFocus, autoComplete, maxLength, min, max, step, ...rest },\n ref,\n ) {\n const lbl = useFieldLabel((rest[\"aria-label\"] as string) || placeholder || \"Invoer\");\n const gemeen = {\n ref,\n label: lbl,\n isLabelHidden: true,\n placeholder,\n isReadOnly: readOnly || undefined,\n isDisabled: disabled || undefined,\n isRequired: required || undefined,\n htmlName: name,\n hasAutoFocus: autoFocus || undefined,\n autoComplete,\n containerClassName: className,\n containerStyle: style,\n ...doorgeef(rest),\n };\n if (type === \"number\") {\n const getal = (x: unknown) => (x === undefined || x === \"\" ? undefined : Number(x));\n return (\n <NumberInput\n {...gemeen}\n min={getal(min)}\n max={getal(max)}\n step={getal(step)}\n value={value === \"\" || value == null ? undefined : Number(value)}\n onChange={(n) => onChange?.(syntheticEvent(n == null ? \"\" : String(n)))}\n />\n );\n }\n if (TEXT_TYPES.has(type)) {\n return (\n <TextInput\n {...gemeen}\n type={type as \"text\" | \"email\" | \"password\"}\n value={String(value ?? \"\")}\n // TextInput kent geen maxLength; afkappen hier houdt dezelfde belofte.\n onChange={(v) => onChange?.(syntheticEvent(maxLength != null && maxLength >= 0 ? v.slice(0, maxLength) : v))}\n />\n );\n }\n // datetime-local, date, file, … → native, in de Astryx-huisstijl getokeniseerd.\n return (\n <input\n ref={ref}\n type={type}\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n readOnly={readOnly}\n disabled={disabled}\n required={required}\n name={name}\n autoFocus={autoFocus}\n autoComplete={autoComplete}\n maxLength={maxLength}\n min={min}\n max={max}\n step={step}\n aria-label={lbl}\n className={cn(\"xicms-admin-native h-10 w-full px-3 text-sm\", className)}\n style={{ ...controlStyle, ...style }}\n {...rest}\n />\n );\n },\n);\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaHTMLAttributes<HTMLTextAreaElement>>(\n function Textarea(\n { value, onChange, placeholder, rows = 4, className, style, readOnly, disabled, required, name, autoFocus, autoComplete, maxLength, spellCheck, ...rest },\n ref,\n ) {\n const lbl = useFieldLabel((rest[\"aria-label\"] as string) || placeholder || \"Tekst\");\n return (\n <TextArea\n ref={ref}\n label={lbl}\n isLabelHidden\n rows={rows}\n placeholder={placeholder}\n isReadOnly={readOnly || undefined}\n isDisabled={disabled || undefined}\n isRequired={required || undefined}\n htmlName={name}\n hasAutoFocus={autoFocus || undefined}\n autoComplete={autoComplete}\n maxLength={maxLength}\n hasSpellCheck={spellCheck === undefined ? undefined : Boolean(spellCheck)}\n containerClassName={className}\n containerStyle={style}\n {...doorgeef(rest)}\n value={String(value ?? \"\")}\n // Astryx toont bij maxLength een teller, maar dwingt niet af; afkappen houdt de belofte.\n onChange={(raw) => {\n const v = maxLength != null && maxLength >= 0 ? raw.slice(0, maxLength) : raw;\n onChange?.({ target: { value: v }, currentTarget: { value: v } } as unknown as ChangeEvent<HTMLTextAreaElement>);\n }}\n />\n );\n },\n);\n\n/** Label-wrapper. Een `<div>` (geen `<label>`) zodat het geen geneste label vormt met de\n * Astryx-controls; het label gaat via context naar de control zelf (toegankelijke naam). */\nexport function Field({ label, children, hint }: { label: string; children: React.ReactNode; hint?: string }) {\n return (\n <div className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium\" style={{ color: \"var(--color-text-primary)\" }} aria-hidden>\n {label}\n </span>\n <FieldLabelContext.Provider value={label}>{children}</FieldLabelContext.Provider>\n {hint && <span className=\"text-xs\" style={{ color: \"var(--color-text-secondary)\" }}>{hint}</span>}\n </div>\n );\n}\n\nexport function Card({ className, children }: { className?: string; children: React.ReactNode }) {\n return (\n <div\n className={cn(\"p-5\", className)}\n style={{ borderRadius: \"var(--radius-container, 14px)\", border: \"1px solid var(--color-border)\", background: \"var(--color-background-card)\" }}\n >\n {children}\n </div>\n );\n}\n\nexport function Badge({ children, tone = \"slate\" }: { children: React.ReactNode; tone?: \"slate\" | \"green\" | \"amber\" }) {\n const tones: Record<string, CSSProperties> = {\n slate: { background: \"var(--color-background-muted)\", color: \"var(--color-text-secondary)\" },\n green: { background: \"var(--color-background-green, #dcfce7)\", color: \"var(--color-text-green, #15803d)\" },\n amber: { background: \"var(--color-background-orange, #ffedd5)\", color: \"var(--color-text-orange, #c2410c)\" },\n };\n return (\n <span className=\"rounded-full px-2 py-0.5 text-xs font-medium\" style={tones[tone]}>\n {children}\n </span>\n );\n}\n"],"mappings":"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","names":["Button","Input","Textarea"]}
|
package/dist/admin/ui/select.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
3
|
import { Selector } from "@astryxdesign/core/Selector";
|
|
4
|
+
import { useFieldLabel } from "./primitives.js";
|
|
4
5
|
function Select({
|
|
5
6
|
value,
|
|
6
7
|
onValueChange,
|
|
@@ -8,13 +9,15 @@ function Select({
|
|
|
8
9
|
placeholder = "Kies\u2026",
|
|
9
10
|
className
|
|
10
11
|
}) {
|
|
12
|
+
const label = useFieldLabel(placeholder);
|
|
11
13
|
return /* @__PURE__ */ jsx(
|
|
12
14
|
Selector,
|
|
13
15
|
{
|
|
14
|
-
label
|
|
16
|
+
label,
|
|
15
17
|
isLabelHidden: true,
|
|
16
18
|
placeholder,
|
|
17
|
-
className,
|
|
19
|
+
containerClassName: className,
|
|
20
|
+
presentation: "adaptive",
|
|
18
21
|
options: options.map((o) => ({ value: o.value, label: o.label })),
|
|
19
22
|
value,
|
|
20
23
|
onChange: (v) => onValueChange(v ?? "")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/admin/ui/select.tsx"],"sourcesContent":["\"use client\";\n\nimport { Selector } from \"@astryxdesign/core/Selector\";\n\n/** Admin-select op de Astryx Selector. API ongewijzigd (value/onValueChange/options). */\nexport function Select({\n value,\n onValueChange,\n options,\n placeholder = \"Kies…\",\n className,\n}: {\n value: string;\n onValueChange: (v: string) => void;\n options: { value: string; label: string }[];\n placeholder?: string;\n className?: string;\n}) {\n return (\n <Selector\n label={
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/ui/select.tsx"],"sourcesContent":["\"use client\";\n\nimport { Selector } from \"@astryxdesign/core/Selector\";\nimport { useFieldLabel } from \"./primitives\";\n\n/** Admin-select op de Astryx Selector. API ongewijzigd (value/onValueChange/options). */\nexport function Select({\n value,\n onValueChange,\n options,\n placeholder = \"Kies…\",\n className,\n}: {\n value: string;\n onValueChange: (v: string) => void;\n options: { value: string; label: string }[];\n placeholder?: string;\n className?: string;\n}) {\n const label = useFieldLabel(placeholder);\n return (\n <Selector\n label={label}\n isLabelHidden\n placeholder={placeholder}\n containerClassName={className}\n // 0.7: op een telefoon opent de lijst als bottom sheet i.p.v. een klein dropdownmenu.\n presentation=\"adaptive\"\n options={options.map((o) => ({ value: o.value, label: o.label }))}\n value={value}\n onChange={(v) => onValueChange((v as string) ?? \"\")}\n />\n );\n}\n"],"mappings":";AAqBI;AAnBJ,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;AAGvB,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AACF,GAMG;AACD,QAAM,QAAQ,cAAc,WAAW;AACvC,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,eAAa;AAAA,MACb;AAAA,MACA,oBAAoB;AAAA,MAEpB,cAAa;AAAA,MACb,SAAS,QAAQ,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,OAAO,EAAE,MAAM,EAAE;AAAA,MAChE;AAAA,MACA,UAAU,CAAC,MAAM,cAAe,KAAgB,EAAE;AAAA;AAAA,EACpD;AAEJ;","names":[]}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/** Admin-switch op de Astryx Switch. API ongewijzigd (checked/onCheckedChange/label). */
|
|
2
|
-
export declare function Switch({ checked, onCheckedChange, label, }: {
|
|
2
|
+
export declare function Switch({ checked, onCheckedChange, label, labelVerborgen, }: {
|
|
3
3
|
checked: boolean;
|
|
4
4
|
onCheckedChange: (v: boolean) => void;
|
|
5
5
|
label?: string;
|
|
6
|
+
/** Label alleen voor schermlezers (bv. in een tabel waar de kolomkop het al zegt). */
|
|
7
|
+
labelVerborgen?: boolean;
|
|
6
8
|
}): import("react").JSX.Element;
|