@actuate-media/cms-admin 0.9.0 → 0.11.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/dist/AdminRoot.d.ts.map +1 -1
- package/dist/AdminRoot.js +8 -5
- package/dist/AdminRoot.js.map +1 -1
- package/dist/__tests__/layout/primitives.test.d.ts +2 -0
- package/dist/__tests__/layout/primitives.test.d.ts.map +1 -0
- package/dist/__tests__/layout/primitives.test.js +34 -0
- package/dist/__tests__/layout/primitives.test.js.map +1 -0
- package/dist/__tests__/lib/cv.test.d.ts +2 -0
- package/dist/__tests__/lib/cv.test.d.ts.map +1 -0
- package/dist/__tests__/lib/cv.test.js +66 -0
- package/dist/__tests__/lib/cv.test.js.map +1 -0
- package/dist/actuate-admin.css +1 -1
- package/dist/assets/actuate-logo.d.ts +36 -0
- package/dist/assets/actuate-logo.d.ts.map +1 -0
- package/dist/assets/actuate-logo.js +15 -0
- package/dist/assets/actuate-logo.js.map +1 -0
- package/dist/components/Breadcrumbs.js +2 -2
- package/dist/components/CommandPalette.js +10 -10
- package/dist/components/ContentOverviewChart.js +3 -3
- package/dist/components/ErrorBoundary.js +1 -1
- package/dist/components/FocalPointPicker.js +2 -2
- package/dist/components/FolderTree.js +20 -20
- package/dist/components/LivePreview.js +3 -3
- package/dist/components/LocaleSwitcher.js +1 -1
- package/dist/components/MediaPickerModal.js +4 -4
- package/dist/components/PresenceIndicator.js +1 -1
- package/dist/components/SEOConfigPanel.d.ts +2 -0
- package/dist/components/SEOConfigPanel.d.ts.map +1 -0
- package/dist/components/SEOConfigPanel.js +174 -0
- package/dist/components/SEOConfigPanel.js.map +1 -0
- package/dist/components/SEOPanel.js +9 -9
- package/dist/components/SEOPerformance.js +2 -2
- package/dist/components/SchedulePublishDialog.d.ts +18 -0
- package/dist/components/SchedulePublishDialog.d.ts.map +1 -0
- package/dist/components/SchedulePublishDialog.js +106 -0
- package/dist/components/SchedulePublishDialog.js.map +1 -0
- package/dist/components/SharePreviewLinkDialog.d.ts +17 -0
- package/dist/components/SharePreviewLinkDialog.d.ts.map +1 -0
- package/dist/components/SharePreviewLinkDialog.js +83 -0
- package/dist/components/SharePreviewLinkDialog.js.map +1 -0
- package/dist/components/TipTapEditor.js +5 -5
- package/dist/components/VersionHistory.js +2 -2
- package/dist/components/ui/Badge.d.ts +33 -3
- package/dist/components/ui/Badge.d.ts.map +1 -1
- package/dist/components/ui/Badge.js +42 -8
- package/dist/components/ui/Badge.js.map +1 -1
- package/dist/components/ui/Button.d.ts +19 -8
- package/dist/components/ui/Button.d.ts.map +1 -1
- package/dist/components/ui/Button.js +35 -14
- package/dist/components/ui/Button.js.map +1 -1
- package/dist/components/ui/Card.d.ts +26 -0
- package/dist/components/ui/Card.d.ts.map +1 -0
- package/dist/components/ui/Card.js +45 -0
- package/dist/components/ui/Card.js.map +1 -0
- package/dist/components/ui/DataTable.js +1 -1
- package/dist/components/ui/Input.d.ts +15 -0
- package/dist/components/ui/Input.d.ts.map +1 -0
- package/dist/components/ui/Input.js +23 -0
- package/dist/components/ui/Input.js.map +1 -0
- package/dist/components/ui/SearchInput.js +1 -1
- package/dist/components/ui/Select.d.ts +16 -0
- package/dist/components/ui/Select.d.ts.map +1 -0
- package/dist/components/ui/Select.js +25 -0
- package/dist/components/ui/Select.js.map +1 -0
- package/dist/components/ui/Toast.js +1 -1
- package/dist/components/ui/index.d.ts +10 -4
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +5 -2
- package/dist/components/ui/index.js.map +1 -1
- package/dist/fields/BlockBuilderField.js +3 -3
- package/dist/fields/DateField.js +1 -1
- package/dist/fields/RelationshipField.js +3 -3
- package/dist/fields/TextField.js +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/layout/Header.js +1 -1
- package/dist/layout/Layout.d.ts +14 -0
- package/dist/layout/Layout.d.ts.map +1 -1
- package/dist/layout/Layout.js +17 -11
- package/dist/layout/Layout.js.map +1 -1
- package/dist/layout/Sidebar.d.ts.map +1 -1
- package/dist/layout/Sidebar.js +21 -11
- package/dist/layout/Sidebar.js.map +1 -1
- package/dist/layout/primitives/AdminShell.d.ts +43 -0
- package/dist/layout/primitives/AdminShell.d.ts.map +1 -0
- package/dist/layout/primitives/AdminShell.js +51 -0
- package/dist/layout/primitives/AdminShell.js.map +1 -0
- package/dist/layout/primitives/Box.d.ts +19 -0
- package/dist/layout/primitives/Box.d.ts.map +1 -0
- package/dist/layout/primitives/Box.js +12 -0
- package/dist/layout/primitives/Box.js.map +1 -0
- package/dist/layout/primitives/Cluster.d.ts +27 -0
- package/dist/layout/primitives/Cluster.d.ts.map +1 -0
- package/dist/layout/primitives/Cluster.js +37 -0
- package/dist/layout/primitives/Cluster.js.map +1 -0
- package/dist/layout/primitives/Grid.d.ts +45 -0
- package/dist/layout/primitives/Grid.d.ts.map +1 -0
- package/dist/layout/primitives/Grid.js +59 -0
- package/dist/layout/primitives/Grid.js.map +1 -0
- package/dist/layout/primitives/PageContainer.d.ts +36 -0
- package/dist/layout/primitives/PageContainer.d.ts.map +1 -0
- package/dist/layout/primitives/PageContainer.js +41 -0
- package/dist/layout/primitives/PageContainer.js.map +1 -0
- package/dist/layout/primitives/Split.d.ts +34 -0
- package/dist/layout/primitives/Split.d.ts.map +1 -0
- package/dist/layout/primitives/Split.js +27 -0
- package/dist/layout/primitives/Split.js.map +1 -0
- package/dist/layout/primitives/Stack.d.ts +23 -0
- package/dist/layout/primitives/Stack.d.ts.map +1 -0
- package/dist/layout/primitives/Stack.js +34 -0
- package/dist/layout/primitives/Stack.js.map +1 -0
- package/dist/layout/primitives/index.d.ts +30 -0
- package/dist/layout/primitives/index.d.ts.map +1 -0
- package/dist/layout/primitives/index.js +22 -0
- package/dist/layout/primitives/index.js.map +1 -0
- package/dist/layout/primitives/tokens.d.ts +48 -0
- package/dist/layout/primitives/tokens.d.ts.map +1 -0
- package/dist/layout/primitives/tokens.js +54 -0
- package/dist/layout/primitives/tokens.js.map +1 -0
- package/dist/lib/cv.d.ts +53 -0
- package/dist/lib/cv.d.ts.map +1 -0
- package/dist/lib/cv.js +39 -0
- package/dist/lib/cv.js.map +1 -0
- package/dist/views/ApiKeys.d.ts.map +1 -1
- package/dist/views/ApiKeys.js +13 -11
- package/dist/views/ApiKeys.js.map +1 -1
- package/dist/views/CollectionList.js +8 -8
- package/dist/views/Dashboard.d.ts.map +1 -1
- package/dist/views/Dashboard.js +333 -78
- package/dist/views/Dashboard.js.map +1 -1
- package/dist/views/DocumentEdit.d.ts.map +1 -1
- package/dist/views/DocumentEdit.js +17 -5
- package/dist/views/DocumentEdit.js.map +1 -1
- package/dist/views/ForgotPassword.js +2 -2
- package/dist/views/FormEditor.js +5 -5
- package/dist/views/FormSubmissions.js +6 -6
- package/dist/views/Forms.js +2 -2
- package/dist/views/Login.d.ts +16 -1
- package/dist/views/Login.d.ts.map +1 -1
- package/dist/views/Login.js +17 -7
- package/dist/views/Login.js.map +1 -1
- package/dist/views/MediaBrowser.js +16 -16
- package/dist/views/PageEditor.js +2 -2
- package/dist/views/Pages.js +10 -10
- package/dist/views/PostEditor.js +2 -2
- package/dist/views/Posts.js +4 -4
- package/dist/views/Redirects.js +4 -4
- package/dist/views/ResetPassword.js +2 -2
- package/dist/views/SEO.js +6 -6
- package/dist/views/ScriptTagEditor.js +4 -4
- package/dist/views/ScriptTags.js +2 -2
- package/dist/views/Settings.d.ts.map +1 -1
- package/dist/views/Settings.js +9 -8
- package/dist/views/Settings.js.map +1 -1
- package/dist/views/SetupWizard.js +2 -2
- package/dist/views/Users.js +4 -4
- package/dist/views/page-builder/AIBlockAssist.js +1 -1
- package/dist/views/page-builder/AIGenerateDialog.js +10 -10
- package/dist/views/page-builder/BlockEditor.js +10 -10
- package/dist/views/page-builder/BlockPicker.js +4 -4
- package/dist/views/page-builder/BottomBar.js +1 -1
- package/dist/views/page-builder/BuilderToolbar.js +2 -2
- package/dist/views/page-builder/ContextPanel.js +2 -2
- package/dist/views/page-builder/DesignScore.js +9 -9
- package/dist/views/page-builder/NodeSettings.js +8 -8
- package/dist/views/page-builder/PageBuilder.js +3 -3
- package/dist/views/page-builder/PageSettings.js +1 -1
- package/dist/views/page-builder/PageTemplates.js +2 -2
- package/dist/views/page-builder/SEOPanel.js +13 -13
- package/dist/views/page-builder/SavedSections.js +5 -5
- package/dist/views/page-builder/TemplatePicker.js +2 -2
- package/dist/views/page-builder/block-renderers/CTAPreview.js +5 -5
- package/dist/views/page-builder/block-renderers/CardsPreview.js +1 -1
- package/dist/views/page-builder/block-renderers/CodePreview.js +1 -1
- package/dist/views/page-builder/block-renderers/FAQPreview.js +3 -3
- package/dist/views/page-builder/block-renderers/FallbackPreview.js +1 -1
- package/dist/views/page-builder/block-renderers/FormPreview.js +3 -3
- package/dist/views/page-builder/block-renderers/GalleryPreview.js +5 -5
- package/dist/views/page-builder/block-renderers/HeroPreview.js +3 -3
- package/dist/views/page-builder/block-renderers/ImagePreview.js +3 -3
- package/dist/views/page-builder/block-renderers/TextPreview.js +3 -3
- package/dist/views/page-builder/block-renderers/VideoPreview.js +4 -4
- package/dist/views/page-builder/canvas/BlockRenderer.js +1 -1
- package/dist/views/page-builder/canvas/BuilderCanvas.js +3 -3
- package/dist/views/page-builder/canvas/ColumnRenderer.js +2 -2
- package/dist/views/page-builder/canvas/ContainerRenderer.js +2 -2
- package/dist/views/page-builder/canvas/RowRenderer.js +2 -2
- package/dist/views/page-builder/canvas/SectionRenderer.js +2 -2
- package/package.json +6 -2
- package/src/AdminRoot.tsx +21 -11
- package/src/__tests__/layout/primitives.test.ts +37 -0
- package/src/__tests__/lib/cv.test.ts +74 -0
- package/src/assets/actuate-logo.tsx +72 -0
- package/src/components/Breadcrumbs.tsx +6 -6
- package/src/components/CommandPalette.tsx +34 -34
- package/src/components/ContentOverviewChart.tsx +3 -3
- package/src/components/ErrorBoundary.tsx +3 -3
- package/src/components/FocalPointPicker.tsx +4 -4
- package/src/components/FolderTree.tsx +38 -38
- package/src/components/LivePreview.tsx +16 -16
- package/src/components/LocaleSwitcher.tsx +7 -7
- package/src/components/MediaPickerModal.tsx +21 -21
- package/src/components/PresenceIndicator.tsx +2 -2
- package/src/components/SEOConfigPanel.tsx +582 -0
- package/src/components/SEOPanel.tsx +46 -46
- package/src/components/SEOPerformance.tsx +21 -21
- package/src/components/SchedulePublishDialog.tsx +241 -0
- package/src/components/SharePreviewLinkDialog.tsx +227 -0
- package/src/components/TipTapEditor.tsx +33 -33
- package/src/components/VersionHistory.tsx +16 -16
- package/src/components/ui/Badge.tsx +66 -14
- package/src/components/ui/Button.tsx +70 -33
- package/src/components/ui/Card.tsx +101 -0
- package/src/components/ui/DataTable.tsx +1 -1
- package/src/components/ui/Input.tsx +35 -0
- package/src/components/ui/SearchInput.tsx +4 -4
- package/src/components/ui/Select.tsx +56 -0
- package/src/components/ui/Toast.tsx +1 -1
- package/src/components/ui/index.ts +18 -4
- package/src/fields/BlockBuilderField.tsx +3 -3
- package/src/fields/DateField.tsx +1 -1
- package/src/fields/RelationshipField.tsx +10 -10
- package/src/fields/TextField.tsx +1 -1
- package/src/index.ts +32 -0
- package/src/layout/Header.tsx +28 -28
- package/src/layout/Layout.tsx +39 -46
- package/src/layout/Sidebar.tsx +37 -64
- package/src/layout/primitives/AdminShell.tsx +118 -0
- package/src/layout/primitives/Box.tsx +30 -0
- package/src/layout/primitives/Cluster.tsx +74 -0
- package/src/layout/primitives/Grid.tsx +120 -0
- package/src/layout/primitives/PageContainer.tsx +96 -0
- package/src/layout/primitives/Split.tsx +73 -0
- package/src/layout/primitives/Stack.tsx +67 -0
- package/src/layout/primitives/index.ts +36 -0
- package/src/layout/primitives/tokens.ts +76 -0
- package/src/lib/cv.ts +96 -0
- package/src/styles/build-input.css +1 -1
- package/src/views/ApiKeys.tsx +57 -57
- package/src/views/CollectionList.tsx +30 -30
- package/src/views/Dashboard.tsx +737 -186
- package/src/views/DocumentEdit.tsx +90 -10
- package/src/views/ForgotPassword.tsx +18 -18
- package/src/views/FormEditor.tsx +75 -75
- package/src/views/FormSubmissions.tsx +76 -76
- package/src/views/Forms.tsx +27 -27
- package/src/views/Login.tsx +65 -25
- package/src/views/MediaBrowser.tsx +127 -127
- package/src/views/PageEditor.tsx +25 -25
- package/src/views/Pages.tsx +59 -59
- package/src/views/PostEditor.tsx +37 -37
- package/src/views/Posts.tsx +48 -48
- package/src/views/Redirects.tsx +21 -21
- package/src/views/ResetPassword.tsx +28 -28
- package/src/views/SEO.tsx +144 -144
- package/src/views/ScriptTagEditor.tsx +24 -24
- package/src/views/ScriptTags.tsx +10 -10
- package/src/views/Settings.tsx +88 -80
- package/src/views/SetupWizard.tsx +28 -28
- package/src/views/Users.tsx +20 -20
- package/src/views/page-builder/AIBlockAssist.tsx +1 -1
- package/src/views/page-builder/AIGenerateDialog.tsx +63 -63
- package/src/views/page-builder/BlockEditor.tsx +26 -26
- package/src/views/page-builder/BlockPicker.tsx +22 -22
- package/src/views/page-builder/BottomBar.tsx +8 -8
- package/src/views/page-builder/BuilderToolbar.tsx +17 -17
- package/src/views/page-builder/ContextPanel.tsx +3 -3
- package/src/views/page-builder/DesignScore.tsx +21 -21
- package/src/views/page-builder/NodeSettings.tsx +27 -27
- package/src/views/page-builder/PageBuilder.tsx +11 -11
- package/src/views/page-builder/PageSettings.tsx +4 -4
- package/src/views/page-builder/PageTemplates.tsx +18 -18
- package/src/views/page-builder/SEOPanel.tsx +53 -53
- package/src/views/page-builder/SavedSections.tsx +37 -37
- package/src/views/page-builder/TemplatePicker.tsx +17 -17
- package/src/views/page-builder/block-renderers/CTAPreview.tsx +13 -13
- package/src/views/page-builder/block-renderers/CardsPreview.tsx +5 -5
- package/src/views/page-builder/block-renderers/CodePreview.tsx +6 -6
- package/src/views/page-builder/block-renderers/FAQPreview.tsx +13 -13
- package/src/views/page-builder/block-renderers/FallbackPreview.tsx +3 -3
- package/src/views/page-builder/block-renderers/FormPreview.tsx +20 -20
- package/src/views/page-builder/block-renderers/GalleryPreview.tsx +8 -8
- package/src/views/page-builder/block-renderers/HeroPreview.tsx +16 -16
- package/src/views/page-builder/block-renderers/ImagePreview.tsx +4 -4
- package/src/views/page-builder/block-renderers/TextPreview.tsx +14 -14
- package/src/views/page-builder/block-renderers/VideoPreview.tsx +12 -12
- package/src/views/page-builder/canvas/BlockRenderer.tsx +4 -4
- package/src/views/page-builder/canvas/BuilderCanvas.tsx +6 -6
- package/src/views/page-builder/canvas/ColumnRenderer.tsx +3 -3
- package/src/views/page-builder/canvas/ContainerRenderer.tsx +2 -2
- package/src/views/page-builder/canvas/RowRenderer.tsx +2 -2
- package/src/views/page-builder/canvas/SectionRenderer.tsx +2 -2
|
@@ -8,13 +8,13 @@ export function FormPreview({ data, variant = 'contact' }: BlockPreviewProps) {
|
|
|
8
8
|
|
|
9
9
|
if (variant === 'newsletter') {
|
|
10
10
|
return (
|
|
11
|
-
<div className="rounded-md border
|
|
12
|
-
<Mail size={24} className="
|
|
13
|
-
<p className="mt-3 text-sm font-medium
|
|
14
|
-
{formId && <p className="mt-1 text-xs
|
|
11
|
+
<div className="border-border rounded-md border p-6 text-center">
|
|
12
|
+
<Mail size={24} className="text-muted-foreground mx-auto" />
|
|
13
|
+
<p className="text-foreground mt-3 text-sm font-medium">Newsletter Signup</p>
|
|
14
|
+
{formId && <p className="text-muted-foreground mt-1 text-xs">Form: {formId}</p>}
|
|
15
15
|
<div className="mx-auto mt-4 flex max-w-xs gap-2">
|
|
16
|
-
<div className="h-9 flex-1 rounded-md border
|
|
17
|
-
<div className="flex h-9 items-center rounded-md
|
|
16
|
+
<div className="border-border bg-input-background h-9 flex-1 rounded-md border" />
|
|
17
|
+
<div className="bg-primary flex h-9 items-center rounded-md px-3">
|
|
18
18
|
<Send size={14} className="text-primary-foreground" />
|
|
19
19
|
</div>
|
|
20
20
|
</div>
|
|
@@ -24,20 +24,20 @@ export function FormPreview({ data, variant = 'contact' }: BlockPreviewProps) {
|
|
|
24
24
|
|
|
25
25
|
if (variant === 'custom') {
|
|
26
26
|
return (
|
|
27
|
-
<div className="rounded-md border
|
|
27
|
+
<div className="border-border rounded-md border p-5">
|
|
28
28
|
<div className="flex items-center gap-2">
|
|
29
29
|
<FileText size={16} className="text-muted-foreground" />
|
|
30
|
-
<p className="text-sm font-medium
|
|
30
|
+
<p className="text-foreground text-sm font-medium">
|
|
31
31
|
{formId ? `Form: ${formId}` : 'Custom Form'}
|
|
32
32
|
</p>
|
|
33
33
|
</div>
|
|
34
34
|
<div className="mt-3 flex flex-col gap-2">
|
|
35
|
-
<div className="h-8 rounded-md border
|
|
36
|
-
<div className="h-8 rounded-md border
|
|
37
|
-
<div className="h-20 rounded-md border
|
|
35
|
+
<div className="border-border bg-input-background h-8 rounded-md border" />
|
|
36
|
+
<div className="border-border bg-input-background h-8 rounded-md border" />
|
|
37
|
+
<div className="border-border bg-input-background h-20 rounded-md border" />
|
|
38
38
|
</div>
|
|
39
39
|
<div className="mt-3">
|
|
40
|
-
<span className="inline-block rounded-md
|
|
40
|
+
<span className="bg-primary text-primary-foreground inline-block rounded-md px-4 py-2 text-sm">
|
|
41
41
|
Submit
|
|
42
42
|
</span>
|
|
43
43
|
</div>
|
|
@@ -46,17 +46,17 @@ export function FormPreview({ data, variant = 'contact' }: BlockPreviewProps) {
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
return (
|
|
49
|
-
<div className="rounded-md border
|
|
50
|
-
<p className="text-sm font-medium
|
|
51
|
-
{formId && <p className="mt-1 text-xs
|
|
49
|
+
<div className="border-border rounded-md border p-5">
|
|
50
|
+
<p className="text-foreground text-sm font-medium">Contact Form</p>
|
|
51
|
+
{formId && <p className="text-muted-foreground mt-1 text-xs">Form: {formId}</p>}
|
|
52
52
|
<div className="mt-3 grid grid-cols-2 gap-2">
|
|
53
|
-
<div className="h-8 rounded-md border
|
|
54
|
-
<div className="h-8 rounded-md border
|
|
53
|
+
<div className="border-border bg-input-background h-8 rounded-md border" />
|
|
54
|
+
<div className="border-border bg-input-background h-8 rounded-md border" />
|
|
55
55
|
</div>
|
|
56
|
-
<div className="mt-2 h-8 rounded-md border
|
|
57
|
-
<div className="mt-2 h-20 rounded-md border
|
|
56
|
+
<div className="border-border bg-input-background mt-2 h-8 rounded-md border" />
|
|
57
|
+
<div className="border-border bg-input-background mt-2 h-20 rounded-md border" />
|
|
58
58
|
<div className="mt-3">
|
|
59
|
-
<span className="inline-block rounded-md
|
|
59
|
+
<span className="bg-primary text-primary-foreground inline-block rounded-md px-4 py-2 text-sm">
|
|
60
60
|
Send Message
|
|
61
61
|
</span>
|
|
62
62
|
</div>
|
|
@@ -17,7 +17,7 @@ export function GalleryPreview({ data, variant = 'grid' }: BlockPreviewProps) {
|
|
|
17
17
|
|
|
18
18
|
const Thumbnail = ({ item, className = '' }: { item: GalleryImage; className?: string }) => (
|
|
19
19
|
<div
|
|
20
|
-
className={`flex items-center justify-center overflow-hidden rounded-md
|
|
20
|
+
className={`bg-muted flex items-center justify-center overflow-hidden rounded-md ${className}`}
|
|
21
21
|
>
|
|
22
22
|
{item.src ? (
|
|
23
23
|
<img src={item.src} alt={item.alt || ''} className="h-full w-full object-cover" />
|
|
@@ -29,7 +29,7 @@ export function GalleryPreview({ data, variant = 'grid' }: BlockPreviewProps) {
|
|
|
29
29
|
|
|
30
30
|
if (variant === 'masonry') {
|
|
31
31
|
return (
|
|
32
|
-
<div className="rounded-md border
|
|
32
|
+
<div className="border-border rounded-md border p-4">
|
|
33
33
|
<div className="columns-3 gap-3 space-y-3">
|
|
34
34
|
{placeholders.map((item, i) => (
|
|
35
35
|
<Thumbnail
|
|
@@ -47,14 +47,14 @@ export function GalleryPreview({ data, variant = 'grid' }: BlockPreviewProps) {
|
|
|
47
47
|
|
|
48
48
|
if (variant === 'carousel') {
|
|
49
49
|
return (
|
|
50
|
-
<div className="overflow-hidden rounded-md border
|
|
50
|
+
<div className="border-border overflow-hidden rounded-md border p-4">
|
|
51
51
|
<div className="flex gap-3 overflow-hidden">
|
|
52
52
|
{placeholders.slice(0, 4).map((item, i) => (
|
|
53
53
|
<Thumbnail key={i} item={item} className="aspect-square min-w-[120px] flex-1" />
|
|
54
54
|
))}
|
|
55
55
|
{placeholders.length > 4 && (
|
|
56
|
-
<div className="flex min-w-[120px] flex-1 items-center justify-center rounded-md
|
|
57
|
-
<span className="text-
|
|
56
|
+
<div className="bg-muted flex min-w-[120px] flex-1 items-center justify-center rounded-md">
|
|
57
|
+
<span className="text-muted-foreground text-sm">+{placeholders.length - 4}</span>
|
|
58
58
|
</div>
|
|
59
59
|
)}
|
|
60
60
|
</div>
|
|
@@ -64,19 +64,19 @@ export function GalleryPreview({ data, variant = 'grid' }: BlockPreviewProps) {
|
|
|
64
64
|
|
|
65
65
|
if (variant === 'lightbox') {
|
|
66
66
|
return (
|
|
67
|
-
<div className="rounded-md border
|
|
67
|
+
<div className="border-border rounded-md border p-4">
|
|
68
68
|
<div className="grid grid-cols-3 gap-3">
|
|
69
69
|
{placeholders.map((item, i) => (
|
|
70
70
|
<Thumbnail key={i} item={item} className="aspect-square" />
|
|
71
71
|
))}
|
|
72
72
|
</div>
|
|
73
|
-
<p className="mt-2 text-center text-xs
|
|
73
|
+
<p className="text-muted-foreground mt-2 text-center text-xs">Click to open lightbox</p>
|
|
74
74
|
</div>
|
|
75
75
|
)
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
return (
|
|
79
|
-
<div className="rounded-md border
|
|
79
|
+
<div className="border-border rounded-md border p-4">
|
|
80
80
|
<div className="grid grid-cols-3 gap-3">
|
|
81
81
|
{placeholders.map((item, i) => (
|
|
82
82
|
<Thumbnail key={i} item={item} className="aspect-square" />
|
|
@@ -12,23 +12,23 @@ export function HeroPreview({ data, variant = 'centered' }: BlockPreviewProps) {
|
|
|
12
12
|
|
|
13
13
|
if (variant === 'split-image') {
|
|
14
14
|
return (
|
|
15
|
-
<div className="flex min-h-[200px] overflow-hidden rounded-md border
|
|
15
|
+
<div className="border-border flex min-h-[200px] overflow-hidden rounded-md border">
|
|
16
16
|
<div className="flex flex-1 flex-col justify-center gap-3 p-6">
|
|
17
|
-
<h2 className="text-2xl font-medium
|
|
17
|
+
<h2 className="text-foreground text-2xl font-medium">
|
|
18
18
|
{title || <span className="text-muted-foreground">Hero Title</span>}
|
|
19
19
|
</h2>
|
|
20
20
|
{(subtitle || !title) && (
|
|
21
|
-
<p className="text-
|
|
21
|
+
<p className="text-muted-foreground text-sm">{subtitle || 'Subtitle text goes here'}</p>
|
|
22
22
|
)}
|
|
23
23
|
{ctaText && (
|
|
24
24
|
<div className="mt-2">
|
|
25
|
-
<span className="inline-block rounded-md
|
|
25
|
+
<span className="bg-primary text-primary-foreground inline-block rounded-md px-4 py-2 text-sm">
|
|
26
26
|
{ctaText}
|
|
27
27
|
</span>
|
|
28
28
|
</div>
|
|
29
29
|
)}
|
|
30
30
|
</div>
|
|
31
|
-
<div className="flex flex-1 items-center justify-center
|
|
31
|
+
<div className="bg-muted flex flex-1 items-center justify-center">
|
|
32
32
|
{image ? (
|
|
33
33
|
<img src={image} alt="" className="h-full w-full object-cover" />
|
|
34
34
|
) : (
|
|
@@ -41,15 +41,15 @@ export function HeroPreview({ data, variant = 'centered' }: BlockPreviewProps) {
|
|
|
41
41
|
|
|
42
42
|
if (variant === 'minimal') {
|
|
43
43
|
return (
|
|
44
|
-
<div className="flex flex-col items-center gap-3 rounded-md border
|
|
45
|
-
<h2 className="text-2xl font-medium
|
|
44
|
+
<div className="border-border flex flex-col items-center gap-3 rounded-md border p-8">
|
|
45
|
+
<h2 className="text-foreground text-2xl font-medium">
|
|
46
46
|
{title || <span className="text-muted-foreground">Hero Title</span>}
|
|
47
47
|
</h2>
|
|
48
48
|
{(subtitle || !title) && (
|
|
49
|
-
<p className="text-
|
|
49
|
+
<p className="text-muted-foreground text-sm">{subtitle || 'Subtitle text goes here'}</p>
|
|
50
50
|
)}
|
|
51
51
|
{ctaText && (
|
|
52
|
-
<span className="mt-2 inline-block rounded-md
|
|
52
|
+
<span className="bg-primary text-primary-foreground mt-2 inline-block rounded-md px-4 py-2 text-sm">
|
|
53
53
|
{ctaText}
|
|
54
54
|
</span>
|
|
55
55
|
)}
|
|
@@ -60,27 +60,27 @@ export function HeroPreview({ data, variant = 'centered' }: BlockPreviewProps) {
|
|
|
60
60
|
const isVideo = variant === 'video-bg'
|
|
61
61
|
|
|
62
62
|
return (
|
|
63
|
-
<div className="relative flex min-h-[220px] flex-col items-center justify-center gap-3 overflow-hidden rounded-md border
|
|
63
|
+
<div className="border-border relative flex min-h-[220px] flex-col items-center justify-center gap-3 overflow-hidden rounded-md border p-8">
|
|
64
64
|
{image ? (
|
|
65
65
|
<img src={image} alt="" className="absolute inset-0 h-full w-full object-cover" />
|
|
66
66
|
) : (
|
|
67
|
-
<div className="absolute inset-0
|
|
67
|
+
<div className="bg-muted absolute inset-0" />
|
|
68
68
|
)}
|
|
69
|
-
<div className="absolute inset-0
|
|
69
|
+
<div className="bg-background absolute inset-0" style={{ opacity: overlayOpacity }} />
|
|
70
70
|
<div className="relative z-10 flex flex-col items-center gap-3 text-center">
|
|
71
71
|
{isVideo && (
|
|
72
|
-
<div className="mb-2 flex h-12 w-12 items-center justify-center rounded-full
|
|
72
|
+
<div className="bg-primary/90 mb-2 flex h-12 w-12 items-center justify-center rounded-full">
|
|
73
73
|
<Play size={20} className="text-primary-foreground" />
|
|
74
74
|
</div>
|
|
75
75
|
)}
|
|
76
|
-
<h2 className="text-2xl font-medium
|
|
76
|
+
<h2 className="text-foreground text-2xl font-medium">
|
|
77
77
|
{title || <span className="text-muted-foreground">Hero Title</span>}
|
|
78
78
|
</h2>
|
|
79
79
|
{(subtitle || !title) && (
|
|
80
|
-
<p className="text-
|
|
80
|
+
<p className="text-muted-foreground text-sm">{subtitle || 'Subtitle text goes here'}</p>
|
|
81
81
|
)}
|
|
82
82
|
{ctaText && (
|
|
83
|
-
<span className="mt-2 inline-block rounded-md
|
|
83
|
+
<span className="bg-primary text-primary-foreground mt-2 inline-block rounded-md px-4 py-2 text-sm">
|
|
84
84
|
{ctaText}
|
|
85
85
|
</span>
|
|
86
86
|
)}
|
|
@@ -13,7 +13,7 @@ export function ImagePreview({ data, variant = 'full-width' }: BlockPreviewProps
|
|
|
13
13
|
|
|
14
14
|
const ImagePlaceholder = ({ className = '' }: { className?: string }) => (
|
|
15
15
|
<div
|
|
16
|
-
className={`flex items-center justify-center
|
|
16
|
+
className={`bg-muted flex items-center justify-center ${roundedClass} ${className}`}
|
|
17
17
|
style={{ aspectRatio }}
|
|
18
18
|
>
|
|
19
19
|
<Image size={32} className="text-muted-foreground" />
|
|
@@ -34,7 +34,7 @@ export function ImagePreview({ data, variant = 'full-width' }: BlockPreviewProps
|
|
|
34
34
|
|
|
35
35
|
if (variant === 'side-by-side') {
|
|
36
36
|
return (
|
|
37
|
-
<div className="grid grid-cols-2 gap-3 rounded-md border
|
|
37
|
+
<div className="border-border grid grid-cols-2 gap-3 rounded-md border p-4">
|
|
38
38
|
<ImageElement />
|
|
39
39
|
<ImagePlaceholder />
|
|
40
40
|
</div>
|
|
@@ -42,10 +42,10 @@ export function ImagePreview({ data, variant = 'full-width' }: BlockPreviewProps
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
return (
|
|
45
|
-
<figure className="overflow-hidden rounded-md border
|
|
45
|
+
<figure className="border-border overflow-hidden rounded-md border p-4">
|
|
46
46
|
<ImageElement />
|
|
47
47
|
{(variant === 'captioned' || caption) && (
|
|
48
|
-
<figcaption className="mt-2 text-center text-sm
|
|
48
|
+
<figcaption className="text-muted-foreground mt-2 text-center text-sm">
|
|
49
49
|
{caption || 'Image caption'}
|
|
50
50
|
</figcaption>
|
|
51
51
|
)}
|
|
@@ -26,17 +26,17 @@ export function TextPreview({ data, variant = 'prose' }: BlockPreviewProps) {
|
|
|
26
26
|
const col2 = truncatedBody.slice(midpoint)
|
|
27
27
|
|
|
28
28
|
return (
|
|
29
|
-
<div className="rounded-md border
|
|
29
|
+
<div className="border-border rounded-md border p-5">
|
|
30
30
|
{heading && (
|
|
31
|
-
<HeadingTag className={`${headingSizeClass} mb-3 font-medium
|
|
31
|
+
<HeadingTag className={`${headingSizeClass} text-foreground mb-3 font-medium`}>
|
|
32
32
|
{heading}
|
|
33
33
|
</HeadingTag>
|
|
34
34
|
)}
|
|
35
35
|
<div className="grid grid-cols-2 gap-4">
|
|
36
|
-
<p className="text-sm leading-relaxed
|
|
36
|
+
<p className="text-muted-foreground text-sm leading-relaxed">
|
|
37
37
|
{col1 || 'Column one text content…'}
|
|
38
38
|
</p>
|
|
39
|
-
<p className="text-sm leading-relaxed
|
|
39
|
+
<p className="text-muted-foreground text-sm leading-relaxed">
|
|
40
40
|
{col2 || 'Column two text content…'}
|
|
41
41
|
</p>
|
|
42
42
|
</div>
|
|
@@ -46,34 +46,34 @@ export function TextPreview({ data, variant = 'prose' }: BlockPreviewProps) {
|
|
|
46
46
|
|
|
47
47
|
if (variant === 'with-sidebar') {
|
|
48
48
|
return (
|
|
49
|
-
<div className="grid grid-cols-[1fr_200px] gap-4 rounded-md border
|
|
49
|
+
<div className="border-border grid grid-cols-[1fr_200px] gap-4 rounded-md border p-5">
|
|
50
50
|
<div>
|
|
51
51
|
{heading && (
|
|
52
|
-
<HeadingTag className={`${headingSizeClass} mb-3 font-medium
|
|
52
|
+
<HeadingTag className={`${headingSizeClass} text-foreground mb-3 font-medium`}>
|
|
53
53
|
{heading}
|
|
54
54
|
</HeadingTag>
|
|
55
55
|
)}
|
|
56
|
-
<p className="text-sm leading-relaxed
|
|
56
|
+
<p className="text-muted-foreground text-sm leading-relaxed">
|
|
57
57
|
{truncatedBody || 'Body text content goes here…'}
|
|
58
58
|
</p>
|
|
59
59
|
</div>
|
|
60
|
-
<aside className="rounded-md
|
|
61
|
-
<div className="h-3 w-3/4 rounded
|
|
62
|
-
<div className="mt-2 h-2 w-full rounded
|
|
63
|
-
<div className="mt-1 h-2 w-2/3 rounded
|
|
60
|
+
<aside className="bg-muted rounded-md p-3">
|
|
61
|
+
<div className="bg-border h-3 w-3/4 rounded" />
|
|
62
|
+
<div className="bg-border mt-2 h-2 w-full rounded" />
|
|
63
|
+
<div className="bg-border mt-1 h-2 w-2/3 rounded" />
|
|
64
64
|
</aside>
|
|
65
65
|
</div>
|
|
66
66
|
)
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
return (
|
|
70
|
-
<div className="rounded-md border
|
|
70
|
+
<div className="border-border rounded-md border p-5">
|
|
71
71
|
{heading && (
|
|
72
|
-
<HeadingTag className={`${headingSizeClass} mb-3 font-medium
|
|
72
|
+
<HeadingTag className={`${headingSizeClass} text-foreground mb-3 font-medium`}>
|
|
73
73
|
{heading}
|
|
74
74
|
</HeadingTag>
|
|
75
75
|
)}
|
|
76
|
-
<p className="text-sm leading-relaxed
|
|
76
|
+
<p className="text-muted-foreground text-sm leading-relaxed">
|
|
77
77
|
{truncatedBody || <span className="italic">Body text content goes here…</span>}
|
|
78
78
|
</p>
|
|
79
79
|
</div>
|
|
@@ -13,21 +13,21 @@ export function VideoPreview({ data, variant = 'inline' }: BlockPreviewProps) {
|
|
|
13
13
|
)
|
|
14
14
|
|
|
15
15
|
const content = (
|
|
16
|
-
<div className="relative flex aspect-video items-center justify-center overflow-hidden rounded-md
|
|
16
|
+
<div className="bg-muted relative flex aspect-video items-center justify-center overflow-hidden rounded-md">
|
|
17
17
|
{poster ? (
|
|
18
18
|
<img src={poster} alt="" className="absolute inset-0 h-full w-full object-cover" />
|
|
19
19
|
) : (
|
|
20
|
-
<div className="absolute inset-0
|
|
20
|
+
<div className="bg-card absolute inset-0" />
|
|
21
21
|
)}
|
|
22
|
-
<div className="relative z-10 flex h-12 w-12 items-center justify-center rounded-full
|
|
22
|
+
<div className="bg-primary/90 relative z-10 flex h-12 w-12 items-center justify-center rounded-full shadow-sm">
|
|
23
23
|
<Play size={20} className="text-primary-foreground" />
|
|
24
24
|
</div>
|
|
25
25
|
{badges.length > 0 && (
|
|
26
|
-
<div className="absolute
|
|
26
|
+
<div className="absolute right-2 bottom-2 z-10 flex gap-1">
|
|
27
27
|
{badges.map((badge) => (
|
|
28
28
|
<span
|
|
29
29
|
key={badge}
|
|
30
|
-
className="
|
|
30
|
+
className="bg-background/80 text-muted-foreground rounded px-1.5 py-0.5 text-xs"
|
|
31
31
|
>
|
|
32
32
|
{badge}
|
|
33
33
|
</span>
|
|
@@ -39,15 +39,15 @@ export function VideoPreview({ data, variant = 'inline' }: BlockPreviewProps) {
|
|
|
39
39
|
|
|
40
40
|
if (variant === 'background') {
|
|
41
41
|
return (
|
|
42
|
-
<div className="overflow-hidden rounded-md border
|
|
42
|
+
<div className="border-border overflow-hidden rounded-md border">
|
|
43
43
|
<div className="relative aspect-[21/9]">
|
|
44
44
|
{poster ? (
|
|
45
45
|
<img src={poster} alt="" className="absolute inset-0 h-full w-full object-cover" />
|
|
46
46
|
) : (
|
|
47
|
-
<div className="absolute inset-0
|
|
47
|
+
<div className="bg-card absolute inset-0" />
|
|
48
48
|
)}
|
|
49
|
-
<div className="absolute inset-0 flex items-center justify-center
|
|
50
|
-
<div className="flex h-14 w-14 items-center justify-center rounded-full
|
|
49
|
+
<div className="bg-background/30 absolute inset-0 flex items-center justify-center">
|
|
50
|
+
<div className="bg-primary/90 flex h-14 w-14 items-center justify-center rounded-full shadow-sm">
|
|
51
51
|
<Play size={24} className="text-primary-foreground" />
|
|
52
52
|
</div>
|
|
53
53
|
</div>
|
|
@@ -58,10 +58,10 @@ export function VideoPreview({ data, variant = 'inline' }: BlockPreviewProps) {
|
|
|
58
58
|
|
|
59
59
|
if (variant === 'lightbox') {
|
|
60
60
|
return (
|
|
61
|
-
<div className="rounded-md border
|
|
61
|
+
<div className="border-border rounded-md border p-4">
|
|
62
62
|
<div className="mx-auto max-w-sm">
|
|
63
63
|
{content}
|
|
64
|
-
<p className="mt-2 text-center text-xs
|
|
64
|
+
<p className="text-muted-foreground mt-2 text-center text-xs">
|
|
65
65
|
Click to play in lightbox
|
|
66
66
|
</p>
|
|
67
67
|
</div>
|
|
@@ -69,5 +69,5 @@ export function VideoPreview({ data, variant = 'inline' }: BlockPreviewProps) {
|
|
|
69
69
|
)
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
return <div className="rounded-md border
|
|
72
|
+
return <div className="border-border rounded-md border p-4">{content}</div>
|
|
73
73
|
}
|
|
@@ -37,21 +37,21 @@ export function BlockRenderer({ node, selectedNodeId, onSelectNode }: BlockRende
|
|
|
37
37
|
<div
|
|
38
38
|
data-node-id={node.id}
|
|
39
39
|
className={`relative min-h-[48px] transition-shadow ${
|
|
40
|
-
isSelected ? 'ring-
|
|
40
|
+
isSelected ? 'ring-primary ring-2 ring-offset-2' : hovered ? 'ring-primary/50 ring-1' : ''
|
|
41
41
|
}`}
|
|
42
42
|
onClick={handleClick}
|
|
43
43
|
onMouseEnter={() => setHovered(true)}
|
|
44
44
|
onMouseLeave={() => setHovered(false)}
|
|
45
45
|
>
|
|
46
46
|
{(hovered || isSelected) && (
|
|
47
|
-
<span className="absolute -top-2 -left-1
|
|
47
|
+
<span className="bg-primary text-primary-foreground absolute -top-2 -left-1 z-10 rounded px-1.5 py-0.5 text-xs font-medium">
|
|
48
48
|
{label}
|
|
49
49
|
</span>
|
|
50
50
|
)}
|
|
51
51
|
|
|
52
|
-
<div className="flex items-center justify-center gap-2
|
|
52
|
+
<div className="bg-muted/30 border-border flex items-center justify-center gap-2 rounded-md border border-dashed p-4">
|
|
53
53
|
<Icon size={16} className="text-muted-foreground" />
|
|
54
|
-
<span className="text-
|
|
54
|
+
<span className="text-muted-foreground text-sm">{label}</span>
|
|
55
55
|
</div>
|
|
56
56
|
</div>
|
|
57
57
|
)
|
|
@@ -32,11 +32,11 @@ export function BuilderCanvas({
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
return (
|
|
35
|
-
<div className="relative flex-1 overflow-auto
|
|
35
|
+
<div className="bg-muted relative flex-1 overflow-auto p-6" onClick={handleCanvasClick}>
|
|
36
36
|
{showGridOverlay && <GridOverlay deviceMode={deviceMode} />}
|
|
37
37
|
|
|
38
38
|
<div
|
|
39
|
-
className={`
|
|
39
|
+
className={`bg-background relative min-h-full shadow-sm ${DEVICE_CLASSES[deviceMode]}`}
|
|
40
40
|
onClick={handleCanvasClick}
|
|
41
41
|
>
|
|
42
42
|
{tree.children.map((child) => {
|
|
@@ -54,10 +54,10 @@ export function BuilderCanvas({
|
|
|
54
54
|
})}
|
|
55
55
|
|
|
56
56
|
{tree.children.length === 0 && (
|
|
57
|
-
<div className="flex flex-col items-center justify-center
|
|
57
|
+
<div className="flex min-h-[400px] flex-col items-center justify-center text-center">
|
|
58
58
|
<LayoutGrid size={32} className="text-muted-foreground mb-3" />
|
|
59
|
-
<p className="text-
|
|
60
|
-
<p className="text-
|
|
59
|
+
<p className="text-foreground mb-1 text-sm font-medium">No sections yet</p>
|
|
60
|
+
<p className="text-muted-foreground text-xs">
|
|
61
61
|
Click "Add Section" below to start building your page
|
|
62
62
|
</p>
|
|
63
63
|
</div>
|
|
@@ -76,7 +76,7 @@ function GridOverlay({ deviceMode }: { deviceMode: BuilderCanvasProps['deviceMod
|
|
|
76
76
|
aria-hidden="true"
|
|
77
77
|
>
|
|
78
78
|
<div
|
|
79
|
-
className={`grid grid-cols-12 gap-4
|
|
79
|
+
className={`grid h-full grid-cols-12 gap-4 opacity-[0.08] ${DEVICE_CLASSES[deviceMode]}`}
|
|
80
80
|
>
|
|
81
81
|
{Array.from({ length: 12 }).map((_, i) => (
|
|
82
82
|
<div key={i} className="bg-primary h-full rounded-sm" />
|
|
@@ -26,7 +26,7 @@ export function ColumnRenderer({ node, selectedNodeId, onSelectNode }: ColumnRen
|
|
|
26
26
|
<div
|
|
27
27
|
data-node-id={node.id}
|
|
28
28
|
className={`relative transition-shadow ${
|
|
29
|
-
isSelected ? 'ring-
|
|
29
|
+
isSelected ? 'ring-primary ring-2 ring-offset-2' : hovered ? 'ring-primary/50 ring-1' : ''
|
|
30
30
|
}`}
|
|
31
31
|
style={{
|
|
32
32
|
gridColumn: `span ${width}`,
|
|
@@ -41,13 +41,13 @@ export function ColumnRenderer({ node, selectedNodeId, onSelectNode }: ColumnRen
|
|
|
41
41
|
onMouseLeave={() => setHovered(false)}
|
|
42
42
|
>
|
|
43
43
|
{(hovered || isSelected) && (
|
|
44
|
-
<span className="absolute -top-2 -left-1
|
|
44
|
+
<span className="bg-primary text-primary-foreground absolute -top-2 -left-1 z-10 rounded px-1.5 py-0.5 text-xs font-medium">
|
|
45
45
|
Col {width}
|
|
46
46
|
</span>
|
|
47
47
|
)}
|
|
48
48
|
|
|
49
49
|
{isEmpty ? (
|
|
50
|
-
<div className="
|
|
50
|
+
<div className="border-border text-muted-foreground flex min-h-[64px] items-center justify-center rounded-md border-2 border-dashed text-sm">
|
|
51
51
|
Empty column
|
|
52
52
|
</div>
|
|
53
53
|
) : (
|
|
@@ -32,7 +32,7 @@ export function ContainerRenderer({ node, selectedNodeId, onSelectNode }: Contai
|
|
|
32
32
|
<div
|
|
33
33
|
data-node-id={node.id}
|
|
34
34
|
className={`relative transition-shadow ${
|
|
35
|
-
isSelected ? 'ring-
|
|
35
|
+
isSelected ? 'ring-primary ring-2 ring-offset-2' : hovered ? 'ring-primary/50 ring-1' : ''
|
|
36
36
|
}`}
|
|
37
37
|
style={{
|
|
38
38
|
maxWidth,
|
|
@@ -47,7 +47,7 @@ export function ContainerRenderer({ node, selectedNodeId, onSelectNode }: Contai
|
|
|
47
47
|
onMouseLeave={() => setHovered(false)}
|
|
48
48
|
>
|
|
49
49
|
{(hovered || isSelected) && (
|
|
50
|
-
<span className="absolute -top-2 -left-1
|
|
50
|
+
<span className="bg-primary text-primary-foreground absolute -top-2 -left-1 z-10 rounded px-1.5 py-0.5 text-xs font-medium">
|
|
51
51
|
Container
|
|
52
52
|
</span>
|
|
53
53
|
)}
|
|
@@ -32,7 +32,7 @@ export function RowRenderer({ node, selectedNodeId, onSelectNode }: RowRendererP
|
|
|
32
32
|
<div
|
|
33
33
|
data-node-id={node.id}
|
|
34
34
|
className={`relative transition-shadow ${
|
|
35
|
-
isSelected ? 'ring-
|
|
35
|
+
isSelected ? 'ring-primary ring-2 ring-offset-2' : hovered ? 'ring-primary/50 ring-1' : ''
|
|
36
36
|
}`}
|
|
37
37
|
onClick={handleClick}
|
|
38
38
|
onMouseEnter={(e) => {
|
|
@@ -42,7 +42,7 @@ export function RowRenderer({ node, selectedNodeId, onSelectNode }: RowRendererP
|
|
|
42
42
|
onMouseLeave={() => setHovered(false)}
|
|
43
43
|
>
|
|
44
44
|
{(hovered || isSelected) && (
|
|
45
|
-
<span className="absolute -top-2 -left-1
|
|
45
|
+
<span className="bg-primary text-primary-foreground absolute -top-2 -left-1 z-10 rounded px-1.5 py-0.5 text-xs font-medium">
|
|
46
46
|
Row
|
|
47
47
|
</span>
|
|
48
48
|
)}
|
|
@@ -49,7 +49,7 @@ export function SectionRenderer({ node, selectedNodeId, onSelectNode }: SectionR
|
|
|
49
49
|
<div
|
|
50
50
|
data-node-id={node.id}
|
|
51
51
|
className={`relative w-full transition-shadow ${
|
|
52
|
-
isSelected ? 'ring-
|
|
52
|
+
isSelected ? 'ring-primary ring-2 ring-offset-2' : hovered ? 'ring-primary/50 ring-1' : ''
|
|
53
53
|
}`}
|
|
54
54
|
style={backgroundStyle}
|
|
55
55
|
onClick={handleClick}
|
|
@@ -60,7 +60,7 @@ export function SectionRenderer({ node, selectedNodeId, onSelectNode }: SectionR
|
|
|
60
60
|
onMouseLeave={() => setHovered(false)}
|
|
61
61
|
>
|
|
62
62
|
{(hovered || isSelected) && (
|
|
63
|
-
<span className="absolute -top-2 -left-1
|
|
63
|
+
<span className="bg-primary text-primary-foreground absolute -top-2 -left-1 z-10 rounded px-1.5 py-0.5 text-xs font-medium">
|
|
64
64
|
Section
|
|
65
65
|
</span>
|
|
66
66
|
)}
|