@actuate-media/cms-admin 0.15.0 → 0.16.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 +148 -2
- package/dist/AdminRoot.js.map +1 -1
- package/dist/__tests__/components/posts-badges.test.d.ts +2 -0
- package/dist/__tests__/components/posts-badges.test.d.ts.map +1 -0
- package/dist/__tests__/components/posts-badges.test.js +68 -0
- package/dist/__tests__/components/posts-badges.test.js.map +1 -0
- package/dist/__tests__/layout/sidebar-posts.test.d.ts +2 -0
- package/dist/__tests__/layout/sidebar-posts.test.d.ts.map +1 -0
- package/dist/__tests__/layout/sidebar-posts.test.js +162 -0
- package/dist/__tests__/layout/sidebar-posts.test.js.map +1 -0
- package/dist/__tests__/lib/page-editor-service.test.d.ts +2 -0
- package/dist/__tests__/lib/page-editor-service.test.d.ts.map +1 -0
- package/dist/__tests__/lib/page-editor-service.test.js +137 -0
- package/dist/__tests__/lib/page-editor-service.test.js.map +1 -0
- package/dist/__tests__/lib/pages-service.test.d.ts +2 -0
- package/dist/__tests__/lib/pages-service.test.d.ts.map +1 -0
- package/dist/__tests__/lib/pages-service.test.js +140 -0
- package/dist/__tests__/lib/pages-service.test.js.map +1 -0
- package/dist/__tests__/lib/post-editor-service.test.d.ts +2 -0
- package/dist/__tests__/lib/post-editor-service.test.d.ts.map +1 -0
- package/dist/__tests__/lib/post-editor-service.test.js +185 -0
- package/dist/__tests__/lib/post-editor-service.test.js.map +1 -0
- package/dist/__tests__/lib/posts-service.test.d.ts +2 -0
- package/dist/__tests__/lib/posts-service.test.d.ts.map +1 -0
- package/dist/__tests__/lib/posts-service.test.js +244 -0
- package/dist/__tests__/lib/posts-service.test.js.map +1 -0
- package/dist/__tests__/views/posts-list-view.test.d.ts +2 -0
- package/dist/__tests__/views/posts-list-view.test.d.ts.map +1 -0
- package/dist/__tests__/views/posts-list-view.test.js +98 -0
- package/dist/__tests__/views/posts-list-view.test.js.map +1 -0
- package/dist/actuate-admin.css +1 -1
- package/dist/components/pages/tag-badges.d.ts +21 -0
- package/dist/components/pages/tag-badges.d.ts.map +1 -0
- package/dist/components/pages/tag-badges.js +56 -0
- package/dist/components/pages/tag-badges.js.map +1 -0
- package/dist/components/posts/badges.d.ts +25 -0
- package/dist/components/posts/badges.d.ts.map +1 -0
- package/dist/components/posts/badges.js +123 -0
- package/dist/components/posts/badges.js.map +1 -0
- package/dist/components/posts/icons.d.ts +12 -0
- package/dist/components/posts/icons.d.ts.map +1 -0
- package/dist/components/posts/icons.js +26 -0
- package/dist/components/posts/icons.js.map +1 -0
- package/dist/layout/Layout.js +36 -8
- package/dist/layout/Layout.js.map +1 -1
- package/dist/layout/Sidebar.d.ts +9 -0
- package/dist/layout/Sidebar.d.ts.map +1 -1
- package/dist/layout/Sidebar.js +100 -48
- package/dist/layout/Sidebar.js.map +1 -1
- package/dist/lib/page-editor-service.d.ts +45 -0
- package/dist/lib/page-editor-service.d.ts.map +1 -0
- package/dist/lib/page-editor-service.js +153 -0
- package/dist/lib/page-editor-service.js.map +1 -0
- package/dist/lib/pages-service.d.ts +143 -0
- package/dist/lib/pages-service.d.ts.map +1 -0
- package/dist/lib/pages-service.js +444 -0
- package/dist/lib/pages-service.js.map +1 -0
- package/dist/lib/post-editor-service.d.ts +57 -0
- package/dist/lib/post-editor-service.d.ts.map +1 -0
- package/dist/lib/post-editor-service.js +234 -0
- package/dist/lib/post-editor-service.js.map +1 -0
- package/dist/lib/posts-service.d.ts +73 -0
- package/dist/lib/posts-service.d.ts.map +1 -0
- package/dist/lib/posts-service.js +245 -0
- package/dist/lib/posts-service.js.map +1 -0
- package/dist/lib/preview-link.d.ts +32 -0
- package/dist/lib/preview-link.d.ts.map +1 -0
- package/dist/lib/preview-link.js +40 -0
- package/dist/lib/preview-link.js.map +1 -0
- package/dist/router/index.d.ts +1 -0
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +9 -1
- package/dist/router/index.js.map +1 -1
- package/dist/views/Dashboard.d.ts.map +1 -1
- package/dist/views/Dashboard.js +14 -3
- package/dist/views/Dashboard.js.map +1 -1
- package/dist/views/Pages/PageTagManager.d.ts +14 -0
- package/dist/views/Pages/PageTagManager.d.ts.map +1 -0
- package/dist/views/Pages/PageTagManager.js +145 -0
- package/dist/views/Pages/PageTagManager.js.map +1 -0
- package/dist/views/Pages/PagesListView.d.ts +18 -0
- package/dist/views/Pages/PagesListView.d.ts.map +1 -0
- package/dist/views/Pages/PagesListView.js +287 -0
- package/dist/views/Pages/PagesListView.js.map +1 -0
- package/dist/views/Posts/NewPostPicker.d.ts +16 -0
- package/dist/views/Posts/NewPostPicker.d.ts.map +1 -0
- package/dist/views/Posts/NewPostPicker.js +59 -0
- package/dist/views/Posts/NewPostPicker.js.map +1 -0
- package/dist/views/Posts/NewPostTypeInstructions.d.ts +18 -0
- package/dist/views/Posts/NewPostTypeInstructions.d.ts.map +1 -0
- package/dist/views/Posts/NewPostTypeInstructions.js +147 -0
- package/dist/views/Posts/NewPostTypeInstructions.js.map +1 -0
- package/dist/views/Posts/PostTypesView.d.ts +26 -0
- package/dist/views/Posts/PostTypesView.d.ts.map +1 -0
- package/dist/views/Posts/PostTypesView.js +52 -0
- package/dist/views/Posts/PostTypesView.js.map +1 -0
- package/dist/views/Posts/PostsListView.d.ts +25 -0
- package/dist/views/Posts/PostsListView.d.ts.map +1 -0
- package/dist/views/Posts/PostsListView.js +239 -0
- package/dist/views/Posts/PostsListView.js.map +1 -0
- package/dist/views/Posts/post-type-presets.d.ts +32 -0
- package/dist/views/Posts/post-type-presets.d.ts.map +1 -0
- package/dist/views/Posts/post-type-presets.js +72 -0
- package/dist/views/Posts/post-type-presets.js.map +1 -0
- package/dist/views/page-builder/Widgets.d.ts +13 -0
- package/dist/views/page-builder/Widgets.d.ts.map +1 -0
- package/dist/views/page-builder/Widgets.js +15 -0
- package/dist/views/page-builder/Widgets.js.map +1 -0
- package/dist/views/page-editor/AddSectionModal.d.ts +20 -0
- package/dist/views/page-editor/AddSectionModal.d.ts.map +1 -0
- package/dist/views/page-editor/AddSectionModal.js +22 -0
- package/dist/views/page-editor/AddSectionModal.js.map +1 -0
- package/dist/views/page-editor/EditorCanvas.d.ts +18 -0
- package/dist/views/page-editor/EditorCanvas.d.ts.map +1 -0
- package/dist/views/page-editor/EditorCanvas.js +64 -0
- package/dist/views/page-editor/EditorCanvas.js.map +1 -0
- package/dist/views/page-editor/EditorTopBar.d.ts +30 -0
- package/dist/views/page-editor/EditorTopBar.d.ts.map +1 -0
- package/dist/views/page-editor/EditorTopBar.js +42 -0
- package/dist/views/page-editor/EditorTopBar.js.map +1 -0
- package/dist/views/page-editor/PagePreview.d.ts +13 -0
- package/dist/views/page-editor/PagePreview.d.ts.map +1 -0
- package/dist/views/page-editor/PagePreview.js +37 -0
- package/dist/views/page-editor/PagePreview.js.map +1 -0
- package/dist/views/page-editor/PageSectionEditor.d.ts +16 -0
- package/dist/views/page-editor/PageSectionEditor.d.ts.map +1 -0
- package/dist/views/page-editor/PageSectionEditor.js +272 -0
- package/dist/views/page-editor/PageSectionEditor.js.map +1 -0
- package/dist/views/page-editor/PageSettingsModal.d.ts +12 -0
- package/dist/views/page-editor/PageSettingsModal.d.ts.map +1 -0
- package/dist/views/page-editor/PageSettingsModal.js +52 -0
- package/dist/views/page-editor/PageSettingsModal.js.map +1 -0
- package/dist/views/page-editor/SectionInspector.d.ts +17 -0
- package/dist/views/page-editor/SectionInspector.d.ts.map +1 -0
- package/dist/views/page-editor/SectionInspector.js +98 -0
- package/dist/views/page-editor/SectionInspector.js.map +1 -0
- package/dist/views/page-editor/SectionsPanel.d.ts +15 -0
- package/dist/views/page-editor/SectionsPanel.d.ts.map +1 -0
- package/dist/views/page-editor/SectionsPanel.js +43 -0
- package/dist/views/page-editor/SectionsPanel.js.map +1 -0
- package/dist/views/page-editor/ValidationSummary.d.ts +9 -0
- package/dist/views/page-editor/ValidationSummary.d.ts.map +1 -0
- package/dist/views/page-editor/ValidationSummary.js +10 -0
- package/dist/views/page-editor/ValidationSummary.js.map +1 -0
- package/dist/views/page-editor/section-icons.d.ts +4 -0
- package/dist/views/page-editor/section-icons.d.ts.map +1 -0
- package/dist/views/page-editor/section-icons.js +20 -0
- package/dist/views/page-editor/section-icons.js.map +1 -0
- package/dist/views/page-editor/section-types.d.ts +11 -0
- package/dist/views/page-editor/section-types.d.ts.map +1 -0
- package/dist/views/page-editor/section-types.js +10 -0
- package/dist/views/page-editor/section-types.js.map +1 -0
- package/dist/views/page-editor/sections/ArticleBodySection.d.ts +13 -0
- package/dist/views/page-editor/sections/ArticleBodySection.d.ts.map +1 -0
- package/dist/views/page-editor/sections/ArticleBodySection.js +23 -0
- package/dist/views/page-editor/sections/ArticleBodySection.js.map +1 -0
- package/dist/views/page-editor/sections/AuthorBioSection.d.ts +8 -0
- package/dist/views/page-editor/sections/AuthorBioSection.d.ts.map +1 -0
- package/dist/views/page-editor/sections/AuthorBioSection.js +21 -0
- package/dist/views/page-editor/sections/AuthorBioSection.js.map +1 -0
- package/dist/views/page-editor/sections/ByTheNumbersSection.d.ts +5 -0
- package/dist/views/page-editor/sections/ByTheNumbersSection.d.ts.map +1 -0
- package/dist/views/page-editor/sections/ByTheNumbersSection.js +10 -0
- package/dist/views/page-editor/sections/ByTheNumbersSection.js.map +1 -0
- package/dist/views/page-editor/sections/CtaBannerSection.d.ts +5 -0
- package/dist/views/page-editor/sections/CtaBannerSection.d.ts.map +1 -0
- package/dist/views/page-editor/sections/CtaBannerSection.js +10 -0
- package/dist/views/page-editor/sections/CtaBannerSection.js.map +1 -0
- package/dist/views/page-editor/sections/FeatureHighlightSection.d.ts +5 -0
- package/dist/views/page-editor/sections/FeatureHighlightSection.d.ts.map +1 -0
- package/dist/views/page-editor/sections/FeatureHighlightSection.js +18 -0
- package/dist/views/page-editor/sections/FeatureHighlightSection.js.map +1 -0
- package/dist/views/page-editor/sections/GallerySection.d.ts +6 -0
- package/dist/views/page-editor/sections/GallerySection.d.ts.map +1 -0
- package/dist/views/page-editor/sections/GallerySection.js +17 -0
- package/dist/views/page-editor/sections/GallerySection.js.map +1 -0
- package/dist/views/page-editor/sections/HeroBannerSection.d.ts +5 -0
- package/dist/views/page-editor/sections/HeroBannerSection.d.ts.map +1 -0
- package/dist/views/page-editor/sections/HeroBannerSection.js +11 -0
- package/dist/views/page-editor/sections/HeroBannerSection.js.map +1 -0
- package/dist/views/page-editor/sections/MissionSection.d.ts +6 -0
- package/dist/views/page-editor/sections/MissionSection.d.ts.map +1 -0
- package/dist/views/page-editor/sections/MissionSection.js +12 -0
- package/dist/views/page-editor/sections/MissionSection.js.map +1 -0
- package/dist/views/page-editor/sections/PullQuoteSection.d.ts +6 -0
- package/dist/views/page-editor/sections/PullQuoteSection.d.ts.map +1 -0
- package/dist/views/page-editor/sections/PullQuoteSection.js +13 -0
- package/dist/views/page-editor/sections/PullQuoteSection.js.map +1 -0
- package/dist/views/page-editor/sections/RelatedPostsSection.d.ts +12 -0
- package/dist/views/page-editor/sections/RelatedPostsSection.d.ts.map +1 -0
- package/dist/views/page-editor/sections/RelatedPostsSection.js +23 -0
- package/dist/views/page-editor/sections/RelatedPostsSection.js.map +1 -0
- package/dist/views/page-editor/sections/SectionRenderer.d.ts +22 -0
- package/dist/views/page-editor/sections/SectionRenderer.d.ts.map +1 -0
- package/dist/views/page-editor/sections/SectionRenderer.js +52 -0
- package/dist/views/page-editor/sections/SectionRenderer.js.map +1 -0
- package/dist/views/page-editor/sections/index.d.ts +14 -0
- package/dist/views/page-editor/sections/index.d.ts.map +1 -0
- package/dist/views/page-editor/sections/index.js +12 -0
- package/dist/views/page-editor/sections/index.js.map +1 -0
- package/dist/views/page-editor/sections/parts.d.ts +55 -0
- package/dist/views/page-editor/sections/parts.d.ts.map +1 -0
- package/dist/views/page-editor/sections/parts.js +60 -0
- package/dist/views/page-editor/sections/parts.js.map +1 -0
- package/dist/views/page-editor/viewports.d.ts +14 -0
- package/dist/views/page-editor/viewports.d.ts.map +1 -0
- package/dist/views/page-editor/viewports.js +12 -0
- package/dist/views/page-editor/viewports.js.map +1 -0
- package/dist/views/post-editor/PostEditorCanvas.d.ts +21 -0
- package/dist/views/post-editor/PostEditorCanvas.d.ts.map +1 -0
- package/dist/views/post-editor/PostEditorCanvas.js +58 -0
- package/dist/views/post-editor/PostEditorCanvas.js.map +1 -0
- package/dist/views/post-editor/PostFieldsModal.d.ts +12 -0
- package/dist/views/post-editor/PostFieldsModal.d.ts.map +1 -0
- package/dist/views/post-editor/PostFieldsModal.js +53 -0
- package/dist/views/post-editor/PostFieldsModal.js.map +1 -0
- package/dist/views/post-editor/PostHeader.d.ts +15 -0
- package/dist/views/post-editor/PostHeader.d.ts.map +1 -0
- package/dist/views/post-editor/PostHeader.js +27 -0
- package/dist/views/post-editor/PostHeader.js.map +1 -0
- package/dist/views/post-editor/PostHeaderPanel.d.ts +11 -0
- package/dist/views/post-editor/PostHeaderPanel.d.ts.map +1 -0
- package/dist/views/post-editor/PostHeaderPanel.js +21 -0
- package/dist/views/post-editor/PostHeaderPanel.js.map +1 -0
- package/dist/views/post-editor/PostPreview.d.ts +14 -0
- package/dist/views/post-editor/PostPreview.d.ts.map +1 -0
- package/dist/views/post-editor/PostPreview.js +53 -0
- package/dist/views/post-editor/PostPreview.js.map +1 -0
- package/dist/views/post-editor/PostSectionEditor.d.ts +17 -0
- package/dist/views/post-editor/PostSectionEditor.d.ts.map +1 -0
- package/dist/views/post-editor/PostSectionEditor.js +290 -0
- package/dist/views/post-editor/PostSectionEditor.js.map +1 -0
- package/dist/views/post-editor/PostTemplateEditor.d.ts +9 -0
- package/dist/views/post-editor/PostTemplateEditor.d.ts.map +1 -0
- package/dist/views/post-editor/PostTemplateEditor.js +144 -0
- package/dist/views/post-editor/PostTemplateEditor.js.map +1 -0
- package/package.json +2 -2
- package/src/AdminRoot.tsx +213 -2
- package/src/__tests__/components/posts-badges.test.tsx +77 -0
- package/src/__tests__/layout/sidebar-posts.test.ts +179 -0
- package/src/__tests__/lib/page-editor-service.test.ts +173 -0
- package/src/__tests__/lib/pages-service.test.ts +157 -0
- package/src/__tests__/lib/post-editor-service.test.ts +215 -0
- package/src/__tests__/lib/posts-service.test.ts +279 -0
- package/src/__tests__/views/posts-list-view.test.ts +110 -0
- package/src/components/pages/tag-badges.tsx +104 -0
- package/src/components/posts/badges.tsx +170 -0
- package/src/components/posts/icons.ts +40 -0
- package/src/layout/Layout.tsx +66 -10
- package/src/layout/Sidebar.tsx +116 -50
- package/src/lib/page-editor-service.ts +233 -0
- package/src/lib/pages-service.ts +599 -0
- package/src/lib/post-editor-service.ts +342 -0
- package/src/lib/posts-service.ts +366 -0
- package/src/lib/preview-link.ts +63 -0
- package/src/router/index.ts +10 -1
- package/src/views/Dashboard.tsx +15 -3
- package/src/views/Pages/PageTagManager.tsx +436 -0
- package/src/views/Pages/PagesListView.tsx +944 -0
- package/src/views/Posts/NewPostPicker.tsx +147 -0
- package/src/views/Posts/NewPostTypeInstructions.tsx +344 -0
- package/src/views/Posts/PostTypesView.tsx +194 -0
- package/src/views/Posts/PostsListView.tsx +869 -0
- package/src/views/Posts/post-type-presets.ts +105 -0
- package/src/views/page-builder/Widgets.tsx +44 -0
- package/src/views/page-editor/AddSectionModal.tsx +56 -0
- package/src/views/page-editor/EditorCanvas.tsx +127 -0
- package/src/views/page-editor/EditorTopBar.tsx +233 -0
- package/src/views/page-editor/PagePreview.tsx +96 -0
- package/src/views/page-editor/PageSectionEditor.tsx +476 -0
- package/src/views/page-editor/PageSettingsModal.tsx +154 -0
- package/src/views/page-editor/SectionInspector.tsx +599 -0
- package/src/views/page-editor/SectionsPanel.tsx +270 -0
- package/src/views/page-editor/ValidationSummary.tsx +53 -0
- package/src/views/page-editor/section-icons.ts +33 -0
- package/src/views/page-editor/section-types.ts +27 -0
- package/src/views/page-editor/sections/ArticleBodySection.tsx +57 -0
- package/src/views/page-editor/sections/AuthorBioSection.tsx +61 -0
- package/src/views/page-editor/sections/ByTheNumbersSection.tsx +41 -0
- package/src/views/page-editor/sections/CtaBannerSection.tsx +29 -0
- package/src/views/page-editor/sections/FeatureHighlightSection.tsx +63 -0
- package/src/views/page-editor/sections/GallerySection.tsx +54 -0
- package/src/views/page-editor/sections/HeroBannerSection.tsx +44 -0
- package/src/views/page-editor/sections/MissionSection.tsx +22 -0
- package/src/views/page-editor/sections/PullQuoteSection.tsx +27 -0
- package/src/views/page-editor/sections/RelatedPostsSection.tsx +55 -0
- package/src/views/page-editor/sections/SectionRenderer.tsx +102 -0
- package/src/views/page-editor/sections/index.ts +13 -0
- package/src/views/page-editor/sections/parts.tsx +113 -0
- package/src/views/page-editor/viewports.ts +25 -0
- package/src/views/post-editor/PostEditorCanvas.tsx +123 -0
- package/src/views/post-editor/PostFieldsModal.tsx +196 -0
- package/src/views/post-editor/PostHeader.tsx +87 -0
- package/src/views/post-editor/PostHeaderPanel.tsx +107 -0
- package/src/views/post-editor/PostPreview.tsx +114 -0
- package/src/views/post-editor/PostSectionEditor.tsx +506 -0
- package/src/views/post-editor/PostTemplateEditor.tsx +347 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { PostTypeIconName } from '../../components/posts/icons.js';
|
|
2
|
+
/**
|
|
3
|
+
* Quick Post Type presets — curated starter templates surfaced on the
|
|
4
|
+
* New Post Type screen. Picking one pre-fills the form (slug, labels,
|
|
5
|
+
* icon, accent color, description) AND a tailored set of extra fields
|
|
6
|
+
* that get injected into the generated `actuate.config.ts` snippet
|
|
7
|
+
* after the shared base fields (title / slug / body / SEO / …).
|
|
8
|
+
*
|
|
9
|
+
* Presets are NOT a runtime data model — they only seed the snippet.
|
|
10
|
+
* Collections stay code-defined; this just saves the developer from
|
|
11
|
+
* hand-authoring common field sets.
|
|
12
|
+
*/
|
|
13
|
+
export type PresetColor = 'purple' | 'green' | 'orange' | 'blue' | 'red' | 'pink';
|
|
14
|
+
export interface QuickPreset {
|
|
15
|
+
key: string;
|
|
16
|
+
/** Gallery card label, e.g. "Case Studies". */
|
|
17
|
+
label: string;
|
|
18
|
+
singular: string;
|
|
19
|
+
plural: string;
|
|
20
|
+
slug: string;
|
|
21
|
+
description: string;
|
|
22
|
+
color: PresetColor;
|
|
23
|
+
icon: PostTypeIconName;
|
|
24
|
+
/**
|
|
25
|
+
* Field definition lines injected after the shared base fields.
|
|
26
|
+
* Each entry is a complete `key: { … },` line (no leading indent —
|
|
27
|
+
* the snippet generator indents them).
|
|
28
|
+
*/
|
|
29
|
+
extraFields: string[];
|
|
30
|
+
}
|
|
31
|
+
export declare const POST_TYPE_PRESETS: QuickPreset[];
|
|
32
|
+
//# sourceMappingURL=post-type-presets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-type-presets.d.ts","sourceRoot":"","sources":["../../../src/views/Posts/post-type-presets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAEvE;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAA;AAEjF,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,WAAW,CAAA;IAClB,IAAI,EAAE,gBAAgB,CAAA;IACtB;;;;OAIG;IACH,WAAW,EAAE,MAAM,EAAE,CAAA;CACtB;AAED,eAAO,MAAM,iBAAiB,EAAE,WAAW,EAsE1C,CAAA"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export const POST_TYPE_PRESETS = [
|
|
2
|
+
{
|
|
3
|
+
key: 'case-studies',
|
|
4
|
+
label: 'Case Studies',
|
|
5
|
+
singular: 'Case Study',
|
|
6
|
+
plural: 'Case Studies',
|
|
7
|
+
slug: 'case-studies',
|
|
8
|
+
description: 'Client success stories and detailed project case studies.',
|
|
9
|
+
color: 'green',
|
|
10
|
+
icon: 'briefcase',
|
|
11
|
+
extraFields: [
|
|
12
|
+
"client: { type: 'text', label: 'Client Name' },",
|
|
13
|
+
"industry: { type: 'text', label: 'Industry' },",
|
|
14
|
+
"results: { type: 'richText', label: 'Results & Outcomes' },",
|
|
15
|
+
],
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
key: 'news',
|
|
19
|
+
label: 'News',
|
|
20
|
+
singular: 'News Item',
|
|
21
|
+
plural: 'News',
|
|
22
|
+
slug: 'news',
|
|
23
|
+
description: 'Company announcements, press releases, and industry news.',
|
|
24
|
+
color: 'orange',
|
|
25
|
+
icon: 'newspaper',
|
|
26
|
+
extraFields: ["source: { type: 'text', label: 'Source' },"],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
key: 'portfolio',
|
|
30
|
+
label: 'Portfolio',
|
|
31
|
+
singular: 'Portfolio Item',
|
|
32
|
+
plural: 'Portfolio',
|
|
33
|
+
slug: 'portfolio',
|
|
34
|
+
description: 'Showcase projects, work samples, and creative pieces.',
|
|
35
|
+
color: 'blue',
|
|
36
|
+
icon: 'image',
|
|
37
|
+
extraFields: [
|
|
38
|
+
"projectUrl: { type: 'url', label: 'Project URL' },",
|
|
39
|
+
"gallery: { type: 'media', label: 'Gallery' },",
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
key: 'events',
|
|
44
|
+
label: 'Events',
|
|
45
|
+
singular: 'Event',
|
|
46
|
+
plural: 'Events',
|
|
47
|
+
slug: 'events',
|
|
48
|
+
description: 'Webinars, conferences, and scheduled happenings.',
|
|
49
|
+
color: 'pink',
|
|
50
|
+
icon: 'calendar',
|
|
51
|
+
extraFields: [
|
|
52
|
+
"startDate: { type: 'date', label: 'Start Date', includeTime: true },",
|
|
53
|
+
"endDate: { type: 'date', label: 'End Date', includeTime: true },",
|
|
54
|
+
"location: { type: 'text', label: 'Location' },",
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
key: 'team',
|
|
59
|
+
label: 'Team Members',
|
|
60
|
+
singular: 'Team Member',
|
|
61
|
+
plural: 'Team',
|
|
62
|
+
slug: 'team',
|
|
63
|
+
description: 'Staff bios, headshots, and role information.',
|
|
64
|
+
color: 'purple',
|
|
65
|
+
icon: 'users',
|
|
66
|
+
extraFields: [
|
|
67
|
+
"role: { type: 'text', label: 'Role' },",
|
|
68
|
+
"headshot: { type: 'media', label: 'Headshot' },",
|
|
69
|
+
],
|
|
70
|
+
},
|
|
71
|
+
];
|
|
72
|
+
//# sourceMappingURL=post-type-presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-type-presets.js","sourceRoot":"","sources":["../../../src/views/Posts/post-type-presets.ts"],"names":[],"mappings":"AAkCA,MAAM,CAAC,MAAM,iBAAiB,GAAkB;IAC9C;QACE,GAAG,EAAE,cAAc;QACnB,KAAK,EAAE,cAAc;QACrB,QAAQ,EAAE,YAAY;QACtB,MAAM,EAAE,cAAc;QACtB,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,2DAA2D;QACxE,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE;YACX,iDAAiD;YACjD,gDAAgD;YAChD,6DAA6D;SAC9D;KACF;IACD;QACE,GAAG,EAAE,MAAM;QACX,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,WAAW;QACrB,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,2DAA2D;QACxE,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,CAAC,4CAA4C,CAAC;KAC5D;IACD;QACE,GAAG,EAAE,WAAW;QAChB,KAAK,EAAE,WAAW;QAClB,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,WAAW;QACnB,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,uDAAuD;QACpE,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,OAAO;QACb,WAAW,EAAE;YACX,oDAAoD;YACpD,+CAA+C;SAChD;KACF;IACD;QACE,GAAG,EAAE,QAAQ;QACb,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,kDAAkD;QAC/D,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE;YACX,sEAAsE;YACtE,kEAAkE;YAClE,gDAAgD;SACjD;KACF;IACD;QACE,GAAG,EAAE,MAAM;QACX,KAAK,EAAE,cAAc;QACrB,QAAQ,EAAE,aAAa;QACvB,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,8CAA8C;QAC3D,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,OAAO;QACb,WAAW,EAAE;YACX,wCAAwC;YACxC,iDAAiD;SAClD;KACF;CACF,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface WidgetsProps {
|
|
2
|
+
onNavigate?: (path: string) => void;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* /widgets — placeholder for the embeddable Widgets library.
|
|
6
|
+
*
|
|
7
|
+
* Widgets are reusable, embeddable components (forms, CTAs, banners)
|
|
8
|
+
* that can be dropped into pages and saved sections. The management UI
|
|
9
|
+
* ships in a later release; this view establishes the route and nav
|
|
10
|
+
* entry with an honest empty state rather than a dead link.
|
|
11
|
+
*/
|
|
12
|
+
export declare function Widgets({ onNavigate }: WidgetsProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
//# sourceMappingURL=Widgets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Widgets.d.ts","sourceRoot":"","sources":["../../../src/views/page-builder/Widgets.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,EAAE,UAAU,EAAE,EAAE,YAAY,2CA2BnD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { LayoutGrid } from 'lucide-react';
|
|
4
|
+
/**
|
|
5
|
+
* /widgets — placeholder for the embeddable Widgets library.
|
|
6
|
+
*
|
|
7
|
+
* Widgets are reusable, embeddable components (forms, CTAs, banners)
|
|
8
|
+
* that can be dropped into pages and saved sections. The management UI
|
|
9
|
+
* ships in a later release; this view establishes the route and nav
|
|
10
|
+
* entry with an honest empty state rather than a dead link.
|
|
11
|
+
*/
|
|
12
|
+
export function Widgets({ onNavigate }) {
|
|
13
|
+
return (_jsxs("div", { className: "p-4 pr-8", children: [_jsxs("div", { className: "mb-4", children: [_jsx("h1", { className: "text-foreground mb-1 text-2xl font-medium", children: "Widgets" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Reusable, embeddable components for pages and saved sections." })] }), _jsxs("div", { className: "border-border bg-card rounded-lg border p-8 text-center", children: [_jsx(LayoutGrid, { className: "text-muted-foreground mx-auto mb-3 h-8 w-8", "aria-hidden": true }), _jsx("h2", { className: "text-foreground mb-1 text-lg font-medium", children: "Widgets are coming soon" }), _jsx("p", { className: "text-muted-foreground mx-auto mb-4 max-w-md text-sm", children: "The widget library lets you build embeddable components once and reuse them across pages. In the meantime, use Saved Sections for reusable content blocks." }), _jsx("button", { type: "button", onClick: () => onNavigate?.('/saved-sections'), className: "bg-primary text-primary-foreground rounded-md px-4 py-2 text-sm font-medium hover:opacity-90", children: "View Saved Sections" })] })] }));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=Widgets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Widgets.js","sourceRoot":"","sources":["../../../src/views/page-builder/Widgets.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAMzC;;;;;;;GAOG;AACH,MAAM,UAAU,OAAO,CAAC,EAAE,UAAU,EAAgB;IAClD,OAAO,CACL,eAAK,SAAS,EAAC,UAAU,aACvB,eAAK,SAAS,EAAC,MAAM,aACnB,aAAI,SAAS,EAAC,2CAA2C,wBAAa,EACtE,YAAG,SAAS,EAAC,+BAA+B,8EAExC,IACA,EAEN,eAAK,SAAS,EAAC,yDAAyD,aACtE,KAAC,UAAU,IAAC,SAAS,EAAC,4CAA4C,wBAAe,EACjF,aAAI,SAAS,EAAC,0CAA0C,wCAA6B,EACrF,YAAG,SAAS,EAAC,qDAAqD,2KAG9D,EACJ,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,iBAAiB,CAAC,EAC9C,SAAS,EAAC,8FAA8F,oCAGjG,IACL,IACF,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type SectionScope, type SectionTypeId } from './section-types.js';
|
|
2
|
+
interface AddSectionModalProps {
|
|
3
|
+
open: boolean;
|
|
4
|
+
onClose: () => void;
|
|
5
|
+
onAdd: (type: SectionTypeId) => void;
|
|
6
|
+
/** Which editor surface this gallery serves. Defaults to the page editor. */
|
|
7
|
+
scope?: SectionScope;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Predefined section gallery. Only types that have a working renderer +
|
|
11
|
+
* inspector are listed (the registry is the source of truth), so every
|
|
12
|
+
* card here actually inserts a usable section.
|
|
13
|
+
*
|
|
14
|
+
* (Saved-section / template insertion is a separate flow — deferred until
|
|
15
|
+
* the saved-section storage model is reconciled with the flat section
|
|
16
|
+
* model; see the page-editor changeset.)
|
|
17
|
+
*/
|
|
18
|
+
export declare function AddSectionModal({ open, onClose, onAdd, scope }: AddSectionModalProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=AddSectionModal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AddSectionModal.d.ts","sourceRoot":"","sources":["../../../src/views/page-editor/AddSectionModal.tsx"],"names":[],"mappings":"AAGA,OAAO,EAA2B,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAGnG,UAAU,oBAAoB;IAC5B,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,KAAK,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAA;IACpC,6EAA6E;IAC7E,KAAK,CAAC,EAAE,YAAY,CAAA;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAc,EAAE,EAAE,oBAAoB,2CAgC7F"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Modal } from '../../components/ui/Modal.js';
|
|
4
|
+
import { getSectionTypesForScope } from './section-types.js';
|
|
5
|
+
import { sectionIconFor } from './section-icons.js';
|
|
6
|
+
/**
|
|
7
|
+
* Predefined section gallery. Only types that have a working renderer +
|
|
8
|
+
* inspector are listed (the registry is the source of truth), so every
|
|
9
|
+
* card here actually inserts a usable section.
|
|
10
|
+
*
|
|
11
|
+
* (Saved-section / template insertion is a separate flow — deferred until
|
|
12
|
+
* the saved-section storage model is reconciled with the flat section
|
|
13
|
+
* model; see the page-editor changeset.)
|
|
14
|
+
*/
|
|
15
|
+
export function AddSectionModal({ open, onClose, onAdd, scope = 'page' }) {
|
|
16
|
+
const types = getSectionTypesForScope(scope);
|
|
17
|
+
return (_jsxs(Modal, { open: open, onClose: onClose, title: "Add a section", children: [_jsx("p", { className: "text-muted-foreground mb-4 text-sm", children: "Choose a section type. It will be added to the bottom and selected for editing." }), _jsx("div", { className: "grid grid-cols-1 gap-2 sm:grid-cols-2", children: types.map((type) => {
|
|
18
|
+
const Icon = sectionIconFor(type.id);
|
|
19
|
+
return (_jsxs("button", { type: "button", onClick: () => onAdd(type.id), className: "border-border hover:border-primary hover:bg-accent/50 focus-visible:ring-ring flex items-start gap-3 rounded-lg border p-3 text-left transition-colors focus-visible:ring-2 focus-visible:outline-none", children: [_jsx("span", { className: "bg-muted text-foreground flex h-9 w-9 shrink-0 items-center justify-center rounded-md", children: _jsx(Icon, { className: "h-5 w-5", "aria-hidden": true }) }), _jsxs("span", { className: "min-w-0", children: [_jsx("span", { className: "text-foreground block text-sm font-medium", children: type.name }), _jsx("span", { className: "text-muted-foreground mt-0.5 block text-xs leading-snug", children: type.description })] })] }, type.id));
|
|
20
|
+
}) })] }));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=AddSectionModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AddSectionModal.js","sourceRoot":"","sources":["../../../src/views/page-editor/AddSectionModal.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAA;AACpD,OAAO,EAAE,uBAAuB,EAAyC,MAAM,oBAAoB,CAAA;AACnG,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAUnD;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,EAAwB;IAC5F,MAAM,KAAK,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAA;IAC5C,OAAO,CACL,MAAC,KAAK,IAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAC,eAAe,aACxD,YAAG,SAAS,EAAC,oCAAoC,gGAE7C,EACJ,cAAK,SAAS,EAAC,uCAAuC,YACnD,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;oBAClB,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;oBACpC,OAAO,CACL,kBAEE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAC7B,SAAS,EAAC,wMAAwM,aAElN,eAAM,SAAS,EAAC,uFAAuF,YACrG,KAAC,IAAI,IAAC,SAAS,EAAC,SAAS,wBAAe,GACnC,EACP,gBAAM,SAAS,EAAC,SAAS,aACvB,eAAM,SAAS,EAAC,2CAA2C,YAAE,IAAI,CAAC,IAAI,GAAQ,EAC9E,eAAM,SAAS,EAAC,yDAAyD,YACtE,IAAI,CAAC,WAAW,GACZ,IACF,KAbF,IAAI,CAAC,EAAE,CAcL,CACV,CAAA;gBACH,CAAC,CAAC,GACE,IACA,CACT,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { PageSection } from '../../lib/page-editor-service.js';
|
|
2
|
+
import { type ViewportId } from './viewports.js';
|
|
3
|
+
interface EditorCanvasProps {
|
|
4
|
+
sections: PageSection[];
|
|
5
|
+
selectedId: string | null;
|
|
6
|
+
viewport: ViewportId;
|
|
7
|
+
onSelect: (id: string) => void;
|
|
8
|
+
onAddSection: () => void;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* The preview canvas. Renders the page at the selected viewport's logical
|
|
12
|
+
* width and scales it down with a CSS transform so wide viewports (1440px,
|
|
13
|
+
* 1920px) fit inside the available canvas column. Scale is recomputed from
|
|
14
|
+
* a ResizeObserver so it stays correct as panels open/close.
|
|
15
|
+
*/
|
|
16
|
+
export declare function EditorCanvas({ sections, selectedId, viewport, onSelect, onAddSection, }: EditorCanvasProps): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=EditorCanvas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditorCanvas.d.ts","sourceRoot":"","sources":["../../../src/views/page-editor/EditorCanvas.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAEnE,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE7D,UAAU,iBAAiB;IACzB,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,EAAE,UAAU,CAAA;IACpB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,YAAY,EAAE,MAAM,IAAI,CAAA;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,YAAY,GACb,EAAE,iBAAiB,2CA2EnB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
|
|
4
|
+
import { LayoutTemplate, Plus } from 'lucide-react';
|
|
5
|
+
import { SectionRenderer } from './sections/index.js';
|
|
6
|
+
import { getViewport } from './viewports.js';
|
|
7
|
+
/**
|
|
8
|
+
* The preview canvas. Renders the page at the selected viewport's logical
|
|
9
|
+
* width and scales it down with a CSS transform so wide viewports (1440px,
|
|
10
|
+
* 1920px) fit inside the available canvas column. Scale is recomputed from
|
|
11
|
+
* a ResizeObserver so it stays correct as panels open/close.
|
|
12
|
+
*/
|
|
13
|
+
export function EditorCanvas({ sections, selectedId, viewport, onSelect, onAddSection, }) {
|
|
14
|
+
const vp = getViewport(viewport);
|
|
15
|
+
const containerRef = useRef(null);
|
|
16
|
+
const surfaceRef = useRef(null);
|
|
17
|
+
const sectionRefs = useRef(new Map());
|
|
18
|
+
const [scale, setScale] = useState(1);
|
|
19
|
+
const [surfaceHeight, setSurfaceHeight] = useState(null);
|
|
20
|
+
const registerRef = useCallback((id, el) => {
|
|
21
|
+
if (el)
|
|
22
|
+
sectionRefs.current.set(id, el);
|
|
23
|
+
else
|
|
24
|
+
sectionRefs.current.delete(id);
|
|
25
|
+
}, []);
|
|
26
|
+
// Recompute scale + scaled height from the container width.
|
|
27
|
+
useLayoutEffect(() => {
|
|
28
|
+
const container = containerRef.current;
|
|
29
|
+
if (!container)
|
|
30
|
+
return;
|
|
31
|
+
const recompute = () => {
|
|
32
|
+
// 48px breathing room so the surface never kisses the column edges.
|
|
33
|
+
const available = container.clientWidth - 48;
|
|
34
|
+
const next = Math.min(1, available / vp.width);
|
|
35
|
+
setScale(next > 0 ? next : 1);
|
|
36
|
+
if (surfaceRef.current) {
|
|
37
|
+
setSurfaceHeight(surfaceRef.current.offsetHeight * (next > 0 ? next : 1));
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
recompute();
|
|
41
|
+
const ro = new ResizeObserver(recompute);
|
|
42
|
+
ro.observe(container);
|
|
43
|
+
if (surfaceRef.current)
|
|
44
|
+
ro.observe(surfaceRef.current);
|
|
45
|
+
return () => ro.disconnect();
|
|
46
|
+
}, [vp.width, sections]);
|
|
47
|
+
// Scroll the selected section into view within the canvas.
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
if (!selectedId)
|
|
50
|
+
return;
|
|
51
|
+
const el = sectionRefs.current.get(selectedId);
|
|
52
|
+
if (el)
|
|
53
|
+
el.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
|
54
|
+
}, [selectedId]);
|
|
55
|
+
return (_jsx("div", { ref: containerRef, className: "bg-muted h-full overflow-auto p-6", children: sections.length === 0 ? (_jsx(EmptyCanvas, { onAddSection: onAddSection })) : (_jsx("div", { className: "mx-auto", style: { width: vp.width * scale, height: surfaceHeight ?? undefined }, children: _jsx("div", { ref: surfaceRef, className: "border-border origin-top overflow-hidden rounded-xl border bg-white shadow-sm", style: {
|
|
56
|
+
width: vp.width,
|
|
57
|
+
transform: `scale(${scale})`,
|
|
58
|
+
transformOrigin: 'top left',
|
|
59
|
+
}, children: sections.map((section) => (_jsx(SectionRenderer, { section: section, editable: true, selected: section.id === selectedId, onSelect: onSelect, registerRef: registerRef }, section.id))) }) })) }));
|
|
60
|
+
}
|
|
61
|
+
function EmptyCanvas({ onAddSection }) {
|
|
62
|
+
return (_jsxs("div", { className: "mx-auto flex h-full max-w-md flex-col items-center justify-center text-center", children: [_jsx("div", { className: "bg-card border-border mb-4 flex h-14 w-14 items-center justify-center rounded-full border", children: _jsx(LayoutTemplate, { className: "text-muted-foreground h-6 w-6", "aria-hidden": true }) }), _jsx("h2", { className: "text-foreground text-lg font-medium", children: "This page has no sections yet" }), _jsx("p", { className: "text-muted-foreground mt-1 mb-5 text-sm", children: "Add your first section to start building the page. You can reorder, hide, and edit sections at any time." }), _jsxs("button", { type: "button", onClick: onAddSection, className: "bg-primary text-primary-foreground hover:bg-primary/90 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", "aria-hidden": true }), "Add Section"] })] }));
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=EditorCanvas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditorCanvas.js","sourceRoot":"","sources":["../../../src/views/page-editor/EditorCanvas.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { PageStatus } from '../../lib/page-editor-service.js';
|
|
2
|
+
import { type ViewportId } from './viewports.js';
|
|
3
|
+
export type SaveState = 'idle' | 'saving' | 'saved' | 'error';
|
|
4
|
+
interface EditorTopBarProps {
|
|
5
|
+
title: string;
|
|
6
|
+
status: PageStatus;
|
|
7
|
+
dirty: boolean;
|
|
8
|
+
saveState: SaveState;
|
|
9
|
+
publishing: boolean;
|
|
10
|
+
canEdit: boolean;
|
|
11
|
+
canPublish: boolean;
|
|
12
|
+
viewport: ViewportId;
|
|
13
|
+
/** Breadcrumb root label + back-button text (e.g. "Pages" or "Posts"). */
|
|
14
|
+
backLabel?: string;
|
|
15
|
+
onViewport: (v: ViewportId) => void;
|
|
16
|
+
onBack: () => void;
|
|
17
|
+
onPreview: () => void;
|
|
18
|
+
/**
|
|
19
|
+
* Open the draft on the public site (real front-end) in a new tab. When
|
|
20
|
+
* omitted the "View on site" button is hidden — e.g. for unsaved documents
|
|
21
|
+
* or installs without a public URL.
|
|
22
|
+
*/
|
|
23
|
+
onViewOnSite?: () => void;
|
|
24
|
+
onOpenSettings: () => void;
|
|
25
|
+
onSaveDraft: () => void;
|
|
26
|
+
onPublish: () => void;
|
|
27
|
+
}
|
|
28
|
+
export declare function EditorTopBar({ title, status, dirty, saveState, publishing, canEdit, canPublish, viewport, backLabel, onViewport, onBack, onPreview, onViewOnSite, onOpenSettings, onSaveDraft, onPublish, }: EditorTopBarProps): import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=EditorTopBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditorTopBar.d.ts","sourceRoot":"","sources":["../../../src/views/page-editor/EditorTopBar.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAClE,OAAO,EAAa,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3D,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAA;AAE7D,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,UAAU,CAAA;IAClB,KAAK,EAAE,OAAO,CAAA;IACd,SAAS,EAAE,SAAS,CAAA;IACpB,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;IACnB,QAAQ,EAAE,UAAU,CAAA;IACpB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAA;IACnC,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB,cAAc,EAAE,MAAM,IAAI,CAAA;IAC1B,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,SAAS,EAAE,MAAM,IAAI,CAAA;CACtB;AAgBD,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,MAAM,EACN,KAAK,EACL,SAAS,EACT,UAAU,EACV,OAAO,EACP,UAAU,EACV,QAAQ,EACR,SAAmB,EACnB,UAAU,EACV,MAAM,EACN,SAAS,EACT,YAAY,EACZ,cAAc,EACd,WAAW,EACX,SAAS,GACV,EAAE,iBAAiB,2CAgHnB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Check, ExternalLink, Eye, Laptop, Loader2, Monitor, Settings2, Smartphone, Tablet, TriangleAlert, } from 'lucide-react';
|
|
4
|
+
import { VIEWPORTS } from './viewports.js';
|
|
5
|
+
const VIEWPORT_ICONS = {
|
|
6
|
+
monitor: Monitor,
|
|
7
|
+
laptop: Laptop,
|
|
8
|
+
tablet: Tablet,
|
|
9
|
+
smartphone: Smartphone,
|
|
10
|
+
};
|
|
11
|
+
const STATUS_TEXT = {
|
|
12
|
+
DRAFT: { label: 'Draft', className: 'text-amber-600 dark:text-amber-400' },
|
|
13
|
+
PUBLISHED: { label: 'Published', className: 'text-emerald-600 dark:text-emerald-400' },
|
|
14
|
+
SCHEDULED: { label: 'Scheduled', className: 'text-amber-600 dark:text-amber-400' },
|
|
15
|
+
ARCHIVED: { label: 'Archived', className: 'text-muted-foreground' },
|
|
16
|
+
};
|
|
17
|
+
export function EditorTopBar({ title, status, dirty, saveState, publishing, canEdit, canPublish, viewport, backLabel = 'Pages', onViewport, onBack, onPreview, onViewOnSite, onOpenSettings, onSaveDraft, onPublish, }) {
|
|
18
|
+
const statusInfo = STATUS_TEXT[status];
|
|
19
|
+
return (_jsxs("header", { className: "bg-card border-border flex h-14 shrink-0 items-center justify-between gap-4 border-b px-4", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [_jsxs("nav", { "aria-label": "Breadcrumb", className: "flex min-w-0 items-center gap-1.5 text-sm", children: [_jsx("button", { type: "button", onClick: onBack, className: "text-muted-foreground hover:text-foreground shrink-0", children: backLabel }), _jsx("span", { className: "text-muted-foreground", "aria-hidden": true, children: "/" }), _jsx("span", { className: "text-foreground truncate font-medium", children: title || 'Untitled page' })] }), _jsx("span", { className: `ml-2 shrink-0 text-xs font-medium ${statusInfo.className}`, "aria-label": `Status: ${statusInfo.label}`, children: statusInfo.label }), _jsx(SaveStatus, { state: saveState, dirty: dirty })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "border-border bg-background hidden items-center gap-0.5 rounded-lg border p-0.5 md:flex", role: "group", "aria-label": "Preview viewport", children: VIEWPORTS.map((v) => {
|
|
20
|
+
const Icon = VIEWPORT_ICONS[v.icon] ?? Monitor;
|
|
21
|
+
const active = v.id === viewport;
|
|
22
|
+
return (_jsxs("button", { type: "button", onClick: () => onViewport(v.id), "aria-pressed": active, title: `${v.label} (${v.width}px)`, className: `flex items-center gap-1 rounded-md px-2 py-1 text-xs font-medium transition-colors ${active
|
|
23
|
+
? 'bg-primary text-primary-foreground'
|
|
24
|
+
: 'text-muted-foreground hover:text-foreground hover:bg-accent'}`, children: [_jsx(Icon, { className: "h-3.5 w-3.5", "aria-hidden": true }), _jsx("span", { className: "hidden lg:inline", children: v.label })] }, v.id));
|
|
25
|
+
}) }), _jsx("button", { type: "button", onClick: onOpenSettings, "aria-label": "Page settings", title: "Page settings", className: "text-muted-foreground hover:text-foreground hover:bg-accent rounded-lg p-2", children: _jsx(Settings2, { className: "h-4 w-4", "aria-hidden": true }) }), _jsx("button", { type: "button", onClick: onPreview, "aria-label": "Preview page", title: "Preview page", className: "text-muted-foreground hover:text-foreground hover:bg-accent rounded-lg p-2", children: _jsx(Eye, { className: "h-4 w-4", "aria-hidden": true }) }), onViewOnSite && (_jsx("button", { type: "button", onClick: onViewOnSite, "aria-label": "View draft on site", title: "View draft on site", className: "text-muted-foreground hover:text-foreground hover:bg-accent rounded-lg p-2", children: _jsx(ExternalLink, { className: "h-4 w-4", "aria-hidden": true }) })), _jsx("button", { type: "button", onClick: onSaveDraft, disabled: !canEdit || saveState === 'saving' || (!dirty && saveState !== 'error'), className: "border-border text-foreground hover:bg-accent rounded-lg border px-3 py-1.5 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: saveState === 'saving' ? 'Saving…' : 'Save Draft' }), _jsxs("button", { type: "button", onClick: onPublish, disabled: !canPublish || publishing || saveState === 'saving', className: "bg-primary text-primary-foreground hover:bg-primary/90 inline-flex items-center gap-1.5 rounded-lg px-3.5 py-1.5 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: [publishing && _jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin", "aria-hidden": true }), "Publish"] })] })] }));
|
|
26
|
+
}
|
|
27
|
+
function SaveStatus({ state, dirty }) {
|
|
28
|
+
if (state === 'saving') {
|
|
29
|
+
return (_jsxs("span", { className: "text-muted-foreground ml-2 inline-flex items-center gap-1 text-xs", "aria-live": "polite", children: [_jsx(Loader2, { className: "h-3 w-3 animate-spin", "aria-hidden": true }), "Saving\u2026"] }));
|
|
30
|
+
}
|
|
31
|
+
if (state === 'error') {
|
|
32
|
+
return (_jsxs("span", { className: "text-destructive ml-2 inline-flex items-center gap-1 text-xs", "aria-live": "polite", children: [_jsx(TriangleAlert, { className: "h-3 w-3", "aria-hidden": true }), "Failed to save"] }));
|
|
33
|
+
}
|
|
34
|
+
if (dirty) {
|
|
35
|
+
return (_jsx("span", { className: "text-muted-foreground ml-2 text-xs", "aria-live": "polite", children: "Unsaved changes" }));
|
|
36
|
+
}
|
|
37
|
+
if (state === 'saved') {
|
|
38
|
+
return (_jsxs("span", { className: "text-muted-foreground ml-2 inline-flex items-center gap-1 text-xs", "aria-live": "polite", children: [_jsx(Check, { className: "h-3 w-3", "aria-hidden": true }), "Saved"] }));
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=EditorTopBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditorTopBar.js","sourceRoot":"","sources":["../../../src/views/page-editor/EditorTopBar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface PagePreviewProps {
|
|
2
|
+
documentId: string;
|
|
3
|
+
onNavigate: (path: string) => void;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Clean, chrome-free render of a page using the SAME section renderers as
|
|
7
|
+
* the editor canvas — so the preview reflects what will actually ship.
|
|
8
|
+
* Only visible sections are rendered (hidden sections are omitted, exactly
|
|
9
|
+
* as the public page would behave).
|
|
10
|
+
*/
|
|
11
|
+
export declare function PagePreview({ documentId, onNavigate }: PagePreviewProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=PagePreview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PagePreview.d.ts","sourceRoot":"","sources":["../../../src/views/page-editor/PagePreview.tsx"],"names":[],"mappings":"AAOA,UAAU,gBAAgB;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,gBAAgB,2CA6EvE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
import { AlertTriangle, Loader2, Pencil, X } from 'lucide-react';
|
|
5
|
+
import { fetchPageForEditor } from '../../lib/page-editor-service.js';
|
|
6
|
+
import { SectionRenderer } from './sections/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Clean, chrome-free render of a page using the SAME section renderers as
|
|
9
|
+
* the editor canvas — so the preview reflects what will actually ship.
|
|
10
|
+
* Only visible sections are rendered (hidden sections are omitted, exactly
|
|
11
|
+
* as the public page would behave).
|
|
12
|
+
*/
|
|
13
|
+
export function PagePreview({ documentId, onNavigate }) {
|
|
14
|
+
const [page, setPage] = useState(null);
|
|
15
|
+
const [loading, setLoading] = useState(true);
|
|
16
|
+
const [error, setError] = useState(null);
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
let cancelled = false;
|
|
19
|
+
setLoading(true);
|
|
20
|
+
fetchPageForEditor(documentId)
|
|
21
|
+
.then((p) => !cancelled && setPage(p))
|
|
22
|
+
.catch((err) => !cancelled && setError(err instanceof Error ? err.message : 'Failed to load'))
|
|
23
|
+
.finally(() => !cancelled && setLoading(false));
|
|
24
|
+
return () => {
|
|
25
|
+
cancelled = true;
|
|
26
|
+
};
|
|
27
|
+
}, [documentId]);
|
|
28
|
+
if (loading) {
|
|
29
|
+
return (_jsxs("div", { className: "bg-background flex h-full items-center justify-center", children: [_jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin", "aria-hidden": true }), _jsx("span", { className: "sr-only", children: "Loading preview\u2026" })] }));
|
|
30
|
+
}
|
|
31
|
+
if (error || !page) {
|
|
32
|
+
return (_jsx("div", { className: "bg-background flex h-full items-center justify-center p-6", children: _jsxs("div", { className: "border-destructive/30 bg-destructive/5 flex max-w-md items-center gap-3 rounded-lg border p-4", children: [_jsx(AlertTriangle, { className: "text-destructive shrink-0", size: 20, "aria-hidden": true }), _jsx("p", { className: "text-foreground text-sm font-medium", children: error ?? 'Page not found.' })] }) }));
|
|
33
|
+
}
|
|
34
|
+
const visible = page.sections.filter((s) => s.visible);
|
|
35
|
+
return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsxs("div", { className: "bg-card border-border flex h-12 shrink-0 items-center justify-between border-b px-4", children: [_jsxs("button", { type: "button", onClick: () => window.close(), className: "text-muted-foreground hover:text-foreground inline-flex items-center gap-1.5 text-sm", "aria-label": "Close preview tab", children: [_jsx(X, { className: "h-4 w-4", "aria-hidden": true }), "Close"] }), _jsxs("span", { className: "text-muted-foreground text-xs", children: ["Preview \u00B7 ", page.title || 'Untitled', " ", page.path] }), _jsxs("button", { type: "button", onClick: () => onNavigate(`/pages/${documentId}/edit`), className: "bg-primary text-primary-foreground hover:bg-primary/90 inline-flex items-center gap-1.5 rounded-lg px-3 py-1.5 text-sm font-medium", children: [_jsx(Pencil, { className: "h-3.5 w-3.5", "aria-hidden": true }), "Open editor"] })] }), _jsx("div", { className: "flex-1 overflow-auto bg-white", children: visible.length === 0 ? (_jsx("div", { className: "text-muted-foreground flex h-full items-center justify-center text-sm", children: "This page has no visible sections yet." })) : (visible.map((section) => _jsx(SectionRenderer, { section: section }, section.id))) })] }));
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=PagePreview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PagePreview.js","sourceRoot":"","sources":["../../../src/views/page-editor/PagePreview.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
interface PageSectionEditorProps {
|
|
2
|
+
/** undefined when creating a new page (`/pages/new`) */
|
|
3
|
+
documentId?: string;
|
|
4
|
+
config?: any;
|
|
5
|
+
session?: any;
|
|
6
|
+
onNavigate: (path: string) => void;
|
|
7
|
+
/**
|
|
8
|
+
* Open a preview route in a new browser tab. `prepare` runs before the tab
|
|
9
|
+
* navigates (used to save an unsaved draft first); returning `false` cancels
|
|
10
|
+
* the open. Falls back to in-tab navigation when not provided.
|
|
11
|
+
*/
|
|
12
|
+
onOpenPreview?: (path: string, prepare?: () => Promise<boolean | void> | boolean | void) => void;
|
|
13
|
+
}
|
|
14
|
+
export declare function PageSectionEditor({ documentId, config, session, onNavigate, onOpenPreview, }: PageSectionEditorProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=PageSectionEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageSectionEditor.d.ts","sourceRoot":"","sources":["../../../src/views/page-editor/PageSectionEditor.tsx"],"names":[],"mappings":"AAyCA,UAAU,sBAAsB;IAC9B,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,GAAG,CAAA;IACZ,OAAO,CAAC,EAAE,GAAG,CAAA;IACb,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,OAAO,GAAG,IAAI,KAAK,IAAI,CAAA;CACjG;AAWD,wBAAgB,iBAAiB,CAAC,EAChC,UAAU,EACV,MAAM,EACN,OAAO,EACP,UAAU,EACV,aAAa,GACd,EAAE,sBAAsB,2CAqZxB"}
|