@prenta/admin 0.98.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/AdminRoot.d.ts.map +1 -1
- package/dist/AdminRoot.js +22 -84
- package/dist/AdminRoot.js.map +1 -1
- package/dist/__tests__/components/breakpoint-controls.render.test.js +4 -4
- package/dist/__tests__/components/breakpoint-controls.render.test.js.map +1 -1
- package/dist/__tests__/components/seo-score-bands.test.js +0 -3
- package/dist/__tests__/components/seo-score-bands.test.js.map +1 -1
- package/dist/__tests__/layout/sidebar-posts.test.js +6 -11
- package/dist/__tests__/layout/sidebar-posts.test.js.map +1 -1
- package/dist/__tests__/layout/sidebar-submenu.render.test.js +3 -2
- package/dist/__tests__/layout/sidebar-submenu.render.test.js.map +1 -1
- package/dist/__tests__/lib/open-public-site-tab.test.d.ts +2 -0
- package/dist/__tests__/lib/open-public-site-tab.test.d.ts.map +1 -0
- package/dist/__tests__/lib/open-public-site-tab.test.js +64 -0
- package/dist/__tests__/lib/open-public-site-tab.test.js.map +1 -0
- package/dist/__tests__/lib/page-editor-service-api.test.js +26 -23
- package/dist/__tests__/lib/page-editor-service-api.test.js.map +1 -1
- package/dist/__tests__/lib/view-site-chrome.test.d.ts +2 -0
- package/dist/__tests__/lib/view-site-chrome.test.d.ts.map +1 -0
- package/dist/__tests__/lib/view-site-chrome.test.js +59 -0
- package/dist/__tests__/lib/view-site-chrome.test.js.map +1 -0
- package/dist/__tests__/router/admin-routes.test.js +4 -0
- package/dist/__tests__/router/admin-routes.test.js.map +1 -1
- package/dist/__tests__/views/canvas-surface-shared.test.js +0 -16
- package/dist/__tests__/views/canvas-surface-shared.test.js.map +1 -1
- package/dist/__tests__/views/editor-top-bar.render.test.js +44 -22
- package/dist/__tests__/views/editor-top-bar.render.test.js.map +1 -1
- package/dist/__tests__/views/page-section-editor.test.js +30 -10
- package/dist/__tests__/views/page-section-editor.test.js.map +1 -1
- package/dist/__tests__/views/page-tab.render.test.js +0 -1
- package/dist/__tests__/views/page-tab.render.test.js.map +1 -1
- package/dist/__tests__/views/post-section-editor.test.js +23 -0
- package/dist/__tests__/views/post-section-editor.test.js.map +1 -1
- package/dist/components/BreakpointPicker.d.ts +3 -2
- package/dist/components/BreakpointPicker.d.ts.map +1 -1
- package/dist/components/BreakpointPicker.js +5 -3
- package/dist/components/BreakpointPicker.js.map +1 -1
- package/dist/components/CanvasEditTip.js +1 -1
- package/dist/components/CanvasEditTip.js.map +1 -1
- package/dist/index.d.ts +1 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -3
- package/dist/index.js.map +1 -1
- package/dist/layout/Sidebar.d.ts +3 -4
- package/dist/layout/Sidebar.d.ts.map +1 -1
- package/dist/layout/Sidebar.js +7 -38
- package/dist/layout/Sidebar.js.map +1 -1
- package/dist/lib/editor-preview.d.ts +4 -1
- package/dist/lib/editor-preview.d.ts.map +1 -1
- package/dist/lib/editor-preview.js +4 -1
- package/dist/lib/editor-preview.js.map +1 -1
- package/dist/lib/open-public-site-tab.d.ts +14 -0
- package/dist/lib/open-public-site-tab.d.ts.map +1 -0
- package/dist/lib/open-public-site-tab.js +46 -0
- package/dist/lib/open-public-site-tab.js.map +1 -0
- package/dist/lib/page-editor-service.d.ts +0 -7
- package/dist/lib/page-editor-service.d.ts.map +1 -1
- package/dist/lib/page-editor-service.js +9 -9
- package/dist/lib/page-editor-service.js.map +1 -1
- package/dist/lib/view-site-chrome.d.ts +16 -0
- package/dist/lib/view-site-chrome.d.ts.map +1 -0
- package/dist/lib/view-site-chrome.js +15 -0
- package/dist/lib/view-site-chrome.js.map +1 -0
- package/dist/prenta-admin.css +1 -1
- package/dist/router/admin-routes.d.ts.map +1 -1
- package/dist/router/admin-routes.js +0 -2
- package/dist/router/admin-routes.js.map +1 -1
- package/dist/views/PageEditor.d.ts +2 -2
- package/dist/views/PageEditor.js +2 -2
- package/dist/views/page-editor/EditorCanvas.d.ts +1 -2
- package/dist/views/page-editor/EditorCanvas.d.ts.map +1 -1
- package/dist/views/page-editor/EditorCanvas.js +2 -2
- package/dist/views/page-editor/EditorCanvas.js.map +1 -1
- package/dist/views/page-editor/EditorTopBar.d.ts +13 -17
- package/dist/views/page-editor/EditorTopBar.d.ts.map +1 -1
- package/dist/views/page-editor/EditorTopBar.js +19 -21
- package/dist/views/page-editor/EditorTopBar.js.map +1 -1
- package/dist/views/page-editor/PageSectionEditor.d.ts +1 -7
- package/dist/views/page-editor/PageSectionEditor.d.ts.map +1 -1
- package/dist/views/page-editor/PageSectionEditor.js +38 -110
- package/dist/views/page-editor/PageSectionEditor.js.map +1 -1
- package/dist/views/page-editor/StructureNotice.d.ts +2 -5
- package/dist/views/page-editor/StructureNotice.d.ts.map +1 -1
- package/dist/views/page-editor/StructureNotice.js +6 -10
- package/dist/views/page-editor/StructureNotice.js.map +1 -1
- package/dist/views/post-editor/PostEditorCanvas.d.ts +1 -3
- package/dist/views/post-editor/PostEditorCanvas.d.ts.map +1 -1
- package/dist/views/post-editor/PostEditorCanvas.js +3 -3
- package/dist/views/post-editor/PostEditorCanvas.js.map +1 -1
- package/dist/views/post-editor/PostSectionEditor.d.ts +1 -15
- package/dist/views/post-editor/PostSectionEditor.d.ts.map +1 -1
- package/dist/views/post-editor/PostSectionEditor.js +30 -88
- package/dist/views/post-editor/PostSectionEditor.js.map +1 -1
- package/package.json +3 -3
- package/src/AdminRoot.tsx +18 -138
- package/src/__tests__/components/breakpoint-controls.render.test.tsx +6 -4
- package/src/__tests__/components/seo-score-bands.test.ts +0 -3
- package/src/__tests__/layout/sidebar-posts.test.ts +6 -11
- package/src/__tests__/layout/sidebar-submenu.render.test.tsx +3 -2
- package/src/__tests__/lib/open-public-site-tab.test.ts +74 -0
- package/src/__tests__/lib/page-editor-service-api.test.ts +27 -25
- package/src/__tests__/lib/view-site-chrome.test.ts +65 -0
- package/src/__tests__/router/admin-routes.test.ts +5 -0
- package/src/__tests__/views/canvas-surface-shared.test.ts +0 -19
- package/src/__tests__/views/editor-top-bar.render.test.tsx +85 -22
- package/src/__tests__/views/page-section-editor.test.tsx +42 -10
- package/src/__tests__/views/page-tab.render.test.tsx +0 -1
- package/src/__tests__/views/post-section-editor.test.tsx +35 -0
- package/src/components/BreakpointPicker.tsx +6 -3
- package/src/components/CanvasEditTip.tsx +2 -2
- package/src/index.ts +1 -11
- package/src/layout/Sidebar.tsx +6 -41
- package/src/lib/editor-preview.ts +4 -1
- package/src/lib/open-public-site-tab.ts +57 -0
- package/src/lib/page-editor-service.ts +9 -16
- package/src/lib/view-site-chrome.ts +34 -0
- package/src/router/admin-routes.ts +0 -2
- package/src/styles/theme.css +4 -4
- package/src/views/PageEditor.tsx +2 -2
- package/src/views/page-editor/EditorCanvas.tsx +1 -6
- package/src/views/page-editor/EditorTopBar.tsx +81 -82
- package/src/views/page-editor/PageSectionEditor.tsx +85 -194
- package/src/views/page-editor/StructureNotice.tsx +7 -42
- package/src/views/post-editor/PostEditorCanvas.tsx +2 -8
- package/src/views/post-editor/PostSectionEditor.tsx +66 -138
- package/dist/__tests__/views/page-builder-block-renderer.render.test.d.ts +0 -2
- package/dist/__tests__/views/page-builder-block-renderer.render.test.d.ts.map +0 -1
- package/dist/__tests__/views/page-builder-block-renderer.render.test.js +0 -48
- package/dist/__tests__/views/page-builder-block-renderer.render.test.js.map +0 -1
- package/dist/__tests__/views/page-builder-form-picker.render.test.d.ts +0 -2
- package/dist/__tests__/views/page-builder-form-picker.render.test.d.ts.map +0 -1
- package/dist/__tests__/views/page-builder-form-picker.render.test.js +0 -44
- package/dist/__tests__/views/page-builder-form-picker.render.test.js.map +0 -1
- package/dist/__tests__/views/page-builder-sections-panel.render.test.d.ts +0 -2
- package/dist/__tests__/views/page-builder-sections-panel.render.test.d.ts.map +0 -1
- package/dist/__tests__/views/page-builder-sections-panel.render.test.js +0 -121
- package/dist/__tests__/views/page-builder-sections-panel.render.test.js.map +0 -1
- package/dist/__tests__/views/page-builder-seo-panel.render.test.d.ts +0 -2
- package/dist/__tests__/views/page-builder-seo-panel.render.test.d.ts.map +0 -1
- package/dist/__tests__/views/page-builder-seo-panel.render.test.js +0 -65
- package/dist/__tests__/views/page-builder-seo-panel.render.test.js.map +0 -1
- package/dist/__tests__/views/page-builder-template-seed.render.test.d.ts +0 -2
- package/dist/__tests__/views/page-builder-template-seed.render.test.d.ts.map +0 -1
- package/dist/__tests__/views/page-builder-template-seed.render.test.js +0 -48
- package/dist/__tests__/views/page-builder-template-seed.render.test.js.map +0 -1
- package/dist/__tests__/views/page-templates.render.test.d.ts +0 -2
- package/dist/__tests__/views/page-templates.render.test.d.ts.map +0 -1
- package/dist/__tests__/views/page-templates.render.test.js +0 -126
- package/dist/__tests__/views/page-templates.render.test.js.map +0 -1
- package/dist/__tests__/views/use-site-preview.render.test.d.ts +0 -2
- package/dist/__tests__/views/use-site-preview.render.test.d.ts.map +0 -1
- package/dist/__tests__/views/use-site-preview.render.test.js +0 -120
- package/dist/__tests__/views/use-site-preview.render.test.js.map +0 -1
- package/dist/hooks/useBuilderState.d.ts +0 -49
- package/dist/hooks/useBuilderState.d.ts.map +0 -1
- package/dist/hooks/useBuilderState.js +0 -238
- package/dist/hooks/useBuilderState.js.map +0 -1
- package/dist/views/page-builder/AIBlockAssist.d.ts +0 -9
- package/dist/views/page-builder/AIBlockAssist.d.ts.map +0 -1
- package/dist/views/page-builder/AIBlockAssist.js +0 -40
- package/dist/views/page-builder/AIBlockAssist.js.map +0 -1
- package/dist/views/page-builder/AIGenerateDialog.d.ts +0 -8
- package/dist/views/page-builder/AIGenerateDialog.d.ts.map +0 -1
- package/dist/views/page-builder/AIGenerateDialog.js +0 -173
- package/dist/views/page-builder/AIGenerateDialog.js.map +0 -1
- package/dist/views/page-builder/BlockEditor.d.ts +0 -11
- package/dist/views/page-builder/BlockEditor.d.ts.map +0 -1
- package/dist/views/page-builder/BlockEditor.js +0 -159
- package/dist/views/page-builder/BlockEditor.js.map +0 -1
- package/dist/views/page-builder/BlockPicker.d.ts +0 -7
- package/dist/views/page-builder/BlockPicker.d.ts.map +0 -1
- package/dist/views/page-builder/BlockPicker.js +0 -103
- package/dist/views/page-builder/BlockPicker.js.map +0 -1
- package/dist/views/page-builder/BottomBar.d.ts +0 -9
- package/dist/views/page-builder/BottomBar.d.ts.map +0 -1
- package/dist/views/page-builder/BottomBar.js +0 -13
- package/dist/views/page-builder/BottomBar.js.map +0 -1
- package/dist/views/page-builder/BuilderSectionsPanel.d.ts +0 -20
- package/dist/views/page-builder/BuilderSectionsPanel.d.ts.map +0 -1
- package/dist/views/page-builder/BuilderSectionsPanel.js +0 -105
- package/dist/views/page-builder/BuilderSectionsPanel.js.map +0 -1
- package/dist/views/page-builder/BuilderToolbar.d.ts +0 -21
- package/dist/views/page-builder/BuilderToolbar.d.ts.map +0 -1
- package/dist/views/page-builder/BuilderToolbar.js +0 -18
- package/dist/views/page-builder/BuilderToolbar.js.map +0 -1
- package/dist/views/page-builder/ContextPanel.d.ts +0 -20
- package/dist/views/page-builder/ContextPanel.d.ts.map +0 -1
- package/dist/views/page-builder/ContextPanel.js +0 -43
- package/dist/views/page-builder/ContextPanel.js.map +0 -1
- package/dist/views/page-builder/DesignScore.d.ts +0 -6
- package/dist/views/page-builder/DesignScore.d.ts.map +0 -1
- package/dist/views/page-builder/DesignScore.js +0 -93
- package/dist/views/page-builder/DesignScore.js.map +0 -1
- package/dist/views/page-builder/NodeSettings.d.ts +0 -12
- package/dist/views/page-builder/NodeSettings.d.ts.map +0 -1
- package/dist/views/page-builder/NodeSettings.js +0 -80
- package/dist/views/page-builder/NodeSettings.js.map +0 -1
- package/dist/views/page-builder/PageBuilder.d.ts +0 -10
- package/dist/views/page-builder/PageBuilder.d.ts.map +0 -1
- package/dist/views/page-builder/PageBuilder.js +0 -222
- package/dist/views/page-builder/PageBuilder.js.map +0 -1
- package/dist/views/page-builder/PageSettings.d.ts +0 -7
- package/dist/views/page-builder/PageSettings.d.ts.map +0 -1
- package/dist/views/page-builder/PageSettings.js +0 -27
- package/dist/views/page-builder/PageSettings.js.map +0 -1
- package/dist/views/page-builder/PageTemplates.d.ts +0 -5
- package/dist/views/page-builder/PageTemplates.d.ts.map +0 -1
- package/dist/views/page-builder/PageTemplates.js +0 -146
- package/dist/views/page-builder/PageTemplates.js.map +0 -1
- package/dist/views/page-builder/RelationshipField.d.ts +0 -15
- package/dist/views/page-builder/RelationshipField.d.ts.map +0 -1
- package/dist/views/page-builder/RelationshipField.js +0 -65
- package/dist/views/page-builder/RelationshipField.js.map +0 -1
- package/dist/views/page-builder/SEOPanel.d.ts +0 -9
- package/dist/views/page-builder/SEOPanel.d.ts.map +0 -1
- package/dist/views/page-builder/SEOPanel.js +0 -38
- package/dist/views/page-builder/SEOPanel.js.map +0 -1
- package/dist/views/page-builder/SavedSections.d.ts +0 -6
- package/dist/views/page-builder/SavedSections.d.ts.map +0 -1
- package/dist/views/page-builder/SavedSections.js +0 -141
- package/dist/views/page-builder/SavedSections.js.map +0 -1
- package/dist/views/page-builder/TemplatePicker.d.ts +0 -7
- package/dist/views/page-builder/TemplatePicker.d.ts.map +0 -1
- package/dist/views/page-builder/TemplatePicker.js +0 -68
- package/dist/views/page-builder/TemplatePicker.js.map +0 -1
- package/dist/views/page-builder/Widgets.d.ts +0 -13
- package/dist/views/page-builder/Widgets.d.ts.map +0 -1
- package/dist/views/page-builder/Widgets.js +0 -15
- package/dist/views/page-builder/Widgets.js.map +0 -1
- package/dist/views/page-builder/block-renderers/CTAPreview.d.ts +0 -3
- package/dist/views/page-builder/block-renderers/CTAPreview.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/CTAPreview.js +0 -19
- package/dist/views/page-builder/block-renderers/CTAPreview.js.map +0 -1
- package/dist/views/page-builder/block-renderers/CardsPreview.d.ts +0 -3
- package/dist/views/page-builder/block-renderers/CardsPreview.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/CardsPreview.js +0 -22
- package/dist/views/page-builder/block-renderers/CardsPreview.js.map +0 -1
- package/dist/views/page-builder/block-renderers/CodePreview.d.ts +0 -3
- package/dist/views/page-builder/block-renderers/CodePreview.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/CodePreview.js +0 -12
- package/dist/views/page-builder/block-renderers/CodePreview.js.map +0 -1
- package/dist/views/page-builder/block-renderers/FAQPreview.d.ts +0 -3
- package/dist/views/page-builder/block-renderers/FAQPreview.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/FAQPreview.js +0 -27
- package/dist/views/page-builder/block-renderers/FAQPreview.js.map +0 -1
- package/dist/views/page-builder/block-renderers/FallbackPreview.d.ts +0 -6
- package/dist/views/page-builder/block-renderers/FallbackPreview.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/FallbackPreview.js +0 -7
- package/dist/views/page-builder/block-renderers/FallbackPreview.js.map +0 -1
- package/dist/views/page-builder/block-renderers/FormPreview.d.ts +0 -9
- package/dist/views/page-builder/block-renderers/FormPreview.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/FormPreview.js +0 -52
- package/dist/views/page-builder/block-renderers/FormPreview.js.map +0 -1
- package/dist/views/page-builder/block-renderers/GalleryPreview.d.ts +0 -3
- package/dist/views/page-builder/block-renderers/GalleryPreview.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/GalleryPreview.js +0 -19
- package/dist/views/page-builder/block-renderers/GalleryPreview.js.map +0 -1
- package/dist/views/page-builder/block-renderers/HeroPreview.d.ts +0 -3
- package/dist/views/page-builder/block-renderers/HeroPreview.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/HeroPreview.js +0 -19
- package/dist/views/page-builder/block-renderers/HeroPreview.js.map +0 -1
- package/dist/views/page-builder/block-renderers/ImagePreview.d.ts +0 -3
- package/dist/views/page-builder/block-renderers/ImagePreview.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/ImagePreview.js +0 -17
- package/dist/views/page-builder/block-renderers/ImagePreview.js.map +0 -1
- package/dist/views/page-builder/block-renderers/TextPreview.d.ts +0 -3
- package/dist/views/page-builder/block-renderers/TextPreview.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/TextPreview.js +0 -22
- package/dist/views/page-builder/block-renderers/TextPreview.js.map +0 -1
- package/dist/views/page-builder/block-renderers/VideoPreview.d.ts +0 -3
- package/dist/views/page-builder/block-renderers/VideoPreview.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/VideoPreview.js +0 -18
- package/dist/views/page-builder/block-renderers/VideoPreview.js.map +0 -1
- package/dist/views/page-builder/block-renderers/index.d.ts +0 -9
- package/dist/views/page-builder/block-renderers/index.d.ts.map +0 -1
- package/dist/views/page-builder/block-renderers/index.js +0 -25
- package/dist/views/page-builder/block-renderers/index.js.map +0 -1
- package/dist/views/page-builder/canvas/BlockRenderer.d.ts +0 -8
- package/dist/views/page-builder/canvas/BlockRenderer.d.ts.map +0 -1
- package/dist/views/page-builder/canvas/BlockRenderer.js +0 -20
- package/dist/views/page-builder/canvas/BlockRenderer.js.map +0 -1
- package/dist/views/page-builder/canvas/BuilderCanvas.d.ts +0 -10
- package/dist/views/page-builder/canvas/BuilderCanvas.d.ts.map +0 -1
- package/dist/views/page-builder/canvas/BuilderCanvas.js +0 -26
- package/dist/views/page-builder/canvas/BuilderCanvas.js.map +0 -1
- package/dist/views/page-builder/canvas/ColumnRenderer.d.ts +0 -8
- package/dist/views/page-builder/canvas/ColumnRenderer.d.ts.map +0 -1
- package/dist/views/page-builder/canvas/ColumnRenderer.js +0 -32
- package/dist/views/page-builder/canvas/ColumnRenderer.js.map +0 -1
- package/dist/views/page-builder/canvas/ContainerRenderer.d.ts +0 -8
- package/dist/views/page-builder/canvas/ContainerRenderer.d.ts.map +0 -1
- package/dist/views/page-builder/canvas/ContainerRenderer.js +0 -29
- package/dist/views/page-builder/canvas/ContainerRenderer.js.map +0 -1
- package/dist/views/page-builder/canvas/RowRenderer.d.ts +0 -8
- package/dist/views/page-builder/canvas/RowRenderer.d.ts.map +0 -1
- package/dist/views/page-builder/canvas/RowRenderer.js +0 -28
- package/dist/views/page-builder/canvas/RowRenderer.js.map +0 -1
- package/dist/views/page-builder/canvas/SectionRenderer.d.ts +0 -8
- package/dist/views/page-builder/canvas/SectionRenderer.d.ts.map +0 -1
- package/dist/views/page-builder/canvas/SectionRenderer.js +0 -50
- package/dist/views/page-builder/canvas/SectionRenderer.js.map +0 -1
- package/dist/views/page-builder/canvas/index.d.ts +0 -3
- package/dist/views/page-builder/canvas/index.d.ts.map +0 -1
- package/dist/views/page-builder/canvas/index.js +0 -2
- package/dist/views/page-builder/canvas/index.js.map +0 -1
- package/dist/views/page-editor/PagePreview.d.ts +0 -13
- package/dist/views/page-editor/PagePreview.d.ts.map +0 -1
- package/dist/views/page-editor/PagePreview.js +0 -46
- package/dist/views/page-editor/PagePreview.js.map +0 -1
- package/dist/views/page-editor/SitePreviewFrame.d.ts +0 -43
- package/dist/views/page-editor/SitePreviewFrame.d.ts.map +0 -1
- package/dist/views/page-editor/SitePreviewFrame.js +0 -165
- package/dist/views/page-editor/SitePreviewFrame.js.map +0 -1
- package/dist/views/page-editor/useSitePreview.d.ts +0 -47
- package/dist/views/page-editor/useSitePreview.d.ts.map +0 -1
- package/dist/views/page-editor/useSitePreview.js +0 -96
- package/dist/views/page-editor/useSitePreview.js.map +0 -1
- package/dist/views/post-editor/PostPreview.d.ts +0 -14
- package/dist/views/post-editor/PostPreview.d.ts.map +0 -1
- package/dist/views/post-editor/PostPreview.js +0 -63
- package/dist/views/post-editor/PostPreview.js.map +0 -1
- package/src/__tests__/views/page-builder-block-renderer.render.test.tsx +0 -66
- package/src/__tests__/views/page-builder-form-picker.render.test.tsx +0 -54
- package/src/__tests__/views/page-builder-sections-panel.render.test.tsx +0 -138
- package/src/__tests__/views/page-builder-seo-panel.render.test.tsx +0 -77
- package/src/__tests__/views/page-builder-template-seed.render.test.tsx +0 -59
- package/src/__tests__/views/page-templates.render.test.tsx +0 -182
- package/src/__tests__/views/use-site-preview.render.test.tsx +0 -164
- package/src/hooks/useBuilderState.ts +0 -361
- package/src/views/page-builder/AIBlockAssist.tsx +0 -64
- package/src/views/page-builder/AIGenerateDialog.tsx +0 -593
- package/src/views/page-builder/BlockEditor.tsx +0 -523
- package/src/views/page-builder/BlockPicker.tsx +0 -324
- package/src/views/page-builder/BottomBar.tsx +0 -65
- package/src/views/page-builder/BuilderSectionsPanel.tsx +0 -304
- package/src/views/page-builder/BuilderToolbar.tsx +0 -221
- package/src/views/page-builder/ContextPanel.tsx +0 -144
- package/src/views/page-builder/DesignScore.tsx +0 -251
- package/src/views/page-builder/NodeSettings.tsx +0 -500
- package/src/views/page-builder/PageBuilder.tsx +0 -405
- package/src/views/page-builder/PageSettings.tsx +0 -162
- package/src/views/page-builder/PageTemplates.tsx +0 -435
- package/src/views/page-builder/RelationshipField.tsx +0 -113
- package/src/views/page-builder/SEOPanel.tsx +0 -222
- package/src/views/page-builder/SavedSections.tsx +0 -480
- package/src/views/page-builder/TemplatePicker.tsx +0 -197
- package/src/views/page-builder/Widgets.tsx +0 -44
- package/src/views/page-builder/block-renderers/CTAPreview.tsx +0 -79
- package/src/views/page-builder/block-renderers/CardsPreview.tsx +0 -69
- package/src/views/page-builder/block-renderers/CodePreview.tsx +0 -46
- package/src/views/page-builder/block-renderers/FAQPreview.tsx +0 -87
- package/src/views/page-builder/block-renderers/FallbackPreview.tsx +0 -18
- package/src/views/page-builder/block-renderers/FormPreview.tsx +0 -117
- package/src/views/page-builder/block-renderers/GalleryPreview.tsx +0 -87
- package/src/views/page-builder/block-renderers/HeroPreview.tsx +0 -90
- package/src/views/page-builder/block-renderers/ImagePreview.tsx +0 -54
- package/src/views/page-builder/block-renderers/TextPreview.tsx +0 -81
- package/src/views/page-builder/block-renderers/VideoPreview.tsx +0 -73
- package/src/views/page-builder/block-renderers/index.ts +0 -34
- package/src/views/page-builder/canvas/BlockRenderer.tsx +0 -56
- package/src/views/page-builder/canvas/BuilderCanvas.tsx +0 -87
- package/src/views/page-builder/canvas/ColumnRenderer.tsx +0 -82
- package/src/views/page-builder/canvas/ContainerRenderer.tsx +0 -67
- package/src/views/page-builder/canvas/RowRenderer.tsx +0 -68
- package/src/views/page-builder/canvas/SectionRenderer.tsx +0 -93
- package/src/views/page-builder/canvas/index.ts +0 -2
- package/src/views/page-editor/PagePreview.tsx +0 -105
- package/src/views/page-editor/SitePreviewFrame.tsx +0 -250
- package/src/views/page-editor/useSitePreview.ts +0 -158
- package/src/views/post-editor/PostPreview.tsx +0 -125
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
-
import { useState, useCallback } from 'react';
|
|
4
|
-
import { ArrowUp, ArrowDown, Copy, Trash2, Plus, AlignLeft, AlignCenter, AlignRight, ArrowUpFromLine, ArrowDownToLine, Minus, } from 'lucide-react';
|
|
5
|
-
import { Toggle } from '../../components/ui/Toggle.js';
|
|
6
|
-
const INPUT_CLASS = 'w-full px-3 py-2 text-sm bg-background border border-input rounded-md focus:outline-none focus:ring-2 focus:ring-ring';
|
|
7
|
-
const LABEL_CLASS = 'text-sm font-medium text-foreground mb-1 block';
|
|
8
|
-
const SECTION_HEADING_CLASS = 'text-xs font-medium uppercase tracking-wider text-muted-foreground mb-2';
|
|
9
|
-
const COLUMN_PRESETS = [
|
|
10
|
-
{ label: '12', widths: [12] },
|
|
11
|
-
{ label: '6 | 6', widths: [6, 6] },
|
|
12
|
-
{ label: '4 | 4 | 4', widths: [4, 4, 4] },
|
|
13
|
-
{ label: '3 | 3 | 3 | 3', widths: [3, 3, 3, 3] },
|
|
14
|
-
{ label: '8 | 4', widths: [8, 4] },
|
|
15
|
-
{ label: '4 | 8', widths: [4, 8] },
|
|
16
|
-
{ label: '3 | 6 | 3', widths: [3, 6, 3] },
|
|
17
|
-
];
|
|
18
|
-
export function NodeSettings({ node, onUpdateSettings, onRemoveNode, onDuplicateNode, onMoveNodeUp, onMoveNodeDown, onAddRow, }) {
|
|
19
|
-
const [confirmDelete, setConfirmDelete] = useState(false);
|
|
20
|
-
const updateSetting = useCallback((key, value) => {
|
|
21
|
-
onUpdateSettings(node.id, { [key]: value });
|
|
22
|
-
}, [node.id, onUpdateSettings]);
|
|
23
|
-
const handleDelete = useCallback(() => {
|
|
24
|
-
if (confirmDelete) {
|
|
25
|
-
onRemoveNode(node.id);
|
|
26
|
-
setConfirmDelete(false);
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
setConfirmDelete(true);
|
|
30
|
-
}
|
|
31
|
-
}, [confirmDelete, node.id, onRemoveNode]);
|
|
32
|
-
const nodeLabel = node.type === 'section'
|
|
33
|
-
? 'Section'
|
|
34
|
-
: node.type === 'container'
|
|
35
|
-
? 'Container'
|
|
36
|
-
: node.type === 'row'
|
|
37
|
-
? 'Row'
|
|
38
|
-
: 'Column';
|
|
39
|
-
return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsx("div", { className: "border-border border-b p-4", children: _jsxs("p", { className: "text-foreground text-sm font-medium", children: [nodeLabel, " Settings"] }) }), _jsx("div", { className: "flex-1 overflow-y-auto", children: _jsxs("div", { className: "space-y-4 p-4", children: [node.type === 'section' && (_jsx(SectionFields, { node: node, updateSetting: updateSetting, onAddRow: onAddRow })), node.type === 'container' && (_jsx(ContainerFields, { node: node, updateSetting: updateSetting })), node.type === 'row' && _jsx(RowFields, { node: node, updateSetting: updateSetting }), node.type === 'column' && _jsx(ColumnFields, { node: node, updateSetting: updateSetting })] }) }), _jsxs("div", { className: "border-border space-y-2 border-t p-4", children: [_jsx("p", { className: SECTION_HEADING_CLASS, children: "Actions" }), _jsxs("div", { className: "flex gap-2", children: [_jsxs("button", { type: "button", onClick: () => onMoveNodeUp(node.id), "aria-label": "Move up", className: "bg-background border-input hover:bg-accent flex flex-1 items-center justify-center gap-1.5 rounded-md border px-3 py-2 text-sm transition-colors", children: [_jsx(ArrowUp, { size: 14 }), "Up"] }), _jsxs("button", { type: "button", onClick: () => onMoveNodeDown(node.id), "aria-label": "Move down", className: "bg-background border-input hover:bg-accent flex flex-1 items-center justify-center gap-1.5 rounded-md border px-3 py-2 text-sm transition-colors", children: [_jsx(ArrowDown, { size: 14 }), "Down"] })] }), _jsxs("button", { type: "button", onClick: () => onDuplicateNode(node.id), className: "bg-background border-input hover:bg-accent flex w-full items-center justify-center gap-2 rounded-md border px-3 py-2 text-sm font-medium transition-colors", children: [_jsx(Copy, { size: 14 }), "Duplicate"] }), _jsxs("button", { type: "button", onClick: handleDelete, onBlur: () => setConfirmDelete(false), className: `flex w-full items-center justify-center gap-2 rounded-md px-3 py-2 text-sm font-medium transition-colors ${confirmDelete
|
|
40
|
-
? 'bg-destructive text-destructive-foreground'
|
|
41
|
-
: 'bg-background border-destructive text-destructive hover:bg-destructive/10 border'}`, children: [_jsx(Trash2, { size: 14 }), confirmDelete ? 'Click again to confirm' : 'Delete'] })] })] }));
|
|
42
|
-
}
|
|
43
|
-
function SectionFields({ node, updateSetting, onAddRow, }) {
|
|
44
|
-
const s = node.settings;
|
|
45
|
-
return (_jsxs(_Fragment, { children: [_jsx("p", { className: SECTION_HEADING_CLASS, children: "Background" }), _jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "Background Color" }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("input", { type: "color", value: s.background ?? '#ffffff', onChange: (e) => updateSetting('background', e.target.value), className: "border-input h-9 w-9 cursor-pointer rounded-md border" }), _jsx("input", { type: "text", value: s.background ?? '', onChange: (e) => updateSetting('background', e.target.value), placeholder: "transparent", className: `${INPUT_CLASS} flex-1` })] })] }), _jsx("p", { className: SECTION_HEADING_CLASS, children: "Spacing" }), _jsxs("div", { className: "grid grid-cols-2 gap-3", children: [_jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "Padding Top" }), _jsx("input", { type: "text", value: s.paddingTop ?? '', onChange: (e) => updateSetting('paddingTop', e.target.value), placeholder: "0px", className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "Padding Bottom" }), _jsx("input", { type: "text", value: s.paddingBottom ?? '', onChange: (e) => updateSetting('paddingBottom', e.target.value), placeholder: "0px", className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "Margin Top" }), _jsx("input", { type: "text", value: s.marginTop ?? '', onChange: (e) => updateSetting('marginTop', e.target.value), placeholder: "0px", className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "Margin Bottom" }), _jsx("input", { type: "text", value: s.marginBottom ?? '', onChange: (e) => updateSetting('marginBottom', e.target.value), placeholder: "0px", className: INPUT_CLASS })] })] }), _jsx("p", { className: SECTION_HEADING_CLASS, children: "Attributes" }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("label", { className: "text-foreground text-sm font-medium", children: "Visibility" }), _jsx(Toggle, { checked: s.visibility !== 'hidden', onCheckedChange: (checked) => updateSetting('visibility', checked ? 'visible' : 'hidden'), "aria-label": "Section visibility" })] }), _jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "HTML ID" }), _jsx("input", { type: "text", value: s.htmlId ?? '', onChange: (e) => updateSetting('htmlId', e.target.value), placeholder: "section-id", className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "HTML Class" }), _jsx("input", { type: "text", value: s.htmlClass ?? '', onChange: (e) => updateSetting('htmlClass', e.target.value), placeholder: "my-class", className: INPUT_CLASS })] }), onAddRow && (_jsxs("button", { type: "button", onClick: () => onAddRow(node.id), className: "bg-primary text-primary-foreground hover:bg-primary/90 flex w-full items-center justify-center gap-2 rounded-md px-3 py-2 text-sm font-medium transition-colors", children: [_jsx(Plus, { size: 14 }), "Add Row"] }))] }));
|
|
46
|
-
}
|
|
47
|
-
function ContainerFields({ node, updateSetting, }) {
|
|
48
|
-
const s = node.settings;
|
|
49
|
-
return (_jsxs(_Fragment, { children: [_jsx("p", { className: SECTION_HEADING_CLASS, children: "Layout" }), _jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "Max Width" }), _jsx("input", { type: "text", value: s.maxWidth ?? '', onChange: (e) => updateSetting('maxWidth', e.target.value), placeholder: "1200px", className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "Alignment" }), _jsx("div", { className: "flex gap-1", children: ['left', 'center', 'right'].map((align) => {
|
|
50
|
-
const Icon = align === 'left' ? AlignLeft : align === 'center' ? AlignCenter : AlignRight;
|
|
51
|
-
return (_jsx("button", { type: "button", onClick: () => updateSetting('alignment', align), "aria-label": `Align ${align}`, className: `flex flex-1 items-center justify-center rounded-md border py-2 transition-colors ${s.alignment === align
|
|
52
|
-
? 'bg-primary text-primary-foreground border-primary'
|
|
53
|
-
: 'bg-background border-input hover:bg-accent'}`, children: _jsx(Icon, { size: 14 }) }, align));
|
|
54
|
-
}) })] }), _jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "Padding" }), _jsx("input", { type: "text", value: s.padding ?? '', onChange: (e) => updateSetting('padding', e.target.value), placeholder: "0px", className: INPUT_CLASS })] })] }));
|
|
55
|
-
}
|
|
56
|
-
function RowFields({ node, updateSetting, }) {
|
|
57
|
-
const s = node.settings;
|
|
58
|
-
return (_jsxs(_Fragment, { children: [_jsx("p", { className: SECTION_HEADING_CLASS, children: "Layout" }), _jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "Gap" }), _jsx("input", { type: "text", value: s.gap ?? '', onChange: (e) => updateSetting('gap', e.target.value), placeholder: "16px", className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "Vertical Align" }), _jsx("div", { className: "flex gap-1", children: ['top', 'center', 'bottom', 'stretch'].map((align) => {
|
|
59
|
-
const Icon = align === 'top'
|
|
60
|
-
? ArrowUpFromLine
|
|
61
|
-
: align === 'bottom'
|
|
62
|
-
? ArrowDownToLine
|
|
63
|
-
: align === 'center'
|
|
64
|
-
? Minus
|
|
65
|
-
: AlignCenter;
|
|
66
|
-
return (_jsx("button", { type: "button", onClick: () => updateSetting('verticalAlign', align), "aria-label": `Align ${align}`, className: `flex flex-1 items-center justify-center rounded-md border py-2 text-xs transition-colors ${s.verticalAlign === align
|
|
67
|
-
? 'bg-primary text-primary-foreground border-primary'
|
|
68
|
-
: 'bg-background border-input hover:bg-accent'}`, children: _jsx(Icon, { size: 14 }) }, align));
|
|
69
|
-
}) })] }), _jsx("p", { className: SECTION_HEADING_CLASS, children: "Mobile" }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("label", { className: "text-foreground text-sm font-medium", children: "Reverse on Mobile" }), _jsx(Toggle, { checked: !!s.reverseOnMobile, onCheckedChange: (checked) => updateSetting('reverseOnMobile', checked), "aria-label": "Reverse column order on mobile" })] }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("label", { className: "text-foreground text-sm font-medium", children: "Wrap on Mobile" }), _jsx(Toggle, { checked: !!s.wrapOnMobile, onCheckedChange: (checked) => updateSetting('wrapOnMobile', checked), "aria-label": "Wrap columns on mobile" })] }), _jsx("p", { className: SECTION_HEADING_CLASS, children: "Column Presets" }), _jsx("div", { className: "grid grid-cols-2 gap-1.5", children: COLUMN_PRESETS.map((preset) => (_jsxs("button", { type: "button", onClick: () => updateSetting('__columnPreset', preset.widths), className: "border-input bg-background hover:bg-accent rounded-md border px-2 py-2 transition-colors", children: [_jsx("div", { className: "flex h-4 gap-0.5", children: preset.widths.map((w, i) => (_jsx("div", { className: "bg-muted-foreground/30 rounded-sm", style: { flex: w } }, i))) }), _jsx("p", { className: "text-muted-foreground mt-1 text-center text-xs", children: preset.widths.join(' | ') })] }, preset.label))) })] }));
|
|
70
|
-
}
|
|
71
|
-
function ColumnFields({ node, updateSetting, }) {
|
|
72
|
-
const s = node.settings;
|
|
73
|
-
return (_jsxs(_Fragment, { children: [_jsx("p", { className: SECTION_HEADING_CLASS, children: "Size" }), _jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "Width (1-12)" }), _jsx("input", { type: "number", min: 1, max: 12, value: s.width, onChange: (e) => updateSetting('width', Number(e.target.value)), className: INPUT_CLASS })] }), _jsx("p", { className: SECTION_HEADING_CLASS, children: "Layout" }), _jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "Vertical Align" }), _jsx("div", { className: "flex gap-1", children: ['top', 'center', 'bottom'].map((align) => {
|
|
74
|
-
const Icon = align === 'top' ? ArrowUpFromLine : align === 'bottom' ? ArrowDownToLine : Minus;
|
|
75
|
-
return (_jsx("button", { type: "button", onClick: () => updateSetting('verticalAlign', align), "aria-label": `Align ${align}`, className: `flex flex-1 items-center justify-center rounded-md border py-2 transition-colors ${s.verticalAlign === align
|
|
76
|
-
? 'bg-primary text-primary-foreground border-primary'
|
|
77
|
-
: 'bg-background border-input hover:bg-accent'}`, children: _jsx(Icon, { size: 14 }) }, align));
|
|
78
|
-
}) })] }), _jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "Padding" }), _jsx("input", { type: "text", value: s.padding ?? '', onChange: (e) => updateSetting('padding', e.target.value), placeholder: "0px", className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "Background Color" }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("input", { type: "color", value: s.background ?? '#ffffff', onChange: (e) => updateSetting('background', e.target.value), className: "border-input h-9 w-9 cursor-pointer rounded-md border" }), _jsx("input", { type: "text", value: s.background ?? '', onChange: (e) => updateSetting('background', e.target.value), placeholder: "transparent", className: `${INPUT_CLASS} flex-1` })] })] })] }));
|
|
79
|
-
}
|
|
80
|
-
//# sourceMappingURL=NodeSettings.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NodeSettings.js","sourceRoot":"","sources":["../../../src/views/page-builder/NodeSettings.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export interface PageBuilderProps {
|
|
2
|
-
documentId?: string;
|
|
3
|
-
/** Seed a NEW page from a saved template (`/page-builder/new?template=<id>`). */
|
|
4
|
-
templateId?: string;
|
|
5
|
-
collectionSlug: string;
|
|
6
|
-
config: any;
|
|
7
|
-
onNavigate: (path: string) => void;
|
|
8
|
-
}
|
|
9
|
-
export declare function PageBuilder({ documentId, templateId, collectionSlug, config, onNavigate, }: PageBuilderProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
-
//# sourceMappingURL=PageBuilder.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PageBuilder.d.ts","sourceRoot":"","sources":["../../../src/views/page-builder/PageBuilder.tsx"],"names":[],"mappings":"AAsBA,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,GAAG,CAAA;IACX,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC;AA+BD,wBAAgB,WAAW,CAAC,EAC1B,UAAU,EACV,UAAU,EACV,cAAc,EACd,MAAM,EACN,UAAU,GACX,EAAE,gBAAgB,2CAkVlB"}
|
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
4
|
-
import { Loader2, AlertTriangle } from 'lucide-react';
|
|
5
|
-
import { toast } from 'sonner';
|
|
6
|
-
import { cmsApi } from '../../lib/api.js';
|
|
7
|
-
import { useNavigationBlocker } from '../../router/index.js';
|
|
8
|
-
import { ErrorBoundary } from '../../components/ErrorBoundary.js';
|
|
9
|
-
import { useBuilderState, } from '../../hooks/useBuilderState.js';
|
|
10
|
-
import { BuilderToolbar } from './BuilderToolbar.js';
|
|
11
|
-
import { BottomBar } from './BottomBar.js';
|
|
12
|
-
import { BuilderCanvas } from './canvas/index.js';
|
|
13
|
-
import { BuilderSectionsPanel } from './BuilderSectionsPanel.js';
|
|
14
|
-
import { ContextPanel } from './ContextPanel.js';
|
|
15
|
-
import { AIGenerateDialog } from './AIGenerateDialog.js';
|
|
16
|
-
const DEVICE_WIDTHS = {
|
|
17
|
-
desktop: '100%',
|
|
18
|
-
tablet: '768px',
|
|
19
|
-
mobile: '375px',
|
|
20
|
-
};
|
|
21
|
-
const SECTIONS_PANEL_KEY = 'prenta-builder-sections-panel';
|
|
22
|
-
/**
|
|
23
|
-
* Left sections panel default: open on wide viewports (≥1280px), collapsed
|
|
24
|
-
* below so the canvas keeps room. An explicit user choice, persisted in
|
|
25
|
-
* localStorage, always wins over the breakpoint default.
|
|
26
|
-
*/
|
|
27
|
-
function initialSectionsCollapsed() {
|
|
28
|
-
try {
|
|
29
|
-
const stored = localStorage.getItem(SECTIONS_PANEL_KEY);
|
|
30
|
-
if (stored === 'open')
|
|
31
|
-
return false;
|
|
32
|
-
if (stored === 'collapsed')
|
|
33
|
-
return true;
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
/* localStorage unavailable — fall through to the breakpoint default */
|
|
37
|
-
}
|
|
38
|
-
if (typeof window !== 'undefined') {
|
|
39
|
-
return window.innerWidth < 1280;
|
|
40
|
-
}
|
|
41
|
-
return false;
|
|
42
|
-
}
|
|
43
|
-
export function PageBuilder({ documentId, templateId, collectionSlug, config, onNavigate, }) {
|
|
44
|
-
const [loading, setLoading] = useState(!!documentId);
|
|
45
|
-
const [loadError, setLoadError] = useState(null);
|
|
46
|
-
const [saving, setSaving] = useState(false);
|
|
47
|
-
const [status, setStatus] = useState('DRAFT');
|
|
48
|
-
const [aiDialogOpen, setAiDialogOpen] = useState(false);
|
|
49
|
-
const [sectionsCollapsed, setSectionsCollapsed] = useState(initialSectionsCollapsed);
|
|
50
|
-
const canvasRef = useRef(null);
|
|
51
|
-
const builder = useBuilderState();
|
|
52
|
-
const { tree, pageSettings, deviceMode, dirty, canUndo, canRedo, selectedNodeId, selectedNode, activeTab, showGridOverlay, selectNode, setDeviceMode, setActiveTab, setPageSettings, setShowGridOverlay, addSection, addRowToSection, addBlockToColumn, addNodeAtId, removeNodeById, moveNodeById, updateSettings, updateBlock, duplicateNode, moveNodeUp, moveNodeDown, undo, redo, markClean, replaceTree, } = builder;
|
|
53
|
-
useEffect(() => {
|
|
54
|
-
if (!documentId) {
|
|
55
|
-
// A new page can be seeded from a saved template ("Use template" on
|
|
56
|
-
// the Templates grid). Load the template tree, then hand the canvas
|
|
57
|
-
// over as a dirty, unsaved draft.
|
|
58
|
-
if (templateId) {
|
|
59
|
-
let cancelledNew = false;
|
|
60
|
-
setLoading(true);
|
|
61
|
-
cmsApi(`/page-templates/${templateId}`).then((res) => {
|
|
62
|
-
if (cancelledNew)
|
|
63
|
-
return;
|
|
64
|
-
if (res.error) {
|
|
65
|
-
toast.error(`Couldn't load template: ${res.error}`);
|
|
66
|
-
}
|
|
67
|
-
else if (res.data?.tree) {
|
|
68
|
-
replaceTree(res.data.tree);
|
|
69
|
-
}
|
|
70
|
-
setLoading(false);
|
|
71
|
-
});
|
|
72
|
-
return () => {
|
|
73
|
-
cancelledNew = true;
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
setLoading(false);
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
let cancelled = false;
|
|
80
|
-
async function loadDocument() {
|
|
81
|
-
const res = await cmsApi(`/collections/${collectionSlug}/${documentId}`);
|
|
82
|
-
if (cancelled)
|
|
83
|
-
return;
|
|
84
|
-
if (res.error) {
|
|
85
|
-
setLoadError(res.error);
|
|
86
|
-
setLoading(false);
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
const doc = res.data;
|
|
90
|
-
if (doc?.layout) {
|
|
91
|
-
replaceTree(doc.layout);
|
|
92
|
-
markClean();
|
|
93
|
-
}
|
|
94
|
-
if (doc?.pageSettings) {
|
|
95
|
-
setPageSettings(doc.pageSettings);
|
|
96
|
-
}
|
|
97
|
-
if (doc?.status) {
|
|
98
|
-
setStatus(doc.status);
|
|
99
|
-
}
|
|
100
|
-
if (doc?.title) {
|
|
101
|
-
setPageSettings({ title: doc.title });
|
|
102
|
-
}
|
|
103
|
-
setLoading(false);
|
|
104
|
-
}
|
|
105
|
-
loadDocument();
|
|
106
|
-
return () => {
|
|
107
|
-
cancelled = true;
|
|
108
|
-
};
|
|
109
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps -- replaceTree/setPageSettings are stable builder actions
|
|
110
|
-
}, [documentId, templateId, collectionSlug]);
|
|
111
|
-
// Warn before discarding unsaved builder changes on navigation / unload.
|
|
112
|
-
useNavigationBlocker(dirty);
|
|
113
|
-
const handleSave = useCallback(async () => {
|
|
114
|
-
setSaving(true);
|
|
115
|
-
const body = JSON.stringify({
|
|
116
|
-
layout: tree,
|
|
117
|
-
pageSettings,
|
|
118
|
-
title: pageSettings.title,
|
|
119
|
-
slug: pageSettings.slug,
|
|
120
|
-
});
|
|
121
|
-
const endpoint = documentId
|
|
122
|
-
? `/collections/${collectionSlug}/${documentId}`
|
|
123
|
-
: `/collections/${collectionSlug}`;
|
|
124
|
-
const method = documentId ? 'PUT' : 'POST';
|
|
125
|
-
const res = await cmsApi(endpoint, { method, body });
|
|
126
|
-
setSaving(false);
|
|
127
|
-
if (res.error) {
|
|
128
|
-
toast.error(res.error);
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
markClean();
|
|
132
|
-
toast.success('Page saved');
|
|
133
|
-
if (!documentId && res.data?.id) {
|
|
134
|
-
onNavigate(`/pages/${res.data.id}/builder`);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}, [tree, pageSettings, documentId, collectionSlug, markClean, onNavigate]);
|
|
138
|
-
const handlePublish = useCallback(async () => {
|
|
139
|
-
setSaving(true);
|
|
140
|
-
const body = JSON.stringify({
|
|
141
|
-
layout: tree,
|
|
142
|
-
pageSettings,
|
|
143
|
-
title: pageSettings.title,
|
|
144
|
-
slug: pageSettings.slug,
|
|
145
|
-
status: 'PUBLISHED',
|
|
146
|
-
});
|
|
147
|
-
const endpoint = documentId
|
|
148
|
-
? `/collections/${collectionSlug}/${documentId}`
|
|
149
|
-
: `/collections/${collectionSlug}`;
|
|
150
|
-
const method = documentId ? 'PUT' : 'POST';
|
|
151
|
-
const res = await cmsApi(endpoint, { method, body });
|
|
152
|
-
setSaving(false);
|
|
153
|
-
if (res.error) {
|
|
154
|
-
toast.error(res.error);
|
|
155
|
-
}
|
|
156
|
-
else {
|
|
157
|
-
markClean();
|
|
158
|
-
setStatus('PUBLISHED');
|
|
159
|
-
toast.success('Page published');
|
|
160
|
-
if (!documentId && res.data?.id) {
|
|
161
|
-
onNavigate(`/pages/${res.data.id}/builder`);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}, [tree, pageSettings, documentId, collectionSlug, markClean, onNavigate]);
|
|
165
|
-
const handleAIAccept = useCallback((generatedTree) => {
|
|
166
|
-
replaceTree(generatedTree);
|
|
167
|
-
}, [replaceTree]);
|
|
168
|
-
const toggleSectionsPanel = useCallback(() => {
|
|
169
|
-
setSectionsCollapsed((prev) => {
|
|
170
|
-
const next = !prev;
|
|
171
|
-
try {
|
|
172
|
-
localStorage.setItem(SECTIONS_PANEL_KEY, next ? 'collapsed' : 'open');
|
|
173
|
-
}
|
|
174
|
-
catch {
|
|
175
|
-
/* localStorage unavailable — the choice just won't persist */
|
|
176
|
-
}
|
|
177
|
-
return next;
|
|
178
|
-
});
|
|
179
|
-
}, []);
|
|
180
|
-
// Selecting from the left panel highlights the section on the canvas (the
|
|
181
|
-
// canvas already outlines the selected node) and opens its settings in the
|
|
182
|
-
// right-hand context panel, then scrolls the section into view.
|
|
183
|
-
const handlePanelSelect = useCallback((id) => {
|
|
184
|
-
selectNode(id);
|
|
185
|
-
canvasRef.current
|
|
186
|
-
?.querySelector(`[data-node-id="${CSS.escape(id)}"]`)
|
|
187
|
-
?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
|
188
|
-
}, [selectNode]);
|
|
189
|
-
const handlePanelReorder = useCallback((id, toIndex) => {
|
|
190
|
-
moveNodeById(id, tree.id, toIndex);
|
|
191
|
-
}, [moveNodeById, tree.id]);
|
|
192
|
-
if (loading) {
|
|
193
|
-
return (_jsx("div", { className: "bg-background flex h-full items-center justify-center", children: _jsx(Loader2, { className: "text-muted-foreground animate-spin", size: 24 }) }));
|
|
194
|
-
}
|
|
195
|
-
if (loadError) {
|
|
196
|
-
return (_jsx("div", { className: "bg-background flex h-full items-center justify-center", children: _jsxs("div", { className: "border-destructive/30 bg-destructive/5 flex max-w-md items-center gap-3 rounded-lg border p-4", children: [_jsx(AlertTriangle, { className: "text-destructive shrink-0", size: 20 }), _jsxs("div", { children: [_jsx("p", { className: "text-foreground text-sm font-medium", children: "Failed to load page" }), _jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: loadError })] })] }) }));
|
|
197
|
-
}
|
|
198
|
-
const canvasWidth = DEVICE_WIDTHS[deviceMode];
|
|
199
|
-
const isConstrained = deviceMode !== 'desktop';
|
|
200
|
-
// `pageBuilder.previewTheme` lets consumers preview blocks with their
|
|
201
|
-
// brand fonts/colors/radii without baking them into the admin's tokens.
|
|
202
|
-
// We scope the CSS variables to the canvas wrapper so they never leak
|
|
203
|
-
// into the rest of the admin chrome.
|
|
204
|
-
const previewTheme = config?.pageBuilder?.previewTheme ?? {};
|
|
205
|
-
const previewStyle = {};
|
|
206
|
-
if (previewTheme.fontFamily)
|
|
207
|
-
previewStyle['--preview-font-family'] = previewTheme.fontFamily;
|
|
208
|
-
if (previewTheme.headingFontFamily)
|
|
209
|
-
previewStyle['--preview-heading-font-family'] = previewTheme.headingFontFamily;
|
|
210
|
-
if (previewTheme.primaryColor)
|
|
211
|
-
previewStyle['--preview-primary'] = previewTheme.primaryColor;
|
|
212
|
-
if (previewTheme.secondaryColor)
|
|
213
|
-
previewStyle['--preview-secondary'] = previewTheme.secondaryColor;
|
|
214
|
-
if (previewTheme.borderRadius)
|
|
215
|
-
previewStyle['--preview-radius'] = previewTheme.borderRadius;
|
|
216
|
-
const canvasShellStyle = {
|
|
217
|
-
...previewStyle,
|
|
218
|
-
fontFamily: previewTheme.fontFamily ?? undefined,
|
|
219
|
-
};
|
|
220
|
-
return (_jsxs(ErrorBoundary, { children: [_jsxs("div", { className: "bg-background flex h-full flex-col overflow-hidden", children: [_jsx(BuilderToolbar, { collectionSlug: collectionSlug, pageSettings: pageSettings, status: status, dirty: dirty, saving: saving, canUndo: canUndo, canRedo: canRedo, deviceMode: deviceMode, onNavigate: onNavigate, onTitleChange: (title) => setPageSettings({ title }), onUndo: undo, onRedo: redo, onDeviceMode: setDeviceMode, onSave: handleSave, onPublish: handlePublish, onOpenAI: () => setAiDialogOpen(true) }), _jsxs("div", { className: "flex flex-1 overflow-hidden", children: [_jsx(BuilderSectionsPanel, { tree: tree, selectedNodeId: selectedNodeId, collapsed: sectionsCollapsed, onToggleCollapsed: toggleSectionsPanel, onSelect: handlePanelSelect, onReorder: handlePanelReorder, onAddSection: addSection }), _jsx("div", { ref: canvasRef, className: "bg-muted flex-1 overflow-auto", children: _jsx("div", { className: "mx-auto h-full max-w-full transition-all duration-200", style: { width: canvasWidth }, children: _jsx("div", { className: `bg-background page-builder-canvas-shell h-full ${isConstrained ? 'border-border border-x shadow-lg' : ''}`, style: canvasShellStyle, children: _jsx(BuilderCanvas, { tree: tree, selectedNodeId: selectedNodeId, showGridOverlay: showGridOverlay, deviceMode: deviceMode, onSelectNode: selectNode }) }) }) }), _jsx("div", { className: "border-border bg-card w-[35%] max-w-[420px] min-w-[280px] overflow-y-auto border-l", children: _jsx(ContextPanel, { activeTab: activeTab, onTabChange: setActiveTab, selectedNode: selectedNode, tree: tree, pageSettings: pageSettings, onUpdateSettings: updateSettings, onUpdateBlock: updateBlock, onRemoveNode: removeNodeById, onDuplicateNode: duplicateNode, onMoveNodeUp: moveNodeUp, onMoveNodeDown: moveNodeDown, onPageSettingsChange: setPageSettings, onAddRow: addRowToSection, config: config }) })] }), _jsx(BottomBar, { deviceMode: deviceMode, showGridOverlay: showGridOverlay, onAddSection: addSection, onToggleGrid: setShowGridOverlay })] }), _jsx(AIGenerateDialog, { open: aiDialogOpen, onClose: () => setAiDialogOpen(false), onAccept: handleAIAccept })] }));
|
|
221
|
-
}
|
|
222
|
-
//# sourceMappingURL=PageBuilder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PageBuilder.js","sourceRoot":"","sources":["../../../src/views/page-builder/PageBuilder.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { PageSettings } from '../../hooks/useBuilderState.js';
|
|
2
|
-
export interface PageSettingsProps {
|
|
3
|
-
settings: PageSettings;
|
|
4
|
-
onChange: (settings: Partial<PageSettings>) => void;
|
|
5
|
-
}
|
|
6
|
-
export declare function PageSettingsEditor({ settings, onChange }: PageSettingsProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
-
//# sourceMappingURL=PageSettings.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PageSettings.d.ts","sourceRoot":"","sources":["../../../src/views/page-builder/PageSettings.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAElE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,YAAY,CAAA;IACtB,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,CAAA;CACpD;AAqBD,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,iBAAiB,2CAoI3E"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useCallback } from 'react';
|
|
4
|
-
const INPUT_CLASS = 'w-full px-3 py-2 text-sm bg-background border border-input rounded-md focus:outline-none focus:ring-2 focus:ring-ring';
|
|
5
|
-
const LABEL_CLASS = 'text-sm font-medium text-foreground mb-1 block';
|
|
6
|
-
const SECTION_HEADING_CLASS = 'text-xs font-medium uppercase tracking-wider text-muted-foreground mb-2';
|
|
7
|
-
const SCHEMA_TYPES = [
|
|
8
|
-
'Article',
|
|
9
|
-
'LocalBusiness',
|
|
10
|
-
'WebPage',
|
|
11
|
-
'Product',
|
|
12
|
-
'FAQPage',
|
|
13
|
-
'Organization',
|
|
14
|
-
'Event',
|
|
15
|
-
'Recipe',
|
|
16
|
-
'HowTo',
|
|
17
|
-
'BreadcrumbList',
|
|
18
|
-
];
|
|
19
|
-
export function PageSettingsEditor({ settings, onChange }) {
|
|
20
|
-
const update = useCallback((key, value) => {
|
|
21
|
-
onChange({ [key]: value });
|
|
22
|
-
}, [onChange]);
|
|
23
|
-
const metaTitleLength = (settings.metaTitle ?? '').length;
|
|
24
|
-
const metaDescLength = (settings.metaDescription ?? '').length;
|
|
25
|
-
return (_jsxs("div", { className: "space-y-4 p-4", children: [_jsx("p", { className: SECTION_HEADING_CLASS, children: "General" }), _jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "Title" }), _jsx("input", { type: "text", value: settings.title, onChange: (e) => update('title', e.target.value), placeholder: "Page title", className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "Slug" }), _jsx("input", { type: "text", value: settings.slug, onChange: (e) => update('slug', e.target.value), placeholder: "/page-slug", className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "Template" }), _jsx("input", { type: "text", value: settings.template ?? '', onChange: (e) => update('template', e.target.value), placeholder: "default", className: INPUT_CLASS, readOnly: true })] }), _jsx("p", { className: SECTION_HEADING_CLASS, children: "SEO" }), _jsxs("div", { children: [_jsxs("div", { className: "mb-1 flex items-center justify-between", children: [_jsx("label", { className: "text-foreground text-sm font-medium", children: "Meta Title" }), _jsxs("span", { className: `text-xs ${metaTitleLength > 60 ? 'text-destructive' : 'text-muted-foreground'}`, children: [metaTitleLength, "/60"] })] }), _jsx("input", { type: "text", value: settings.metaTitle ?? '', onChange: (e) => update('metaTitle', e.target.value), placeholder: "SEO title", maxLength: 100, className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsxs("div", { className: "mb-1 flex items-center justify-between", children: [_jsx("label", { className: "text-foreground text-sm font-medium", children: "Meta Description" }), _jsxs("span", { className: `text-xs ${metaDescLength > 160 ? 'text-destructive' : 'text-muted-foreground'}`, children: [metaDescLength, "/160"] })] }), _jsx("textarea", { value: settings.metaDescription ?? '', onChange: (e) => update('metaDescription', e.target.value), placeholder: "Brief description for search engines", rows: 3, maxLength: 250, className: `${INPUT_CLASS} resize-y` })] }), _jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "OG Image" }), _jsx("input", { type: "text", value: settings.ogImage ?? '', onChange: (e) => update('ogImage', e.target.value), placeholder: "https://example.com/image.jpg", className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "Focus Keyphrase" }), _jsx("input", { type: "text", value: settings.focusKeyphrase ?? '', onChange: (e) => update('focusKeyphrase', e.target.value), placeholder: "primary keyword", className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "Schema Type" }), _jsxs("select", { value: settings.schemaType ?? '', onChange: (e) => update('schemaType', e.target.value), className: INPUT_CLASS, children: [_jsx("option", { value: "", children: "Select schema type..." }), SCHEMA_TYPES.map((type) => (_jsx("option", { value: type, children: type }, type)))] })] })] }));
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=PageSettings.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PageSettings.js","sourceRoot":"","sources":["../../../src/views/page-builder/PageSettings.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PageTemplates.d.ts","sourceRoot":"","sources":["../../../src/views/page-builder/PageTemplates.tsx"],"names":[],"mappings":"AA8CA,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC;AAED,wBAAgB,aAAa,CAAC,EAAE,UAAU,EAAE,EAAE,kBAAkB,2CA8K/D"}
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
-
import { useMemo, useState } from 'react';
|
|
4
|
-
import { AlertTriangle, Copy, FilePlus, Layers, Pencil, RefreshCw, Trash2 } from 'lucide-react';
|
|
5
|
-
import { toast } from 'sonner';
|
|
6
|
-
import { cmsApi } from '../../lib/api.js';
|
|
7
|
-
import { useApiData } from '../../lib/useApiData.js';
|
|
8
|
-
import { ConfirmDialog } from '../../components/ui/ConfirmDialog.js';
|
|
9
|
-
import { EmptyState } from '../../components/ui/EmptyState.js';
|
|
10
|
-
import { FilterPill } from '../../components/ui/FilterPill.js';
|
|
11
|
-
import { Input } from '../../components/ui/Input.js';
|
|
12
|
-
import { Modal } from '../../components/ui/Modal.js';
|
|
13
|
-
import { Button } from '../../components/ui/Button.js';
|
|
14
|
-
import { RowActions, RowActionButton } from '../../components/ui/RowActions.js';
|
|
15
|
-
import { SearchInput } from '../../components/ui/SearchInput.js';
|
|
16
|
-
import { Select } from '../../components/ui/Select.js';
|
|
17
|
-
import { Skeleton } from '../../components/ui/Skeleton.js';
|
|
18
|
-
const CATEGORIES = {
|
|
19
|
-
content: { label: 'Content', dot: 'bg-[var(--acc)]', text: 'text-[var(--acc)]' },
|
|
20
|
-
landing: { label: 'Landing', dot: 'bg-[var(--suc)]', text: 'text-[var(--suc)]' },
|
|
21
|
-
utility: { label: 'Utility', dot: 'bg-[var(--warn)]', text: 'text-[var(--warn)]' },
|
|
22
|
-
};
|
|
23
|
-
function categoryOf(template) {
|
|
24
|
-
const cat = template.category;
|
|
25
|
-
return cat === 'landing' || cat === 'utility' ? cat : 'content';
|
|
26
|
-
}
|
|
27
|
-
function sectionCountOf(template) {
|
|
28
|
-
return Array.isArray(template.tree?.children) ? template.tree.children.length : 0;
|
|
29
|
-
}
|
|
30
|
-
export function PageTemplates({ onNavigate }) {
|
|
31
|
-
const { data, loading, error, refetch } = useApiData('/page-templates');
|
|
32
|
-
const templates = useMemo(() => data ?? [], [data]);
|
|
33
|
-
const [search, setSearch] = useState('');
|
|
34
|
-
const [category, setCategory] = useState('all');
|
|
35
|
-
const [editTarget, setEditTarget] = useState(null);
|
|
36
|
-
const [deleteTarget, setDeleteTarget] = useState(null);
|
|
37
|
-
const filtered = useMemo(() => {
|
|
38
|
-
const q = search.trim().toLowerCase();
|
|
39
|
-
return templates.filter((t) => {
|
|
40
|
-
const matchesQuery = !q ||
|
|
41
|
-
(t.name ?? '').toLowerCase().includes(q) ||
|
|
42
|
-
(t.description ?? '').toLowerCase().includes(q);
|
|
43
|
-
const matchesCategory = category === 'all' || categoryOf(t) === category;
|
|
44
|
-
return matchesQuery && matchesCategory;
|
|
45
|
-
});
|
|
46
|
-
}, [templates, search, category]);
|
|
47
|
-
async function confirmDelete() {
|
|
48
|
-
if (!deleteTarget)
|
|
49
|
-
return;
|
|
50
|
-
const res = await cmsApi(`/page-templates/${deleteTarget.id}`, { method: 'DELETE' });
|
|
51
|
-
if (res.error) {
|
|
52
|
-
toast.error(res.error);
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
toast.success('Template deleted');
|
|
56
|
-
refetch();
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
async function duplicateTemplate(template) {
|
|
60
|
-
// The list payload carries the full tree, so no extra fetch is needed.
|
|
61
|
-
// Duplicating a built-in is the supported way to customize one (built-ins
|
|
62
|
-
// themselves are locked against edits).
|
|
63
|
-
if (!template.tree) {
|
|
64
|
-
toast.error('Template has no layout to duplicate');
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
const res = await cmsApi('/page-templates', {
|
|
68
|
-
method: 'POST',
|
|
69
|
-
body: JSON.stringify({
|
|
70
|
-
name: `${template.name ?? 'Untitled template'} (copy)`,
|
|
71
|
-
description: template.description ?? null,
|
|
72
|
-
category: categoryOf(template),
|
|
73
|
-
tree: template.tree,
|
|
74
|
-
thumbnail: template.thumbnail ?? null,
|
|
75
|
-
}),
|
|
76
|
-
});
|
|
77
|
-
if (res.error) {
|
|
78
|
-
toast.error(res.error);
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
toast.success('Template duplicated');
|
|
82
|
-
refetch();
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
return (_jsxs("div", { className: "p-4 pr-8", children: [error && (_jsxs("div", { className: "mb-4 flex items-center gap-3 rounded-[var(--r)] border border-[var(--bdr)] bg-[var(--card)] p-3", children: [_jsx(AlertTriangle, { className: "h-5 w-5 shrink-0 text-[var(--muted)]", "aria-hidden": true }), _jsx("span", { className: "flex-1 text-sm text-[var(--txt)]", children: error }), _jsx("button", { type: "button", onClick: refetch, className: "rounded-md border border-[var(--bdr)] px-3 py-1 text-sm text-[var(--txt)] hover:bg-[var(--acc-l)]", children: "Retry" })] })), _jsxs("div", { className: "mb-4 flex items-center justify-between gap-4", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-foreground mb-1", children: "Page Templates" }), _jsxs("p", { className: "text-sm text-[var(--sub)]", children: [templates.length, " saved template", templates.length === 1 ? '' : 's'] })] }), _jsx(Button, { type: "button", variant: "outline", size: "md", onClick: refetch, leftIcon: _jsx(RefreshCw, { size: 16, "aria-hidden": true }), children: "Refresh" })] }), !loading && templates.length > 0 && (_jsxs("div", { className: "mb-4 flex flex-wrap items-center gap-2", children: [_jsx("div", { className: "max-w-xs min-w-52 flex-1", children: _jsx(SearchInput, { value: search, onChange: setSearch, placeholder: "Search templates\u2026" }) }), _jsxs("div", { className: "flex gap-1.5", role: "group", "aria-label": "Filter templates by category", children: [_jsx(FilterPill, { active: category === 'all', onClick: () => setCategory('all'), children: "All" }), Object.keys(CATEGORIES).map((cat) => (_jsx(FilterPill, { active: category === cat, onClick: () => setCategory(cat), children: CATEGORIES[cat].label }, cat)))] }), _jsxs("span", { className: "ml-auto text-[12.5px] whitespace-nowrap text-[var(--muted)]", children: [filtered.length, " of ", templates.length] })] })), loading ? (_jsx("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3", role: "status", "aria-live": "polite", "aria-label": "Loading page templates", children: Array.from({ length: 6 }, (_, i) => (_jsx(Skeleton, { variant: "card" }, i))) })) : templates.length === 0 ? (_jsx(EmptyState, { icon: _jsx(Layers, { size: 24, "aria-hidden": true }), title: "No page templates yet", description: "Built-in templates are seeded by the CMS when the templates API is available.", actionLabel: "View Saved Sections", onAction: () => onNavigate?.('/saved-sections') })) : filtered.length === 0 ? (_jsx("p", { className: "py-12 text-center text-sm text-[var(--muted)]", children: "No templates match your search." })) : (_jsx("ul", { className: "grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3", "aria-label": "Page templates", children: filtered.map((template) => (_jsx(TemplateCard, { template: template, onUse: () => onNavigate?.(`/page-builder/new?template=${template.id}`), onDuplicate: () => void duplicateTemplate(template), onEdit: () => setEditTarget(template), onDelete: () => setDeleteTarget(template) }, template.id))) })), _jsx(TemplateEditModal, { template: editTarget, onClose: () => setEditTarget(null), onSaved: () => {
|
|
86
|
-
setEditTarget(null);
|
|
87
|
-
refetch();
|
|
88
|
-
} }), _jsx(ConfirmDialog, { open: deleteTarget !== null, onClose: () => setDeleteTarget(null), onConfirm: () => void confirmDelete(), title: "Delete template?", description: `"${deleteTarget?.name ?? 'This template'}" will be permanently removed. Pages already created from it are not affected.`, confirmLabel: "Delete", destructive: true })] }));
|
|
89
|
-
}
|
|
90
|
-
function TemplateCard({ template, onUse, onDuplicate, onEdit, onDelete, }) {
|
|
91
|
-
const cat = CATEGORIES[categoryOf(template)];
|
|
92
|
-
const sections = sectionCountOf(template);
|
|
93
|
-
const name = template.name ?? 'Untitled template';
|
|
94
|
-
const updated = template.updatedAt ? new Date(template.updatedAt).toLocaleDateString() : null;
|
|
95
|
-
return (_jsxs("li", { className: "group relative flex flex-col overflow-hidden rounded-[var(--r)] border border-[var(--bdr)] bg-[var(--card)] shadow-[var(--shd)] transition-[border-color,box-shadow,transform] duration-[var(--motion-fast)] focus-within:border-[var(--acc-m)] focus-within:shadow-[var(--shd2)] hover:-translate-y-0.5 hover:border-[var(--acc-m)] hover:shadow-[var(--shd2)] motion-reduce:hover:translate-y-0", children: [_jsx(TemplatePreview, { template: template, sections: sections }), _jsxs("div", { className: "flex flex-1 flex-col p-4 pb-0", children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsx("h2", { className: "text-[15px] leading-snug font-medium text-[var(--txt)]", children: name }), template.builtIn && (_jsx("span", { className: "shrink-0 rounded-full border border-[var(--bdr)] bg-[var(--bg)] px-2 py-0.5 text-[10.5px] font-medium whitespace-nowrap text-[var(--sub)]", children: "Built-in" }))] }), _jsx("p", { className: "mt-2 min-h-10 text-[12.5px] leading-relaxed text-[var(--sub)]", children: template.description ?? 'No description provided.' }), _jsxs("div", { className: "relative mt-3 flex h-[46px] items-center justify-between border-t border-[var(--bdr)] py-2.5", children: [_jsxs("span", { className: `inline-flex items-center gap-1.5 text-[11.5px] font-medium ${cat.text}`, children: [_jsx("span", { "aria-hidden": true, className: `h-[7px] w-[7px] shrink-0 rounded-full ${cat.dot}` }), cat.label] }), _jsxs("span", { className: "text-[11.5px] text-[var(--muted)] transition-opacity duration-[var(--motion-fast)] group-focus-within:opacity-0 group-hover:opacity-0", children: [sections, " section", sections === 1 ? '' : 's', updated ? ` · ${updated}` : ''] }), _jsxs(RowActions, { className: "absolute top-1/2 right-0 -translate-y-1/2", children: [_jsx(RowActionButton, { "aria-label": `Create page from ${name}`, onClick: onUse, children: _jsx(FilePlus, { size: 14, "aria-hidden": true }) }), _jsx(RowActionButton, { "aria-label": `Duplicate ${name}`, onClick: onDuplicate, children: _jsx(Copy, { size: 14, "aria-hidden": true }) }), !template.builtIn && (_jsxs(_Fragment, { children: [_jsx(RowActionButton, { "aria-label": `Edit ${name}`, onClick: onEdit, children: _jsx(Pencil, { size: 14, "aria-hidden": true }) }), _jsx(RowActionButton, { "aria-label": `Delete ${name}`, danger: true, onClick: onDelete, children: _jsx(Trash2, { size: 14, "aria-hidden": true }) })] }))] })] })] })] }));
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Card preview area. Uses the stored thumbnail when one exists; otherwise
|
|
99
|
-
* renders an honest wireframe placeholder built from the template's section
|
|
100
|
-
* count (a hero band plus one bar per section) — no fake screenshots.
|
|
101
|
-
*/
|
|
102
|
-
function TemplatePreview({ template, sections }) {
|
|
103
|
-
if (template.thumbnail) {
|
|
104
|
-
return (_jsx("div", { className: "h-28 shrink-0 overflow-hidden border-b border-[var(--bdr)] bg-[var(--bg)]", children: _jsx("img", { src: template.thumbnail, alt: `Preview of ${template.name ?? 'template'}`, className: "h-full w-full object-cover" }) }));
|
|
105
|
-
}
|
|
106
|
-
const bars = Math.max(0, Math.min(sections - 1, 3));
|
|
107
|
-
return (_jsxs("div", { "aria-hidden": true, className: "flex h-28 shrink-0 flex-col gap-1.5 border-b border-[var(--bdr)] bg-[var(--bg)] p-3", children: [_jsx("div", { className: "h-9 rounded-[5px] bg-[var(--acc-l)]" }), Array.from({ length: bars }, (_, i) => (_jsx("div", { className: "h-3.5 rounded-[4px] bg-[var(--bdr)]", style: { width: `${88 - i * 14}%` } }, i)))] }));
|
|
108
|
-
}
|
|
109
|
-
function TemplateEditModal({ template, onClose, onSaved, }) {
|
|
110
|
-
// Keyed remount seeds the form state from the selected template each time
|
|
111
|
-
// the modal opens, without effect-based state syncing.
|
|
112
|
-
if (!template)
|
|
113
|
-
return null;
|
|
114
|
-
return (_jsx(TemplateEditForm, { template: template, onClose: onClose, onSaved: onSaved }, template.id));
|
|
115
|
-
}
|
|
116
|
-
function TemplateEditForm({ template, onClose, onSaved, }) {
|
|
117
|
-
const [name, setName] = useState(template.name ?? '');
|
|
118
|
-
const [description, setDescription] = useState(template.description ?? '');
|
|
119
|
-
const [category, setCategory] = useState(categoryOf(template));
|
|
120
|
-
const [saving, setSaving] = useState(false);
|
|
121
|
-
async function handleSave() {
|
|
122
|
-
if (!name.trim()) {
|
|
123
|
-
toast.error('Template name is required');
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
setSaving(true);
|
|
127
|
-
const res = await cmsApi(`/page-templates/${template.id}`, {
|
|
128
|
-
method: 'PUT',
|
|
129
|
-
body: JSON.stringify({
|
|
130
|
-
name: name.trim(),
|
|
131
|
-
description: description.trim() || null,
|
|
132
|
-
category,
|
|
133
|
-
}),
|
|
134
|
-
});
|
|
135
|
-
setSaving(false);
|
|
136
|
-
if (res.error) {
|
|
137
|
-
toast.error(res.error);
|
|
138
|
-
}
|
|
139
|
-
else {
|
|
140
|
-
toast.success('Template updated');
|
|
141
|
-
onSaved();
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
return (_jsx(Modal, { open: true, onClose: onClose, title: "Edit template", actions: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "ghost", onClick: onClose, disabled: saving, children: "Cancel" }), _jsx(Button, { variant: "primary", onClick: () => void handleSave(), loading: saving, children: "Save changes" })] }), children: _jsxs("div", { className: "flex flex-col gap-4", children: [_jsxs("label", { className: "flex flex-col gap-1.5", children: [_jsx("span", { className: "text-sm font-medium text-[var(--txt)]", children: "Name" }), _jsx(Input, { value: name, onChange: (e) => setName(e.target.value), placeholder: "Template name" })] }), _jsxs("label", { className: "flex flex-col gap-1.5", children: [_jsx("span", { className: "text-sm font-medium text-[var(--txt)]", children: "Description" }), _jsx("textarea", { value: description, onChange: (e) => setDescription(e.target.value), rows: 3, placeholder: "What this template is for\u2026", className: "w-full resize-y rounded-[var(--r-control)] border border-[var(--bdr)] bg-[var(--input-background)] px-3 py-2 text-sm text-[var(--txt)] placeholder:text-[var(--muted)] focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:outline-none" })] }), _jsxs("label", { className: "flex flex-col gap-1.5", children: [_jsx("span", { className: "text-sm font-medium text-[var(--txt)]", children: "Category" }), _jsx(Select, { value: category, onChange: (e) => setCategory(e.target.value), children: Object.keys(CATEGORIES).map((cat) => (_jsx("option", { value: cat, children: CATEGORIES[cat].label }, cat))) })] })] }) }));
|
|
145
|
-
}
|
|
146
|
-
//# sourceMappingURL=PageTemplates.js.map
|