@xiwebdesign/xicms-core 4.17.1
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.d.ts +58 -0
- package/dist/XiCMSProvider.js +165 -0
- package/dist/XiCMSProvider.js.map +1 -0
- package/dist/admin/AdminApp.d.ts +4 -0
- package/dist/admin/AdminApp.js +62 -0
- package/dist/admin/AdminApp.js.map +1 -0
- package/dist/admin/AdminHelp.d.ts +2 -0
- package/dist/admin/AdminHelp.js +65 -0
- package/dist/admin/AdminHelp.js.map +1 -0
- package/dist/admin/NewsEditor.d.ts +2 -0
- package/dist/admin/NewsEditor.js +171 -0
- package/dist/admin/NewsEditor.js.map +1 -0
- package/dist/admin/SuperadminPanel.d.ts +4 -0
- package/dist/admin/SuperadminPanel.js +101 -0
- package/dist/admin/SuperadminPanel.js.map +1 -0
- package/dist/admin/blockEditors/StyleEditor.d.ts +10 -0
- package/dist/admin/blockEditors/StyleEditor.js +78 -0
- package/dist/admin/blockEditors/StyleEditor.js.map +1 -0
- package/dist/admin/blockEditors/index.d.ts +16 -0
- package/dist/admin/blockEditors/index.js +1602 -0
- package/dist/admin/blockEditors/index.js.map +1 -0
- package/dist/admin/editors/RichTextEditor.d.ts +10 -0
- package/dist/admin/editors/RichTextEditor.js +86 -0
- package/dist/admin/editors/RichTextEditor.js.map +1 -0
- package/dist/admin/forms/FormsPanel.d.ts +3 -0
- package/dist/admin/forms/FormsPanel.js +203 -0
- package/dist/admin/forms/FormsPanel.js.map +1 -0
- package/dist/admin/index.d.ts +21 -0
- package/dist/admin/index.js +38 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/lib/compressImage.d.ts +12 -0
- package/dist/admin/lib/compressImage.js +53 -0
- package/dist/admin/lib/compressImage.js.map +1 -0
- package/dist/admin/lib/mediaUsage.d.ts +9 -0
- package/dist/admin/lib/mediaUsage.js +25 -0
- package/dist/admin/lib/mediaUsage.js.map +1 -0
- package/dist/admin/lib/pagesClient.d.ts +38 -0
- package/dist/admin/lib/pagesClient.js +143 -0
- package/dist/admin/lib/pagesClient.js.map +1 -0
- package/dist/admin/lib/slugify.d.ts +2 -0
- package/dist/admin/lib/slugify.js +7 -0
- package/dist/admin/lib/slugify.js.map +1 -0
- package/dist/admin/lib/upload.d.ts +13 -0
- package/dist/admin/lib/upload.js +40 -0
- package/dist/admin/lib/upload.js.map +1 -0
- package/dist/admin/lib/zodFields.d.ts +27 -0
- package/dist/admin/lib/zodFields.js +48 -0
- package/dist/admin/lib/zodFields.js.map +1 -0
- package/dist/admin/media/MediaManager.d.ts +3 -0
- package/dist/admin/media/MediaManager.js +132 -0
- package/dist/admin/media/MediaManager.js.map +1 -0
- package/dist/admin/media/MediaPicker.d.ts +24 -0
- package/dist/admin/media/MediaPicker.js +93 -0
- package/dist/admin/media/MediaPicker.js.map +1 -0
- package/dist/admin/pages/PageEditor.d.ts +5 -0
- package/dist/admin/pages/PageEditor.js +239 -0
- package/dist/admin/pages/PageEditor.js.map +1 -0
- package/dist/admin/pages/PagesPanel.d.ts +3 -0
- package/dist/admin/pages/PagesPanel.js +92 -0
- package/dist/admin/pages/PagesPanel.js.map +1 -0
- package/dist/admin/panelRegistry.d.ts +20 -0
- package/dist/admin/panelRegistry.js +23 -0
- package/dist/admin/panelRegistry.js.map +1 -0
- package/dist/admin/patterns/PatternInserter.d.ts +10 -0
- package/dist/admin/patterns/PatternInserter.js +58 -0
- package/dist/admin/patterns/PatternInserter.js.map +1 -0
- package/dist/admin/settings/SettingsPanel.d.ts +3 -0
- package/dist/admin/settings/SettingsPanel.js +304 -0
- package/dist/admin/settings/SettingsPanel.js.map +1 -0
- package/dist/admin/settings/moduleSettingsForm.d.ts +12 -0
- package/dist/admin/settings/moduleSettingsForm.js +45 -0
- package/dist/admin/settings/moduleSettingsForm.js.map +1 -0
- package/dist/admin/stats/StatsPanel.d.ts +4 -0
- package/dist/admin/stats/StatsPanel.js +80 -0
- package/dist/admin/stats/StatsPanel.js.map +1 -0
- package/dist/admin/ui/ArrayEditor.d.ts +16 -0
- package/dist/admin/ui/ArrayEditor.js +38 -0
- package/dist/admin/ui/ArrayEditor.js.map +1 -0
- package/dist/admin/ui/ConfirmDialog.d.ts +22 -0
- package/dist/admin/ui/ConfirmDialog.js +47 -0
- package/dist/admin/ui/ConfirmDialog.js.map +1 -0
- package/dist/admin/ui/cn.d.ts +3 -0
- package/dist/admin/ui/cn.js +9 -0
- package/dist/admin/ui/cn.js.map +1 -0
- package/dist/admin/ui/dialog.d.ts +9 -0
- package/dist/admin/ui/dialog.js +47 -0
- package/dist/admin/ui/dialog.js.map +1 -0
- package/dist/admin/ui/index.d.ts +7 -0
- package/dist/admin/ui/index.js +29 -0
- package/dist/admin/ui/index.js.map +1 -0
- package/dist/admin/ui/primitives.d.ts +37 -0
- package/dist/admin/ui/primitives.js +137 -0
- package/dist/admin/ui/primitives.js.map +1 -0
- package/dist/admin/ui/select.d.ts +11 -0
- package/dist/admin/ui/select.js +27 -0
- package/dist/admin/ui/select.js.map +1 -0
- package/dist/admin/ui/switch.d.ts +6 -0
- package/dist/admin/ui/switch.js +22 -0
- package/dist/admin/ui/switch.js.map +1 -0
- package/dist/admin/ui/tabs.d.ts +5 -0
- package/dist/admin/ui/tabs.js +36 -0
- package/dist/admin/ui/tabs.js.map +1 -0
- package/dist/admin/ui/toast.d.ts +19 -0
- package/dist/admin/ui/toast.js +24 -0
- package/dist/admin/ui/toast.js.map +1 -0
- package/dist/admin/visual/VisualEditor.d.ts +10 -0
- package/dist/admin/visual/VisualEditor.js +597 -0
- package/dist/admin/visual/VisualEditor.js.map +1 -0
- package/dist/admin/visual/reorder.d.ts +6 -0
- package/dist/admin/visual/reorder.js +12 -0
- package/dist/admin/visual/reorder.js.map +1 -0
- package/dist/admin.css +1 -0
- package/dist/auth/AuthProvider.d.ts +30 -0
- package/dist/auth/AuthProvider.js +110 -0
- package/dist/auth/AuthProvider.js.map +1 -0
- package/dist/auth/LoginForm.d.ts +4 -0
- package/dist/auth/LoginForm.js +122 -0
- package/dist/auth/LoginForm.js.map +1 -0
- package/dist/auth/roles.d.ts +15 -0
- package/dist/auth/roles.js +21 -0
- package/dist/auth/roles.js.map +1 -0
- package/dist/blocks/BlockErrorBoundary.d.ts +32 -0
- package/dist/blocks/BlockErrorBoundary.js +39 -0
- package/dist/blocks/BlockErrorBoundary.js.map +1 -0
- package/dist/blocks/BlockRenderer.d.ts +15 -0
- package/dist/blocks/BlockRenderer.js +24 -0
- package/dist/blocks/BlockRenderer.js.map +1 -0
- package/dist/blocks/blockStyle.d.ts +14 -0
- package/dist/blocks/blockStyle.js +14 -0
- package/dist/blocks/blockStyle.js.map +1 -0
- package/dist/blocks/builtins/Accordion.d.ts +2 -0
- package/dist/blocks/builtins/Accordion.js +45 -0
- package/dist/blocks/builtins/Accordion.js.map +1 -0
- package/dist/blocks/builtins/Agenda.d.ts +23 -0
- package/dist/blocks/builtins/Agenda.js +102 -0
- package/dist/blocks/builtins/Agenda.js.map +1 -0
- package/dist/blocks/builtins/Banner.d.ts +2 -0
- package/dist/blocks/builtins/Banner.js +45 -0
- package/dist/blocks/builtins/Banner.js.map +1 -0
- package/dist/blocks/builtins/BeforeAfter.d.ts +2 -0
- package/dist/blocks/builtins/BeforeAfter.js +44 -0
- package/dist/blocks/builtins/BeforeAfter.js.map +1 -0
- package/dist/blocks/builtins/Booking.d.ts +2 -0
- package/dist/blocks/builtins/Booking.js +27 -0
- package/dist/blocks/builtins/Booking.js.map +1 -0
- package/dist/blocks/builtins/Breadcrumbs.d.ts +10 -0
- package/dist/blocks/builtins/Breadcrumbs.js +73 -0
- package/dist/blocks/builtins/Breadcrumbs.js.map +1 -0
- package/dist/blocks/builtins/Cards.d.ts +2 -0
- package/dist/blocks/builtins/Cards.js +94 -0
- package/dist/blocks/builtins/Cards.js.map +1 -0
- package/dist/blocks/builtins/Columns.d.ts +2 -0
- package/dist/blocks/builtins/Columns.js +22 -0
- package/dist/blocks/builtins/Columns.js.map +1 -0
- package/dist/blocks/builtins/Contact.d.ts +7 -0
- package/dist/blocks/builtins/Contact.js +121 -0
- package/dist/blocks/builtins/Contact.js.map +1 -0
- package/dist/blocks/builtins/Countdown.d.ts +18 -0
- package/dist/blocks/builtins/Countdown.js +65 -0
- package/dist/blocks/builtins/Countdown.js.map +1 -0
- package/dist/blocks/builtins/Cta.d.ts +2 -0
- package/dist/blocks/builtins/Cta.js +52 -0
- package/dist/blocks/builtins/Cta.js.map +1 -0
- package/dist/blocks/builtins/Downloads.d.ts +2 -0
- package/dist/blocks/builtins/Downloads.js +32 -0
- package/dist/blocks/builtins/Downloads.js.map +1 -0
- package/dist/blocks/builtins/Elements.d.ts +4 -0
- package/dist/blocks/builtins/Elements.js +64 -0
- package/dist/blocks/builtins/Elements.js.map +1 -0
- package/dist/blocks/builtins/Embed.d.ts +2 -0
- package/dist/blocks/builtins/Embed.js +30 -0
- package/dist/blocks/builtins/Embed.js.map +1 -0
- package/dist/blocks/builtins/Faq.d.ts +6 -0
- package/dist/blocks/builtins/Faq.js +110 -0
- package/dist/blocks/builtins/Faq.js.map +1 -0
- package/dist/blocks/builtins/FormBlock.d.ts +2 -0
- package/dist/blocks/builtins/FormBlock.js +221 -0
- package/dist/blocks/builtins/FormBlock.js.map +1 -0
- package/dist/blocks/builtins/Gallery.d.ts +23 -0
- package/dist/blocks/builtins/Gallery.js +177 -0
- package/dist/blocks/builtins/Gallery.js.map +1 -0
- package/dist/blocks/builtins/Hero.d.ts +2 -0
- package/dist/blocks/builtins/Hero.js +47 -0
- package/dist/blocks/builtins/Hero.js.map +1 -0
- package/dist/blocks/builtins/ImageBlock.d.ts +2 -0
- package/dist/blocks/builtins/ImageBlock.js +24 -0
- package/dist/blocks/builtins/ImageBlock.js.map +1 -0
- package/dist/blocks/builtins/Jobs.d.ts +8 -0
- package/dist/blocks/builtins/Jobs.js +65 -0
- package/dist/blocks/builtins/Jobs.js.map +1 -0
- package/dist/blocks/builtins/Layout.d.ts +3 -0
- package/dist/blocks/builtins/Layout.js +67 -0
- package/dist/blocks/builtins/Layout.js.map +1 -0
- package/dist/blocks/builtins/MapBlock.d.ts +2 -0
- package/dist/blocks/builtins/MapBlock.js +31 -0
- package/dist/blocks/builtins/MapBlock.js.map +1 -0
- package/dist/blocks/builtins/NewsListBlock.d.ts +2 -0
- package/dist/blocks/builtins/NewsListBlock.js +24 -0
- package/dist/blocks/builtins/NewsListBlock.js.map +1 -0
- package/dist/blocks/builtins/Newsletter.d.ts +2 -0
- package/dist/blocks/builtins/Newsletter.js +84 -0
- package/dist/blocks/builtins/Newsletter.js.map +1 -0
- package/dist/blocks/builtins/OpenNowBadge.d.ts +9 -0
- package/dist/blocks/builtins/OpenNowBadge.js +20 -0
- package/dist/blocks/builtins/OpenNowBadge.js.map +1 -0
- package/dist/blocks/builtins/OpeningHours.d.ts +2 -0
- package/dist/blocks/builtins/OpeningHours.js +47 -0
- package/dist/blocks/builtins/OpeningHours.js.map +1 -0
- package/dist/blocks/builtins/PdfBlock.d.ts +2 -0
- package/dist/blocks/builtins/PdfBlock.js +97 -0
- package/dist/blocks/builtins/PdfBlock.js.map +1 -0
- package/dist/blocks/builtins/Portfolio.d.ts +2 -0
- package/dist/blocks/builtins/Portfolio.js +94 -0
- package/dist/blocks/builtins/Portfolio.js.map +1 -0
- package/dist/blocks/builtins/Pricing.d.ts +6 -0
- package/dist/blocks/builtins/Pricing.js +77 -0
- package/dist/blocks/builtins/Pricing.js.map +1 -0
- package/dist/blocks/builtins/RichTextBlock.d.ts +2 -0
- package/dist/blocks/builtins/RichTextBlock.js +18 -0
- package/dist/blocks/builtins/RichTextBlock.js.map +1 -0
- package/dist/blocks/builtins/Search.d.ts +2 -0
- package/dist/blocks/builtins/Search.js +99 -0
- package/dist/blocks/builtins/Search.js.map +1 -0
- package/dist/blocks/builtins/Sections.d.ts +5 -0
- package/dist/blocks/builtins/Sections.js +183 -0
- package/dist/blocks/builtins/Sections.js.map +1 -0
- package/dist/blocks/builtins/Slider.d.ts +2 -0
- package/dist/blocks/builtins/Slider.js +131 -0
- package/dist/blocks/builtins/Slider.js.map +1 -0
- package/dist/blocks/builtins/Spacer.d.ts +2 -0
- package/dist/blocks/builtins/Spacer.js +19 -0
- package/dist/blocks/builtins/Spacer.js.map +1 -0
- package/dist/blocks/builtins/Team.d.ts +2 -0
- package/dist/blocks/builtins/Team.js +70 -0
- package/dist/blocks/builtins/Team.js.map +1 -0
- package/dist/blocks/builtins/Testimonials.d.ts +8 -0
- package/dist/blocks/builtins/Testimonials.js +82 -0
- package/dist/blocks/builtins/Testimonials.js.map +1 -0
- package/dist/blocks/builtins/Video.d.ts +9 -0
- package/dist/blocks/builtins/Video.js +77 -0
- package/dist/blocks/builtins/Video.js.map +1 -0
- package/dist/blocks/builtins/WhatsappChat.d.ts +8 -0
- package/dist/blocks/builtins/WhatsappChat.js +51 -0
- package/dist/blocks/builtins/WhatsappChat.js.map +1 -0
- package/dist/blocks/builtins/Widgets.d.ts +13 -0
- package/dist/blocks/builtins/Widgets.js +308 -0
- package/dist/blocks/builtins/Widgets.js.map +1 -0
- package/dist/blocks/builtins/consentEmbed.d.ts +17 -0
- package/dist/blocks/builtins/consentEmbed.js +31 -0
- package/dist/blocks/builtins/consentEmbed.js.map +1 -0
- package/dist/blocks/builtins/index.d.ts +46 -0
- package/dist/blocks/builtins/index.js +121 -0
- package/dist/blocks/builtins/index.js.map +1 -0
- package/dist/blocks/builtins/lib/bookingUrl.d.ts +8 -0
- package/dist/blocks/builtins/lib/bookingUrl.js +50 -0
- package/dist/blocks/builtins/lib/bookingUrl.js.map +1 -0
- package/dist/blocks/builtins/lib/fileIcon.d.ts +2 -0
- package/dist/blocks/builtins/lib/fileIcon.js +45 -0
- package/dist/blocks/builtins/lib/fileIcon.js.map +1 -0
- package/dist/blocks/builtins/lib/ics.d.ts +17 -0
- package/dist/blocks/builtins/lib/ics.js +50 -0
- package/dist/blocks/builtins/lib/ics.js.map +1 -0
- package/dist/blocks/builtins/lib/openingHours.d.ts +20 -0
- package/dist/blocks/builtins/lib/openingHours.js +79 -0
- package/dist/blocks/builtins/lib/openingHours.js.map +1 -0
- package/dist/blocks/builtins/lib/searchRank.d.ts +22 -0
- package/dist/blocks/builtins/lib/searchRank.js +45 -0
- package/dist/blocks/builtins/lib/searchRank.js.map +1 -0
- package/dist/blocks/builtins/lib/submitForm.d.ts +6 -0
- package/dist/blocks/builtins/lib/submitForm.js +14 -0
- package/dist/blocks/builtins/lib/submitForm.js.map +1 -0
- package/dist/blocks/context.d.ts +8 -0
- package/dist/blocks/context.js +20 -0
- package/dist/blocks/context.js.map +1 -0
- package/dist/blocks/index.d.ts +9 -0
- package/dist/blocks/index.js +21 -0
- package/dist/blocks/index.js.map +1 -0
- package/dist/blocks/registry.d.ts +75 -0
- package/dist/blocks/registry.js +71 -0
- package/dist/blocks/registry.js.map +1 -0
- package/dist/blocks/ui/index.d.ts +35 -0
- package/dist/blocks/ui/index.js +48 -0
- package/dist/blocks/ui/index.js.map +1 -0
- package/dist/components/EditBar.d.ts +2 -0
- package/dist/components/EditBar.js +20 -0
- package/dist/components/EditBar.js.map +1 -0
- package/dist/components/EditableImage.d.ts +18 -0
- package/dist/components/EditableImage.js +62 -0
- package/dist/components/EditableImage.js.map +1 -0
- package/dist/components/EditableRichText.d.ts +14 -0
- package/dist/components/EditableRichText.js +26 -0
- package/dist/components/EditableRichText.js.map +1 -0
- package/dist/components/EditableText.d.ts +21 -0
- package/dist/components/EditableText.js +25 -0
- package/dist/components/EditableText.js.map +1 -0
- package/dist/components/News.d.ts +38 -0
- package/dist/components/News.js +128 -0
- package/dist/components/News.js.map +1 -0
- package/dist/components/PageView.d.ts +8 -0
- package/dist/components/PageView.js +28 -0
- package/dist/components/PageView.js.map +1 -0
- package/dist/components/ResponsiveImage.d.ts +16 -0
- package/dist/components/ResponsiveImage.js +39 -0
- package/dist/components/ResponsiveImage.js.map +1 -0
- package/dist/components/site/SiteFooter.d.ts +12 -0
- package/dist/components/site/SiteFooter.js +34 -0
- package/dist/components/site/SiteFooter.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.js +17 -0
- package/dist/config.js.map +1 -0
- package/dist/content/ContentProvider.d.ts +23 -0
- package/dist/content/ContentProvider.js +86 -0
- package/dist/content/ContentProvider.js.map +1 -0
- package/dist/content/types.d.ts +41 -0
- package/dist/content/types.js +1 -0
- package/dist/content/types.js.map +1 -0
- package/dist/demo/DemoStudio.d.ts +7 -0
- package/dist/demo/DemoStudio.js +54 -0
- package/dist/demo/DemoStudio.js.map +1 -0
- package/dist/demo/demoStore.d.ts +26 -0
- package/dist/demo/demoStore.js +115 -0
- package/dist/demo/demoStore.js.map +1 -0
- package/dist/editor/EditorProvider.d.ts +12 -0
- package/dist/editor/EditorProvider.js +22 -0
- package/dist/editor/EditorProvider.js.map +1 -0
- package/dist/firebase/admin.d.ts +7 -0
- package/dist/firebase/admin.js +31 -0
- package/dist/firebase/admin.js.map +1 -0
- package/dist/firebase/appcheck.d.ts +6 -0
- package/dist/firebase/appcheck.js +23 -0
- package/dist/firebase/appcheck.js.map +1 -0
- package/dist/firebase/client.d.ts +9 -0
- package/dist/firebase/client.js +44 -0
- package/dist/firebase/client.js.map +1 -0
- package/dist/firebase/region.d.ts +5 -0
- package/dist/firebase/region.js +7 -0
- package/dist/firebase/region.js.map +1 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.js +172 -0
- package/dist/index.js.map +1 -0
- package/dist/layers.css +13 -0
- package/dist/lock/DemoLock.d.ts +5 -0
- package/dist/lock/DemoLock.js +35 -0
- package/dist/lock/DemoLock.js.map +1 -0
- package/dist/media/ImageContext.d.ts +41 -0
- package/dist/media/ImageContext.js +74 -0
- package/dist/media/ImageContext.js.map +1 -0
- package/dist/modules/builtins.d.ts +46 -0
- package/dist/modules/builtins.js +462 -0
- package/dist/modules/builtins.js.map +1 -0
- package/dist/modules/consent/ConsentBanner.d.ts +42 -0
- package/dist/modules/consent/ConsentBanner.js +119 -0
- package/dist/modules/consent/ConsentBanner.js.map +1 -0
- package/dist/modules/consent/useConsent.d.ts +28 -0
- package/dist/modules/consent/useConsent.js +52 -0
- package/dist/modules/consent/useConsent.js.map +1 -0
- package/dist/modules/context.d.ts +20 -0
- package/dist/modules/context.js +31 -0
- package/dist/modules/context.js.map +1 -0
- package/dist/modules/contract.d.ts +9 -0
- package/dist/modules/contract.js +38 -0
- package/dist/modules/contract.js.map +1 -0
- package/dist/modules/defineModule.d.ts +11 -0
- package/dist/modules/defineModule.js +7 -0
- package/dist/modules/defineModule.js.map +1 -0
- package/dist/modules/index.d.ts +13 -0
- package/dist/modules/index.js +44 -0
- package/dist/modules/index.js.map +1 -0
- package/dist/modules/overrides.d.ts +17 -0
- package/dist/modules/overrides.js +25 -0
- package/dist/modules/overrides.js.map +1 -0
- package/dist/modules/registry.d.ts +40 -0
- package/dist/modules/registry.js +79 -0
- package/dist/modules/registry.js.map +1 -0
- package/dist/modules/types.d.ts +66 -0
- package/dist/modules/types.js +1 -0
- package/dist/modules/types.js.map +1 -0
- package/dist/patterns/builtins.d.ts +31 -0
- package/dist/patterns/builtins.js +415 -0
- package/dist/patterns/builtins.js.map +1 -0
- package/dist/patterns/index.d.ts +6 -0
- package/dist/patterns/index.js +9 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/patterns/patterns.d.ts +28 -0
- package/dist/patterns/patterns.js +53 -0
- package/dist/patterns/patterns.js.map +1 -0
- package/dist/render/PageRenderer.d.ts +13 -0
- package/dist/render/PageRenderer.js +14 -0
- package/dist/render/PageRenderer.js.map +1 -0
- package/dist/render/PublishedPage.d.ts +13 -0
- package/dist/render/PublishedPage.js +16 -0
- package/dist/render/PublishedPage.js.map +1 -0
- package/dist/schema/blocks.d.ts +15052 -0
- package/dist/schema/blocks.js +794 -0
- package/dist/schema/blocks.js.map +1 -0
- package/dist/schema/forms.d.ts +111 -0
- package/dist/schema/forms.js +47 -0
- package/dist/schema/forms.js.map +1 -0
- package/dist/schema/index.d.ts +11 -0
- package/dist/schema/index.js +16 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/pages.d.ts +674 -0
- package/dist/schema/pages.js +37 -0
- package/dist/schema/pages.js.map +1 -0
- package/dist/schema/seo.d.ts +29 -0
- package/dist/schema/seo.js +17 -0
- package/dist/schema/seo.js.map +1 -0
- package/dist/schema/settings.d.ts +1126 -0
- package/dist/schema/settings.js +128 -0
- package/dist/schema/settings.js.map +1 -0
- package/dist/schema/siteConfig.d.ts +722 -0
- package/dist/schema/siteConfig.js +39 -0
- package/dist/schema/siteConfig.js.map +1 -0
- package/dist/server/env.d.ts +10 -0
- package/dist/server/env.js +36 -0
- package/dist/server/env.js.map +1 -0
- package/dist/server/index.d.ts +10 -0
- package/dist/server/index.js +51 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/pages.d.ts +15 -0
- package/dist/server/pages.js +99 -0
- package/dist/server/pages.js.map +1 -0
- package/dist/server/sanitize.d.ts +2 -0
- package/dist/server/sanitize.js +55 -0
- package/dist/server/sanitize.js.map +1 -0
- package/dist/server/seo.d.ts +116 -0
- package/dist/server/seo.js +179 -0
- package/dist/server/seo.js.map +1 -0
- package/dist/settings/useSiteSettings.d.ts +25 -0
- package/dist/settings/useSiteSettings.js +68 -0
- package/dist/settings/useSiteSettings.js.map +1 -0
- package/dist/styles.css +2495 -0
- package/dist/theme/presets.d.ts +12 -0
- package/dist/theme/presets.js +147 -0
- package/dist/theme/presets.js.map +1 -0
- package/package.json +112 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { VideoBlockSchema } from "../../schema/blocks";
|
|
5
|
+
import { defineBlock } from "../registry";
|
|
6
|
+
import { ConsentEmbed } from "./consentEmbed";
|
|
7
|
+
function embedUrl(provider, src, autoplay = false) {
|
|
8
|
+
if (provider === "youtube") {
|
|
9
|
+
const id = src.match(/(?:v=|youtu\.be\/|embed\/)([\w-]{6,})/)?.[1] ?? src;
|
|
10
|
+
return `https://www.youtube-nocookie.com/embed/${id}${autoplay ? "?autoplay=1" : ""}`;
|
|
11
|
+
}
|
|
12
|
+
if (provider === "vimeo") {
|
|
13
|
+
const id = src.match(/(?:vimeo\.com\/)?(\d{6,})/)?.[1] ?? src;
|
|
14
|
+
return `https://player.vimeo.com/video/${id}${autoplay ? "?autoplay=1" : ""}`;
|
|
15
|
+
}
|
|
16
|
+
return src;
|
|
17
|
+
}
|
|
18
|
+
function facadeThumb(block) {
|
|
19
|
+
if (block.posterUrl) return block.posterUrl;
|
|
20
|
+
if (block.provider === "youtube") {
|
|
21
|
+
const id = block.src.match(/(?:v=|youtu\.be\/|embed\/)([\w-]{6,})/)?.[1] ?? block.src;
|
|
22
|
+
return id ? `https://i.ytimg.com/vi/${id}/hqdefault.jpg` : null;
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
function VideoRender({ block, mode }) {
|
|
27
|
+
const [activated, setActivated] = useState(false);
|
|
28
|
+
if (!block.src) return null;
|
|
29
|
+
const useFacade = block.facade && block.provider !== "file" && !activated;
|
|
30
|
+
const thumb = useFacade ? facadeThumb(block) : null;
|
|
31
|
+
const media = block.provider === "file" ? /* @__PURE__ */ jsx("video", { className: "xicms-video__player", src: block.src, controls: true, poster: block.posterUrl || void 0 }) : useFacade ? (
|
|
32
|
+
// Click-to-play: geen third-party iframe tot de bezoeker klikt (sneller + privacyvriendelijker).
|
|
33
|
+
/* @__PURE__ */ jsxs(
|
|
34
|
+
"button",
|
|
35
|
+
{
|
|
36
|
+
type: "button",
|
|
37
|
+
className: "xicms-video__facade",
|
|
38
|
+
onClick: () => mode !== "preview" && setActivated(true),
|
|
39
|
+
"aria-label": `Video afspelen: ${block.title ?? "video"}`,
|
|
40
|
+
children: [
|
|
41
|
+
thumb ? (
|
|
42
|
+
// eslint-disable-next-line @next/next/no-img-element
|
|
43
|
+
/* @__PURE__ */ jsx("img", { src: thumb, alt: "", loading: "lazy" })
|
|
44
|
+
) : /* @__PURE__ */ jsx("span", { className: "xicms-video__facade-bg", "aria-hidden": true }),
|
|
45
|
+
/* @__PURE__ */ jsx("span", { className: "xicms-video__play", "aria-hidden": true, children: "\u25B6" })
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
)
|
|
49
|
+
) : /* @__PURE__ */ jsx("div", { className: "xicms-video__frame", children: /* @__PURE__ */ jsx(
|
|
50
|
+
"iframe",
|
|
51
|
+
{
|
|
52
|
+
src: embedUrl(block.provider, block.src, activated),
|
|
53
|
+
title: block.title ?? "Video",
|
|
54
|
+
loading: "lazy",
|
|
55
|
+
allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
|
|
56
|
+
allowFullScreen: true
|
|
57
|
+
}
|
|
58
|
+
) });
|
|
59
|
+
return /* @__PURE__ */ jsxs("figure", { className: "xicms-video", children: [
|
|
60
|
+
/* @__PURE__ */ jsx(ConsentEmbed, { gated: block.consentGated && !useFacade, preview: mode === "preview", label: "Video", children: media }),
|
|
61
|
+
block.caption && /* @__PURE__ */ jsx("figcaption", { children: block.caption })
|
|
62
|
+
] });
|
|
63
|
+
}
|
|
64
|
+
const videoBlock = defineBlock({
|
|
65
|
+
type: "video",
|
|
66
|
+
schema: VideoBlockSchema,
|
|
67
|
+
Render: VideoRender,
|
|
68
|
+
label: "Video",
|
|
69
|
+
icon: "\u{1F3AC}",
|
|
70
|
+
defaults: () => ({ provider: "youtube", src: "", consentGated: true })
|
|
71
|
+
});
|
|
72
|
+
export {
|
|
73
|
+
embedUrl,
|
|
74
|
+
facadeThumb,
|
|
75
|
+
videoBlock
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=Video.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/blocks/builtins/Video.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport type { z } from \"zod\";\nimport { VideoBlockSchema } from \"../../schema/blocks\";\nimport { defineBlock, type BlockRenderProps } from \"../registry\";\nimport { ConsentEmbed } from \"./consentEmbed\";\n\ntype Video = z.infer<typeof VideoBlockSchema>;\n\n/** Bouwt een embed-URL uit een id of volledige URL. */\nexport function embedUrl(provider: Video[\"provider\"], src: string, autoplay = false): string {\n if (provider === \"youtube\") {\n const id = src.match(/(?:v=|youtu\\.be\\/|embed\\/)([\\w-]{6,})/)?.[1] ?? src;\n return `https://www.youtube-nocookie.com/embed/${id}${autoplay ? \"?autoplay=1\" : \"\"}`;\n }\n if (provider === \"vimeo\") {\n const id = src.match(/(?:vimeo\\.com\\/)?(\\d{6,})/)?.[1] ?? src;\n return `https://player.vimeo.com/video/${id}${autoplay ? \"?autoplay=1\" : \"\"}`;\n }\n return src;\n}\n\n/** Thumbnail voor de click-to-play-facade: eigen poster of de YouTube-thumb. */\nexport function facadeThumb(block: Pick<Video, \"provider\" | \"src\" | \"posterUrl\">): string | null {\n if (block.posterUrl) return block.posterUrl;\n if (block.provider === \"youtube\") {\n const id = block.src.match(/(?:v=|youtu\\.be\\/|embed\\/)([\\w-]{6,})/)?.[1] ?? block.src;\n return id ? `https://i.ytimg.com/vi/${id}/hqdefault.jpg` : null;\n }\n return null; // vimeo-thumbs vereisen een API-call; zonder poster geen facade-beeld\n}\n\nfunction VideoRender({ block, mode }: BlockRenderProps<Video>) {\n const [activated, setActivated] = useState(false);\n if (!block.src) return null;\n\n const useFacade = block.facade && block.provider !== \"file\" && !activated;\n const thumb = useFacade ? facadeThumb(block) : null;\n\n const media =\n block.provider === \"file\" ? (\n <video className=\"xicms-video__player\" src={block.src} controls poster={block.posterUrl || undefined} />\n ) : useFacade ? (\n // Click-to-play: geen third-party iframe tot de bezoeker klikt (sneller + privacyvriendelijker).\n <button\n type=\"button\"\n className=\"xicms-video__facade\"\n onClick={() => mode !== \"preview\" && setActivated(true)}\n aria-label={`Video afspelen: ${block.title ?? \"video\"}`}\n >\n {thumb ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img src={thumb} alt=\"\" loading=\"lazy\" />\n ) : (\n <span className=\"xicms-video__facade-bg\" aria-hidden />\n )}\n <span className=\"xicms-video__play\" aria-hidden>▶</span>\n </button>\n ) : (\n <div className=\"xicms-video__frame\">\n <iframe\n src={embedUrl(block.provider, block.src, activated)}\n title={block.title ?? \"Video\"}\n loading=\"lazy\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n />\n </div>\n );\n return (\n <figure className=\"xicms-video\">\n <ConsentEmbed gated={block.consentGated && !useFacade} preview={mode === \"preview\"} label=\"Video\">{media}</ConsentEmbed>\n {block.caption && <figcaption>{block.caption}</figcaption>}\n </figure>\n );\n}\n\nexport const videoBlock = defineBlock({\n type: \"video\",\n schema: VideoBlockSchema,\n Render: VideoRender,\n label: \"Video\",\n icon: \"🎬\",\n defaults: () => ({ provider: \"youtube\", src: \"\", consentGated: true }),\n});\n"],"mappings":";AA0CM,cAGA,YAHA;AAxCN,SAAS,gBAAgB;AAEzB,SAAS,wBAAwB;AACjC,SAAS,mBAA0C;AACnD,SAAS,oBAAoB;AAKtB,SAAS,SAAS,UAA6B,KAAa,WAAW,OAAe;AAC3F,MAAI,aAAa,WAAW;AAC1B,UAAM,KAAK,IAAI,MAAM,uCAAuC,IAAI,CAAC,KAAK;AACtE,WAAO,0CAA0C,EAAE,GAAG,WAAW,gBAAgB,EAAE;AAAA,EACrF;AACA,MAAI,aAAa,SAAS;AACxB,UAAM,KAAK,IAAI,MAAM,2BAA2B,IAAI,CAAC,KAAK;AAC1D,WAAO,kCAAkC,EAAE,GAAG,WAAW,gBAAgB,EAAE;AAAA,EAC7E;AACA,SAAO;AACT;AAGO,SAAS,YAAY,OAAqE;AAC/F,MAAI,MAAM,UAAW,QAAO,MAAM;AAClC,MAAI,MAAM,aAAa,WAAW;AAChC,UAAM,KAAK,MAAM,IAAI,MAAM,uCAAuC,IAAI,CAAC,KAAK,MAAM;AAClF,WAAO,KAAK,0BAA0B,EAAE,mBAAmB;AAAA,EAC7D;AACA,SAAO;AACT;AAEA,SAAS,YAAY,EAAE,OAAO,KAAK,GAA4B;AAC7D,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,MAAI,CAAC,MAAM,IAAK,QAAO;AAEvB,QAAM,YAAY,MAAM,UAAU,MAAM,aAAa,UAAU,CAAC;AAChE,QAAM,QAAQ,YAAY,YAAY,KAAK,IAAI;AAE/C,QAAM,QACJ,MAAM,aAAa,SACjB,oBAAC,WAAM,WAAU,uBAAsB,KAAK,MAAM,KAAK,UAAQ,MAAC,QAAQ,MAAM,aAAa,QAAW,IACpG;AAAA;AAAA,IAEF;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM,SAAS,aAAa,aAAa,IAAI;AAAA,QACtD,cAAY,mBAAmB,MAAM,SAAS,OAAO;AAAA,QAEpD;AAAA;AAAA;AAAA,YAEC,oBAAC,SAAI,KAAK,OAAO,KAAI,IAAG,SAAQ,QAAO;AAAA,cAEvC,oBAAC,UAAK,WAAU,0BAAyB,eAAW,MAAC;AAAA,UAEvD,oBAAC,UAAK,WAAU,qBAAoB,eAAW,MAAC,oBAAC;AAAA;AAAA;AAAA,IACnD;AAAA,MAEA,oBAAC,SAAI,WAAU,sBACb;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,SAAS,MAAM,UAAU,MAAM,KAAK,SAAS;AAAA,MAClD,OAAO,MAAM,SAAS;AAAA,MACtB,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,iBAAe;AAAA;AAAA,EACjB,GACF;AAEJ,SACE,qBAAC,YAAO,WAAU,eAChB;AAAA,wBAAC,gBAAa,OAAO,MAAM,gBAAgB,CAAC,WAAW,SAAS,SAAS,WAAW,OAAM,SAAS,iBAAM;AAAA,IACxG,MAAM,WAAW,oBAAC,gBAAY,gBAAM,SAAQ;AAAA,KAC/C;AAEJ;AAEO,MAAM,aAAa,YAAY;AAAA,EACpC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,UAAU,WAAW,KAAK,IAAI,cAAc,KAAK;AACtE,CAAC;","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* wa.me accepteert alleen cijfers (internationaal, zonder + of spaties). Een nationaal nummer
|
|
4
|
+
* ("06-12345678") heeft geen landcode — die zomaar strippen levert een verkeerd nummer op, dus
|
|
5
|
+
* dan liever geen link (de editor-preview vraagt om internationale notatie).
|
|
6
|
+
*/
|
|
7
|
+
export declare function waLink(phone: string, text?: string): string | null;
|
|
8
|
+
export declare const whatsappChatBlock: import("..").BlockDefinition<z.ZodTypeAny>;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { WhatsappChatBlockSchema } from "../../schema/blocks";
|
|
4
|
+
import { defineBlock } from "../registry";
|
|
5
|
+
function waLink(phone, text) {
|
|
6
|
+
const trimmed = phone.trim();
|
|
7
|
+
const digits = trimmed.replace(/\D/g, "");
|
|
8
|
+
const intl = trimmed.startsWith("+") ? digits : digits.startsWith("00") ? digits.slice(2) : digits.startsWith("0") ? null : digits;
|
|
9
|
+
if (!intl || intl.length < 8 || intl.length > 15) return null;
|
|
10
|
+
return `https://wa.me/${intl}${text ? `?text=${encodeURIComponent(text)}` : ""}`;
|
|
11
|
+
}
|
|
12
|
+
function WhatsappChatRender({ block, mode }) {
|
|
13
|
+
const href = waLink(block.phone, block.prefilledText);
|
|
14
|
+
if (!href) {
|
|
15
|
+
return mode === "preview" ? /* @__PURE__ */ jsx("p", { className: "xicms-ve__hint", children: "\u{1F4AC} WhatsApp-knop: vul een internationaal telefoonnummer in (bv. +31 6 12345678)." }) : null;
|
|
16
|
+
}
|
|
17
|
+
const icon = /* @__PURE__ */ jsxs("svg", { width: "22", height: "22", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.9", "aria-hidden": true, children: [
|
|
18
|
+
/* @__PURE__ */ jsx("path", { d: "M12 4.2a7.8 7.8 0 0 0-6.7 11.8L4.4 19.6l3.7-.9A7.8 7.8 0 1 0 12 4.2z" }),
|
|
19
|
+
/* @__PURE__ */ jsx("path", { d: "M9.3 8.9c.7 2.4 2.6 4.4 5 5l1-1.2 2 1.2", strokeLinecap: "round", strokeLinejoin: "round" })
|
|
20
|
+
] });
|
|
21
|
+
return /* @__PURE__ */ jsxs(
|
|
22
|
+
"a",
|
|
23
|
+
{
|
|
24
|
+
className: "xicms-whatsapp",
|
|
25
|
+
"data-position": block.position,
|
|
26
|
+
"data-preview": mode === "preview" ? "1" : void 0,
|
|
27
|
+
href,
|
|
28
|
+
target: "_blank",
|
|
29
|
+
rel: "noopener noreferrer",
|
|
30
|
+
"aria-label": block.label || "Chat via WhatsApp",
|
|
31
|
+
children: [
|
|
32
|
+
icon,
|
|
33
|
+
block.label && /* @__PURE__ */ jsx("span", { className: "xicms-whatsapp__label", "data-xicms-edit": "label", children: block.label })
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
const whatsappChatBlock = defineBlock({
|
|
39
|
+
type: "whatsappChat",
|
|
40
|
+
schema: WhatsappChatBlockSchema,
|
|
41
|
+
Render: WhatsappChatRender,
|
|
42
|
+
label: "WhatsApp-knop",
|
|
43
|
+
icon: "\u{1F4AC}",
|
|
44
|
+
category: "widget",
|
|
45
|
+
defaults: () => ({ phone: "", label: "App ons", position: "br" })
|
|
46
|
+
});
|
|
47
|
+
export {
|
|
48
|
+
waLink,
|
|
49
|
+
whatsappChatBlock
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=WhatsappChat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/blocks/builtins/WhatsappChat.tsx"],"sourcesContent":["\"use client\";\n\nimport type { z } from \"zod\";\nimport { WhatsappChatBlockSchema } from \"../../schema/blocks\";\nimport { defineBlock, type BlockRenderProps } from \"../registry\";\n\ntype WhatsappChat = z.infer<typeof WhatsappChatBlockSchema>;\n\n/**\n * wa.me accepteert alleen cijfers (internationaal, zonder + of spaties). Een nationaal nummer\n * (\"06-12345678\") heeft geen landcode — die zomaar strippen levert een verkeerd nummer op, dus\n * dan liever geen link (de editor-preview vraagt om internationale notatie).\n */\nexport function waLink(phone: string, text?: string): string | null {\n const trimmed = phone.trim();\n const digits = trimmed.replace(/\\D/g, \"\");\n const intl = trimmed.startsWith(\"+\")\n ? digits\n : digits.startsWith(\"00\")\n ? digits.slice(2)\n : digits.startsWith(\"0\")\n ? null\n : digits;\n if (!intl || intl.length < 8 || intl.length > 15) return null;\n return `https://wa.me/${intl}${text ? `?text=${encodeURIComponent(text)}` : \"\"}`;\n}\n\n/**\n * Zwevende WhatsApp-knop — dé laagdrempelige contactknop voor lokale bedrijven. Gewone link\n * (geen embed/scripts), dus geen consent nodig. In de editor-preview inline weergegeven zodat\n * hij het canvas niet overlapt.\n */\nfunction WhatsappChatRender({ block, mode }: BlockRenderProps<WhatsappChat>) {\n const href = waLink(block.phone, block.prefilledText);\n if (!href) {\n return mode === \"preview\" ? <p className=\"xicms-ve__hint\">💬 WhatsApp-knop: vul een internationaal telefoonnummer in (bv. +31 6 12345678).</p> : null;\n }\n const icon = (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.9\" aria-hidden>\n <path d=\"M12 4.2a7.8 7.8 0 0 0-6.7 11.8L4.4 19.6l3.7-.9A7.8 7.8 0 1 0 12 4.2z\" />\n <path d=\"M9.3 8.9c.7 2.4 2.6 4.4 5 5l1-1.2 2 1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n return (\n <a\n className=\"xicms-whatsapp\"\n data-position={block.position}\n data-preview={mode === \"preview\" ? \"1\" : undefined}\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={block.label || \"Chat via WhatsApp\"}\n >\n {icon}\n {block.label && <span className=\"xicms-whatsapp__label\" data-xicms-edit=\"label\">{block.label}</span>}\n </a>\n );\n}\n\nexport const whatsappChatBlock = defineBlock({\n type: \"whatsappChat\",\n schema: WhatsappChatBlockSchema,\n Render: WhatsappChatRender,\n label: \"WhatsApp-knop\",\n icon: \"💬\",\n category: \"widget\",\n defaults: () => ({ phone: \"\", label: \"App ons\", position: \"br\" }),\n});\n"],"mappings":";AAmCgC,cAG5B,YAH4B;AAhChC,SAAS,+BAA+B;AACxC,SAAS,mBAA0C;AAS5C,SAAS,OAAO,OAAe,MAA8B;AAClE,QAAM,UAAU,MAAM,KAAK;AAC3B,QAAM,SAAS,QAAQ,QAAQ,OAAO,EAAE;AACxC,QAAM,OAAO,QAAQ,WAAW,GAAG,IAC/B,SACA,OAAO,WAAW,IAAI,IACpB,OAAO,MAAM,CAAC,IACd,OAAO,WAAW,GAAG,IACnB,OACA;AACR,MAAI,CAAC,QAAQ,KAAK,SAAS,KAAK,KAAK,SAAS,GAAI,QAAO;AACzD,SAAO,iBAAiB,IAAI,GAAG,OAAO,SAAS,mBAAmB,IAAI,CAAC,KAAK,EAAE;AAChF;AAOA,SAAS,mBAAmB,EAAE,OAAO,KAAK,GAAmC;AAC3E,QAAM,OAAO,OAAO,MAAM,OAAO,MAAM,aAAa;AACpD,MAAI,CAAC,MAAM;AACT,WAAO,SAAS,YAAY,oBAAC,OAAE,WAAU,kBAAiB,qGAAgF,IAAO;AAAA,EACnJ;AACA,QAAM,OACJ,qBAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAW,MAC7G;AAAA,wBAAC,UAAK,GAAE,wEAAuE;AAAA,IAC/E,oBAAC,UAAK,GAAE,2CAA0C,eAAc,SAAQ,gBAAe,SAAQ;AAAA,KACjG;AAEF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,iBAAe,MAAM;AAAA,MACrB,gBAAc,SAAS,YAAY,MAAM;AAAA,MACzC;AAAA,MACA,QAAO;AAAA,MACP,KAAI;AAAA,MACJ,cAAY,MAAM,SAAS;AAAA,MAE1B;AAAA;AAAA,QACA,MAAM,SAAS,oBAAC,UAAK,WAAU,yBAAwB,mBAAgB,SAAS,gBAAM,OAAM;AAAA;AAAA;AAAA,EAC/F;AAEJ;AAEO,MAAM,oBAAoB,YAAY;AAAA,EAC3C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU,OAAO,EAAE,OAAO,IAAI,OAAO,WAAW,UAAU,KAAK;AACjE,CAAC;","names":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
export declare const newsWidget: import("..").BlockDefinition<z.ZodTypeAny>;
|
|
3
|
+
export declare const agendaWidget: import("..").BlockDefinition<z.ZodTypeAny>;
|
|
4
|
+
export declare const openingHoursWidget: import("..").BlockDefinition<z.ZodTypeAny>;
|
|
5
|
+
export declare const contactWidget: import("..").BlockDefinition<z.ZodTypeAny>;
|
|
6
|
+
export declare const socialWidget: import("..").BlockDefinition<z.ZodTypeAny>;
|
|
7
|
+
export declare const newsletterWidget: import("..").BlockDefinition<z.ZodTypeAny>;
|
|
8
|
+
export declare const ctaWidget: import("..").BlockDefinition<z.ZodTypeAny>;
|
|
9
|
+
export declare const galleryWidget: import("..").BlockDefinition<z.ZodTypeAny>;
|
|
10
|
+
export declare const testimonialsWidget: import("..").BlockDefinition<z.ZodTypeAny>;
|
|
11
|
+
export declare const cardsWidget: import("..").BlockDefinition<z.ZodTypeAny>;
|
|
12
|
+
export declare const downloadsWidget: import("..").BlockDefinition<z.ZodTypeAny>;
|
|
13
|
+
export declare const countdownWidget: import("..").BlockDefinition<z.ZodTypeAny>;
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
import {
|
|
5
|
+
NewsWidgetSchema,
|
|
6
|
+
AgendaWidgetSchema,
|
|
7
|
+
OpeningHoursWidgetSchema,
|
|
8
|
+
ContactWidgetSchema,
|
|
9
|
+
SocialWidgetSchema,
|
|
10
|
+
NewsletterWidgetSchema,
|
|
11
|
+
CtaWidgetSchema,
|
|
12
|
+
GalleryWidgetSchema,
|
|
13
|
+
TestimonialsWidgetSchema,
|
|
14
|
+
CardsWidgetSchema,
|
|
15
|
+
DownloadsWidgetSchema,
|
|
16
|
+
CountdownWidgetSchema
|
|
17
|
+
} from "../../schema/blocks";
|
|
18
|
+
import { defineBlock } from "../registry";
|
|
19
|
+
import { useNews } from "../../components/News";
|
|
20
|
+
import { selectAgendaEvents, formatEventDate } from "./Agenda";
|
|
21
|
+
import { useCountdown, CountdownDigits } from "./Countdown";
|
|
22
|
+
import { TextInput } from "@astryxdesign/core/TextInput";
|
|
23
|
+
import { Button } from "@astryxdesign/core/Button";
|
|
24
|
+
function NewsWidgetRender({ block }) {
|
|
25
|
+
const { articles, loading } = useNews({ max: block.limit });
|
|
26
|
+
const shown = articles.slice(0, block.limit);
|
|
27
|
+
return /* @__PURE__ */ jsxs("div", { className: "xicms-widget xicms-widget--news", children: [
|
|
28
|
+
/* @__PURE__ */ jsx("h3", { className: "xicms-widget__title", children: block.heading ?? "Laatste nieuws" }),
|
|
29
|
+
loading ? /* @__PURE__ */ jsx("p", { className: "xicms-widget__empty", children: "Nieuws laden\u2026" }) : shown.length === 0 ? /* @__PURE__ */ jsx("p", { className: "xicms-widget__empty", children: "Nog geen nieuws." }) : /* @__PURE__ */ jsx("ul", { className: "xicms-widget__list", children: shown.map((a) => /* @__PURE__ */ jsxs("li", { className: "xicms-widget__item", children: [
|
|
30
|
+
block.showImages && a.coverUrl && // eslint-disable-next-line @next/next/no-img-element
|
|
31
|
+
/* @__PURE__ */ jsx("img", { className: "xicms-widget__thumb", src: a.coverUrl, alt: "", loading: "lazy" }),
|
|
32
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
33
|
+
/* @__PURE__ */ jsx("a", { className: "xicms-widget__link", href: `${block.basePath}/${a.slug}`, children: a.title }),
|
|
34
|
+
/* @__PURE__ */ jsx("span", { className: "xicms-widget__meta", children: a.date })
|
|
35
|
+
] })
|
|
36
|
+
] }, a.id)) })
|
|
37
|
+
] });
|
|
38
|
+
}
|
|
39
|
+
const newsWidget = defineBlock({
|
|
40
|
+
type: "newsWidget",
|
|
41
|
+
schema: NewsWidgetSchema,
|
|
42
|
+
Render: NewsWidgetRender,
|
|
43
|
+
label: "Laatste nieuws",
|
|
44
|
+
icon: "\u{1F5DE}\uFE0F",
|
|
45
|
+
category: "widget",
|
|
46
|
+
defaults: () => ({ heading: "Laatste nieuws", limit: 5, basePath: "/nieuws", showImages: false })
|
|
47
|
+
});
|
|
48
|
+
function AgendaWidgetRender({ block }) {
|
|
49
|
+
const events = selectAgendaEvents(block.events, { hidePast: block.hidePast, limit: block.limit });
|
|
50
|
+
return /* @__PURE__ */ jsxs("div", { className: "xicms-widget xicms-widget--agenda", children: [
|
|
51
|
+
/* @__PURE__ */ jsx("h3", { className: "xicms-widget__title", children: block.heading ?? "Komende evenementen" }),
|
|
52
|
+
events.length === 0 ? /* @__PURE__ */ jsx("p", { className: "xicms-widget__empty", children: "Geen geplande evenementen." }) : /* @__PURE__ */ jsx("ul", { className: "xicms-widget__list", children: events.map((e, i) => /* @__PURE__ */ jsxs("li", { className: "xicms-widget__item xicms-widget__item--event", children: [
|
|
53
|
+
/* @__PURE__ */ jsx("time", { className: "xicms-widget__meta", dateTime: e.start, children: formatEventDate(e.start) }),
|
|
54
|
+
/* @__PURE__ */ jsx("span", { className: "xicms-widget__link", children: e.url ? /* @__PURE__ */ jsx("a", { href: e.url, children: e.title }) : e.title }),
|
|
55
|
+
e.location && /* @__PURE__ */ jsx("span", { className: "xicms-widget__sub", children: e.location })
|
|
56
|
+
] }, i)) })
|
|
57
|
+
] });
|
|
58
|
+
}
|
|
59
|
+
const agendaWidget = defineBlock({
|
|
60
|
+
type: "agendaWidget",
|
|
61
|
+
schema: AgendaWidgetSchema,
|
|
62
|
+
Render: AgendaWidgetRender,
|
|
63
|
+
label: "Komende agenda",
|
|
64
|
+
icon: "\u{1F4C5}",
|
|
65
|
+
category: "widget",
|
|
66
|
+
defaults: () => ({ heading: "Komende evenementen", limit: 5, events: [], hidePast: true })
|
|
67
|
+
});
|
|
68
|
+
const DAY_KEYWORDS = ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"];
|
|
69
|
+
function OpeningHoursWidgetRender({ block }) {
|
|
70
|
+
const [todayIdx, setTodayIdx] = useState(null);
|
|
71
|
+
useEffect(() => setTodayIdx((/* @__PURE__ */ new Date()).getDay()), []);
|
|
72
|
+
const rows = block.rows ?? [];
|
|
73
|
+
const todayWord = todayIdx === null ? "" : DAY_KEYWORDS[todayIdx];
|
|
74
|
+
return /* @__PURE__ */ jsxs("div", { className: "xicms-widget xicms-widget--hours", children: [
|
|
75
|
+
/* @__PURE__ */ jsx("h3", { className: "xicms-widget__title", children: block.heading ?? "Openingstijden" }),
|
|
76
|
+
/* @__PURE__ */ jsx("table", { className: "xicms-widget__hours", children: /* @__PURE__ */ jsx("tbody", { children: rows.map((r, i) => {
|
|
77
|
+
const isToday = block.highlightToday && !!todayWord && r.day.toLowerCase().includes(todayWord);
|
|
78
|
+
return /* @__PURE__ */ jsxs("tr", { className: isToday ? "xicms-widget__hours-today" : void 0, children: [
|
|
79
|
+
/* @__PURE__ */ jsx("th", { scope: "row", children: r.day }),
|
|
80
|
+
/* @__PURE__ */ jsx("td", { children: r.hours })
|
|
81
|
+
] }, i);
|
|
82
|
+
}) }) })
|
|
83
|
+
] });
|
|
84
|
+
}
|
|
85
|
+
const openingHoursWidget = defineBlock({
|
|
86
|
+
type: "openingHoursWidget",
|
|
87
|
+
schema: OpeningHoursWidgetSchema,
|
|
88
|
+
Render: OpeningHoursWidgetRender,
|
|
89
|
+
label: "Openingstijden (compact)",
|
|
90
|
+
icon: "\u{1F552}",
|
|
91
|
+
category: "widget",
|
|
92
|
+
defaults: () => ({
|
|
93
|
+
heading: "Openingstijden",
|
|
94
|
+
highlightToday: true,
|
|
95
|
+
rows: [
|
|
96
|
+
{ day: "Maandag t/m vrijdag", hours: "09:00 \u2013 17:00" },
|
|
97
|
+
{ day: "Zaterdag", hours: "10:00 \u2013 16:00" },
|
|
98
|
+
{ day: "Zondag", hours: "Gesloten" }
|
|
99
|
+
]
|
|
100
|
+
})
|
|
101
|
+
});
|
|
102
|
+
function ContactWidgetRender({ block }) {
|
|
103
|
+
if (!block.address && !block.phone && !block.email) return null;
|
|
104
|
+
return /* @__PURE__ */ jsxs("div", { className: "xicms-widget xicms-widget--contact", children: [
|
|
105
|
+
/* @__PURE__ */ jsx("h3", { className: "xicms-widget__title", children: block.heading ?? "Contact" }),
|
|
106
|
+
/* @__PURE__ */ jsxs("ul", { className: "xicms-widget__list", children: [
|
|
107
|
+
block.address && /* @__PURE__ */ jsx("li", { className: "xicms-widget__item", children: block.address }),
|
|
108
|
+
block.phone && /* @__PURE__ */ jsx("li", { className: "xicms-widget__item", children: /* @__PURE__ */ jsx("a", { href: `tel:${block.phone.replace(/\s+/g, "")}`, children: block.phone }) }),
|
|
109
|
+
block.email && /* @__PURE__ */ jsx("li", { className: "xicms-widget__item", children: /* @__PURE__ */ jsx("a", { href: `mailto:${block.email}`, children: block.email }) })
|
|
110
|
+
] })
|
|
111
|
+
] });
|
|
112
|
+
}
|
|
113
|
+
const contactWidget = defineBlock({
|
|
114
|
+
type: "contactWidget",
|
|
115
|
+
schema: ContactWidgetSchema,
|
|
116
|
+
Render: ContactWidgetRender,
|
|
117
|
+
label: "Contact (compact)",
|
|
118
|
+
icon: "\u{1F4C7}",
|
|
119
|
+
category: "widget",
|
|
120
|
+
defaults: () => ({ heading: "Contact" })
|
|
121
|
+
});
|
|
122
|
+
function SocialWidgetRender({ block }) {
|
|
123
|
+
const items = (block.items ?? []).filter((i) => i.href && i.platform);
|
|
124
|
+
if (items.length === 0) return null;
|
|
125
|
+
return /* @__PURE__ */ jsxs("div", { className: "xicms-widget xicms-widget--social", children: [
|
|
126
|
+
block.heading && /* @__PURE__ */ jsx("h3", { className: "xicms-widget__title", children: block.heading }),
|
|
127
|
+
/* @__PURE__ */ jsx("ul", { className: "xicms-widget__social", children: items.map((it, i) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("a", { href: it.href, rel: "noopener noreferrer", target: "_blank", children: it.platform }) }, i)) })
|
|
128
|
+
] });
|
|
129
|
+
}
|
|
130
|
+
const socialWidget = defineBlock({
|
|
131
|
+
type: "socialWidget",
|
|
132
|
+
schema: SocialWidgetSchema,
|
|
133
|
+
Render: SocialWidgetRender,
|
|
134
|
+
label: "Social (compact)",
|
|
135
|
+
icon: "\u{1F517}",
|
|
136
|
+
category: "widget",
|
|
137
|
+
defaults: () => ({ heading: "Volg ons", items: [{ platform: "Instagram", href: "" }] })
|
|
138
|
+
});
|
|
139
|
+
function NewsletterWidgetRender({ block }) {
|
|
140
|
+
const [email, setEmail] = useState("");
|
|
141
|
+
return /* @__PURE__ */ jsxs("div", { className: "xicms-widget xicms-widget--newsletter", children: [
|
|
142
|
+
/* @__PURE__ */ jsx("h3", { className: "xicms-widget__title", children: block.heading ?? "Nieuwsbrief" }),
|
|
143
|
+
block.text && /* @__PURE__ */ jsx("p", { className: "xicms-widget__sub", children: block.text }),
|
|
144
|
+
block.actionUrl ? /* @__PURE__ */ jsxs("form", { className: "xicms-widget__form", action: block.actionUrl, method: "post", target: "_blank", style: { display: "grid", gap: "0.6rem" }, children: [
|
|
145
|
+
/* @__PURE__ */ jsx(TextInput, { label: "E-mailadres", isLabelHidden: true, type: "email", htmlName: "EMAIL", isRequired: true, placeholder: "je@email.nl", value: email, onChange: setEmail }),
|
|
146
|
+
/* @__PURE__ */ jsx(Button, { label: block.buttonLabel, variant: "primary", type: "submit" })
|
|
147
|
+
] }) : /* @__PURE__ */ jsx("p", { className: "xicms-widget__empty", children: "Stel een aanmeld-URL in." })
|
|
148
|
+
] });
|
|
149
|
+
}
|
|
150
|
+
const newsletterWidget = defineBlock({
|
|
151
|
+
type: "newsletterWidget",
|
|
152
|
+
schema: NewsletterWidgetSchema,
|
|
153
|
+
Render: NewsletterWidgetRender,
|
|
154
|
+
label: "Nieuwsbrief (compact)",
|
|
155
|
+
icon: "\u2709\uFE0F",
|
|
156
|
+
category: "widget",
|
|
157
|
+
defaults: () => ({ heading: "Blijf op de hoogte", buttonLabel: "Aanmelden" })
|
|
158
|
+
});
|
|
159
|
+
function CtaWidgetRender({ block }) {
|
|
160
|
+
if (!block.title && !block.text) return null;
|
|
161
|
+
return /* @__PURE__ */ jsxs("div", { className: "xicms-widget xicms-widget--cta", style: block.backgroundColor ? { background: block.backgroundColor } : void 0, children: [
|
|
162
|
+
block.title && /* @__PURE__ */ jsx("h3", { className: "xicms-widget__title", children: block.title }),
|
|
163
|
+
block.text && /* @__PURE__ */ jsx("p", { className: "xicms-widget__sub", children: block.text }),
|
|
164
|
+
block.buttonLabel && /* @__PURE__ */ jsx("a", { className: "xicms-btn xicms-btn--primary", href: block.buttonHref, children: block.buttonLabel })
|
|
165
|
+
] });
|
|
166
|
+
}
|
|
167
|
+
const ctaWidget = defineBlock({
|
|
168
|
+
type: "ctaWidget",
|
|
169
|
+
schema: CtaWidgetSchema,
|
|
170
|
+
Render: CtaWidgetRender,
|
|
171
|
+
label: "Call-to-action (compact)",
|
|
172
|
+
icon: "\u{1F449}",
|
|
173
|
+
category: "widget",
|
|
174
|
+
defaults: () => ({ title: "Vragen?", text: "Neem gerust contact op.", buttonLabel: "Contact", buttonHref: "#contact" })
|
|
175
|
+
});
|
|
176
|
+
function GalleryWidgetRender({ block }) {
|
|
177
|
+
const items = (block.items ?? []).filter((i) => i.url);
|
|
178
|
+
if (items.length === 0) return null;
|
|
179
|
+
return /* @__PURE__ */ jsxs("div", { className: "xicms-widget xicms-widget--gallery", children: [
|
|
180
|
+
block.heading && /* @__PURE__ */ jsx("h3", { className: "xicms-widget__title", children: block.heading }),
|
|
181
|
+
/* @__PURE__ */ jsx("div", { className: "xicms-widget__grid", "data-cols": block.columns, children: items.map((it, i) => (
|
|
182
|
+
// eslint-disable-next-line @next/next/no-img-element
|
|
183
|
+
/* @__PURE__ */ jsx("img", { className: "xicms-widget__photo", src: it.url, alt: it.alt ?? "", loading: "lazy" }, i)
|
|
184
|
+
)) })
|
|
185
|
+
] });
|
|
186
|
+
}
|
|
187
|
+
const galleryWidget = defineBlock({
|
|
188
|
+
type: "galleryWidget",
|
|
189
|
+
schema: GalleryWidgetSchema,
|
|
190
|
+
Render: GalleryWidgetRender,
|
|
191
|
+
label: "Fotostrip (compact)",
|
|
192
|
+
icon: "\u{1F5BC}\uFE0F",
|
|
193
|
+
category: "widget",
|
|
194
|
+
defaults: () => ({ heading: "Foto's", columns: 3, items: [] })
|
|
195
|
+
});
|
|
196
|
+
function TestimonialsWidgetRender({ block }) {
|
|
197
|
+
const items = (block.items ?? []).filter((t) => t.quote);
|
|
198
|
+
if (items.length === 0) return null;
|
|
199
|
+
return /* @__PURE__ */ jsxs("div", { className: "xicms-widget xicms-widget--testimonial", children: [
|
|
200
|
+
block.heading && /* @__PURE__ */ jsx("h3", { className: "xicms-widget__title", children: block.heading }),
|
|
201
|
+
/* @__PURE__ */ jsx("ul", { className: "xicms-widget__list", children: items.map((t, i) => /* @__PURE__ */ jsxs("li", { className: "xicms-widget__quote", children: [
|
|
202
|
+
typeof t.rating === "number" && /* @__PURE__ */ jsxs("span", { className: "xicms-widget__stars", "aria-label": `${t.rating} van 5`, children: [
|
|
203
|
+
"\u2605".repeat(t.rating),
|
|
204
|
+
"\u2606".repeat(5 - t.rating)
|
|
205
|
+
] }),
|
|
206
|
+
/* @__PURE__ */ jsxs("p", { children: [
|
|
207
|
+
"\u201C",
|
|
208
|
+
t.quote,
|
|
209
|
+
"\u201D"
|
|
210
|
+
] }),
|
|
211
|
+
t.author && /* @__PURE__ */ jsxs("span", { className: "xicms-widget__meta", children: [
|
|
212
|
+
"\u2014 ",
|
|
213
|
+
t.author
|
|
214
|
+
] })
|
|
215
|
+
] }, i)) })
|
|
216
|
+
] });
|
|
217
|
+
}
|
|
218
|
+
const testimonialsWidget = defineBlock({
|
|
219
|
+
type: "testimonialsWidget",
|
|
220
|
+
schema: TestimonialsWidgetSchema,
|
|
221
|
+
Render: TestimonialsWidgetRender,
|
|
222
|
+
label: "Review (compact)",
|
|
223
|
+
icon: "\u2B50",
|
|
224
|
+
category: "widget",
|
|
225
|
+
defaults: () => ({ heading: "Wat klanten zeggen", items: [{ quote: "Echt een aanrader!", author: "Tevreden klant", rating: 5 }] })
|
|
226
|
+
});
|
|
227
|
+
function CardsWidgetRender({ block }) {
|
|
228
|
+
const items = (block.items ?? []).filter((c) => c.title);
|
|
229
|
+
if (items.length === 0) return null;
|
|
230
|
+
return /* @__PURE__ */ jsxs("div", { className: "xicms-widget xicms-widget--cards", children: [
|
|
231
|
+
block.heading && /* @__PURE__ */ jsx("h3", { className: "xicms-widget__title", children: block.heading }),
|
|
232
|
+
/* @__PURE__ */ jsx("ul", { className: "xicms-widget__list", children: items.map((c, i) => {
|
|
233
|
+
const inner = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
234
|
+
c.icon && /* @__PURE__ */ jsx("span", { className: "xicms-widget__cardicon", "aria-hidden": "true", children: c.icon }),
|
|
235
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
236
|
+
/* @__PURE__ */ jsx("span", { className: "xicms-widget__link", children: c.title }),
|
|
237
|
+
c.text && /* @__PURE__ */ jsx("span", { className: "xicms-widget__sub", children: c.text })
|
|
238
|
+
] })
|
|
239
|
+
] });
|
|
240
|
+
return /* @__PURE__ */ jsx("li", { className: "xicms-widget__item xicms-widget__item--card", children: c.href ? /* @__PURE__ */ jsx("a", { href: c.href, className: "xicms-widget__cardlink", children: inner }) : inner }, i);
|
|
241
|
+
}) })
|
|
242
|
+
] });
|
|
243
|
+
}
|
|
244
|
+
const cardsWidget = defineBlock({
|
|
245
|
+
type: "cardsWidget",
|
|
246
|
+
schema: CardsWidgetSchema,
|
|
247
|
+
Render: CardsWidgetRender,
|
|
248
|
+
label: "Diensten (compact)",
|
|
249
|
+
icon: "\u{1F9E9}",
|
|
250
|
+
category: "widget",
|
|
251
|
+
defaults: () => ({ heading: "Uitgelicht", items: [{ icon: "\u2B50", title: "Dienst", text: "Korte omschrijving." }] })
|
|
252
|
+
});
|
|
253
|
+
function DownloadsWidgetRender({ block }) {
|
|
254
|
+
const items = (block.items ?? []).filter((d) => d.label && d.href).slice(0, block.limit);
|
|
255
|
+
if (items.length === 0) return null;
|
|
256
|
+
return /* @__PURE__ */ jsxs("div", { className: "xicms-widget xicms-widget--downloads", children: [
|
|
257
|
+
/* @__PURE__ */ jsx("h3", { className: "xicms-widget__title", children: block.heading ?? "Downloads" }),
|
|
258
|
+
/* @__PURE__ */ jsx("ul", { className: "xicms-widget__list", children: items.map((d, i) => /* @__PURE__ */ jsxs("li", { className: "xicms-widget__item", children: [
|
|
259
|
+
/* @__PURE__ */ jsxs("a", { className: "xicms-widget__link", href: d.href, download: true, children: [
|
|
260
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\u{1F4C4}" }),
|
|
261
|
+
" ",
|
|
262
|
+
d.label
|
|
263
|
+
] }),
|
|
264
|
+
d.meta && /* @__PURE__ */ jsx("span", { className: "xicms-widget__meta", children: d.meta })
|
|
265
|
+
] }, i)) })
|
|
266
|
+
] });
|
|
267
|
+
}
|
|
268
|
+
const downloadsWidget = defineBlock({
|
|
269
|
+
type: "downloadsWidget",
|
|
270
|
+
schema: DownloadsWidgetSchema,
|
|
271
|
+
Render: DownloadsWidgetRender,
|
|
272
|
+
label: "Downloads (compact)",
|
|
273
|
+
icon: "\u{1F4E5}",
|
|
274
|
+
category: "widget",
|
|
275
|
+
defaults: () => ({ heading: "Downloads", limit: 5, items: [] })
|
|
276
|
+
});
|
|
277
|
+
function CountdownWidgetRender({ block }) {
|
|
278
|
+
const r = useCountdown(block.target);
|
|
279
|
+
if (!block.target) return null;
|
|
280
|
+
return /* @__PURE__ */ jsxs("div", { className: "xicms-widget xicms-widget--countdown", children: [
|
|
281
|
+
block.heading && /* @__PURE__ */ jsx("h3", { className: "xicms-widget__title", children: block.heading }),
|
|
282
|
+
r === null ? /* @__PURE__ */ jsx("p", { className: "xicms-widget__empty", "aria-hidden": "true", children: "\u2026" }) : r.done ? /* @__PURE__ */ jsx("p", { className: "xicms-countdown__expired", children: block.expiredText }) : /* @__PURE__ */ jsx(CountdownDigits, { r, showLabels: true })
|
|
283
|
+
] });
|
|
284
|
+
}
|
|
285
|
+
const countdownWidget = defineBlock({
|
|
286
|
+
type: "countdownWidget",
|
|
287
|
+
schema: CountdownWidgetSchema,
|
|
288
|
+
Render: CountdownWidgetRender,
|
|
289
|
+
label: "Aftelteller (compact)",
|
|
290
|
+
icon: "\u23F3",
|
|
291
|
+
category: "widget",
|
|
292
|
+
defaults: () => ({ heading: "Aftellen", target: "", expiredText: "Het is zover!" })
|
|
293
|
+
});
|
|
294
|
+
export {
|
|
295
|
+
agendaWidget,
|
|
296
|
+
cardsWidget,
|
|
297
|
+
contactWidget,
|
|
298
|
+
countdownWidget,
|
|
299
|
+
ctaWidget,
|
|
300
|
+
downloadsWidget,
|
|
301
|
+
galleryWidget,
|
|
302
|
+
newsWidget,
|
|
303
|
+
newsletterWidget,
|
|
304
|
+
openingHoursWidget,
|
|
305
|
+
socialWidget,
|
|
306
|
+
testimonialsWidget
|
|
307
|
+
};
|
|
308
|
+
//# sourceMappingURL=Widgets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/blocks/builtins/Widgets.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport type { z } from \"zod\";\nimport {\n NewsWidgetSchema,\n AgendaWidgetSchema,\n OpeningHoursWidgetSchema,\n ContactWidgetSchema,\n SocialWidgetSchema,\n NewsletterWidgetSchema,\n CtaWidgetSchema,\n GalleryWidgetSchema,\n TestimonialsWidgetSchema,\n CardsWidgetSchema,\n DownloadsWidgetSchema,\n CountdownWidgetSchema,\n} from \"../../schema/blocks\";\nimport { defineBlock, type BlockRenderProps } from \"../registry\";\nimport { useNews } from \"../../components/News\";\nimport { selectAgendaEvents, formatEventDate } from \"./Agenda\";\nimport { useCountdown, CountdownDigits } from \"./Countdown\";\nimport { TextInput } from \"@astryxdesign/core/TextInput\";\nimport { Button } from \"@astryxdesign/core/Button\";\n\n/**\n * Widgets = compacte zijbalk-varianten van de modules. Elke widget hergebruikt de gegevens en\n * logica van de volwaardige versie (zelfde nieuws-collectie, zelfde agenda-selectie, zelfde\n * countdown-hook) en rendert die alleen compacter. Plaats ze in het \"Met zijbalk\"-blok of in een\n * smalle kolom naast je hoofdinhoud.\n */\n\n/* ── Laatste nieuws ────────────────────────────────────────────────────────── */\ntype NewsW = z.infer<typeof NewsWidgetSchema>;\nfunction NewsWidgetRender({ block }: BlockRenderProps<NewsW>) {\n const { articles, loading } = useNews({ max: block.limit });\n const shown = articles.slice(0, block.limit);\n return (\n <div className=\"xicms-widget xicms-widget--news\">\n <h3 className=\"xicms-widget__title\">{block.heading ?? \"Laatste nieuws\"}</h3>\n {loading ? (\n <p className=\"xicms-widget__empty\">Nieuws laden…</p>\n ) : shown.length === 0 ? (\n <p className=\"xicms-widget__empty\">Nog geen nieuws.</p>\n ) : (\n <ul className=\"xicms-widget__list\">\n {shown.map((a) => (\n <li key={a.id} className=\"xicms-widget__item\">\n {block.showImages && a.coverUrl && (\n // eslint-disable-next-line @next/next/no-img-element\n <img className=\"xicms-widget__thumb\" src={a.coverUrl} alt=\"\" loading=\"lazy\" />\n )}\n <div>\n <a className=\"xicms-widget__link\" href={`${block.basePath}/${a.slug}`}>{a.title}</a>\n <span className=\"xicms-widget__meta\">{a.date}</span>\n </div>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\nexport const newsWidget = defineBlock({\n type: \"newsWidget\",\n schema: NewsWidgetSchema,\n Render: NewsWidgetRender,\n label: \"Laatste nieuws\",\n icon: \"🗞️\",\n category: \"widget\",\n defaults: () => ({ heading: \"Laatste nieuws\", limit: 5, basePath: \"/nieuws\", showImages: false }),\n});\n\n/* ── Komende agenda ────────────────────────────────────────────────────────── */\ntype AgendaW = z.infer<typeof AgendaWidgetSchema>;\nfunction AgendaWidgetRender({ block }: BlockRenderProps<AgendaW>) {\n const events = selectAgendaEvents(block.events, { hidePast: block.hidePast, limit: block.limit });\n return (\n <div className=\"xicms-widget xicms-widget--agenda\">\n <h3 className=\"xicms-widget__title\">{block.heading ?? \"Komende evenementen\"}</h3>\n {events.length === 0 ? (\n <p className=\"xicms-widget__empty\">Geen geplande evenementen.</p>\n ) : (\n <ul className=\"xicms-widget__list\">\n {events.map((e, i) => (\n <li key={i} className=\"xicms-widget__item xicms-widget__item--event\">\n <time className=\"xicms-widget__meta\" dateTime={e.start}>{formatEventDate(e.start)}</time>\n <span className=\"xicms-widget__link\">{e.url ? <a href={e.url}>{e.title}</a> : e.title}</span>\n {e.location && <span className=\"xicms-widget__sub\">{e.location}</span>}\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\nexport const agendaWidget = defineBlock({\n type: \"agendaWidget\",\n schema: AgendaWidgetSchema,\n Render: AgendaWidgetRender,\n label: \"Komende agenda\",\n icon: \"📅\",\n category: \"widget\",\n defaults: () => ({ heading: \"Komende evenementen\", limit: 5, events: [], hidePast: true }),\n});\n\n/* ── Openingstijden (vandaag gemarkeerd) ───────────────────────────────────── */\nconst DAY_KEYWORDS = [\"zondag\", \"maandag\", \"dinsdag\", \"woensdag\", \"donderdag\", \"vrijdag\", \"zaterdag\"];\ntype OpeningW = z.infer<typeof OpeningHoursWidgetSchema>;\nfunction OpeningHoursWidgetRender({ block }: BlockRenderProps<OpeningW>) {\n // \"Vandaag\" client-side bepalen (voorkomt hydration-mismatch t.o.v. de servertijd).\n const [todayIdx, setTodayIdx] = useState<number | null>(null);\n useEffect(() => setTodayIdx(new Date().getDay()), []);\n const rows = block.rows ?? [];\n const todayWord = todayIdx === null ? \"\" : DAY_KEYWORDS[todayIdx];\n return (\n <div className=\"xicms-widget xicms-widget--hours\">\n <h3 className=\"xicms-widget__title\">{block.heading ?? \"Openingstijden\"}</h3>\n <table className=\"xicms-widget__hours\">\n <tbody>\n {rows.map((r, i) => {\n const isToday =\n block.highlightToday && !!todayWord && r.day.toLowerCase().includes(todayWord);\n return (\n <tr key={i} className={isToday ? \"xicms-widget__hours-today\" : undefined}>\n <th scope=\"row\">{r.day}</th>\n <td>{r.hours}</td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\nexport const openingHoursWidget = defineBlock({\n type: \"openingHoursWidget\",\n schema: OpeningHoursWidgetSchema,\n Render: OpeningHoursWidgetRender,\n label: \"Openingstijden (compact)\",\n icon: \"🕒\",\n category: \"widget\",\n defaults: () => ({\n heading: \"Openingstijden\",\n highlightToday: true,\n rows: [\n { day: \"Maandag t/m vrijdag\", hours: \"09:00 – 17:00\" },\n { day: \"Zaterdag\", hours: \"10:00 – 16:00\" },\n { day: \"Zondag\", hours: \"Gesloten\" },\n ],\n }),\n});\n\n/* ── Contact (compact) ─────────────────────────────────────────────────────── */\ntype ContactW = z.infer<typeof ContactWidgetSchema>;\nfunction ContactWidgetRender({ block }: BlockRenderProps<ContactW>) {\n if (!block.address && !block.phone && !block.email) return null;\n return (\n <div className=\"xicms-widget xicms-widget--contact\">\n <h3 className=\"xicms-widget__title\">{block.heading ?? \"Contact\"}</h3>\n <ul className=\"xicms-widget__list\">\n {block.address && <li className=\"xicms-widget__item\">{block.address}</li>}\n {block.phone && (\n <li className=\"xicms-widget__item\"><a href={`tel:${block.phone.replace(/\\s+/g, \"\")}`}>{block.phone}</a></li>\n )}\n {block.email && (\n <li className=\"xicms-widget__item\"><a href={`mailto:${block.email}`}>{block.email}</a></li>\n )}\n </ul>\n </div>\n );\n}\nexport const contactWidget = defineBlock({\n type: \"contactWidget\",\n schema: ContactWidgetSchema,\n Render: ContactWidgetRender,\n label: \"Contact (compact)\",\n icon: \"📇\",\n category: \"widget\",\n defaults: () => ({ heading: \"Contact\" }),\n});\n\n/* ── Social (compact) ──────────────────────────────────────────────────────── */\ntype SocialW = z.infer<typeof SocialWidgetSchema>;\nfunction SocialWidgetRender({ block }: BlockRenderProps<SocialW>) {\n const items = (block.items ?? []).filter((i) => i.href && i.platform);\n if (items.length === 0) return null;\n return (\n <div className=\"xicms-widget xicms-widget--social\">\n {block.heading && <h3 className=\"xicms-widget__title\">{block.heading}</h3>}\n <ul className=\"xicms-widget__social\">\n {items.map((it, i) => (\n <li key={i}><a href={it.href} rel=\"noopener noreferrer\" target=\"_blank\">{it.platform}</a></li>\n ))}\n </ul>\n </div>\n );\n}\nexport const socialWidget = defineBlock({\n type: \"socialWidget\",\n schema: SocialWidgetSchema,\n Render: SocialWidgetRender,\n label: \"Social (compact)\",\n icon: \"🔗\",\n category: \"widget\",\n defaults: () => ({ heading: \"Volg ons\", items: [{ platform: \"Instagram\", href: \"\" }] }),\n});\n\n/* ── Nieuwsbrief (compact) ─────────────────────────────────────────────────── */\ntype NewsletterW = z.infer<typeof NewsletterWidgetSchema>;\nfunction NewsletterWidgetRender({ block }: BlockRenderProps<NewsletterW>) {\n const [email, setEmail] = useState(\"\");\n return (\n <div className=\"xicms-widget xicms-widget--newsletter\">\n <h3 className=\"xicms-widget__title\">{block.heading ?? \"Nieuwsbrief\"}</h3>\n {block.text && <p className=\"xicms-widget__sub\">{block.text}</p>}\n {block.actionUrl ? (\n <form className=\"xicms-widget__form\" action={block.actionUrl} method=\"post\" target=\"_blank\" style={{ display: \"grid\", gap: \"0.6rem\" }}>\n <TextInput label=\"E-mailadres\" isLabelHidden type=\"email\" htmlName=\"EMAIL\" isRequired placeholder=\"je@email.nl\" value={email} onChange={setEmail} />\n <Button label={block.buttonLabel} variant=\"primary\" type=\"submit\" />\n </form>\n ) : (\n <p className=\"xicms-widget__empty\">Stel een aanmeld-URL in.</p>\n )}\n </div>\n );\n}\nexport const newsletterWidget = defineBlock({\n type: \"newsletterWidget\",\n schema: NewsletterWidgetSchema,\n Render: NewsletterWidgetRender,\n label: \"Nieuwsbrief (compact)\",\n icon: \"✉️\",\n category: \"widget\",\n defaults: () => ({ heading: \"Blijf op de hoogte\", buttonLabel: \"Aanmelden\" }),\n});\n\n/* ── CTA (compact) ─────────────────────────────────────────────────────────── */\ntype CtaW = z.infer<typeof CtaWidgetSchema>;\nfunction CtaWidgetRender({ block }: BlockRenderProps<CtaW>) {\n if (!block.title && !block.text) return null;\n return (\n <div className=\"xicms-widget xicms-widget--cta\" style={block.backgroundColor ? { background: block.backgroundColor } : undefined}>\n {block.title && <h3 className=\"xicms-widget__title\">{block.title}</h3>}\n {block.text && <p className=\"xicms-widget__sub\">{block.text}</p>}\n {block.buttonLabel && (\n <a className=\"xicms-btn xicms-btn--primary\" href={block.buttonHref}>{block.buttonLabel}</a>\n )}\n </div>\n );\n}\nexport const ctaWidget = defineBlock({\n type: \"ctaWidget\",\n schema: CtaWidgetSchema,\n Render: CtaWidgetRender,\n label: \"Call-to-action (compact)\",\n icon: \"👉\",\n category: \"widget\",\n defaults: () => ({ title: \"Vragen?\", text: \"Neem gerust contact op.\", buttonLabel: \"Contact\", buttonHref: \"#contact\" }),\n});\n\n/* ── Galerij (compacte strip) ──────────────────────────────────────────────── */\ntype GalleryW = z.infer<typeof GalleryWidgetSchema>;\nfunction GalleryWidgetRender({ block }: BlockRenderProps<GalleryW>) {\n const items = (block.items ?? []).filter((i) => i.url);\n if (items.length === 0) return null;\n return (\n <div className=\"xicms-widget xicms-widget--gallery\">\n {block.heading && <h3 className=\"xicms-widget__title\">{block.heading}</h3>}\n <div className=\"xicms-widget__grid\" data-cols={block.columns}>\n {items.map((it, i) => (\n // eslint-disable-next-line @next/next/no-img-element\n <img key={i} className=\"xicms-widget__photo\" src={it.url} alt={it.alt ?? \"\"} loading=\"lazy\" />\n ))}\n </div>\n </div>\n );\n}\nexport const galleryWidget = defineBlock({\n type: \"galleryWidget\",\n schema: GalleryWidgetSchema,\n Render: GalleryWidgetRender,\n label: \"Fotostrip (compact)\",\n icon: \"🖼️\",\n category: \"widget\",\n defaults: () => ({ heading: \"Foto's\", columns: 3, items: [] }),\n});\n\n/* ── Review (compact) ──────────────────────────────────────────────────────── */\ntype TestimonialsW = z.infer<typeof TestimonialsWidgetSchema>;\nfunction TestimonialsWidgetRender({ block }: BlockRenderProps<TestimonialsW>) {\n const items = (block.items ?? []).filter((t) => t.quote);\n if (items.length === 0) return null;\n return (\n <div className=\"xicms-widget xicms-widget--testimonial\">\n {block.heading && <h3 className=\"xicms-widget__title\">{block.heading}</h3>}\n <ul className=\"xicms-widget__list\">\n {items.map((t, i) => (\n <li key={i} className=\"xicms-widget__quote\">\n {typeof t.rating === \"number\" && (\n <span className=\"xicms-widget__stars\" aria-label={`${t.rating} van 5`}>{\"★\".repeat(t.rating)}{\"☆\".repeat(5 - t.rating)}</span>\n )}\n <p>“{t.quote}”</p>\n {t.author && <span className=\"xicms-widget__meta\">— {t.author}</span>}\n </li>\n ))}\n </ul>\n </div>\n );\n}\nexport const testimonialsWidget = defineBlock({\n type: \"testimonialsWidget\",\n schema: TestimonialsWidgetSchema,\n Render: TestimonialsWidgetRender,\n label: \"Review (compact)\",\n icon: \"⭐\",\n category: \"widget\",\n defaults: () => ({ heading: \"Wat klanten zeggen\", items: [{ quote: \"Echt een aanrader!\", author: \"Tevreden klant\", rating: 5 }] }),\n});\n\n/* ── Diensten (compact) ────────────────────────────────────────────────────── */\ntype CardsW = z.infer<typeof CardsWidgetSchema>;\nfunction CardsWidgetRender({ block }: BlockRenderProps<CardsW>) {\n const items = (block.items ?? []).filter((c) => c.title);\n if (items.length === 0) return null;\n return (\n <div className=\"xicms-widget xicms-widget--cards\">\n {block.heading && <h3 className=\"xicms-widget__title\">{block.heading}</h3>}\n <ul className=\"xicms-widget__list\">\n {items.map((c, i) => {\n const inner = (\n <>\n {c.icon && <span className=\"xicms-widget__cardicon\" aria-hidden=\"true\">{c.icon}</span>}\n <span>\n <span className=\"xicms-widget__link\">{c.title}</span>\n {c.text && <span className=\"xicms-widget__sub\">{c.text}</span>}\n </span>\n </>\n );\n return (\n <li key={i} className=\"xicms-widget__item xicms-widget__item--card\">\n {c.href ? <a href={c.href} className=\"xicms-widget__cardlink\">{inner}</a> : inner}\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\nexport const cardsWidget = defineBlock({\n type: \"cardsWidget\",\n schema: CardsWidgetSchema,\n Render: CardsWidgetRender,\n label: \"Diensten (compact)\",\n icon: \"🧩\",\n category: \"widget\",\n defaults: () => ({ heading: \"Uitgelicht\", items: [{ icon: \"⭐\", title: \"Dienst\", text: \"Korte omschrijving.\" }] }),\n});\n\n/* ── Downloads (compact) ───────────────────────────────────────────────────── */\ntype DownloadsW = z.infer<typeof DownloadsWidgetSchema>;\nfunction DownloadsWidgetRender({ block }: BlockRenderProps<DownloadsW>) {\n const items = (block.items ?? []).filter((d) => d.label && d.href).slice(0, block.limit);\n if (items.length === 0) return null;\n return (\n <div className=\"xicms-widget xicms-widget--downloads\">\n <h3 className=\"xicms-widget__title\">{block.heading ?? \"Downloads\"}</h3>\n <ul className=\"xicms-widget__list\">\n {items.map((d, i) => (\n <li key={i} className=\"xicms-widget__item\">\n <a className=\"xicms-widget__link\" href={d.href} download>\n <span aria-hidden=\"true\">📄</span> {d.label}\n </a>\n {d.meta && <span className=\"xicms-widget__meta\">{d.meta}</span>}\n </li>\n ))}\n </ul>\n </div>\n );\n}\nexport const downloadsWidget = defineBlock({\n type: \"downloadsWidget\",\n schema: DownloadsWidgetSchema,\n Render: DownloadsWidgetRender,\n label: \"Downloads (compact)\",\n icon: \"📥\",\n category: \"widget\",\n defaults: () => ({ heading: \"Downloads\", limit: 5, items: [] }),\n});\n\n/* ── Aftelteller (compact) ─────────────────────────────────────────────────── */\ntype CountdownW = z.infer<typeof CountdownWidgetSchema>;\nfunction CountdownWidgetRender({ block }: BlockRenderProps<CountdownW>) {\n const r = useCountdown(block.target);\n if (!block.target) return null;\n return (\n <div className=\"xicms-widget xicms-widget--countdown\">\n {block.heading && <h3 className=\"xicms-widget__title\">{block.heading}</h3>}\n {r === null ? (\n <p className=\"xicms-widget__empty\" aria-hidden=\"true\">…</p>\n ) : r.done ? (\n <p className=\"xicms-countdown__expired\">{block.expiredText}</p>\n ) : (\n <CountdownDigits r={r} showLabels />\n )}\n </div>\n );\n}\nexport const countdownWidget = defineBlock({\n type: \"countdownWidget\",\n schema: CountdownWidgetSchema,\n Render: CountdownWidgetRender,\n label: \"Aftelteller (compact)\",\n icon: \"⏳\",\n category: \"widget\",\n defaults: () => ({ heading: \"Aftellen\", target: \"\", expiredText: \"Het is zover!\" }),\n});\n\n// Let op: exporteer GEEN aggregaat-array vanuit dit \"use client\"-bestand. Een array die hier\n// wordt opgebouwd is niet server-importeerbaar (de individuele block-exports wél). De volledige\n// lijst staat in blocks/builtins/index.ts.\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Toont een externe embed (video/kaart/booking) meteen als gating uitstaat óf de consent-module niet
|
|
4
|
+
* actief is; staat consent wél aan, dan pas na toestemming voor de categorie. Anders een nette
|
|
5
|
+
* placeholder i.p.v. de tracker stilletjes te laden (AVG).
|
|
6
|
+
*
|
|
7
|
+
* `preview` (editor): mount NOOIT de echte iframe/het script, maar toon een lichte placeholder. Dit
|
|
8
|
+
* is het `mode === "preview"`-contract: in de pagina-editor draaien geen third-party scripts/iframes
|
|
9
|
+
* (geen ResizeObservers, geen externe widgets) — dat houdt de editor licht én voorkomt crashes.
|
|
10
|
+
*/
|
|
11
|
+
export declare function ConsentEmbed({ gated, category, preview, label, children, }: {
|
|
12
|
+
gated: boolean;
|
|
13
|
+
category?: string;
|
|
14
|
+
preview?: boolean;
|
|
15
|
+
label?: string;
|
|
16
|
+
children: ReactNode;
|
|
17
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useConsent } from "../../modules/consent/useConsent";
|
|
4
|
+
import { useModuleActive } from "../../modules/context";
|
|
5
|
+
function ConsentEmbed({
|
|
6
|
+
gated,
|
|
7
|
+
category = "marketing",
|
|
8
|
+
preview = false,
|
|
9
|
+
label = "Externe inhoud",
|
|
10
|
+
children
|
|
11
|
+
}) {
|
|
12
|
+
const { has } = useConsent();
|
|
13
|
+
const consentActive = useModuleActive("consent");
|
|
14
|
+
if (preview) {
|
|
15
|
+
return /* @__PURE__ */ jsx("div", { className: "xicms-embed-consent xicms-embed-preview", role: "note", "aria-label": `${label} (voorbeeld)`, children: /* @__PURE__ */ jsxs("p", { children: [
|
|
16
|
+
"\u{1F50C} ",
|
|
17
|
+
label,
|
|
18
|
+
" \u2014 wordt op de live site geladen (niet in de editor)."
|
|
19
|
+
] }) });
|
|
20
|
+
}
|
|
21
|
+
if (!gated || !consentActive || has(category)) return /* @__PURE__ */ jsx(Fragment, { children });
|
|
22
|
+
return /* @__PURE__ */ jsx("div", { className: "xicms-embed-consent", role: "note", children: /* @__PURE__ */ jsxs("p", { children: [
|
|
23
|
+
"Accepteer cookies (",
|
|
24
|
+
category,
|
|
25
|
+
") om deze inhoud te laden."
|
|
26
|
+
] }) });
|
|
27
|
+
}
|
|
28
|
+
export {
|
|
29
|
+
ConsentEmbed
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=consentEmbed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/blocks/builtins/consentEmbed.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { useConsent } from \"../../modules/consent/useConsent\";\nimport { useModuleActive } from \"../../modules/context\";\n\n/**\n * Toont een externe embed (video/kaart/booking) meteen als gating uitstaat óf de consent-module niet\n * actief is; staat consent wél aan, dan pas na toestemming voor de categorie. Anders een nette\n * placeholder i.p.v. de tracker stilletjes te laden (AVG).\n *\n * `preview` (editor): mount NOOIT de echte iframe/het script, maar toon een lichte placeholder. Dit\n * is het `mode === \"preview\"`-contract: in de pagina-editor draaien geen third-party scripts/iframes\n * (geen ResizeObservers, geen externe widgets) — dat houdt de editor licht én voorkomt crashes.\n */\nexport function ConsentEmbed({\n gated,\n category = \"marketing\",\n preview = false,\n label = \"Externe inhoud\",\n children,\n}: {\n gated: boolean;\n category?: string;\n preview?: boolean;\n label?: string;\n children: ReactNode;\n}) {\n const { has } = useConsent();\n const consentActive = useModuleActive(\"consent\");\n if (preview) {\n return (\n <div className=\"xicms-embed-consent xicms-embed-preview\" role=\"note\" aria-label={`${label} (voorbeeld)`}>\n <p>🔌 {label} — wordt op de live site geladen (niet in de editor).</p>\n </div>\n );\n }\n if (!gated || !consentActive || has(category)) return <>{children}</>;\n return (\n <div className=\"xicms-embed-consent\" role=\"note\">\n <p>Accepteer cookies ({category}) om deze inhoud te laden.</p>\n </div>\n );\n}\n"],"mappings":";AAgCM,SAKkD,UALlD,KACE,YADF;AA7BN,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAWzB,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA,WAAW;AAAA,EACX,UAAU;AAAA,EACV,QAAQ;AAAA,EACR;AACF,GAMG;AACD,QAAM,EAAE,IAAI,IAAI,WAAW;AAC3B,QAAM,gBAAgB,gBAAgB,SAAS;AAC/C,MAAI,SAAS;AACX,WACE,oBAAC,SAAI,WAAU,2CAA0C,MAAK,QAAO,cAAY,GAAG,KAAK,gBACvF,+BAAC,OAAE;AAAA;AAAA,MAAI;AAAA,MAAM;AAAA,OAAqD,GACpE;AAAA,EAEJ;AACA,MAAI,CAAC,SAAS,CAAC,iBAAiB,IAAI,QAAQ,EAAG,QAAO,gCAAG,UAAS;AAClE,SACE,oBAAC,SAAI,WAAU,uBAAsB,MAAK,QACxC,+BAAC,OAAE;AAAA;AAAA,IAAoB;AAAA,IAAS;AAAA,KAA0B,GAC5D;AAEJ;","names":[]}
|