@prenta/admin 0.92.0 → 0.93.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 +552 -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__/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/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/editor-top-bar.render.test.js +1 -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/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 +29 -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/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/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 +34 -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 +14 -1
- package/dist/views/page-editor/EditorTopBar.d.ts.map +1 -1
- package/dist/views/page-editor/EditorTopBar.js +8 -17
- 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 +275 -53
- 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/SectionInspector.d.ts.map +1 -1
- package/dist/views/page-editor/SectionInspector.js +63 -19
- 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/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.map +1 -1
- package/dist/views/page-editor/sections/SectionRenderer.js +49 -24
- 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__/styles/canvas-container-queries.test.ts +103 -0
- package/src/__tests__/styles/packaging.test.ts +38 -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/editor-top-bar.render.test.tsx +1 -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/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 +86 -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/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/styles/prenta-tokens.css +120 -42
- package/src/styles/theme.css +130 -0
- package/src/views/page-editor/CanvasMetaLine.tsx +50 -0
- package/src/views/page-editor/EditorCanvas.tsx +109 -50
- package/src/views/page-editor/EditorTopBar.tsx +35 -43
- package/src/views/page-editor/PageSectionEditor.tsx +419 -148
- package/src/views/page-editor/PageTab.tsx +433 -0
- package/src/views/page-editor/SectionInspector.tsx +82 -41
- package/src/views/page-editor/SectionsPanel.tsx +281 -140
- package/src/views/page-editor/SitePreviewFrame.tsx +3 -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 +69 -29
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-section-renderers.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/admin-section-renderers.test.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"admin-section-renderers.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/admin-section-renderers.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -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":"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"}
|
|
@@ -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,18 @@
|
|
|
1
|
+
import { type BreakpointId } from '../lib/breakpoints.js';
|
|
2
|
+
export interface BreakpointPickerProps {
|
|
3
|
+
value: BreakpointId;
|
|
4
|
+
onChange: (id: BreakpointId) => void;
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Preview-breakpoint selector for the editor header.
|
|
9
|
+
*
|
|
10
|
+
* A dropdown rather than a segmented row: six presets with names like "Tablet
|
|
11
|
+
* Landscape" do not fit a header strip, and the grouped menu is what makes the
|
|
12
|
+
* DESKTOP / TABLET / MOBILE structure legible.
|
|
13
|
+
*
|
|
14
|
+
* Radix owns the menu behaviour — outside-click, Escape, roving focus, and
|
|
15
|
+
* `aria-expanded` on the trigger — rather than a hand-rolled popover.
|
|
16
|
+
*/
|
|
17
|
+
export declare function BreakpointPicker({ value, onChange, disabled }: BreakpointPickerProps): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
//# sourceMappingURL=BreakpointPicker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BreakpointPicker.d.ts","sourceRoot":"","sources":["../../src/components/BreakpointPicker.tsx"],"names":[],"mappings":"AAMA,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,uBAAuB,CAAA;AAG9B,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,YAAY,CAAA;IACnB,QAAQ,EAAE,CAAC,EAAE,EAAE,YAAY,KAAK,IAAI,CAAA;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,qBAAqB,2CAmFpF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
|
|
5
|
+
import { Check, ChevronDown } from 'lucide-react';
|
|
6
|
+
import { adminPortalContainer } from '../lib/portal-container.js';
|
|
7
|
+
import { BREAKPOINT_GROUPS, breakpointsInGroup, getBreakpoint, } from '../lib/breakpoints.js';
|
|
8
|
+
import { breakpointIcon } from './breakpoint-icons.js';
|
|
9
|
+
/**
|
|
10
|
+
* Preview-breakpoint selector for the editor header.
|
|
11
|
+
*
|
|
12
|
+
* A dropdown rather than a segmented row: six presets with names like "Tablet
|
|
13
|
+
* Landscape" do not fit a header strip, and the grouped menu is what makes the
|
|
14
|
+
* DESKTOP / TABLET / MOBILE structure legible.
|
|
15
|
+
*
|
|
16
|
+
* Radix owns the menu behaviour — outside-click, Escape, roving focus, and
|
|
17
|
+
* `aria-expanded` on the trigger — rather than a hand-rolled popover.
|
|
18
|
+
*/
|
|
19
|
+
export function BreakpointPicker({ value, onChange, disabled }) {
|
|
20
|
+
const [open, setOpen] = useState(false);
|
|
21
|
+
const active = getBreakpoint(value);
|
|
22
|
+
const ActiveIcon = breakpointIcon(active.icon);
|
|
23
|
+
return (_jsxs(DropdownMenu.Root, { open: open, onOpenChange: setOpen, children: [_jsx(DropdownMenu.Trigger, { asChild: true, children: _jsxs("button", { type: "button", disabled: disabled, "aria-label": `Preview breakpoint: ${active.name}, ${active.width} pixels`, className: `border-border flex h-[34px] items-center gap-1.5 rounded-lg border px-2.5 text-[12.5px] font-medium transition-colors disabled:opacity-50 ${open
|
|
24
|
+
? 'border-brand bg-accent text-accent-foreground'
|
|
25
|
+
: 'bg-card text-foreground hover:bg-accent'}`, children: [_jsx(ActiveIcon, { className: `h-4 w-4 shrink-0 ${open ? '' : 'text-brand'}`, "aria-hidden": true }), _jsx("span", { className: "hidden lg:inline", children: active.name }), _jsx("span", { className: "lg:hidden", children: active.abbr }), _jsx("span", { className: "text-muted-foreground hidden text-[11.5px] tabular-nums xl:inline", children: active.width }), _jsx(ChevronDown, { className: `h-3.5 w-3.5 shrink-0 transition-transform ${open ? 'rotate-180' : ''}`, "aria-hidden": true })] }) }), _jsx(DropdownMenu.Portal, { container: adminPortalContainer(), children: _jsx(DropdownMenu.Content, { align: "end", sideOffset: 6, className: "border-border bg-popover data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:slide-in-from-top-1 z-[120] w-[272px] rounded-[10px] border p-[5px] shadow-[0_12px_34px_rgba(26,24,39,0.17)] duration-[130ms]", children: BREAKPOINT_GROUPS.map((group) => (_jsxs(DropdownMenu.Group, { children: [_jsx(DropdownMenu.Label, { className: "text-muted-foreground px-2.5 pt-2 pb-1 text-[10px] font-bold tracking-[0.6px]", children: group }), breakpointsInGroup(group).map((bp) => {
|
|
26
|
+
const Icon = breakpointIcon(bp.icon);
|
|
27
|
+
const selected = bp.id === value;
|
|
28
|
+
return (_jsxs(DropdownMenu.Item, { onSelect: () => onChange(bp.id), className: `focus:bg-accent flex cursor-pointer items-center gap-2 rounded-[7px] px-2.5 py-[7px] outline-none ${selected ? 'bg-accent' : ''}`, children: [_jsx(Icon, { className: `h-4 w-4 shrink-0 ${selected ? 'text-brand' : 'text-muted-foreground'}`, "aria-hidden": true }), _jsx("span", { className: `flex-1 text-[13px] ${selected ? 'text-brand font-semibold' : 'text-foreground'}`, children: bp.name }), _jsx("span", { className: "text-muted-foreground text-[11.5px] tabular-nums", children: bp.width }), _jsx(Check, { className: `text-brand h-3.5 w-3.5 shrink-0 ${selected ? '' : 'invisible'}`, "aria-label": selected ? 'Selected' : undefined })] }, bp.id));
|
|
29
|
+
})] }, group))) }) })] }));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=BreakpointPicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BreakpointPicker.js","sourceRoot":"","sources":["../../src/components/BreakpointPicker.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One-time tip above the page/post canvas explaining how to edit.
|
|
3
|
+
* Dismiss persists in localStorage (`prenta.canvasEditTip.dismissed`).
|
|
4
|
+
*/
|
|
5
|
+
export declare function CanvasEditTip(): import("react/jsx-runtime").JSX.Element | null;
|
|
6
|
+
//# sourceMappingURL=CanvasEditTip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CanvasEditTip.d.ts","sourceRoot":"","sources":["../../src/components/CanvasEditTip.tsx"],"names":[],"mappings":"AAMA;;;GAGG;AACH,wBAAgB,aAAa,mDAmC5B"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
import { MousePointerClick, X } from 'lucide-react';
|
|
5
|
+
import { dismissCanvasEditTip, isCanvasEditTipDismissed } from '../lib/canvas-edit-chrome.js';
|
|
6
|
+
/**
|
|
7
|
+
* One-time tip above the page/post canvas explaining how to edit.
|
|
8
|
+
* Dismiss persists in localStorage (`prenta.canvasEditTip.dismissed`).
|
|
9
|
+
*/
|
|
10
|
+
export function CanvasEditTip() {
|
|
11
|
+
const [visible, setVisible] = useState(false);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
setVisible(!isCanvasEditTipDismissed());
|
|
14
|
+
}, []);
|
|
15
|
+
if (!visible)
|
|
16
|
+
return null;
|
|
17
|
+
return (_jsxs("div", { role: "note", className: "border-border bg-card text-muted-foreground mx-auto mb-4 flex w-fit max-w-full items-start gap-2 rounded-lg border px-3 py-2 text-xs", children: [_jsx(MousePointerClick, { className: "text-foreground mt-0.5 h-3.5 w-3.5 shrink-0", "aria-hidden": true }), _jsxs("p", { className: "min-w-0 flex-1 leading-[1.5]", children: [_jsx("span", { className: "text-foreground font-medium", children: "Editing tip" }), ' — ', "Hover sections for a light outline, then click to select. Edit copy and images in the inspector. Use ", _jsx("span", { className: "text-foreground font-medium", children: "Site preview" }), " to click text and images in place."] }), _jsx("button", { type: "button", "aria-label": "Dismiss editing tip", onClick: () => {
|
|
18
|
+
dismissCanvasEditTip();
|
|
19
|
+
setVisible(false);
|
|
20
|
+
}, className: "text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:ring-ring -mt-0.5 -mr-0.5 shrink-0 rounded-md p-1 transition-colors focus-visible:ring-2 focus-visible:outline-none", children: _jsx(X, { className: "h-3.5 w-3.5", "aria-hidden": true }) })] }));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=CanvasEditTip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CanvasEditTip.js","sourceRoot":"","sources":["../../src/components/CanvasEditTip.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAA;AAE7F;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAE7C,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,CAAC,wBAAwB,EAAE,CAAC,CAAA;IACzC,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IAEzB,OAAO,CACL,eACE,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,sIAAsI,aAEhJ,KAAC,iBAAiB,IAAC,SAAS,EAAC,6CAA6C,wBAAe,EACzF,aAAG,SAAS,EAAC,8BAA8B,aACzC,eAAM,SAAS,EAAC,6BAA6B,4BAAmB,EAC/D,KAAK,2GAES,eAAM,SAAS,EAAC,6BAA6B,6BAAoB,2CAE9E,EACJ,iBACE,IAAI,EAAC,QAAQ,gBACF,qBAAqB,EAChC,OAAO,EAAE,GAAG,EAAE;oBACZ,oBAAoB,EAAE,CAAA;oBACtB,UAAU,CAAC,KAAK,CAAC,CAAA;gBACnB,CAAC,EACD,SAAS,EAAC,+LAA+L,YAEzM,KAAC,CAAC,IAAC,SAAS,EAAC,aAAa,wBAAe,GAClC,IACL,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** What the rail hands its children so they can render a header. */
|
|
2
|
+
export interface RailState {
|
|
3
|
+
width: number;
|
|
4
|
+
dragging: boolean;
|
|
5
|
+
collapse: () => void;
|
|
6
|
+
}
|
|
7
|
+
export interface EditorRailProps {
|
|
8
|
+
/** Short label for the collapsed strip — normally the active tab's name. */
|
|
9
|
+
collapsedLabel: string;
|
|
10
|
+
children: (state: RailState) => React.ReactNode;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The editor's left rail: resizable, collapsible, and width-persistent.
|
|
14
|
+
*
|
|
15
|
+
* Collapsing UNMOUNTS the rail and swaps in a narrow strip rather than
|
|
16
|
+
* animating its width to zero. A zero-width panel leaves a visible sliver of
|
|
17
|
+
* border and keeps its contents in the accessibility tree, so a screen-reader
|
|
18
|
+
* user lands inside a panel sighted users cannot see.
|
|
19
|
+
*
|
|
20
|
+
* Children are a render prop rather than plain nodes because the panel header
|
|
21
|
+
* needs the live width and drag state — the numbers the rail owns — and
|
|
22
|
+
* threading them through context for one consumer is more machinery than the
|
|
23
|
+
* problem deserves.
|
|
24
|
+
*/
|
|
25
|
+
export declare function EditorRail({ collapsedLabel, children }: EditorRailProps): import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
/**
|
|
27
|
+
* Header strip under the rail's tabs: panel title, the live width while
|
|
28
|
+
* dragging, and the collapse control.
|
|
29
|
+
*/
|
|
30
|
+
export declare function RailHeader({ title, width, dragging, onCollapse, }: {
|
|
31
|
+
title: string;
|
|
32
|
+
width: number;
|
|
33
|
+
dragging: boolean;
|
|
34
|
+
onCollapse: () => void;
|
|
35
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
36
|
+
//# sourceMappingURL=EditorRail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditorRail.d.ts","sourceRoot":"","sources":["../../src/components/EditorRail.tsx"],"names":[],"mappings":"AAcA,oEAAoE;AACpE,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,MAAM,IAAI,CAAA;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,4EAA4E;IAC5E,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,KAAK,CAAC,SAAS,CAAA;CAChD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,eAAe,2CA0IvE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,KAAK,EACL,QAAQ,EACR,UAAU,GACX,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,MAAM,IAAI,CAAA;CACvB,2CAwBA"}
|