@prenta/admin 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/AdminRoot.d.ts.map +1 -1
- package/dist/AdminRoot.js +5 -56
- package/dist/AdminRoot.js.map +1 -1
- package/dist/__tests__/components/breakpoint-controls.render.test.js +4 -4
- package/dist/__tests__/components/breakpoint-controls.render.test.js.map +1 -1
- package/dist/__tests__/lib/canvas-edit-chrome.test.js +1 -22
- package/dist/__tests__/lib/canvas-edit-chrome.test.js.map +1 -1
- package/dist/__tests__/lib/open-public-site-tab.test.d.ts +2 -0
- package/dist/__tests__/lib/open-public-site-tab.test.d.ts.map +1 -0
- package/dist/__tests__/lib/open-public-site-tab.test.js +64 -0
- package/dist/__tests__/lib/open-public-site-tab.test.js.map +1 -0
- package/dist/__tests__/lib/preview-bridge.test.js +19 -79
- package/dist/__tests__/lib/preview-bridge.test.js.map +1 -1
- package/dist/__tests__/lib/view-site-chrome.test.d.ts +2 -0
- package/dist/__tests__/lib/view-site-chrome.test.d.ts.map +1 -0
- package/dist/__tests__/lib/view-site-chrome.test.js +69 -0
- package/dist/__tests__/lib/view-site-chrome.test.js.map +1 -0
- package/dist/__tests__/router/admin-routes.test.js +4 -0
- package/dist/__tests__/router/admin-routes.test.js.map +1 -1
- package/dist/__tests__/views/canvas-review-mode.render.test.js +11 -1
- package/dist/__tests__/views/canvas-review-mode.render.test.js.map +1 -1
- package/dist/__tests__/views/canvas-surface-shared.test.js +0 -16
- package/dist/__tests__/views/canvas-surface-shared.test.js.map +1 -1
- package/dist/__tests__/views/editor-top-bar.render.test.js +52 -22
- package/dist/__tests__/views/editor-top-bar.render.test.js.map +1 -1
- package/dist/__tests__/views/page-section-editor.test.js +53 -18
- package/dist/__tests__/views/page-section-editor.test.js.map +1 -1
- package/dist/__tests__/views/post-section-editor.test.js +23 -0
- package/dist/__tests__/views/post-section-editor.test.js.map +1 -1
- package/dist/components/BreakpointPicker.d.ts +3 -2
- package/dist/components/BreakpointPicker.d.ts.map +1 -1
- package/dist/components/BreakpointPicker.js +5 -3
- package/dist/components/BreakpointPicker.js.map +1 -1
- package/dist/components/CanvasEditTip.js +1 -1
- package/dist/components/CanvasEditTip.js.map +1 -1
- package/dist/lib/canvas-edit-chrome.d.ts +0 -17
- package/dist/lib/canvas-edit-chrome.d.ts.map +1 -1
- package/dist/lib/canvas-edit-chrome.js +0 -62
- package/dist/lib/canvas-edit-chrome.js.map +1 -1
- package/dist/lib/editor-preview.d.ts +4 -1
- package/dist/lib/editor-preview.d.ts.map +1 -1
- package/dist/lib/editor-preview.js +4 -1
- package/dist/lib/editor-preview.js.map +1 -1
- package/dist/lib/open-public-site-tab.d.ts +14 -0
- package/dist/lib/open-public-site-tab.d.ts.map +1 -0
- package/dist/lib/open-public-site-tab.js +46 -0
- package/dist/lib/open-public-site-tab.js.map +1 -0
- package/dist/lib/preview-bridge.d.ts +7 -74
- package/dist/lib/preview-bridge.d.ts.map +1 -1
- package/dist/lib/preview-bridge.js +12 -73
- package/dist/lib/preview-bridge.js.map +1 -1
- package/dist/lib/view-site-chrome.d.ts +19 -0
- package/dist/lib/view-site-chrome.d.ts.map +1 -0
- package/dist/lib/view-site-chrome.js +24 -0
- package/dist/lib/view-site-chrome.js.map +1 -0
- package/dist/router/admin-routes.d.ts.map +1 -1
- package/dist/router/admin-routes.js +0 -2
- package/dist/router/admin-routes.js.map +1 -1
- package/dist/views/page-editor/EditorCanvas.d.ts +2 -3
- package/dist/views/page-editor/EditorCanvas.d.ts.map +1 -1
- package/dist/views/page-editor/EditorCanvas.js +2 -2
- package/dist/views/page-editor/EditorCanvas.js.map +1 -1
- package/dist/views/page-editor/EditorTopBar.d.ts +15 -17
- package/dist/views/page-editor/EditorTopBar.d.ts.map +1 -1
- package/dist/views/page-editor/EditorTopBar.js +20 -21
- package/dist/views/page-editor/EditorTopBar.js.map +1 -1
- package/dist/views/page-editor/PageSectionEditor.d.ts +1 -7
- package/dist/views/page-editor/PageSectionEditor.d.ts.map +1 -1
- package/dist/views/page-editor/PageSectionEditor.js +36 -141
- package/dist/views/page-editor/PageSectionEditor.js.map +1 -1
- package/dist/views/page-editor/StructureNotice.d.ts +2 -5
- package/dist/views/page-editor/StructureNotice.d.ts.map +1 -1
- package/dist/views/page-editor/StructureNotice.js +6 -10
- package/dist/views/page-editor/StructureNotice.js.map +1 -1
- package/dist/views/page-editor/sections/SectionRenderer.d.ts +1 -1
- package/dist/views/page-editor/sections/SectionRenderer.d.ts.map +1 -1
- package/dist/views/page-editor/sections/SectionRenderer.js +2 -1
- package/dist/views/page-editor/sections/SectionRenderer.js.map +1 -1
- package/dist/views/post-editor/PostEditorCanvas.d.ts +2 -4
- package/dist/views/post-editor/PostEditorCanvas.d.ts.map +1 -1
- package/dist/views/post-editor/PostEditorCanvas.js +3 -3
- package/dist/views/post-editor/PostEditorCanvas.js.map +1 -1
- package/dist/views/post-editor/PostSectionEditor.d.ts +1 -15
- package/dist/views/post-editor/PostSectionEditor.d.ts.map +1 -1
- package/dist/views/post-editor/PostSectionEditor.js +36 -128
- package/dist/views/post-editor/PostSectionEditor.js.map +1 -1
- package/dist/views/settings/SeoSettingsTab.d.ts.map +1 -1
- package/dist/views/settings/SeoSettingsTab.js +2 -1
- package/dist/views/settings/SeoSettingsTab.js.map +1 -1
- package/dist/views/settings/SiteInformationCard.d.ts.map +1 -1
- package/dist/views/settings/SiteInformationCard.js +3 -1
- package/dist/views/settings/SiteInformationCard.js.map +1 -1
- package/package.json +6 -6
- package/src/AdminRoot.tsx +0 -70
- package/src/__tests__/components/breakpoint-controls.render.test.tsx +6 -4
- package/src/__tests__/lib/canvas-edit-chrome.test.ts +0 -27
- package/src/__tests__/lib/open-public-site-tab.test.ts +74 -0
- package/src/__tests__/lib/preview-bridge.test.ts +21 -110
- package/src/__tests__/lib/view-site-chrome.test.ts +80 -0
- package/src/__tests__/router/admin-routes.test.ts +5 -0
- package/src/__tests__/views/canvas-review-mode.render.test.tsx +14 -1
- package/src/__tests__/views/canvas-surface-shared.test.ts +0 -19
- package/src/__tests__/views/editor-top-bar.render.test.tsx +104 -22
- package/src/__tests__/views/page-section-editor.test.tsx +65 -22
- package/src/__tests__/views/post-section-editor.test.tsx +35 -0
- package/src/components/BreakpointPicker.tsx +6 -3
- package/src/components/CanvasEditTip.tsx +2 -2
- package/src/lib/canvas-edit-chrome.ts +0 -64
- package/src/lib/editor-preview.ts +4 -1
- package/src/lib/open-public-site-tab.ts +57 -0
- package/src/lib/preview-bridge.ts +11 -157
- package/src/lib/view-site-chrome.ts +46 -0
- package/src/router/admin-routes.ts +0 -2
- package/src/styles/theme.css +4 -4
- package/src/views/page-editor/EditorCanvas.tsx +2 -7
- package/src/views/page-editor/EditorTopBar.tsx +85 -82
- package/src/views/page-editor/PageSectionEditor.tsx +83 -220
- package/src/views/page-editor/StructureNotice.tsx +7 -42
- package/src/views/page-editor/sections/SectionRenderer.tsx +5 -2
- package/src/views/post-editor/PostEditorCanvas.tsx +3 -9
- package/src/views/post-editor/PostSectionEditor.tsx +71 -195
- package/src/views/settings/SeoSettingsTab.tsx +21 -0
- package/src/views/settings/SiteInformationCard.tsx +7 -0
- package/dist/__tests__/views/use-site-preview.render.test.d.ts +0 -2
- package/dist/__tests__/views/use-site-preview.render.test.d.ts.map +0 -1
- package/dist/__tests__/views/use-site-preview.render.test.js +0 -120
- package/dist/__tests__/views/use-site-preview.render.test.js.map +0 -1
- package/dist/views/page-editor/PagePreview.d.ts +0 -13
- package/dist/views/page-editor/PagePreview.d.ts.map +0 -1
- package/dist/views/page-editor/PagePreview.js +0 -46
- package/dist/views/page-editor/PagePreview.js.map +0 -1
- package/dist/views/page-editor/SitePreviewFrame.d.ts +0 -43
- package/dist/views/page-editor/SitePreviewFrame.d.ts.map +0 -1
- package/dist/views/page-editor/SitePreviewFrame.js +0 -165
- package/dist/views/page-editor/SitePreviewFrame.js.map +0 -1
- package/dist/views/page-editor/useSitePreview.d.ts +0 -47
- package/dist/views/page-editor/useSitePreview.d.ts.map +0 -1
- package/dist/views/page-editor/useSitePreview.js +0 -96
- package/dist/views/page-editor/useSitePreview.js.map +0 -1
- package/dist/views/post-editor/PostPreview.d.ts +0 -14
- package/dist/views/post-editor/PostPreview.d.ts.map +0 -1
- package/dist/views/post-editor/PostPreview.js +0 -63
- package/dist/views/post-editor/PostPreview.js.map +0 -1
- package/src/__tests__/views/use-site-preview.render.test.tsx +0 -164
- package/src/views/page-editor/PagePreview.tsx +0 -105
- package/src/views/page-editor/SitePreviewFrame.tsx +0 -250
- package/src/views/page-editor/useSitePreview.ts +0 -158
- package/src/views/post-editor/PostPreview.tsx +0 -125
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { PageStatus } from '../../lib/page-editor-service.js';
|
|
2
2
|
import type { Zoom } from '../../lib/breakpoints.js';
|
|
3
|
+
import { type ViewSiteIntent } from '../../lib/view-site-chrome.js';
|
|
3
4
|
import { type ViewportId } from './viewports.js';
|
|
4
5
|
export type SaveState = 'idle' | 'saving' | 'saved' | 'error';
|
|
5
6
|
interface EditorTopBarProps {
|
|
@@ -15,7 +16,7 @@ interface EditorTopBarProps {
|
|
|
15
16
|
/** Shown on hover/focus when publish is blocked by validation (not role). */
|
|
16
17
|
publishDisabledReason?: string;
|
|
17
18
|
viewport: ViewportId;
|
|
18
|
-
/** Canvas zoom mode; omit to hide the zoom chip
|
|
19
|
+
/** Canvas zoom mode; omit to hide the zoom chip. */
|
|
19
20
|
zoom?: Zoom;
|
|
20
21
|
/** Scale the canvas actually measured, 0–1 — displayed by the zoom chip. */
|
|
21
22
|
canvasScale?: number;
|
|
@@ -24,13 +25,18 @@ interface EditorTopBarProps {
|
|
|
24
25
|
backLabel?: string;
|
|
25
26
|
onViewport: (v: ViewportId) => void;
|
|
26
27
|
onBack: () => void;
|
|
27
|
-
onPreview: () => void;
|
|
28
28
|
/**
|
|
29
|
-
* Open the
|
|
30
|
-
*
|
|
31
|
-
*
|
|
29
|
+
* Open the public site in a new tab. Called with `preview-draft` or
|
|
30
|
+
* `view-live` depending on status and dirty. Omitted for unsaved documents
|
|
31
|
+
* (no id/slug yet) — View site / Share / View live are then hidden.
|
|
32
32
|
*/
|
|
33
|
-
onViewOnSite?: () => void;
|
|
33
|
+
onViewOnSite?: (intent: ViewSiteIntent) => void;
|
|
34
|
+
/** Copy a shareable draft preview link. Hidden when `shareVisible` is false. */
|
|
35
|
+
onShare?: () => void;
|
|
36
|
+
/** When false, View site and Share are disabled with the SEO settings reason. */
|
|
37
|
+
hasPublicSiteUrl?: boolean;
|
|
38
|
+
/** When true, View site and Share stay disabled — the URL is the CMS host. */
|
|
39
|
+
matchesAdminOrigin?: boolean;
|
|
34
40
|
/**
|
|
35
41
|
* Toggle the version history panel. When omitted the History button is
|
|
36
42
|
* hidden — e.g. for unsaved documents that have no versions yet.
|
|
@@ -42,13 +48,6 @@ interface EditorTopBarProps {
|
|
|
42
48
|
* is nothing in the chrome saying which mode the editor is in.
|
|
43
49
|
*/
|
|
44
50
|
historyOpen?: boolean;
|
|
45
|
-
/** Whether the inline site preview (iframe of the public site) is showing. */
|
|
46
|
-
sitePreview?: boolean;
|
|
47
|
-
/**
|
|
48
|
-
* Toggle the inline site preview — renders the draft through the consumer's
|
|
49
|
-
* real public route inside the editor. Hidden when omitted (unsaved docs).
|
|
50
|
-
*/
|
|
51
|
-
onToggleSitePreview?: () => void;
|
|
52
51
|
onOpenSettings: () => void;
|
|
53
52
|
/** Open the document SEO panel (meta, social, schema, analysis). */
|
|
54
53
|
onOpenSeo?: () => void;
|
|
@@ -72,12 +71,11 @@ interface EditorTopBarProps {
|
|
|
72
71
|
scheduledUnpublishAt?: string | null;
|
|
73
72
|
/**
|
|
74
73
|
* Section types the canvas renders as placeholders (custom / unmanaged).
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
* labeled button as the primary design preview.
|
|
74
|
+
* Used for structure notice / other chrome. View site is always a labeled
|
|
75
|
+
* button regardless of this list.
|
|
78
76
|
*/
|
|
79
77
|
structuralTypes?: string[];
|
|
80
78
|
}
|
|
81
|
-
export declare function EditorTopBar({ title, status, dirty, saveState, publishing, canEdit, canPublish, publishReady, publishDisabledReason, viewport, zoom, canvasScale, onZoom, backLabel, onViewport, onBack,
|
|
79
|
+
export declare function EditorTopBar({ title, status, dirty, saveState, publishing, canEdit, canPublish, publishReady, publishDisabledReason, viewport, zoom, canvasScale, onZoom, backLabel, onViewport, onBack, onViewOnSite, onShare, hasPublicSiteUrl, matchesAdminOrigin, onHistory, historyOpen, onOpenSettings, onOpenSeo, seoOpen, seoScore, seoScoreBand, onSaveDraft, onPublish, onSchedule, scheduleReady, scheduledAt, scheduledUnpublishAt, }: EditorTopBarProps): import("react/jsx-runtime").JSX.Element;
|
|
82
80
|
export {};
|
|
83
81
|
//# sourceMappingURL=EditorTopBar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditorTopBar.d.ts","sourceRoot":"","sources":["../../../src/views/page-editor/EditorTopBar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EditorTopBar.d.ts","sourceRoot":"","sources":["../../../src/views/page-editor/EditorTopBar.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAClE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC1F,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAEhD,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,kFAAkF;IAClF,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,6EAA6E;IAC7E,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,EAAE,UAAU,CAAA;IACpB,oDAAoD;IACpD,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAA;IAC7B,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAA;IACnC,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAA;IAC/C,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,8EAA8E;IAC9E,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,cAAc,EAAE,MAAM,IAAI,CAAA;IAC1B,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,wDAAwD;IACxD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;IACvC,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;IACvB,qFAAqF;IACrF,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;CAC3B;AASD,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,MAAM,EACN,KAAK,EACL,SAAS,EACT,UAAU,EACV,OAAO,EACP,UAAU,EACV,YAAmB,EACnB,qBAAqB,EACrB,QAAQ,EACR,IAAI,EACJ,WAAW,EACX,MAAM,EACN,SAAmB,EACnB,UAAU,EACV,MAAM,EACN,YAAY,EACZ,OAAO,EACP,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,EACT,WAAmB,EACnB,cAAc,EACd,SAAS,EACT,OAAe,EACf,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,SAAS,EACT,UAAU,EACV,aAAoB,EACpB,WAAkB,EAClB,oBAA2B,GAC5B,EAAE,iBAAiB,2CAiPnB"}
|
|
@@ -1,27 +1,29 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
|
|
4
|
+
import { Calendar, Check, ChevronDown, ExternalLink, History, Loader2, Settings2, Share2, TriangleAlert, } from 'lucide-react';
|
|
4
5
|
import { EditorSeoScoreBadge } from '../../components/seo/EditorSeoScoreBadge.js';
|
|
5
6
|
import { BreakpointPicker } from '../../components/BreakpointPicker.js';
|
|
6
7
|
import { ZoomChip } from '../../components/ZoomChip.js';
|
|
8
|
+
import { adminPortalContainer } from '../../lib/portal-container.js';
|
|
9
|
+
import { resolveViewSiteChrome } from '../../lib/view-site-chrome.js';
|
|
7
10
|
const STATUS_TEXT = {
|
|
8
11
|
DRAFT: { label: 'Draft', className: 'text-warning dark:text-amber-400' },
|
|
9
12
|
PUBLISHED: { label: 'Published', className: 'text-emerald-600 dark:text-emerald-400' },
|
|
10
13
|
SCHEDULED: { label: 'Scheduled', className: 'text-warning dark:text-amber-400' },
|
|
11
14
|
ARCHIVED: { label: 'Archived', className: 'text-muted-foreground' },
|
|
12
15
|
};
|
|
13
|
-
export function EditorTopBar({ title, status, dirty, saveState, publishing, canEdit, canPublish, publishReady = true, publishDisabledReason, viewport, zoom, canvasScale, onZoom, backLabel = 'Pages', onViewport, onBack,
|
|
16
|
+
export function EditorTopBar({ title, status, dirty, saveState, publishing, canEdit, canPublish, publishReady = true, publishDisabledReason, viewport, zoom, canvasScale, onZoom, backLabel = 'Pages', onViewport, onBack, onViewOnSite, onShare, hasPublicSiteUrl, matchesAdminOrigin, onHistory, historyOpen = false, onOpenSettings, onOpenSeo, seoOpen = false, seoScore, seoScoreBand, onSaveDraft, onPublish, onSchedule, scheduleReady = true, scheduledAt = null, scheduledUnpublishAt = null, }) {
|
|
14
17
|
const statusInfo = STATUS_TEXT[status];
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const isLive = status === 'PUBLISHED';
|
|
18
|
+
const chrome = onViewOnSite
|
|
19
|
+
? resolveViewSiteChrome({
|
|
20
|
+
status,
|
|
21
|
+
dirty,
|
|
22
|
+
hasPublicSiteUrl: Boolean(hasPublicSiteUrl),
|
|
23
|
+
matchesAdminOrigin: Boolean(matchesAdminOrigin),
|
|
24
|
+
hasIdentity: true,
|
|
25
|
+
})
|
|
26
|
+
: null;
|
|
25
27
|
const publishBlocked = !canPublish || !publishReady || publishing || saveState === 'saving';
|
|
26
28
|
const publishTitle = publishing
|
|
27
29
|
? 'Publishing…'
|
|
@@ -57,14 +59,11 @@ export function EditorTopBar({ title, status, dirty, saveState, publishing, canE
|
|
|
57
59
|
? 'bg-primary text-primary-foreground'
|
|
58
60
|
: 'text-muted-foreground hover:text-foreground hover:bg-accent'}`, children: [seoScore !== undefined && (_jsx(EditorSeoScoreBadge, { score: seoScore, band: seoScoreBand, inverted: seoOpen })), _jsx("span", { className: "hidden sm:inline", children: "SEO" })] })), onHistory && (_jsx("button", { type: "button", onClick: onHistory, "aria-pressed": historyOpen, "aria-label": "Version history", title: historyOpen ? 'Close version history' : 'Version history', className: `prenta-touch-target rounded-lg p-2 transition-colors ${historyOpen
|
|
59
61
|
? 'bg-primary text-primary-foreground'
|
|
60
|
-
: 'text-muted-foreground hover:text-foreground hover:bg-accent'}`, children: _jsx(History, { className: "h-4 w-4", "aria-hidden": true }) })),
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
(structural ? (_jsxs("button", { type: "button", onClick: onViewOnSite, title: isLive
|
|
66
|
-
? 'Open the live published page in a new tab'
|
|
67
|
-
: 'Open the draft on your public site — the real design preview', className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm font-medium transition-colors", children: [_jsx(ExternalLink, { className: "h-3.5 w-3.5", "aria-hidden": true }), isLive ? 'View live' : 'View on site'] })) : (_jsx("button", { type: "button", onClick: onViewOnSite, "aria-label": isLive ? 'View live page' : 'View draft on site', title: isLive ? 'View live page' : 'View draft on site', className: "prenta-touch-target 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' }), onSchedule && (_jsxs("button", { type: "button", onClick: onSchedule, disabled: scheduleBlocked, title: scheduleTitle, "aria-label": scheduledAt ? 'Reschedule publish' : 'Schedule publish', className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: [_jsx(Calendar, { className: "h-3.5 w-3.5", "aria-hidden": true }), _jsx("span", { className: "hidden sm:inline", children: scheduledAt ? 'Reschedule' : 'Schedule' })] })), _jsxs("button", { type: "button", onClick: onPublish, disabled: publishBlocked, title: publishTitle, "aria-disabled": publishBlocked, 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"] })] })] }));
|
|
62
|
+
: 'text-muted-foreground hover:text-foreground hover:bg-accent'}`, children: _jsx(History, { className: "h-4 w-4", "aria-hidden": true }) })), chrome && (_jsxs(_Fragment, { children: [_jsxs("button", { type: "button", onClick: () => onViewOnSite?.(chrome.primaryIntent), disabled: !chrome.viewEnabled, title: chrome.viewDisabledReason ??
|
|
63
|
+
(chrome.primaryIntent === 'view-live'
|
|
64
|
+
? 'Open the published page in a new tab.'
|
|
65
|
+
: 'Open the draft on your site in a new tab.'), className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: [_jsx(ExternalLink, { className: "h-3.5 w-3.5", "aria-hidden": true }), chrome.primaryIntent === 'view-live' ? 'View live' : 'View site'] }), chrome.showViewLive && (_jsxs(DropdownMenu.Root, { children: [_jsx(DropdownMenu.Trigger, { asChild: true, children: _jsx("button", { type: "button", disabled: !chrome.viewEnabled, "aria-label": "More view options", className: "prenta-touch-target border-border text-foreground hover:bg-accent inline-flex h-[34px] items-center rounded-lg border px-2 text-sm font-medium disabled:cursor-not-allowed disabled:opacity-50", children: _jsx(ChevronDown, { className: "h-3.5 w-3.5", "aria-hidden": true }) }) }), _jsx(DropdownMenu.Portal, { container: adminPortalContainer(), children: _jsx(DropdownMenu.Content, { align: "end", sideOffset: 6, className: "border-border bg-popover z-[120] rounded-[10px] border p-[5px] shadow-[0_12px_34px_rgba(26,24,39,0.17)]", children: _jsx(DropdownMenu.Item, { onSelect: () => onViewOnSite?.('view-live'), className: "hover:bg-accent focus:bg-accent cursor-pointer rounded-md px-2.5 py-1.5 text-sm outline-none", children: "View live" }) }) })] })), chrome.shareVisible && onShare && (_jsxs("button", { type: "button", onClick: onShare, disabled: !chrome.viewEnabled, title: chrome.viewDisabledReason ??
|
|
66
|
+
'Copy a link so someone can view this draft without signing in.', className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: [_jsx(Share2, { className: "h-3.5 w-3.5", "aria-hidden": true }), "Share"] }))] })), _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' }), onSchedule && (_jsxs("button", { type: "button", onClick: onSchedule, disabled: scheduleBlocked, title: scheduleTitle, "aria-label": scheduledAt ? 'Reschedule publish' : 'Schedule publish', className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: [_jsx(Calendar, { className: "h-3.5 w-3.5", "aria-hidden": true }), _jsx("span", { className: "hidden sm:inline", children: scheduledAt ? 'Reschedule' : 'Schedule' })] })), _jsxs("button", { type: "button", onClick: onPublish, disabled: publishBlocked, title: publishTitle, "aria-disabled": publishBlocked, 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"] })] })] }));
|
|
68
67
|
}
|
|
69
68
|
function SaveStatus({ state, dirty }) {
|
|
70
69
|
if (state === 'saving') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditorTopBar.js","sourceRoot":"","sources":["../../../src/views/page-editor/EditorTopBar.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EACL,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,
|
|
1
|
+
{"version":3,"file":"EditorTopBar.js","sourceRoot":"","sources":["../../../src/views/page-editor/EditorTopBar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -10,13 +10,7 @@ interface PageSectionEditorProps {
|
|
|
10
10
|
config?: any;
|
|
11
11
|
session?: any;
|
|
12
12
|
onNavigate: (path: string) => void;
|
|
13
|
-
/**
|
|
14
|
-
* Open a preview route in a new browser tab. `prepare` runs before the tab
|
|
15
|
-
* navigates (used to save an unsaved draft first); returning `false` cancels
|
|
16
|
-
* the open. Falls back to in-tab navigation when not provided.
|
|
17
|
-
*/
|
|
18
|
-
onOpenPreview?: (path: string, prepare?: () => Promise<boolean | void> | boolean | void) => void;
|
|
19
13
|
}
|
|
20
|
-
export declare function PageSectionEditor({ documentId, initialParentId, config, session, onNavigate,
|
|
14
|
+
export declare function PageSectionEditor({ documentId, initialParentId, config, session, onNavigate, }: PageSectionEditorProps): import("react/jsx-runtime").JSX.Element;
|
|
21
15
|
export {};
|
|
22
16
|
//# sourceMappingURL=PageSectionEditor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageSectionEditor.d.ts","sourceRoot":"","sources":["../../../src/views/page-editor/PageSectionEditor.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PageSectionEditor.d.ts","sourceRoot":"","sources":["../../../src/views/page-editor/PageSectionEditor.tsx"],"names":[],"mappings":"AA+DA,UAAU,sBAAsB;IAC9B,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,MAAM,CAAC,EAAE,GAAG,CAAA;IACZ,OAAO,CAAC,EAAE,GAAG,CAAA;IACb,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC;AA6CD,wBAAgB,iBAAiB,CAAC,EAChC,UAAU,EACV,eAAe,EACf,MAAM,EACN,OAAO,EACP,UAAU,GACX,EAAE,sBAAsB,2CA+7BxB"}
|
|
@@ -14,9 +14,9 @@ import { VersionHistoryPanel } from './VersionHistoryPanel.js';
|
|
|
14
14
|
import { ReviewBar } from './ReviewBar.js';
|
|
15
15
|
import { fetchPageVersions, restorePageVersion, } from '../../lib/version-history.js';
|
|
16
16
|
import { changedSectionIds, diffVersions } from '../../lib/version-diff.js';
|
|
17
|
-
import { emptyPage, fetchPageForEditor, missingPageFields, publishPage, PAGES_COLLECTION, savePageDraft, toggleSectionVisibility, updateSectionContent,
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
17
|
+
import { emptyPage, fetchPageForEditor, missingPageFields, publishPage, PAGES_COLLECTION, savePageDraft, toggleSectionVisibility, updateSectionContent, updateSectionMeta, validatePage, } from '../../lib/page-editor-service.js';
|
|
18
|
+
import { SharePreviewLinkDialog } from '../../components/SharePreviewLinkDialog.js';
|
|
19
|
+
import { openPublicSiteTab } from '../../lib/open-public-site-tab.js';
|
|
20
20
|
import { usePublicSiteUrl } from '../../hooks/usePublicSiteUrl.js';
|
|
21
21
|
import { DEFAULT_VIEWPORT } from './viewports.js';
|
|
22
22
|
import { snapshotBaseline } from '../../lib/reflow-baseline.js';
|
|
@@ -32,14 +32,11 @@ import { EditorTopBar } from './EditorTopBar.js';
|
|
|
32
32
|
import { SectionsList } from './SectionsPanel.js';
|
|
33
33
|
import { EditorCanvas } from './EditorCanvas.js';
|
|
34
34
|
import { ReflowContext } from './reflow-context.js';
|
|
35
|
-
import { SitePreviewFrame } from './SitePreviewFrame.js';
|
|
36
|
-
import { useSitePreview } from './useSitePreview.js';
|
|
37
35
|
import { SectionEditForm } from './SectionEditForm.js';
|
|
38
36
|
import { PageSettingsModal } from './PageSettingsModal.js';
|
|
39
37
|
import { ValidationSummary } from './ValidationSummary.js';
|
|
40
|
-
import { resolveDefaultSitePreview } from '../../lib/editor-preview.js';
|
|
41
38
|
import { buildEditorContentHtml } from '../../lib/editor-seo-content.js';
|
|
42
|
-
import {
|
|
39
|
+
import { inspectorIdFromFieldPath } from '../../lib/preview-bridge.js';
|
|
43
40
|
/**
|
|
44
41
|
* The lower of the two audit scores — the tab dot should reflect the half that
|
|
45
42
|
* needs work, not an average that hides it.
|
|
@@ -79,17 +76,13 @@ function deriveCan(session) {
|
|
|
79
76
|
canCreateRedirect: redirectCreators.includes(role),
|
|
80
77
|
};
|
|
81
78
|
}
|
|
82
|
-
export function PageSectionEditor({ documentId, initialParentId, config, session, onNavigate,
|
|
79
|
+
export function PageSectionEditor({ documentId, initialParentId, config, session, onNavigate, }) {
|
|
83
80
|
const [page, setPage] = useState(null);
|
|
84
81
|
const [loading, setLoading] = useState(true);
|
|
85
82
|
const [loadError, setLoadError] = useState(null);
|
|
86
83
|
const [selectedId, setSelectedId] = useState(null);
|
|
87
84
|
/** Canvas field click — focused after the inspector mounts for `selectedId`. */
|
|
88
85
|
const [pendingFocusPath, setPendingFocusPath] = useState(null);
|
|
89
|
-
/** Bump to skip the next `prenta-preview:sections` echo after a canvas text edit. */
|
|
90
|
-
const [suppressSectionsEcho, setSuppressSectionsEcho] = useState(0);
|
|
91
|
-
/** Canvas image Replace — opens MediaPickerModal for this field path. */
|
|
92
|
-
const [canvasMediaTarget, setCanvasMediaTarget] = useState(null);
|
|
93
86
|
const [viewport, setViewport] = useState(DEFAULT_VIEWPORT);
|
|
94
87
|
const [zoom, setZoom] = useState('fit');
|
|
95
88
|
/**
|
|
@@ -102,8 +95,7 @@ export function PageSectionEditor({ documentId, initialParentId, config, session
|
|
|
102
95
|
const [canvasScale, setCanvasScale] = useState(1);
|
|
103
96
|
/**
|
|
104
97
|
* The live canvas surface, for the reflow guard to clone. State rather than a
|
|
105
|
-
* ref because the context value has to update when it mounts
|
|
106
|
-
* unmounts whenever the site-preview frame takes over.
|
|
98
|
+
* ref because the context value has to update when it mounts.
|
|
107
99
|
*/
|
|
108
100
|
const [canvasEl, setCanvasEl] = useState(null);
|
|
109
101
|
/**
|
|
@@ -165,11 +157,12 @@ export function PageSectionEditor({ documentId, initialParentId, config, session
|
|
|
165
157
|
const [restoring, setRestoring] = useState(false);
|
|
166
158
|
const [confirmPublish, setConfirmPublish] = useState(false);
|
|
167
159
|
const [scheduleOpen, setScheduleOpen] = useState(false);
|
|
160
|
+
const [shareOpen, setShareOpen] = useState(false);
|
|
168
161
|
const [leaveTarget, setLeaveTarget] = useState(null);
|
|
169
162
|
const [validation, setValidation] = useState(null);
|
|
170
163
|
const { canEdit, canPublish, canCreateRedirect } = useMemo(() => deriveCan(session), [session]);
|
|
171
164
|
const customRenderers = useAdminSectionRenderers();
|
|
172
|
-
const { siteUrl: publicSiteUrl } = usePublicSiteUrl(config?.seo?.siteUrl);
|
|
165
|
+
const { siteUrl: publicSiteUrl, matchesAdminOrigin } = usePublicSiteUrl(config?.seo?.siteUrl);
|
|
173
166
|
// A misconfigured `pages` collection (missing the fields the editor
|
|
174
167
|
// writes) would silently drop content on save — detect it up front.
|
|
175
168
|
// Memoized to a string/null so the load effect can depend on it without
|
|
@@ -455,20 +448,6 @@ export function PageSectionEditor({ documentId, initialParentId, config, session
|
|
|
455
448
|
return false;
|
|
456
449
|
}
|
|
457
450
|
}, [page, documentId, onNavigate, saveDirectives, acceptPage]);
|
|
458
|
-
// Inline branded preview — Next builder canvas (same origin as admin), not
|
|
459
|
-
// the Astro public apex. "View on site" still uses publicSiteUrl below.
|
|
460
|
-
const sitePreview = useSitePreview({
|
|
461
|
-
collection: 'pages',
|
|
462
|
-
documentId: page?.id,
|
|
463
|
-
slug: page?.slug,
|
|
464
|
-
path: page?.path,
|
|
465
|
-
urlPrefix: '',
|
|
466
|
-
dirty,
|
|
467
|
-
saveState,
|
|
468
|
-
saveDraft: handleSaveDraft,
|
|
469
|
-
defaultActive: resolveDefaultSitePreview(config?.admin?.editor, 'pages'),
|
|
470
|
-
});
|
|
471
|
-
const sitePreviewAvailable = Boolean(page?.id && page?.slug);
|
|
472
451
|
const requestPublish = useCallback(() => {
|
|
473
452
|
if (!page)
|
|
474
453
|
return;
|
|
@@ -614,31 +593,14 @@ export function PageSectionEditor({ documentId, initialParentId, config, session
|
|
|
614
593
|
// rail has no close affordance at all — the chevron and the row both
|
|
615
594
|
// re-select what is already selected and nothing happens.
|
|
616
595
|
//
|
|
617
|
-
// Except when a fieldPath came with it:
|
|
618
|
-
//
|
|
619
|
-
//
|
|
620
|
-
// user is trying to edit.
|
|
596
|
+
// Except when a fieldPath came with it: a canvas field click must open
|
|
597
|
+
// and focus that input. Toggling would close the form on the second
|
|
598
|
+
// click of a field the user is trying to inspect.
|
|
621
599
|
if (fieldPath)
|
|
622
600
|
return id;
|
|
623
601
|
return current === id ? null : id;
|
|
624
602
|
});
|
|
625
603
|
}, []);
|
|
626
|
-
// `effectiveCanEdit`, not `canEdit`: the site preview is a second editing
|
|
627
|
-
// surface, so a role check alone let it write through both the version-review
|
|
628
|
-
// lock and the builder-owned lock the rest of the editor honours.
|
|
629
|
-
const handleCanvasEdit = useCallback((edit) => {
|
|
630
|
-
if (!effectiveCanEdit)
|
|
631
|
-
return;
|
|
632
|
-
setSuppressSectionsEcho((n) => n + 1);
|
|
633
|
-
mutateSections((s) => updateSectionContentAtPath(s, edit.sectionId, edit.fieldPath, edit.value));
|
|
634
|
-
setSelectedId(edit.sectionId);
|
|
635
|
-
}, [effectiveCanEdit, mutateSections]);
|
|
636
|
-
const handleCanvasRequestMedia = useCallback((request) => {
|
|
637
|
-
if (!effectiveCanEdit)
|
|
638
|
-
return;
|
|
639
|
-
setSelectedId(request.sectionId);
|
|
640
|
-
setCanvasMediaTarget(request);
|
|
641
|
-
}, [effectiveCanEdit]);
|
|
642
604
|
// After a canvas field click, focus the matching inspector input once painted.
|
|
643
605
|
useEffect(() => {
|
|
644
606
|
if (!pendingFocusPath || !selectedId)
|
|
@@ -657,80 +619,34 @@ export function PageSectionEditor({ documentId, initialParentId, config, session
|
|
|
657
619
|
else
|
|
658
620
|
onNavigate(path);
|
|
659
621
|
}, [dirty, onNavigate]);
|
|
660
|
-
const
|
|
661
|
-
if (!page?.id) {
|
|
662
|
-
toast.error('Save the page before previewing');
|
|
663
|
-
return;
|
|
664
|
-
}
|
|
665
|
-
const path = `/pages/${page.id}/preview`;
|
|
666
|
-
// New-tab preview: save first when there are unsaved edits so the preview
|
|
667
|
-
// (which reads the persisted document) reflects what's on screen.
|
|
668
|
-
if (onOpenPreview) {
|
|
669
|
-
onOpenPreview(path, dirty ? handleSaveDraft : undefined);
|
|
670
|
-
}
|
|
671
|
-
else {
|
|
672
|
-
guardedNavigate(path);
|
|
673
|
-
}
|
|
674
|
-
}, [page, dirty, onOpenPreview, handleSaveDraft, guardedNavigate]);
|
|
675
|
-
// "View on site": render the draft through the consumer's real public route
|
|
676
|
-
// via a signed preview token. The blank tab is opened synchronously inside
|
|
677
|
-
// the click (popup-safe), then pointed at the public URL once any unsaved
|
|
678
|
-
// draft is persisted and the token is minted.
|
|
679
|
-
const handleViewOnSite = useCallback(() => {
|
|
622
|
+
const handleViewOnSite = useCallback((intent) => {
|
|
680
623
|
if (!page?.id || !page.slug) {
|
|
681
624
|
toast.error('Save the page before viewing it on the site');
|
|
682
625
|
return;
|
|
683
626
|
}
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
}
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
if (!tab) {
|
|
700
|
-
toast.error('Enable pop-ups for this site to open the preview in a new tab.');
|
|
627
|
+
void openPublicSiteTab({
|
|
628
|
+
intent,
|
|
629
|
+
siteUrl: publicSiteUrl,
|
|
630
|
+
collection: 'pages',
|
|
631
|
+
documentId: page.id,
|
|
632
|
+
slug: page.slug,
|
|
633
|
+
path: page.path,
|
|
634
|
+
dirty,
|
|
635
|
+
saveDraft: handleSaveDraft,
|
|
636
|
+
}).catch((err) => {
|
|
637
|
+
toast.error(err instanceof Error ? err.message : 'Failed to open the site');
|
|
638
|
+
});
|
|
639
|
+
}, [page, dirty, handleSaveDraft, publicSiteUrl]);
|
|
640
|
+
const handleShare = useCallback(async () => {
|
|
641
|
+
if (!page?.id)
|
|
701
642
|
return;
|
|
643
|
+
if (dirty) {
|
|
644
|
+
const ok = await handleSaveDraft();
|
|
645
|
+
if (!ok)
|
|
646
|
+
return;
|
|
702
647
|
}
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
if (dirty) {
|
|
706
|
-
const ok = await handleSaveDraft();
|
|
707
|
-
if (!ok) {
|
|
708
|
-
tab.close();
|
|
709
|
-
return;
|
|
710
|
-
}
|
|
711
|
-
}
|
|
712
|
-
const { token } = await createPreviewToken('pages', page.id);
|
|
713
|
-
const target = buildPublicPreviewUrl({
|
|
714
|
-
siteUrl: publicSiteUrl,
|
|
715
|
-
urlPrefix: '',
|
|
716
|
-
slug: page.slug,
|
|
717
|
-
path: page.path,
|
|
718
|
-
token,
|
|
719
|
-
});
|
|
720
|
-
try {
|
|
721
|
-
tab.opener = null;
|
|
722
|
-
}
|
|
723
|
-
catch {
|
|
724
|
-
/* same-origin guard */
|
|
725
|
-
}
|
|
726
|
-
tab.location.replace(target);
|
|
727
|
-
}
|
|
728
|
-
catch (err) {
|
|
729
|
-
tab.close();
|
|
730
|
-
toast.error(err instanceof Error ? err.message : 'Failed to open site preview');
|
|
731
|
-
}
|
|
732
|
-
})();
|
|
733
|
-
}, [page, dirty, handleSaveDraft, publicSiteUrl]);
|
|
648
|
+
setShareOpen(true);
|
|
649
|
+
}, [page, dirty, handleSaveDraft]);
|
|
734
650
|
// ─── Render states ───────────────────────────────────────────────────
|
|
735
651
|
if (loading) {
|
|
736
652
|
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 page editor\u2026" })] }));
|
|
@@ -753,11 +669,7 @@ export function PageSectionEditor({ documentId, initialParentId, config, session
|
|
|
753
669
|
const structuralTypes = Array.from(new Set(page.sections
|
|
754
670
|
.filter((s) => !hasCanvasRenderer(s.sectionType) && !customRenderers[s.sectionType])
|
|
755
671
|
.map((s) => s.sectionType)));
|
|
756
|
-
return (_jsxs(ErrorBoundary, { children: [_jsxs("div", { className: "bg-background flex h-full flex-col overflow-hidden", children: [_jsx(EditorTopBar, { title: page.title, status: page.status, dirty: dirty, saveState: saveState, publishing: publishing, canEdit: effectiveCanEdit, canPublish: canPublish && effectiveCanEdit, publishReady: publishReady, publishDisabledReason: publishDisabledReason, viewport: viewport, onViewport: setViewport,
|
|
757
|
-
? // The site preview is an iframe of the real front end, not a
|
|
758
|
-
// scaled canvas — a zoom percentage there would be a lie.
|
|
759
|
-
{}
|
|
760
|
-
: { zoom, canvasScale, onZoom: setZoom }), onBack: () => guardedNavigate('/pages'), onPreview: handlePreview, onViewOnSite: page.id ? handleViewOnSite : undefined, sitePreview: sitePreview.active, onToggleSitePreview: page.id && page.slug ? sitePreview.toggle : undefined, historyOpen: historyOpen, onHistory: page.id ? () => (historyOpen ? closeHistory() : openHistory()) : undefined, onOpenSettings: () => setSettingsOpen(true), onOpenSeo: handleToggleSeo, seoOpen: railTab === 'seo',
|
|
672
|
+
return (_jsxs(ErrorBoundary, { children: [_jsxs("div", { className: "bg-background flex h-full flex-col overflow-hidden", children: [_jsx(EditorTopBar, { title: page.title, status: page.status, dirty: dirty, saveState: saveState, publishing: publishing, canEdit: effectiveCanEdit, canPublish: canPublish && effectiveCanEdit, publishReady: publishReady, publishDisabledReason: publishDisabledReason, viewport: viewport, onViewport: setViewport, zoom: zoom, canvasScale: canvasScale, onZoom: setZoom, onBack: () => guardedNavigate('/pages'), onViewOnSite: page.id && page.slug ? handleViewOnSite : undefined, onShare: page.id ? handleShare : undefined, hasPublicSiteUrl: Boolean(publicSiteUrl), matchesAdminOrigin: matchesAdminOrigin, historyOpen: historyOpen, onHistory: page.id ? () => (historyOpen ? closeHistory() : openHistory()) : undefined, onOpenSettings: () => setSettingsOpen(true), onOpenSeo: handleToggleSeo, seoOpen: railTab === 'seo',
|
|
761
673
|
// The audit's SEO score, banded by the audit's own scale. Previously
|
|
762
674
|
// this chip showed `computeLiveSeoScore` — a different model — so the
|
|
763
675
|
// header read 53 while the rings beside it read 0 and 57.
|
|
@@ -773,29 +685,12 @@ export function PageSectionEditor({ documentId, initialParentId, config, session
|
|
|
773
685
|
}, redirectOnPublish: redirectOnPublish, onRedirectOnPublishChange: setRedirectOnPublish, canCreateRedirect: canCreateRedirect, onPageChange: handlePageSettings, onDuplicate: handleDuplicate, onTrash: handleTrash, schemaType: seoRecord?.structuredDataType ?? undefined, brandName: config?.seo?.siteName ?? undefined }) })) : (_jsx(SeoEditorPane, { entityType: "page", entityId: page.id, slug: page.slug, auditSections: page.sections, onAuditChange: setLiveAudit, contentHtml: seoContentHtml, draftMeta: {
|
|
774
686
|
seoTitle: page.seoTitle,
|
|
775
687
|
seoDescription: page.seoDescription,
|
|
776
|
-
}, onDraftChange: handlePageSettings, onClose: () => setRailTab('sections'), onSaved: handleSeoSaved })) }), historyOpen && (_jsx(VersionHistoryPanel, { versions: versions, loading: versionsLoading, error: versionsError, selectedIndex: versionIndex, onSelect: setVersionIndex, onClose: closeHistory, onRestore: handleRestoreVersion, restoring: restoring, canRestore: canRestoreVersion }))] })) }), _jsx("div", { className: "flex-1 overflow-hidden", children:
|
|
688
|
+
}, onDraftChange: handlePageSettings, onClose: () => setRailTab('sections'), onSaved: handleSeoSaved })) }), historyOpen && (_jsx(VersionHistoryPanel, { versions: versions, loading: versionsLoading, error: versionsError, selectedIndex: versionIndex, onSelect: setVersionIndex, onClose: closeHistory, onRestore: handleRestoreVersion, restoring: restoring, canRestore: canRestoreVersion }))] })) }), _jsx("div", { className: "flex-1 overflow-hidden", children: _jsx(EditorCanvas, { sections: canvasSections, selectedId: selectedId, breakpoint: viewport, zoom: zoom, onScaleChange: setCanvasScale, onCanvasElement: setCanvasEl, onSelect: handleSelectSection, structuralTypes: structuralTypes, reviewing: reviewing, changedSectionIds: reviewChangedIds, reviewBar: reviewVersion ? (_jsx(ReviewBar, { version: reviewVersion, changedCount: reviewChangedIds.size, onRestore: () => void handleRestoreVersion(reviewVersion), onBackToCurrent: () => setVersionIndex(0), restoring: restoring, canRestore: canRestoreVersion })) : null }) })] }) })] }), _jsx(PageSettingsModal, { open: settingsOpen, page: page, canEdit: effectiveCanEdit, onClose: () => setSettingsOpen(false), onSave: handlePageSettings }), _jsx(ConfirmDialog, { open: confirmPublish, onClose: () => setConfirmPublish(false), onConfirm: doPublish, title: "Publish this page?", description: "The current content will go live and replace the published version.", confirmLabel: "Publish" }), page.id && (_jsx(SchedulePublishDialog, { collectionSlug: PAGES_COLLECTION, documentId: page.id, scheduledAt: page.scheduledAt, scheduledUnpublishAt: page.scheduledUnpublishAt, open: scheduleOpen, onClose: () => setScheduleOpen(false), onScheduled: handleScheduled })), page.id && (_jsx(SharePreviewLinkDialog, { collectionSlug: "pages", documentId: page.id, documentSlug: page.slug, documentPath: page.path, siteUrl: publicSiteUrl, urlPrefix: "", open: shareOpen, onClose: () => setShareOpen(false) })), _jsx(ConfirmDialog, { open: leaveTarget !== null, onClose: () => setLeaveTarget(null), onConfirm: () => {
|
|
777
689
|
const target = leaveTarget;
|
|
778
690
|
setLeaveTarget(null);
|
|
779
691
|
setDirty(false);
|
|
780
692
|
if (target)
|
|
781
693
|
onNavigate(target);
|
|
782
|
-
}, title: "Discard unsaved changes?", description: "You have unsaved changes that will be lost if you leave now.", confirmLabel: "Leave", cancelLabel: "Stay", destructive: true })
|
|
783
|
-
if (!canvasMediaTarget)
|
|
784
|
-
return;
|
|
785
|
-
const { sectionId, fieldPath } = canvasMediaTarget;
|
|
786
|
-
const { widthPath, heightPath } = companionDimensionPaths(fieldPath);
|
|
787
|
-
// Media Replace must echo sections so the canvas image updates.
|
|
788
|
-
mutateSections((s) => {
|
|
789
|
-
let next = updateSectionContentAtPath(s, sectionId, fieldPath, item.url);
|
|
790
|
-
if (typeof item.width === 'number') {
|
|
791
|
-
next = updateSectionContentAtPath(next, sectionId, widthPath, item.width);
|
|
792
|
-
}
|
|
793
|
-
if (typeof item.height === 'number') {
|
|
794
|
-
next = updateSectionContentAtPath(next, sectionId, heightPath, item.height);
|
|
795
|
-
}
|
|
796
|
-
return next;
|
|
797
|
-
});
|
|
798
|
-
setCanvasMediaTarget(null);
|
|
799
|
-
}, onSelect: () => setCanvasMediaTarget(null) })] }));
|
|
694
|
+
}, title: "Discard unsaved changes?", description: "You have unsaved changes that will be lost if you leave now.", confirmLabel: "Leave", cancelLabel: "Stay", destructive: true })] }));
|
|
800
695
|
}
|
|
801
696
|
//# sourceMappingURL=PageSectionEditor.js.map
|