@actuate-media/cms-admin 0.8.0 → 0.8.2
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/AdminRoot.d.ts.map +1 -1
- package/dist/AdminRoot.js +44 -42
- package/dist/AdminRoot.js.map +1 -1
- package/dist/__tests__/lib/search.test.js +10 -10
- package/dist/__tests__/lib/search.test.js.map +1 -1
- package/dist/__tests__/lib/utils.test.js.map +1 -1
- package/dist/__tests__/router/match-route.test.js.map +1 -1
- package/dist/__tests__/router/strip-base.test.js.map +1 -1
- package/dist/actuate-admin.css +1 -1
- package/dist/components/Breadcrumbs.d.ts.map +1 -1
- package/dist/components/Breadcrumbs.js +2 -4
- package/dist/components/Breadcrumbs.js.map +1 -1
- package/dist/components/CommandPalette.d.ts.map +1 -1
- package/dist/components/CommandPalette.js +7 -3
- package/dist/components/CommandPalette.js.map +1 -1
- package/dist/components/ContentOverviewChart.d.ts.map +1 -1
- package/dist/components/ContentOverviewChart.js.map +1 -1
- package/dist/components/ErrorBoundary.d.ts.map +1 -1
- package/dist/components/ErrorBoundary.js.map +1 -1
- package/dist/components/FocalPointPicker.d.ts.map +1 -1
- package/dist/components/FocalPointPicker.js +4 -2
- package/dist/components/FocalPointPicker.js.map +1 -1
- package/dist/components/FolderTree.d.ts.map +1 -1
- package/dist/components/FolderTree.js +18 -10
- package/dist/components/FolderTree.js.map +1 -1
- package/dist/components/LivePreview.d.ts +1 -1
- package/dist/components/LivePreview.d.ts.map +1 -1
- package/dist/components/LivePreview.js +6 -2
- package/dist/components/LivePreview.js.map +1 -1
- package/dist/components/LocaleProvider.d.ts.map +1 -1
- package/dist/components/LocaleProvider.js.map +1 -1
- package/dist/components/LocaleSwitcher.d.ts.map +1 -1
- package/dist/components/LocaleSwitcher.js +1 -1
- package/dist/components/LocaleSwitcher.js.map +1 -1
- package/dist/components/MediaPickerModal.d.ts.map +1 -1
- package/dist/components/MediaPickerModal.js.map +1 -1
- package/dist/components/PresenceIndicator.d.ts.map +1 -1
- package/dist/components/PresenceIndicator.js +5 -2
- package/dist/components/PresenceIndicator.js.map +1 -1
- package/dist/components/SEOPanel.d.ts +1 -1
- package/dist/components/SEOPanel.d.ts.map +1 -1
- package/dist/components/SEOPanel.js +110 -24
- package/dist/components/SEOPanel.js.map +1 -1
- package/dist/components/SEOPerformance.d.ts.map +1 -1
- package/dist/components/SEOPerformance.js +2 -2
- package/dist/components/SEOPerformance.js.map +1 -1
- package/dist/components/ThemeProvider.d.ts.map +1 -1
- package/dist/components/ThemeProvider.js.map +1 -1
- package/dist/components/TipTapEditor.d.ts.map +1 -1
- package/dist/components/TipTapEditor.js +5 -1
- package/dist/components/TipTapEditor.js.map +1 -1
- package/dist/components/VersionHistory.d.ts +1 -1
- package/dist/components/VersionHistory.d.ts.map +1 -1
- package/dist/components/VersionHistory.js +1 -1
- package/dist/components/VersionHistory.js.map +1 -1
- package/dist/components/ui/Avatar.d.ts.map +1 -1
- package/dist/components/ui/Avatar.js.map +1 -1
- package/dist/components/ui/Badge.d.ts.map +1 -1
- package/dist/components/ui/Badge.js.map +1 -1
- package/dist/components/ui/Button.d.ts.map +1 -1
- package/dist/components/ui/Button.js.map +1 -1
- package/dist/components/ui/CommandPalette.d.ts.map +1 -1
- package/dist/components/ui/CommandPalette.js +8 -2
- package/dist/components/ui/CommandPalette.js.map +1 -1
- package/dist/components/ui/ConfirmDialog.d.ts.map +1 -1
- package/dist/components/ui/ConfirmDialog.js.map +1 -1
- package/dist/components/ui/DataTable.d.ts.map +1 -1
- package/dist/components/ui/DataTable.js +1 -3
- package/dist/components/ui/DataTable.js.map +1 -1
- package/dist/components/ui/EmptyState.d.ts.map +1 -1
- package/dist/components/ui/EmptyState.js +1 -1
- package/dist/components/ui/EmptyState.js.map +1 -1
- package/dist/components/ui/Modal.d.ts.map +1 -1
- package/dist/components/ui/Modal.js.map +1 -1
- package/dist/components/ui/Pagination.d.ts +1 -1
- package/dist/components/ui/Pagination.d.ts.map +1 -1
- package/dist/components/ui/Pagination.js +7 -2
- package/dist/components/ui/Pagination.js.map +1 -1
- package/dist/components/ui/SearchInput.d.ts.map +1 -1
- package/dist/components/ui/SearchInput.js.map +1 -1
- package/dist/components/ui/Skeleton.d.ts.map +1 -1
- package/dist/components/ui/Skeleton.js.map +1 -1
- package/dist/components/ui/Toast.d.ts.map +1 -1
- package/dist/components/ui/Toast.js.map +1 -1
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js.map +1 -1
- package/dist/fields/ArrayField.d.ts.map +1 -1
- package/dist/fields/ArrayField.js +1 -1
- package/dist/fields/ArrayField.js.map +1 -1
- package/dist/fields/BlockBuilderField.d.ts.map +1 -1
- package/dist/fields/BlockBuilderField.js +7 -7
- package/dist/fields/BlockBuilderField.js.map +1 -1
- package/dist/fields/DateField.d.ts.map +1 -1
- package/dist/fields/DateField.js +1 -1
- package/dist/fields/DateField.js.map +1 -1
- package/dist/fields/FieldRenderer.d.ts.map +1 -1
- package/dist/fields/FieldRenderer.js.map +1 -1
- package/dist/fields/GroupField.d.ts.map +1 -1
- package/dist/fields/GroupField.js +1 -1
- package/dist/fields/GroupField.js.map +1 -1
- package/dist/fields/MediaField.d.ts.map +1 -1
- package/dist/fields/MediaField.js +1 -1
- package/dist/fields/MediaField.js.map +1 -1
- package/dist/fields/NavBuilderField.d.ts.map +1 -1
- package/dist/fields/NavBuilderField.js +2 -5
- package/dist/fields/NavBuilderField.js.map +1 -1
- package/dist/fields/NumberField.d.ts +1 -1
- package/dist/fields/NumberField.d.ts.map +1 -1
- package/dist/fields/NumberField.js +2 -2
- package/dist/fields/NumberField.js.map +1 -1
- package/dist/fields/RelationshipField.d.ts.map +1 -1
- package/dist/fields/RelationshipField.js +7 -3
- package/dist/fields/RelationshipField.js.map +1 -1
- package/dist/fields/RichTextField.d.ts +1 -1
- package/dist/fields/RichTextField.d.ts.map +1 -1
- package/dist/fields/RichTextField.js +2 -2
- package/dist/fields/RichTextField.js.map +1 -1
- package/dist/fields/SelectField.d.ts.map +1 -1
- package/dist/fields/SelectField.js +9 -7
- package/dist/fields/SelectField.js.map +1 -1
- package/dist/fields/SlugField.d.ts.map +1 -1
- package/dist/fields/SlugField.js +1 -1
- package/dist/fields/SlugField.js.map +1 -1
- package/dist/fields/TextField.d.ts +1 -1
- package/dist/fields/TextField.d.ts.map +1 -1
- package/dist/fields/TextField.js +2 -2
- package/dist/fields/TextField.js.map +1 -1
- package/dist/fields/ToggleField.d.ts.map +1 -1
- package/dist/fields/ToggleField.js +1 -1
- package/dist/fields/ToggleField.js.map +1 -1
- package/dist/fields/block-types.d.ts.map +1 -1
- package/dist/fields/block-types.js +28 -8
- package/dist/fields/block-types.js.map +1 -1
- package/dist/fields/index.d.ts.map +1 -1
- package/dist/fields/index.js.map +1 -1
- package/dist/hooks/useBuilderState.d.ts.map +1 -1
- package/dist/hooks/useBuilderState.js.map +1 -1
- package/dist/hooks/useContentLock.d.ts.map +1 -1
- package/dist/hooks/useContentLock.js.map +1 -1
- package/dist/hooks/useDebounce.js.map +1 -1
- package/dist/hooks/useKeyboardShortcuts.d.ts.map +1 -1
- package/dist/hooks/useKeyboardShortcuts.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/layout/Header.d.ts.map +1 -1
- package/dist/layout/Header.js.map +1 -1
- package/dist/layout/Layout.d.ts.map +1 -1
- package/dist/layout/Layout.js.map +1 -1
- package/dist/layout/Sidebar.d.ts +1 -1
- package/dist/layout/Sidebar.d.ts.map +1 -1
- package/dist/layout/Sidebar.js +5 -8
- package/dist/layout/Sidebar.js.map +1 -1
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/search.d.ts.map +1 -1
- package/dist/lib/search.js +3 -5
- package/dist/lib/search.js.map +1 -1
- package/dist/lib/useApiData.d.ts.map +1 -1
- package/dist/lib/useApiData.js.map +1 -1
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js.map +1 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +1 -3
- package/dist/router/index.js.map +1 -1
- package/dist/views/CollectionList.d.ts.map +1 -1
- package/dist/views/CollectionList.js +56 -17
- package/dist/views/CollectionList.js.map +1 -1
- package/dist/views/Dashboard.d.ts.map +1 -1
- package/dist/views/Dashboard.js +26 -13
- package/dist/views/Dashboard.js.map +1 -1
- package/dist/views/DocumentEdit.d.ts +1 -1
- package/dist/views/DocumentEdit.d.ts.map +1 -1
- package/dist/views/DocumentEdit.js +33 -15
- package/dist/views/DocumentEdit.js.map +1 -1
- package/dist/views/ForgotPassword.d.ts.map +1 -1
- package/dist/views/ForgotPassword.js.map +1 -1
- package/dist/views/FormEditor.d.ts.map +1 -1
- package/dist/views/FormEditor.js +8 -2
- package/dist/views/FormEditor.js.map +1 -1
- package/dist/views/FormSubmissions.d.ts.map +1 -1
- package/dist/views/FormSubmissions.js +6 -6
- package/dist/views/FormSubmissions.js.map +1 -1
- package/dist/views/Forms.d.ts.map +1 -1
- package/dist/views/Forms.js.map +1 -1
- package/dist/views/Login.d.ts.map +1 -1
- package/dist/views/Login.js +5 -2
- package/dist/views/Login.js.map +1 -1
- package/dist/views/MediaBrowser.d.ts.map +1 -1
- package/dist/views/MediaBrowser.js +39 -19
- package/dist/views/MediaBrowser.js.map +1 -1
- package/dist/views/PageEditor.d.ts.map +1 -1
- package/dist/views/PageEditor.js.map +1 -1
- package/dist/views/Pages.d.ts.map +1 -1
- package/dist/views/Pages.js +20 -10
- package/dist/views/Pages.js.map +1 -1
- package/dist/views/PostEditor.d.ts.map +1 -1
- package/dist/views/PostEditor.js.map +1 -1
- package/dist/views/Posts.d.ts.map +1 -1
- package/dist/views/Posts.js +13 -7
- package/dist/views/Posts.js.map +1 -1
- package/dist/views/Redirects.d.ts.map +1 -1
- package/dist/views/Redirects.js +17 -5
- package/dist/views/Redirects.js.map +1 -1
- package/dist/views/ResetPassword.d.ts.map +1 -1
- package/dist/views/ResetPassword.js.map +1 -1
- package/dist/views/SEO.d.ts.map +1 -1
- package/dist/views/SEO.js +40 -17
- package/dist/views/SEO.js.map +1 -1
- package/dist/views/ScriptTagEditor.d.ts.map +1 -1
- package/dist/views/ScriptTagEditor.js +2 -1
- package/dist/views/ScriptTagEditor.js.map +1 -1
- package/dist/views/ScriptTags.d.ts.map +1 -1
- package/dist/views/ScriptTags.js.map +1 -1
- package/dist/views/Settings.d.ts.map +1 -1
- package/dist/views/Settings.js +38 -11
- package/dist/views/Settings.js.map +1 -1
- package/dist/views/SetupWizard.d.ts.map +1 -1
- package/dist/views/SetupWizard.js.map +1 -1
- package/dist/views/Users.d.ts.map +1 -1
- package/dist/views/Users.js +5 -3
- package/dist/views/Users.js.map +1 -1
- package/dist/views/page-builder/AIBlockAssist.d.ts.map +1 -1
- package/dist/views/page-builder/AIBlockAssist.js +1 -1
- package/dist/views/page-builder/AIBlockAssist.js.map +1 -1
- package/dist/views/page-builder/AIGenerateDialog.d.ts.map +1 -1
- package/dist/views/page-builder/AIGenerateDialog.js +4 -1
- package/dist/views/page-builder/AIGenerateDialog.js.map +1 -1
- package/dist/views/page-builder/BlockEditor.d.ts.map +1 -1
- package/dist/views/page-builder/BlockEditor.js +1 -1
- package/dist/views/page-builder/BlockEditor.js.map +1 -1
- package/dist/views/page-builder/BlockPicker.d.ts.map +1 -1
- package/dist/views/page-builder/BlockPicker.js.map +1 -1
- package/dist/views/page-builder/BottomBar.d.ts.map +1 -1
- package/dist/views/page-builder/BottomBar.js.map +1 -1
- package/dist/views/page-builder/BuilderToolbar.d.ts.map +1 -1
- package/dist/views/page-builder/BuilderToolbar.js.map +1 -1
- package/dist/views/page-builder/ContextPanel.d.ts.map +1 -1
- package/dist/views/page-builder/ContextPanel.js +4 -1
- package/dist/views/page-builder/ContextPanel.js.map +1 -1
- package/dist/views/page-builder/DesignScore.d.ts.map +1 -1
- package/dist/views/page-builder/DesignScore.js.map +1 -1
- package/dist/views/page-builder/NodeSettings.d.ts.map +1 -1
- package/dist/views/page-builder/NodeSettings.js +1 -1
- package/dist/views/page-builder/NodeSettings.js.map +1 -1
- package/dist/views/page-builder/PageBuilder.d.ts +1 -1
- package/dist/views/page-builder/PageBuilder.d.ts.map +1 -1
- package/dist/views/page-builder/PageBuilder.js +4 -2
- package/dist/views/page-builder/PageBuilder.js.map +1 -1
- package/dist/views/page-builder/PageSettings.d.ts.map +1 -1
- package/dist/views/page-builder/PageSettings.js.map +1 -1
- package/dist/views/page-builder/PageTemplates.d.ts.map +1 -1
- package/dist/views/page-builder/PageTemplates.js.map +1 -1
- package/dist/views/page-builder/SEOPanel.d.ts.map +1 -1
- package/dist/views/page-builder/SEOPanel.js +1 -3
- package/dist/views/page-builder/SEOPanel.js.map +1 -1
- package/dist/views/page-builder/SavedSections.d.ts.map +1 -1
- package/dist/views/page-builder/SavedSections.js +3 -7
- package/dist/views/page-builder/SavedSections.js.map +1 -1
- package/dist/views/page-builder/TemplatePicker.d.ts.map +1 -1
- package/dist/views/page-builder/TemplatePicker.js.map +1 -1
- package/dist/views/page-builder/block-renderers/CTAPreview.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/CTAPreview.js +1 -1
- package/dist/views/page-builder/block-renderers/CTAPreview.js.map +1 -1
- package/dist/views/page-builder/block-renderers/CardsPreview.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/CardsPreview.js +1 -1
- package/dist/views/page-builder/block-renderers/CardsPreview.js.map +1 -1
- package/dist/views/page-builder/block-renderers/CodePreview.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/CodePreview.js +1 -5
- package/dist/views/page-builder/block-renderers/CodePreview.js.map +1 -1
- package/dist/views/page-builder/block-renderers/FAQPreview.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/FAQPreview.js +4 -1
- package/dist/views/page-builder/block-renderers/FAQPreview.js.map +1 -1
- package/dist/views/page-builder/block-renderers/FallbackPreview.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/FallbackPreview.js.map +1 -1
- package/dist/views/page-builder/block-renderers/FormPreview.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/FormPreview.js +2 -2
- package/dist/views/page-builder/block-renderers/FormPreview.js.map +1 -1
- package/dist/views/page-builder/block-renderers/GalleryPreview.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/GalleryPreview.js +1 -3
- package/dist/views/page-builder/block-renderers/GalleryPreview.js.map +1 -1
- package/dist/views/page-builder/block-renderers/HeroPreview.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/HeroPreview.js.map +1 -1
- package/dist/views/page-builder/block-renderers/ImagePreview.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/ImagePreview.js.map +1 -1
- package/dist/views/page-builder/block-renderers/TextPreview.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/TextPreview.js +2 -6
- package/dist/views/page-builder/block-renderers/TextPreview.js.map +1 -1
- package/dist/views/page-builder/block-renderers/VideoPreview.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/VideoPreview.js +2 -5
- package/dist/views/page-builder/block-renderers/VideoPreview.js.map +1 -1
- package/dist/views/page-builder/block-renderers/index.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/index.js.map +1 -1
- package/dist/views/page-builder/canvas/BlockRenderer.d.ts.map +1 -1
- package/dist/views/page-builder/canvas/BlockRenderer.js +1 -5
- package/dist/views/page-builder/canvas/BlockRenderer.js.map +1 -1
- package/dist/views/page-builder/canvas/BuilderCanvas.d.ts.map +1 -1
- package/dist/views/page-builder/canvas/BuilderCanvas.js.map +1 -1
- package/dist/views/page-builder/canvas/ColumnRenderer.d.ts.map +1 -1
- package/dist/views/page-builder/canvas/ColumnRenderer.js +1 -5
- package/dist/views/page-builder/canvas/ColumnRenderer.js.map +1 -1
- package/dist/views/page-builder/canvas/ContainerRenderer.d.ts.map +1 -1
- package/dist/views/page-builder/canvas/ContainerRenderer.js +1 -5
- package/dist/views/page-builder/canvas/ContainerRenderer.js.map +1 -1
- package/dist/views/page-builder/canvas/RowRenderer.d.ts.map +1 -1
- package/dist/views/page-builder/canvas/RowRenderer.js +1 -5
- package/dist/views/page-builder/canvas/RowRenderer.js.map +1 -1
- package/dist/views/page-builder/canvas/SectionRenderer.d.ts.map +1 -1
- package/dist/views/page-builder/canvas/SectionRenderer.js +1 -5
- package/dist/views/page-builder/canvas/SectionRenderer.js.map +1 -1
- package/dist/views/page-builder/canvas/index.d.ts.map +1 -1
- package/dist/views/page-builder/canvas/index.js.map +1 -1
- package/package.json +2 -2
- package/src/AdminRoot.tsx +263 -191
- package/src/__tests__/lib/search.test.ts +60 -69
- package/src/__tests__/lib/utils.test.ts +12 -12
- package/src/__tests__/router/match-route.test.ts +24 -26
- package/src/__tests__/router/strip-base.test.ts +15 -15
- package/src/components/Breadcrumbs.tsx +27 -24
- package/src/components/CommandPalette.tsx +115 -99
- package/src/components/ContentOverviewChart.tsx +19 -14
- package/src/components/ErrorBoundary.tsx +13 -13
- package/src/components/FocalPointPicker.tsx +31 -20
- package/src/components/FolderTree.tsx +172 -139
- package/src/components/LivePreview.tsx +68 -41
- package/src/components/LocaleProvider.tsx +26 -20
- package/src/components/LocaleSwitcher.tsx +9 -11
- package/src/components/MediaPickerModal.tsx +46 -45
- package/src/components/PresenceIndicator.tsx +30 -27
- package/src/components/SEOPanel.tsx +378 -228
- package/src/components/SEOPerformance.tsx +52 -30
- package/src/components/ThemeProvider.tsx +46 -46
- package/src/components/TipTapEditor.tsx +60 -64
- package/src/components/VersionHistory.tsx +63 -52
- package/src/components/ui/Avatar.tsx +8 -8
- package/src/components/ui/Badge.tsx +7 -5
- package/src/components/ui/Button.tsx +24 -13
- package/src/components/ui/CommandPalette.tsx +56 -42
- package/src/components/ui/ConfirmDialog.tsx +14 -14
- package/src/components/ui/DataTable.tsx +37 -39
- package/src/components/ui/EmptyState.tsx +9 -11
- package/src/components/ui/Modal.tsx +21 -15
- package/src/components/ui/Pagination.tsx +34 -19
- package/src/components/ui/SearchInput.tsx +17 -7
- package/src/components/ui/Skeleton.tsx +7 -7
- package/src/components/ui/Toast.tsx +29 -22
- package/src/components/ui/index.ts +24 -24
- package/src/fields/ArrayField.tsx +43 -25
- package/src/fields/BlockBuilderField.tsx +80 -99
- package/src/fields/DateField.tsx +20 -12
- package/src/fields/FieldRenderer.tsx +34 -34
- package/src/fields/GroupField.tsx +8 -10
- package/src/fields/MediaField.tsx +8 -10
- package/src/fields/NavBuilderField.tsx +24 -25
- package/src/fields/NumberField.tsx +21 -14
- package/src/fields/RelationshipField.tsx +105 -91
- package/src/fields/RichTextField.tsx +16 -12
- package/src/fields/SelectField.tsx +42 -34
- package/src/fields/SlugField.tsx +29 -17
- package/src/fields/TextField.tsx +24 -16
- package/src/fields/ToggleField.tsx +7 -9
- package/src/fields/block-types.ts +50 -24
- package/src/fields/index.ts +17 -17
- package/src/hooks/useBuilderState.ts +260 -221
- package/src/hooks/useContentLock.ts +23 -20
- package/src/hooks/useDebounce.ts +7 -7
- package/src/hooks/useKeyboardShortcuts.ts +16 -16
- package/src/index.ts +69 -58
- package/src/layout/Header.tsx +21 -20
- package/src/layout/Layout.tsx +22 -24
- package/src/layout/Sidebar.tsx +107 -72
- package/src/lib/api.ts +34 -34
- package/src/lib/search.ts +30 -34
- package/src/lib/useApiData.ts +65 -62
- package/src/lib/utils.ts +3 -3
- package/src/router/index.ts +33 -35
- package/src/styles/build-input.css +2 -2
- package/src/styles/tailwind.css +1 -1
- package/src/styles/theme.css +26 -2
- package/src/views/CollectionList.tsx +275 -121
- package/src/views/Dashboard.tsx +164 -117
- package/src/views/DocumentEdit.tsx +298 -253
- package/src/views/ForgotPassword.tsx +27 -23
- package/src/views/FormEditor.tsx +165 -99
- package/src/views/FormSubmissions.tsx +261 -117
- package/src/views/Forms.tsx +56 -26
- package/src/views/Login.tsx +107 -84
- package/src/views/MediaBrowser.tsx +717 -523
- package/src/views/PageEditor.tsx +44 -46
- package/src/views/Pages.tsx +312 -149
- package/src/views/PostEditor.tsx +57 -51
- package/src/views/Posts.tsx +206 -74
- package/src/views/Redirects.tsx +173 -117
- package/src/views/ResetPassword.tsx +43 -32
- package/src/views/SEO.tsx +607 -160
- package/src/views/ScriptTagEditor.tsx +69 -69
- package/src/views/ScriptTags.tsx +54 -42
- package/src/views/Settings.tsx +430 -220
- package/src/views/SetupWizard.tsx +69 -46
- package/src/views/Users.tsx +154 -120
- package/src/views/page-builder/AIBlockAssist.tsx +21 -25
- package/src/views/page-builder/AIGenerateDialog.tsx +134 -127
- package/src/views/page-builder/BlockEditor.tsx +94 -96
- package/src/views/page-builder/BlockPicker.tsx +73 -88
- package/src/views/page-builder/BottomBar.tsx +15 -11
- package/src/views/page-builder/BuilderToolbar.tsx +32 -29
- package/src/views/page-builder/ContextPanel.tsx +57 -57
- package/src/views/page-builder/DesignScore.tsx +52 -59
- package/src/views/page-builder/NodeSettings.tsx +59 -59
- package/src/views/page-builder/PageBuilder.tsx +156 -155
- package/src/views/page-builder/PageSettings.tsx +16 -15
- package/src/views/page-builder/PageTemplates.tsx +23 -17
- package/src/views/page-builder/SEOPanel.tsx +90 -111
- package/src/views/page-builder/SavedSections.tsx +99 -105
- package/src/views/page-builder/TemplatePicker.tsx +44 -48
- package/src/views/page-builder/block-renderers/CTAPreview.tsx +11 -13
- package/src/views/page-builder/block-renderers/CardsPreview.tsx +13 -15
- package/src/views/page-builder/block-renderers/CodePreview.tsx +16 -16
- package/src/views/page-builder/block-renderers/FAQPreview.tsx +20 -23
- package/src/views/page-builder/block-renderers/FallbackPreview.tsx +5 -5
- package/src/views/page-builder/block-renderers/FormPreview.tsx +9 -13
- package/src/views/page-builder/block-renderers/GalleryPreview.tsx +22 -28
- package/src/views/page-builder/block-renderers/HeroPreview.tsx +17 -30
- package/src/views/page-builder/block-renderers/ImagePreview.tsx +12 -12
- package/src/views/page-builder/block-renderers/TextPreview.tsx +22 -22
- package/src/views/page-builder/block-renderers/VideoPreview.tsx +13 -18
- package/src/views/page-builder/block-renderers/index.ts +17 -17
- package/src/views/page-builder/canvas/BlockRenderer.tsx +19 -23
- package/src/views/page-builder/canvas/BuilderCanvas.tsx +17 -20
- package/src/views/page-builder/canvas/ColumnRenderer.tsx +22 -26
- package/src/views/page-builder/canvas/ContainerRenderer.tsx +20 -24
- package/src/views/page-builder/canvas/RowRenderer.tsx +19 -23
- package/src/views/page-builder/canvas/SectionRenderer.tsx +30 -34
- package/src/views/page-builder/canvas/index.ts +2 -2
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
'use client'
|
|
1
|
+
'use client'
|
|
2
2
|
|
|
3
|
-
import { Code, Globe, Terminal } from 'lucide-react'
|
|
4
|
-
import type { BlockPreviewProps } from './index.js'
|
|
3
|
+
import { Code, Globe, Terminal } from 'lucide-react'
|
|
4
|
+
import type { BlockPreviewProps } from './index.js'
|
|
5
5
|
|
|
6
6
|
export function CodePreview({ data, variant = 'embed' }: BlockPreviewProps) {
|
|
7
|
-
const content = (data.content as string) || ''
|
|
8
|
-
const language = (data.language as string) || ''
|
|
9
|
-
const sandboxed = data.sandboxed as boolean | undefined
|
|
7
|
+
const content = (data.content as string) || ''
|
|
8
|
+
const language = (data.language as string) || ''
|
|
9
|
+
const sandboxed = data.sandboxed as boolean | undefined
|
|
10
10
|
|
|
11
|
-
const truncated = content.length > 200 ? content.slice(0, 200) + '…' : content
|
|
11
|
+
const truncated = content.length > 200 ? content.slice(0, 200) + '…' : content
|
|
12
12
|
|
|
13
13
|
const icon =
|
|
14
|
-
variant === 'html'
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
variant === 'html' ? (
|
|
15
|
+
<Globe size={14} className="text-muted-foreground" />
|
|
16
|
+
) : variant === 'script' ? (
|
|
17
|
+
<Terminal size={14} className="text-muted-foreground" />
|
|
18
|
+
) : (
|
|
19
|
+
<Code size={14} className="text-muted-foreground" />
|
|
20
|
+
)
|
|
19
21
|
|
|
20
22
|
return (
|
|
21
23
|
<div className="overflow-hidden rounded-md border border-border">
|
|
22
24
|
<div className="flex items-center gap-2 border-b border-border bg-card px-3 py-2">
|
|
23
25
|
{icon}
|
|
24
|
-
<span className="text-xs text-muted-foreground">
|
|
25
|
-
{language || variant}
|
|
26
|
-
</span>
|
|
26
|
+
<span className="text-xs text-muted-foreground">{language || variant}</span>
|
|
27
27
|
{sandboxed && (
|
|
28
28
|
<span className="ml-auto rounded bg-muted px-1.5 py-0.5 text-xs text-muted-foreground">
|
|
29
29
|
sandboxed
|
|
@@ -42,5 +42,5 @@ export function CodePreview({ data, variant = 'embed' }: BlockPreviewProps) {
|
|
|
42
42
|
)}
|
|
43
43
|
</div>
|
|
44
44
|
</div>
|
|
45
|
-
)
|
|
45
|
+
)
|
|
46
46
|
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
'use client'
|
|
1
|
+
'use client'
|
|
2
2
|
|
|
3
|
-
import { ChevronDown } from 'lucide-react'
|
|
4
|
-
import type { BlockPreviewProps } from './index.js'
|
|
3
|
+
import { ChevronDown } from 'lucide-react'
|
|
4
|
+
import type { BlockPreviewProps } from './index.js'
|
|
5
5
|
|
|
6
6
|
interface FAQItem {
|
|
7
|
-
question?: string
|
|
8
|
-
answer?: string
|
|
7
|
+
question?: string
|
|
8
|
+
answer?: string
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export function FAQPreview({ data, variant = 'accordion' }: BlockPreviewProps) {
|
|
12
|
-
const items = (data.items as FAQItem[]) || []
|
|
12
|
+
const items = (data.items as FAQItem[]) || []
|
|
13
13
|
|
|
14
14
|
const placeholderItems: FAQItem[] =
|
|
15
15
|
items.length > 0
|
|
@@ -17,13 +17,16 @@ export function FAQPreview({ data, variant = 'accordion' }: BlockPreviewProps) {
|
|
|
17
17
|
: [
|
|
18
18
|
{ question: 'What is this?', answer: 'Answer to the first question goes here.' },
|
|
19
19
|
{ question: 'How does it work?', answer: 'Answer to the second question goes here.' },
|
|
20
|
-
{
|
|
21
|
-
|
|
20
|
+
{
|
|
21
|
+
question: 'Where can I learn more?',
|
|
22
|
+
answer: 'Answer to the third question goes here.',
|
|
23
|
+
},
|
|
24
|
+
]
|
|
22
25
|
|
|
23
26
|
if (variant === 'two-column') {
|
|
24
|
-
const mid = Math.ceil(placeholderItems.length / 2)
|
|
25
|
-
const col1 = placeholderItems.slice(0, mid)
|
|
26
|
-
const col2 = placeholderItems.slice(mid)
|
|
27
|
+
const mid = Math.ceil(placeholderItems.length / 2)
|
|
28
|
+
const col1 = placeholderItems.slice(0, mid)
|
|
29
|
+
const col2 = placeholderItems.slice(mid)
|
|
27
30
|
|
|
28
31
|
return (
|
|
29
32
|
<div className="rounded-md border border-border p-4">
|
|
@@ -44,7 +47,7 @@ export function FAQPreview({ data, variant = 'accordion' }: BlockPreviewProps) {
|
|
|
44
47
|
))}
|
|
45
48
|
</div>
|
|
46
49
|
</div>
|
|
47
|
-
)
|
|
50
|
+
)
|
|
48
51
|
}
|
|
49
52
|
|
|
50
53
|
if (variant === 'list') {
|
|
@@ -53,9 +56,7 @@ export function FAQPreview({ data, variant = 'accordion' }: BlockPreviewProps) {
|
|
|
53
56
|
<div className="flex flex-col gap-3">
|
|
54
57
|
{placeholderItems.map((item, i) => (
|
|
55
58
|
<div key={i} className="border-b border-border pb-3 last:border-b-0 last:pb-0">
|
|
56
|
-
<p className="text-sm font-medium text-foreground">
|
|
57
|
-
{item.question || 'Question?'}
|
|
58
|
-
</p>
|
|
59
|
+
<p className="text-sm font-medium text-foreground">{item.question || 'Question?'}</p>
|
|
59
60
|
<p className="mt-1 text-xs text-muted-foreground line-clamp-2">
|
|
60
61
|
{item.answer || 'Answer text…'}
|
|
61
62
|
</p>
|
|
@@ -63,7 +64,7 @@ export function FAQPreview({ data, variant = 'accordion' }: BlockPreviewProps) {
|
|
|
63
64
|
))}
|
|
64
65
|
</div>
|
|
65
66
|
</div>
|
|
66
|
-
)
|
|
67
|
+
)
|
|
67
68
|
}
|
|
68
69
|
|
|
69
70
|
return (
|
|
@@ -72,19 +73,15 @@ export function FAQPreview({ data, variant = 'accordion' }: BlockPreviewProps) {
|
|
|
72
73
|
{placeholderItems.map((item, i) => (
|
|
73
74
|
<div key={i} className="rounded-md border border-border p-3">
|
|
74
75
|
<div className="flex items-center justify-between">
|
|
75
|
-
<p className="text-sm font-medium text-foreground">
|
|
76
|
-
{item.question || 'Question?'}
|
|
77
|
-
</p>
|
|
76
|
+
<p className="text-sm font-medium text-foreground">{item.question || 'Question?'}</p>
|
|
78
77
|
<ChevronDown size={14} className="shrink-0 text-muted-foreground" />
|
|
79
78
|
</div>
|
|
80
79
|
{i === 0 && (
|
|
81
|
-
<p className="mt-2 text-xs text-muted-foreground">
|
|
82
|
-
{item.answer || 'Answer text…'}
|
|
83
|
-
</p>
|
|
80
|
+
<p className="mt-2 text-xs text-muted-foreground">{item.answer || 'Answer text…'}</p>
|
|
84
81
|
)}
|
|
85
82
|
</div>
|
|
86
83
|
))}
|
|
87
84
|
</div>
|
|
88
85
|
</div>
|
|
89
|
-
)
|
|
86
|
+
)
|
|
90
87
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
'use client'
|
|
1
|
+
'use client'
|
|
2
2
|
|
|
3
|
-
import { Box } from 'lucide-react'
|
|
3
|
+
import { Box } from 'lucide-react'
|
|
4
4
|
|
|
5
5
|
export interface FallbackPreviewProps {
|
|
6
|
-
blockType: string
|
|
7
|
-
data: Record<string, unknown
|
|
6
|
+
blockType: string
|
|
7
|
+
data: Record<string, unknown>
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
export function FallbackPreview({ blockType }: FallbackPreviewProps) {
|
|
@@ -14,5 +14,5 @@ export function FallbackPreview({ blockType }: FallbackPreviewProps) {
|
|
|
14
14
|
<p className="text-sm font-medium text-muted-foreground">{blockType}</p>
|
|
15
15
|
<p className="text-xs text-muted-foreground">No preview available</p>
|
|
16
16
|
</div>
|
|
17
|
-
)
|
|
17
|
+
)
|
|
18
18
|
}
|
|
@@ -1,19 +1,17 @@
|
|
|
1
|
-
'use client'
|
|
1
|
+
'use client'
|
|
2
2
|
|
|
3
|
-
import { FileText, Mail, Send } from 'lucide-react'
|
|
4
|
-
import type { BlockPreviewProps } from './index.js'
|
|
3
|
+
import { FileText, Mail, Send } from 'lucide-react'
|
|
4
|
+
import type { BlockPreviewProps } from './index.js'
|
|
5
5
|
|
|
6
6
|
export function FormPreview({ data, variant = 'contact' }: BlockPreviewProps) {
|
|
7
|
-
const formId = (data.formId as string) || ''
|
|
7
|
+
const formId = (data.formId as string) || ''
|
|
8
8
|
|
|
9
9
|
if (variant === 'newsletter') {
|
|
10
10
|
return (
|
|
11
11
|
<div className="rounded-md border border-border p-6 text-center">
|
|
12
12
|
<Mail size={24} className="mx-auto text-muted-foreground" />
|
|
13
13
|
<p className="mt-3 text-sm font-medium text-foreground">Newsletter Signup</p>
|
|
14
|
-
{formId &&
|
|
15
|
-
<p className="mt-1 text-xs text-muted-foreground">Form: {formId}</p>
|
|
16
|
-
)}
|
|
14
|
+
{formId && <p className="mt-1 text-xs text-muted-foreground">Form: {formId}</p>}
|
|
17
15
|
<div className="mx-auto mt-4 flex max-w-xs gap-2">
|
|
18
16
|
<div className="h-9 flex-1 rounded-md border border-border bg-input-background" />
|
|
19
17
|
<div className="flex h-9 items-center rounded-md bg-primary px-3">
|
|
@@ -21,7 +19,7 @@ export function FormPreview({ data, variant = 'contact' }: BlockPreviewProps) {
|
|
|
21
19
|
</div>
|
|
22
20
|
</div>
|
|
23
21
|
</div>
|
|
24
|
-
)
|
|
22
|
+
)
|
|
25
23
|
}
|
|
26
24
|
|
|
27
25
|
if (variant === 'custom') {
|
|
@@ -44,15 +42,13 @@ export function FormPreview({ data, variant = 'contact' }: BlockPreviewProps) {
|
|
|
44
42
|
</span>
|
|
45
43
|
</div>
|
|
46
44
|
</div>
|
|
47
|
-
)
|
|
45
|
+
)
|
|
48
46
|
}
|
|
49
47
|
|
|
50
48
|
return (
|
|
51
49
|
<div className="rounded-md border border-border p-5">
|
|
52
50
|
<p className="text-sm font-medium text-foreground">Contact Form</p>
|
|
53
|
-
{formId &&
|
|
54
|
-
<p className="mt-1 text-xs text-muted-foreground">Form: {formId}</p>
|
|
55
|
-
)}
|
|
51
|
+
{formId && <p className="mt-1 text-xs text-muted-foreground">Form: {formId}</p>}
|
|
56
52
|
<div className="mt-3 grid grid-cols-2 gap-2">
|
|
57
53
|
<div className="h-8 rounded-md border border-border bg-input-background" />
|
|
58
54
|
<div className="h-8 rounded-md border border-border bg-input-background" />
|
|
@@ -65,5 +61,5 @@ export function FormPreview({ data, variant = 'contact' }: BlockPreviewProps) {
|
|
|
65
61
|
</span>
|
|
66
62
|
</div>
|
|
67
63
|
</div>
|
|
68
|
-
)
|
|
64
|
+
)
|
|
69
65
|
}
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
'use client'
|
|
1
|
+
'use client'
|
|
2
2
|
|
|
3
|
-
import { Image } from 'lucide-react'
|
|
4
|
-
import type { BlockPreviewProps } from './index.js'
|
|
3
|
+
import { Image } from 'lucide-react'
|
|
4
|
+
import type { BlockPreviewProps } from './index.js'
|
|
5
5
|
|
|
6
6
|
interface GalleryImage {
|
|
7
|
-
src?: string
|
|
8
|
-
alt?: string
|
|
9
|
-
caption?: string
|
|
7
|
+
src?: string
|
|
8
|
+
alt?: string
|
|
9
|
+
caption?: string
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
export function GalleryPreview({ data, variant = 'grid' }: BlockPreviewProps) {
|
|
13
|
-
const images = (data.images as GalleryImage[]) || []
|
|
13
|
+
const images = (data.images as GalleryImage[]) || []
|
|
14
14
|
|
|
15
15
|
const placeholders: GalleryImage[] =
|
|
16
|
-
images.length > 0
|
|
17
|
-
? images
|
|
18
|
-
: Array.from({ length: 6 }, (_, i) => ({ alt: `Image ${i + 1}` }));
|
|
16
|
+
images.length > 0 ? images : Array.from({ length: 6 }, (_, i) => ({ alt: `Image ${i + 1}` }))
|
|
19
17
|
|
|
20
18
|
const Thumbnail = ({ item, className = '' }: { item: GalleryImage; className?: string }) => (
|
|
21
|
-
<div
|
|
19
|
+
<div
|
|
20
|
+
className={`flex items-center justify-center overflow-hidden rounded-md bg-muted ${className}`}
|
|
21
|
+
>
|
|
22
22
|
{item.src ? (
|
|
23
23
|
<img src={item.src} alt={item.alt || ''} className="h-full w-full object-cover" />
|
|
24
24
|
) : (
|
|
25
25
|
<Image size={20} className="text-muted-foreground" />
|
|
26
26
|
)}
|
|
27
27
|
</div>
|
|
28
|
-
)
|
|
28
|
+
)
|
|
29
29
|
|
|
30
30
|
if (variant === 'masonry') {
|
|
31
31
|
return (
|
|
@@ -35,12 +35,14 @@ export function GalleryPreview({ data, variant = 'grid' }: BlockPreviewProps) {
|
|
|
35
35
|
<Thumbnail
|
|
36
36
|
key={i}
|
|
37
37
|
item={item}
|
|
38
|
-
className={
|
|
38
|
+
className={
|
|
39
|
+
i % 3 === 0 ? 'aspect-square' : i % 3 === 1 ? 'aspect-[3/4]' : 'aspect-[4/3]'
|
|
40
|
+
}
|
|
39
41
|
/>
|
|
40
42
|
))}
|
|
41
43
|
</div>
|
|
42
44
|
</div>
|
|
43
|
-
)
|
|
45
|
+
)
|
|
44
46
|
}
|
|
45
47
|
|
|
46
48
|
if (variant === 'carousel') {
|
|
@@ -48,22 +50,16 @@ export function GalleryPreview({ data, variant = 'grid' }: BlockPreviewProps) {
|
|
|
48
50
|
<div className="overflow-hidden rounded-md border border-border p-4">
|
|
49
51
|
<div className="flex gap-3 overflow-hidden">
|
|
50
52
|
{placeholders.slice(0, 4).map((item, i) => (
|
|
51
|
-
<Thumbnail
|
|
52
|
-
key={i}
|
|
53
|
-
item={item}
|
|
54
|
-
className="aspect-square min-w-[120px] flex-1"
|
|
55
|
-
/>
|
|
53
|
+
<Thumbnail key={i} item={item} className="aspect-square min-w-[120px] flex-1" />
|
|
56
54
|
))}
|
|
57
55
|
{placeholders.length > 4 && (
|
|
58
56
|
<div className="flex min-w-[120px] flex-1 items-center justify-center rounded-md bg-muted">
|
|
59
|
-
<span className="text-sm text-muted-foreground">
|
|
60
|
-
+{placeholders.length - 4}
|
|
61
|
-
</span>
|
|
57
|
+
<span className="text-sm text-muted-foreground">+{placeholders.length - 4}</span>
|
|
62
58
|
</div>
|
|
63
59
|
)}
|
|
64
60
|
</div>
|
|
65
61
|
</div>
|
|
66
|
-
)
|
|
62
|
+
)
|
|
67
63
|
}
|
|
68
64
|
|
|
69
65
|
if (variant === 'lightbox') {
|
|
@@ -74,11 +70,9 @@ export function GalleryPreview({ data, variant = 'grid' }: BlockPreviewProps) {
|
|
|
74
70
|
<Thumbnail key={i} item={item} className="aspect-square" />
|
|
75
71
|
))}
|
|
76
72
|
</div>
|
|
77
|
-
<p className="mt-2 text-center text-xs text-muted-foreground">
|
|
78
|
-
Click to open lightbox
|
|
79
|
-
</p>
|
|
73
|
+
<p className="mt-2 text-center text-xs text-muted-foreground">Click to open lightbox</p>
|
|
80
74
|
</div>
|
|
81
|
-
)
|
|
75
|
+
)
|
|
82
76
|
}
|
|
83
77
|
|
|
84
78
|
return (
|
|
@@ -89,5 +83,5 @@ export function GalleryPreview({ data, variant = 'grid' }: BlockPreviewProps) {
|
|
|
89
83
|
))}
|
|
90
84
|
</div>
|
|
91
85
|
</div>
|
|
92
|
-
)
|
|
86
|
+
)
|
|
93
87
|
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
'use client'
|
|
1
|
+
'use client'
|
|
2
2
|
|
|
3
|
-
import { Image, Play } from 'lucide-react'
|
|
4
|
-
import type { BlockPreviewProps } from './index.js'
|
|
3
|
+
import { Image, Play } from 'lucide-react'
|
|
4
|
+
import type { BlockPreviewProps } from './index.js'
|
|
5
5
|
|
|
6
6
|
export function HeroPreview({ data, variant = 'centered' }: BlockPreviewProps) {
|
|
7
|
-
const title = (data.title as string) || ''
|
|
8
|
-
const subtitle = (data.subtitle as string) || ''
|
|
9
|
-
const image = data.image as string | undefined
|
|
10
|
-
const ctaText = (data.ctaText as string) || ''
|
|
11
|
-
const overlayOpacity = (data.overlayOpacity as number) ?? 0.4
|
|
7
|
+
const title = (data.title as string) || ''
|
|
8
|
+
const subtitle = (data.subtitle as string) || ''
|
|
9
|
+
const image = data.image as string | undefined
|
|
10
|
+
const ctaText = (data.ctaText as string) || ''
|
|
11
|
+
const overlayOpacity = (data.overlayOpacity as number) ?? 0.4
|
|
12
12
|
|
|
13
13
|
if (variant === 'split-image') {
|
|
14
14
|
return (
|
|
@@ -18,9 +18,7 @@ export function HeroPreview({ data, variant = 'centered' }: BlockPreviewProps) {
|
|
|
18
18
|
{title || <span className="text-muted-foreground">Hero Title</span>}
|
|
19
19
|
</h2>
|
|
20
20
|
{(subtitle || !title) && (
|
|
21
|
-
<p className="text-sm text-muted-foreground">
|
|
22
|
-
{subtitle || 'Subtitle text goes here'}
|
|
23
|
-
</p>
|
|
21
|
+
<p className="text-sm text-muted-foreground">{subtitle || 'Subtitle text goes here'}</p>
|
|
24
22
|
)}
|
|
25
23
|
{ctaText && (
|
|
26
24
|
<div className="mt-2">
|
|
@@ -38,7 +36,7 @@ export function HeroPreview({ data, variant = 'centered' }: BlockPreviewProps) {
|
|
|
38
36
|
)}
|
|
39
37
|
</div>
|
|
40
38
|
</div>
|
|
41
|
-
)
|
|
39
|
+
)
|
|
42
40
|
}
|
|
43
41
|
|
|
44
42
|
if (variant === 'minimal') {
|
|
@@ -48,9 +46,7 @@ export function HeroPreview({ data, variant = 'centered' }: BlockPreviewProps) {
|
|
|
48
46
|
{title || <span className="text-muted-foreground">Hero Title</span>}
|
|
49
47
|
</h2>
|
|
50
48
|
{(subtitle || !title) && (
|
|
51
|
-
<p className="text-sm text-muted-foreground">
|
|
52
|
-
{subtitle || 'Subtitle text goes here'}
|
|
53
|
-
</p>
|
|
49
|
+
<p className="text-sm text-muted-foreground">{subtitle || 'Subtitle text goes here'}</p>
|
|
54
50
|
)}
|
|
55
51
|
{ctaText && (
|
|
56
52
|
<span className="mt-2 inline-block rounded-md bg-primary px-4 py-2 text-sm text-primary-foreground">
|
|
@@ -58,26 +54,19 @@ export function HeroPreview({ data, variant = 'centered' }: BlockPreviewProps) {
|
|
|
58
54
|
</span>
|
|
59
55
|
)}
|
|
60
56
|
</div>
|
|
61
|
-
)
|
|
57
|
+
)
|
|
62
58
|
}
|
|
63
59
|
|
|
64
|
-
const isVideo = variant === 'video-bg'
|
|
60
|
+
const isVideo = variant === 'video-bg'
|
|
65
61
|
|
|
66
62
|
return (
|
|
67
63
|
<div className="relative flex min-h-[220px] flex-col items-center justify-center gap-3 overflow-hidden rounded-md border border-border p-8">
|
|
68
64
|
{image ? (
|
|
69
|
-
<img
|
|
70
|
-
src={image}
|
|
71
|
-
alt=""
|
|
72
|
-
className="absolute inset-0 h-full w-full object-cover"
|
|
73
|
-
/>
|
|
65
|
+
<img src={image} alt="" className="absolute inset-0 h-full w-full object-cover" />
|
|
74
66
|
) : (
|
|
75
67
|
<div className="absolute inset-0 bg-muted" />
|
|
76
68
|
)}
|
|
77
|
-
<div
|
|
78
|
-
className="absolute inset-0 bg-background"
|
|
79
|
-
style={{ opacity: overlayOpacity }}
|
|
80
|
-
/>
|
|
69
|
+
<div className="absolute inset-0 bg-background" style={{ opacity: overlayOpacity }} />
|
|
81
70
|
<div className="relative z-10 flex flex-col items-center gap-3 text-center">
|
|
82
71
|
{isVideo && (
|
|
83
72
|
<div className="mb-2 flex h-12 w-12 items-center justify-center rounded-full bg-primary/90">
|
|
@@ -88,9 +77,7 @@ export function HeroPreview({ data, variant = 'centered' }: BlockPreviewProps) {
|
|
|
88
77
|
{title || <span className="text-muted-foreground">Hero Title</span>}
|
|
89
78
|
</h2>
|
|
90
79
|
{(subtitle || !title) && (
|
|
91
|
-
<p className="text-sm text-muted-foreground">
|
|
92
|
-
{subtitle || 'Subtitle text goes here'}
|
|
93
|
-
</p>
|
|
80
|
+
<p className="text-sm text-muted-foreground">{subtitle || 'Subtitle text goes here'}</p>
|
|
94
81
|
)}
|
|
95
82
|
{ctaText && (
|
|
96
83
|
<span className="mt-2 inline-block rounded-md bg-primary px-4 py-2 text-sm text-primary-foreground">
|
|
@@ -99,5 +86,5 @@ export function HeroPreview({ data, variant = 'centered' }: BlockPreviewProps) {
|
|
|
99
86
|
)}
|
|
100
87
|
</div>
|
|
101
88
|
</div>
|
|
102
|
-
)
|
|
89
|
+
)
|
|
103
90
|
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
'use client'
|
|
1
|
+
'use client'
|
|
2
2
|
|
|
3
|
-
import { Image } from 'lucide-react'
|
|
4
|
-
import type { BlockPreviewProps } from './index.js'
|
|
3
|
+
import { Image } from 'lucide-react'
|
|
4
|
+
import type { BlockPreviewProps } from './index.js'
|
|
5
5
|
|
|
6
6
|
export function ImagePreview({ data, variant = 'full-width' }: BlockPreviewProps) {
|
|
7
|
-
const src = data.src as string | undefined
|
|
8
|
-
const alt = (data.alt as string) || ''
|
|
9
|
-
const caption = (data.caption as string) || ''
|
|
10
|
-
const aspectRatio = (data.aspectRatio as string) || '16/9'
|
|
7
|
+
const src = data.src as string | undefined
|
|
8
|
+
const alt = (data.alt as string) || ''
|
|
9
|
+
const caption = (data.caption as string) || ''
|
|
10
|
+
const aspectRatio = (data.aspectRatio as string) || '16/9'
|
|
11
11
|
|
|
12
|
-
const roundedClass = variant === 'rounded' ? 'rounded-xl' : 'rounded-md'
|
|
12
|
+
const roundedClass = variant === 'rounded' ? 'rounded-xl' : 'rounded-md'
|
|
13
13
|
|
|
14
14
|
const ImagePlaceholder = ({ className = '' }: { className?: string }) => (
|
|
15
15
|
<div
|
|
@@ -18,7 +18,7 @@ export function ImagePreview({ data, variant = 'full-width' }: BlockPreviewProps
|
|
|
18
18
|
>
|
|
19
19
|
<Image size={32} className="text-muted-foreground" />
|
|
20
20
|
</div>
|
|
21
|
-
)
|
|
21
|
+
)
|
|
22
22
|
|
|
23
23
|
const ImageElement = ({ className = '' }: { className?: string }) =>
|
|
24
24
|
src ? (
|
|
@@ -30,7 +30,7 @@ export function ImagePreview({ data, variant = 'full-width' }: BlockPreviewProps
|
|
|
30
30
|
/>
|
|
31
31
|
) : (
|
|
32
32
|
<ImagePlaceholder className={className} />
|
|
33
|
-
)
|
|
33
|
+
)
|
|
34
34
|
|
|
35
35
|
if (variant === 'side-by-side') {
|
|
36
36
|
return (
|
|
@@ -38,7 +38,7 @@ export function ImagePreview({ data, variant = 'full-width' }: BlockPreviewProps
|
|
|
38
38
|
<ImageElement />
|
|
39
39
|
<ImagePlaceholder />
|
|
40
40
|
</div>
|
|
41
|
-
)
|
|
41
|
+
)
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
return (
|
|
@@ -50,5 +50,5 @@ export function ImagePreview({ data, variant = 'full-width' }: BlockPreviewProps
|
|
|
50
50
|
</figcaption>
|
|
51
51
|
)}
|
|
52
52
|
</figure>
|
|
53
|
-
)
|
|
53
|
+
)
|
|
54
54
|
}
|
|
@@ -1,27 +1,29 @@
|
|
|
1
|
-
'use client'
|
|
1
|
+
'use client'
|
|
2
2
|
|
|
3
|
-
import type { BlockPreviewProps } from './index.js'
|
|
3
|
+
import type { BlockPreviewProps } from './index.js'
|
|
4
4
|
|
|
5
5
|
export function TextPreview({ data, variant = 'prose' }: BlockPreviewProps) {
|
|
6
|
-
const body = (data.body as string) || ''
|
|
7
|
-
const heading = (data.heading as string) || ''
|
|
8
|
-
const headingLevel = (data.headingLevel as string) || 'h2'
|
|
6
|
+
const body = (data.body as string) || ''
|
|
7
|
+
const heading = (data.heading as string) || ''
|
|
8
|
+
const headingLevel = (data.headingLevel as string) || 'h2'
|
|
9
9
|
|
|
10
|
-
const truncatedBody = body.length > 300 ? body.slice(0, 300) + '…' : body
|
|
10
|
+
const truncatedBody = body.length > 300 ? body.slice(0, 300) + '…' : body
|
|
11
11
|
|
|
12
|
-
const validLevels = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] as const
|
|
13
|
-
const HeadingTag = (validLevels.includes(headingLevel as any) ? headingLevel : 'h2') as
|
|
12
|
+
const validLevels = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] as const
|
|
13
|
+
const HeadingTag = (validLevels.includes(headingLevel as any) ? headingLevel : 'h2') as
|
|
14
|
+
| 'h1'
|
|
15
|
+
| 'h2'
|
|
16
|
+
| 'h3'
|
|
17
|
+
| 'h4'
|
|
18
|
+
| 'h5'
|
|
19
|
+
| 'h6'
|
|
14
20
|
const headingSizeClass =
|
|
15
|
-
HeadingTag === 'h1'
|
|
16
|
-
? 'text-2xl'
|
|
17
|
-
: HeadingTag === 'h2'
|
|
18
|
-
? 'text-xl'
|
|
19
|
-
: 'text-lg';
|
|
21
|
+
HeadingTag === 'h1' ? 'text-2xl' : HeadingTag === 'h2' ? 'text-xl' : 'text-lg'
|
|
20
22
|
|
|
21
23
|
if (variant === 'two-column') {
|
|
22
|
-
const midpoint = Math.ceil(truncatedBody.length / 2)
|
|
23
|
-
const col1 = truncatedBody.slice(0, midpoint)
|
|
24
|
-
const col2 = truncatedBody.slice(midpoint)
|
|
24
|
+
const midpoint = Math.ceil(truncatedBody.length / 2)
|
|
25
|
+
const col1 = truncatedBody.slice(0, midpoint)
|
|
26
|
+
const col2 = truncatedBody.slice(midpoint)
|
|
25
27
|
|
|
26
28
|
return (
|
|
27
29
|
<div className="rounded-md border border-border p-5">
|
|
@@ -39,7 +41,7 @@ export function TextPreview({ data, variant = 'prose' }: BlockPreviewProps) {
|
|
|
39
41
|
</p>
|
|
40
42
|
</div>
|
|
41
43
|
</div>
|
|
42
|
-
)
|
|
44
|
+
)
|
|
43
45
|
}
|
|
44
46
|
|
|
45
47
|
if (variant === 'with-sidebar') {
|
|
@@ -61,7 +63,7 @@ export function TextPreview({ data, variant = 'prose' }: BlockPreviewProps) {
|
|
|
61
63
|
<div className="mt-1 h-2 w-2/3 rounded bg-border" />
|
|
62
64
|
</aside>
|
|
63
65
|
</div>
|
|
64
|
-
)
|
|
66
|
+
)
|
|
65
67
|
}
|
|
66
68
|
|
|
67
69
|
return (
|
|
@@ -72,10 +74,8 @@ export function TextPreview({ data, variant = 'prose' }: BlockPreviewProps) {
|
|
|
72
74
|
</HeadingTag>
|
|
73
75
|
)}
|
|
74
76
|
<p className="text-sm leading-relaxed text-muted-foreground">
|
|
75
|
-
{truncatedBody ||
|
|
76
|
-
<span className="italic">Body text content goes here…</span>
|
|
77
|
-
)}
|
|
77
|
+
{truncatedBody || <span className="italic">Body text content goes here…</span>}
|
|
78
78
|
</p>
|
|
79
79
|
</div>
|
|
80
|
-
)
|
|
80
|
+
)
|
|
81
81
|
}
|
|
@@ -1,17 +1,16 @@
|
|
|
1
|
-
'use client'
|
|
1
|
+
'use client'
|
|
2
2
|
|
|
3
|
-
import { Play } from 'lucide-react'
|
|
4
|
-
import type { BlockPreviewProps } from './index.js'
|
|
3
|
+
import { Play } from 'lucide-react'
|
|
4
|
+
import type { BlockPreviewProps } from './index.js'
|
|
5
5
|
|
|
6
6
|
export function VideoPreview({ data, variant = 'inline' }: BlockPreviewProps) {
|
|
7
|
-
const poster = data.poster as string | undefined
|
|
8
|
-
const autoplay = data.autoplay as boolean | undefined
|
|
9
|
-
const loop = data.loop as boolean | undefined
|
|
7
|
+
const poster = data.poster as string | undefined
|
|
8
|
+
const autoplay = data.autoplay as boolean | undefined
|
|
9
|
+
const loop = data.loop as boolean | undefined
|
|
10
10
|
|
|
11
|
-
const badges: string[] = [
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
].filter((b): b is string => b !== '');
|
|
11
|
+
const badges: string[] = [autoplay ? 'Autoplay' : '', loop ? 'Loop' : ''].filter(
|
|
12
|
+
(b): b is string => b !== '',
|
|
13
|
+
)
|
|
15
14
|
|
|
16
15
|
const content = (
|
|
17
16
|
<div className="relative flex aspect-video items-center justify-center overflow-hidden rounded-md bg-muted">
|
|
@@ -36,7 +35,7 @@ export function VideoPreview({ data, variant = 'inline' }: BlockPreviewProps) {
|
|
|
36
35
|
</div>
|
|
37
36
|
)}
|
|
38
37
|
</div>
|
|
39
|
-
)
|
|
38
|
+
)
|
|
40
39
|
|
|
41
40
|
if (variant === 'background') {
|
|
42
41
|
return (
|
|
@@ -54,7 +53,7 @@ export function VideoPreview({ data, variant = 'inline' }: BlockPreviewProps) {
|
|
|
54
53
|
</div>
|
|
55
54
|
</div>
|
|
56
55
|
</div>
|
|
57
|
-
)
|
|
56
|
+
)
|
|
58
57
|
}
|
|
59
58
|
|
|
60
59
|
if (variant === 'lightbox') {
|
|
@@ -67,12 +66,8 @@ export function VideoPreview({ data, variant = 'inline' }: BlockPreviewProps) {
|
|
|
67
66
|
</p>
|
|
68
67
|
</div>
|
|
69
68
|
</div>
|
|
70
|
-
)
|
|
69
|
+
)
|
|
71
70
|
}
|
|
72
71
|
|
|
73
|
-
return
|
|
74
|
-
<div className="rounded-md border border-border p-4">
|
|
75
|
-
{content}
|
|
76
|
-
</div>
|
|
77
|
-
);
|
|
72
|
+
return <div className="rounded-md border border-border p-4">{content}</div>
|
|
78
73
|
}
|