@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,46 @@
|
|
|
1
|
+
import type { BlockDefinition } from "../registry";
|
|
2
|
+
/**
|
|
3
|
+
* Alle ingebouwde blokken. AFGELEID van `builtinModules` (de enige bron van waarheid): een nieuw
|
|
4
|
+
* blok registreer je alleen in zijn module — het verschijnt hier automatisch. Zo kan deze lijst
|
|
5
|
+
* nooit uit de pas lopen met wat de modules leveren. Klant-blokken komen erbij via `mergeRegistry`.
|
|
6
|
+
*/
|
|
7
|
+
export declare const builtinBlocks: BlockDefinition[];
|
|
8
|
+
export { heroBlock } from "./Hero";
|
|
9
|
+
export { richTextBlock } from "./RichTextBlock";
|
|
10
|
+
export { imageBlock } from "./ImageBlock";
|
|
11
|
+
export { galleryBlock } from "./Gallery";
|
|
12
|
+
export { ctaBlock } from "./Cta";
|
|
13
|
+
export { faqBlock } from "./Faq";
|
|
14
|
+
export { openingHoursBlock } from "./OpeningHours";
|
|
15
|
+
export { pricingBlock } from "./Pricing";
|
|
16
|
+
export { spacerBlock } from "./Spacer";
|
|
17
|
+
export { columnsBlock } from "./Columns";
|
|
18
|
+
export { newsListBlock } from "./NewsListBlock";
|
|
19
|
+
export { formBlock } from "./FormBlock";
|
|
20
|
+
export { testimonialsBlock } from "./Testimonials";
|
|
21
|
+
export { teamBlock } from "./Team";
|
|
22
|
+
export { agendaBlock } from "./Agenda";
|
|
23
|
+
export { searchBlock } from "./Search";
|
|
24
|
+
export { featureBlock, countersBlock, logosBlock, timelineBlock } from "./Sections";
|
|
25
|
+
export { videoBlock } from "./Video";
|
|
26
|
+
export { bannerBlock } from "./Banner";
|
|
27
|
+
export { contactBlock, socialBlock } from "./Contact";
|
|
28
|
+
export { mapBlock } from "./MapBlock";
|
|
29
|
+
export { newsletterBlock } from "./Newsletter";
|
|
30
|
+
export { bookingBlock } from "./Booking";
|
|
31
|
+
export { buttonsBlock, quoteBlock, dividerBlock } from "./Elements";
|
|
32
|
+
export { accordionBlock } from "./Accordion";
|
|
33
|
+
export { embedBlock } from "./Embed";
|
|
34
|
+
export { withSidebarBlock, tabsBlock } from "./Layout";
|
|
35
|
+
export { cardsBlock } from "./Cards";
|
|
36
|
+
export { downloadsBlock } from "./Downloads";
|
|
37
|
+
export { pdfBlock } from "./PdfBlock";
|
|
38
|
+
export { countdownBlock } from "./Countdown";
|
|
39
|
+
export { sliderBlock } from "./Slider";
|
|
40
|
+
export { whatsappChatBlock } from "./WhatsappChat";
|
|
41
|
+
export { beforeAfterBlock } from "./BeforeAfter";
|
|
42
|
+
export { portfolioBlock } from "./Portfolio";
|
|
43
|
+
export { jobsBlock } from "./Jobs";
|
|
44
|
+
export { breadcrumbsBlock } from "./Breadcrumbs";
|
|
45
|
+
export { newsWidget, agendaWidget, openingHoursWidget, contactWidget, socialWidget, newsletterWidget, ctaWidget, galleryWidget, testimonialsWidget, cardsWidget, downloadsWidget, countdownWidget, } from "./Widgets";
|
|
46
|
+
export { ConsentEmbed } from "./consentEmbed";
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { builtinModules } from "../../modules/builtins";
|
|
2
|
+
const builtinBlocks = dedupeByType(
|
|
3
|
+
builtinModules.flatMap((m) => m.blocks ?? [])
|
|
4
|
+
);
|
|
5
|
+
function dedupeByType(defs) {
|
|
6
|
+
const seen = /* @__PURE__ */ new Set();
|
|
7
|
+
return defs.filter((d) => seen.has(d.type) ? false : (seen.add(d.type), true));
|
|
8
|
+
}
|
|
9
|
+
import { heroBlock } from "./Hero";
|
|
10
|
+
import { richTextBlock } from "./RichTextBlock";
|
|
11
|
+
import { imageBlock } from "./ImageBlock";
|
|
12
|
+
import { galleryBlock } from "./Gallery";
|
|
13
|
+
import { ctaBlock } from "./Cta";
|
|
14
|
+
import { faqBlock } from "./Faq";
|
|
15
|
+
import { openingHoursBlock } from "./OpeningHours";
|
|
16
|
+
import { pricingBlock } from "./Pricing";
|
|
17
|
+
import { spacerBlock } from "./Spacer";
|
|
18
|
+
import { columnsBlock } from "./Columns";
|
|
19
|
+
import { newsListBlock } from "./NewsListBlock";
|
|
20
|
+
import { formBlock } from "./FormBlock";
|
|
21
|
+
import { testimonialsBlock } from "./Testimonials";
|
|
22
|
+
import { teamBlock } from "./Team";
|
|
23
|
+
import { agendaBlock } from "./Agenda";
|
|
24
|
+
import { searchBlock } from "./Search";
|
|
25
|
+
import { featureBlock, countersBlock, logosBlock, timelineBlock } from "./Sections";
|
|
26
|
+
import { videoBlock } from "./Video";
|
|
27
|
+
import { bannerBlock } from "./Banner";
|
|
28
|
+
import { contactBlock, socialBlock } from "./Contact";
|
|
29
|
+
import { mapBlock } from "./MapBlock";
|
|
30
|
+
import { newsletterBlock } from "./Newsletter";
|
|
31
|
+
import { bookingBlock } from "./Booking";
|
|
32
|
+
import { buttonsBlock, quoteBlock, dividerBlock } from "./Elements";
|
|
33
|
+
import { accordionBlock } from "./Accordion";
|
|
34
|
+
import { embedBlock } from "./Embed";
|
|
35
|
+
import { withSidebarBlock, tabsBlock } from "./Layout";
|
|
36
|
+
import { cardsBlock } from "./Cards";
|
|
37
|
+
import { downloadsBlock } from "./Downloads";
|
|
38
|
+
import { pdfBlock } from "./PdfBlock";
|
|
39
|
+
import { countdownBlock } from "./Countdown";
|
|
40
|
+
import { sliderBlock } from "./Slider";
|
|
41
|
+
import { whatsappChatBlock } from "./WhatsappChat";
|
|
42
|
+
import { beforeAfterBlock } from "./BeforeAfter";
|
|
43
|
+
import { portfolioBlock } from "./Portfolio";
|
|
44
|
+
import { jobsBlock } from "./Jobs";
|
|
45
|
+
import { breadcrumbsBlock } from "./Breadcrumbs";
|
|
46
|
+
import {
|
|
47
|
+
newsWidget,
|
|
48
|
+
agendaWidget,
|
|
49
|
+
openingHoursWidget,
|
|
50
|
+
contactWidget,
|
|
51
|
+
socialWidget,
|
|
52
|
+
newsletterWidget,
|
|
53
|
+
ctaWidget,
|
|
54
|
+
galleryWidget,
|
|
55
|
+
testimonialsWidget,
|
|
56
|
+
cardsWidget,
|
|
57
|
+
downloadsWidget,
|
|
58
|
+
countdownWidget
|
|
59
|
+
} from "./Widgets";
|
|
60
|
+
import { ConsentEmbed } from "./consentEmbed";
|
|
61
|
+
export {
|
|
62
|
+
ConsentEmbed,
|
|
63
|
+
accordionBlock,
|
|
64
|
+
agendaBlock,
|
|
65
|
+
agendaWidget,
|
|
66
|
+
bannerBlock,
|
|
67
|
+
beforeAfterBlock,
|
|
68
|
+
bookingBlock,
|
|
69
|
+
breadcrumbsBlock,
|
|
70
|
+
builtinBlocks,
|
|
71
|
+
buttonsBlock,
|
|
72
|
+
cardsBlock,
|
|
73
|
+
cardsWidget,
|
|
74
|
+
columnsBlock,
|
|
75
|
+
contactBlock,
|
|
76
|
+
contactWidget,
|
|
77
|
+
countdownBlock,
|
|
78
|
+
countdownWidget,
|
|
79
|
+
countersBlock,
|
|
80
|
+
ctaBlock,
|
|
81
|
+
ctaWidget,
|
|
82
|
+
dividerBlock,
|
|
83
|
+
downloadsBlock,
|
|
84
|
+
downloadsWidget,
|
|
85
|
+
embedBlock,
|
|
86
|
+
faqBlock,
|
|
87
|
+
featureBlock,
|
|
88
|
+
formBlock,
|
|
89
|
+
galleryBlock,
|
|
90
|
+
galleryWidget,
|
|
91
|
+
heroBlock,
|
|
92
|
+
imageBlock,
|
|
93
|
+
jobsBlock,
|
|
94
|
+
logosBlock,
|
|
95
|
+
mapBlock,
|
|
96
|
+
newsListBlock,
|
|
97
|
+
newsWidget,
|
|
98
|
+
newsletterBlock,
|
|
99
|
+
newsletterWidget,
|
|
100
|
+
openingHoursBlock,
|
|
101
|
+
openingHoursWidget,
|
|
102
|
+
pdfBlock,
|
|
103
|
+
portfolioBlock,
|
|
104
|
+
pricingBlock,
|
|
105
|
+
quoteBlock,
|
|
106
|
+
richTextBlock,
|
|
107
|
+
searchBlock,
|
|
108
|
+
sliderBlock,
|
|
109
|
+
socialBlock,
|
|
110
|
+
socialWidget,
|
|
111
|
+
spacerBlock,
|
|
112
|
+
tabsBlock,
|
|
113
|
+
teamBlock,
|
|
114
|
+
testimonialsBlock,
|
|
115
|
+
testimonialsWidget,
|
|
116
|
+
timelineBlock,
|
|
117
|
+
videoBlock,
|
|
118
|
+
whatsappChatBlock,
|
|
119
|
+
withSidebarBlock
|
|
120
|
+
};
|
|
121
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/blocks/builtins/index.ts"],"sourcesContent":["import type { BlockDefinition } from \"../registry\";\nimport { builtinModules } from \"../../modules/builtins\";\n\n/**\n * Alle ingebouwde blokken. AFGELEID van `builtinModules` (de enige bron van waarheid): een nieuw\n * blok registreer je alleen in zijn module — het verschijnt hier automatisch. Zo kan deze lijst\n * nooit uit de pas lopen met wat de modules leveren. Klant-blokken komen erbij via `mergeRegistry`.\n */\nexport const builtinBlocks: BlockDefinition[] = dedupeByType(\n builtinModules.flatMap((m) => m.blocks ?? []),\n);\n\nfunction dedupeByType(defs: BlockDefinition[]): BlockDefinition[] {\n const seen = new Set<string>();\n return defs.filter((d) => (seen.has(d.type) ? false : (seen.add(d.type), true)));\n}\n\nexport { heroBlock } from \"./Hero\";\nexport { richTextBlock } from \"./RichTextBlock\";\nexport { imageBlock } from \"./ImageBlock\";\nexport { galleryBlock } from \"./Gallery\";\nexport { ctaBlock } from \"./Cta\";\nexport { faqBlock } from \"./Faq\";\nexport { openingHoursBlock } from \"./OpeningHours\";\nexport { pricingBlock } from \"./Pricing\";\nexport { spacerBlock } from \"./Spacer\";\nexport { columnsBlock } from \"./Columns\";\nexport { newsListBlock } from \"./NewsListBlock\";\nexport { formBlock } from \"./FormBlock\";\nexport { testimonialsBlock } from \"./Testimonials\";\nexport { teamBlock } from \"./Team\";\nexport { agendaBlock } from \"./Agenda\";\nexport { searchBlock } from \"./Search\";\nexport { featureBlock, countersBlock, logosBlock, timelineBlock } from \"./Sections\";\nexport { videoBlock } from \"./Video\";\nexport { bannerBlock } from \"./Banner\";\nexport { contactBlock, socialBlock } from \"./Contact\";\nexport { mapBlock } from \"./MapBlock\";\nexport { newsletterBlock } from \"./Newsletter\";\nexport { bookingBlock } from \"./Booking\";\nexport { buttonsBlock, quoteBlock, dividerBlock } from \"./Elements\";\nexport { accordionBlock } from \"./Accordion\";\nexport { embedBlock } from \"./Embed\";\nexport { withSidebarBlock, tabsBlock } from \"./Layout\";\nexport { cardsBlock } from \"./Cards\";\nexport { downloadsBlock } from \"./Downloads\";\nexport { pdfBlock } from \"./PdfBlock\";\nexport { countdownBlock } from \"./Countdown\";\nexport { sliderBlock } from \"./Slider\";\nexport { whatsappChatBlock } from \"./WhatsappChat\";\nexport { beforeAfterBlock } from \"./BeforeAfter\";\nexport { portfolioBlock } from \"./Portfolio\";\nexport { jobsBlock } from \"./Jobs\";\nexport { breadcrumbsBlock } from \"./Breadcrumbs\";\nexport {\n newsWidget,\n agendaWidget,\n openingHoursWidget,\n contactWidget,\n socialWidget,\n newsletterWidget,\n ctaWidget,\n galleryWidget,\n testimonialsWidget,\n cardsWidget,\n downloadsWidget,\n countdownWidget,\n} from \"./Widgets\";\n// Voor eigen consent-gated embeds in klant-blokken (zie AGENTS.md, mode=\"preview\"-contract).\nexport { ConsentEmbed } from \"./consentEmbed\";\n"],"mappings":"AACA,SAAS,sBAAsB;AAOxB,MAAM,gBAAmC;AAAA,EAC9C,eAAe,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAC9C;AAEA,SAAS,aAAa,MAA4C;AAChE,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,KAAK,OAAO,CAAC,MAAO,KAAK,IAAI,EAAE,IAAI,IAAI,SAAS,KAAK,IAAI,EAAE,IAAI,GAAG,KAAM;AACjF;AAEA,SAAS,iBAAiB;AAC1B,SAAS,qBAAqB;AAC9B,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAC7B,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,yBAAyB;AAClC,SAAS,oBAAoB;AAC7B,SAAS,mBAAmB;AAC5B,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,iBAAiB;AAC1B,SAAS,yBAAyB;AAClC,SAAS,iBAAiB;AAC1B,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAC5B,SAAS,cAAc,eAAe,YAAY,qBAAqB;AACvE,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAC5B,SAAS,cAAc,mBAAmB;AAC1C,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAChC,SAAS,oBAAoB;AAC7B,SAAS,cAAc,YAAY,oBAAoB;AACvD,SAAS,sBAAsB;AAC/B,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB,iBAAiB;AAC5C,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AAC/B,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,SAAS,mBAAmB;AAC5B,SAAS,yBAAyB;AAClC,SAAS,wBAAwB;AACjC,SAAS,sBAAsB;AAC/B,SAAS,iBAAiB;AAC1B,SAAS,wBAAwB;AACjC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,oBAAoB;","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bouwt de embed-URL voor een reserveersysteem uit wat de klant plakt: een volledige URL wordt
|
|
3
|
+
* genormaliseerd naar de embed-variant van de provider; een kale slug/id wordt aangevuld tot de
|
|
4
|
+
* volledige embed-URL. Puur en getest — de provider-keuze in de editor doet hiermee écht iets
|
|
5
|
+
* (voorheen was hij alleen een hint).
|
|
6
|
+
*/
|
|
7
|
+
export type BookingProvider = "custom" | "calendly" | "cal" | "formitable" | "resengo" | "thefork" | "treatwell" | "salonized" | "tablebooker" | "bookingkit";
|
|
8
|
+
export declare function buildBookingUrl(provider: BookingProvider, input: string): string;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
function buildBookingUrl(provider, input) {
|
|
2
|
+
const raw = input.trim();
|
|
3
|
+
if (!raw) return "";
|
|
4
|
+
const isUrl = /^https?:\/\//i.test(raw);
|
|
5
|
+
switch (provider) {
|
|
6
|
+
case "calendly": {
|
|
7
|
+
if (isUrl) return raw;
|
|
8
|
+
return `https://calendly.com/${raw.replace(/^\/+/, "")}`;
|
|
9
|
+
}
|
|
10
|
+
case "cal": {
|
|
11
|
+
if (isUrl) return raw;
|
|
12
|
+
return `https://cal.com/${raw.replace(/^\/+/, "")}`;
|
|
13
|
+
}
|
|
14
|
+
case "formitable": {
|
|
15
|
+
if (isUrl) return raw;
|
|
16
|
+
return `https://widget.formitable.com/${raw.replace(/^\/+/, "")}`;
|
|
17
|
+
}
|
|
18
|
+
case "resengo": {
|
|
19
|
+
if (isUrl) return raw;
|
|
20
|
+
return `https://www.resengo.com/widget/${raw.replace(/^\/+/, "")}`;
|
|
21
|
+
}
|
|
22
|
+
case "thefork": {
|
|
23
|
+
if (isUrl) return raw;
|
|
24
|
+
return `https://module.lafourchette.com/nl_NL/module/${raw.replace(/^\/+/, "")}`;
|
|
25
|
+
}
|
|
26
|
+
case "treatwell": {
|
|
27
|
+
if (isUrl) return raw;
|
|
28
|
+
return `https://widget.treatwell.nl/salon/${raw.replace(/^\/+/, "")}/`;
|
|
29
|
+
}
|
|
30
|
+
case "salonized": {
|
|
31
|
+
if (isUrl) return raw;
|
|
32
|
+
return `https://widget.salonized.com/widget_bookings/new?company=${encodeURIComponent(raw)}`;
|
|
33
|
+
}
|
|
34
|
+
case "tablebooker": {
|
|
35
|
+
if (isUrl) return raw;
|
|
36
|
+
return `https://book.tablebooker.com/widget/${raw.replace(/^\/+/, "")}`;
|
|
37
|
+
}
|
|
38
|
+
case "bookingkit": {
|
|
39
|
+
if (isUrl) return raw;
|
|
40
|
+
return `https://widget.bookingkit.net/bkembed/?cw=${encodeURIComponent(raw)}`;
|
|
41
|
+
}
|
|
42
|
+
case "custom":
|
|
43
|
+
default:
|
|
44
|
+
return isUrl ? raw : "";
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export {
|
|
48
|
+
buildBookingUrl
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=bookingUrl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/blocks/builtins/lib/bookingUrl.ts"],"sourcesContent":["/**\n * Bouwt de embed-URL voor een reserveersysteem uit wat de klant plakt: een volledige URL wordt\n * genormaliseerd naar de embed-variant van de provider; een kale slug/id wordt aangevuld tot de\n * volledige embed-URL. Puur en getest — de provider-keuze in de editor doet hiermee écht iets\n * (voorheen was hij alleen een hint).\n */\nexport type BookingProvider =\n | \"custom\"\n | \"calendly\"\n | \"cal\"\n | \"formitable\"\n | \"resengo\"\n | \"thefork\"\n | \"treatwell\"\n | \"salonized\"\n | \"tablebooker\"\n | \"bookingkit\";\n\nexport function buildBookingUrl(provider: BookingProvider, input: string): string {\n const raw = input.trim();\n if (!raw) return \"\";\n const isUrl = /^https?:\\/\\//i.test(raw);\n\n switch (provider) {\n case \"calendly\": {\n // Volledige link werkt direct als embed; een slug (\"naam/intake\") vullen we aan.\n if (isUrl) return raw;\n return `https://calendly.com/${raw.replace(/^\\/+/, \"\")}`;\n }\n case \"cal\": {\n if (isUrl) return raw;\n return `https://cal.com/${raw.replace(/^\\/+/, \"\")}`;\n }\n case \"formitable\": {\n // Embed-vorm: https://widget.formitable.com/<restaurant-id>\n if (isUrl) return raw;\n return `https://widget.formitable.com/${raw.replace(/^\\/+/, \"\")}`;\n }\n case \"resengo\": {\n if (isUrl) return raw;\n return `https://www.resengo.com/widget/${raw.replace(/^\\/+/, \"\")}`;\n }\n case \"thefork\": {\n if (isUrl) return raw;\n return `https://module.lafourchette.com/nl_NL/module/${raw.replace(/^\\/+/, \"\")}`;\n }\n case \"treatwell\": {\n if (isUrl) return raw;\n return `https://widget.treatwell.nl/salon/${raw.replace(/^\\/+/, \"\")}/`;\n }\n case \"salonized\": {\n // Salonized-bookingwidget: https://widget.salonized.com/widget_bookings/new?company=<id>\n if (isUrl) return raw;\n return `https://widget.salonized.com/widget_bookings/new?company=${encodeURIComponent(raw)}`;\n }\n case \"tablebooker\": {\n if (isUrl) return raw;\n return `https://book.tablebooker.com/widget/${raw.replace(/^\\/+/, \"\")}`;\n }\n case \"bookingkit\": {\n if (isUrl) return raw;\n return `https://widget.bookingkit.net/bkembed/?cw=${encodeURIComponent(raw)}`;\n }\n case \"custom\":\n default:\n return isUrl ? raw : \"\";\n }\n}\n"],"mappings":"AAkBO,SAAS,gBAAgB,UAA2B,OAAuB;AAChF,QAAM,MAAM,MAAM,KAAK;AACvB,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,QAAQ,gBAAgB,KAAK,GAAG;AAEtC,UAAQ,UAAU;AAAA,IAChB,KAAK,YAAY;AAEf,UAAI,MAAO,QAAO;AAClB,aAAO,wBAAwB,IAAI,QAAQ,QAAQ,EAAE,CAAC;AAAA,IACxD;AAAA,IACA,KAAK,OAAO;AACV,UAAI,MAAO,QAAO;AAClB,aAAO,mBAAmB,IAAI,QAAQ,QAAQ,EAAE,CAAC;AAAA,IACnD;AAAA,IACA,KAAK,cAAc;AAEjB,UAAI,MAAO,QAAO;AAClB,aAAO,iCAAiC,IAAI,QAAQ,QAAQ,EAAE,CAAC;AAAA,IACjE;AAAA,IACA,KAAK,WAAW;AACd,UAAI,MAAO,QAAO;AAClB,aAAO,kCAAkC,IAAI,QAAQ,QAAQ,EAAE,CAAC;AAAA,IAClE;AAAA,IACA,KAAK,WAAW;AACd,UAAI,MAAO,QAAO;AAClB,aAAO,gDAAgD,IAAI,QAAQ,QAAQ,EAAE,CAAC;AAAA,IAChF;AAAA,IACA,KAAK,aAAa;AAChB,UAAI,MAAO,QAAO;AAClB,aAAO,qCAAqC,IAAI,QAAQ,QAAQ,EAAE,CAAC;AAAA,IACrE;AAAA,IACA,KAAK,aAAa;AAEhB,UAAI,MAAO,QAAO;AAClB,aAAO,4DAA4D,mBAAmB,GAAG,CAAC;AAAA,IAC5F;AAAA,IACA,KAAK,eAAe;AAClB,UAAI,MAAO,QAAO;AAClB,aAAO,uCAAuC,IAAI,QAAQ,QAAQ,EAAE,CAAC;AAAA,IACvE;AAAA,IACA,KAAK,cAAc;AACjB,UAAI,MAAO,QAAO;AAClB,aAAO,6CAA6C,mBAAmB,GAAG,CAAC;AAAA,IAC7E;AAAA,IACA,KAAK;AAAA,IACL;AACE,aAAO,QAAQ,MAAM;AAAA,EACzB;AACF;","names":[]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
function fileIcon(url) {
|
|
2
|
+
const ext = /\.([a-z0-9]{1,5})(?:[?#]|$)/i.exec(url)?.[1]?.toLowerCase() ?? "";
|
|
3
|
+
switch (ext) {
|
|
4
|
+
case "pdf":
|
|
5
|
+
return "\u{1F4D5}";
|
|
6
|
+
case "doc":
|
|
7
|
+
case "docx":
|
|
8
|
+
case "odt":
|
|
9
|
+
return "\u{1F4DD}";
|
|
10
|
+
case "xls":
|
|
11
|
+
case "xlsx":
|
|
12
|
+
case "ods":
|
|
13
|
+
case "csv":
|
|
14
|
+
return "\u{1F4CA}";
|
|
15
|
+
case "ppt":
|
|
16
|
+
case "pptx":
|
|
17
|
+
return "\u{1F4FD}\uFE0F";
|
|
18
|
+
case "zip":
|
|
19
|
+
case "rar":
|
|
20
|
+
case "7z":
|
|
21
|
+
return "\u{1F5DC}\uFE0F";
|
|
22
|
+
case "jpg":
|
|
23
|
+
case "jpeg":
|
|
24
|
+
case "png":
|
|
25
|
+
case "webp":
|
|
26
|
+
case "gif":
|
|
27
|
+
case "avif":
|
|
28
|
+
case "svg":
|
|
29
|
+
return "\u{1F5BC}\uFE0F";
|
|
30
|
+
case "mp3":
|
|
31
|
+
case "wav":
|
|
32
|
+
case "m4a":
|
|
33
|
+
return "\u{1F3B5}";
|
|
34
|
+
case "mp4":
|
|
35
|
+
case "webm":
|
|
36
|
+
case "mov":
|
|
37
|
+
return "\u{1F3AC}";
|
|
38
|
+
default:
|
|
39
|
+
return "\u{1F4C4}";
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export {
|
|
43
|
+
fileIcon
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=fileIcon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/blocks/builtins/lib/fileIcon.ts"],"sourcesContent":["/** Bestandstype-icoon op basis van de extensie in een URL/pad — puur en getest. */\nexport function fileIcon(url: string): string {\n const ext = /\\.([a-z0-9]{1,5})(?:[?#]|$)/i.exec(url)?.[1]?.toLowerCase() ?? \"\";\n switch (ext) {\n case \"pdf\":\n return \"📕\";\n case \"doc\":\n case \"docx\":\n case \"odt\":\n return \"📝\";\n case \"xls\":\n case \"xlsx\":\n case \"ods\":\n case \"csv\":\n return \"📊\";\n case \"ppt\":\n case \"pptx\":\n return \"📽️\";\n case \"zip\":\n case \"rar\":\n case \"7z\":\n return \"🗜️\";\n case \"jpg\":\n case \"jpeg\":\n case \"png\":\n case \"webp\":\n case \"gif\":\n case \"avif\":\n case \"svg\":\n return \"🖼️\";\n case \"mp3\":\n case \"wav\":\n case \"m4a\":\n return \"🎵\";\n case \"mp4\":\n case \"webm\":\n case \"mov\":\n return \"🎬\";\n default:\n return \"📄\";\n }\n}\n"],"mappings":"AACO,SAAS,SAAS,KAAqB;AAC5C,QAAM,MAAM,+BAA+B,KAAK,GAAG,IAAI,CAAC,GAAG,YAAY,KAAK;AAC5E,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;","names":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimale iCalendar-generator voor agenda-events ("Zet in agenda") — puur, geen dependency.
|
|
3
|
+
* Datums zonder tijd worden hele-dag-events; met tijd gebruiken we de lokale notatie (floating),
|
|
4
|
+
* zodat 19:00 bij de bezoeker ook 19:00 blijft.
|
|
5
|
+
*/
|
|
6
|
+
export interface IcsEvent {
|
|
7
|
+
title: string;
|
|
8
|
+
/** ISO-datum of datum+tijd, bv. "2026-07-01" of "2026-07-01T19:00". */
|
|
9
|
+
start: string;
|
|
10
|
+
end?: string;
|
|
11
|
+
location?: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
url?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function makeIcs(event: IcsEvent): string | null;
|
|
16
|
+
/** data:-URL voor een download-link (server-safe, geen Blob nodig). */
|
|
17
|
+
export declare function icsDataUrl(event: IcsEvent): string | null;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
function escapeText(s) {
|
|
2
|
+
return s.replace(/\\/g, "\\\\").replace(/;/g, "\\;").replace(/,/g, "\\,").replace(/\r?\n/g, "\\n");
|
|
3
|
+
}
|
|
4
|
+
function hash(s) {
|
|
5
|
+
let h = 0;
|
|
6
|
+
for (let i = 0; i < s.length; i++) h = h * 31 + s.charCodeAt(i) | 0;
|
|
7
|
+
return (h >>> 0).toString(36);
|
|
8
|
+
}
|
|
9
|
+
function fmt(value, allDay) {
|
|
10
|
+
const digits = value.replace(/[-:]/g, "");
|
|
11
|
+
return allDay ? digits.slice(0, 8) : `${digits.slice(0, 8)}T${(digits.slice(9) + "0000").slice(0, 6)}`;
|
|
12
|
+
}
|
|
13
|
+
function nextDay(isoDate) {
|
|
14
|
+
const d = /* @__PURE__ */ new Date(`${isoDate}T12:00:00Z`);
|
|
15
|
+
d.setUTCDate(d.getUTCDate() + 1);
|
|
16
|
+
return d.toISOString().slice(0, 10);
|
|
17
|
+
}
|
|
18
|
+
function makeIcs(event) {
|
|
19
|
+
if (!event.title || !event.start || Number.isNaN(new Date(event.start).getTime())) return null;
|
|
20
|
+
const allDay = !event.start.includes("T");
|
|
21
|
+
const dtStart = fmt(event.start, allDay);
|
|
22
|
+
const endSource = event.end && !Number.isNaN(new Date(event.end).getTime()) ? event.end : null;
|
|
23
|
+
const dtEnd = allDay ? fmt(nextDay((endSource ?? event.start).slice(0, 10)), true) : fmt(endSource ?? event.start, false);
|
|
24
|
+
const lines = [
|
|
25
|
+
"BEGIN:VCALENDAR",
|
|
26
|
+
"VERSION:2.0",
|
|
27
|
+
"PRODID:-//XiCMS//Agenda//NL",
|
|
28
|
+
"BEGIN:VEVENT",
|
|
29
|
+
`UID:${dtStart}-${hash(JSON.stringify([event.title, event.start, event.end, event.location]))}@xicms`,
|
|
30
|
+
allDay ? `DTSTART;VALUE=DATE:${dtStart}` : `DTSTART:${dtStart}`,
|
|
31
|
+
allDay ? `DTEND;VALUE=DATE:${dtEnd}` : `DTEND:${dtEnd}`,
|
|
32
|
+
`SUMMARY:${escapeText(event.title)}`,
|
|
33
|
+
...event.location ? [`LOCATION:${escapeText(event.location)}`] : [],
|
|
34
|
+
...event.description ? [`DESCRIPTION:${escapeText(event.description)}`] : [],
|
|
35
|
+
// URI-waarde: geen tekst-escaping, wél regeleinden strippen (voorkomt property-injectie).
|
|
36
|
+
...event.url ? [`URL:${event.url.replace(/[\r\n]/g, "")}`] : [],
|
|
37
|
+
"END:VEVENT",
|
|
38
|
+
"END:VCALENDAR"
|
|
39
|
+
];
|
|
40
|
+
return lines.join("\r\n");
|
|
41
|
+
}
|
|
42
|
+
function icsDataUrl(event) {
|
|
43
|
+
const ics = makeIcs(event);
|
|
44
|
+
return ics ? `data:text/calendar;charset=utf-8,${encodeURIComponent(ics)}` : null;
|
|
45
|
+
}
|
|
46
|
+
export {
|
|
47
|
+
icsDataUrl,
|
|
48
|
+
makeIcs
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=ics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/blocks/builtins/lib/ics.ts"],"sourcesContent":["/**\n * Minimale iCalendar-generator voor agenda-events (\"Zet in agenda\") — puur, geen dependency.\n * Datums zonder tijd worden hele-dag-events; met tijd gebruiken we de lokale notatie (floating),\n * zodat 19:00 bij de bezoeker ook 19:00 blijft.\n */\n\nexport interface IcsEvent {\n title: string;\n /** ISO-datum of datum+tijd, bv. \"2026-07-01\" of \"2026-07-01T19:00\". */\n start: string;\n end?: string;\n location?: string;\n description?: string;\n url?: string;\n}\n\nfunction escapeText(s: string): string {\n return s.replace(/\\\\/g, \"\\\\\\\\\").replace(/;/g, \"\\\\;\").replace(/,/g, \"\\\\,\").replace(/\\r?\\n/g, \"\\\\n\");\n}\n\n/** Deterministische korte hash: zelfde event → zelfde UID (her-import werkt dan als update). */\nfunction hash(s: string): string {\n let h = 0;\n for (let i = 0; i < s.length; i++) h = (h * 31 + s.charCodeAt(i)) | 0;\n return (h >>> 0).toString(36);\n}\n\nfunction fmt(value: string, allDay: boolean): string {\n const digits = value.replace(/[-:]/g, \"\");\n return allDay ? digits.slice(0, 8) : `${digits.slice(0, 8)}T${(digits.slice(9) + \"0000\").slice(0, 6)}`;\n}\n\n/** Dag ná een ISO-datum (DTEND is exclusief bij hele-dag-events). */\nfunction nextDay(isoDate: string): string {\n const d = new Date(`${isoDate}T12:00:00Z`);\n d.setUTCDate(d.getUTCDate() + 1);\n return d.toISOString().slice(0, 10);\n}\n\nexport function makeIcs(event: IcsEvent): string | null {\n if (!event.title || !event.start || Number.isNaN(new Date(event.start).getTime())) return null;\n const allDay = !event.start.includes(\"T\");\n const dtStart = fmt(event.start, allDay);\n const endSource = event.end && !Number.isNaN(new Date(event.end).getTime()) ? event.end : null;\n const dtEnd = allDay\n ? fmt(nextDay((endSource ?? event.start).slice(0, 10)), true)\n : fmt(endSource ?? event.start, false);\n const lines = [\n \"BEGIN:VCALENDAR\",\n \"VERSION:2.0\",\n \"PRODID:-//XiCMS//Agenda//NL\",\n \"BEGIN:VEVENT\",\n `UID:${dtStart}-${hash(JSON.stringify([event.title, event.start, event.end, event.location]))}@xicms`,\n allDay ? `DTSTART;VALUE=DATE:${dtStart}` : `DTSTART:${dtStart}`,\n allDay ? `DTEND;VALUE=DATE:${dtEnd}` : `DTEND:${dtEnd}`,\n `SUMMARY:${escapeText(event.title)}`,\n ...(event.location ? [`LOCATION:${escapeText(event.location)}`] : []),\n ...(event.description ? [`DESCRIPTION:${escapeText(event.description)}`] : []),\n // URI-waarde: geen tekst-escaping, wél regeleinden strippen (voorkomt property-injectie).\n ...(event.url ? [`URL:${event.url.replace(/[\\r\\n]/g, \"\")}`] : []),\n \"END:VEVENT\",\n \"END:VCALENDAR\",\n ];\n return lines.join(\"\\r\\n\");\n}\n\n/** data:-URL voor een download-link (server-safe, geen Blob nodig). */\nexport function icsDataUrl(event: IcsEvent): string | null {\n const ics = makeIcs(event);\n return ics ? `data:text/calendar;charset=utf-8,${encodeURIComponent(ics)}` : null;\n}\n"],"mappings":"AAgBA,SAAS,WAAW,GAAmB;AACrC,SAAO,EAAE,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK,EAAE,QAAQ,MAAM,KAAK,EAAE,QAAQ,UAAU,KAAK;AACnG;AAGA,SAAS,KAAK,GAAmB;AAC/B,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,IAAK,KAAK,IAAI,KAAK,EAAE,WAAW,CAAC,IAAK;AACpE,UAAQ,MAAM,GAAG,SAAS,EAAE;AAC9B;AAEA,SAAS,IAAI,OAAe,QAAyB;AACnD,QAAM,SAAS,MAAM,QAAQ,SAAS,EAAE;AACxC,SAAO,SAAS,OAAO,MAAM,GAAG,CAAC,IAAI,GAAG,OAAO,MAAM,GAAG,CAAC,CAAC,KAAK,OAAO,MAAM,CAAC,IAAI,QAAQ,MAAM,GAAG,CAAC,CAAC;AACtG;AAGA,SAAS,QAAQ,SAAyB;AACxC,QAAM,IAAI,oBAAI,KAAK,GAAG,OAAO,YAAY;AACzC,IAAE,WAAW,EAAE,WAAW,IAAI,CAAC;AAC/B,SAAO,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AACpC;AAEO,SAAS,QAAQ,OAAgC;AACtD,MAAI,CAAC,MAAM,SAAS,CAAC,MAAM,SAAS,OAAO,MAAM,IAAI,KAAK,MAAM,KAAK,EAAE,QAAQ,CAAC,EAAG,QAAO;AAC1F,QAAM,SAAS,CAAC,MAAM,MAAM,SAAS,GAAG;AACxC,QAAM,UAAU,IAAI,MAAM,OAAO,MAAM;AACvC,QAAM,YAAY,MAAM,OAAO,CAAC,OAAO,MAAM,IAAI,KAAK,MAAM,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,MAAM;AAC1F,QAAM,QAAQ,SACV,IAAI,SAAS,aAAa,MAAM,OAAO,MAAM,GAAG,EAAE,CAAC,GAAG,IAAI,IAC1D,IAAI,aAAa,MAAM,OAAO,KAAK;AACvC,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,OAAO,IAAI,KAAK,KAAK,UAAU,CAAC,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK,MAAM,QAAQ,CAAC,CAAC,CAAC;AAAA,IAC7F,SAAS,sBAAsB,OAAO,KAAK,WAAW,OAAO;AAAA,IAC7D,SAAS,oBAAoB,KAAK,KAAK,SAAS,KAAK;AAAA,IACrD,WAAW,WAAW,MAAM,KAAK,CAAC;AAAA,IAClC,GAAI,MAAM,WAAW,CAAC,YAAY,WAAW,MAAM,QAAQ,CAAC,EAAE,IAAI,CAAC;AAAA,IACnE,GAAI,MAAM,cAAc,CAAC,eAAe,WAAW,MAAM,WAAW,CAAC,EAAE,IAAI,CAAC;AAAA;AAAA,IAE5E,GAAI,MAAM,MAAM,CAAC,OAAO,MAAM,IAAI,QAAQ,WAAW,EAAE,CAAC,EAAE,IAAI,CAAC;AAAA,IAC/D;AAAA,IACA;AAAA,EACF;AACA,SAAO,MAAM,KAAK,MAAM;AAC1B;AAGO,SAAS,WAAW,OAAgC;AACzD,QAAM,MAAM,QAAQ,KAAK;AACzB,SAAO,MAAM,oCAAoC,mBAAmB,GAAG,CAAC,KAAK;AAC/E;","names":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helpers rond openingstijden-rijen ({ day, hours } vrije tekst, bv.
|
|
3
|
+
* "Maandag t/m vrijdag" + "09:00 – 17:00"). Best-effort parsen van de gangbare NL-notaties;
|
|
4
|
+
* onparseerbare rijen doen gewoon niet mee (geen badge/JSON-LD is beter dan een foute).
|
|
5
|
+
*/
|
|
6
|
+
export interface HoursRow {
|
|
7
|
+
day: string;
|
|
8
|
+
hours: string;
|
|
9
|
+
}
|
|
10
|
+
/** "Maandag t/m vrijdag" / "Ma–Vr" / "Zaterdag" → JS-dagindexen; leeg als onbekend. */
|
|
11
|
+
export declare function parseDays(label: string): number[];
|
|
12
|
+
/** "09:00 – 17:00" / "9.00-17.00" → minuten sinds middernacht; null bij "Gesloten"/onparseerbaar. */
|
|
13
|
+
export declare function parseTimeRange(hours: string): {
|
|
14
|
+
open: number;
|
|
15
|
+
close: number;
|
|
16
|
+
} | null;
|
|
17
|
+
/** Is er volgens de rijen NU open? null = niet te bepalen (niets parseerbaars). */
|
|
18
|
+
export declare function isOpenNow(rows: HoursRow[], now?: Date): boolean | null;
|
|
19
|
+
/** schema.org OpeningHoursSpecification-array uit de rijen (alleen parseerbare rijen). */
|
|
20
|
+
export declare function openingHoursSpecJsonLd(rows: HoursRow[]): Array<Record<string, unknown>>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
const DAYS = {
|
|
2
|
+
zondag: 0,
|
|
3
|
+
zo: 0,
|
|
4
|
+
maandag: 1,
|
|
5
|
+
ma: 1,
|
|
6
|
+
dinsdag: 2,
|
|
7
|
+
di: 2,
|
|
8
|
+
woensdag: 3,
|
|
9
|
+
wo: 3,
|
|
10
|
+
donderdag: 4,
|
|
11
|
+
do: 4,
|
|
12
|
+
vrijdag: 5,
|
|
13
|
+
vr: 5,
|
|
14
|
+
zaterdag: 6,
|
|
15
|
+
za: 6
|
|
16
|
+
};
|
|
17
|
+
const DAY_SCHEMA_NAMES = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
|
|
18
|
+
function parseDays(label) {
|
|
19
|
+
const norm = label.toLowerCase().replace(/\./g, "");
|
|
20
|
+
const range = norm.match(/([a-z]+)\s*(?:t\/m|tm|tot en met|[-–])\s*([a-z]+)/);
|
|
21
|
+
if (range && DAYS[range[1]] !== void 0 && DAYS[range[2]] !== void 0) {
|
|
22
|
+
const from = DAYS[range[1]];
|
|
23
|
+
const to = DAYS[range[2]];
|
|
24
|
+
const out = [];
|
|
25
|
+
for (let d = from; ; d = (d + 1) % 7) {
|
|
26
|
+
out.push(d);
|
|
27
|
+
if (d === to || out.length > 7) break;
|
|
28
|
+
}
|
|
29
|
+
return out;
|
|
30
|
+
}
|
|
31
|
+
const found = norm.match(/[a-z]+/g) ?? [];
|
|
32
|
+
const days = found.map((w) => DAYS[w]).filter((d) => d !== void 0);
|
|
33
|
+
return [...new Set(days)];
|
|
34
|
+
}
|
|
35
|
+
function parseTimeRange(hours) {
|
|
36
|
+
const m = hours.replace(/\./g, ":").match(/(\d{1,2}):(\d{2})\s*[-–—]\s*(\d{1,2}):(\d{2})/);
|
|
37
|
+
if (!m) return null;
|
|
38
|
+
const open = Number(m[1]) * 60 + Number(m[2]);
|
|
39
|
+
const close = Number(m[3]) * 60 + Number(m[4]);
|
|
40
|
+
if (open >= close || close > 24 * 60) return null;
|
|
41
|
+
return { open, close };
|
|
42
|
+
}
|
|
43
|
+
function isOpenNow(rows, now = /* @__PURE__ */ new Date()) {
|
|
44
|
+
const day = now.getDay();
|
|
45
|
+
const minutes = now.getHours() * 60 + now.getMinutes();
|
|
46
|
+
let sawParseable = false;
|
|
47
|
+
for (const r of rows) {
|
|
48
|
+
const days = parseDays(r.day);
|
|
49
|
+
if (days.length === 0) continue;
|
|
50
|
+
const range = parseTimeRange(r.hours);
|
|
51
|
+
sawParseable = sawParseable || range !== null || /gesloten/i.test(r.hours);
|
|
52
|
+
if (!days.includes(day)) continue;
|
|
53
|
+
if (range && minutes >= range.open && minutes < range.close) return true;
|
|
54
|
+
}
|
|
55
|
+
return sawParseable ? false : null;
|
|
56
|
+
}
|
|
57
|
+
function openingHoursSpecJsonLd(rows) {
|
|
58
|
+
const fmt = (mins) => `${String(Math.floor(mins / 60)).padStart(2, "0")}:${String(mins % 60).padStart(2, "0")}`;
|
|
59
|
+
const out = [];
|
|
60
|
+
for (const r of rows) {
|
|
61
|
+
const days = parseDays(r.day);
|
|
62
|
+
const range = parseTimeRange(r.hours);
|
|
63
|
+
if (days.length === 0 || !range) continue;
|
|
64
|
+
out.push({
|
|
65
|
+
"@type": "OpeningHoursSpecification",
|
|
66
|
+
dayOfWeek: days.map((d) => DAY_SCHEMA_NAMES[d]),
|
|
67
|
+
opens: fmt(range.open),
|
|
68
|
+
closes: fmt(range.close)
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
export {
|
|
74
|
+
isOpenNow,
|
|
75
|
+
openingHoursSpecJsonLd,
|
|
76
|
+
parseDays,
|
|
77
|
+
parseTimeRange
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=openingHours.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/blocks/builtins/lib/openingHours.ts"],"sourcesContent":["/**\n * Pure helpers rond openingstijden-rijen ({ day, hours } vrije tekst, bv.\n * \"Maandag t/m vrijdag\" + \"09:00 – 17:00\"). Best-effort parsen van de gangbare NL-notaties;\n * onparseerbare rijen doen gewoon niet mee (geen badge/JSON-LD is beter dan een foute).\n */\n\nexport interface HoursRow {\n day: string;\n hours: string;\n}\n\n/** Dagnamen → JS-dagindex (0 = zondag). Volledige namen én afkortingen. */\nconst DAYS: Record<string, number> = {\n zondag: 0, zo: 0,\n maandag: 1, ma: 1,\n dinsdag: 2, di: 2,\n woensdag: 3, wo: 3,\n donderdag: 4, do: 4,\n vrijdag: 5, vr: 5,\n zaterdag: 6, za: 6,\n};\n\nconst DAY_SCHEMA_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\n\n/** \"Maandag t/m vrijdag\" / \"Ma–Vr\" / \"Zaterdag\" → JS-dagindexen; leeg als onbekend. */\nexport function parseDays(label: string): number[] {\n const norm = label.toLowerCase().replace(/\\./g, \"\");\n // Bereik: \"x t/m y\", \"x tm y\", \"x - y\", \"x – y\"\n const range = norm.match(/([a-z]+)\\s*(?:t\\/m|tm|tot en met|[-–])\\s*([a-z]+)/);\n if (range && DAYS[range[1]] !== undefined && DAYS[range[2]] !== undefined) {\n const from = DAYS[range[1]];\n const to = DAYS[range[2]];\n const out: number[] = [];\n for (let d = from; ; d = (d + 1) % 7) {\n out.push(d);\n if (d === to || out.length > 7) break;\n }\n return out;\n }\n // Opsomming of losse dag(en): \"ma, wo, vr\" / \"zaterdag\"\n const found = norm.match(/[a-z]+/g) ?? [];\n const days = found.map((w) => DAYS[w]).filter((d): d is number => d !== undefined);\n return [...new Set(days)];\n}\n\n/** \"09:00 – 17:00\" / \"9.00-17.00\" → minuten sinds middernacht; null bij \"Gesloten\"/onparseerbaar. */\nexport function parseTimeRange(hours: string): { open: number; close: number } | null {\n const m = hours.replace(/\\./g, \":\").match(/(\\d{1,2}):(\\d{2})\\s*[-–—]\\s*(\\d{1,2}):(\\d{2})/);\n if (!m) return null;\n const open = Number(m[1]) * 60 + Number(m[2]);\n const close = Number(m[3]) * 60 + Number(m[4]);\n if (open >= close || close > 24 * 60) return null;\n return { open, close };\n}\n\n/** Is er volgens de rijen NU open? null = niet te bepalen (niets parseerbaars). */\nexport function isOpenNow(rows: HoursRow[], now: Date = new Date()): boolean | null {\n const day = now.getDay();\n const minutes = now.getHours() * 60 + now.getMinutes();\n let sawParseable = false;\n for (const r of rows) {\n const days = parseDays(r.day);\n if (days.length === 0) continue;\n const range = parseTimeRange(r.hours);\n sawParseable = sawParseable || range !== null || /gesloten/i.test(r.hours);\n if (!days.includes(day)) continue;\n if (range && minutes >= range.open && minutes < range.close) return true;\n }\n return sawParseable ? false : null;\n}\n\n/** schema.org OpeningHoursSpecification-array uit de rijen (alleen parseerbare rijen). */\nexport function openingHoursSpecJsonLd(rows: HoursRow[]): Array<Record<string, unknown>> {\n const fmt = (mins: number) => `${String(Math.floor(mins / 60)).padStart(2, \"0\")}:${String(mins % 60).padStart(2, \"0\")}`;\n const out: Array<Record<string, unknown>> = [];\n for (const r of rows) {\n const days = parseDays(r.day);\n const range = parseTimeRange(r.hours);\n if (days.length === 0 || !range) continue;\n out.push({\n \"@type\": \"OpeningHoursSpecification\",\n dayOfWeek: days.map((d) => DAY_SCHEMA_NAMES[d]),\n opens: fmt(range.open),\n closes: fmt(range.close),\n });\n }\n return out;\n}\n"],"mappings":"AAYA,MAAM,OAA+B;AAAA,EACnC,QAAQ;AAAA,EAAG,IAAI;AAAA,EACf,SAAS;AAAA,EAAG,IAAI;AAAA,EAChB,SAAS;AAAA,EAAG,IAAI;AAAA,EAChB,UAAU;AAAA,EAAG,IAAI;AAAA,EACjB,WAAW;AAAA,EAAG,IAAI;AAAA,EAClB,SAAS;AAAA,EAAG,IAAI;AAAA,EAChB,UAAU;AAAA,EAAG,IAAI;AACnB;AAEA,MAAM,mBAAmB,CAAC,UAAU,UAAU,WAAW,aAAa,YAAY,UAAU,UAAU;AAG/F,SAAS,UAAU,OAAyB;AACjD,QAAM,OAAO,MAAM,YAAY,EAAE,QAAQ,OAAO,EAAE;AAElD,QAAM,QAAQ,KAAK,MAAM,mDAAmD;AAC5E,MAAI,SAAS,KAAK,MAAM,CAAC,CAAC,MAAM,UAAa,KAAK,MAAM,CAAC,CAAC,MAAM,QAAW;AACzE,UAAM,OAAO,KAAK,MAAM,CAAC,CAAC;AAC1B,UAAM,KAAK,KAAK,MAAM,CAAC,CAAC;AACxB,UAAM,MAAgB,CAAC;AACvB,aAAS,IAAI,QAAQ,KAAK,IAAI,KAAK,GAAG;AACpC,UAAI,KAAK,CAAC;AACV,UAAI,MAAM,MAAM,IAAI,SAAS,EAAG;AAAA,IAClC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,KAAK,MAAM,SAAS,KAAK,CAAC;AACxC,QAAM,OAAO,MAAM,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,MAAmB,MAAM,MAAS;AACjF,SAAO,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;AAC1B;AAGO,SAAS,eAAe,OAAuD;AACpF,QAAM,IAAI,MAAM,QAAQ,OAAO,GAAG,EAAE,MAAM,+CAA+C;AACzF,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,OAAO,OAAO,EAAE,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;AAC5C,QAAM,QAAQ,OAAO,EAAE,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;AAC7C,MAAI,QAAQ,SAAS,QAAQ,KAAK,GAAI,QAAO;AAC7C,SAAO,EAAE,MAAM,MAAM;AACvB;AAGO,SAAS,UAAU,MAAkB,MAAY,oBAAI,KAAK,GAAmB;AAClF,QAAM,MAAM,IAAI,OAAO;AACvB,QAAM,UAAU,IAAI,SAAS,IAAI,KAAK,IAAI,WAAW;AACrD,MAAI,eAAe;AACnB,aAAW,KAAK,MAAM;AACpB,UAAM,OAAO,UAAU,EAAE,GAAG;AAC5B,QAAI,KAAK,WAAW,EAAG;AACvB,UAAM,QAAQ,eAAe,EAAE,KAAK;AACpC,mBAAe,gBAAgB,UAAU,QAAQ,YAAY,KAAK,EAAE,KAAK;AACzE,QAAI,CAAC,KAAK,SAAS,GAAG,EAAG;AACzB,QAAI,SAAS,WAAW,MAAM,QAAQ,UAAU,MAAM,MAAO,QAAO;AAAA,EACtE;AACA,SAAO,eAAe,QAAQ;AAChC;AAGO,SAAS,uBAAuB,MAAkD;AACvF,QAAM,MAAM,CAAC,SAAiB,GAAG,OAAO,KAAK,MAAM,OAAO,EAAE,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,OAAO,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AACrH,QAAM,MAAsC,CAAC;AAC7C,aAAW,KAAK,MAAM;AACpB,UAAM,OAAO,UAAU,EAAE,GAAG;AAC5B,UAAM,QAAQ,eAAe,EAAE,KAAK;AACpC,QAAI,KAAK,WAAW,KAAK,CAAC,MAAO;AACjC,QAAI,KAAK;AAAA,MACP,SAAS;AAAA,MACT,WAAW,KAAK,IAAI,CAAC,MAAM,iBAAiB,CAAC,CAAC;AAAA,MAC9C,OAAO,IAAI,MAAM,IAAI;AAAA,MACrB,QAAQ,IAAI,MAAM,KAAK;AAAA,IACzB,CAAC;AAAA,EACH;AACA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ranking + snippet-helpers voor de site-zoekfunctie. Puur (testbaar).
|
|
3
|
+
* Score: titel-prefix > titel-substring > tekst-match; meerdere termen tellen op (AND-gedrag:
|
|
4
|
+
* alle termen moeten ergens voorkomen).
|
|
5
|
+
*/
|
|
6
|
+
export interface SearchEntry {
|
|
7
|
+
title: string;
|
|
8
|
+
path: string;
|
|
9
|
+
text: string;
|
|
10
|
+
}
|
|
11
|
+
export interface RankedResult extends SearchEntry {
|
|
12
|
+
score: number;
|
|
13
|
+
/** Kort fragment rond de eerste tekst-match (leeg als de match alleen in de titel zit). */
|
|
14
|
+
snippet: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function rankResults(query: string, entries: SearchEntry[], limit?: number): RankedResult[];
|
|
17
|
+
/** Splitst tekst in stukken waarbij de query-termen gemarkeerd zijn — voor <mark>-highlighting
|
|
18
|
+
* zonder dangerouslySetInnerHTML. */
|
|
19
|
+
export declare function highlightParts(text: string, query: string): Array<{
|
|
20
|
+
text: string;
|
|
21
|
+
hit: boolean;
|
|
22
|
+
}>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
function terms(query) {
|
|
2
|
+
return query.toLowerCase().split(/\s+/).filter(Boolean);
|
|
3
|
+
}
|
|
4
|
+
function rankResults(query, entries, limit = 10) {
|
|
5
|
+
const ts = terms(query);
|
|
6
|
+
if (ts.length === 0) return [];
|
|
7
|
+
const out = [];
|
|
8
|
+
for (const e of entries) {
|
|
9
|
+
const title = e.title.toLowerCase();
|
|
10
|
+
const text = e.text.toLowerCase();
|
|
11
|
+
let score = 0;
|
|
12
|
+
let firstTextHit = -1;
|
|
13
|
+
let allMatch = true;
|
|
14
|
+
for (const t of ts) {
|
|
15
|
+
const inTitle = title.indexOf(t);
|
|
16
|
+
const inText = text.indexOf(t);
|
|
17
|
+
if (inTitle === 0) score += 30;
|
|
18
|
+
else if (inTitle > 0) score += 15;
|
|
19
|
+
if (inText >= 0) {
|
|
20
|
+
score += 5;
|
|
21
|
+
if (firstTextHit < 0) firstTextHit = inText;
|
|
22
|
+
}
|
|
23
|
+
if (inTitle < 0 && inText < 0) {
|
|
24
|
+
allMatch = false;
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (!allMatch || score === 0) continue;
|
|
29
|
+
const snippet = firstTextHit >= 0 ? `${firstTextHit > 30 ? "\u2026" : ""}${e.text.slice(Math.max(0, firstTextHit - 30), firstTextHit + 90).trim()}\u2026` : "";
|
|
30
|
+
out.push({ ...e, score, snippet });
|
|
31
|
+
}
|
|
32
|
+
return out.sort((a, b) => b.score - a.score).slice(0, limit);
|
|
33
|
+
}
|
|
34
|
+
function highlightParts(text, query) {
|
|
35
|
+
const ts = terms(query);
|
|
36
|
+
if (ts.length === 0 || !text) return [{ text, hit: false }];
|
|
37
|
+
const pattern = ts.map((t) => t.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|");
|
|
38
|
+
const re = new RegExp(`(${pattern})`, "gi");
|
|
39
|
+
return text.split(re).filter((part) => part !== "").map((part) => ({ text: part, hit: ts.includes(part.toLowerCase()) }));
|
|
40
|
+
}
|
|
41
|
+
export {
|
|
42
|
+
highlightParts,
|
|
43
|
+
rankResults
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=searchRank.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/blocks/builtins/lib/searchRank.ts"],"sourcesContent":["/**\n * Ranking + snippet-helpers voor de site-zoekfunctie. Puur (testbaar).\n * Score: titel-prefix > titel-substring > tekst-match; meerdere termen tellen op (AND-gedrag:\n * alle termen moeten ergens voorkomen).\n */\n\nexport interface SearchEntry {\n title: string;\n path: string;\n text: string;\n}\n\nexport interface RankedResult extends SearchEntry {\n score: number;\n /** Kort fragment rond de eerste tekst-match (leeg als de match alleen in de titel zit). */\n snippet: string;\n}\n\nfunction terms(query: string): string[] {\n return query.toLowerCase().split(/\\s+/).filter(Boolean);\n}\n\nexport function rankResults(query: string, entries: SearchEntry[], limit = 10): RankedResult[] {\n const ts = terms(query);\n if (ts.length === 0) return [];\n const out: RankedResult[] = [];\n for (const e of entries) {\n const title = e.title.toLowerCase();\n const text = e.text.toLowerCase();\n let score = 0;\n let firstTextHit = -1;\n let allMatch = true;\n for (const t of ts) {\n const inTitle = title.indexOf(t);\n const inText = text.indexOf(t);\n if (inTitle === 0) score += 30; // titel begint met de term\n else if (inTitle > 0) score += 15;\n if (inText >= 0) {\n score += 5;\n if (firstTextHit < 0) firstTextHit = inText;\n }\n if (inTitle < 0 && inText < 0) {\n allMatch = false;\n break;\n }\n }\n if (!allMatch || score === 0) continue;\n const snippet =\n firstTextHit >= 0\n ? `${firstTextHit > 30 ? \"…\" : \"\"}${e.text.slice(Math.max(0, firstTextHit - 30), firstTextHit + 90).trim()}…`\n : \"\";\n out.push({ ...e, score, snippet });\n }\n return out.sort((a, b) => b.score - a.score).slice(0, limit);\n}\n\n/** Splitst tekst in stukken waarbij de query-termen gemarkeerd zijn — voor <mark>-highlighting\n * zonder dangerouslySetInnerHTML. */\nexport function highlightParts(text: string, query: string): Array<{ text: string; hit: boolean }> {\n const ts = terms(query);\n if (ts.length === 0 || !text) return [{ text, hit: false }];\n const pattern = ts.map((t) => t.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")).join(\"|\");\n const re = new RegExp(`(${pattern})`, \"gi\");\n // split-met-capture geeft de gematchte termen als losse delen terug; een deel is een hit\n // als het (case-insensitief) exact een van de termen is.\n return text\n .split(re)\n .filter((part) => part !== \"\")\n .map((part) => ({ text: part, hit: ts.includes(part.toLowerCase()) }));\n}\n"],"mappings":"AAkBA,SAAS,MAAM,OAAyB;AACtC,SAAO,MAAM,YAAY,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO;AACxD;AAEO,SAAS,YAAY,OAAe,SAAwB,QAAQ,IAAoB;AAC7F,QAAM,KAAK,MAAM,KAAK;AACtB,MAAI,GAAG,WAAW,EAAG,QAAO,CAAC;AAC7B,QAAM,MAAsB,CAAC;AAC7B,aAAW,KAAK,SAAS;AACvB,UAAM,QAAQ,EAAE,MAAM,YAAY;AAClC,UAAM,OAAO,EAAE,KAAK,YAAY;AAChC,QAAI,QAAQ;AACZ,QAAI,eAAe;AACnB,QAAI,WAAW;AACf,eAAW,KAAK,IAAI;AAClB,YAAM,UAAU,MAAM,QAAQ,CAAC;AAC/B,YAAM,SAAS,KAAK,QAAQ,CAAC;AAC7B,UAAI,YAAY,EAAG,UAAS;AAAA,eACnB,UAAU,EAAG,UAAS;AAC/B,UAAI,UAAU,GAAG;AACf,iBAAS;AACT,YAAI,eAAe,EAAG,gBAAe;AAAA,MACvC;AACA,UAAI,UAAU,KAAK,SAAS,GAAG;AAC7B,mBAAW;AACX;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,YAAY,UAAU,EAAG;AAC9B,UAAM,UACJ,gBAAgB,IACZ,GAAG,eAAe,KAAK,WAAM,EAAE,GAAG,EAAE,KAAK,MAAM,KAAK,IAAI,GAAG,eAAe,EAAE,GAAG,eAAe,EAAE,EAAE,KAAK,CAAC,WACxG;AACN,QAAI,KAAK,EAAE,GAAG,GAAG,OAAO,QAAQ,CAAC;AAAA,EACnC;AACA,SAAO,IAAI,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK;AAC7D;AAIO,SAAS,eAAe,MAAc,OAAsD;AACjG,QAAM,KAAK,MAAM,KAAK;AACtB,MAAI,GAAG,WAAW,KAAK,CAAC,KAAM,QAAO,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;AAC1D,QAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,uBAAuB,MAAM,CAAC,EAAE,KAAK,GAAG;AAChF,QAAM,KAAK,IAAI,OAAO,IAAI,OAAO,KAAK,IAAI;AAG1C,SAAO,KACJ,MAAM,EAAE,EACR,OAAO,CAAC,SAAS,SAAS,EAAE,EAC5B,IAAI,CAAC,UAAU,EAAE,MAAM,MAAM,KAAK,GAAG,SAAS,KAAK,YAAY,CAAC,EAAE,EAAE;AACzE;","names":[]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verstuur een formulier-inzending via de `submitForm`-callable — gedeeld door het
|
|
3
|
+
* formulier-blok en het nieuwsbrief-blok (formId-modus), zodat validatie/rate-limiting/
|
|
4
|
+
* notificatie voor beide identiek server-side lopen.
|
|
5
|
+
*/
|
|
6
|
+
export declare function submitFormValues(siteId: string, formId: string, values: Record<string, string | boolean>, hp?: string): Promise<void>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { getFunctions, httpsCallable } from "firebase/functions";
|
|
3
|
+
import { getFirebaseApp } from "../../../firebase/client";
|
|
4
|
+
import { functionsRegion } from "../../../firebase/region";
|
|
5
|
+
async function submitFormValues(siteId, formId, values, hp = "") {
|
|
6
|
+
const app = getFirebaseApp();
|
|
7
|
+
if (!app) throw new Error("Niet beschikbaar.");
|
|
8
|
+
const fn = httpsCallable(getFunctions(app, functionsRegion()), "submitForm");
|
|
9
|
+
await fn({ siteId, formId, values, _hp: hp });
|
|
10
|
+
}
|
|
11
|
+
export {
|
|
12
|
+
submitFormValues
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=submitForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/blocks/builtins/lib/submitForm.ts"],"sourcesContent":["\"use client\";\n\nimport { getFunctions, httpsCallable } from \"firebase/functions\";\nimport { getFirebaseApp } from \"../../../firebase/client\";\nimport { functionsRegion } from \"../../../firebase/region\";\n\n/**\n * Verstuur een formulier-inzending via de `submitForm`-callable — gedeeld door het\n * formulier-blok en het nieuwsbrief-blok (formId-modus), zodat validatie/rate-limiting/\n * notificatie voor beide identiek server-side lopen.\n */\nexport async function submitFormValues(\n siteId: string,\n formId: string,\n values: Record<string, string | boolean>,\n hp = \"\",\n): Promise<void> {\n const app = getFirebaseApp();\n if (!app) throw new Error(\"Niet beschikbaar.\");\n const fn = httpsCallable(getFunctions(app, functionsRegion()), \"submitForm\");\n await fn({ siteId, formId, values, _hp: hp });\n}\n"],"mappings":";AAEA,SAAS,cAAc,qBAAqB;AAC5C,SAAS,sBAAsB;AAC/B,SAAS,uBAAuB;AAOhC,eAAsB,iBACpB,QACA,QACA,QACA,KAAK,IACU;AACf,QAAM,MAAM,eAAe;AAC3B,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,mBAAmB;AAC7C,QAAM,KAAK,cAAc,aAAa,KAAK,gBAAgB,CAAC,GAAG,YAAY;AAC3E,QAAM,GAAG,EAAE,QAAQ,QAAQ,QAAQ,KAAK,GAAG,CAAC;AAC9C;","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import type { BlockRegistry } from "./registry";
|
|
3
|
+
export declare function RegistryProvider({ registry, children, }: {
|
|
4
|
+
registry: BlockRegistry;
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
}): import("react").JSX.Element;
|
|
7
|
+
/** Lees de actieve block-registry (client). Voor server-rendering: geef registry als prop mee. */
|
|
8
|
+
export declare function useRegistry(): BlockRegistry;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, useContext } from "react";
|
|
4
|
+
const RegistryContext = createContext(null);
|
|
5
|
+
function RegistryProvider({
|
|
6
|
+
registry,
|
|
7
|
+
children
|
|
8
|
+
}) {
|
|
9
|
+
return /* @__PURE__ */ jsx(RegistryContext.Provider, { value: registry, children });
|
|
10
|
+
}
|
|
11
|
+
function useRegistry() {
|
|
12
|
+
const ctx = useContext(RegistryContext);
|
|
13
|
+
if (!ctx) throw new Error("useRegistry moet binnen <XiCMSProvider> (met blocks) worden gebruikt.");
|
|
14
|
+
return ctx;
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
RegistryProvider,
|
|
18
|
+
useRegistry
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=context.js.map
|