@prenta/admin 0.92.0 → 0.94.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 +663 -0
- package/design-system/tokens.css +173 -71
- package/design-system/tokens.json +244 -63
- package/design-system/tokens.scss +203 -98
- package/design-system/tokens.tailwind.cjs +93 -38
- package/dist/AdminRoot.d.ts +27 -6
- package/dist/AdminRoot.d.ts.map +1 -1
- package/dist/AdminRoot.js.map +1 -1
- package/dist/__tests__/components/breakpoint-controls.render.test.d.ts +2 -0
- package/dist/__tests__/components/breakpoint-controls.render.test.d.ts.map +1 -0
- package/dist/__tests__/components/breakpoint-controls.render.test.js +51 -0
- package/dist/__tests__/components/breakpoint-controls.render.test.js.map +1 -0
- package/dist/__tests__/components/canvas-edit-tip.render.test.d.ts +2 -0
- package/dist/__tests__/components/canvas-edit-tip.render.test.d.ts.map +1 -0
- package/dist/__tests__/components/canvas-edit-tip.render.test.js +37 -0
- package/dist/__tests__/components/canvas-edit-tip.render.test.js.map +1 -0
- package/dist/__tests__/components/editor-rail.render.test.d.ts +2 -0
- package/dist/__tests__/components/editor-rail.render.test.d.ts.map +1 -0
- package/dist/__tests__/components/editor-rail.render.test.js +138 -0
- package/dist/__tests__/components/editor-rail.render.test.js.map +1 -0
- package/dist/__tests__/components/media-block.render.test.d.ts +2 -0
- package/dist/__tests__/components/media-block.render.test.d.ts.map +1 -0
- package/dist/__tests__/components/media-block.render.test.js +108 -0
- package/dist/__tests__/components/media-block.render.test.js.map +1 -0
- package/dist/__tests__/components/page-audit-panel.render.test.d.ts +2 -0
- package/dist/__tests__/components/page-audit-panel.render.test.d.ts.map +1 -0
- package/dist/__tests__/components/page-audit-panel.render.test.js +59 -0
- package/dist/__tests__/components/page-audit-panel.render.test.js.map +1 -0
- package/dist/__tests__/components/reflow-meter.render.test.d.ts +2 -0
- package/dist/__tests__/components/reflow-meter.render.test.d.ts.map +1 -0
- package/dist/__tests__/components/reflow-meter.render.test.js +94 -0
- package/dist/__tests__/components/reflow-meter.render.test.js.map +1 -0
- package/dist/__tests__/components/seo-char-count.test.js +24 -6
- package/dist/__tests__/components/seo-char-count.test.js.map +1 -1
- package/dist/__tests__/components/serp-preview.render.test.d.ts +2 -0
- package/dist/__tests__/components/serp-preview.render.test.d.ts.map +1 -0
- package/dist/__tests__/components/serp-preview.render.test.js +25 -0
- package/dist/__tests__/components/serp-preview.render.test.js.map +1 -0
- package/dist/__tests__/lib/breakpoints.test.d.ts +2 -0
- package/dist/__tests__/lib/breakpoints.test.d.ts.map +1 -0
- package/dist/__tests__/lib/breakpoints.test.js +67 -0
- package/dist/__tests__/lib/breakpoints.test.js.map +1 -0
- package/dist/__tests__/lib/canvas-edit-chrome.test.d.ts +2 -0
- package/dist/__tests__/lib/canvas-edit-chrome.test.d.ts.map +1 -0
- package/dist/__tests__/lib/canvas-edit-chrome.test.js +44 -0
- package/dist/__tests__/lib/canvas-edit-chrome.test.js.map +1 -0
- package/dist/__tests__/lib/media-format.test.d.ts +2 -0
- package/dist/__tests__/lib/media-format.test.d.ts.map +1 -0
- package/dist/__tests__/lib/media-format.test.js +70 -0
- package/dist/__tests__/lib/media-format.test.js.map +1 -0
- package/dist/__tests__/lib/page-audit-input.test.d.ts +2 -0
- package/dist/__tests__/lib/page-audit-input.test.d.ts.map +1 -0
- package/dist/__tests__/lib/page-audit-input.test.js +122 -0
- package/dist/__tests__/lib/page-audit-input.test.js.map +1 -0
- package/dist/__tests__/lib/page-editor-service.test.js +2 -0
- package/dist/__tests__/lib/page-editor-service.test.js.map +1 -1
- package/dist/__tests__/lib/page-redirect.test.d.ts +2 -0
- package/dist/__tests__/lib/page-redirect.test.d.ts.map +1 -0
- package/dist/__tests__/lib/page-redirect.test.js +26 -0
- package/dist/__tests__/lib/page-redirect.test.js.map +1 -0
- package/dist/__tests__/lib/rail-width.test.d.ts +2 -0
- package/dist/__tests__/lib/rail-width.test.d.ts.map +1 -0
- package/dist/__tests__/lib/rail-width.test.js +69 -0
- package/dist/__tests__/lib/rail-width.test.js.map +1 -0
- package/dist/__tests__/lib/reflow-baseline.test.d.ts +2 -0
- package/dist/__tests__/lib/reflow-baseline.test.d.ts.map +1 -0
- package/dist/__tests__/lib/reflow-baseline.test.js +56 -0
- package/dist/__tests__/lib/reflow-baseline.test.js.map +1 -0
- package/dist/__tests__/lib/reflow-probe.test.d.ts +2 -0
- package/dist/__tests__/lib/reflow-probe.test.d.ts.map +1 -0
- package/dist/__tests__/lib/reflow-probe.test.js +73 -0
- package/dist/__tests__/lib/reflow-probe.test.js.map +1 -0
- package/dist/__tests__/lib/version-diff.test.d.ts +2 -0
- package/dist/__tests__/lib/version-diff.test.d.ts.map +1 -0
- package/dist/__tests__/lib/version-diff.test.js +230 -0
- package/dist/__tests__/lib/version-diff.test.js.map +1 -0
- package/dist/__tests__/lib/version-history.test.d.ts +2 -0
- package/dist/__tests__/lib/version-history.test.d.ts.map +1 -0
- package/dist/__tests__/lib/version-history.test.js +125 -0
- package/dist/__tests__/lib/version-history.test.js.map +1 -0
- package/dist/__tests__/styles/canvas-container-queries.test.d.ts +2 -0
- package/dist/__tests__/styles/canvas-container-queries.test.d.ts.map +1 -0
- package/dist/__tests__/styles/canvas-container-queries.test.js +87 -0
- package/dist/__tests__/styles/canvas-container-queries.test.js.map +1 -0
- package/dist/__tests__/styles/packaging.test.d.ts +2 -0
- package/dist/__tests__/styles/packaging.test.d.ts.map +1 -0
- package/dist/__tests__/styles/packaging.test.js +31 -0
- package/dist/__tests__/styles/packaging.test.js.map +1 -0
- package/dist/__tests__/styles/responsive-layer.test.d.ts +2 -0
- package/dist/__tests__/styles/responsive-layer.test.d.ts.map +1 -0
- package/dist/__tests__/styles/responsive-layer.test.js +127 -0
- package/dist/__tests__/styles/responsive-layer.test.js.map +1 -0
- package/dist/__tests__/styles/tokens-drift.test.d.ts +2 -0
- package/dist/__tests__/styles/tokens-drift.test.d.ts.map +1 -0
- package/dist/__tests__/styles/tokens-drift.test.js +92 -0
- package/dist/__tests__/styles/tokens-drift.test.js.map +1 -0
- package/dist/__tests__/views/admin-renderer-compat.test.d.ts +2 -0
- package/dist/__tests__/views/admin-renderer-compat.test.d.ts.map +1 -0
- package/dist/__tests__/views/admin-renderer-compat.test.js +43 -0
- package/dist/__tests__/views/admin-renderer-compat.test.js.map +1 -0
- package/dist/__tests__/views/admin-section-renderers.test.js +52 -4
- package/dist/__tests__/views/admin-section-renderers.test.js.map +1 -1
- package/dist/__tests__/views/canvas-review-mode.render.test.d.ts +2 -0
- package/dist/__tests__/views/canvas-review-mode.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/canvas-review-mode.render.test.js +70 -0
- package/dist/__tests__/views/canvas-review-mode.render.test.js.map +1 -0
- package/dist/__tests__/views/editor-top-bar.render.test.js +30 -1
- package/dist/__tests__/views/editor-top-bar.render.test.js.map +1 -1
- package/dist/__tests__/views/page-tab.render.test.d.ts +2 -0
- package/dist/__tests__/views/page-tab.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/page-tab.render.test.js +151 -0
- package/dist/__tests__/views/page-tab.render.test.js.map +1 -0
- package/dist/__tests__/views/section-class-parity.test.d.ts +2 -0
- package/dist/__tests__/views/section-class-parity.test.d.ts.map +1 -0
- package/dist/__tests__/views/section-class-parity.test.js +81 -0
- package/dist/__tests__/views/section-class-parity.test.js.map +1 -0
- package/dist/__tests__/views/sections-panel-design-owned.render.test.d.ts +2 -0
- package/dist/__tests__/views/sections-panel-design-owned.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/sections-panel-design-owned.render.test.js +86 -0
- package/dist/__tests__/views/sections-panel-design-owned.render.test.js.map +1 -0
- package/dist/__tests__/views/version-history-panel.render.test.d.ts +2 -0
- package/dist/__tests__/views/version-history-panel.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/version-history-panel.render.test.js +153 -0
- package/dist/__tests__/views/version-history-panel.render.test.js.map +1 -0
- package/dist/components/BreakpointPicker.d.ts +18 -0
- package/dist/components/BreakpointPicker.d.ts.map +1 -0
- package/dist/components/BreakpointPicker.js +31 -0
- package/dist/components/BreakpointPicker.js.map +1 -0
- package/dist/components/CanvasEditTip.d.ts +6 -0
- package/dist/components/CanvasEditTip.d.ts.map +1 -0
- package/dist/components/CanvasEditTip.js +22 -0
- package/dist/components/CanvasEditTip.js.map +1 -0
- package/dist/components/EditorRail.d.ts +36 -0
- package/dist/components/EditorRail.d.ts.map +1 -0
- package/dist/components/EditorRail.js +104 -0
- package/dist/components/EditorRail.js.map +1 -0
- package/dist/components/EditorRailTabs.d.ts +32 -0
- package/dist/components/EditorRailTabs.d.ts.map +1 -0
- package/dist/components/EditorRailTabs.js +45 -0
- package/dist/components/EditorRailTabs.js.map +1 -0
- package/dist/components/MediaBlock.d.ts +49 -0
- package/dist/components/MediaBlock.d.ts.map +1 -0
- package/dist/components/MediaBlock.js +50 -0
- package/dist/components/MediaBlock.js.map +1 -0
- package/dist/components/ReflowMeter.d.ts +28 -0
- package/dist/components/ReflowMeter.d.ts.map +1 -0
- package/dist/components/ReflowMeter.js +42 -0
- package/dist/components/ReflowMeter.js.map +1 -0
- package/dist/components/ZoomChip.d.ts +17 -0
- package/dist/components/ZoomChip.d.ts.map +1 -0
- package/dist/components/ZoomChip.js +17 -0
- package/dist/components/ZoomChip.js.map +1 -0
- package/dist/components/breakpoint-icons.d.ts +3 -0
- package/dist/components/breakpoint-icons.d.ts.map +1 -0
- package/dist/components/breakpoint-icons.js +16 -0
- package/dist/components/breakpoint-icons.js.map +1 -0
- package/dist/components/page-tab/AuthorPicker.d.ts +31 -0
- package/dist/components/page-tab/AuthorPicker.d.ts.map +1 -0
- package/dist/components/page-tab/AuthorPicker.js +95 -0
- package/dist/components/page-tab/AuthorPicker.js.map +1 -0
- package/dist/components/page-tab/DirectiveSwitch.d.ts +38 -0
- package/dist/components/page-tab/DirectiveSwitch.d.ts.map +1 -0
- package/dist/components/page-tab/DirectiveSwitch.js +33 -0
- package/dist/components/page-tab/DirectiveSwitch.js.map +1 -0
- package/dist/components/seo/EditorSeoScoreBadge.d.ts +8 -1
- package/dist/components/seo/EditorSeoScoreBadge.d.ts.map +1 -1
- package/dist/components/seo/EditorSeoScoreBadge.js +2 -2
- package/dist/components/seo/EditorSeoScoreBadge.js.map +1 -1
- package/dist/components/seo/PageAuditPanel.d.ts +14 -0
- package/dist/components/seo/PageAuditPanel.d.ts.map +1 -0
- package/dist/components/seo/PageAuditPanel.js +59 -0
- package/dist/components/seo/PageAuditPanel.js.map +1 -0
- package/dist/components/seo/SeoCharCount.d.ts +19 -7
- package/dist/components/seo/SeoCharCount.d.ts.map +1 -1
- package/dist/components/seo/SeoCharCount.js +30 -16
- package/dist/components/seo/SeoCharCount.js.map +1 -1
- package/dist/components/seo/SeoEditorPane.d.ts +15 -1
- package/dist/components/seo/SeoEditorPane.d.ts.map +1 -1
- package/dist/components/seo/SeoEditorPane.js +118 -21
- package/dist/components/seo/SeoEditorPane.js.map +1 -1
- package/dist/components/seo/SerpPreview.d.ts +20 -0
- package/dist/components/seo/SerpPreview.d.ts.map +1 -0
- package/dist/components/seo/SerpPreview.js +6 -0
- package/dist/components/seo/SerpPreview.js.map +1 -0
- package/dist/hooks/usePageAudit.d.ts +41 -0
- package/dist/hooks/usePageAudit.d.ts.map +1 -0
- package/dist/hooks/usePageAudit.js +68 -0
- package/dist/hooks/usePageAudit.js.map +1 -0
- package/dist/hooks/useReflowGuard.d.ts +47 -0
- package/dist/hooks/useReflowGuard.d.ts.map +1 -0
- package/dist/hooks/useReflowGuard.js +52 -0
- package/dist/hooks/useReflowGuard.js.map +1 -0
- package/dist/layout/primitives/AdminShell.d.ts.map +1 -1
- package/dist/layout/primitives/AdminShell.js +2 -2
- package/dist/layout/primitives/AdminShell.js.map +1 -1
- package/dist/lib/breakpoints.d.ts +51 -0
- package/dist/lib/breakpoints.d.ts.map +1 -0
- package/dist/lib/breakpoints.js +84 -0
- package/dist/lib/breakpoints.js.map +1 -0
- package/dist/lib/canvas-edit-chrome.d.ts +22 -0
- package/dist/lib/canvas-edit-chrome.d.ts.map +1 -0
- package/dist/lib/canvas-edit-chrome.js +81 -0
- package/dist/lib/canvas-edit-chrome.js.map +1 -0
- package/dist/lib/media-format.d.ts +55 -0
- package/dist/lib/media-format.d.ts.map +1 -0
- package/dist/lib/media-format.js +93 -0
- package/dist/lib/media-format.js.map +1 -0
- package/dist/lib/page-audit-input.d.ts +45 -0
- package/dist/lib/page-audit-input.d.ts.map +1 -0
- package/dist/lib/page-audit-input.js +53 -0
- package/dist/lib/page-audit-input.js.map +1 -0
- package/dist/lib/page-editor-service.d.ts +12 -0
- package/dist/lib/page-editor-service.d.ts.map +1 -1
- package/dist/lib/page-editor-service.js +6 -0
- package/dist/lib/page-editor-service.js.map +1 -1
- package/dist/lib/page-redirect.d.ts +39 -0
- package/dist/lib/page-redirect.d.ts.map +1 -0
- package/dist/lib/page-redirect.js +38 -0
- package/dist/lib/page-redirect.js.map +1 -0
- package/dist/lib/rail-width.d.ts +23 -0
- package/dist/lib/rail-width.d.ts.map +1 -0
- package/dist/lib/rail-width.js +59 -0
- package/dist/lib/rail-width.js.map +1 -0
- package/dist/lib/reflow-baseline.d.ts +45 -0
- package/dist/lib/reflow-baseline.d.ts.map +1 -0
- package/dist/lib/reflow-baseline.js +38 -0
- package/dist/lib/reflow-baseline.js.map +1 -0
- package/dist/lib/reflow-probe.d.ts +159 -0
- package/dist/lib/reflow-probe.d.ts.map +1 -0
- package/dist/lib/reflow-probe.js +228 -0
- package/dist/lib/reflow-probe.js.map +1 -0
- package/dist/lib/seo-service.d.ts +10 -0
- package/dist/lib/seo-service.d.ts.map +1 -1
- package/dist/lib/seo-service.js.map +1 -1
- package/dist/lib/version-diff.d.ts +50 -0
- package/dist/lib/version-diff.d.ts.map +1 -0
- package/dist/lib/version-diff.js +294 -0
- package/dist/lib/version-diff.js.map +1 -0
- package/dist/lib/version-history.d.ts +73 -0
- package/dist/lib/version-history.d.ts.map +1 -0
- package/dist/lib/version-history.js +126 -0
- package/dist/lib/version-history.js.map +1 -0
- package/dist/prenta-admin.css +1 -1
- package/dist/views/page-editor/CanvasMetaLine.d.ts +19 -0
- package/dist/views/page-editor/CanvasMetaLine.d.ts.map +1 -0
- package/dist/views/page-editor/CanvasMetaLine.js +23 -0
- package/dist/views/page-editor/CanvasMetaLine.js.map +1 -0
- package/dist/views/page-editor/EditorCanvas.d.ts +47 -8
- package/dist/views/page-editor/EditorCanvas.d.ts.map +1 -1
- package/dist/views/page-editor/EditorCanvas.js +68 -34
- package/dist/views/page-editor/EditorCanvas.js.map +1 -1
- package/dist/views/page-editor/EditorTopBar.d.ts +21 -2
- package/dist/views/page-editor/EditorTopBar.d.ts.map +1 -1
- package/dist/views/page-editor/EditorTopBar.js +13 -20
- package/dist/views/page-editor/EditorTopBar.js.map +1 -1
- package/dist/views/page-editor/PageSectionEditor.d.ts.map +1 -1
- package/dist/views/page-editor/PageSectionEditor.js +383 -78
- package/dist/views/page-editor/PageSectionEditor.js.map +1 -1
- package/dist/views/page-editor/PageTab.d.ts +36 -0
- package/dist/views/page-editor/PageTab.d.ts.map +1 -0
- package/dist/views/page-editor/PageTab.js +65 -0
- package/dist/views/page-editor/PageTab.js.map +1 -0
- package/dist/views/page-editor/ReviewBar.d.ts +21 -0
- package/dist/views/page-editor/ReviewBar.d.ts.map +1 -0
- package/dist/views/page-editor/ReviewBar.js +22 -0
- package/dist/views/page-editor/ReviewBar.js.map +1 -0
- package/dist/views/page-editor/SectionInspector.d.ts.map +1 -1
- package/dist/views/page-editor/SectionInspector.js +64 -20
- package/dist/views/page-editor/SectionInspector.js.map +1 -1
- package/dist/views/page-editor/SectionsPanel.d.ts +30 -5
- package/dist/views/page-editor/SectionsPanel.d.ts.map +1 -1
- package/dist/views/page-editor/SectionsPanel.js +38 -7
- package/dist/views/page-editor/SectionsPanel.js.map +1 -1
- package/dist/views/page-editor/SitePreviewFrame.d.ts.map +1 -1
- package/dist/views/page-editor/SitePreviewFrame.js +3 -0
- package/dist/views/page-editor/SitePreviewFrame.js.map +1 -1
- package/dist/views/page-editor/VersionHistoryPanel.d.ts +29 -0
- package/dist/views/page-editor/VersionHistoryPanel.d.ts.map +1 -0
- package/dist/views/page-editor/VersionHistoryPanel.js +81 -0
- package/dist/views/page-editor/VersionHistoryPanel.js.map +1 -0
- package/dist/views/page-editor/reflow-context.d.ts +28 -0
- package/dist/views/page-editor/reflow-context.d.ts.map +1 -0
- package/dist/views/page-editor/reflow-context.js +14 -0
- package/dist/views/page-editor/reflow-context.js.map +1 -0
- package/dist/views/page-editor/sections/ByTheNumbersSection.d.ts.map +1 -1
- package/dist/views/page-editor/sections/ByTheNumbersSection.js +1 -1
- package/dist/views/page-editor/sections/ByTheNumbersSection.js.map +1 -1
- package/dist/views/page-editor/sections/CtaBannerSection.d.ts.map +1 -1
- package/dist/views/page-editor/sections/CtaBannerSection.js +1 -1
- package/dist/views/page-editor/sections/CtaBannerSection.js.map +1 -1
- package/dist/views/page-editor/sections/FeatureHighlightSection.d.ts.map +1 -1
- package/dist/views/page-editor/sections/FeatureHighlightSection.js +2 -2
- package/dist/views/page-editor/sections/FeatureHighlightSection.js.map +1 -1
- package/dist/views/page-editor/sections/GallerySection.d.ts.map +1 -1
- package/dist/views/page-editor/sections/GallerySection.js +7 -3
- package/dist/views/page-editor/sections/GallerySection.js.map +1 -1
- package/dist/views/page-editor/sections/HeroBannerSection.js +1 -1
- package/dist/views/page-editor/sections/HeroBannerSection.js.map +1 -1
- package/dist/views/page-editor/sections/MissionSection.d.ts.map +1 -1
- package/dist/views/page-editor/sections/MissionSection.js +1 -1
- package/dist/views/page-editor/sections/MissionSection.js.map +1 -1
- package/dist/views/page-editor/sections/PullQuoteSection.d.ts.map +1 -1
- package/dist/views/page-editor/sections/PullQuoteSection.js +1 -1
- package/dist/views/page-editor/sections/PullQuoteSection.js.map +1 -1
- package/dist/views/page-editor/sections/RelatedPostsSection.d.ts.map +1 -1
- package/dist/views/page-editor/sections/RelatedPostsSection.js +1 -1
- package/dist/views/page-editor/sections/RelatedPostsSection.js.map +1 -1
- package/dist/views/page-editor/sections/SectionRenderer.d.ts +13 -1
- package/dist/views/page-editor/sections/SectionRenderer.d.ts.map +1 -1
- package/dist/views/page-editor/sections/SectionRenderer.js +66 -26
- package/dist/views/page-editor/sections/SectionRenderer.js.map +1 -1
- package/dist/views/page-editor/sections/admin-renderers.d.ts +47 -15
- package/dist/views/page-editor/sections/admin-renderers.d.ts.map +1 -1
- package/dist/views/page-editor/sections/admin-renderers.js +27 -15
- package/dist/views/page-editor/sections/admin-renderers.js.map +1 -1
- package/dist/views/page-editor/sections/parts.d.ts +0 -1
- package/dist/views/page-editor/sections/parts.d.ts.map +1 -1
- package/dist/views/page-editor/sections/parts.js +41 -16
- package/dist/views/page-editor/sections/parts.js.map +1 -1
- package/dist/views/page-editor/viewports.d.ts +7 -14
- package/dist/views/page-editor/viewports.d.ts.map +1 -1
- package/dist/views/page-editor/viewports.js +7 -12
- package/dist/views/page-editor/viewports.js.map +1 -1
- package/dist/views/post-editor/PostEditorCanvas.d.ts +2 -1
- package/dist/views/post-editor/PostEditorCanvas.d.ts.map +1 -1
- package/dist/views/post-editor/PostEditorCanvas.js +5 -2
- package/dist/views/post-editor/PostEditorCanvas.js.map +1 -1
- package/dist/views/post-editor/PostSectionEditor.d.ts.map +1 -1
- package/dist/views/post-editor/PostSectionEditor.js +2 -20
- package/dist/views/post-editor/PostSectionEditor.js.map +1 -1
- package/dist/views/post-editor/PostTemplateEditor.d.ts.map +1 -1
- package/dist/views/post-editor/PostTemplateEditor.js +4 -1
- package/dist/views/post-editor/PostTemplateEditor.js.map +1 -1
- package/package.json +5 -3
- package/src/AdminRoot.tsx +27 -6
- package/src/__tests__/components/breakpoint-controls.render.test.tsx +57 -0
- package/src/__tests__/components/canvas-edit-tip.render.test.tsx +41 -0
- package/src/__tests__/components/editor-rail.render.test.tsx +192 -0
- package/src/__tests__/components/media-block.render.test.tsx +126 -0
- package/src/__tests__/components/page-audit-panel.render.test.tsx +64 -0
- package/src/__tests__/components/reflow-meter.render.test.tsx +144 -0
- package/src/__tests__/components/seo-char-count.test.tsx +26 -6
- package/src/__tests__/components/serp-preview.render.test.tsx +32 -0
- package/src/__tests__/lib/breakpoints.test.ts +84 -0
- package/src/__tests__/lib/canvas-edit-chrome.test.ts +56 -0
- package/src/__tests__/lib/media-format.test.ts +89 -0
- package/src/__tests__/lib/page-audit-input.test.ts +144 -0
- package/src/__tests__/lib/page-editor-service.test.ts +2 -0
- package/src/__tests__/lib/page-redirect.test.ts +29 -0
- package/src/__tests__/lib/rail-width.test.ts +86 -0
- package/src/__tests__/lib/reflow-baseline.test.ts +64 -0
- package/src/__tests__/lib/reflow-probe.test.ts +95 -0
- package/src/__tests__/lib/version-diff.test.ts +278 -0
- package/src/__tests__/lib/version-history.test.ts +166 -0
- package/src/__tests__/styles/canvas-container-queries.test.ts +103 -0
- package/src/__tests__/styles/packaging.test.ts +38 -0
- package/src/__tests__/styles/responsive-layer.test.ts +152 -0
- package/src/__tests__/styles/tokens-drift.test.ts +110 -0
- package/src/__tests__/views/admin-renderer-compat.test.ts +48 -0
- package/src/__tests__/views/admin-section-renderers.test.tsx +70 -4
- package/src/__tests__/views/canvas-review-mode.render.test.tsx +94 -0
- package/src/__tests__/views/editor-top-bar.render.test.tsx +43 -1
- package/src/__tests__/views/page-tab.render.test.tsx +226 -0
- package/src/__tests__/views/section-class-parity.test.ts +98 -0
- package/src/__tests__/views/sections-panel-design-owned.render.test.tsx +104 -0
- package/src/__tests__/views/version-history-panel.render.test.tsx +195 -0
- package/src/components/BreakpointPicker.tsx +114 -0
- package/src/components/CanvasEditTip.tsx +46 -0
- package/src/components/EditorRail.tsx +219 -0
- package/src/components/EditorRailTabs.tsx +117 -0
- package/src/components/MediaBlock.tsx +223 -0
- package/src/components/ReflowMeter.tsx +125 -0
- package/src/components/ZoomChip.tsx +39 -0
- package/src/components/breakpoint-icons.ts +17 -0
- package/src/components/page-tab/AuthorPicker.tsx +240 -0
- package/src/components/page-tab/DirectiveSwitch.tsx +89 -0
- package/src/components/seo/EditorSeoScoreBadge.tsx +9 -1
- package/src/components/seo/PageAuditPanel.tsx +192 -0
- package/src/components/seo/SeoCharCount.tsx +55 -24
- package/src/components/seo/SeoEditorPane.tsx +213 -31
- package/src/components/seo/SerpPreview.tsx +41 -0
- package/src/hooks/usePageAudit.ts +98 -0
- package/src/hooks/useReflowGuard.ts +96 -0
- package/src/layout/primitives/AdminShell.tsx +13 -1
- package/src/lib/breakpoints.ts +107 -0
- package/src/lib/canvas-edit-chrome.ts +82 -0
- package/src/lib/media-format.ts +99 -0
- package/src/lib/page-audit-input.ts +104 -0
- package/src/lib/page-editor-service.ts +18 -0
- package/src/lib/page-redirect.ts +60 -0
- package/src/lib/rail-width.ts +58 -0
- package/src/lib/reflow-baseline.ts +70 -0
- package/src/lib/reflow-probe.ts +299 -0
- package/src/lib/seo-service.ts +10 -0
- package/src/lib/version-diff.ts +376 -0
- package/src/lib/version-history.ts +192 -0
- package/src/styles/prenta-tokens.css +120 -42
- package/src/styles/responsive.css +281 -0
- package/src/styles/theme.css +138 -0
- package/src/views/page-editor/CanvasMetaLine.tsx +50 -0
- package/src/views/page-editor/EditorCanvas.tsx +140 -54
- package/src/views/page-editor/EditorTopBar.tsx +55 -51
- package/src/views/page-editor/PageSectionEditor.tsx +575 -185
- package/src/views/page-editor/PageTab.tsx +433 -0
- package/src/views/page-editor/ReviewBar.tsx +76 -0
- package/src/views/page-editor/SectionInspector.tsx +84 -42
- package/src/views/page-editor/SectionsPanel.tsx +282 -141
- package/src/views/page-editor/SitePreviewFrame.tsx +3 -0
- package/src/views/page-editor/VersionHistoryPanel.tsx +302 -0
- package/src/views/page-editor/reflow-context.ts +43 -0
- package/src/views/page-editor/sections/ByTheNumbersSection.tsx +3 -2
- package/src/views/page-editor/sections/CtaBannerSection.tsx +3 -1
- package/src/views/page-editor/sections/FeatureHighlightSection.tsx +3 -2
- package/src/views/page-editor/sections/GallerySection.tsx +7 -3
- package/src/views/page-editor/sections/HeroBannerSection.tsx +2 -2
- package/src/views/page-editor/sections/MissionSection.tsx +4 -2
- package/src/views/page-editor/sections/PullQuoteSection.tsx +3 -1
- package/src/views/page-editor/sections/RelatedPostsSection.tsx +2 -1
- package/src/views/page-editor/sections/SectionRenderer.tsx +115 -34
- package/src/views/page-editor/sections/admin-renderers.tsx +54 -15
- package/src/views/page-editor/sections/parts.tsx +46 -18
- package/src/views/page-editor/viewports.ts +13 -26
- package/src/views/post-editor/PostEditorCanvas.tsx +18 -11
- package/src/views/post-editor/PostSectionEditor.tsx +1 -56
- package/src/views/post-editor/PostTemplateEditor.tsx +3 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// @vitest-environment happy-dom
|
|
3
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
4
|
+
import { cleanup, fireEvent, render, screen } from '@testing-library/react';
|
|
5
|
+
import { SectionRenderer } from '../../views/page-editor/sections/SectionRenderer.js';
|
|
6
|
+
afterEach(cleanup);
|
|
7
|
+
const SECTION = {
|
|
8
|
+
id: 's1',
|
|
9
|
+
sectionType: 'hero',
|
|
10
|
+
name: 'Hero Banner',
|
|
11
|
+
visible: true,
|
|
12
|
+
content: { heading: 'A headline' },
|
|
13
|
+
settings: {},
|
|
14
|
+
};
|
|
15
|
+
function sectionEl() {
|
|
16
|
+
const el = document.querySelector('[data-section-id="s1"]');
|
|
17
|
+
if (!el)
|
|
18
|
+
throw new Error('section not rendered');
|
|
19
|
+
return el;
|
|
20
|
+
}
|
|
21
|
+
describe('SectionRenderer — review mode', () => {
|
|
22
|
+
it('marks a changed section and names the change in its label', () => {
|
|
23
|
+
render(_jsx(SectionRenderer, { section: SECTION, editable: true, reviewing: true, changed: true }));
|
|
24
|
+
expect(screen.getByText('Hero Banner — changed')).toBeTruthy();
|
|
25
|
+
expect(sectionEl().getAttribute('data-changed')).toBe('true');
|
|
26
|
+
expect(sectionEl().className).toContain('outline-dashed');
|
|
27
|
+
});
|
|
28
|
+
it('leaves an unchanged section unlabelled and unoutlined', () => {
|
|
29
|
+
render(_jsx(SectionRenderer, { section: SECTION, editable: true, reviewing: true, changed: false }));
|
|
30
|
+
expect(screen.queryByText(/— changed/)).toBeNull();
|
|
31
|
+
expect(sectionEl().getAttribute('data-changed')).toBeNull();
|
|
32
|
+
expect(sectionEl().className).not.toContain('outline-dashed');
|
|
33
|
+
});
|
|
34
|
+
it('keeps the changed label even though review mode suppresses editing chrome', () => {
|
|
35
|
+
// The trap the handoff calls out by name: review mode and site-preview
|
|
36
|
+
// mode both drop the cursor, the hover outline and the section label, so
|
|
37
|
+
// it is tempting to share one suppression rule. Doing that hides the one
|
|
38
|
+
// label review mode exists to show.
|
|
39
|
+
render(_jsx(SectionRenderer, { section: SECTION, editable: true, reviewing: true, changed: true, selected: true }));
|
|
40
|
+
expect(sectionEl().getAttribute('data-editable')).toBeNull();
|
|
41
|
+
expect(sectionEl().className).not.toContain('cursor-pointer');
|
|
42
|
+
// The selection label is gone…
|
|
43
|
+
expect(screen.queryByText('Hero Banner')).toBeNull();
|
|
44
|
+
// …and the changed label is not.
|
|
45
|
+
expect(screen.getByText('Hero Banner — changed')).toBeTruthy();
|
|
46
|
+
});
|
|
47
|
+
it('does not select a section while reviewing — that would edit the current page', () => {
|
|
48
|
+
const onSelect = vi.fn();
|
|
49
|
+
render(_jsx(SectionRenderer, { section: SECTION, editable: true, reviewing: true, changed: true, onSelect: onSelect }));
|
|
50
|
+
fireEvent.click(sectionEl());
|
|
51
|
+
expect(onSelect).not.toHaveBeenCalled();
|
|
52
|
+
});
|
|
53
|
+
it('still selects normally when not reviewing', () => {
|
|
54
|
+
const onSelect = vi.fn();
|
|
55
|
+
render(_jsx(SectionRenderer, { section: SECTION, editable: true, onSelect: onSelect }));
|
|
56
|
+
fireEvent.click(sectionEl());
|
|
57
|
+
expect(onSelect).toHaveBeenCalledWith('s1');
|
|
58
|
+
expect(sectionEl().getAttribute('data-editable')).toBe('true');
|
|
59
|
+
});
|
|
60
|
+
it('names the change in the accessible name, not only in colour and a dashed border', () => {
|
|
61
|
+
render(_jsx(SectionRenderer, { section: SECTION, editable: true, reviewing: true, changed: true }));
|
|
62
|
+
expect(sectionEl().getAttribute('aria-label')).toBe('Hero Banner section — changed in this version');
|
|
63
|
+
});
|
|
64
|
+
it('keeps a hidden section muted in a snapshot, as it was when saved', () => {
|
|
65
|
+
render(_jsx(SectionRenderer, { section: { ...SECTION, visible: false }, editable: true, reviewing: true, changed: false }));
|
|
66
|
+
expect(sectionEl().className).toContain('opacity-40');
|
|
67
|
+
expect(screen.getByText('Hidden')).toBeTruthy();
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=canvas-review-mode.render.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-review-mode.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/canvas-review-mode.render.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ const baseProps = {
|
|
|
11
11
|
publishing: false,
|
|
12
12
|
canEdit: true,
|
|
13
13
|
canPublish: true,
|
|
14
|
-
viewport: '
|
|
14
|
+
viewport: 'wide',
|
|
15
15
|
onViewport: vi.fn(),
|
|
16
16
|
onBack: vi.fn(),
|
|
17
17
|
onPreview: vi.fn(),
|
|
@@ -74,4 +74,33 @@ describe('EditorTopBar view-on-site vs view-live', () => {
|
|
|
74
74
|
expect(screen.queryByRole('button', { name: /View (live|draft)/ })).toBeNull();
|
|
75
75
|
});
|
|
76
76
|
});
|
|
77
|
+
describe('EditorTopBar history button', () => {
|
|
78
|
+
it('reports whether history is showing, since it takes over the rail rather than opening a dialog', () => {
|
|
79
|
+
const { unmount } = render(_jsx(EditorTopBar, { ...baseProps, onHistory: vi.fn() }));
|
|
80
|
+
expect(screen.getByRole('button', { name: 'Version history' }).getAttribute('aria-pressed')).toBe('false');
|
|
81
|
+
unmount();
|
|
82
|
+
render(_jsx(EditorTopBar, { ...baseProps, onHistory: vi.fn(), historyOpen: true }));
|
|
83
|
+
const open = screen.getByRole('button', { name: 'Version history' });
|
|
84
|
+
expect(open.getAttribute('aria-pressed')).toBe('true');
|
|
85
|
+
expect(open.getAttribute('title')).toBe('Close version history');
|
|
86
|
+
});
|
|
87
|
+
it('gives every icon-only control a touch target', () => {
|
|
88
|
+
// These buttons are 32px square, which is a fine mouse target and an
|
|
89
|
+
// unusable thumb one. `prenta-touch-target` is what grows them under a
|
|
90
|
+
// coarse pointer — and it is applied per control, so a button written with
|
|
91
|
+
// a conditional className is easy to leave out. Exactly that happened to
|
|
92
|
+
// the history button, whose pressed state made it the odd one out.
|
|
93
|
+
render(_jsx(EditorTopBar, { ...baseProps, onHistory: vi.fn(), onViewOnSite: vi.fn(), onToggleSitePreview: vi.fn() }));
|
|
94
|
+
for (const name of [
|
|
95
|
+
'Page settings',
|
|
96
|
+
'Version history',
|
|
97
|
+
'Preview page',
|
|
98
|
+
'Inline site preview',
|
|
99
|
+
'View draft on site',
|
|
100
|
+
]) {
|
|
101
|
+
const button = screen.getByRole('button', { name });
|
|
102
|
+
expect(button.className, `${name} has no touch target`).toContain('prenta-touch-target');
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
});
|
|
77
106
|
//# sourceMappingURL=editor-top-bar.render.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor-top-bar.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/editor-top-bar.render.test.tsx"],"names":[],"mappings":";AAAA,gCAAgC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAElE,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAA;AAEtE,MAAM,SAAS,GAAG;IAChB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,OAAgB;IACxB,KAAK,EAAE,KAAK;IACZ,SAAS,EAAE,MAAe;IAC1B,UAAU,EAAE,KAAK;IACjB,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"editor-top-bar.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/editor-top-bar.render.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-tab.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/views/page-tab.render.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// @vitest-environment happy-dom
|
|
3
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
4
|
+
import { cleanup, fireEvent, render, screen } from '@testing-library/react';
|
|
5
|
+
import { DEFAULT_DIRECTIVES } from '@prenta/core/seo/robots-directives';
|
|
6
|
+
import { PageTab } from '../../views/page-editor/PageTab.js';
|
|
7
|
+
const page = {
|
|
8
|
+
id: 'p1',
|
|
9
|
+
title: 'About Us',
|
|
10
|
+
slug: 'about',
|
|
11
|
+
path: '/about',
|
|
12
|
+
status: 'PUBLISHED',
|
|
13
|
+
parentPageId: null,
|
|
14
|
+
sections: [],
|
|
15
|
+
seoTitle: '',
|
|
16
|
+
seoDescription: '',
|
|
17
|
+
publishedAt: '2026-05-15T10:00:00.000Z',
|
|
18
|
+
updatedAt: '2026-06-01T09:30:00.000Z',
|
|
19
|
+
scheduledAt: null,
|
|
20
|
+
scheduledUnpublishAt: null,
|
|
21
|
+
authorName: '',
|
|
22
|
+
authorId: '',
|
|
23
|
+
builderOwned: false,
|
|
24
|
+
};
|
|
25
|
+
function renderTab(overrides = {}) {
|
|
26
|
+
return render(_jsx(PageTab, { page: { ...page, ...overrides.page }, canEdit: true, publishedPath: overrides.publishedPath === undefined ? '/about' : overrides.publishedPath, siteUrl: "https://example.com", directives: { ...DEFAULT_DIRECTIVES, ...overrides.directives }, onDirectivesChange: overrides.onDirectivesChange ?? (() => { }), redirectOnPublish: true, onRedirectOnPublishChange: () => { }, onPageChange: overrides.onPageChange ?? (() => { }), onDuplicate: () => { }, onTrash: () => { } }));
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Only Address and Publishing are open by default; the rest are collapsed, and
|
|
30
|
+
* Radix unmounts closed content. Tests that assert on a collapsed group must
|
|
31
|
+
* open it first — which is also the interaction a real editor performs.
|
|
32
|
+
*/
|
|
33
|
+
function openGroup(name) {
|
|
34
|
+
fireEvent.click(screen.getByRole('button', { name }));
|
|
35
|
+
}
|
|
36
|
+
describe('PageTab — address', () => {
|
|
37
|
+
it('says nothing about redirects while the page has not moved', () => {
|
|
38
|
+
renderTab();
|
|
39
|
+
expect(screen.queryByText(/URL CHANGED/)).toBeNull();
|
|
40
|
+
expect(screen.queryByText(/301 redirect/)).toBeNull();
|
|
41
|
+
cleanup();
|
|
42
|
+
});
|
|
43
|
+
it('offers a 301 naming both paths once a live page moves', () => {
|
|
44
|
+
renderTab({ page: { path: '/about-us' } });
|
|
45
|
+
expect(screen.getByText('URL CHANGED')).toBeTruthy();
|
|
46
|
+
expect(screen.getByText(/Create a 301 redirect on publish/)).toBeTruthy();
|
|
47
|
+
expect(screen.getByText('/about → /about-us')).toBeTruthy();
|
|
48
|
+
cleanup();
|
|
49
|
+
});
|
|
50
|
+
it('keeps path in lockstep when the slug was driving it', () => {
|
|
51
|
+
// The displayed URL and the 301 detector both read `path`. Updating only
|
|
52
|
+
// `slug` left a live `/about` → slug `about-us` with no warning and a
|
|
53
|
+
// full URL that still said /about.
|
|
54
|
+
const onPageChange = vi.fn();
|
|
55
|
+
renderTab({ onPageChange });
|
|
56
|
+
fireEvent.change(screen.getByLabelText(/URL slug/i), { target: { value: 'about-us' } });
|
|
57
|
+
expect(onPageChange).toHaveBeenCalledWith({ slug: 'about-us', path: '/about-us' });
|
|
58
|
+
cleanup();
|
|
59
|
+
});
|
|
60
|
+
it('leaves a custom path alone when the slug changes', () => {
|
|
61
|
+
const onPageChange = vi.fn();
|
|
62
|
+
renderTab({ page: { slug: 'about', path: '/team/about' }, onPageChange });
|
|
63
|
+
fireEvent.change(screen.getByLabelText(/URL slug/i), { target: { value: 'about-us' } });
|
|
64
|
+
expect(onPageChange).toHaveBeenCalledWith({ slug: 'about-us' });
|
|
65
|
+
cleanup();
|
|
66
|
+
});
|
|
67
|
+
it('warns without promising a 301 when the user cannot create redirects', () => {
|
|
68
|
+
render(_jsx(PageTab, { page: { ...page, path: '/about-us' }, canEdit: true, publishedPath: "/about", siteUrl: "https://example.com", directives: DEFAULT_DIRECTIVES, onDirectivesChange: () => { }, redirectOnPublish: true, onRedirectOnPublishChange: () => { }, canCreateRedirect: false, onPageChange: () => { }, onDuplicate: () => { }, onTrash: () => { } }));
|
|
69
|
+
expect(screen.getByText('URL CHANGED')).toBeTruthy();
|
|
70
|
+
expect(screen.queryByText(/Create a 301 redirect on publish/)).toBeNull();
|
|
71
|
+
expect(screen.getByText(/Ask an admin to create a 301/)).toBeTruthy();
|
|
72
|
+
cleanup();
|
|
73
|
+
});
|
|
74
|
+
it('stays quiet when a page that was never live changes its slug', () => {
|
|
75
|
+
// Nothing points at the old path. Warning here would train editors to
|
|
76
|
+
// dismiss the warning that matters.
|
|
77
|
+
renderTab({ page: { path: '/about-us', status: 'DRAFT' }, publishedPath: null });
|
|
78
|
+
expect(screen.queryByText(/URL CHANGED/)).toBeNull();
|
|
79
|
+
cleanup();
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
describe('PageTab — search directives', () => {
|
|
83
|
+
it('summarises how many directives are restricted', () => {
|
|
84
|
+
renderTab();
|
|
85
|
+
expect(screen.getByText('OPEN')).toBeTruthy();
|
|
86
|
+
cleanup();
|
|
87
|
+
renderTab({ directives: { index: false, snippet: false } });
|
|
88
|
+
// `noindex` subsumes the snippet token, but both are still restrictions the
|
|
89
|
+
// editor chose, so the count reports two.
|
|
90
|
+
expect(screen.getByText('2 RESTRICTED')).toBeTruthy();
|
|
91
|
+
cleanup();
|
|
92
|
+
});
|
|
93
|
+
it('previews the exact head line, composed by the renderer’s own function', () => {
|
|
94
|
+
renderTab({ directives: { index: false } });
|
|
95
|
+
openGroup(/Search directives/);
|
|
96
|
+
expect(screen.getByText('<meta name="robots" content="noindex" />')).toBeTruthy();
|
|
97
|
+
cleanup();
|
|
98
|
+
renderTab();
|
|
99
|
+
openGroup(/Search directives/);
|
|
100
|
+
// Nothing is emitted when everything is permissive, and the preview says
|
|
101
|
+
// so rather than showing a blank box.
|
|
102
|
+
expect(screen.getByText(/no robots meta/)).toBeTruthy();
|
|
103
|
+
cleanup();
|
|
104
|
+
});
|
|
105
|
+
it('shows each switch’s literal directive token', () => {
|
|
106
|
+
// The failure this prevents is flipping a switch whose consequence you
|
|
107
|
+
// could not name. `noindex` beside it makes the consequence the label.
|
|
108
|
+
renderTab({ directives: { index: false } });
|
|
109
|
+
openGroup(/Search directives/);
|
|
110
|
+
expect(screen.getByText('noindex')).toBeTruthy();
|
|
111
|
+
expect(screen.getByText('follow')).toBeTruthy();
|
|
112
|
+
cleanup();
|
|
113
|
+
});
|
|
114
|
+
it('disables snippet and archive under noindex', () => {
|
|
115
|
+
// They have no effect once the page is out of the index, and an enabled
|
|
116
|
+
// control that changes nothing is a lie about what it does.
|
|
117
|
+
renderTab({ directives: { index: false } });
|
|
118
|
+
openGroup(/Search directives/);
|
|
119
|
+
expect(screen.getByRole('switch', { name: /Allow text snippets/ }).hasAttribute('disabled')).toBe(true);
|
|
120
|
+
expect(screen.getByRole('switch', { name: /Allow cached copies/ }).hasAttribute('disabled')).toBe(true);
|
|
121
|
+
cleanup();
|
|
122
|
+
});
|
|
123
|
+
it('warns that publishing will not make a noindexed page findable', () => {
|
|
124
|
+
renderTab({ directives: { index: false } });
|
|
125
|
+
openGroup(/Search directives/);
|
|
126
|
+
expect(screen.getByText(/hidden from search/)).toBeTruthy();
|
|
127
|
+
cleanup();
|
|
128
|
+
});
|
|
129
|
+
it('reports a toggle as a permission, not a restriction', () => {
|
|
130
|
+
const onDirectivesChange = vi.fn();
|
|
131
|
+
renderTab({ onDirectivesChange });
|
|
132
|
+
openGroup(/Search directives/);
|
|
133
|
+
fireEvent.click(screen.getByRole('switch', { name: /Show in search results/ }));
|
|
134
|
+
expect(onDirectivesChange).toHaveBeenCalledWith(expect.objectContaining({ index: false, follow: true }));
|
|
135
|
+
cleanup();
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
describe('PageTab — danger zone', () => {
|
|
139
|
+
it('asks before trashing, and says when the page is live', () => {
|
|
140
|
+
const onTrash = vi.fn();
|
|
141
|
+
render(_jsx(PageTab, { page: page, canEdit: true, publishedPath: "/about", siteUrl: "https://example.com", directives: DEFAULT_DIRECTIVES, onDirectivesChange: () => { }, redirectOnPublish: true, onRedirectOnPublishChange: () => { }, onPageChange: () => { }, onDuplicate: () => { }, onTrash: onTrash }));
|
|
142
|
+
openGroup(/Danger zone/);
|
|
143
|
+
fireEvent.click(screen.getByRole('button', { name: /Move to trash/ }));
|
|
144
|
+
expect(onTrash).not.toHaveBeenCalled();
|
|
145
|
+
expect(screen.getByText(/It is live, and will stop being served/)).toBeTruthy();
|
|
146
|
+
fireEvent.click(screen.getByRole('button', { name: 'Move to trash' }));
|
|
147
|
+
expect(onTrash).toHaveBeenCalled();
|
|
148
|
+
cleanup();
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
//# sourceMappingURL=page-tab.render.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-tab.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/page-tab.render.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-class-parity.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/views/section-class-parity.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { paddingClass as sitePadding, backgroundClass as siteBackground, isDark as siteIsDark, } from '@prenta/sections-react';
|
|
3
|
+
import { paddingClass as adminPadding, backgroundClass as adminBackground, isDarkBackground as adminIsDark, } from '../../views/page-editor/sections/parts.js';
|
|
4
|
+
import { BACKGROUND_PRESETS, backgroundPreset } from '@prenta/core/page-sections';
|
|
5
|
+
/**
|
|
6
|
+
* The editor canvas wraps each section itself rather than using `<Sections>`,
|
|
7
|
+
* so the admin applies ITS wrapper classes around a body rendered by
|
|
8
|
+
* sections-react. Two implementations, one rendered result.
|
|
9
|
+
*
|
|
10
|
+
* They are duplicated because they have to be: Tailwind generates utilities by
|
|
11
|
+
* scanning source text, and each package's stylesheet scans only its own `src/`
|
|
12
|
+
* tree. A literal shared from a third package is generated by nobody, and the
|
|
13
|
+
* section renders with no background — silently, with correct markup. So
|
|
14
|
+
* `@prenta/core` owns the DECISION (`backgroundPreset`) and each side maps it
|
|
15
|
+
* to its own strings; this file asserts the strings stayed in step.
|
|
16
|
+
*/
|
|
17
|
+
const settings = (over = {}) => over;
|
|
18
|
+
/** One settings object per preset, so coverage follows the preset list. */
|
|
19
|
+
const SETTINGS_FOR = {
|
|
20
|
+
'gradient-purple': settings({ backgroundType: 'gradient', backgroundColor: 'purple' }),
|
|
21
|
+
'solid-purple': settings({ backgroundType: 'solid', backgroundColor: 'purple' }),
|
|
22
|
+
'solid-muted': settings({ backgroundType: 'solid', backgroundColor: 'muted' }),
|
|
23
|
+
plain: settings({ backgroundType: 'none' }),
|
|
24
|
+
};
|
|
25
|
+
describe('section wrapper classes', () => {
|
|
26
|
+
it('pads identically in the canvas and on the site', () => {
|
|
27
|
+
for (const paddingY of ['sm', 'md', 'lg', 'xl', undefined]) {
|
|
28
|
+
const s = settings({ paddingY });
|
|
29
|
+
expect(adminPadding(s), `paddingY: ${paddingY}`).toBe(sitePadding(s));
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
it('pads with container steps, never viewport breakpoints', () => {
|
|
33
|
+
// A viewport step here would reflow the canvas against the editor window
|
|
34
|
+
// and undo the whole point of the container migration.
|
|
35
|
+
const xl = adminPadding(settings({ paddingY: 'xl' }));
|
|
36
|
+
expect(xl).toContain('@pv-');
|
|
37
|
+
expect(xl).not.toMatch(/(^|\s)(sm|md|lg|xl):/);
|
|
38
|
+
});
|
|
39
|
+
it('covers every declared preset', () => {
|
|
40
|
+
// Guards the fixture table itself: add a preset in core and this fails
|
|
41
|
+
// until it has settings here, so the assertions below cannot quietly stop
|
|
42
|
+
// covering it.
|
|
43
|
+
for (const preset of BACKGROUND_PRESETS) {
|
|
44
|
+
const s = SETTINGS_FOR[preset];
|
|
45
|
+
expect(s, `no settings fixture for preset "${preset}"`).toBeDefined();
|
|
46
|
+
expect(backgroundPreset(s), `settings for ${preset}`).toBe(preset);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
it('paints every preset identically in the canvas and on the site', () => {
|
|
50
|
+
// The canvas is a preview of the public page. It previously used admin
|
|
51
|
+
// theme tokens, so in dark mode it showed a hero in `#9D71F0` on dark body
|
|
52
|
+
// sections while the live page rendered violet-600 on white — a page no
|
|
53
|
+
// visitor would ever see.
|
|
54
|
+
for (const preset of BACKGROUND_PRESETS) {
|
|
55
|
+
const s = SETTINGS_FOR[preset];
|
|
56
|
+
expect(adminBackground(s), `background for ${preset}`).toBe(siteBackground(s));
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
it('never paints the canvas with admin theme tokens', () => {
|
|
60
|
+
// The specific regression: theme tokens follow the editor's light/dark
|
|
61
|
+
// preference, and the live site does not.
|
|
62
|
+
for (const preset of BACKGROUND_PRESETS) {
|
|
63
|
+
const cls = adminBackground(SETTINGS_FOR[preset]);
|
|
64
|
+
expect(cls, preset).not.toMatch(/\b(bg-card|bg-brand|bg-muted|text-foreground)\b/);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
it('agrees on which backgrounds are dark', () => {
|
|
68
|
+
for (const preset of BACKGROUND_PRESETS) {
|
|
69
|
+
const s = SETTINGS_FOR[preset];
|
|
70
|
+
expect(adminIsDark(s), preset).toBe(siteIsDark(s));
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
it('falls back to the plain preset for an unrecognised colour', () => {
|
|
74
|
+
// A consumer can put any string in `backgroundColor`. It must land on the
|
|
75
|
+
// default background rather than losing the background rules entirely.
|
|
76
|
+
const odd = settings({ backgroundType: 'solid', backgroundColor: 'chartreuse' });
|
|
77
|
+
expect(backgroundPreset(odd)).toBe('plain');
|
|
78
|
+
expect(adminBackground(odd)).toBe(siteBackground(odd));
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
//# sourceMappingURL=section-class-parity.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-class-parity.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/section-class-parity.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EACL,YAAY,IAAI,WAAW,EAC3B,eAAe,IAAI,cAAc,EACjC,MAAM,IAAI,UAAU,GACrB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,YAAY,IAAI,YAAY,EAC5B,eAAe,IAAI,eAAe,EAClC,gBAAgB,IAAI,WAAW,GAChC,MAAM,2CAA2C,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAGjF;;;;;;;;;;;GAWG;AACH,MAAM,QAAQ,GAAG,CAAC,OAAiC,EAAE,EAAE,EAAE,CAAC,IAAuB,CAAA;AAEjF,2EAA2E;AAC3E,MAAM,YAAY,GAAoC;IACpD,iBAAiB,EAAE,QAAQ,CAAC,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;IACtF,cAAc,EAAE,QAAQ,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;IAChF,aAAa,EAAE,QAAQ,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC;IAC9E,KAAK,EAAE,QAAQ,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;CAC5C,CAAA;AAED,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,KAAK,MAAM,QAAQ,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;YAC3D,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,QAAQ,EAA8B,CAAC,CAAA;YAC5D,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,aAAa,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAU,CAAC,CAAC,CAAA;QAChF,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,yEAAyE;QACzE,uDAAuD;QACvD,MAAM,EAAE,GAAG,YAAY,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAA8B,CAAC,CAAC,CAAA;QACjF,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QAC5B,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,uEAAuE;QACvE,0EAA0E;QAC1E,eAAe;QACf,KAAK,MAAM,MAAM,IAAI,kBAAkB,EAAE,CAAC;YACxC,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;YAC9B,MAAM,CAAC,CAAC,EAAE,mCAAmC,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;YACrE,MAAM,CAAC,gBAAgB,CAAC,CAAE,CAAC,EAAE,gBAAgB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACrE,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,uEAAuE;QACvE,2EAA2E;QAC3E,wEAAwE;QACxE,0BAA0B;QAC1B,KAAK,MAAM,MAAM,IAAI,kBAAkB,EAAE,CAAC;YACxC,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,CAAE,CAAA;YAC/B,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,kBAAkB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAU,CAAC,CAAC,CAAA;QACzF,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,uEAAuE;QACvE,0CAA0C;QAC1C,KAAK,MAAM,MAAM,IAAI,kBAAkB,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,eAAe,CAAC,YAAY,CAAC,MAAM,CAAE,CAAC,CAAA;YAClD,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAA;QACpF,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,KAAK,MAAM,MAAM,IAAI,kBAAkB,EAAE,CAAC;YACxC,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,CAAE,CAAA;YAC/B,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAU,CAAC,CAAC,CAAA;QAC7D,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,0EAA0E;QAC1E,uEAAuE;QACvE,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,CAAC,CAAA;QAChF,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC3C,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,GAAY,CAAC,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sections-panel-design-owned.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/views/sections-panel-design-owned.render.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// @vitest-environment happy-dom
|
|
3
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
4
|
+
import { render, screen } from '@testing-library/react';
|
|
5
|
+
import { SectionsPanel } from '../../views/page-editor/SectionsPanel.js';
|
|
6
|
+
/**
|
|
7
|
+
* Pages and posts are design-owned: the section list comes from the template in
|
|
8
|
+
* code. `SectionsPanel` therefore defaults to read-only, and only the template
|
|
9
|
+
* editor — the surface that authors a template — passes `structural`.
|
|
10
|
+
*
|
|
11
|
+
* The default direction is the point. A future consumer that forgets the flag
|
|
12
|
+
* must get the safe behaviour, not an editor that can silently restructure a
|
|
13
|
+
* design-owned page.
|
|
14
|
+
*/
|
|
15
|
+
function section(over = {}) {
|
|
16
|
+
return {
|
|
17
|
+
id: 's1',
|
|
18
|
+
sectionType: 'hero',
|
|
19
|
+
name: 'Hero Banner',
|
|
20
|
+
visible: true,
|
|
21
|
+
content: {},
|
|
22
|
+
settings: {},
|
|
23
|
+
...over,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function renderPanel(over = {}) {
|
|
27
|
+
return render(_jsx(SectionsPanel, { sections: [section(), section({ id: 's2', name: 'Mission' })], selectedId: null, canEdit: true, onSelect: vi.fn(), onToggleVisibility: vi.fn(), ...over }));
|
|
28
|
+
}
|
|
29
|
+
describe('SectionsPanel — design-owned by default', () => {
|
|
30
|
+
it('offers no add, reorder, duplicate, or delete', () => {
|
|
31
|
+
renderPanel();
|
|
32
|
+
expect(screen.queryByRole('button', { name: /add section/i })).toBeNull();
|
|
33
|
+
expect(screen.queryByRole('button', { name: /drag to reorder/i })).toBeNull();
|
|
34
|
+
expect(screen.queryByRole('button', { name: /more actions/i })).toBeNull();
|
|
35
|
+
});
|
|
36
|
+
it('keeps the visibility toggle — the one structural property an editor owns', () => {
|
|
37
|
+
renderPanel();
|
|
38
|
+
expect(screen.getByRole('button', { name: 'Hide Hero Banner' })).toBeTruthy();
|
|
39
|
+
});
|
|
40
|
+
it('keeps sections selectable for editing', () => {
|
|
41
|
+
const onSelect = vi.fn();
|
|
42
|
+
renderPanel({ onSelect });
|
|
43
|
+
screen.getByText('Hero Banner').click();
|
|
44
|
+
expect(onSelect).toHaveBeenCalledWith('s1');
|
|
45
|
+
});
|
|
46
|
+
it('explains the absence rather than looking broken', () => {
|
|
47
|
+
// Without this the panel reads as a regression — "where did Add Section go"
|
|
48
|
+
// is the first thing a returning editor asks.
|
|
49
|
+
renderPanel();
|
|
50
|
+
expect(screen.getByText(/Layout is design-owned/i)).toBeTruthy();
|
|
51
|
+
expect(screen.getByText(/Hide a section to drop it from the live page/i)).toBeTruthy();
|
|
52
|
+
});
|
|
53
|
+
it('says the template renders nothing rather than inviting a first section', () => {
|
|
54
|
+
renderPanel({ sections: [] });
|
|
55
|
+
expect(screen.getByText(/template renders no sections/i)).toBeTruthy();
|
|
56
|
+
expect(screen.queryByText(/add one below/i)).toBeNull();
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe('SectionsPanel — structural opt-in', () => {
|
|
60
|
+
it('restores every structural affordance when asked', () => {
|
|
61
|
+
renderPanel({
|
|
62
|
+
structural: true,
|
|
63
|
+
onReorder: vi.fn(),
|
|
64
|
+
onDuplicate: vi.fn(),
|
|
65
|
+
onRequestDelete: vi.fn(),
|
|
66
|
+
onAdd: vi.fn(),
|
|
67
|
+
});
|
|
68
|
+
expect(screen.getByRole('button', { name: /add section/i })).toBeTruthy();
|
|
69
|
+
expect(screen.getAllByRole('button', { name: /drag to reorder/i })).toHaveLength(2);
|
|
70
|
+
expect(screen.getAllByRole('button', { name: /more actions/i })).toHaveLength(2);
|
|
71
|
+
expect(screen.queryByText(/Layout is design-owned/i)).toBeNull();
|
|
72
|
+
});
|
|
73
|
+
it('still locks externally-managed sections', () => {
|
|
74
|
+
// `unmanaged` sections are read-only even where structural editing is
|
|
75
|
+
// allowed — they are owned by a system outside the CMS.
|
|
76
|
+
renderPanel({
|
|
77
|
+
structural: true,
|
|
78
|
+
sections: [section({ unmanaged: true })],
|
|
79
|
+
onReorder: vi.fn(),
|
|
80
|
+
onAdd: vi.fn(),
|
|
81
|
+
});
|
|
82
|
+
expect(screen.queryByRole('button', { name: /more actions/i })).toBeNull();
|
|
83
|
+
expect(screen.getByLabelText(/managed outside the editor/i)).toBeTruthy();
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=sections-panel-design-owned.render.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sections-panel-design-owned.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/sections-panel-design-owned.render.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-history-panel.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/views/version-history-panel.render.test.tsx"],"names":[],"mappings":""}
|