@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 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/admin/NewsEditor.tsx"],"sourcesContent":["\"use client\";\n\nimport { useRef, useState } from \"react\";\nimport { addDoc, collection, deleteDoc, doc, serverTimestamp, updateDoc } from \"firebase/firestore\";\nimport { getDb } from \"../firebase/client\";\nimport { useSiteConfig } from \"../config\";\nimport { useNews } from \"../components/News\";\nimport { uploadImage } from \"./lib/upload\";\nimport { slugify } from \"./lib/slugify\";\nimport { useConfirm } from \"./ui/ConfirmDialog\";\nimport { useToast } from \"./ui/toast\";\nimport { Button, Card, Field, Input, Textarea, Badge } from \"./ui/primitives\";\nimport { RichTextEditor } from \"./editors/RichTextEditor\";\nimport type { NewsArticle } from \"../content/types\";\n\nconst empty = { title: \"\", excerpt: \"\", body: \"\", bodyHtml: \"\", coverUrl: \"\", date: \"\", published: false };\n\n/** Beheer van nieuwsartikelen — zelfde look & feel als de rest van /beheer. */\nexport function NewsEditor() {\n const { siteId } = useSiteConfig();\n const { articles } = useNews({ onlyPublished: false });\n const confirm = useConfirm();\n const { toast } = useToast();\n const [form, setForm] = useState<typeof empty>(empty);\n const [editingId, setEditingId] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [coverBusy, setCoverBusy] = useState(false);\n const coverInputRef = useRef<HTMLInputElement>(null);\n\n function reset() {\n setForm(empty);\n setEditingId(null);\n }\n\n function loadIntoForm(a: NewsArticle) {\n setEditingId(a.id);\n setForm({\n title: a.title,\n excerpt: a.excerpt ?? \"\",\n body: a.body,\n bodyHtml: a.bodyHtml ?? \"\",\n coverUrl: a.coverUrl ?? \"\",\n date: a.date,\n published: a.published,\n });\n }\n\n async function save() {\n const db = getDb();\n if (!db) return;\n if (!form.title.trim()) {\n toast({ title: \"Titel ontbreekt\", description: \"Geef het artikel een titel.\", tone: \"error\" });\n return;\n }\n setBusy(true);\n try {\n const payload = {\n title: form.title.trim(),\n slug: slugify(form.title),\n excerpt: form.excerpt.trim(),\n body: form.body,\n // Rich text (client-side al door DOMPurify gehaald in de editor; de weergave sanitized\n // bovendien opnieuw bij het renderen — dubbele verdediging).\n bodyHtml: form.bodyHtml,\n coverUrl: form.coverUrl.trim(),\n date: form.date || new Date().toISOString().slice(0, 10),\n published: form.published,\n updatedAt: serverTimestamp(),\n };\n if (editingId) {\n await updateDoc(doc(db, \"sites\", siteId, \"news\", editingId), payload);\n } else {\n await addDoc(collection(db, \"sites\", siteId, \"news\"), { ...payload, createdAt: serverTimestamp() });\n }\n toast({ title: editingId ? \"Artikel bijgewerkt\" : \"Artikel opgeslagen\", tone: \"success\" });\n reset();\n } catch (e) {\n toast({ title: \"Opslaan mislukt\", description: (e as Error).message, tone: \"error\" });\n } finally {\n setBusy(false);\n }\n }\n\n async function remove(id: string, title: string) {\n const db = getDb();\n if (!db) return;\n const ok = await confirm({\n title: \"Artikel verwijderen?\",\n description: `“${title}” wordt definitief verwijderd.`,\n confirmLabel: \"Verwijderen\",\n tone: \"danger\",\n });\n if (!ok) return;\n await deleteDoc(doc(db, \"sites\", siteId, \"news\", id));\n if (editingId === id) reset();\n toast({ title: \"Artikel verwijderd\", tone: \"success\" });\n }\n\n async function onCover(file: File) {\n setCoverBusy(true);\n try {\n const { url } = await uploadImage(siteId, file);\n setForm((prev) => ({ ...prev, coverUrl: url }));\n toast({ title: \"Foto toegevoegd\", description: \"Automatisch verkleind voor het web.\", tone: \"success\" });\n } catch (e) {\n toast({ title: \"Upload mislukt\", description: (e as Error).message, tone: \"error\" });\n } finally {\n setCoverBusy(false);\n }\n }\n\n return (\n <div className=\"grid gap-4\">\n <Card>\n <div className=\"mb-3 flex items-center justify-between\">\n <h3 className=\"text-base font-semibold\">{editingId ? \"Artikel bewerken\" : \"Nieuw artikel\"}</h3>\n {editingId && (\n <Button variant=\"secondary\" size=\"sm\" onClick={reset}>+ Nieuw artikel</Button>\n )}\n </div>\n <div className=\"grid gap-3\">\n <Field label=\"Titel\">\n <Input value={form.title} onChange={(e) => setForm({ ...form, title: e.target.value })} placeholder=\"Kop van het artikel\" />\n </Field>\n <Field label=\"Korte samenvatting\" hint=\"Verschijnt in de nieuwslijst.\">\n <Input value={form.excerpt} onChange={(e) => setForm({ ...form, excerpt: e.target.value })} />\n </Field>\n <Field label=\"Coverfoto\">\n <div className=\"flex items-center gap-2\">\n <Input value={form.coverUrl} onChange={(e) => setForm({ ...form, coverUrl: e.target.value })} placeholder=\"URL of upload →\" />\n <Button type=\"button\" variant=\"secondary\" size=\"sm\" disabled={coverBusy} onClick={() => coverInputRef.current?.click()}>\n {coverBusy ? \"Uploaden…\" : \"Upload\"}\n </Button>\n <input\n ref={coverInputRef}\n type=\"file\"\n accept=\"image/*\"\n hidden\n onChange={(e) => {\n const f = e.target.files?.[0];\n if (f) void onCover(f);\n e.target.value = \"\";\n }}\n />\n </div>\n </Field>\n {form.coverUrl && (\n // eslint-disable-next-line @next/next/no-img-element\n <img src={form.coverUrl} alt=\"\" className=\"h-32 w-full rounded-lg object-cover\" />\n )}\n <div className=\"grid gap-3 md:grid-cols-2\">\n <Field label=\"Datum\">\n <Input type=\"date\" value={form.date} onChange={(e) => setForm({ ...form, date: e.target.value })} />\n </Field>\n <Field label=\"Zichtbaarheid\" hint=\"Aangevinkt = direct zichtbaar op de site; uit = concept.\">\n <label className=\"flex h-9 items-center gap-2 text-sm\">\n <input type=\"checkbox\" checked={form.published} onChange={(e) => setForm({ ...form, published: e.target.checked })} />\n Gepubliceerd\n </label>\n </Field>\n </div>\n <Field label=\"Tekst\" hint=\"Met opmaak (koppen, lijsten, links, afbeeldingen). Bestaande artikelen zonder opmaak blijven gewoon werken.\">\n <RichTextEditor\n siteId={siteId}\n value={form.bodyHtml || (form.body ? `<p>${form.body.split(/\\n{2,}/).join(\"</p><p>\")}</p>` : \"\")}\n onChange={(html) => setForm((f) => ({ ...f, bodyHtml: html }))}\n />\n </Field>\n <div>\n <Button disabled={busy} onClick={() => void save()}>\n {busy ? \"Opslaan…\" : editingId ? \"Wijzigingen opslaan\" : \"Artikel opslaan\"}\n </Button>\n </div>\n </div>\n </Card>\n\n <Card>\n <h3 className=\"mb-3 text-base font-semibold\">Artikelen</h3>\n {articles.length === 0 ? (\n <p className=\"text-sm text-slate-500\">Nog geen artikelen. Maak hierboven je eerste nieuwsartikel.</p>\n ) : (\n <div className=\"grid gap-2\">\n {articles.map((a) => (\n <div key={a.id} className=\"flex items-center justify-between gap-3 rounded-lg border border-slate-200 p-3\">\n <span className=\"flex items-center gap-2 text-sm\">\n <span className=\"font-medium\">{a.title}</span>\n <span className=\"text-slate-400\">· {a.date}</span>\n {a.published ? <Badge tone=\"green\">zichtbaar</Badge> : <Badge tone=\"amber\">concept</Badge>}\n </span>\n <span className=\"flex gap-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => loadIntoForm(a)}>Bewerk</Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => void remove(a.id, a.title)}>Verwijder</Button>\n </span>\n </div>\n ))}\n </div>\n )}\n </Card>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
import { collection, getDocs, limit, orderBy, query, where } from "firebase/firestore";
|
|
5
|
+
import { getFunctions, httpsCallable } from "firebase/functions";
|
|
6
|
+
import { getDb, getFirebaseApp } from "../firebase/client";
|
|
7
|
+
import { functionsRegion } from "../firebase/region";
|
|
8
|
+
import { Button, Card, Field, Input } from "./ui/primitives";
|
|
9
|
+
import { Select } from "./ui/select";
|
|
10
|
+
import { useToast } from "./ui/toast";
|
|
11
|
+
function callable(name) {
|
|
12
|
+
const app = getFirebaseApp();
|
|
13
|
+
if (!app) throw new Error("Firebase niet geconfigureerd.");
|
|
14
|
+
return httpsCallable(getFunctions(app, functionsRegion()), name);
|
|
15
|
+
}
|
|
16
|
+
function SuperadminPanel({ siteId }) {
|
|
17
|
+
const { toast } = useToast();
|
|
18
|
+
const [site, setSite] = useState({ siteId: "", name: "", domain: "" });
|
|
19
|
+
const [account, setAccount] = useState({ siteId: "", email: "", password: "", role: "siteadmin" });
|
|
20
|
+
const [resetEmail, setResetEmail] = useState("");
|
|
21
|
+
const [busy, setBusy] = useState(false);
|
|
22
|
+
const [audit, setAudit] = useState([]);
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
const db = getDb();
|
|
25
|
+
if (!db) return;
|
|
26
|
+
const q = query(
|
|
27
|
+
collection(db, "audit_log"),
|
|
28
|
+
where("siteId", "in", [siteId, "*"]),
|
|
29
|
+
orderBy("at", "desc"),
|
|
30
|
+
limit(20)
|
|
31
|
+
);
|
|
32
|
+
getDocs(q).then((snap) => setAudit(snap.docs.map((d) => ({ id: d.id, ...d.data() })))).catch(() => setAudit([]));
|
|
33
|
+
}, [siteId]);
|
|
34
|
+
async function run(fn, ok) {
|
|
35
|
+
setBusy(true);
|
|
36
|
+
try {
|
|
37
|
+
const res = await fn();
|
|
38
|
+
toast({ title: res.data.message ?? ok, tone: "success" });
|
|
39
|
+
} catch (e) {
|
|
40
|
+
toast({ title: "Mislukt", description: e.message, tone: "error" });
|
|
41
|
+
} finally {
|
|
42
|
+
setBusy(false);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return /* @__PURE__ */ jsxs("div", { className: "grid gap-4 lg:grid-cols-2", children: [
|
|
46
|
+
/* @__PURE__ */ jsxs(Card, { children: [
|
|
47
|
+
/* @__PURE__ */ jsx("h3", { className: "mb-3 text-base font-semibold", children: "Nieuwe site" }),
|
|
48
|
+
/* @__PURE__ */ jsxs("div", { className: "grid gap-3", children: [
|
|
49
|
+
/* @__PURE__ */ jsx(Field, { label: "siteId", children: /* @__PURE__ */ jsx(Input, { value: site.siteId, onChange: (e) => setSite({ ...site, siteId: e.target.value }), placeholder: "bv. bakkerij-jansen" }) }),
|
|
50
|
+
/* @__PURE__ */ jsx(Field, { label: "Naam", children: /* @__PURE__ */ jsx(Input, { value: site.name, onChange: (e) => setSite({ ...site, name: e.target.value }) }) }),
|
|
51
|
+
/* @__PURE__ */ jsx(Field, { label: "Domein", children: /* @__PURE__ */ jsx(Input, { value: site.domain, onChange: (e) => setSite({ ...site, domain: e.target.value }) }) }),
|
|
52
|
+
/* @__PURE__ */ jsx(Button, { disabled: busy || !site.siteId, onClick: () => run(() => callable("createSite")(site), "Site aangemaakt"), children: "Site aanmaken" })
|
|
53
|
+
] })
|
|
54
|
+
] }),
|
|
55
|
+
/* @__PURE__ */ jsxs(Card, { children: [
|
|
56
|
+
/* @__PURE__ */ jsx("h3", { className: "mb-3 text-base font-semibold", children: "Beheeraccount" }),
|
|
57
|
+
/* @__PURE__ */ jsxs("div", { className: "grid gap-3", children: [
|
|
58
|
+
/* @__PURE__ */ jsx(Field, { label: "siteId", children: /* @__PURE__ */ jsx(Input, { value: account.siteId, onChange: (e) => setAccount({ ...account, siteId: e.target.value }) }) }),
|
|
59
|
+
/* @__PURE__ */ jsx(Field, { label: "E-mail", children: /* @__PURE__ */ jsx(Input, { type: "email", value: account.email, onChange: (e) => setAccount({ ...account, email: e.target.value }) }) }),
|
|
60
|
+
/* @__PURE__ */ jsx(Field, { label: "Tijdelijk wachtwoord", children: /* @__PURE__ */ jsx(Input, { value: account.password, onChange: (e) => setAccount({ ...account, password: e.target.value }) }) }),
|
|
61
|
+
/* @__PURE__ */ jsx(Field, { label: "Rol", children: /* @__PURE__ */ jsx(
|
|
62
|
+
Select,
|
|
63
|
+
{
|
|
64
|
+
value: account.role,
|
|
65
|
+
onValueChange: (v) => setAccount({ ...account, role: v }),
|
|
66
|
+
options: [
|
|
67
|
+
{ value: "siteadmin", label: "siteadmin (volledig)" },
|
|
68
|
+
{ value: "editor", label: "editor (alleen content)" }
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
) }),
|
|
72
|
+
/* @__PURE__ */ jsx(Button, { disabled: busy || !account.siteId || !account.email, onClick: () => run(() => callable("createSiteAccount")(account), "Account aangemaakt"), children: "Account aanmaken" })
|
|
73
|
+
] })
|
|
74
|
+
] }),
|
|
75
|
+
/* @__PURE__ */ jsxs(Card, { children: [
|
|
76
|
+
/* @__PURE__ */ jsx("h3", { className: "mb-3 text-base font-semibold", children: "Wachtwoord-reset versturen" }),
|
|
77
|
+
/* @__PURE__ */ jsxs("div", { className: "grid gap-3", children: [
|
|
78
|
+
/* @__PURE__ */ jsx(Field, { label: "E-mail", children: /* @__PURE__ */ jsx(Input, { type: "email", value: resetEmail, onChange: (e) => setResetEmail(e.target.value) }) }),
|
|
79
|
+
/* @__PURE__ */ jsx(Button, { variant: "secondary", disabled: busy || !resetEmail, onClick: () => run(() => callable("requestPasswordReset")({ email: resetEmail }), "Reset-link verstuurd"), children: "Reset-link versturen" })
|
|
80
|
+
] })
|
|
81
|
+
] }),
|
|
82
|
+
/* @__PURE__ */ jsxs(Card, { children: [
|
|
83
|
+
/* @__PURE__ */ jsx("h3", { className: "mb-3 text-base font-semibold", children: "Audit-log (laatste 20)" }),
|
|
84
|
+
audit.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-sm text-slate-500", children: "Geen recente acties (of geen rechten/index)." }) : /* @__PURE__ */ jsx("ul", { className: "text-sm text-slate-600", children: audit.map((a) => /* @__PURE__ */ jsxs("li", { className: "border-b border-slate-100 py-1 last:border-0", children: [
|
|
85
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: a.action }),
|
|
86
|
+
" \xB7 ",
|
|
87
|
+
a.target,
|
|
88
|
+
" ",
|
|
89
|
+
/* @__PURE__ */ jsxs("span", { className: "text-slate-400", children: [
|
|
90
|
+
"(",
|
|
91
|
+
a.actorUid?.slice(0, 6),
|
|
92
|
+
")"
|
|
93
|
+
] })
|
|
94
|
+
] }, a.id)) })
|
|
95
|
+
] })
|
|
96
|
+
] });
|
|
97
|
+
}
|
|
98
|
+
export {
|
|
99
|
+
SuperadminPanel
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=SuperadminPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/admin/SuperadminPanel.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { collection, getDocs, limit, orderBy, query, where } from \"firebase/firestore\";\nimport { getFunctions, httpsCallable } from \"firebase/functions\";\nimport { getDb, getFirebaseApp } from \"../firebase/client\";\nimport { functionsRegion } from \"../firebase/region\";\nimport { Button, Card, Field, Input } from \"./ui/primitives\";\nimport { Select } from \"./ui/select\";\nimport { useToast } from \"./ui/toast\";\n\nfunction callable<T>(name: string) {\n const app = getFirebaseApp();\n if (!app) throw new Error(\"Firebase niet geconfigureerd.\");\n return httpsCallable<T, { message?: string }>(getFunctions(app, functionsRegion()), name);\n}\n\n/** Superadmin: sites/accounts aanmaken, wachtwoord-reset versturen en audit-log inzien. */\nexport function SuperadminPanel({ siteId }: { siteId: string }) {\n const { toast } = useToast();\n const [site, setSite] = useState({ siteId: \"\", name: \"\", domain: \"\" });\n const [account, setAccount] = useState({ siteId: \"\", email: \"\", password: \"\", role: \"siteadmin\" });\n const [resetEmail, setResetEmail] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [audit, setAudit] = useState<{ id: string; action?: string; target?: string; actorUid?: string }[]>([]);\n\n useEffect(() => {\n const db = getDb();\n if (!db) return;\n const q = query(\n collection(db, \"audit_log\"),\n where(\"siteId\", \"in\", [siteId, \"*\"]),\n orderBy(\"at\", \"desc\"),\n limit(20),\n );\n getDocs(q)\n .then((snap) => setAudit(snap.docs.map((d) => ({ id: d.id, ...(d.data() as Record<string, string>) }))))\n .catch(() => setAudit([]));\n }, [siteId]);\n\n async function run(fn: () => Promise<{ data: { message?: string } }>, ok: string) {\n setBusy(true);\n try {\n const res = await fn();\n toast({ title: res.data.message ?? ok, tone: \"success\" });\n } catch (e) {\n toast({ title: \"Mislukt\", description: (e as Error).message, tone: \"error\" });\n } finally {\n setBusy(false);\n }\n }\n\n return (\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <Card>\n <h3 className=\"mb-3 text-base font-semibold\">Nieuwe site</h3>\n <div className=\"grid gap-3\">\n <Field label=\"siteId\"><Input value={site.siteId} onChange={(e) => setSite({ ...site, siteId: e.target.value })} placeholder=\"bv. bakkerij-jansen\" /></Field>\n <Field label=\"Naam\"><Input value={site.name} onChange={(e) => setSite({ ...site, name: e.target.value })} /></Field>\n <Field label=\"Domein\"><Input value={site.domain} onChange={(e) => setSite({ ...site, domain: e.target.value })} /></Field>\n <Button disabled={busy || !site.siteId} onClick={() => run(() => callable<typeof site>(\"createSite\")(site), \"Site aangemaakt\")}>\n Site aanmaken\n </Button>\n </div>\n </Card>\n\n <Card>\n <h3 className=\"mb-3 text-base font-semibold\">Beheeraccount</h3>\n <div className=\"grid gap-3\">\n <Field label=\"siteId\"><Input value={account.siteId} onChange={(e) => setAccount({ ...account, siteId: e.target.value })} /></Field>\n <Field label=\"E-mail\"><Input type=\"email\" value={account.email} onChange={(e) => setAccount({ ...account, email: e.target.value })} /></Field>\n <Field label=\"Tijdelijk wachtwoord\"><Input value={account.password} onChange={(e) => setAccount({ ...account, password: e.target.value })} /></Field>\n <Field label=\"Rol\">\n <Select\n value={account.role}\n onValueChange={(v) => setAccount({ ...account, role: v })}\n options={[\n { value: \"siteadmin\", label: \"siteadmin (volledig)\" },\n { value: \"editor\", label: \"editor (alleen content)\" },\n ]}\n />\n </Field>\n <Button disabled={busy || !account.siteId || !account.email} onClick={() => run(() => callable<typeof account>(\"createSiteAccount\")(account), \"Account aangemaakt\")}>\n Account aanmaken\n </Button>\n </div>\n </Card>\n\n <Card>\n <h3 className=\"mb-3 text-base font-semibold\">Wachtwoord-reset versturen</h3>\n <div className=\"grid gap-3\">\n <Field label=\"E-mail\"><Input type=\"email\" value={resetEmail} onChange={(e) => setResetEmail(e.target.value)} /></Field>\n <Button variant=\"secondary\" disabled={busy || !resetEmail} onClick={() => run(() => callable<{ email: string }>(\"requestPasswordReset\")({ email: resetEmail }), \"Reset-link verstuurd\")}>\n Reset-link versturen\n </Button>\n </div>\n </Card>\n\n <Card>\n <h3 className=\"mb-3 text-base font-semibold\">Audit-log (laatste 20)</h3>\n {audit.length === 0 ? (\n <p className=\"text-sm text-slate-500\">Geen recente acties (of geen rechten/index).</p>\n ) : (\n <ul className=\"text-sm text-slate-600\">\n {audit.map((a) => (\n <li key={a.id} className=\"border-b border-slate-100 py-1 last:border-0\">\n <span className=\"font-medium\">{a.action}</span> · {a.target} <span className=\"text-slate-400\">({a.actorUid?.slice(0, 6)})</span>\n </li>\n ))}\n </ul>\n )}\n </Card>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { BlockStyle } from "../../schema/blocks";
|
|
2
|
+
/**
|
|
3
|
+
* Inklapbare "Blokstijl"-sectie die voor ELK block beschikbaar is (gedeelde `_style`): verticale
|
|
4
|
+
* ruimte, achtergrond, breedte, uitlijning en een anker-id. Wordt generiek aan de block-editors
|
|
5
|
+
* toegevoegd, dus elk block krijgt deze opties zonder zijn editor te wijzigen.
|
|
6
|
+
*/
|
|
7
|
+
export declare function StyleEditor({ value, onChange, }: {
|
|
8
|
+
value?: BlockStyle;
|
|
9
|
+
onChange: (style: BlockStyle) => void;
|
|
10
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Field, Input } from "../ui/primitives";
|
|
4
|
+
import { Select } from "../ui/select";
|
|
5
|
+
function StyleEditor({
|
|
6
|
+
value = {},
|
|
7
|
+
onChange
|
|
8
|
+
}) {
|
|
9
|
+
const update = (part) => onChange({ ...value, ...part });
|
|
10
|
+
return /* @__PURE__ */ jsxs("details", { className: "rounded-lg border border-slate-200 p-3", children: [
|
|
11
|
+
/* @__PURE__ */ jsx("summary", { className: "cursor-pointer text-sm font-medium text-slate-700", children: "Blokstijl" }),
|
|
12
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-3 grid gap-3", children: [
|
|
13
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
|
|
14
|
+
/* @__PURE__ */ jsx(Field, { label: "Ruimte boven/onder", children: /* @__PURE__ */ jsx(
|
|
15
|
+
Select,
|
|
16
|
+
{
|
|
17
|
+
value: value.paddingY ?? "",
|
|
18
|
+
onValueChange: (v) => update({ paddingY: v || void 0 }),
|
|
19
|
+
options: [
|
|
20
|
+
{ value: "", label: "Standaard" },
|
|
21
|
+
{ value: "none", label: "Geen" },
|
|
22
|
+
{ value: "sm", label: "Klein" },
|
|
23
|
+
{ value: "md", label: "Normaal" },
|
|
24
|
+
{ value: "lg", label: "Groot" },
|
|
25
|
+
{ value: "xl", label: "Extra groot" }
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
) }),
|
|
29
|
+
/* @__PURE__ */ jsx(Field, { label: "Breedte", children: /* @__PURE__ */ jsx(
|
|
30
|
+
Select,
|
|
31
|
+
{
|
|
32
|
+
value: value.width ?? "",
|
|
33
|
+
onValueChange: (v) => update({ width: v || void 0 }),
|
|
34
|
+
options: [
|
|
35
|
+
{ value: "", label: "Standaard" },
|
|
36
|
+
{ value: "narrow", label: "Smal" },
|
|
37
|
+
{ value: "container", label: "Container" },
|
|
38
|
+
{ value: "full", label: "Volle breedte" }
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
) }),
|
|
42
|
+
/* @__PURE__ */ jsx(Field, { label: "Uitlijning", children: /* @__PURE__ */ jsx(
|
|
43
|
+
Select,
|
|
44
|
+
{
|
|
45
|
+
value: value.align ?? "",
|
|
46
|
+
onValueChange: (v) => update({ align: v || void 0 }),
|
|
47
|
+
options: [
|
|
48
|
+
{ value: "", label: "Standaard" },
|
|
49
|
+
{ value: "left", label: "Links" },
|
|
50
|
+
{ value: "center", label: "Midden" },
|
|
51
|
+
{ value: "right", label: "Rechts" }
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
) }),
|
|
55
|
+
/* @__PURE__ */ jsx(Field, { label: "Achtergrond (kleur)", children: /* @__PURE__ */ jsx(Input, { value: value.background ?? "", onChange: (e) => update({ background: e.target.value || void 0 }), placeholder: "#f8fafc" }) })
|
|
56
|
+
] }),
|
|
57
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
|
|
58
|
+
/* @__PURE__ */ jsx(Field, { label: "Anker-id (voor #deeplinks)", children: /* @__PURE__ */ jsx(Input, { value: value.anchorId ?? "", onChange: (e) => update({ anchorId: e.target.value || void 0 }), placeholder: "bv. contact" }) }),
|
|
59
|
+
/* @__PURE__ */ jsx(Field, { label: "Animatie (bij scrollen)", children: /* @__PURE__ */ jsx(
|
|
60
|
+
Select,
|
|
61
|
+
{
|
|
62
|
+
value: value.animate ?? "",
|
|
63
|
+
onValueChange: (v) => update({ animate: v || void 0 }),
|
|
64
|
+
options: [
|
|
65
|
+
{ value: "", label: "Geen" },
|
|
66
|
+
{ value: "fade", label: "Vervagen" },
|
|
67
|
+
{ value: "up", label: "Omhoog schuiven" }
|
|
68
|
+
]
|
|
69
|
+
}
|
|
70
|
+
) })
|
|
71
|
+
] })
|
|
72
|
+
] })
|
|
73
|
+
] });
|
|
74
|
+
}
|
|
75
|
+
export {
|
|
76
|
+
StyleEditor
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=StyleEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/blockEditors/StyleEditor.tsx"],"sourcesContent":["\"use client\";\n\nimport type { BlockStyle } from \"../../schema/blocks\";\nimport { Field, Input } from \"../ui/primitives\";\nimport { Select } from \"../ui/select\";\n\n/**\n * Inklapbare \"Blokstijl\"-sectie die voor ELK block beschikbaar is (gedeelde `_style`): verticale\n * ruimte, achtergrond, breedte, uitlijning en een anker-id. Wordt generiek aan de block-editors\n * toegevoegd, dus elk block krijgt deze opties zonder zijn editor te wijzigen.\n */\nexport function StyleEditor({\n value = {},\n onChange,\n}: {\n value?: BlockStyle;\n onChange: (style: BlockStyle) => void;\n}) {\n const update = (part: Partial<BlockStyle>) => onChange({ ...value, ...part });\n return (\n <details className=\"rounded-lg border border-slate-200 p-3\">\n <summary className=\"cursor-pointer text-sm font-medium text-slate-700\">Blokstijl</summary>\n <div className=\"mt-3 grid gap-3\">\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label=\"Ruimte boven/onder\">\n <Select\n value={value.paddingY ?? \"\"}\n onValueChange={(v) => update({ paddingY: (v || undefined) as BlockStyle[\"paddingY\"] })}\n options={[\n { value: \"\", label: \"Standaard\" },\n { value: \"none\", label: \"Geen\" },\n { value: \"sm\", label: \"Klein\" },\n { value: \"md\", label: \"Normaal\" },\n { value: \"lg\", label: \"Groot\" },\n { value: \"xl\", label: \"Extra groot\" },\n ]}\n />\n </Field>\n <Field label=\"Breedte\">\n <Select\n value={value.width ?? \"\"}\n onValueChange={(v) => update({ width: (v || undefined) as BlockStyle[\"width\"] })}\n options={[\n { value: \"\", label: \"Standaard\" },\n { value: \"narrow\", label: \"Smal\" },\n { value: \"container\", label: \"Container\" },\n { value: \"full\", label: \"Volle breedte\" },\n ]}\n />\n </Field>\n <Field label=\"Uitlijning\">\n <Select\n value={value.align ?? \"\"}\n onValueChange={(v) => update({ align: (v || undefined) as BlockStyle[\"align\"] })}\n options={[\n { value: \"\", label: \"Standaard\" },\n { value: \"left\", label: \"Links\" },\n { value: \"center\", label: \"Midden\" },\n { value: \"right\", label: \"Rechts\" },\n ]}\n />\n </Field>\n <Field label=\"Achtergrond (kleur)\">\n <Input value={value.background ?? \"\"} onChange={(e) => update({ background: e.target.value || undefined })} placeholder=\"#f8fafc\" />\n </Field>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label=\"Anker-id (voor #deeplinks)\">\n <Input value={value.anchorId ?? \"\"} onChange={(e) => update({ anchorId: e.target.value || undefined })} placeholder=\"bv. contact\" />\n </Field>\n <Field label=\"Animatie (bij scrollen)\">\n <Select\n value={value.animate ?? \"\"}\n onValueChange={(v) => update({ animate: (v || undefined) as BlockStyle[\"animate\"] })}\n options={[\n { value: \"\", label: \"Geen\" },\n { value: \"fade\", label: \"Vervagen\" },\n { value: \"up\", label: \"Omhoog schuiven\" },\n ]}\n />\n </Field>\n </div>\n </div>\n </details>\n );\n}\n"],"mappings":";AAqBM,cAEE,YAFF;AAlBN,SAAS,OAAO,aAAa;AAC7B,SAAS,cAAc;AAOhB,SAAS,YAAY;AAAA,EAC1B,QAAQ,CAAC;AAAA,EACT;AACF,GAGG;AACD,QAAM,SAAS,CAAC,SAA8B,SAAS,EAAE,GAAG,OAAO,GAAG,KAAK,CAAC;AAC5E,SACE,qBAAC,aAAQ,WAAU,0CACjB;AAAA,wBAAC,aAAQ,WAAU,qDAAoD,uBAAS;AAAA,IAChF,qBAAC,SAAI,WAAU,mBACb;AAAA,2BAAC,SAAI,WAAU,0BACb;AAAA,4BAAC,SAAM,OAAM,sBACX;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,MAAM,YAAY;AAAA,YACzB,eAAe,CAAC,MAAM,OAAO,EAAE,UAAW,KAAK,OAAqC,CAAC;AAAA,YACrF,SAAS;AAAA,cACP,EAAE,OAAO,IAAI,OAAO,YAAY;AAAA,cAChC,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,cAC/B,EAAE,OAAO,MAAM,OAAO,QAAQ;AAAA,cAC9B,EAAE,OAAO,MAAM,OAAO,UAAU;AAAA,cAChC,EAAE,OAAO,MAAM,OAAO,QAAQ;AAAA,cAC9B,EAAE,OAAO,MAAM,OAAO,cAAc;AAAA,YACtC;AAAA;AAAA,QACF,GACF;AAAA,QACA,oBAAC,SAAM,OAAM,WACX;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,MAAM,SAAS;AAAA,YACtB,eAAe,CAAC,MAAM,OAAO,EAAE,OAAQ,KAAK,OAAkC,CAAC;AAAA,YAC/E,SAAS;AAAA,cACP,EAAE,OAAO,IAAI,OAAO,YAAY;AAAA,cAChC,EAAE,OAAO,UAAU,OAAO,OAAO;AAAA,cACjC,EAAE,OAAO,aAAa,OAAO,YAAY;AAAA,cACzC,EAAE,OAAO,QAAQ,OAAO,gBAAgB;AAAA,YAC1C;AAAA;AAAA,QACF,GACF;AAAA,QACA,oBAAC,SAAM,OAAM,cACX;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,MAAM,SAAS;AAAA,YACtB,eAAe,CAAC,MAAM,OAAO,EAAE,OAAQ,KAAK,OAAkC,CAAC;AAAA,YAC/E,SAAS;AAAA,cACP,EAAE,OAAO,IAAI,OAAO,YAAY;AAAA,cAChC,EAAE,OAAO,QAAQ,OAAO,QAAQ;AAAA,cAChC,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,cACnC,EAAE,OAAO,SAAS,OAAO,SAAS;AAAA,YACpC;AAAA;AAAA,QACF,GACF;AAAA,QACA,oBAAC,SAAM,OAAM,uBACX,8BAAC,SAAM,OAAO,MAAM,cAAc,IAAI,UAAU,CAAC,MAAM,OAAO,EAAE,YAAY,EAAE,OAAO,SAAS,OAAU,CAAC,GAAG,aAAY,WAAU,GACpI;AAAA,SACF;AAAA,MACA,qBAAC,SAAI,WAAU,0BACb;AAAA,4BAAC,SAAM,OAAM,8BACX,8BAAC,SAAM,OAAO,MAAM,YAAY,IAAI,UAAU,CAAC,MAAM,OAAO,EAAE,UAAU,EAAE,OAAO,SAAS,OAAU,CAAC,GAAG,aAAY,eAAc,GACpI;AAAA,QACA,oBAAC,SAAM,OAAM,2BACX;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,MAAM,WAAW;AAAA,YACxB,eAAe,CAAC,MAAM,OAAO,EAAE,SAAU,KAAK,OAAoC,CAAC;AAAA,YACnF,SAAS;AAAA,cACP,EAAE,OAAO,IAAI,OAAO,OAAO;AAAA,cAC3B,EAAE,OAAO,QAAQ,OAAO,WAAW;AAAA,cACnC,EAAE,OAAO,MAAM,OAAO,kBAAkB;AAAA,YAC1C;AAAA;AAAA,QACF,GACF;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type ComponentType } from "react";
|
|
2
|
+
export interface BlockEditorProps {
|
|
3
|
+
block: Record<string, unknown>;
|
|
4
|
+
siteId: string;
|
|
5
|
+
onChange: (next: Record<string, unknown>) => void;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Fallback-editor voor bloktypes zonder eigen `Editor` (bv. agent-gebouwde maatwerkblokken):
|
|
9
|
+
* genereert automatisch een formulier uit het Zod-schema van het blok. Primitieve velden krijgen
|
|
10
|
+
* echte invoervelden (tekst/getal/schakelaar/keuze, `html` → rich text, beeld-URL's → mediakiezer);
|
|
11
|
+
* complexe velden (lijsten/objecten) een JSON-veld met validatie vóór opslaan. Zo is een blok
|
|
12
|
+
* zonder maatwerk-editor nooit een doodlopend pad voor de klant.
|
|
13
|
+
*/
|
|
14
|
+
declare function GenericEditor({ block, siteId, onChange }: BlockEditorProps): import("react").JSX.Element;
|
|
15
|
+
export declare const builtinBlockEditors: Record<string, ComponentType<BlockEditorProps>>;
|
|
16
|
+
export { GenericEditor };
|