@actuate-media/cms-admin 0.6.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AdminRoot.d.ts.map +1 -1
- package/dist/AdminRoot.js +17 -0
- package/dist/AdminRoot.js.map +1 -1
- package/dist/actuate-admin.css +1 -1
- package/dist/components/ErrorBoundary.js +1 -1
- package/dist/components/ErrorBoundary.js.map +1 -1
- package/dist/hooks/useBuilderState.d.ts +49 -0
- package/dist/hooks/useBuilderState.d.ts.map +1 -0
- package/dist/hooks/useBuilderState.js +238 -0
- package/dist/hooks/useBuilderState.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/layout/Sidebar.d.ts.map +1 -1
- package/dist/layout/Sidebar.js +2 -2
- package/dist/layout/Sidebar.js.map +1 -1
- package/dist/views/FormSubmissions.js +11 -11
- package/dist/views/FormSubmissions.js.map +1 -1
- package/dist/views/Forms.js +1 -1
- package/dist/views/Forms.js.map +1 -1
- package/dist/views/MediaBrowser.d.ts.map +1 -1
- package/dist/views/MediaBrowser.js +28 -8
- package/dist/views/MediaBrowser.js.map +1 -1
- package/dist/views/Posts.js +1 -1
- package/dist/views/Posts.js.map +1 -1
- package/dist/views/Redirects.js +2 -2
- package/dist/views/Redirects.js.map +1 -1
- package/dist/views/SEO.js +3 -3
- package/dist/views/SEO.js.map +1 -1
- package/dist/views/Users.js +3 -3
- package/dist/views/Users.js.map +1 -1
- package/dist/views/page-builder/AIBlockAssist.d.ts +9 -0
- package/dist/views/page-builder/AIBlockAssist.d.ts.map +1 -0
- package/dist/views/page-builder/AIBlockAssist.js +40 -0
- package/dist/views/page-builder/AIBlockAssist.js.map +1 -0
- package/dist/views/page-builder/AIGenerateDialog.d.ts +8 -0
- package/dist/views/page-builder/AIGenerateDialog.d.ts.map +1 -0
- package/dist/views/page-builder/AIGenerateDialog.js +170 -0
- package/dist/views/page-builder/AIGenerateDialog.js.map +1 -0
- package/dist/views/page-builder/BlockEditor.d.ts +11 -0
- package/dist/views/page-builder/BlockEditor.d.ts.map +1 -0
- package/dist/views/page-builder/BlockEditor.js +67 -0
- package/dist/views/page-builder/BlockEditor.js.map +1 -0
- package/dist/views/page-builder/BlockPicker.d.ts +7 -0
- package/dist/views/page-builder/BlockPicker.d.ts.map +1 -0
- package/dist/views/page-builder/BlockPicker.js +102 -0
- package/dist/views/page-builder/BlockPicker.js.map +1 -0
- package/dist/views/page-builder/BottomBar.d.ts +9 -0
- package/dist/views/page-builder/BottomBar.d.ts.map +1 -0
- package/dist/views/page-builder/BottomBar.js +13 -0
- package/dist/views/page-builder/BottomBar.js.map +1 -0
- package/dist/views/page-builder/BuilderToolbar.d.ts +21 -0
- package/dist/views/page-builder/BuilderToolbar.d.ts.map +1 -0
- package/dist/views/page-builder/BuilderToolbar.js +18 -0
- package/dist/views/page-builder/BuilderToolbar.js.map +1 -0
- package/dist/views/page-builder/ContextPanel.d.ts +20 -0
- package/dist/views/page-builder/ContextPanel.d.ts.map +1 -0
- package/dist/views/page-builder/ContextPanel.js +40 -0
- package/dist/views/page-builder/ContextPanel.js.map +1 -0
- package/dist/views/page-builder/DesignScore.d.ts +6 -0
- package/dist/views/page-builder/DesignScore.d.ts.map +1 -0
- package/dist/views/page-builder/DesignScore.js +93 -0
- package/dist/views/page-builder/DesignScore.js.map +1 -0
- package/dist/views/page-builder/NodeSettings.d.ts +12 -0
- package/dist/views/page-builder/NodeSettings.d.ts.map +1 -0
- package/dist/views/page-builder/NodeSettings.js +80 -0
- package/dist/views/page-builder/NodeSettings.js.map +1 -0
- package/dist/views/page-builder/PageBuilder.d.ts +8 -0
- package/dist/views/page-builder/PageBuilder.d.ts.map +1 -0
- package/dist/views/page-builder/PageBuilder.js +126 -0
- package/dist/views/page-builder/PageBuilder.js.map +1 -0
- package/dist/views/page-builder/PageSettings.d.ts +7 -0
- package/dist/views/page-builder/PageSettings.d.ts.map +1 -0
- package/dist/views/page-builder/PageSettings.js +27 -0
- package/dist/views/page-builder/PageSettings.js.map +1 -0
- package/dist/views/page-builder/PageTemplates.d.ts +5 -0
- package/dist/views/page-builder/PageTemplates.d.ts.map +1 -0
- package/dist/views/page-builder/PageTemplates.js +13 -0
- package/dist/views/page-builder/PageTemplates.js.map +1 -0
- package/dist/views/page-builder/SEOPanel.d.ts +10 -0
- package/dist/views/page-builder/SEOPanel.d.ts.map +1 -0
- package/dist/views/page-builder/SEOPanel.js +105 -0
- package/dist/views/page-builder/SEOPanel.js.map +1 -0
- package/dist/views/page-builder/SavedSections.d.ts +6 -0
- package/dist/views/page-builder/SavedSections.d.ts.map +1 -0
- package/dist/views/page-builder/SavedSections.js +145 -0
- package/dist/views/page-builder/SavedSections.js.map +1 -0
- package/dist/views/page-builder/TemplatePicker.d.ts +7 -0
- package/dist/views/page-builder/TemplatePicker.d.ts.map +1 -0
- package/dist/views/page-builder/TemplatePicker.js +68 -0
- package/dist/views/page-builder/TemplatePicker.js.map +1 -0
- package/dist/views/page-builder/block-renderers/CTAPreview.d.ts +3 -0
- package/dist/views/page-builder/block-renderers/CTAPreview.d.ts.map +1 -0
- package/dist/views/page-builder/block-renderers/CTAPreview.js +19 -0
- package/dist/views/page-builder/block-renderers/CTAPreview.js.map +1 -0
- package/dist/views/page-builder/block-renderers/CardsPreview.d.ts +3 -0
- package/dist/views/page-builder/block-renderers/CardsPreview.d.ts.map +1 -0
- package/dist/views/page-builder/block-renderers/CardsPreview.js +22 -0
- package/dist/views/page-builder/block-renderers/CardsPreview.js.map +1 -0
- package/dist/views/page-builder/block-renderers/CodePreview.d.ts +3 -0
- package/dist/views/page-builder/block-renderers/CodePreview.d.ts.map +1 -0
- package/dist/views/page-builder/block-renderers/CodePreview.js +16 -0
- package/dist/views/page-builder/block-renderers/CodePreview.js.map +1 -0
- package/dist/views/page-builder/block-renderers/FAQPreview.d.ts +3 -0
- package/dist/views/page-builder/block-renderers/FAQPreview.d.ts.map +1 -0
- package/dist/views/page-builder/block-renderers/FAQPreview.js +24 -0
- package/dist/views/page-builder/block-renderers/FAQPreview.js.map +1 -0
- package/dist/views/page-builder/block-renderers/FallbackPreview.d.ts +6 -0
- package/dist/views/page-builder/block-renderers/FallbackPreview.d.ts.map +1 -0
- package/dist/views/page-builder/block-renderers/FallbackPreview.js +7 -0
- package/dist/views/page-builder/block-renderers/FallbackPreview.js.map +1 -0
- package/dist/views/page-builder/block-renderers/FormPreview.d.ts +3 -0
- package/dist/views/page-builder/block-renderers/FormPreview.d.ts.map +1 -0
- package/dist/views/page-builder/block-renderers/FormPreview.js +14 -0
- package/dist/views/page-builder/block-renderers/FormPreview.js.map +1 -0
- package/dist/views/page-builder/block-renderers/GalleryPreview.d.ts +3 -0
- package/dist/views/page-builder/block-renderers/GalleryPreview.d.ts.map +1 -0
- package/dist/views/page-builder/block-renderers/GalleryPreview.js +21 -0
- package/dist/views/page-builder/block-renderers/GalleryPreview.js.map +1 -0
- package/dist/views/page-builder/block-renderers/HeroPreview.d.ts +3 -0
- package/dist/views/page-builder/block-renderers/HeroPreview.d.ts.map +1 -0
- package/dist/views/page-builder/block-renderers/HeroPreview.js +19 -0
- package/dist/views/page-builder/block-renderers/HeroPreview.js.map +1 -0
- package/dist/views/page-builder/block-renderers/ImagePreview.d.ts +3 -0
- package/dist/views/page-builder/block-renderers/ImagePreview.d.ts.map +1 -0
- package/dist/views/page-builder/block-renderers/ImagePreview.js +17 -0
- package/dist/views/page-builder/block-renderers/ImagePreview.js.map +1 -0
- package/dist/views/page-builder/block-renderers/TextPreview.d.ts +3 -0
- package/dist/views/page-builder/block-renderers/TextPreview.d.ts.map +1 -0
- package/dist/views/page-builder/block-renderers/TextPreview.js +26 -0
- package/dist/views/page-builder/block-renderers/TextPreview.js.map +1 -0
- package/dist/views/page-builder/block-renderers/VideoPreview.d.ts +3 -0
- package/dist/views/page-builder/block-renderers/VideoPreview.d.ts.map +1 -0
- package/dist/views/page-builder/block-renderers/VideoPreview.js +21 -0
- package/dist/views/page-builder/block-renderers/VideoPreview.js.map +1 -0
- package/dist/views/page-builder/block-renderers/index.d.ts +9 -0
- package/dist/views/page-builder/block-renderers/index.d.ts.map +1 -0
- package/dist/views/page-builder/block-renderers/index.js +25 -0
- package/dist/views/page-builder/block-renderers/index.js.map +1 -0
- package/dist/views/page-builder/canvas/BlockRenderer.d.ts +8 -0
- package/dist/views/page-builder/canvas/BlockRenderer.d.ts.map +1 -0
- package/dist/views/page-builder/canvas/BlockRenderer.js +30 -0
- package/dist/views/page-builder/canvas/BlockRenderer.js.map +1 -0
- package/dist/views/page-builder/canvas/BuilderCanvas.d.ts +10 -0
- package/dist/views/page-builder/canvas/BuilderCanvas.d.ts.map +1 -0
- package/dist/views/page-builder/canvas/BuilderCanvas.js +26 -0
- package/dist/views/page-builder/canvas/BuilderCanvas.js.map +1 -0
- package/dist/views/page-builder/canvas/ColumnRenderer.d.ts +8 -0
- package/dist/views/page-builder/canvas/ColumnRenderer.d.ts.map +1 -0
- package/dist/views/page-builder/canvas/ColumnRenderer.js +36 -0
- package/dist/views/page-builder/canvas/ColumnRenderer.js.map +1 -0
- package/dist/views/page-builder/canvas/ContainerRenderer.d.ts +8 -0
- package/dist/views/page-builder/canvas/ContainerRenderer.d.ts.map +1 -0
- package/dist/views/page-builder/canvas/ContainerRenderer.js +33 -0
- package/dist/views/page-builder/canvas/ContainerRenderer.js.map +1 -0
- package/dist/views/page-builder/canvas/RowRenderer.d.ts +8 -0
- package/dist/views/page-builder/canvas/RowRenderer.d.ts.map +1 -0
- package/dist/views/page-builder/canvas/RowRenderer.js +32 -0
- package/dist/views/page-builder/canvas/RowRenderer.js.map +1 -0
- package/dist/views/page-builder/canvas/SectionRenderer.d.ts +8 -0
- package/dist/views/page-builder/canvas/SectionRenderer.d.ts.map +1 -0
- package/dist/views/page-builder/canvas/SectionRenderer.js +54 -0
- package/dist/views/page-builder/canvas/SectionRenderer.js.map +1 -0
- package/dist/views/page-builder/canvas/index.d.ts +3 -0
- package/dist/views/page-builder/canvas/index.d.ts.map +1 -0
- package/dist/views/page-builder/canvas/index.js +2 -0
- package/dist/views/page-builder/canvas/index.js.map +1 -0
- package/package.json +3 -2
- package/src/AdminRoot.tsx +21 -0
- package/src/components/ErrorBoundary.tsx +3 -3
- package/src/hooks/useBuilderState.ts +328 -0
- package/src/index.ts +4 -0
- package/src/layout/Sidebar.tsx +5 -0
- package/src/views/FormSubmissions.tsx +12 -12
- package/src/views/Forms.tsx +1 -1
- package/src/views/MediaBrowser.tsx +46 -15
- package/src/views/Posts.tsx +1 -1
- package/src/views/Redirects.tsx +2 -2
- package/src/views/SEO.tsx +3 -3
- package/src/views/Users.tsx +3 -3
- package/src/views/page-builder/AIBlockAssist.tsx +68 -0
- package/src/views/page-builder/AIGenerateDialog.tsx +574 -0
- package/src/views/page-builder/BlockEditor.tsx +352 -0
- package/src/views/page-builder/BlockPicker.tsx +338 -0
- package/src/views/page-builder/BottomBar.tsx +64 -0
- package/src/views/page-builder/BuilderToolbar.tsx +218 -0
- package/src/views/page-builder/ContextPanel.tsx +145 -0
- package/src/views/page-builder/DesignScore.tsx +258 -0
- package/src/views/page-builder/NodeSettings.tsx +515 -0
- package/src/views/page-builder/PageBuilder.tsx +288 -0
- package/src/views/page-builder/PageSettings.tsx +161 -0
- package/src/views/page-builder/PageTemplates.tsx +105 -0
- package/src/views/page-builder/SEOPanel.tsx +485 -0
- package/src/views/page-builder/SavedSections.tsx +486 -0
- package/src/views/page-builder/TemplatePicker.tsx +201 -0
- package/src/views/page-builder/block-renderers/CTAPreview.tsx +81 -0
- package/src/views/page-builder/block-renderers/CardsPreview.tsx +71 -0
- package/src/views/page-builder/block-renderers/CodePreview.tsx +46 -0
- package/src/views/page-builder/block-renderers/FAQPreview.tsx +90 -0
- package/src/views/page-builder/block-renderers/FallbackPreview.tsx +18 -0
- package/src/views/page-builder/block-renderers/FormPreview.tsx +69 -0
- package/src/views/page-builder/block-renderers/GalleryPreview.tsx +93 -0
- package/src/views/page-builder/block-renderers/HeroPreview.tsx +103 -0
- package/src/views/page-builder/block-renderers/ImagePreview.tsx +54 -0
- package/src/views/page-builder/block-renderers/TextPreview.tsx +81 -0
- package/src/views/page-builder/block-renderers/VideoPreview.tsx +78 -0
- package/src/views/page-builder/block-renderers/index.ts +34 -0
- package/src/views/page-builder/canvas/BlockRenderer.tsx +62 -0
- package/src/views/page-builder/canvas/BuilderCanvas.tsx +90 -0
- package/src/views/page-builder/canvas/ColumnRenderer.tsx +86 -0
- package/src/views/page-builder/canvas/ContainerRenderer.tsx +71 -0
- package/src/views/page-builder/canvas/RowRenderer.tsx +72 -0
- package/src/views/page-builder/canvas/SectionRenderer.tsx +97 -0
- package/src/views/page-builder/canvas/index.ts +2 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useCallback } from 'react';
|
|
4
|
+
import { Sparkles, Loader2 } from 'lucide-react';
|
|
5
|
+
import { toast } from 'sonner';
|
|
6
|
+
import { cmsApi } from '../../lib/api.js';
|
|
7
|
+
export function AIBlockAssist({ block, pageTitle, businessName, onUpdateData, }) {
|
|
8
|
+
const [generating, setGenerating] = useState(false);
|
|
9
|
+
const handleGenerate = useCallback(async () => {
|
|
10
|
+
setGenerating(true);
|
|
11
|
+
try {
|
|
12
|
+
const res = await cmsApi('/page-builder/generate-block', {
|
|
13
|
+
method: 'POST',
|
|
14
|
+
body: JSON.stringify({
|
|
15
|
+
blockType: block.settings.blockType,
|
|
16
|
+
variant: block.settings.variant,
|
|
17
|
+
pageContext: {
|
|
18
|
+
pageTitle,
|
|
19
|
+
businessName,
|
|
20
|
+
},
|
|
21
|
+
}),
|
|
22
|
+
});
|
|
23
|
+
if (res.error) {
|
|
24
|
+
toast.error(res.error);
|
|
25
|
+
}
|
|
26
|
+
else if (res.data) {
|
|
27
|
+
onUpdateData(res.data);
|
|
28
|
+
toast.success('Content generated');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
toast.error('Failed to generate content');
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
setGenerating(false);
|
|
36
|
+
}
|
|
37
|
+
}, [block, pageTitle, businessName, onUpdateData]);
|
|
38
|
+
return (_jsxs("button", { onClick: handleGenerate, disabled: generating, className: "flex items-center gap-1.5 px-2.5 py-1 text-xs text-primary hover:bg-primary/10 rounded-md transition-colors disabled:opacity-50", title: "Generate content with AI", children: [generating ? (_jsx(Loader2, { size: 12, className: "animate-spin" })) : (_jsx(Sparkles, { size: 12 })), generating ? 'Generating...' : 'AI Fill'] }));
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=AIBlockAssist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AIBlockAssist.js","sourceRoot":"","sources":["../../../src/views/page-builder/AIBlockAssist.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAU1C,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,EACL,SAAS,EACT,YAAY,EACZ,YAAY,GACO;IACnB,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpD,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC5C,aAAa,CAAC,IAAI,CAAC,CAAC;QAEpB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAA0B,8BAA8B,EAAE;gBAChF,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS;oBACnC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO;oBAC/B,WAAW,EAAE;wBACX,SAAS;wBACT,YAAY;qBACb;iBACF,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBACd,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBACpB,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACvB,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;gBAAS,CAAC;YACT,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;IAEnD,OAAO,CACL,kBACE,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAC,iIAAiI,EAC3I,KAAK,EAAC,0BAA0B,aAE/B,UAAU,CAAC,CAAC,CAAC,CACZ,KAAC,OAAO,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,cAAc,GAAG,CAC/C,CAAC,CAAC,CAAC,CACF,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,GAAI,CACvB,EACA,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,IAClC,CACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PageNode } from '@actuate-media/cms-core';
|
|
2
|
+
export interface AIGenerateDialogProps {
|
|
3
|
+
open: boolean;
|
|
4
|
+
onClose: () => void;
|
|
5
|
+
onAccept: (tree: PageNode) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function AIGenerateDialog({ open, onClose, onAccept }: AIGenerateDialogProps): import("react/jsx-runtime").JSX.Element | null;
|
|
8
|
+
//# sourceMappingURL=AIGenerateDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AIGenerateDialog.d.ts","sourceRoot":"","sources":["../../../src/views/page-builder/AIGenerateDialog.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,yBAAyB,CAAC;AAExE,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;CACpC;AAgED,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,qBAAqB,kDAoelF"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useCallback } from 'react';
|
|
4
|
+
import { Sparkles, X, Loader2, Check, ChevronDown, ChevronUp, AlertTriangle, Wand2, FileText, Search, Accessibility, ArrowRight, } from 'lucide-react';
|
|
5
|
+
import { toast } from 'sonner';
|
|
6
|
+
import { cmsApi } from '../../lib/api.js';
|
|
7
|
+
const ALL_STEPS = [
|
|
8
|
+
{
|
|
9
|
+
key: 'structure',
|
|
10
|
+
label: 'Structure',
|
|
11
|
+
icon: _jsx(Wand2, { size: 14 }),
|
|
12
|
+
description: 'Generate page layout and block placement',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
key: 'content',
|
|
16
|
+
label: 'Content',
|
|
17
|
+
icon: _jsx(FileText, { size: 14 }),
|
|
18
|
+
description: 'Write compelling copy for every block',
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
key: 'seo',
|
|
22
|
+
label: 'SEO',
|
|
23
|
+
icon: _jsx(Search, { size: 14 }),
|
|
24
|
+
description: 'Optimize headings, meta tags, and keywords',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
key: 'accessibility',
|
|
28
|
+
label: 'Accessibility',
|
|
29
|
+
icon: _jsx(Accessibility, { size: 14 }),
|
|
30
|
+
description: 'Fix heading hierarchy, alt text, and ARIA',
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
const TONES = [
|
|
34
|
+
{ value: 'professional', label: 'Professional' },
|
|
35
|
+
{ value: 'casual', label: 'Casual' },
|
|
36
|
+
{ value: 'friendly', label: 'Friendly' },
|
|
37
|
+
{ value: 'technical', label: 'Technical' },
|
|
38
|
+
{ value: 'luxury', label: 'Luxury' },
|
|
39
|
+
];
|
|
40
|
+
export function AIGenerateDialog({ open, onClose, onAccept }) {
|
|
41
|
+
const [phase, setPhase] = useState('prompt');
|
|
42
|
+
const [prompt, setPrompt] = useState('');
|
|
43
|
+
const [tone, setTone] = useState('professional');
|
|
44
|
+
const [enabledSteps, setEnabledSteps] = useState(new Set(['structure', 'content', 'seo', 'accessibility']));
|
|
45
|
+
const [showContext, setShowContext] = useState(false);
|
|
46
|
+
const [businessName, setBusiness] = useState('');
|
|
47
|
+
const [industry, setIndustry] = useState('');
|
|
48
|
+
const [phone, setPhone] = useState('');
|
|
49
|
+
const [address, setAddress] = useState('');
|
|
50
|
+
const [services, setServices] = useState('');
|
|
51
|
+
const [currentStep, setCurrentStep] = useState('');
|
|
52
|
+
const [completedSteps, setCompletedSteps] = useState([]);
|
|
53
|
+
const [stepMessage, setStepMessage] = useState('');
|
|
54
|
+
const [result, setResult] = useState(null);
|
|
55
|
+
const [error, setError] = useState(null);
|
|
56
|
+
const [expandedStep, setExpandedStep] = useState(null);
|
|
57
|
+
const toggleStep = (step) => {
|
|
58
|
+
const next = new Set(enabledSteps);
|
|
59
|
+
if (step === 'structure')
|
|
60
|
+
return;
|
|
61
|
+
if (next.has(step)) {
|
|
62
|
+
next.delete(step);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
next.add(step);
|
|
66
|
+
}
|
|
67
|
+
setEnabledSteps(next);
|
|
68
|
+
};
|
|
69
|
+
const resetState = useCallback(() => {
|
|
70
|
+
setPhase('prompt');
|
|
71
|
+
setPrompt('');
|
|
72
|
+
setTone('professional');
|
|
73
|
+
setEnabledSteps(new Set(['structure', 'content', 'seo', 'accessibility']));
|
|
74
|
+
setShowContext(false);
|
|
75
|
+
setBusiness('');
|
|
76
|
+
setIndustry('');
|
|
77
|
+
setPhone('');
|
|
78
|
+
setAddress('');
|
|
79
|
+
setServices('');
|
|
80
|
+
setCurrentStep('');
|
|
81
|
+
setCompletedSteps([]);
|
|
82
|
+
setStepMessage('');
|
|
83
|
+
setResult(null);
|
|
84
|
+
setError(null);
|
|
85
|
+
setExpandedStep(null);
|
|
86
|
+
}, []);
|
|
87
|
+
const handleClose = useCallback(() => {
|
|
88
|
+
resetState();
|
|
89
|
+
onClose();
|
|
90
|
+
}, [resetState, onClose]);
|
|
91
|
+
const handleGenerate = useCallback(async () => {
|
|
92
|
+
if (!prompt.trim()) {
|
|
93
|
+
toast.error('Please describe the page you want to create');
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
setPhase('generating');
|
|
97
|
+
setError(null);
|
|
98
|
+
const steps = ALL_STEPS.filter((s) => enabledSteps.has(s.key)).map((s) => s.key);
|
|
99
|
+
setCurrentStep(steps[0]);
|
|
100
|
+
setStepMessage('Starting generation...');
|
|
101
|
+
const context = {};
|
|
102
|
+
if (businessName)
|
|
103
|
+
context.businessName = businessName;
|
|
104
|
+
if (industry)
|
|
105
|
+
context.industry = industry;
|
|
106
|
+
if (phone)
|
|
107
|
+
context.phone = phone;
|
|
108
|
+
if (address)
|
|
109
|
+
context.address = address;
|
|
110
|
+
if (services)
|
|
111
|
+
context.services = services.split(',').map((s) => s.trim()).filter(Boolean);
|
|
112
|
+
try {
|
|
113
|
+
const res = await cmsApi('/page-builder/generate', {
|
|
114
|
+
method: 'POST',
|
|
115
|
+
body: JSON.stringify({
|
|
116
|
+
prompt: prompt.trim(),
|
|
117
|
+
steps,
|
|
118
|
+
tone,
|
|
119
|
+
context: Object.keys(context).length > 0 ? context : undefined,
|
|
120
|
+
}),
|
|
121
|
+
});
|
|
122
|
+
if (res.error) {
|
|
123
|
+
setError(res.error);
|
|
124
|
+
setPhase('prompt');
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (res.data) {
|
|
128
|
+
setResult(res.data);
|
|
129
|
+
setCompletedSteps(res.data.steps.map((s) => s.step));
|
|
130
|
+
setPhase('review');
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
setError(err instanceof Error ? err.message : 'Generation failed');
|
|
135
|
+
setPhase('prompt');
|
|
136
|
+
}
|
|
137
|
+
}, [prompt, tone, enabledSteps, businessName, industry, phone, address, services]);
|
|
138
|
+
const handleAccept = useCallback(() => {
|
|
139
|
+
if (result?.tree) {
|
|
140
|
+
onAccept(result.tree);
|
|
141
|
+
toast.success('AI-generated page applied');
|
|
142
|
+
handleClose();
|
|
143
|
+
}
|
|
144
|
+
}, [result, onAccept, handleClose]);
|
|
145
|
+
if (!open)
|
|
146
|
+
return null;
|
|
147
|
+
return (_jsxs("div", { className: "fixed inset-0 z-50 flex items-center justify-center", children: [_jsx("div", { className: "absolute inset-0 bg-black/50", onClick: handleClose }), _jsxs("div", { className: "relative bg-card rounded-xl shadow-2xl border border-border w-full max-w-2xl max-h-[85vh] overflow-hidden flex flex-col", children: [_jsxs("div", { className: "flex items-center justify-between px-6 py-4 border-b border-border", children: [_jsxs("div", { className: "flex items-center gap-2.5", children: [_jsx("div", { className: "p-1.5 rounded-lg bg-primary/10", children: _jsx(Sparkles, { size: 18, className: "text-primary" }) }), _jsxs("div", { children: [_jsx("h2", { className: "text-base font-medium text-foreground", children: "AI Page Generator" }), _jsx("p", { className: "text-xs text-muted-foreground", children: "Describe your page and let AI build it" })] })] }), _jsx("button", { onClick: handleClose, className: "p-1.5 rounded-md hover:bg-muted transition-colors", "aria-label": "Close", children: _jsx(X, { size: 16, className: "text-muted-foreground" }) })] }), _jsxs("div", { className: "flex-1 overflow-y-auto p-6", children: [phase === 'prompt' && (_jsxs("div", { className: "space-y-5", children: [error && (_jsxs("div", { className: "flex items-start gap-2.5 p-3 rounded-lg bg-destructive/5 border border-destructive/20", children: [_jsx(AlertTriangle, { size: 16, className: "text-destructive shrink-0 mt-0.5" }), _jsx("p", { className: "text-sm text-destructive", children: error })] })), _jsxs("div", { children: [_jsx("label", { className: "block text-sm font-medium text-foreground mb-1.5", children: "Describe your page" }), _jsx("textarea", { value: prompt, onChange: (e) => setPrompt(e.target.value), placeholder: "e.g. A landing page for a plumbing company with a hero section, service cards, testimonials, and a contact form", rows: 4, className: "w-full px-3 py-2.5 text-sm bg-background border border-border rounded-lg resize-none focus:outline-none focus:ring-2 focus:ring-primary/40 text-foreground placeholder:text-muted-foreground", autoFocus: true })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-sm font-medium text-foreground mb-1.5", children: "Tone" }), _jsx("div", { className: "flex flex-wrap gap-2", children: TONES.map((t) => (_jsx("button", { onClick: () => setTone(t.value), className: `px-3 py-1.5 text-xs rounded-full border transition-colors ${tone === t.value
|
|
148
|
+
? 'border-primary bg-primary/10 text-primary'
|
|
149
|
+
: 'border-border bg-background text-muted-foreground hover:border-primary/40'}`, children: t.label }, t.value))) })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-sm font-medium text-foreground mb-1.5", children: "Generation steps" }), _jsx("div", { className: "space-y-1.5", children: ALL_STEPS.map((step) => (_jsxs("label", { className: `flex items-center gap-3 p-2.5 rounded-lg border transition-colors cursor-pointer ${enabledSteps.has(step.key)
|
|
150
|
+
? 'border-primary/30 bg-primary/5'
|
|
151
|
+
: 'border-border bg-background'} ${step.key === 'structure' ? 'opacity-70 cursor-not-allowed' : 'hover:border-primary/20'}`, children: [_jsx("input", { type: "checkbox", checked: enabledSteps.has(step.key), onChange: () => toggleStep(step.key), disabled: step.key === 'structure', className: "sr-only" }), _jsx("div", { className: `w-5 h-5 rounded flex items-center justify-center shrink-0 ${enabledSteps.has(step.key)
|
|
152
|
+
? 'bg-primary text-white'
|
|
153
|
+
: 'bg-muted border border-border'}`, children: enabledSteps.has(step.key) && _jsx(Check, { size: 12 }) }), _jsxs("div", { className: "flex items-center gap-2 flex-1 min-w-0", children: [_jsx("span", { className: "text-muted-foreground", children: step.icon }), _jsxs("div", { children: [_jsx("span", { className: "text-sm text-foreground", children: step.label }), _jsx("span", { className: "text-xs text-muted-foreground ml-2", children: step.description })] })] })] }, step.key))) })] }), _jsxs("div", { children: [_jsxs("button", { onClick: () => setShowContext(!showContext), className: "flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground transition-colors", children: [showContext ? _jsx(ChevronUp, { size: 14 }) : _jsx(ChevronDown, { size: 14 }), "Business context (optional)"] }), showContext && (_jsxs("div", { className: "mt-3 space-y-3 p-4 bg-muted/50 rounded-lg border border-border", children: [_jsxs("div", { className: "grid grid-cols-2 gap-3", children: [_jsxs("div", { children: [_jsx("label", { className: "block text-xs text-muted-foreground mb-1", children: "Business name" }), _jsx("input", { type: "text", value: businessName, onChange: (e) => setBusiness(e.target.value), className: "w-full px-2.5 py-1.5 text-sm bg-background border border-border rounded-md focus:outline-none focus:ring-2 focus:ring-primary/40 text-foreground" })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-xs text-muted-foreground mb-1", children: "Industry" }), _jsx("input", { type: "text", value: industry, onChange: (e) => setIndustry(e.target.value), className: "w-full px-2.5 py-1.5 text-sm bg-background border border-border rounded-md focus:outline-none focus:ring-2 focus:ring-primary/40 text-foreground" })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-xs text-muted-foreground mb-1", children: "Phone" }), _jsx("input", { type: "text", value: phone, onChange: (e) => setPhone(e.target.value), className: "w-full px-2.5 py-1.5 text-sm bg-background border border-border rounded-md focus:outline-none focus:ring-2 focus:ring-primary/40 text-foreground" })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-xs text-muted-foreground mb-1", children: "Address" }), _jsx("input", { type: "text", value: address, onChange: (e) => setAddress(e.target.value), className: "w-full px-2.5 py-1.5 text-sm bg-background border border-border rounded-md focus:outline-none focus:ring-2 focus:ring-primary/40 text-foreground" })] })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-xs text-muted-foreground mb-1", children: "Services (comma-separated)" }), _jsx("input", { type: "text", value: services, onChange: (e) => setServices(e.target.value), placeholder: "e.g. Web design, SEO, Content marketing", className: "w-full px-2.5 py-1.5 text-sm bg-background border border-border rounded-md focus:outline-none focus:ring-2 focus:ring-primary/40 text-foreground placeholder:text-muted-foreground" })] })] }))] })] })), phase === 'generating' && (_jsxs("div", { className: "py-8 space-y-6", children: [_jsxs("div", { className: "text-center", children: [_jsx(Loader2, { size: 32, className: "animate-spin text-primary mx-auto mb-3" }), _jsx("p", { className: "text-sm font-medium text-foreground", children: stepMessage || 'Generating...' }), _jsx("p", { className: "text-xs text-muted-foreground mt-1", children: "This may take 15-30 seconds" })] }), _jsx("div", { className: "space-y-2", children: ALL_STEPS.filter((s) => enabledSteps.has(s.key)).map((step) => {
|
|
154
|
+
const isComplete = completedSteps.includes(step.key);
|
|
155
|
+
const isCurrent = currentStep === step.key;
|
|
156
|
+
return (_jsxs("div", { className: `flex items-center gap-3 p-3 rounded-lg border transition-colors ${isComplete
|
|
157
|
+
? 'border-primary/30 bg-primary/5'
|
|
158
|
+
: isCurrent
|
|
159
|
+
? 'border-primary/50 bg-primary/10'
|
|
160
|
+
: 'border-border bg-muted/30'}`, children: [_jsx("div", { className: "w-6 h-6 rounded-full flex items-center justify-center shrink-0", children: isComplete ? (_jsx("div", { className: "w-6 h-6 rounded-full bg-primary flex items-center justify-center", children: _jsx(Check, { size: 12, className: "text-white" }) })) : isCurrent ? (_jsx(Loader2, { size: 16, className: "animate-spin text-primary" })) : (_jsx("div", { className: "w-6 h-6 rounded-full bg-muted border border-border" })) }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-muted-foreground", children: step.icon }), _jsx("span", { className: `text-sm ${isCurrent || isComplete ? 'text-foreground' : 'text-muted-foreground'}`, children: step.label })] })] }, step.key));
|
|
161
|
+
}) })] })), phase === 'review' && result && (_jsxs("div", { className: "space-y-5", children: [_jsxs("div", { className: "flex items-center gap-3 p-4 rounded-lg bg-primary/5 border border-primary/20", children: [_jsx("div", { className: "w-10 h-10 rounded-full bg-primary/10 flex items-center justify-center shrink-0", children: _jsx(Sparkles, { size: 18, className: "text-primary" }) }), _jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium text-foreground", children: "Page generated successfully" }), _jsxs("p", { className: "text-xs text-muted-foreground mt-0.5", children: [result.totalTokensUsed.toLocaleString(), " tokens", ' \u00B7 ', (result.totalDurationMs / 1000).toFixed(1), "s", ' \u00B7 ', result.steps.length, " step", result.steps.length !== 1 ? 's' : ''] })] })] }), _jsxs("div", { className: "space-y-2", children: [_jsx("h3", { className: "text-sm font-medium text-foreground", children: "Generation steps" }), result.steps.map((step) => {
|
|
162
|
+
const info = ALL_STEPS.find((s) => s.key === step.step);
|
|
163
|
+
const isExpanded = expandedStep === step.step;
|
|
164
|
+
return (_jsxs("div", { className: "rounded-lg border border-border overflow-hidden", children: [_jsxs("button", { onClick: () => setExpandedStep(isExpanded ? null : step.step), className: "w-full flex items-center gap-3 p-3 hover:bg-muted/50 transition-colors text-left", children: [_jsx("div", { className: "w-6 h-6 rounded-full bg-primary flex items-center justify-center shrink-0", children: _jsx(Check, { size: 12, className: "text-white" }) }), _jsx("span", { className: "text-muted-foreground", children: info?.icon }), _jsx("span", { className: "text-sm text-foreground flex-1", children: info?.label }), _jsxs("span", { className: "text-xs text-muted-foreground", children: [(step.metadata.durationMs / 1000).toFixed(1), "s"] }), isExpanded ? (_jsx(ChevronUp, { size: 14, className: "text-muted-foreground" })) : (_jsx(ChevronDown, { size: 14, className: "text-muted-foreground" }))] }), isExpanded && (_jsxs("div", { className: "px-3 pb-3 border-t border-border pt-2", children: [_jsx("ul", { className: "space-y-1", children: step.metadata.changes.map((change, i) => (_jsxs("li", { className: "flex items-start gap-2 text-xs text-muted-foreground", children: [_jsx(ArrowRight, { size: 10, className: "shrink-0 mt-0.5" }), change] }, i))) }), _jsxs("p", { className: "text-xs text-muted-foreground mt-2", children: ["Tokens: ", step.metadata.tokensUsed.toLocaleString()] })] }))] }, step.step));
|
|
165
|
+
})] }), _jsx("p", { className: "text-xs text-muted-foreground", children: "Review the generated page in the canvas after accepting. You can always undo to revert." })] }))] }), _jsxs("div", { className: "px-6 py-4 border-t border-border flex items-center justify-end gap-3", children: [phase === 'prompt' && (_jsxs(_Fragment, { children: [_jsx("button", { onClick: handleClose, className: "px-4 py-2 text-sm text-muted-foreground hover:text-foreground transition-colors", children: "Cancel" }), _jsxs("button", { onClick: handleGenerate, disabled: !prompt.trim(), className: "flex items-center gap-2 px-4 py-2 text-sm font-medium text-white bg-primary rounded-lg hover:bg-primary/90 transition-colors disabled:opacity-50 disabled:cursor-not-allowed", children: [_jsx(Sparkles, { size: 14 }), "Generate Page"] })] })), phase === 'generating' && (_jsx("button", { onClick: handleClose, className: "px-4 py-2 text-sm text-muted-foreground hover:text-foreground transition-colors", children: "Cancel" })), phase === 'review' && (_jsxs(_Fragment, { children: [_jsx("button", { onClick: () => {
|
|
166
|
+
setPhase('prompt');
|
|
167
|
+
setResult(null);
|
|
168
|
+
}, className: "px-4 py-2 text-sm text-muted-foreground hover:text-foreground transition-colors", children: "Regenerate" }), _jsxs("button", { onClick: handleAccept, className: "flex items-center gap-2 px-4 py-2 text-sm font-medium text-white bg-primary rounded-lg hover:bg-primary/90 transition-colors", children: [_jsx(Check, { size: 14 }), "Accept & Apply"] })] }))] })] })] }));
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=AIGenerateDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AIGenerateDialog.js","sourceRoot":"","sources":["../../../src/views/page-builder/AIGenerateDialog.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { BlockNode } from '@actuate-media/cms-core';
|
|
2
|
+
export interface BlockEditorProps {
|
|
3
|
+
node: BlockNode;
|
|
4
|
+
onUpdateBlock: (id: string, data: Record<string, unknown>) => void;
|
|
5
|
+
onUpdateSettings: (id: string, settings: Record<string, unknown>) => void;
|
|
6
|
+
onRemoveNode: (id: string) => void;
|
|
7
|
+
onDuplicateNode: (id: string) => void;
|
|
8
|
+
config: any;
|
|
9
|
+
}
|
|
10
|
+
export declare function BlockEditor({ node, onUpdateBlock, onUpdateSettings, onRemoveNode, onDuplicateNode, config, }: BlockEditorProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=BlockEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlockEditor.d.ts","sourceRoot":"","sources":["../../../src/views/page-builder/BlockEditor.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,yBAAyB,CAAC;AAI/F,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,SAAS,CAAC;IAChB,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACnE,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC1E,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,MAAM,EAAE,GAAG,CAAC;CACb;AAMD,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,MAAM,GACP,EAAE,gBAAgB,2CA0HlB"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useMemo, useCallback } from 'react';
|
|
4
|
+
import { Star, Copy, Trash2 } from 'lucide-react';
|
|
5
|
+
import * as SwitchPrimitive from '@radix-ui/react-switch';
|
|
6
|
+
import { BlockCatalog } from '@actuate-media/cms-core';
|
|
7
|
+
import { AIBlockAssist } from './AIBlockAssist.js';
|
|
8
|
+
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';
|
|
9
|
+
const LABEL_CLASS = 'text-sm font-medium text-foreground mb-1 block';
|
|
10
|
+
export function BlockEditor({ node, onUpdateBlock, onUpdateSettings, onRemoveNode, onDuplicateNode, config, }) {
|
|
11
|
+
const [confirmDelete, setConfirmDelete] = useState(false);
|
|
12
|
+
const catalog = useMemo(() => new BlockCatalog(), []);
|
|
13
|
+
const blockDef = useMemo(() => catalog.get(node.settings.blockType), [catalog, node.settings.blockType]);
|
|
14
|
+
const handleFieldChange = useCallback((fieldName, value) => {
|
|
15
|
+
onUpdateBlock(node.id, { [fieldName]: value });
|
|
16
|
+
}, [node.id, onUpdateBlock]);
|
|
17
|
+
const handleVariantChange = useCallback((variantName) => {
|
|
18
|
+
onUpdateSettings(node.id, { variant: variantName });
|
|
19
|
+
}, [node.id, onUpdateSettings]);
|
|
20
|
+
const handleDelete = useCallback(() => {
|
|
21
|
+
if (confirmDelete) {
|
|
22
|
+
onRemoveNode(node.id);
|
|
23
|
+
setConfirmDelete(false);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
setConfirmDelete(true);
|
|
27
|
+
}
|
|
28
|
+
}, [confirmDelete, node.id, onRemoveNode]);
|
|
29
|
+
if (!blockDef) {
|
|
30
|
+
return (_jsx("div", { className: "p-4", children: _jsxs("p", { className: "text-sm text-muted-foreground", children: ["Unknown block type: ", _jsx("code", { className: "text-xs", children: node.settings.blockType })] }) }));
|
|
31
|
+
}
|
|
32
|
+
return (_jsxs("div", { className: "flex flex-col h-full", children: [_jsxs("div", { className: "p-4 border-b border-border", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Star, { size: 16, className: "text-muted-foreground" }), _jsx("span", { className: "text-sm font-medium text-foreground flex-1", children: blockDef.label }), _jsx(AIBlockAssist, { block: node, onUpdateData: (data) => onUpdateBlock(node.id, data) })] }), blockDef.description && (_jsx("p", { className: "text-xs text-muted-foreground mt-1", children: blockDef.description }))] }), blockDef.variants.length > 1 && (_jsxs("div", { className: "p-4 border-b border-border", children: [_jsx("p", { className: "text-xs font-medium uppercase tracking-wider text-muted-foreground mb-2", children: "Variant" }), _jsx("div", { className: "grid grid-cols-2 gap-1.5", children: blockDef.variants.map((variant) => (_jsx("button", { type: "button", onClick: () => handleVariantChange(variant.name), className: `px-2 py-1.5 text-xs rounded-md border transition-colors ${node.settings.variant === variant.name
|
|
33
|
+
? 'bg-primary text-primary-foreground border-primary'
|
|
34
|
+
: 'bg-background border-input text-foreground hover:bg-accent'}`, children: variant.label }, variant.name))) })] })), _jsxs("div", { className: "space-y-4 p-4 flex-1", children: [_jsx("p", { className: "text-xs font-medium uppercase tracking-wider text-muted-foreground mb-2", children: "Fields" }), Object.entries(blockDef.fields).map(([fieldName, fieldDef]) => (_jsx(FieldRenderer, { name: fieldName, definition: fieldDef, value: node.data[fieldName], onChange: (value) => handleFieldChange(fieldName, value) }, fieldName)))] }), _jsxs("div", { className: "p-4 border-t border-border space-y-2", children: [_jsxs("button", { type: "button", onClick: () => onDuplicateNode(node.id), className: "w-full flex items-center justify-center gap-2 px-3 py-2 text-sm font-medium bg-background border border-input rounded-md hover:bg-accent transition-colors", children: [_jsx(Copy, { size: 14 }), "Duplicate"] }), _jsxs("button", { type: "button", onClick: handleDelete, onBlur: () => setConfirmDelete(false), className: `w-full flex items-center justify-center gap-2 px-3 py-2 text-sm font-medium rounded-md transition-colors ${confirmDelete
|
|
35
|
+
? 'bg-destructive text-destructive-foreground'
|
|
36
|
+
: 'bg-background border border-destructive text-destructive hover:bg-destructive/10'}`, children: [_jsx(Trash2, { size: 14 }), confirmDelete ? 'Click again to confirm' : 'Delete'] })] })] }));
|
|
37
|
+
}
|
|
38
|
+
function FieldRenderer({ name, definition, value, onChange }) {
|
|
39
|
+
const label = definition.label || name;
|
|
40
|
+
switch (definition.type) {
|
|
41
|
+
case 'text':
|
|
42
|
+
return (_jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: label }), _jsx("input", { type: "text", value: value ?? '', onChange: (e) => onChange(e.target.value), placeholder: definition.admin?.placeholder, className: INPUT_CLASS })] }));
|
|
43
|
+
case 'richText':
|
|
44
|
+
return (_jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: label }), _jsx("textarea", { value: value ?? '', onChange: (e) => onChange(e.target.value), placeholder: definition.admin?.placeholder, rows: 4, className: `${INPUT_CLASS} resize-y` })] }));
|
|
45
|
+
case 'url':
|
|
46
|
+
return (_jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: label }), _jsx("input", { type: "url", value: value ?? '', onChange: (e) => onChange(e.target.value), placeholder: definition.admin?.placeholder ?? 'https://', className: INPUT_CLASS })] }));
|
|
47
|
+
case 'number':
|
|
48
|
+
return (_jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: label }), _jsx("input", { type: "number", value: value ?? '', onChange: (e) => onChange(e.target.value ? Number(e.target.value) : undefined), min: definition.min, max: definition.max, step: definition.step, className: INPUT_CLASS })] }));
|
|
49
|
+
case 'boolean':
|
|
50
|
+
return (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("label", { className: "text-sm font-medium text-foreground", children: label }), _jsx(SwitchPrimitive.Root, { checked: !!value, onCheckedChange: (checked) => onChange(checked), className: "w-9 h-5 bg-input rounded-full relative data-[state=checked]:bg-primary transition-colors", "aria-label": label, children: _jsx(SwitchPrimitive.Thumb, { className: "block h-3.5 w-3.5 rounded-full bg-background shadow-sm transition-transform translate-x-0.5 data-[state=checked]:translate-x-[18px]" }) })] }));
|
|
51
|
+
case 'media':
|
|
52
|
+
return (_jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: label }), _jsxs("div", { className: "flex gap-2", children: [_jsx("input", { type: "text", value: value ?? '', onChange: (e) => onChange(e.target.value), placeholder: "Select media...", className: `${INPUT_CLASS} flex-1` }), _jsx("button", { type: "button", className: "px-3 py-2 text-xs font-medium bg-accent text-foreground border border-input rounded-md hover:bg-accent/80 transition-colors", children: "Browse" })] })] }));
|
|
53
|
+
case 'select':
|
|
54
|
+
return (_jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: label }), _jsxs("select", { value: value ?? '', onChange: (e) => onChange(e.target.value), className: INPUT_CLASS, children: [_jsx("option", { value: "", children: "Select..." }), definition.options.map((opt) => (_jsx("option", { value: opt.value, children: opt.label }, opt.value)))] })] }));
|
|
55
|
+
case 'array':
|
|
56
|
+
return (_jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: label }), _jsx("div", { className: "px-3 py-2 text-sm bg-muted border border-input rounded-md text-muted-foreground", children: Array.isArray(value) ? `${value.length} items` : '0 items' })] }));
|
|
57
|
+
case 'relationship':
|
|
58
|
+
return (_jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: label }), _jsx("input", { type: "text", value: value ?? '', onChange: (e) => onChange(e.target.value), placeholder: "Select relationship...", className: INPUT_CLASS })] }));
|
|
59
|
+
case 'email':
|
|
60
|
+
return (_jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: label }), _jsx("input", { type: "email", value: value ?? '', onChange: (e) => onChange(e.target.value), placeholder: definition.admin?.placeholder ?? 'email@example.com', className: INPUT_CLASS })] }));
|
|
61
|
+
case 'color':
|
|
62
|
+
return (_jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: label }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("input", { type: "color", value: value ?? '#000000', onChange: (e) => onChange(e.target.value), className: "h-9 w-9 rounded-md border border-input cursor-pointer" }), _jsx("input", { type: "text", value: value ?? '', onChange: (e) => onChange(e.target.value), placeholder: "#000000", className: `${INPUT_CLASS} flex-1` })] })] }));
|
|
63
|
+
default:
|
|
64
|
+
return (_jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: label }), _jsx("input", { type: "text", value: String(value ?? ''), onChange: (e) => onChange(e.target.value), className: INPUT_CLASS })] }));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=BlockEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlockEditor.js","sourceRoot":"","sources":["../../../src/views/page-builder/BlockEditor.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface BlockPickerProps {
|
|
2
|
+
open: boolean;
|
|
3
|
+
onClose: () => void;
|
|
4
|
+
onSelect: (blockType: string, variant?: string) => void;
|
|
5
|
+
}
|
|
6
|
+
export declare function BlockPicker({ open, onClose, onSelect }: BlockPickerProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=BlockPicker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlockPicker.d.ts","sourceRoot":"","sources":["../../../src/views/page-builder/BlockPicker.tsx"],"names":[],"mappings":"AAyBA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACzD;AAmBD,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,gBAAgB,2CAmHxE"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useMemo, useRef, useEffect, useCallback } from 'react';
|
|
4
|
+
import * as Dialog from '@radix-ui/react-dialog';
|
|
5
|
+
import { Star, Type, Image, LayoutGrid, MousePointer, Play, Grid, HelpCircle, FileText, Code, Box, X, ArrowLeft, Search, Check, } from 'lucide-react';
|
|
6
|
+
import { BlockCatalog } from '@actuate-media/cms-core';
|
|
7
|
+
const iconMap = {
|
|
8
|
+
Star,
|
|
9
|
+
Type,
|
|
10
|
+
Image,
|
|
11
|
+
LayoutGrid,
|
|
12
|
+
MousePointer,
|
|
13
|
+
Play,
|
|
14
|
+
Grid,
|
|
15
|
+
HelpCircle,
|
|
16
|
+
FileText,
|
|
17
|
+
Code,
|
|
18
|
+
};
|
|
19
|
+
function resolveIcon(name) {
|
|
20
|
+
return iconMap[name] ?? Box;
|
|
21
|
+
}
|
|
22
|
+
export function BlockPicker({ open, onClose, onSelect }) {
|
|
23
|
+
const [search, setSearch] = useState('');
|
|
24
|
+
const [selectedBlock, setSelectedBlock] = useState(null);
|
|
25
|
+
const searchInputRef = useRef(null);
|
|
26
|
+
const variantListRef = useRef(null);
|
|
27
|
+
const catalog = useMemo(() => new BlockCatalog(), []);
|
|
28
|
+
const allBlocks = useMemo(() => catalog.getAll(), [catalog]);
|
|
29
|
+
const filteredBlocks = useMemo(() => {
|
|
30
|
+
if (!search.trim())
|
|
31
|
+
return allBlocks;
|
|
32
|
+
const q = search.toLowerCase();
|
|
33
|
+
return allBlocks.filter((block) => block.label.toLowerCase().includes(q) ||
|
|
34
|
+
(block.description?.toLowerCase().includes(q) ?? false));
|
|
35
|
+
}, [allBlocks, search]);
|
|
36
|
+
const resetState = useCallback(() => {
|
|
37
|
+
setSearch('');
|
|
38
|
+
setSelectedBlock(null);
|
|
39
|
+
}, []);
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
if (open) {
|
|
42
|
+
resetState();
|
|
43
|
+
}
|
|
44
|
+
}, [open, resetState]);
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
if (open && !selectedBlock) {
|
|
47
|
+
const timer = setTimeout(() => searchInputRef.current?.focus(), 50);
|
|
48
|
+
return () => clearTimeout(timer);
|
|
49
|
+
}
|
|
50
|
+
}, [open, selectedBlock]);
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
if (selectedBlock && variantListRef.current) {
|
|
53
|
+
const firstButton = variantListRef.current.querySelector('button[data-variant]');
|
|
54
|
+
firstButton?.focus();
|
|
55
|
+
}
|
|
56
|
+
}, [selectedBlock]);
|
|
57
|
+
function handleBlockClick(block) {
|
|
58
|
+
if (block.variants.length === 1) {
|
|
59
|
+
onSelect(block.type, block.variants[0].name);
|
|
60
|
+
onClose();
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
setSelectedBlock(block);
|
|
64
|
+
}
|
|
65
|
+
function handleVariantClick(variant) {
|
|
66
|
+
if (!selectedBlock)
|
|
67
|
+
return;
|
|
68
|
+
onSelect(selectedBlock.type, variant.name);
|
|
69
|
+
onClose();
|
|
70
|
+
}
|
|
71
|
+
function handleBack() {
|
|
72
|
+
setSelectedBlock(null);
|
|
73
|
+
}
|
|
74
|
+
function handleKeyDownOnGrid(e) {
|
|
75
|
+
if (e.key === 'Escape') {
|
|
76
|
+
e.stopPropagation();
|
|
77
|
+
onClose();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function handleKeyDownOnVariants(e) {
|
|
81
|
+
if (e.key === 'Escape') {
|
|
82
|
+
e.stopPropagation();
|
|
83
|
+
handleBack();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return (_jsx(Dialog.Root, { open: open, onOpenChange: (isOpen) => !isOpen && onClose(), children: _jsxs(Dialog.Portal, { children: [_jsx(Dialog.Overlay, { className: "fixed inset-0 bg-black/50 z-50 motion-safe:animate-in motion-safe:fade-in-0" }), _jsx(Dialog.Content, { className: "fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 bg-card rounded-xl shadow-2xl border border-border z-50 w-full max-w-2xl max-h-[80vh] overflow-hidden flex flex-col", "aria-describedby": undefined, onEscapeKeyDown: () => {
|
|
87
|
+
if (selectedBlock) {
|
|
88
|
+
handleBack();
|
|
89
|
+
}
|
|
90
|
+
}, children: selectedBlock ? (_jsx(VariantView, { block: selectedBlock, variantListRef: variantListRef, onBack: handleBack, onVariantClick: handleVariantClick, onKeyDown: handleKeyDownOnVariants })) : (_jsx(BlockTypeGrid, { search: search, filteredBlocks: filteredBlocks, searchInputRef: searchInputRef, onSearchChange: setSearch, onBlockClick: handleBlockClick, onClose: onClose, onKeyDown: handleKeyDownOnGrid })) })] }) }));
|
|
91
|
+
}
|
|
92
|
+
function BlockTypeGrid({ search, filteredBlocks, searchInputRef, onSearchChange, onBlockClick, onClose, onKeyDown, }) {
|
|
93
|
+
return (_jsxs("div", { className: "flex flex-col h-full", onKeyDown: onKeyDown, children: [_jsxs("div", { className: "flex items-center justify-between gap-3 px-5 pt-5 pb-3", children: [_jsx(Dialog.Title, { className: "text-lg font-medium text-foreground", children: "Add Block" }), _jsx(Dialog.Close, { asChild: true, children: _jsx("button", { type: "button", className: "p-1.5 rounded-md text-muted-foreground hover:text-foreground hover:bg-accent transition-colors", "aria-label": "Close", children: _jsx(X, { size: 18 }) }) })] }), _jsx("div", { className: "px-5 pb-3", children: _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground pointer-events-none", size: 16 }), _jsx("input", { ref: searchInputRef, type: "text", placeholder: "Search blocks...", value: search, onChange: (e) => onSearchChange(e.target.value), className: "w-full pl-9 pr-3 py-2 text-sm bg-background border border-input rounded-md focus:outline-none focus:ring-2 focus:ring-ring", "aria-label": "Search block types" })] }) }), _jsx("div", { className: "flex-1 overflow-y-auto px-5 pb-5", children: filteredBlocks.length === 0 ? (_jsxs("div", { className: "flex flex-col items-center justify-center py-12 text-center", children: [_jsx(Search, { size: 24, className: "text-muted-foreground mb-2" }), _jsxs("p", { className: "text-sm text-muted-foreground", children: ["No blocks match \u201C", search, "\u201D"] })] })) : (_jsx("div", { className: "grid grid-cols-2 gap-3", role: "list", "aria-label": "Available block types", children: filteredBlocks.map((block) => {
|
|
94
|
+
const Icon = resolveIcon(block.icon);
|
|
95
|
+
return (_jsxs("button", { type: "button", role: "listitem", onClick: () => onBlockClick(block), className: "p-4 border border-border rounded-lg hover:border-primary cursor-pointer transition-colors bg-card text-left flex items-start gap-3 group focus:outline-none focus:ring-2 focus:ring-ring", children: [_jsx("div", { className: "shrink-0 w-9 h-9 rounded-md bg-accent flex items-center justify-center text-foreground group-hover:bg-primary/10 group-hover:text-primary transition-colors", children: _jsx(Icon, { size: 18 }) }), _jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "text-sm font-medium text-foreground truncate", children: block.label }), block.description && (_jsx("p", { className: "text-xs text-muted-foreground mt-0.5 line-clamp-2", children: block.description }))] })] }, block.type));
|
|
96
|
+
}) })) })] }));
|
|
97
|
+
}
|
|
98
|
+
function VariantView({ block, variantListRef, onBack, onVariantClick, onKeyDown, }) {
|
|
99
|
+
const Icon = resolveIcon(block.icon);
|
|
100
|
+
return (_jsxs("div", { className: "flex flex-col h-full", onKeyDown: onKeyDown, children: [_jsxs("div", { className: "flex items-center gap-3 px-5 pt-5 pb-3", children: [_jsx("button", { type: "button", onClick: onBack, className: "p-1.5 rounded-md text-muted-foreground hover:text-foreground hover:bg-accent transition-colors", "aria-label": "Back to block types", children: _jsx(ArrowLeft, { size: 18 }) }), _jsxs("div", { className: "flex items-center gap-2 min-w-0", children: [_jsx(Icon, { size: 18, className: "text-foreground shrink-0" }), _jsx("h2", { className: "text-lg font-medium text-foreground truncate", children: block.label })] })] }), block.description && (_jsx("p", { className: "text-sm text-muted-foreground px-5 pb-3", children: block.description })), _jsx("div", { className: "flex-1 overflow-y-auto px-5 pb-5", ref: variantListRef, children: _jsx("div", { className: "space-y-2", role: "list", "aria-label": `${block.label} variants`, children: block.variants.map((variant, index) => (_jsx("button", { type: "button", role: "listitem", "data-variant": variant.name, onClick: () => onVariantClick(variant), className: "w-full p-4 border border-border rounded-lg hover:border-primary cursor-pointer transition-colors bg-card text-left flex items-center gap-3 group focus:outline-none focus:ring-2 focus:ring-ring", children: _jsxs("div", { className: "flex-1 min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("p", { className: "text-sm font-medium text-foreground", children: variant.label }), index === 0 && (_jsxs("span", { className: "inline-flex items-center gap-1 text-xs text-primary bg-primary/10 px-1.5 py-0.5 rounded", children: [_jsx(Check, { size: 10 }), "Default"] }))] }), _jsx("p", { className: "text-xs text-muted-foreground mt-0.5", children: variant.description })] }) }, variant.name))) }) })] }));
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=BlockPicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlockPicker.js","sourceRoot":"","sources":["../../../src/views/page-builder/BlockPicker.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DeviceMode } from '../../hooks/useBuilderState.js';
|
|
2
|
+
export interface BottomBarProps {
|
|
3
|
+
deviceMode: DeviceMode;
|
|
4
|
+
showGridOverlay: boolean;
|
|
5
|
+
onAddSection: () => void;
|
|
6
|
+
onToggleGrid: (show: boolean) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function BottomBar({ deviceMode, showGridOverlay, onAddSection, onToggleGrid, }: BottomBarProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=BottomBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BottomBar.d.ts","sourceRoot":"","sources":["../../../src/views/page-builder/BottomBar.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,UAAU,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC;AAQD,wBAAgB,SAAS,CAAC,EACxB,UAAU,EACV,eAAe,EACf,YAAY,EACZ,YAAY,GACb,EAAE,cAAc,2CAuChB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Plus, Grid3X3 } from 'lucide-react';
|
|
4
|
+
import * as Switch from '@radix-ui/react-switch';
|
|
5
|
+
const DEVICE_LABELS = {
|
|
6
|
+
desktop: '100%',
|
|
7
|
+
tablet: '768px',
|
|
8
|
+
mobile: '375px',
|
|
9
|
+
};
|
|
10
|
+
export function BottomBar({ deviceMode, showGridOverlay, onAddSection, onToggleGrid, }) {
|
|
11
|
+
return (_jsxs("div", { className: "h-10 bg-card border-t border-border flex items-center px-4 gap-4 shrink-0", role: "toolbar", "aria-label": "Builder actions", children: [_jsxs("button", { onClick: onAddSection, className: "flex items-center gap-1.5 px-3 py-2 text-sm text-muted-foreground hover:text-foreground transition-colors", "aria-label": "Add a new section", children: [_jsx(Plus, { size: 14 }), _jsx("span", { children: "Add Section" })] }), _jsx("div", { className: "w-px h-5 bg-border" }), _jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [_jsx(Grid3X3, { size: 14, className: "text-muted-foreground" }), _jsx(Switch.Root, { checked: showGridOverlay, onCheckedChange: onToggleGrid, className: "w-8 h-[18px] bg-input-background rounded-full relative data-[state=checked]:bg-primary transition-colors", "aria-label": "Toggle grid overlay", children: _jsx(Switch.Thumb, { className: "block w-3.5 h-3.5 bg-background rounded-full shadow-sm transition-transform translate-x-0.5 data-[state=checked]:translate-x-[14px]" }) }), _jsx("span", { className: "text-xs text-muted-foreground", children: "Grid" })] }), _jsx("div", { className: "flex-1" }), _jsx("span", { className: "text-xs text-muted-foreground tabular-nums", children: DEVICE_LABELS[deviceMode] })] }));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=BottomBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BottomBar.js","sourceRoot":"","sources":["../../../src/views/page-builder/BottomBar.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,MAAM,MAAM,wBAAwB,CAAC;AAUjD,MAAM,aAAa,GAA+B;IAChD,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,OAAO;IACf,MAAM,EAAE,OAAO;CAChB,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,EACxB,UAAU,EACV,eAAe,EACf,YAAY,EACZ,YAAY,GACG;IACf,OAAO,CACL,eAAK,SAAS,EAAC,2EAA2E,EAAC,IAAI,EAAC,SAAS,gBAAY,iBAAiB,aAEpI,kBACE,OAAO,EAAE,YAAY,EACrB,SAAS,EAAC,2GAA2G,gBAC1G,mBAAmB,aAE9B,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,GAAI,EAClB,yCAAwB,IACjB,EAGT,cAAK,SAAS,EAAC,oBAAoB,GAAG,EAGtC,iBAAO,SAAS,EAAC,wCAAwC,aACvD,KAAC,OAAO,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,uBAAuB,GAAG,EACvD,KAAC,MAAM,CAAC,IAAI,IACV,OAAO,EAAE,eAAe,EACxB,eAAe,EAAE,YAAY,EAC7B,SAAS,EAAC,0GAA0G,gBACzG,qBAAqB,YAEhC,KAAC,MAAM,CAAC,KAAK,IAAC,SAAS,EAAC,qIAAqI,GAAG,GACpJ,EACd,eAAM,SAAS,EAAC,+BAA+B,qBAAY,IACrD,EAGR,cAAK,SAAS,EAAC,QAAQ,GAAG,EAG1B,eAAM,SAAS,EAAC,4CAA4C,YACzD,aAAa,CAAC,UAAU,CAAC,GACrB,IACH,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { DeviceMode, PageSettings } from '../../hooks/useBuilderState.js';
|
|
2
|
+
export interface BuilderToolbarProps {
|
|
3
|
+
collectionSlug: string;
|
|
4
|
+
pageSettings: PageSettings;
|
|
5
|
+
status: 'DRAFT' | 'PUBLISHED' | 'SCHEDULED';
|
|
6
|
+
dirty: boolean;
|
|
7
|
+
saving: boolean;
|
|
8
|
+
canUndo: boolean;
|
|
9
|
+
canRedo: boolean;
|
|
10
|
+
deviceMode: DeviceMode;
|
|
11
|
+
onNavigate: (path: string) => void;
|
|
12
|
+
onTitleChange: (title: string) => void;
|
|
13
|
+
onUndo: () => void;
|
|
14
|
+
onRedo: () => void;
|
|
15
|
+
onDeviceMode: (mode: DeviceMode) => void;
|
|
16
|
+
onSave: () => void;
|
|
17
|
+
onPublish: () => void;
|
|
18
|
+
onOpenAI?: () => void;
|
|
19
|
+
}
|
|
20
|
+
export declare function BuilderToolbar({ collectionSlug, pageSettings, status, dirty, saving, canUndo, canRedo, deviceMode, onNavigate, onTitleChange, onUndo, onRedo, onDeviceMode, onSave, onPublish, onOpenAI, }: BuilderToolbarProps): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
//# sourceMappingURL=BuilderToolbar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BuilderToolbar.d.ts","sourceRoot":"","sources":["../../../src/views/page-builder/BuilderToolbar.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE/E,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,WAAW,CAAC;IAC5C,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,YAAY,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IACzC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAQD,wBAAgB,cAAc,CAAC,EAC7B,cAAc,EACd,YAAY,EACZ,MAAM,EACN,KAAK,EACL,MAAM,EACN,OAAO,EACP,OAAO,EACP,UAAU,EACV,UAAU,EACV,aAAa,EACb,MAAM,EACN,MAAM,EACN,YAAY,EACZ,MAAM,EACN,SAAS,EACT,QAAQ,GACT,EAAE,mBAAmB,2CAsIrB"}
|