@actuate-media/cms-admin 0.66.0 → 0.68.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +37 -0
- package/dist/AdminRoot.d.ts.map +1 -1
- package/dist/AdminRoot.js +36 -9
- package/dist/AdminRoot.js.map +1 -1
- package/dist/__tests__/components/inspector-pane.test.d.ts +2 -0
- package/dist/__tests__/components/inspector-pane.test.d.ts.map +1 -0
- package/dist/__tests__/components/inspector-pane.test.js +31 -0
- package/dist/__tests__/components/inspector-pane.test.js.map +1 -0
- package/dist/__tests__/hooks/useIdleLogout.test.d.ts +2 -0
- package/dist/__tests__/hooks/useIdleLogout.test.d.ts.map +1 -0
- package/dist/__tests__/hooks/useIdleLogout.test.js +64 -0
- package/dist/__tests__/hooks/useIdleLogout.test.js.map +1 -0
- package/dist/__tests__/lib/pages-tree.test.d.ts +2 -0
- package/dist/__tests__/lib/pages-tree.test.d.ts.map +1 -0
- package/dist/__tests__/lib/pages-tree.test.js +173 -0
- package/dist/__tests__/lib/pages-tree.test.js.map +1 -0
- package/dist/__tests__/lib/post-types-service.test.d.ts +2 -0
- package/dist/__tests__/lib/post-types-service.test.d.ts.map +1 -0
- package/dist/__tests__/lib/post-types-service.test.js +88 -0
- package/dist/__tests__/lib/post-types-service.test.js.map +1 -0
- package/dist/__tests__/views/collection-list-nav.render.test.js +43 -5
- package/dist/__tests__/views/collection-list-nav.render.test.js.map +1 -1
- package/dist/__tests__/views/dashboard.test.js +7 -3
- package/dist/__tests__/views/dashboard.test.js.map +1 -1
- package/dist/__tests__/views/forms-list.render.test.js +25 -6
- package/dist/__tests__/views/forms-list.render.test.js.map +1 -1
- package/dist/__tests__/views/media-seo-audit.render.test.d.ts +2 -0
- package/dist/__tests__/views/media-seo-audit.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/media-seo-audit.render.test.js +102 -0
- package/dist/__tests__/views/media-seo-audit.render.test.js.map +1 -0
- package/dist/__tests__/views/onboarding-block.render.test.d.ts +2 -0
- package/dist/__tests__/views/onboarding-block.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/onboarding-block.render.test.js +146 -0
- package/dist/__tests__/views/onboarding-block.render.test.js.map +1 -0
- package/dist/__tests__/views/page-builder-sections-panel.render.test.d.ts +2 -0
- package/dist/__tests__/views/page-builder-sections-panel.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/page-builder-sections-panel.render.test.js +121 -0
- package/dist/__tests__/views/page-builder-sections-panel.render.test.js.map +1 -0
- package/dist/__tests__/views/page-templates.render.test.d.ts +2 -0
- package/dist/__tests__/views/page-templates.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/page-templates.render.test.js +105 -0
- package/dist/__tests__/views/page-templates.render.test.js.map +1 -0
- package/dist/__tests__/views/pages-list-view.test.js +77 -1
- package/dist/__tests__/views/pages-list-view.test.js.map +1 -1
- package/dist/__tests__/views/post-type-editor.render.test.d.ts +2 -0
- package/dist/__tests__/views/post-type-editor.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/post-type-editor.render.test.js +102 -0
- package/dist/__tests__/views/post-type-editor.render.test.js.map +1 -0
- package/dist/__tests__/views/security-settings.render.test.js +85 -4
- package/dist/__tests__/views/security-settings.render.test.js.map +1 -1
- package/dist/__tests__/views/seo-content-pane.render.test.d.ts +2 -0
- package/dist/__tests__/views/seo-content-pane.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/seo-content-pane.render.test.js +117 -0
- package/dist/__tests__/views/seo-content-pane.render.test.js.map +1 -0
- package/dist/actuate-admin.css +1 -1
- package/dist/components/collections/EntryDetailPane.d.ts +10 -0
- package/dist/components/collections/EntryDetailPane.d.ts.map +1 -0
- package/dist/components/collections/EntryDetailPane.js +92 -0
- package/dist/components/collections/EntryDetailPane.js.map +1 -0
- package/dist/components/forms/FieldsPanel.js +1 -1
- package/dist/components/forms/FieldsPanel.js.map +1 -1
- package/dist/components/forms/FormSchemaPane.d.ts +8 -0
- package/dist/components/forms/FormSchemaPane.d.ts.map +1 -0
- package/dist/components/forms/FormSchemaPane.js +95 -0
- package/dist/components/forms/FormSchemaPane.js.map +1 -0
- package/dist/components/script-tags/ScriptTagEditorPane.d.ts +26 -0
- package/dist/components/script-tags/ScriptTagEditorPane.d.ts.map +1 -0
- package/dist/components/script-tags/ScriptTagEditorPane.js +160 -0
- package/dist/components/script-tags/ScriptTagEditorPane.js.map +1 -0
- package/dist/components/seo/SeoEditorPane.d.ts +9 -0
- package/dist/components/seo/SeoEditorPane.d.ts.map +1 -0
- package/dist/components/seo/SeoEditorPane.js +175 -0
- package/dist/components/seo/SeoEditorPane.js.map +1 -0
- package/dist/components/ui/Badge.d.ts +1 -1
- package/dist/components/ui/Button.d.ts +1 -1
- package/dist/components/ui/InspectorPane.d.ts +51 -0
- package/dist/components/ui/InspectorPane.d.ts.map +1 -0
- package/dist/components/ui/InspectorPane.js +42 -0
- package/dist/components/ui/InspectorPane.js.map +1 -0
- package/dist/components/ui/StatusBadge.d.ts +1 -1
- package/dist/components/ui/index.d.ts +2 -0
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +1 -0
- package/dist/components/ui/index.js.map +1 -1
- package/dist/hooks/useIdleLogout.d.ts +18 -0
- package/dist/hooks/useIdleLogout.d.ts.map +1 -0
- package/dist/hooks/useIdleLogout.js +66 -0
- package/dist/hooks/useIdleLogout.js.map +1 -0
- package/dist/lib/api.d.ts +1 -0
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +7 -1
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/page-editor-service.d.ts +11 -2
- package/dist/lib/page-editor-service.d.ts.map +1 -1
- package/dist/lib/page-editor-service.js +8 -2
- package/dist/lib/page-editor-service.js.map +1 -1
- package/dist/lib/pages-tree.d.ts +44 -0
- package/dist/lib/pages-tree.d.ts.map +1 -0
- package/dist/lib/pages-tree.js +106 -0
- package/dist/lib/pages-tree.js.map +1 -0
- package/dist/lib/post-types-service.d.ts +44 -0
- package/dist/lib/post-types-service.d.ts.map +1 -0
- package/dist/lib/post-types-service.js +83 -0
- package/dist/lib/post-types-service.js.map +1 -0
- package/dist/views/CollectionList.d.ts.map +1 -1
- package/dist/views/CollectionList.js +23 -4
- package/dist/views/CollectionList.js.map +1 -1
- package/dist/views/Dashboard.d.ts.map +1 -1
- package/dist/views/Dashboard.js +31 -2
- package/dist/views/Dashboard.js.map +1 -1
- package/dist/views/Forms.d.ts.map +1 -1
- package/dist/views/Forms.js +25 -21
- package/dist/views/Forms.js.map +1 -1
- package/dist/views/MediaBrowser.d.ts.map +1 -1
- package/dist/views/MediaBrowser.js +28 -2
- package/dist/views/MediaBrowser.js.map +1 -1
- package/dist/views/MediaSeoAudit.d.ts +25 -0
- package/dist/views/MediaSeoAudit.d.ts.map +1 -0
- package/dist/views/MediaSeoAudit.js +97 -0
- package/dist/views/MediaSeoAudit.js.map +1 -0
- package/dist/views/Pages/PagesListView.d.ts.map +1 -1
- package/dist/views/Pages/PagesListView.js +90 -10
- package/dist/views/Pages/PagesListView.js.map +1 -1
- package/dist/views/Pages/PagesTreeTable.d.ts +35 -0
- package/dist/views/Pages/PagesTreeTable.d.ts.map +1 -0
- package/dist/views/Pages/PagesTreeTable.js +28 -0
- package/dist/views/Pages/PagesTreeTable.js.map +1 -0
- package/dist/views/Posts/PostTypeEditor.d.ts +16 -0
- package/dist/views/Posts/PostTypeEditor.d.ts.map +1 -0
- package/dist/views/Posts/PostTypeEditor.js +159 -0
- package/dist/views/Posts/PostTypeEditor.js.map +1 -0
- package/dist/views/Posts/PostTypesView.d.ts +3 -2
- package/dist/views/Posts/PostTypesView.d.ts.map +1 -1
- package/dist/views/Posts/PostTypesView.js +1 -1
- package/dist/views/Posts/PostTypesView.js.map +1 -1
- package/dist/views/ScriptTags.d.ts +5 -1
- package/dist/views/ScriptTags.d.ts.map +1 -1
- package/dist/views/ScriptTags.js +32 -7
- package/dist/views/ScriptTags.js.map +1 -1
- package/dist/views/dashboard/OnboardingBlock.d.ts +29 -0
- package/dist/views/dashboard/OnboardingBlock.d.ts.map +1 -0
- package/dist/views/dashboard/OnboardingBlock.js +71 -0
- package/dist/views/dashboard/OnboardingBlock.js.map +1 -0
- package/dist/views/page-builder/BuilderSectionsPanel.d.ts +20 -0
- package/dist/views/page-builder/BuilderSectionsPanel.d.ts.map +1 -0
- package/dist/views/page-builder/BuilderSectionsPanel.js +105 -0
- package/dist/views/page-builder/BuilderSectionsPanel.js.map +1 -0
- package/dist/views/page-builder/PageBuilder.d.ts.map +1 -1
- package/dist/views/page-builder/PageBuilder.js +51 -2
- package/dist/views/page-builder/PageBuilder.js.map +1 -1
- package/dist/views/page-builder/PageTemplates.d.ts.map +1 -1
- package/dist/views/page-builder/PageTemplates.js +113 -6
- package/dist/views/page-builder/PageTemplates.js.map +1 -1
- package/dist/views/page-editor/PageSectionEditor.d.ts +7 -1
- package/dist/views/page-editor/PageSectionEditor.d.ts.map +1 -1
- package/dist/views/page-editor/PageSectionEditor.js +3 -3
- package/dist/views/page-editor/PageSectionEditor.js.map +1 -1
- package/dist/views/page-editor/PageSettingsModal.d.ts +1 -1
- package/dist/views/page-editor/PageSettingsModal.d.ts.map +1 -1
- package/dist/views/page-editor/PageSettingsModal.js +42 -3
- package/dist/views/page-editor/PageSettingsModal.js.map +1 -1
- package/dist/views/seo/ContentTab.d.ts.map +1 -1
- package/dist/views/seo/ContentTab.js +22 -6
- package/dist/views/seo/ContentTab.js.map +1 -1
- package/dist/views/settings/AccessProtectionCard.d.ts +5 -1
- package/dist/views/settings/AccessProtectionCard.d.ts.map +1 -1
- package/dist/views/settings/AccessProtectionCard.js +13 -10
- package/dist/views/settings/AccessProtectionCard.js.map +1 -1
- package/dist/views/settings/SecurityTab.d.ts.map +1 -1
- package/dist/views/settings/SecurityTab.js +3 -3
- package/dist/views/settings/SecurityTab.js.map +1 -1
- package/dist/views/settings/SessionPolicyCard.d.ts +1 -2
- package/dist/views/settings/SessionPolicyCard.d.ts.map +1 -1
- package/dist/views/settings/SessionPolicyCard.js +12 -5
- package/dist/views/settings/SessionPolicyCard.js.map +1 -1
- package/dist/views/settings/useSecuritySettings.d.ts +13 -1
- package/dist/views/settings/useSecuritySettings.d.ts.map +1 -1
- package/dist/views/settings/useSecuritySettings.js +47 -4
- package/dist/views/settings/useSecuritySettings.js.map +1 -1
- package/package.json +2 -2
- package/src/AdminRoot.tsx +43 -10
- package/src/__tests__/components/inspector-pane.test.tsx +64 -0
- package/src/__tests__/hooks/useIdleLogout.test.tsx +86 -0
- package/src/__tests__/lib/pages-tree.test.ts +197 -0
- package/src/__tests__/lib/post-types-service.test.ts +112 -0
- package/src/__tests__/views/collection-list-nav.render.test.tsx +51 -5
- package/src/__tests__/views/dashboard.test.tsx +7 -3
- package/src/__tests__/views/forms-list.render.test.tsx +34 -6
- package/src/__tests__/views/media-seo-audit.render.test.tsx +117 -0
- package/src/__tests__/views/onboarding-block.render.test.tsx +193 -0
- package/src/__tests__/views/page-builder-sections-panel.render.test.tsx +138 -0
- package/src/__tests__/views/page-templates.render.test.tsx +142 -0
- package/src/__tests__/views/pages-list-view.test.tsx +93 -1
- package/src/__tests__/views/post-type-editor.render.test.tsx +116 -0
- package/src/__tests__/views/security-settings.render.test.tsx +111 -4
- package/src/__tests__/views/seo-content-pane.render.test.tsx +142 -0
- package/src/components/collections/EntryDetailPane.tsx +182 -0
- package/src/components/forms/FieldsPanel.tsx +3 -1
- package/src/components/forms/FormSchemaPane.tsx +192 -0
- package/src/components/script-tags/ScriptTagEditorPane.tsx +474 -0
- package/src/components/seo/SeoEditorPane.tsx +533 -0
- package/src/components/ui/InspectorPane.tsx +129 -0
- package/src/components/ui/index.ts +10 -0
- package/src/hooks/useIdleLogout.ts +77 -0
- package/src/lib/api.ts +8 -2
- package/src/lib/page-editor-service.ts +16 -2
- package/src/lib/pages-tree.ts +145 -0
- package/src/lib/post-types-service.ts +129 -0
- package/src/views/CollectionList.tsx +158 -110
- package/src/views/Dashboard.tsx +238 -196
- package/src/views/Forms.tsx +154 -126
- package/src/views/MediaBrowser.tsx +641 -511
- package/src/views/MediaSeoAudit.tsx +320 -0
- package/src/views/Pages/PagesListView.tsx +352 -183
- package/src/views/Pages/PagesTreeTable.tsx +339 -0
- package/src/views/Posts/PostTypeEditor.tsx +568 -0
- package/src/views/Posts/PostTypesView.tsx +5 -4
- package/src/views/ScriptTags.tsx +204 -129
- package/src/views/dashboard/OnboardingBlock.tsx +233 -0
- package/src/views/page-builder/BuilderSectionsPanel.tsx +304 -0
- package/src/views/page-builder/PageBuilder.tsx +69 -2
- package/src/views/page-builder/PageTemplates.tsx +340 -57
- package/src/views/page-editor/PageSectionEditor.tsx +9 -2
- package/src/views/page-editor/PageSettingsModal.tsx +75 -2
- package/src/views/seo/ContentTab.tsx +113 -80
- package/src/views/settings/AccessProtectionCard.tsx +83 -53
- package/src/views/settings/SecurityTab.tsx +23 -2
- package/src/views/settings/SessionPolicyCard.tsx +45 -9
- package/src/views/settings/useSecuritySettings.ts +78 -22
- package/dist/components/forms/FormSchemaDrawer.d.ts +0 -9
- package/dist/components/forms/FormSchemaDrawer.d.ts.map +0 -1
- package/dist/components/forms/FormSchemaDrawer.js +0 -99
- package/dist/components/forms/FormSchemaDrawer.js.map +0 -1
- package/dist/components/seo/SeoEditorDrawer.d.ts +0 -8
- package/dist/components/seo/SeoEditorDrawer.d.ts.map +0 -1
- package/dist/components/seo/SeoEditorDrawer.js +0 -172
- package/dist/components/seo/SeoEditorDrawer.js.map +0 -1
- package/dist/views/ScriptTagEditor.d.ts +0 -6
- package/dist/views/ScriptTagEditor.d.ts.map +0 -1
- package/dist/views/ScriptTagEditor.js +0 -111
- package/dist/views/ScriptTagEditor.js.map +0 -1
- package/src/components/forms/FormSchemaDrawer.tsx +0 -192
- package/src/components/seo/SeoEditorDrawer.tsx +0 -529
- package/src/views/ScriptTagEditor.tsx +0 -353
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
4
|
+
import { Check, ChevronRight, Copy, ExternalLink, FileQuestion, LayoutTemplate, Lock, Plus, } from 'lucide-react';
|
|
5
|
+
import { toast } from 'sonner';
|
|
6
|
+
import { fetchPosts } from '../../lib/posts-service.js';
|
|
7
|
+
import { fetchPostTypeDetail, fieldKeyFromName, fieldTypeLabel, humanizeFieldName, renderFieldSnippet, } from '../../lib/post-types-service.js';
|
|
8
|
+
import { paletteFor } from '../../components/posts/badges.js';
|
|
9
|
+
import { resolvePostTypeIcon } from '../../components/posts/icons.js';
|
|
10
|
+
import { Toggle } from '../../components/ui/Toggle.js';
|
|
11
|
+
const ADDABLE_FIELD_TYPES = [
|
|
12
|
+
{ type: 'text', desc: 'Single line' },
|
|
13
|
+
{ type: 'richText', desc: 'WYSIWYG' },
|
|
14
|
+
{ type: 'number', desc: 'Int / decimal' },
|
|
15
|
+
{ type: 'date', desc: 'Date & time' },
|
|
16
|
+
{ type: 'boolean', desc: 'True / false' },
|
|
17
|
+
{ type: 'url', desc: 'Web address' },
|
|
18
|
+
{ type: 'email', desc: 'Email address' },
|
|
19
|
+
{ type: 'select', desc: 'Dropdown' },
|
|
20
|
+
{ type: 'media', desc: 'Image / file' },
|
|
21
|
+
{ type: 'relationship', desc: 'Link to type' },
|
|
22
|
+
{ type: 'json', desc: 'Raw data' },
|
|
23
|
+
];
|
|
24
|
+
export function PostTypeEditor({ slug, onNavigate }) {
|
|
25
|
+
const [detail, setDetail] = useState(null);
|
|
26
|
+
const [postCount, setPostCount] = useState(null);
|
|
27
|
+
const [loading, setLoading] = useState(true);
|
|
28
|
+
const [error, setError] = useState(null);
|
|
29
|
+
const [notFound, setNotFound] = useState(false);
|
|
30
|
+
const [refreshToken, setRefreshToken] = useState(0);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
let cancelled = false;
|
|
33
|
+
setLoading(true);
|
|
34
|
+
setError(null);
|
|
35
|
+
setNotFound(false);
|
|
36
|
+
Promise.all([fetchPostTypeDetail(slug), fetchPosts({ pageSize: 1 }).catch(() => null)])
|
|
37
|
+
.then(([d, postsRes]) => {
|
|
38
|
+
if (cancelled)
|
|
39
|
+
return;
|
|
40
|
+
if (!d) {
|
|
41
|
+
setNotFound(true);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
setDetail(d);
|
|
45
|
+
const typeRow = postsRes?.types.find((t) => t.slug === slug);
|
|
46
|
+
setPostCount(typeRow?.postCount ?? null);
|
|
47
|
+
}
|
|
48
|
+
setLoading(false);
|
|
49
|
+
})
|
|
50
|
+
.catch((err) => {
|
|
51
|
+
if (cancelled)
|
|
52
|
+
return;
|
|
53
|
+
setError(err instanceof Error ? err.message : 'Failed to load post type');
|
|
54
|
+
setLoading(false);
|
|
55
|
+
});
|
|
56
|
+
return () => {
|
|
57
|
+
cancelled = true;
|
|
58
|
+
};
|
|
59
|
+
}, [slug, refreshToken]);
|
|
60
|
+
if (loading)
|
|
61
|
+
return _jsx(EditorSkeleton, {});
|
|
62
|
+
if (notFound) {
|
|
63
|
+
return (_jsx(CenteredNotice, { title: `No post type named "${slug}"`, body: "It may have been removed from actuate.config.ts.", actionLabel: "Back to Post Types", onAction: () => onNavigate('/posts/types') }));
|
|
64
|
+
}
|
|
65
|
+
if (error || !detail) {
|
|
66
|
+
return (_jsx(CenteredNotice, { title: error ?? 'Failed to load post type', actionLabel: "Try again", onAction: () => setRefreshToken((t) => t + 1) }));
|
|
67
|
+
}
|
|
68
|
+
return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsx(EditorToolbar, { detail: detail, postCount: postCount, onNavigate: onNavigate }), _jsxs("div", { className: "flex min-h-0 flex-1 flex-col gap-6 overflow-y-auto p-4 sm:p-6 lg:flex-row lg:items-start lg:overflow-hidden", children: [_jsx(IdentityPanel, { detail: detail }), _jsx(FieldBuilder, { detail: detail })] })] }));
|
|
69
|
+
}
|
|
70
|
+
// ─── Toolbar ─────────────────────────────────────────────────────────
|
|
71
|
+
function EditorToolbar({ detail, postCount, onNavigate, }) {
|
|
72
|
+
const palette = paletteFor(detail.color);
|
|
73
|
+
return (_jsxs("div", { className: "border-border bg-card flex flex-wrap items-center gap-3 border-b px-4 py-3 sm:px-6", children: [_jsxs("nav", { "aria-label": "Breadcrumb", className: "flex min-w-0 items-center gap-1.5 text-sm", children: [_jsx("button", { type: "button", onClick: () => onNavigate('/posts/types'), className: "text-muted-foreground hover:text-foreground transition-colors", children: "Post Types" }), _jsx(ChevronRight, { className: "text-muted-foreground h-3.5 w-3.5 shrink-0", "aria-hidden": true }), _jsx("span", { className: "text-foreground truncate font-medium", children: detail.plural })] }), postCount !== null && (_jsxs("span", { className: `inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium tabular-nums ${palette.bg} ${palette.text}`, children: [postCount, " ", postCount === 1 ? 'post' : 'posts'] })), _jsxs("div", { className: "ml-auto flex items-center gap-2", children: [_jsxs("button", { type: "button", onClick: () => onNavigate(`/posts/types/${detail.slug}/template`), className: "border-border text-foreground hover:bg-accent focus-visible:ring-ring inline-flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm font-medium transition-colors focus:outline-none focus-visible:ring-2", children: [_jsx(LayoutTemplate, { className: "h-3.5 w-3.5", "aria-hidden": true }), "Edit template"] }), _jsxs("button", { type: "button", onClick: () => onNavigate('/posts'), className: "bg-primary text-primary-foreground hover:bg-primary/90 focus-visible:ring-ring inline-flex items-center gap-1.5 rounded-lg px-3 py-1.5 text-sm font-medium shadow-sm transition-colors focus:outline-none focus-visible:ring-2", children: [_jsx(ExternalLink, { className: "h-3.5 w-3.5", "aria-hidden": true }), "View posts"] })] })] }));
|
|
74
|
+
}
|
|
75
|
+
// ─── Identity panel (left, 340px) ────────────────────────────────────
|
|
76
|
+
function IdentityPanel({ detail }) {
|
|
77
|
+
const palette = paletteFor(detail.color);
|
|
78
|
+
const Icon = resolvePostTypeIcon(detail.icon);
|
|
79
|
+
return (_jsxs("aside", { "aria-label": "Post type identity", className: "flex w-full shrink-0 flex-col gap-5 lg:max-h-full lg:w-[340px] lg:overflow-y-auto", children: [_jsxs(IdentitySection, { title: "Identity", children: [_jsx(ReadOnlyField, { label: "Type Name", value: detail.plural }), _jsx(ReadOnlyField, { label: "API Slug", value: detail.slug, mono: true }), _jsx(ReadOnlyField, { label: "Description", value: detail.description ?? 'No description provided.' }), _jsxs("p", { className: "text-muted-foreground text-xs", children: ["Identity and fields are defined in ", _jsx("code", { className: "font-mono", children: "actuate.config.ts" }), ' ', "under ", _jsxs("code", { className: "font-mono", children: ["collections.", detail.slug] }), ". Edit the config and redeploy to change them."] })] }), _jsx(IdentitySection, { title: "Icon & color", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("span", { className: `inline-flex h-10 w-10 items-center justify-center rounded-lg ${palette.bg} ${palette.text}`, children: _jsx(Icon, { className: "h-5 w-5", "aria-hidden": true }) }), _jsxs("div", { className: "flex flex-col gap-0.5 text-sm", children: [_jsx("span", { className: "text-foreground font-medium", children: detail.icon ?? 'file-text' }), _jsxs("span", { className: "text-muted-foreground text-xs", children: ["Accent: ", detail.color ?? 'default'] })] })] }) }), _jsx(IdentitySection, { title: "API preview", children: _jsxs("div", { className: "border-border bg-muted flex flex-col gap-1.5 overflow-x-auto rounded-lg border p-3 font-mono text-xs", children: [_jsx(ApiRow, { method: "GET", path: `/api/cms/collections/${detail.slug}` }), _jsx(ApiRow, { method: "GET", path: `/api/cms/collections/${detail.slug}/{id}` }), _jsx(ApiRow, { method: "POST", path: `/api/cms/collections/${detail.slug}` })] }) })] }));
|
|
80
|
+
}
|
|
81
|
+
function IdentitySection({ title, children }) {
|
|
82
|
+
return (_jsxs("section", { className: "bg-card border-border flex flex-col gap-3 rounded-xl border p-5 shadow-sm", children: [_jsx("h2", { className: "text-muted-foreground text-xs font-medium tracking-wide uppercase", children: title }), children] }));
|
|
83
|
+
}
|
|
84
|
+
function ReadOnlyField({ label, value, mono }) {
|
|
85
|
+
return (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("span", { className: "text-foreground text-sm font-medium", children: label }), _jsx("div", { className: `border-border bg-muted text-foreground rounded-lg border px-3 py-1.5 text-sm ${mono ? 'font-mono' : ''}`, children: value })] }));
|
|
86
|
+
}
|
|
87
|
+
function ApiRow({ method, path }) {
|
|
88
|
+
return (_jsxs("div", { className: "flex items-center gap-2 whitespace-nowrap", children: [_jsx("span", { className: `w-10 shrink-0 font-medium ${method === 'GET' ? 'text-success' : 'text-info'}`, children: method }), _jsx("span", { className: "text-muted-foreground", children: path })] }));
|
|
89
|
+
}
|
|
90
|
+
// ─── Field builder (right) ───────────────────────────────────────────
|
|
91
|
+
function FieldBuilder({ detail }) {
|
|
92
|
+
return (_jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-4 lg:max-h-full lg:overflow-y-auto", children: [_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("h2", { className: "text-foreground text-base font-medium", children: "Field Builder" }), _jsxs("p", { className: "text-muted-foreground text-sm", children: [detail.fields.length, " ", detail.fields.length === 1 ? 'field' : 'fields', " defined in", ' ', _jsx("code", { className: "font-mono", children: "actuate.config.ts" })] })] }), _jsx(FieldList, { detail: detail }), _jsx(AddFieldCard, { detail: detail })] }));
|
|
93
|
+
}
|
|
94
|
+
function FieldList({ detail }) {
|
|
95
|
+
return (_jsxs("div", { className: "bg-card border-border rounded-xl border shadow-sm", children: [_jsxs("div", { className: "border-border flex items-center gap-2 border-b px-4 py-3", children: [_jsx(Lock, { className: "text-muted-foreground h-3.5 w-3.5", "aria-hidden": true }), _jsx("span", { className: "text-foreground text-sm font-medium", children: "Fields" }), _jsxs("span", { className: "bg-muted text-muted-foreground ml-auto rounded-full px-2 py-0.5 text-xs font-medium", children: ["Defined in code \u00B7 ", detail.fields.length, " ", detail.fields.length === 1 ? 'field' : 'fields'] })] }), detail.fields.length === 0 ? (_jsx("p", { className: "text-muted-foreground px-4 py-6 text-center text-sm", children: "This type has no fields yet. Add one below." })) : (_jsx("ul", { className: "divide-border divide-y", children: detail.fields.map((f) => (_jsxs("li", { className: "flex items-center gap-3 px-4 py-2.5", children: [_jsx(Lock, { className: "text-muted-foreground h-3.5 w-3.5 shrink-0", "aria-hidden": true }), _jsxs("div", { className: "flex min-w-0 flex-col", children: [_jsx("span", { className: "text-foreground truncate text-sm font-medium", children: humanizeFieldName(f.name) }), _jsx("span", { className: "text-muted-foreground truncate font-mono text-xs", children: f.name })] }), _jsx("span", { className: "border-border text-muted-foreground ml-auto shrink-0 rounded-full border px-2 py-0.5 text-xs", children: fieldTypeLabel(f.type) }), _jsx("span", { className: `shrink-0 rounded-full px-2 py-0.5 text-xs font-medium ${f.required
|
|
96
|
+
? 'bg-destructive/10 text-destructive'
|
|
97
|
+
: 'bg-muted text-muted-foreground'}`, children: f.required ? 'Required' : 'Optional' })] }, f.name))) }))] }));
|
|
98
|
+
}
|
|
99
|
+
// ─── Add Field (snippet generator) ───────────────────────────────────
|
|
100
|
+
function AddFieldCard({ detail }) {
|
|
101
|
+
const [open, setOpen] = useState(false);
|
|
102
|
+
const [fieldType, setFieldType] = useState(null);
|
|
103
|
+
const [name, setName] = useState('');
|
|
104
|
+
const [helpText, setHelpText] = useState('');
|
|
105
|
+
const [required, setRequired] = useState(false);
|
|
106
|
+
const [copied, setCopied] = useState(false);
|
|
107
|
+
const key = useMemo(() => fieldKeyFromName(name), [name]);
|
|
108
|
+
const existingKeys = useMemo(() => new Set(detail.fields.map((f) => f.name)), [detail.fields]);
|
|
109
|
+
const duplicate = key !== '' && existingKeys.has(key);
|
|
110
|
+
const snippet = useMemo(() => {
|
|
111
|
+
if (!fieldType || !key)
|
|
112
|
+
return '';
|
|
113
|
+
return renderFieldSnippet({
|
|
114
|
+
key,
|
|
115
|
+
label: name.trim() || humanizeFieldName(key),
|
|
116
|
+
type: fieldType,
|
|
117
|
+
required,
|
|
118
|
+
helpText,
|
|
119
|
+
});
|
|
120
|
+
}, [fieldType, key, name, required, helpText]);
|
|
121
|
+
const reset = () => {
|
|
122
|
+
setFieldType(null);
|
|
123
|
+
setName('');
|
|
124
|
+
setHelpText('');
|
|
125
|
+
setRequired(false);
|
|
126
|
+
setCopied(false);
|
|
127
|
+
};
|
|
128
|
+
const copy = async () => {
|
|
129
|
+
try {
|
|
130
|
+
await navigator.clipboard.writeText(snippet);
|
|
131
|
+
setCopied(true);
|
|
132
|
+
toast.success('Field snippet copied — paste it into the fields map');
|
|
133
|
+
setTimeout(() => setCopied(false), 1800);
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
toast.error('Copy failed — select the snippet manually');
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
if (!open) {
|
|
140
|
+
return (_jsxs("button", { type: "button", onClick: () => setOpen(true), className: "border-border text-muted-foreground hover:text-foreground hover:border-primary/50 hover:bg-primary/5 focus-visible:ring-ring flex items-center justify-center gap-2 rounded-xl border-2 border-dashed px-4 py-4 text-sm font-medium transition-colors focus:outline-none focus-visible:ring-2", children: [_jsx(Plus, { className: "h-4 w-4", "aria-hidden": true }), "Add Field"] }));
|
|
141
|
+
}
|
|
142
|
+
return (_jsxs("div", { className: "bg-card border-border flex flex-col gap-4 rounded-xl border p-5 shadow-sm", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("h3", { className: "text-foreground text-sm font-medium", children: "Add Field" }), _jsx("button", { type: "button", onClick: () => {
|
|
143
|
+
reset();
|
|
144
|
+
setOpen(false);
|
|
145
|
+
}, className: "text-muted-foreground hover:text-foreground text-sm transition-colors", children: "Cancel" })] }), _jsx("div", { role: "radiogroup", "aria-label": "Field type", className: "grid grid-cols-2 gap-2 sm:grid-cols-3 xl:grid-cols-4", children: ADDABLE_FIELD_TYPES.map((t) => {
|
|
146
|
+
const selected = fieldType === t.type;
|
|
147
|
+
return (_jsxs("button", { type: "button", role: "radio", "aria-checked": selected, onClick: () => setFieldType(t.type), className: `focus-visible:ring-ring flex flex-col items-start gap-0.5 rounded-lg border p-2.5 text-left transition-colors focus:outline-none focus-visible:ring-2 ${selected
|
|
148
|
+
? 'border-primary bg-primary/5'
|
|
149
|
+
: 'border-border hover:border-primary/40 hover:bg-accent'}`, children: [_jsx("span", { className: "text-foreground text-sm font-medium", children: fieldTypeLabel(t.type) }), _jsx("span", { className: "text-muted-foreground text-xs", children: t.desc })] }, t.type));
|
|
150
|
+
}) }), fieldType && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("label", { htmlFor: "af-name", className: "text-foreground text-sm font-medium", children: "Field Name" }), _jsx("input", { id: "af-name", value: name, onChange: (e) => setName(e.target.value), placeholder: "e.g. Client Name", className: "border-border bg-background text-foreground focus:border-primary focus:ring-primary/30 w-full rounded-lg border px-3 py-1.5 text-sm focus:ring-2 focus:outline-none" })] }), _jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("label", { htmlFor: "af-key", className: "text-foreground text-sm font-medium", children: "Field Key" }), _jsx("input", { id: "af-key", value: key, readOnly: true, "aria-describedby": duplicate ? 'af-key-error' : undefined, className: "border-border bg-muted text-muted-foreground w-full rounded-lg border px-3 py-1.5 font-mono text-sm focus:outline-none" }), duplicate && (_jsxs("span", { id: "af-key-error", className: "text-destructive text-xs", children: ["A field named ", _jsx("code", { className: "font-mono", children: key }), " already exists on this type."] }))] })] }), _jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("label", { htmlFor: "af-help", className: "text-foreground text-sm font-medium", children: "Help Text (optional)" }), _jsx("input", { id: "af-help", value: helpText, onChange: (e) => setHelpText(e.target.value), placeholder: "Shown to editors as a hint", className: "border-border bg-background text-foreground focus:border-primary focus:ring-primary/30 w-full rounded-lg border px-3 py-1.5 text-sm focus:ring-2 focus:outline-none" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Toggle, { id: "af-required", checked: required, onCheckedChange: setRequired, "aria-labelledby": "af-required-label" }), _jsx("label", { id: "af-required-label", htmlFor: "af-required", className: "text-foreground text-sm", children: "Required field" })] }), snippet && !duplicate && (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("span", { className: "text-foreground text-sm font-medium", children: ["Add to ", _jsxs("code", { className: "font-mono", children: ["collections.", detail.slug, ".fields"] })] }), _jsxs("button", { type: "button", onClick: copy, className: "border-border bg-background text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-md border px-2.5 py-1 text-xs font-medium transition-colors", children: [copied ? (_jsx(Check, { className: "h-3.5 w-3.5", "aria-hidden": true })) : (_jsx(Copy, { className: "h-3.5 w-3.5", "aria-hidden": true })), copied ? 'Copied' : 'Copy snippet'] })] }), _jsx("pre", { className: "border-border bg-muted text-foreground overflow-x-auto rounded-lg border p-3 text-xs leading-relaxed", children: _jsx("code", { children: snippet }) }), _jsxs("p", { className: "text-muted-foreground text-xs", children: ["Paste the line into the type's ", _jsx("code", { className: "font-mono", children: "fields" }), " map in", ' ', _jsx("code", { className: "font-mono", children: "actuate.config.ts" }), " and redeploy \u2014 the field appears in the editor automatically."] })] }))] }))] }));
|
|
151
|
+
}
|
|
152
|
+
// ─── Loading / notice states ─────────────────────────────────────────
|
|
153
|
+
function EditorSkeleton() {
|
|
154
|
+
return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsx("div", { className: "border-border bg-card border-b px-4 py-3 sm:px-6", children: _jsx("div", { className: "bg-muted h-5 w-48 animate-pulse rounded" }) }), _jsxs("div", { className: "flex flex-col gap-6 p-4 sm:p-6 lg:flex-row", children: [_jsx("div", { className: "flex w-full flex-col gap-4 lg:w-[340px]", children: Array.from({ length: 3 }).map((_, i) => (_jsx("div", { className: "bg-card border-border h-32 animate-pulse rounded-xl border" }, i))) }), _jsx("div", { className: "bg-card border-border h-64 flex-1 animate-pulse rounded-xl border" })] })] }));
|
|
155
|
+
}
|
|
156
|
+
function CenteredNotice({ title, body, actionLabel, onAction, }) {
|
|
157
|
+
return (_jsxs("div", { className: "flex h-full flex-col items-center justify-center gap-2 p-8 text-center", children: [_jsx(FileQuestion, { className: "text-muted-foreground h-6 w-6", "aria-hidden": true }), _jsx("div", { className: "text-foreground text-sm font-medium", children: title }), body && _jsx("p", { className: "text-muted-foreground text-sm", children: body }), _jsx("button", { type: "button", onClick: onAction, className: "text-primary mt-2 text-sm font-medium hover:underline", children: actionLabel })] }));
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=PostTypeEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PostTypeEditor.js","sourceRoot":"","sources":["../../../src/views/Posts/PostTypeEditor.tsx"],"names":[],"mappings":"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"}
|
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
* - title + description
|
|
7
7
|
* - footer row: post count · field count · URL base
|
|
8
8
|
*
|
|
9
|
-
* Clicking a card opens
|
|
10
|
-
*
|
|
9
|
+
* Clicking a card opens the Post Type editor (`/posts/types/:slug/edit`) —
|
|
10
|
+
* identity, live field schema, and the Add Field snippet generator. Each
|
|
11
|
+
* card also has an "Edit Template" action (`/posts/types/:slug/template`)
|
|
11
12
|
* for the type's default layout. The dashed "+ New Post Type" card routes to
|
|
12
13
|
* `/posts/types/new`, where users get instructions for adding a new collection
|
|
13
14
|
* to the config file.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostTypesView.d.ts","sourceRoot":"","sources":["../../../src/views/Posts/PostTypesView.tsx"],"names":[],"mappings":"AAQA
|
|
1
|
+
{"version":3,"file":"PostTypesView.d.ts","sourceRoot":"","sources":["../../../src/views/Posts/PostTypesView.tsx"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,UAAU,kBAAkB;IAC1B,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC;AAED,wBAAgB,aAAa,CAAC,EAAE,UAAU,EAAE,EAAE,kBAAkB,2CAgE/D"}
|
|
@@ -41,7 +41,7 @@ function PostTypeCard({ type, onClick, onEditTemplate, }) {
|
|
|
41
41
|
// top-border color from the palette's `border` token directly so it
|
|
42
42
|
// stays in sync with the badge color.
|
|
43
43
|
const topBorderClass = palette.border;
|
|
44
|
-
return (_jsxs("div", { className: "bg-card border-border relative flex flex-col gap-3 overflow-hidden rounded-xl border p-5 shadow-sm transition-shadow hover:shadow-md", children: [_jsx("span", { "aria-hidden": true, className: `absolute inset-x-0 top-0 h-1 ${topBorderClass}` }), _jsxs("button", { type: "button", onClick: onClick, "aria-label": `
|
|
44
|
+
return (_jsxs("div", { className: "bg-card border-border relative flex flex-col gap-3 overflow-hidden rounded-xl border p-5 shadow-sm transition-shadow hover:shadow-md", children: [_jsx("span", { "aria-hidden": true, className: `absolute inset-x-0 top-0 h-1 ${topBorderClass}` }), _jsxs("button", { type: "button", onClick: onClick, "aria-label": `Edit ${type.name} post type`, className: "focus-visible:ring-ring -m-1 flex flex-col gap-3 rounded-lg p-1 text-left focus:outline-none focus-visible:ring-2", children: [_jsxs("div", { className: "flex items-center gap-3 pt-2", children: [_jsx("span", { className: `inline-flex h-9 w-9 items-center justify-center rounded-lg ${palette.bg} ${palette.text}`, children: _jsx(Icon, { className: "h-4 w-4", "aria-hidden": true }) }), _jsx("h2", { className: "text-foreground text-base leading-tight font-medium", children: type.name })] }), _jsx("p", { className: "text-muted-foreground line-clamp-2 text-sm", children: type.description ?? 'No description provided.' })] }), _jsxs("div", { className: "border-border mt-auto flex flex-wrap items-center gap-x-4 gap-y-1 border-t pt-3 text-xs", children: [_jsxs("span", { className: "text-foreground font-medium tabular-nums", children: [type.postCount, " ", _jsx("span", { className: "text-muted-foreground font-normal", children: "posts" })] }), _jsxs("span", { className: "text-foreground font-medium tabular-nums", children: [type.fieldCount, " ", _jsx("span", { className: "text-muted-foreground font-normal", children: "fields" })] }), _jsx("span", { className: "text-muted-foreground ml-auto truncate font-mono", children: type.urlBase })] }), _jsxs("button", { type: "button", onClick: onEditTemplate, className: "border-border text-foreground hover:bg-accent focus-visible:ring-ring inline-flex items-center justify-center gap-1.5 rounded-lg border px-2.5 py-1.5 text-xs font-medium transition-colors focus:outline-none focus-visible:ring-2", children: [_jsx(LayoutTemplate, { className: "h-3.5 w-3.5", "aria-hidden": true }), "Edit template"] })] }));
|
|
45
45
|
}
|
|
46
46
|
function NewPostTypeCard({ onClick }) {
|
|
47
47
|
return (_jsxs("button", { type: "button", onClick: onClick, "aria-label": "New Post Type", className: "border-border text-muted-foreground hover:text-foreground hover:border-primary/50 hover:bg-primary/5 focus-visible:ring-ring flex min-h-[170px] flex-col items-center justify-center gap-2 rounded-xl border-2 border-dashed bg-transparent p-5 transition-colors focus:outline-none focus-visible:ring-2", children: [_jsx("span", { className: "bg-muted text-muted-foreground inline-flex h-9 w-9 items-center justify-center rounded-full", children: _jsx(Plus, { className: "h-4 w-4", "aria-hidden": true }) }), _jsx("span", { className: "text-sm font-medium", children: "New Post Type" })] }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostTypesView.js","sourceRoot":"","sources":["../../../src/views/Posts/PostTypesView.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,UAAU,EAAiB,MAAM,4BAA4B,CAAA;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"PostTypesView.js","sourceRoot":"","sources":["../../../src/views/Posts/PostTypesView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
export interface ScriptTagsProps {
|
|
2
2
|
onNavigate?: (path: string) => void;
|
|
3
|
+
/** Deep-link support: open this tag's editor pane on mount (/script-tags/:id). */
|
|
4
|
+
initialSelectedId?: string;
|
|
5
|
+
/** Deep-link support: open the create pane on mount (/script-tags/new). */
|
|
6
|
+
initialNew?: boolean;
|
|
3
7
|
}
|
|
4
|
-
export declare function ScriptTags({
|
|
8
|
+
export declare function ScriptTags({ initialSelectedId, initialNew }: ScriptTagsProps): import("react/jsx-runtime").JSX.Element;
|
|
5
9
|
//# sourceMappingURL=ScriptTags.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScriptTags.d.ts","sourceRoot":"","sources":["../../src/views/ScriptTags.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ScriptTags.d.ts","sourceRoot":"","sources":["../../src/views/ScriptTags.tsx"],"names":[],"mappings":"AAiBA,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,kFAAkF;IAClF,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,2EAA2E;IAC3E,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAsCD,wBAAgB,UAAU,CAAC,EAAE,iBAAiB,EAAE,UAAU,EAAE,EAAE,eAAe,2CAkP5E"}
|
package/dist/views/ScriptTags.js
CHANGED
|
@@ -5,13 +5,10 @@ import { Code2, Plus, Loader2, AlertTriangle } from 'lucide-react';
|
|
|
5
5
|
import { toast } from 'sonner';
|
|
6
6
|
import { EnabledSwitch } from '../components/EnabledSwitch.js';
|
|
7
7
|
import { StatPill } from '../components/ui/StatPill.js';
|
|
8
|
+
import { InspectorPane, SplitPaneLayout, SplitPaneList } from '../components/ui/InspectorPane.js';
|
|
9
|
+
import { CONSENT_LABELS, PLACEMENT_LABELS, ScriptTagEditorPane, } from '../components/script-tags/ScriptTagEditorPane.js';
|
|
8
10
|
import { useApiData } from '../lib/useApiData.js';
|
|
9
11
|
import { cmsApi } from '../lib/api.js';
|
|
10
|
-
const PLACEMENT_LABELS = {
|
|
11
|
-
head: 'Head',
|
|
12
|
-
body_open: 'Body Open',
|
|
13
|
-
body_close: 'Body Close',
|
|
14
|
-
};
|
|
15
12
|
const PLACEMENT_COLORS = {
|
|
16
13
|
head: 'bg-accent text-accent-foreground',
|
|
17
14
|
body_open: 'bg-primary/15 text-primary',
|
|
@@ -41,14 +38,30 @@ function scopeLabel(tag) {
|
|
|
41
38
|
}
|
|
42
39
|
return scope || 'Custom';
|
|
43
40
|
}
|
|
44
|
-
|
|
41
|
+
function formatUpdated(value) {
|
|
42
|
+
const date = new Date(value);
|
|
43
|
+
if (Number.isNaN(date.getTime()))
|
|
44
|
+
return '—';
|
|
45
|
+
return date.toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' });
|
|
46
|
+
}
|
|
47
|
+
export function ScriptTags({ initialSelectedId, initialNew }) {
|
|
45
48
|
const { data, loading, error, refetch } = useApiData('/script-tags');
|
|
46
49
|
const [togglingId, setTogglingId] = useState(null);
|
|
47
50
|
const [enabledOverrides, setEnabledOverrides] = useState({});
|
|
51
|
+
const [selection, setSelection] = useState(initialNew
|
|
52
|
+
? { mode: 'new' }
|
|
53
|
+
: initialSelectedId
|
|
54
|
+
? { mode: 'edit', id: initialSelectedId }
|
|
55
|
+
: null);
|
|
48
56
|
const tags = useMemo(() => (data ?? []).map((tag) => ({
|
|
49
57
|
...tag,
|
|
50
58
|
enabled: enabledOverrides[tag.id] ?? normalizeEnabled(tag.enabled),
|
|
51
59
|
})), [data, enabledOverrides]);
|
|
60
|
+
const selectedTag = selection?.mode === 'edit' ? (tags.find((t) => t.id === selection.id) ?? null) : null;
|
|
61
|
+
const paneOpen = selection?.mode === 'new' || selectedTag !== null;
|
|
62
|
+
const toggleRow = (tag) => {
|
|
63
|
+
setSelection((prev) => prev?.mode === 'edit' && prev.id === tag.id ? null : { mode: 'edit', id: tag.id });
|
|
64
|
+
};
|
|
52
65
|
const toggleEnabled = async (tag, nextEnabled) => {
|
|
53
66
|
setEnabledOverrides((prev) => ({ ...prev, [tag.id]: nextEnabled }));
|
|
54
67
|
setTogglingId(tag.id);
|
|
@@ -70,9 +83,21 @@ export function ScriptTags({ onNavigate }) {
|
|
|
70
83
|
refetch();
|
|
71
84
|
toast.success(saved ? 'Tag enabled' : 'Tag disabled');
|
|
72
85
|
};
|
|
86
|
+
const handlePaneChanged = (savedId) => {
|
|
87
|
+
setEnabledOverrides({});
|
|
88
|
+
refetch();
|
|
89
|
+
if (savedId)
|
|
90
|
+
setSelection({ mode: 'edit', id: savedId });
|
|
91
|
+
};
|
|
73
92
|
if (loading) {
|
|
74
93
|
return (_jsx("div", { className: "flex h-64 items-center justify-center p-3 pr-6 sm:p-4 sm:pr-8", children: _jsx(Loader2, { className: "text-primary h-6 w-6 animate-spin" }) }));
|
|
75
94
|
}
|
|
76
|
-
return (_jsxs("div", { className: "p-3 pr-6 sm:p-4 sm:pr-8", children: [error && (_jsxs("div", { className: "border-destructive/30 bg-destructive/10 mb-4 flex items-center gap-3 rounded-lg border p-3", children: [_jsx(AlertTriangle, { className: "text-destructive h-5 w-5 shrink-0" }), _jsx("span", { className: "text-destructive flex-1 text-sm", children: error }), _jsx("button", { onClick: refetch, className: "border-destructive/40 text-destructive hover:bg-destructive/15 rounded-lg border px-3 py-1 text-sm transition-colors", children: "Retry" })] })), _jsxs("div", { className: "mb-4 flex items-center justify-between", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-foreground mb-1", children: "Script Tags" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Manage tracking codes, analytics, and custom scripts injected into your site" }), tags.length > 0 && (_jsxs("div", { className: "mt-3 flex flex-wrap gap-1.5", children: [_jsx(StatPill, { value: tags.length, label: "Total" }), _jsx(StatPill, { value: tags.filter((t) => t.enabled).length, label: "Active", valueClassName: "text-[var(--suc)]" }), _jsx(StatPill, { value: tags.filter((t) => !t.enabled).length, label: "Inactive", valueClassName: "text-[var(--muted)]" })] }))] }), _jsxs("button", { type: "button", onClick: () =>
|
|
95
|
+
return (_jsxs("div", { className: "flex h-full min-h-0 flex-col", children: [_jsxs("div", { className: "p-3 pr-6 pb-0 sm:p-4 sm:pr-8 sm:pb-0", children: [error && (_jsxs("div", { className: "border-destructive/30 bg-destructive/10 mb-4 flex items-center gap-3 rounded-lg border p-3", children: [_jsx(AlertTriangle, { className: "text-destructive h-5 w-5 shrink-0" }), _jsx("span", { className: "text-destructive flex-1 text-sm", children: error }), _jsx("button", { onClick: refetch, className: "border-destructive/40 text-destructive hover:bg-destructive/15 rounded-lg border px-3 py-1 text-sm transition-colors", children: "Retry" })] })), _jsxs("div", { className: "mb-4 flex items-center justify-between", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-foreground mb-1", children: "Script Tags" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Manage tracking codes, analytics, and custom scripts injected into your site" }), tags.length > 0 && (_jsxs("div", { className: "mt-3 flex flex-wrap gap-1.5", children: [_jsx(StatPill, { value: tags.length, label: "Total" }), _jsx(StatPill, { value: tags.filter((t) => t.enabled).length, label: "Active", valueClassName: "text-[var(--suc)]" }), _jsx(StatPill, { value: tags.filter((t) => !t.enabled).length, label: "Inactive", valueClassName: "text-[var(--muted)]" })] }))] }), _jsxs("button", { type: "button", onClick: () => setSelection({ mode: 'new' }), className: "bg-primary text-primary-foreground hover:bg-primary/90 flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-colors", children: [_jsx(Plus, { className: "h-4 w-4" }), "New Script"] })] })] }), _jsxs(SplitPaneLayout, { children: [_jsx(SplitPaneList, { className: "p-3 pt-0 pr-6 sm:p-4 sm:pt-0 sm:pr-8", children: tags.length === 0 && !error ? (_jsxs("div", { className: "border-border bg-card rounded-lg border p-12 text-center", children: [_jsx(Code2, { className: "text-muted-foreground mx-auto mb-3 h-10 w-10" }), _jsx("h3", { className: "text-foreground text-sm font-medium", children: "No script tags yet" }), _jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: "Add tracking codes like Google Analytics, Tag Manager, or Facebook Pixel." }), _jsxs("button", { type: "button", onClick: () => setSelection({ mode: 'new' }), className: "bg-primary text-primary-foreground hover:bg-primary/90 mt-4 inline-flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-colors", children: [_jsx(Plus, { className: "h-4 w-4" }), "Add Your First Script"] })] })) : (_jsx("div", { className: "border-border bg-card overflow-hidden rounded-lg border", children: _jsxs("table", { className: "w-full text-sm", "aria-label": "Script tags", children: [_jsx("thead", { children: _jsxs("tr", { className: "border-border bg-muted border-b", children: [_jsx("th", { className: "text-muted-foreground px-4 py-3 text-left font-medium", children: "Script" }), _jsx("th", { className: "text-muted-foreground px-4 py-3 text-left font-medium", children: "Location" }), _jsx("th", { className: "text-muted-foreground px-4 py-3 text-center font-medium", children: "Priority" }), _jsx("th", { className: "text-muted-foreground px-4 py-3 text-left font-medium", children: "Scope" }), _jsx("th", { className: "text-muted-foreground px-4 py-3 text-left font-medium", children: "Consent" }), _jsx("th", { className: "text-muted-foreground px-4 py-3 text-center font-medium", children: "Active" }), _jsx("th", { className: "text-muted-foreground px-4 py-3 text-left font-medium", children: "Updated" })] }) }), _jsx("tbody", { children: tags.map((tag) => {
|
|
96
|
+
const isSelected = selection?.mode === 'edit' && selection.id === tag.id;
|
|
97
|
+
return (_jsxs("tr", { className: `border-border cursor-pointer border-b transition-colors last:border-0 ${isSelected ? 'bg-[var(--acc-l)]' : 'hover:bg-muted'}`, onClick: () => toggleRow(tag), children: [_jsx("td", { className: "px-4 py-[11px]", children: _jsx("button", { type: "button", onClick: (e) => {
|
|
98
|
+
e.stopPropagation();
|
|
99
|
+
toggleRow(tag);
|
|
100
|
+
}, "aria-expanded": isSelected, className: "text-foreground hover:text-primary text-left font-medium", children: tag.name }) }), _jsx("td", { className: "px-4 py-[11px]", children: _jsx("span", { className: `inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium ${PLACEMENT_COLORS[tag.placement] ?? 'bg-muted text-foreground'}`, children: PLACEMENT_LABELS[tag.placement] ?? tag.placement }) }), _jsx("td", { className: "text-muted-foreground px-4 py-[11px] text-center font-mono", children: tag.priority }), _jsx("td", { className: "text-muted-foreground px-4 py-[11px]", children: scopeLabel(tag) }), _jsx("td", { className: "px-4 py-[11px]", children: tag.consentCategory && tag.consentCategory !== 'none' ? (_jsx("span", { className: "rounded-[5px] border border-[var(--bdr)] bg-[var(--bg)] px-1.5 py-0.5 text-[11px] text-[var(--sub)]", children: CONSENT_LABELS[tag.consentCategory] ?? tag.consentCategory })) : (_jsx("span", { className: "text-muted-foreground text-xs", children: "\u2014" })) }), _jsx("td", { className: "px-4 py-[11px] text-center", onClick: (e) => e.stopPropagation(), children: _jsx(EnabledSwitch, { checked: tag.enabled, disabled: togglingId === tag.id, onCheckedChange: (next) => void toggleEnabled(tag, next), "aria-label": `${tag.enabled ? 'Disable' : 'Enable'} ${tag.name}` }) }), _jsx("td", { className: "text-muted-foreground px-4 py-[11px] text-xs", children: formatUpdated(tag.updatedAt) })] }, tag.id));
|
|
101
|
+
}) })] }) })) }), _jsx(InspectorPane, { open: paneOpen, width: 420, "aria-label": "Script editor", children: _jsx(ScriptTagEditorPane, { tag: selectedTag, onClose: () => setSelection(null), onChanged: handlePaneChanged }, selection?.mode === 'edit' ? selection.id : 'new') })] })] }));
|
|
77
102
|
}
|
|
78
103
|
//# sourceMappingURL=ScriptTags.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScriptTags.js","sourceRoot":"","sources":["../../src/views/ScriptTags.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AACvD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"ScriptTags.js","sourceRoot":"","sources":["../../src/views/ScriptTags.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface OnboardingSignals {
|
|
2
|
+
/** Combined document count across post/page-type collections. */
|
|
3
|
+
postsAndPagesCount: number;
|
|
4
|
+
/** `totalMedia` from /stats. */
|
|
5
|
+
mediaCount: number;
|
|
6
|
+
/** `avgSeoScore` from /stats (0 when nothing is scored yet). */
|
|
7
|
+
seoScore: number;
|
|
8
|
+
/** `totalUsers` from /stats. */
|
|
9
|
+
userCount: number;
|
|
10
|
+
/** `hasData` from /stats/api-delivery — any delivery traffic recorded. */
|
|
11
|
+
hasApiTraffic: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface OnboardingStep {
|
|
14
|
+
id: string;
|
|
15
|
+
label: string;
|
|
16
|
+
done: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function deriveOnboardingSteps(signals: OnboardingSignals): OnboardingStep[];
|
|
19
|
+
/**
|
|
20
|
+
* The block appears only when content is essentially empty: zero posts +
|
|
21
|
+
* pages AND zero media (steps 2 and 3 both incomplete).
|
|
22
|
+
*/
|
|
23
|
+
export declare function shouldShowOnboarding(signals: Pick<OnboardingSignals, 'postsAndPagesCount' | 'mediaCount'>): boolean;
|
|
24
|
+
export interface OnboardingBlockProps {
|
|
25
|
+
signals: OnboardingSignals;
|
|
26
|
+
onNavigate?: (path: string) => void;
|
|
27
|
+
}
|
|
28
|
+
export declare function OnboardingBlock({ signals, onNavigate }: OnboardingBlockProps): import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
//# sourceMappingURL=OnboardingBlock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OnboardingBlock.d.ts","sourceRoot":"","sources":["../../../src/views/dashboard/OnboardingBlock.tsx"],"names":[],"mappings":"AAmCA,MAAM,WAAW,iBAAiB;IAChC,iEAAiE;IACjE,kBAAkB,EAAE,MAAM,CAAA;IAC1B,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,gEAAgE;IAChE,QAAQ,EAAE,MAAM,CAAA;IAChB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,0EAA0E;IAC1E,aAAa,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,OAAO,CAAA;CACd;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,iBAAiB,GAAG,cAAc,EAAE,CAalF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,oBAAoB,GAAG,YAAY,CAAC,GACpE,OAAO,CAET;AAqBD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,iBAAiB,CAAA;IAC1B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC;AAED,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,oBAAoB,2CAiI5E"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* Dashboard onboarding / getting-started block (design: Dashboard.html
|
|
5
|
+
* `OnboardingSection`). Shown only while the site is effectively empty —
|
|
6
|
+
* it REPLACES the Recent Activity / Publishing Queue / Content Health grid
|
|
7
|
+
* (see `shouldShowOnboarding`), sitting between the stats row and the
|
|
8
|
+
* Delivery API card.
|
|
9
|
+
*
|
|
10
|
+
* Steps are DERIVED from data the dashboard already fetches — the
|
|
11
|
+
* prototype's click-to-toggle checklist was mock behavior. No new API
|
|
12
|
+
* endpoints; every signal below comes from `/stats` or
|
|
13
|
+
* `/stats/api-delivery`:
|
|
14
|
+
*
|
|
15
|
+
* 1. Create your workspace — always complete (they're logged in).
|
|
16
|
+
* 2. Create your first Post/Page — post/page collection counts > 0.
|
|
17
|
+
* 3. Upload media assets — `totalMedia > 0`.
|
|
18
|
+
* 4. Configure SEO defaults — `avgSeoScore > 0`. The average SEO
|
|
19
|
+
* score is the only SEO signal in already-fetched data; it is 0 until
|
|
20
|
+
* content is scored, so the step reads incomplete on an empty site
|
|
21
|
+
* (honest, if conservative).
|
|
22
|
+
* 5. Get your API key — no API-key count exists in dashboard
|
|
23
|
+
* data, so we use recorded delivery-API traffic (`hasData` from
|
|
24
|
+
* /stats/api-delivery) as the proxy: traffic means the API is being
|
|
25
|
+
* consumed. Incomplete by default.
|
|
26
|
+
* 6. Invite team members — `totalUsers > 1`.
|
|
27
|
+
*
|
|
28
|
+
* Quick links deviate from the prototype in one place: "Webhooks guide"
|
|
29
|
+
* has no in-admin destination or docs URL (webhooks UI only exists inside
|
|
30
|
+
* individual form settings), so it is replaced with an internal SEO
|
|
31
|
+
* defaults link — no dead links.
|
|
32
|
+
*/
|
|
33
|
+
import { Check, ChevronRight, Code, Key, Search, Users } from 'lucide-react';
|
|
34
|
+
export function deriveOnboardingSteps(signals) {
|
|
35
|
+
return [
|
|
36
|
+
{ id: 'workspace', label: 'Create your workspace', done: true },
|
|
37
|
+
{
|
|
38
|
+
id: 'first-content',
|
|
39
|
+
label: 'Create your first Post or Page',
|
|
40
|
+
done: signals.postsAndPagesCount > 0,
|
|
41
|
+
},
|
|
42
|
+
{ id: 'media', label: 'Upload media assets', done: signals.mediaCount > 0 },
|
|
43
|
+
{ id: 'seo', label: 'Configure SEO defaults', done: signals.seoScore > 0 },
|
|
44
|
+
{ id: 'api-key', label: 'Get your API key', done: signals.hasApiTraffic },
|
|
45
|
+
{ id: 'invite', label: 'Invite team members', done: signals.userCount > 1 },
|
|
46
|
+
];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The block appears only when content is essentially empty: zero posts +
|
|
50
|
+
* pages AND zero media (steps 2 and 3 both incomplete).
|
|
51
|
+
*/
|
|
52
|
+
export function shouldShowOnboarding(signals) {
|
|
53
|
+
return signals.postsAndPagesCount === 0 && signals.mediaCount === 0;
|
|
54
|
+
}
|
|
55
|
+
const QUICK_LINKS = [
|
|
56
|
+
{
|
|
57
|
+
icon: Code,
|
|
58
|
+
label: 'API Reference',
|
|
59
|
+
sub: 'REST & GraphQL docs',
|
|
60
|
+
path: '/settings?tab=api-keys',
|
|
61
|
+
},
|
|
62
|
+
{ icon: Search, label: 'SEO defaults', sub: 'Set up site metadata', path: '/settings?tab=seo' },
|
|
63
|
+
{ icon: Users, label: 'Invite team', sub: 'Add editors & admins', path: '/settings?tab=users' },
|
|
64
|
+
{ icon: Key, label: 'API Keys', sub: 'Manage access tokens', path: '/settings?tab=api-keys' },
|
|
65
|
+
];
|
|
66
|
+
export function OnboardingBlock({ signals, onNavigate }) {
|
|
67
|
+
const steps = deriveOnboardingSteps(signals);
|
|
68
|
+
const done = steps.filter((s) => s.done).length;
|
|
69
|
+
return (_jsxs("div", { className: "space-y-3.5", children: [_jsxs("section", { "aria-labelledby": "ob-welcome-title", className: "rounded-[var(--r)] border border-[var(--bdr)] bg-[linear-gradient(135deg,var(--acc-l)_0%,var(--card)_60%)] px-7 py-6 shadow-[var(--shd)]", children: [_jsxs("h2", { id: "ob-welcome-title", className: "text-[17px] font-medium tracking-[-0.3px] text-[var(--txt)]", children: ["Welcome to ActuateCMS ", _jsx("span", { "aria-hidden": true, children: "\uD83D\uDC4B" })] }), _jsxs("p", { className: "mt-1 max-w-[480px] text-[length:var(--fs-body)] text-[var(--sub)]", children: ["Your headless CMS is ready. Complete these steps to start delivering content to your frontend. ", done, "/", steps.length, " steps complete."] }), _jsx("div", { role: "progressbar", "aria-label": "Onboarding progress", "aria-valuemin": 0, "aria-valuemax": steps.length, "aria-valuenow": done, "aria-valuetext": `${done} of ${steps.length} steps complete`, className: "mt-3 h-[6px] max-w-[400px] overflow-hidden rounded-full bg-[var(--bdr)]", children: _jsx("div", { className: "h-full rounded-full bg-[var(--acc)] motion-safe:transition-[width] motion-safe:duration-[var(--motion-base)]", style: { width: `${(done / steps.length) * 100}%` } }) })] }), _jsxs("div", { className: "grid grid-cols-1 gap-3.5 lg:grid-cols-2", children: [_jsxs("section", { "aria-labelledby": "ob-checklist-title", className: "rounded-[var(--r)] border border-[var(--bdr)] bg-[var(--card)] p-6 shadow-[var(--shd)]", children: [_jsx("h3", { id: "ob-checklist-title", className: "text-[length:var(--fs-card)] font-medium text-[var(--txt)]", children: "Getting started" }), _jsx("p", { className: "mt-1 mb-4 text-[length:var(--fs-sub)] leading-[1.55] text-[var(--sub)]", children: "Complete each step to get the most out of ActuateCMS." }), _jsx("ul", { role: "list", className: "space-y-0.5", children: steps.map((step) => (_jsxs("li", { className: "flex items-center gap-[11px] rounded-lg px-2.5 py-2", children: [_jsx("span", { "aria-hidden": true, className: `flex h-[19px] w-[19px] shrink-0 items-center justify-center rounded-full motion-safe:transition-colors motion-safe:duration-[var(--motion-base)] ${step.done ? 'bg-[var(--suc)]' : 'border-2 border-[var(--bdr)]'}`, children: step.done && (_jsx(Check, { size: 11, strokeWidth: 2.5, className: "text-[var(--success-foreground)]" })) }), _jsx("span", { className: `text-[length:var(--fs-body)] ${step.done ? 'text-[var(--muted)] line-through' : 'text-[var(--txt)]'}`, children: step.label }), _jsx("span", { className: "sr-only", children: step.done ? '(completed)' : '(not completed)' })] }, step.id))) })] }), _jsxs("section", { "aria-labelledby": "ob-links-title", className: "rounded-[var(--r)] border border-[var(--bdr)] bg-[var(--card)] p-6 shadow-[var(--shd)]", children: [_jsx("h3", { id: "ob-links-title", className: "text-[length:var(--fs-card)] font-medium text-[var(--txt)]", children: "Quick links" }), _jsx("p", { className: "mt-1 mb-4 text-[length:var(--fs-sub)] leading-[1.55] text-[var(--sub)]", children: "Helpful resources for building with ActuateCMS." }), _jsx("ul", { role: "list", className: "space-y-0.5", children: QUICK_LINKS.map((link) => (_jsx("li", { children: _jsxs("button", { type: "button", onClick: () => onNavigate?.(link.path), className: "focus-visible:ring-ring flex w-full items-center gap-2.5 rounded-lg px-2.5 py-2 text-left transition-colors hover:bg-[var(--acc-l)] focus:outline-none focus-visible:ring-2", children: [_jsx("span", { "aria-hidden": true, className: "flex h-[30px] w-[30px] shrink-0 items-center justify-center rounded-[7px] bg-[var(--acc-l)] text-[var(--acc)]", children: _jsx(link.icon, { size: 14 }) }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "block truncate text-[length:var(--fs-body)] font-medium text-[var(--txt)]", children: link.label }), _jsx("span", { className: "block truncate text-[length:var(--fs-hint)] text-[var(--muted)]", children: link.sub })] }), _jsx(ChevronRight, { size: 14, className: "shrink-0 text-[var(--muted)]", "aria-hidden": true })] }) }, link.label))) })] })] })] }));
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=OnboardingBlock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OnboardingBlock.js","sourceRoot":"","sources":["../../../src/views/dashboard/OnboardingBlock.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { PageNode } from '@actuate-media/cms-core';
|
|
2
|
+
export interface BuilderSectionsPanelProps {
|
|
3
|
+
tree: PageNode;
|
|
4
|
+
selectedNodeId: string | null;
|
|
5
|
+
/** Collapsed to a slim rail. State is owned by PageBuilder (persisted). */
|
|
6
|
+
collapsed: boolean;
|
|
7
|
+
onToggleCollapsed: () => void;
|
|
8
|
+
onSelect: (id: string) => void;
|
|
9
|
+
/** Move a top-level section to `toIndex` within the page. */
|
|
10
|
+
onReorder: (id: string, toIndex: number) => void;
|
|
11
|
+
onAddSection: () => void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Design-parity left rail for the Page Builder (PageBuilder.html): the page's
|
|
15
|
+
* sections listed in order with drag-to-reorder, click-to-select (which
|
|
16
|
+
* highlights the section on the canvas and opens its settings in the existing
|
|
17
|
+
* right-hand context panel), and an "Add Section" affordance at the bottom.
|
|
18
|
+
*/
|
|
19
|
+
export declare function BuilderSectionsPanel({ tree, selectedNodeId, collapsed, onToggleCollapsed, onSelect, onReorder, onAddSection, }: BuilderSectionsPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
//# sourceMappingURL=BuilderSectionsPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BuilderSectionsPanel.d.ts","sourceRoot":"","sources":["../../../src/views/page-builder/BuilderSectionsPanel.tsx"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAe,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAEpE,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,QAAQ,CAAA;IACd,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,2EAA2E;IAC3E,SAAS,EAAE,OAAO,CAAA;IAClB,iBAAiB,EAAE,MAAM,IAAI,CAAA;IAC7B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,6DAA6D;IAC7D,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAChD,YAAY,EAAE,MAAM,IAAI,CAAA;CACzB;AA0ED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,YAAY,GACb,EAAE,yBAAyB,2CAsG3B"}
|