@prenta/admin 0.98.0 → 1.0.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 +17 -28
- package/dist/AdminRoot.js.map +1 -1
- package/dist/__tests__/components/seo-score-bands.test.js +0 -10
- 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/page-audit-input.test.js +77 -1
- package/dist/__tests__/lib/page-audit-input.test.js.map +1 -1
- 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__/views/page-section-editor.test.js +0 -1
- 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/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/page-audit-input.d.ts +14 -1
- package/dist/lib/page-audit-input.d.ts.map +1 -1
- package/dist/lib/page-audit-input.js +19 -0
- package/dist/lib/page-audit-input.js.map +1 -1
- 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/prenta-admin.css +1 -1
- package/dist/views/PageEditor.d.ts +2 -2
- package/dist/views/PageEditor.js +2 -2
- package/dist/views/page-editor/PageSectionEditor.d.ts.map +1 -1
- package/dist/views/page-editor/PageSectionEditor.js +9 -15
- package/dist/views/page-editor/PageSectionEditor.js.map +1 -1
- package/package.json +4 -4
- package/src/AdminRoot.tsx +18 -68
- package/src/__tests__/components/seo-score-bands.test.ts +0 -10
- 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/page-audit-input.test.ts +91 -1
- package/src/__tests__/lib/page-editor-service-api.test.ts +27 -25
- package/src/__tests__/views/page-section-editor.test.tsx +0 -1
- package/src/__tests__/views/page-tab.render.test.tsx +0 -1
- package/src/index.ts +1 -11
- package/src/layout/Sidebar.tsx +6 -41
- package/src/lib/page-audit-input.ts +36 -1
- package/src/lib/page-editor-service.ts +9 -16
- package/src/views/PageEditor.tsx +2 -2
- package/src/views/page-editor/PageSectionEditor.tsx +8 -37
- 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-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/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 -10
- package/dist/views/page-builder/SEOPanel.d.ts.map +0 -1
- package/dist/views/page-builder/SEOPanel.js +0 -103
- 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/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-template-seed.render.test.tsx +0 -59
- package/src/__tests__/views/page-templates.render.test.tsx +0 -182
- 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 -145
- 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 -464
- 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
|
@@ -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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PageTemplates.js","sourceRoot":"","sources":["../../../src/views/page-builder/PageTemplates.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { FieldDefinition } from '@prenta/core';
|
|
2
|
-
export interface RelationshipFieldProps {
|
|
3
|
-
definition: FieldDefinition;
|
|
4
|
-
value: unknown;
|
|
5
|
-
onChange: (value: unknown) => void;
|
|
6
|
-
label: string;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Relationship picker for page-builder block fields (e.g. the form block's
|
|
10
|
-
* `formId`). Loads the target collection via the admin API and renders a
|
|
11
|
-
* labelled dropdown. If the collection can't be loaded it degrades to a plain
|
|
12
|
-
* id input so the field is never a dead end.
|
|
13
|
-
*/
|
|
14
|
-
export declare function RelationshipField({ definition, value, onChange, label }: RelationshipFieldProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
-
//# sourceMappingURL=RelationshipField.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RelationshipField.d.ts","sourceRoot":"","sources":["../../../src/views/page-builder/RelationshipField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAYnD,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,eAAe,CAAA;IAC3B,KAAK,EAAE,OAAO,CAAA;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAClC,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,sBAAsB,2CAoF/F"}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useEffect, useMemo, useState } from 'react';
|
|
4
|
-
import { cmsApi } from '../../lib/api.js';
|
|
5
|
-
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';
|
|
6
|
-
const LABEL_CLASS = 'text-sm font-medium text-foreground mb-1 block';
|
|
7
|
-
/**
|
|
8
|
-
* Relationship picker for page-builder block fields (e.g. the form block's
|
|
9
|
-
* `formId`). Loads the target collection via the admin API and renders a
|
|
10
|
-
* labelled dropdown. If the collection can't be loaded it degrades to a plain
|
|
11
|
-
* id input so the field is never a dead end.
|
|
12
|
-
*/
|
|
13
|
-
export function RelationshipField({ definition, value, onChange, label }) {
|
|
14
|
-
const relationTo = useMemo(() => {
|
|
15
|
-
if (definition.type !== 'relationship')
|
|
16
|
-
return '';
|
|
17
|
-
return Array.isArray(definition.relationTo)
|
|
18
|
-
? (definition.relationTo[0] ?? '')
|
|
19
|
-
: definition.relationTo;
|
|
20
|
-
}, [definition]);
|
|
21
|
-
const [options, setOptions] = useState([]);
|
|
22
|
-
const [loading, setLoading] = useState(false);
|
|
23
|
-
const [failed, setFailed] = useState(false);
|
|
24
|
-
useEffect(() => {
|
|
25
|
-
if (!relationTo)
|
|
26
|
-
return;
|
|
27
|
-
let cancelled = false;
|
|
28
|
-
setLoading(true);
|
|
29
|
-
setFailed(false);
|
|
30
|
-
cmsApi(`/${relationTo}`)
|
|
31
|
-
.then((res) => {
|
|
32
|
-
if (cancelled)
|
|
33
|
-
return;
|
|
34
|
-
if (Array.isArray(res.data)) {
|
|
35
|
-
setOptions(res.data
|
|
36
|
-
.map((item) => ({
|
|
37
|
-
id: String(item.id ?? ''),
|
|
38
|
-
label: String(item.name ?? item.title ?? item.slug ?? item.id ?? 'Untitled'),
|
|
39
|
-
}))
|
|
40
|
-
.filter((option) => option.id));
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
setFailed(true);
|
|
44
|
-
}
|
|
45
|
-
})
|
|
46
|
-
.catch(() => {
|
|
47
|
-
if (!cancelled)
|
|
48
|
-
setFailed(true);
|
|
49
|
-
})
|
|
50
|
-
.finally(() => {
|
|
51
|
-
if (!cancelled)
|
|
52
|
-
setLoading(false);
|
|
53
|
-
});
|
|
54
|
-
return () => {
|
|
55
|
-
cancelled = true;
|
|
56
|
-
};
|
|
57
|
-
}, [relationTo]);
|
|
58
|
-
const current = value ?? '';
|
|
59
|
-
const noun = relationTo === 'forms' ? 'a form' : 'an item';
|
|
60
|
-
if (failed) {
|
|
61
|
-
return (_jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: label }), _jsx("input", { type: "text", value: current, onChange: (e) => onChange(e.target.value || undefined), placeholder: `Enter ${relationTo} id…`, className: INPUT_CLASS })] }));
|
|
62
|
-
}
|
|
63
|
-
return (_jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: label }), _jsxs("select", { value: current, onChange: (e) => onChange(e.target.value || undefined), disabled: loading, "aria-label": label, className: INPUT_CLASS, children: [_jsx("option", { value: "", children: loading ? 'Loading…' : `Select ${noun}…` }), options.map((option) => (_jsx("option", { value: option.id, children: option.label }, option.id)))] }), !loading && options.length === 0 && (_jsxs("p", { className: "text-muted-foreground mt-1 text-xs", children: ["No ", relationTo, " found."] }))] }));
|
|
64
|
-
}
|
|
65
|
-
//# sourceMappingURL=RelationshipField.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RelationshipField.js","sourceRoot":"","sources":["../../../src/views/page-builder/RelationshipField.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { PageNode } from '@prenta/core';
|
|
2
|
-
import type { PageSettings } from '../../hooks/useBuilderState.js';
|
|
3
|
-
export interface BuilderSEOPanelProps {
|
|
4
|
-
tree: PageNode;
|
|
5
|
-
pageSettings: PageSettings;
|
|
6
|
-
onPageSettingsChange: (settings: Partial<PageSettings>) => void;
|
|
7
|
-
selectedNodeId: string | null;
|
|
8
|
-
}
|
|
9
|
-
export declare function BuilderSEOPanel({ tree, pageSettings, onPageSettingsChange, selectedNodeId, }: BuilderSEOPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
-
//# sourceMappingURL=SEOPanel.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SEOPanel.d.ts","sourceRoot":"","sources":["../../../src/views/page-builder/SEOPanel.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,QAAQ,EAIT,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAiBlE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,QAAQ,CAAA;IACd,YAAY,EAAE,YAAY,CAAA;IAC1B,oBAAoB,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,CAAA;IAC/D,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B;AAoUD,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,YAAY,EACZ,oBAAoB,EACpB,cAAc,GACf,EAAE,oBAAoB,2CAsGtB"}
|