@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,51 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// @vitest-environment happy-dom
|
|
3
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
4
|
+
import { fireEvent, render, screen } from '@testing-library/react';
|
|
5
|
+
import { BreakpointPicker } from '../../components/BreakpointPicker.js';
|
|
6
|
+
import { ZoomChip } from '../../components/ZoomChip.js';
|
|
7
|
+
describe('BreakpointPicker', () => {
|
|
8
|
+
it('names the current breakpoint and its width to assistive tech', () => {
|
|
9
|
+
render(_jsx(BreakpointPicker, { value: "tabletL", onChange: vi.fn() }));
|
|
10
|
+
// The visible label collapses to an abbreviation at narrow header widths,
|
|
11
|
+
// so the accessible name has to carry the full fact on its own.
|
|
12
|
+
expect(screen.getByRole('button', { name: /Tablet Landscape, 1024 pixels/i })).toBeTruthy();
|
|
13
|
+
});
|
|
14
|
+
it('renders 4K at 2560, not the physical pixel count', () => {
|
|
15
|
+
render(_jsx(BreakpointPicker, { value: "4k", onChange: vi.fn() }));
|
|
16
|
+
expect(screen.getByRole('button', { name: /2560 pixels/i })).toBeTruthy();
|
|
17
|
+
});
|
|
18
|
+
it('exposes collapsed state on the trigger', () => {
|
|
19
|
+
render(_jsx(BreakpointPicker, { value: "wide", onChange: vi.fn() }));
|
|
20
|
+
expect(screen.getByRole('button').getAttribute('aria-expanded')).toBe('false');
|
|
21
|
+
});
|
|
22
|
+
it('does not open when disabled', () => {
|
|
23
|
+
render(_jsx(BreakpointPicker, { value: "wide", onChange: vi.fn(), disabled: true }));
|
|
24
|
+
const trigger = screen.getByRole('button');
|
|
25
|
+
expect(trigger.hasAttribute('disabled')).toBe(true);
|
|
26
|
+
fireEvent.click(trigger);
|
|
27
|
+
expect(screen.queryByRole('menu')).toBeNull();
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe('ZoomChip', () => {
|
|
31
|
+
it('shows the measured scale, not the mode', () => {
|
|
32
|
+
// "fit" is not a number an editor can act on; 38% explains why a 1920px
|
|
33
|
+
// preview looks small in a narrow column.
|
|
34
|
+
render(_jsx(ZoomChip, { zoom: "fit", scale: 0.38, onChange: vi.fn() }));
|
|
35
|
+
expect(screen.getByRole('button').textContent).toBe('38%');
|
|
36
|
+
});
|
|
37
|
+
it('toggles fit to actual size and back', () => {
|
|
38
|
+
const onChange = vi.fn();
|
|
39
|
+
const { rerender } = render(_jsx(ZoomChip, { zoom: "fit", scale: 0.42, onChange: onChange }));
|
|
40
|
+
fireEvent.click(screen.getByRole('button'));
|
|
41
|
+
expect(onChange).toHaveBeenCalledWith(1);
|
|
42
|
+
rerender(_jsx(ZoomChip, { zoom: 1, scale: 1, onChange: onChange }));
|
|
43
|
+
fireEvent.click(screen.getByRole('button'));
|
|
44
|
+
expect(onChange).toHaveBeenLastCalledWith('fit');
|
|
45
|
+
});
|
|
46
|
+
it('describes what clicking will do', () => {
|
|
47
|
+
render(_jsx(ZoomChip, { zoom: "fit", scale: 0.42, onChange: vi.fn() }));
|
|
48
|
+
expect(screen.getByRole('button', { name: /Switch to actual size/i })).toBeTruthy();
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=breakpoint-controls.render.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breakpoint-controls.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/components/breakpoint-controls.render.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-edit-tip.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/components/canvas-edit-tip.render.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,37 @@
|
|
|
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 { fireEvent, render, screen, waitFor } from '@testing-library/react';
|
|
5
|
+
import { CANVAS_EDIT_TIP_STORAGE_KEY } from '../../lib/canvas-edit-chrome.js';
|
|
6
|
+
// happy-dom localStorage is non-functional in this Node setup — stub a Map.
|
|
7
|
+
const storage = new Map();
|
|
8
|
+
vi.stubGlobal('localStorage', {
|
|
9
|
+
getItem: (key) => storage.get(key) ?? null,
|
|
10
|
+
setItem: (key, value) => void storage.set(key, String(value)),
|
|
11
|
+
removeItem: (key) => void storage.delete(key),
|
|
12
|
+
clear: () => storage.clear(),
|
|
13
|
+
});
|
|
14
|
+
const { CanvasEditTip } = await import('../../components/CanvasEditTip.js');
|
|
15
|
+
describe('CanvasEditTip', () => {
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
storage.clear();
|
|
18
|
+
});
|
|
19
|
+
it('shows editing tip until dismissed', async () => {
|
|
20
|
+
render(_jsx(CanvasEditTip, {}));
|
|
21
|
+
expect(await screen.findByRole('note')).toBeTruthy();
|
|
22
|
+
expect(screen.getByText(/Editing tip/i)).toBeTruthy();
|
|
23
|
+
fireEvent.click(screen.getByRole('button', { name: 'Dismiss editing tip' }));
|
|
24
|
+
await waitFor(() => {
|
|
25
|
+
expect(screen.queryByRole('note')).toBeNull();
|
|
26
|
+
});
|
|
27
|
+
expect(localStorage.getItem(CANVAS_EDIT_TIP_STORAGE_KEY)).toBe('1');
|
|
28
|
+
});
|
|
29
|
+
it('stays hidden when already dismissed', async () => {
|
|
30
|
+
localStorage.setItem(CANVAS_EDIT_TIP_STORAGE_KEY, '1');
|
|
31
|
+
render(_jsx(CanvasEditTip, {}));
|
|
32
|
+
await waitFor(() => {
|
|
33
|
+
expect(screen.queryByRole('note')).toBeNull();
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=canvas-edit-tip.render.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-edit-tip.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/components/canvas-edit-tip.render.test.tsx"],"names":[],"mappings":";AAAA,gCAAgC;AAChC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAC3E,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAA;AAE7E,4EAA4E;AAC5E,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAA;AACzC,EAAE,CAAC,UAAU,CAAC,cAAc,EAAE;IAC5B,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI;IAClD,OAAO,EAAE,CAAC,GAAW,EAAE,KAAa,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7E,UAAU,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;IACrD,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE;CAC7B,CAAC,CAAA;AAEF,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAA;AAE3E,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,KAAK,EAAE,CAAA;IACjB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,CAAC,KAAC,aAAa,KAAG,CAAC,CAAA;QACzB,MAAM,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;QACpD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;QAErD,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAA;QAC5E,MAAM,OAAO,CAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC/C,CAAC,CAAC,CAAA;QACF,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACrE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,YAAY,CAAC,OAAO,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAA;QACtD,MAAM,CAAC,KAAC,aAAa,KAAG,CAAC,CAAA;QACzB,MAAM,OAAO,CAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC/C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor-rail.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/components/editor-rail.render.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// @vitest-environment happy-dom
|
|
3
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
4
|
+
import { fireEvent, render, screen } from '@testing-library/react';
|
|
5
|
+
import { EditorRail, RailHeader } from '../../components/EditorRail.js';
|
|
6
|
+
import { EditorRailTabs } from '../../components/EditorRailTabs.js';
|
|
7
|
+
const storage = new Map();
|
|
8
|
+
vi.stubGlobal('localStorage', {
|
|
9
|
+
getItem: (k) => storage.get(k) ?? null,
|
|
10
|
+
setItem: (k, v) => void storage.set(k, String(v)),
|
|
11
|
+
removeItem: (k) => void storage.delete(k),
|
|
12
|
+
clear: () => storage.clear(),
|
|
13
|
+
});
|
|
14
|
+
function renderRail() {
|
|
15
|
+
return render(_jsx(EditorRail, { collapsedLabel: "Sections", children: ({ width, dragging, collapse }) => (_jsxs(_Fragment, { children: [_jsx(RailHeader, { title: "Page content", width: width, dragging: dragging, onCollapse: collapse }), _jsx("p", { children: "panel body" })] })) }));
|
|
16
|
+
}
|
|
17
|
+
describe('EditorRail', () => {
|
|
18
|
+
it('exposes the resize handle as an operable separator', () => {
|
|
19
|
+
// A bare div with a pointerdown handler is invisible to keyboard and
|
|
20
|
+
// assistive-tech users — the role and value range are what make the rail
|
|
21
|
+
// resizable without a mouse.
|
|
22
|
+
renderRail();
|
|
23
|
+
const handle = screen.getByRole('separator', { name: 'Resize panel' });
|
|
24
|
+
expect(handle.getAttribute('aria-orientation')).toBe('vertical');
|
|
25
|
+
expect(handle.getAttribute('aria-valuemin')).toBe('300');
|
|
26
|
+
expect(handle.getAttribute('aria-valuemax')).toBe('620');
|
|
27
|
+
expect(handle.getAttribute('tabindex')).toBe('0');
|
|
28
|
+
});
|
|
29
|
+
it('resizes with arrow keys and clamps at the range edges', () => {
|
|
30
|
+
renderRail();
|
|
31
|
+
const handle = screen.getByRole('separator', { name: 'Resize panel' });
|
|
32
|
+
fireEvent.keyDown(handle, { key: 'ArrowRight' });
|
|
33
|
+
expect(handle.getAttribute('aria-valuenow')).toBe('376');
|
|
34
|
+
fireEvent.keyDown(handle, { key: 'ArrowLeft', shiftKey: true });
|
|
35
|
+
expect(handle.getAttribute('aria-valuenow')).toBe('328');
|
|
36
|
+
for (let i = 0; i < 10; i++)
|
|
37
|
+
fireEvent.keyDown(handle, { key: 'ArrowLeft', shiftKey: true });
|
|
38
|
+
expect(handle.getAttribute('aria-valuenow')).toBe('300');
|
|
39
|
+
});
|
|
40
|
+
it('resets to the default width on Home', () => {
|
|
41
|
+
renderRail();
|
|
42
|
+
const handle = screen.getByRole('separator', { name: 'Resize panel' });
|
|
43
|
+
fireEvent.keyDown(handle, { key: 'ArrowRight' });
|
|
44
|
+
fireEvent.keyDown(handle, { key: 'Home' });
|
|
45
|
+
expect(handle.getAttribute('aria-valuenow')).toBe('360');
|
|
46
|
+
});
|
|
47
|
+
it('resets to the default width on double-click', () => {
|
|
48
|
+
renderRail();
|
|
49
|
+
const handle = screen.getByRole('separator', { name: 'Resize panel' });
|
|
50
|
+
fireEvent.keyDown(handle, { key: 'ArrowRight' });
|
|
51
|
+
fireEvent.doubleClick(handle);
|
|
52
|
+
expect(handle.getAttribute('aria-valuenow')).toBe('360');
|
|
53
|
+
});
|
|
54
|
+
it('persists the width across mounts', () => {
|
|
55
|
+
const first = renderRail();
|
|
56
|
+
fireEvent.keyDown(screen.getByRole('separator', { name: 'Resize panel' }), {
|
|
57
|
+
key: 'ArrowRight',
|
|
58
|
+
shiftKey: true,
|
|
59
|
+
});
|
|
60
|
+
expect(localStorage.getItem('pb.panelW')).toBe('408');
|
|
61
|
+
first.unmount();
|
|
62
|
+
renderRail();
|
|
63
|
+
expect(screen.getByRole('separator', { name: 'Resize panel' }).getAttribute('aria-valuenow')).toBe('408');
|
|
64
|
+
storage.clear();
|
|
65
|
+
});
|
|
66
|
+
it('unmounts the panel when collapsed instead of leaving a zero-width sliver', () => {
|
|
67
|
+
// A 0-width panel keeps its contents in the accessibility tree, so a
|
|
68
|
+
// screen-reader user lands inside a panel sighted users cannot see.
|
|
69
|
+
renderRail();
|
|
70
|
+
fireEvent.click(screen.getByRole('button', { name: 'Collapse Page content panel' }));
|
|
71
|
+
expect(screen.queryByText('panel body')).toBeNull();
|
|
72
|
+
expect(screen.queryByRole('separator', { name: 'Resize panel' })).toBeNull();
|
|
73
|
+
expect(screen.getByRole('button', { name: 'Expand Sections panel' })).toBeTruthy();
|
|
74
|
+
});
|
|
75
|
+
it('restores the panel from the collapsed strip', () => {
|
|
76
|
+
renderRail();
|
|
77
|
+
fireEvent.click(screen.getByRole('button', { name: 'Collapse Page content panel' }));
|
|
78
|
+
fireEvent.click(screen.getByRole('button', { name: 'Expand Sections panel' }));
|
|
79
|
+
expect(screen.getByText('panel body')).toBeTruthy();
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
const TABS = [
|
|
83
|
+
{ id: 'sections', label: 'Sections', title: 'Page content', count: 4 },
|
|
84
|
+
{ id: 'seo', label: 'SEO & GEO', title: 'Search & AI readiness', score: 72 },
|
|
85
|
+
];
|
|
86
|
+
describe('EditorRailTabs', () => {
|
|
87
|
+
it('marks the active tab and links it to its panel', () => {
|
|
88
|
+
render(_jsx(EditorRailTabs, { tabs: TABS, active: "sections", onChange: vi.fn() }));
|
|
89
|
+
const active = screen.getByRole('tab', { selected: true });
|
|
90
|
+
expect(active.textContent).toContain('Sections');
|
|
91
|
+
expect(active.getAttribute('aria-controls')).toBe('rail-panel-sections');
|
|
92
|
+
});
|
|
93
|
+
it('shows the section count without opening the tab', () => {
|
|
94
|
+
render(_jsx(EditorRailTabs, { tabs: TABS, active: "seo", onChange: vi.fn() }));
|
|
95
|
+
expect(screen.getByRole('tab', { name: /Sections/ }).textContent).toContain('4');
|
|
96
|
+
});
|
|
97
|
+
it('carries the score as text, not colour alone', () => {
|
|
98
|
+
// The band dot is aria-hidden; anyone who cannot distinguish the hues still
|
|
99
|
+
// needs the number.
|
|
100
|
+
render(_jsx(EditorRailTabs, { tabs: TABS, active: "sections", onChange: vi.fn() }));
|
|
101
|
+
expect(screen.getByRole('tab', { name: /score 72 of 100/i })).toBeTruthy();
|
|
102
|
+
});
|
|
103
|
+
it('moves between tabs with arrow keys', () => {
|
|
104
|
+
// Inactive tabs have tabIndex -1, so arrows are the only way to reach them.
|
|
105
|
+
const onChange = vi.fn();
|
|
106
|
+
render(_jsx(EditorRailTabs, { tabs: TABS, active: "sections", onChange: onChange }));
|
|
107
|
+
fireEvent.keyDown(screen.getByRole('tab', { selected: true }), { key: 'ArrowRight' });
|
|
108
|
+
expect(onChange).toHaveBeenCalledWith('seo');
|
|
109
|
+
});
|
|
110
|
+
it('bands the dot on the audit scale, not the content-analysis one', () => {
|
|
111
|
+
// The two disagree between 55 and 59: `gradeFromScore` calls 57 "poor",
|
|
112
|
+
// the audit calls it "fair". The dot summarises the audit's rings, so a
|
|
113
|
+
// page scoring 57 must not read worse on the tab than in the panel.
|
|
114
|
+
render(_jsx(EditorRailTabs, { tabs: [{ id: 'seo', label: 'SEO & GEO', title: 'x', score: 57 }], active: "seo", onChange: vi.fn() }));
|
|
115
|
+
const dot = screen.getByRole('tab').querySelector('span[aria-hidden]');
|
|
116
|
+
expect(dot?.className).toContain('bg-warning');
|
|
117
|
+
expect(dot?.className).not.toContain('bg-destructive');
|
|
118
|
+
});
|
|
119
|
+
it('shows no dot at all until a score is known', () => {
|
|
120
|
+
// An absent audit must not borrow a number from another scorer — no dot
|
|
121
|
+
// beats a dot computed by a different model with different bands.
|
|
122
|
+
render(_jsx(EditorRailTabs, { tabs: [{ id: 'seo', label: 'SEO & GEO', title: 'x' }], active: "seo", onChange: vi.fn() }));
|
|
123
|
+
expect(screen.getByRole('tab').querySelector('span[aria-hidden]')).toBeNull();
|
|
124
|
+
});
|
|
125
|
+
it('reads a deliberately unrated page as not rated, never as a low score', () => {
|
|
126
|
+
render(_jsx(EditorRailTabs, { tabs: [{ id: 'seo', label: 'SEO & GEO', title: 'x', score: null }], active: "seo", onChange: vi.fn() }));
|
|
127
|
+
expect(screen.getByRole('tab', { name: /not rated/i })).toBeTruthy();
|
|
128
|
+
const dot = screen.getByRole('tab').querySelector('span[aria-hidden]');
|
|
129
|
+
expect(dot?.className).not.toContain('bg-destructive');
|
|
130
|
+
});
|
|
131
|
+
it('wraps around at the ends', () => {
|
|
132
|
+
const onChange = vi.fn();
|
|
133
|
+
render(_jsx(EditorRailTabs, { tabs: TABS, active: "sections", onChange: onChange }));
|
|
134
|
+
fireEvent.keyDown(screen.getByRole('tab', { selected: true }), { key: 'ArrowLeft' });
|
|
135
|
+
expect(onChange).toHaveBeenCalledWith('seo');
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
//# sourceMappingURL=editor-rail.render.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor-rail.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/components/editor-rail.render.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-block.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/components/media-block.render.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// @vitest-environment happy-dom
|
|
3
|
+
import { describe, expect, it, vi, afterEach } from 'vitest';
|
|
4
|
+
import { cleanup, fireEvent, render, screen } from '@testing-library/react';
|
|
5
|
+
const LIBRARY = {
|
|
6
|
+
items: [
|
|
7
|
+
{
|
|
8
|
+
id: 'm1',
|
|
9
|
+
filename: 'team-offsite-2026.jpg',
|
|
10
|
+
storageKey: 'k1',
|
|
11
|
+
url: '/media/team-offsite-2026.jpg',
|
|
12
|
+
mimeType: 'image/jpeg',
|
|
13
|
+
width: 2400,
|
|
14
|
+
height: 1600,
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
id: 'm2',
|
|
18
|
+
filename: 'notes.pdf',
|
|
19
|
+
storageKey: 'k2',
|
|
20
|
+
url: '/media/notes.pdf',
|
|
21
|
+
mimeType: 'application/pdf',
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* `useApiData` is mocked rather than `fetch`: the hook layers caching, retries
|
|
27
|
+
* and abort handling on top, none of which this component owns, and driving it
|
|
28
|
+
* through a fake network makes the test about the hook instead of the block.
|
|
29
|
+
*/
|
|
30
|
+
let requested = null;
|
|
31
|
+
vi.mock('../../lib/useApiData.js', () => ({
|
|
32
|
+
useApiData: (endpoint) => {
|
|
33
|
+
requested = endpoint;
|
|
34
|
+
return { data: endpoint ? LIBRARY : null, loading: false, error: null, refetch: vi.fn() };
|
|
35
|
+
},
|
|
36
|
+
}));
|
|
37
|
+
const { MediaBlock } = await import('../../components/MediaBlock.js');
|
|
38
|
+
afterEach(() => {
|
|
39
|
+
cleanup();
|
|
40
|
+
requested = null;
|
|
41
|
+
});
|
|
42
|
+
describe('MediaBlock', () => {
|
|
43
|
+
it('shows the toolbar without hovering, in both states', () => {
|
|
44
|
+
// Replace and Remove are the two things an editor comes here to do. Behind
|
|
45
|
+
// a hover they are undiscoverable on touch and invisible when scanning.
|
|
46
|
+
render(_jsx(MediaBlock, { value: "", onChange: () => { } }));
|
|
47
|
+
expect(screen.getByRole('button', { name: 'Choose' })).toBeTruthy();
|
|
48
|
+
cleanup();
|
|
49
|
+
render(_jsx(MediaBlock, { value: "/media/hero.jpg", onChange: () => { }, label: "Hero image" }));
|
|
50
|
+
expect(screen.getByRole('button', { name: 'Replace' })).toBeTruthy();
|
|
51
|
+
expect(screen.getByRole('button', { name: 'Remove hero image' })).toBeTruthy();
|
|
52
|
+
});
|
|
53
|
+
it('names the file and its format rather than the raw URL', () => {
|
|
54
|
+
render(_jsx(MediaBlock, { value: "https://cdn.example.com/a/team-offsite.jpg?sig=abc", onChange: () => { } }));
|
|
55
|
+
expect(screen.getByText('team-offsite.jpg')).toBeTruthy();
|
|
56
|
+
expect(screen.getByText('JPG')).toBeTruthy();
|
|
57
|
+
// The signing token is noise in a narrow toolbar and never what is being read.
|
|
58
|
+
expect(screen.queryByText(/sig=abc/)).toBeNull();
|
|
59
|
+
});
|
|
60
|
+
it('opens the picker inside the shell, not as a dialog', () => {
|
|
61
|
+
// Choosing an image is a comparison against the slot it goes into. A modal
|
|
62
|
+
// covering the slot removes the only context that matters.
|
|
63
|
+
render(_jsx(MediaBlock, { value: "", onChange: () => { } }));
|
|
64
|
+
fireEvent.click(screen.getByRole('button', { name: 'Choose' }));
|
|
65
|
+
expect(screen.getByText('team-offsite-2026.jpg')).toBeTruthy();
|
|
66
|
+
expect(screen.queryByRole('dialog')).toBeNull();
|
|
67
|
+
});
|
|
68
|
+
it('reports each asset’s real dimensions and ratio', () => {
|
|
69
|
+
render(_jsx(MediaBlock, { value: "", onChange: () => { } }));
|
|
70
|
+
fireEvent.click(screen.getByRole('button', { name: 'Choose' }));
|
|
71
|
+
// The frame shows the template's crop, so the asset's own shape has to be
|
|
72
|
+
// stated somewhere or an editor cannot tell what will be cropped.
|
|
73
|
+
expect(screen.getByText('2400 × 1600 · 3:2')).toBeTruthy();
|
|
74
|
+
});
|
|
75
|
+
it('offers only images', () => {
|
|
76
|
+
render(_jsx(MediaBlock, { value: "", onChange: () => { } }));
|
|
77
|
+
fireEvent.click(screen.getByRole('button', { name: 'Choose' }));
|
|
78
|
+
expect(screen.getByText('team-offsite-2026.jpg')).toBeTruthy();
|
|
79
|
+
expect(screen.queryByText('notes.pdf')).toBeNull();
|
|
80
|
+
});
|
|
81
|
+
it('returns the chosen asset with its dimensions', () => {
|
|
82
|
+
const onChange = vi.fn();
|
|
83
|
+
render(_jsx(MediaBlock, { value: "", onChange: onChange }));
|
|
84
|
+
fireEvent.click(screen.getByRole('button', { name: 'Choose' }));
|
|
85
|
+
fireEvent.click(screen.getByText('team-offsite-2026.jpg'));
|
|
86
|
+
expect(onChange).toHaveBeenCalledWith('/media/team-offsite-2026.jpg', expect.objectContaining({ width: 2400, height: 1600 }));
|
|
87
|
+
});
|
|
88
|
+
it('clears the slot with an empty url', () => {
|
|
89
|
+
const onChange = vi.fn();
|
|
90
|
+
render(_jsx(MediaBlock, { value: "/media/hero.jpg", onChange: onChange }));
|
|
91
|
+
fireEvent.click(screen.getByRole('button', { name: 'Remove image' }));
|
|
92
|
+
expect(onChange).toHaveBeenCalledWith('');
|
|
93
|
+
});
|
|
94
|
+
it('disables every control when the editor cannot edit', () => {
|
|
95
|
+
render(_jsx(MediaBlock, { value: "/media/hero.jpg", onChange: () => { }, disabled: true }));
|
|
96
|
+
expect(screen.getByRole('button', { name: 'Replace' }).hasAttribute('disabled')).toBe(true);
|
|
97
|
+
expect(screen.getByRole('button', { name: 'Remove image' }).hasAttribute('disabled')).toBe(true);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
describe('MediaBlock — library requests', () => {
|
|
101
|
+
it('does not fetch the library until the picker is opened', () => {
|
|
102
|
+
render(_jsx(MediaBlock, { value: "/media/hero.jpg", onChange: () => { } }));
|
|
103
|
+
expect(requested).toBeNull();
|
|
104
|
+
fireEvent.click(screen.getByRole('button', { name: 'Replace' }));
|
|
105
|
+
expect(requested).toContain('/media');
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
//# sourceMappingURL=media-block.render.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-block.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/components/media-block.render.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-audit-panel.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/components/page-audit-panel.render.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// @vitest-environment happy-dom
|
|
3
|
+
import { describe, expect, it } from 'vitest';
|
|
4
|
+
import { render, screen } from '@testing-library/react';
|
|
5
|
+
import { auditPage } from '@prenta/core/seo/page-audit';
|
|
6
|
+
import { PageAuditPanel } from '../../components/seo/PageAuditPanel.js';
|
|
7
|
+
const blank = {
|
|
8
|
+
sections: [],
|
|
9
|
+
seo: {
|
|
10
|
+
title: '',
|
|
11
|
+
description: '',
|
|
12
|
+
slug: '',
|
|
13
|
+
keyword: '',
|
|
14
|
+
schema: '',
|
|
15
|
+
ogImage: null,
|
|
16
|
+
robots: { index: true, snippet: true },
|
|
17
|
+
},
|
|
18
|
+
llmsTxt: false,
|
|
19
|
+
brand: 'Prenta',
|
|
20
|
+
author: null,
|
|
21
|
+
};
|
|
22
|
+
describe('PageAuditPanel', () => {
|
|
23
|
+
it('states both scores in text, not colour alone', () => {
|
|
24
|
+
render(_jsx(PageAuditPanel, { audit: auditPage(blank) }));
|
|
25
|
+
expect(screen.getByRole('img', { name: /SEO score: 0 of 100/i })).toBeTruthy();
|
|
26
|
+
expect(screen.getByRole('img', { name: /GEO score: 0 of 100/i })).toBeTruthy();
|
|
27
|
+
});
|
|
28
|
+
it('names the denominator so a moving score is explainable', () => {
|
|
29
|
+
// The score changes when the set of applicable checks changes. Showing
|
|
30
|
+
// only the number is what made the old scorer feel arbitrary.
|
|
31
|
+
render(_jsx(PageAuditPanel, { audit: auditPage(blank) }));
|
|
32
|
+
expect(screen.getAllByText(/of \d+ apply/).length).toBe(2);
|
|
33
|
+
});
|
|
34
|
+
it('reads a gated group as not rated rather than zero', () => {
|
|
35
|
+
const audit = auditPage({
|
|
36
|
+
...blank,
|
|
37
|
+
seo: { ...blank.seo, robots: { index: false, snippet: true } },
|
|
38
|
+
});
|
|
39
|
+
render(_jsx(PageAuditPanel, { audit: audit }));
|
|
40
|
+
expect(screen.getByRole('img', { name: /SEO: not rated/i })).toBeTruthy();
|
|
41
|
+
expect(screen.getByText('not rated')).toBeTruthy();
|
|
42
|
+
});
|
|
43
|
+
it('gives every check an outcome in text for screen readers', () => {
|
|
44
|
+
render(_jsx(PageAuditPanel, { audit: auditPage(blank) }));
|
|
45
|
+
// The status square is aria-hidden, so the outcome has to live in the row.
|
|
46
|
+
expect(screen.getAllByText(/needs attention/).length).toBeGreaterThan(0);
|
|
47
|
+
expect(screen.getAllByText(/not applicable/).length).toBeGreaterThan(0);
|
|
48
|
+
});
|
|
49
|
+
it('explains a not-applicable check instead of just greying it', () => {
|
|
50
|
+
render(_jsx(PageAuditPanel, { audit: auditPage(blank) }));
|
|
51
|
+
// All three placement checks explain themselves — none is silently greyed.
|
|
52
|
+
expect(screen.getAllByText(/Set a focus keyword to enable this check/i)).toHaveLength(3);
|
|
53
|
+
});
|
|
54
|
+
it('tells the editor what to do about a failing check', () => {
|
|
55
|
+
render(_jsx(PageAuditPanel, { audit: auditPage(blank) }));
|
|
56
|
+
expect(screen.getByText(/Aim for 30–60 characters/i)).toBeTruthy();
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=page-audit-panel.render.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-audit-panel.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/components/page-audit-panel.render.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflow-meter.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/components/reflow-meter.render.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,94 @@
|
|
|
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 { ReflowMeter } from '../../components/ReflowMeter.js';
|
|
6
|
+
import { BREAKPOINTS } from '../../lib/breakpoints.js';
|
|
7
|
+
function rows(overrides = {}) {
|
|
8
|
+
return BREAKPOINTS.map((bp) => {
|
|
9
|
+
const o = overrides[bp.id] ?? {};
|
|
10
|
+
const lines = o.lines ?? 2;
|
|
11
|
+
const was = o.was ?? 2;
|
|
12
|
+
return { id: bp.id, lines, was, diff: lines - was, state: o.state ?? 'same' };
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
function guard(partial = {}) {
|
|
16
|
+
const r = partial.rows ?? rows();
|
|
17
|
+
return {
|
|
18
|
+
rows: r,
|
|
19
|
+
grown: partial.grown ?? r.filter((x) => x.diff > 0),
|
|
20
|
+
worst: partial.worst ?? null,
|
|
21
|
+
delta: partial.delta ?? 0,
|
|
22
|
+
...partial,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
describe('ReflowMeter', () => {
|
|
26
|
+
it('reports the line count for the breakpoint being viewed, not the worst one', () => {
|
|
27
|
+
// "lines here" has to mean the canvas the editor is actually looking at.
|
|
28
|
+
// Showing the worst breakpoint's count under a canvas rendering a different
|
|
29
|
+
// one makes the editor mistrust both numbers.
|
|
30
|
+
const { container } = render(_jsx(ReflowMeter, { guard: guard({ rows: rows({ mobile: { lines: 5 }, laptop: { lines: 2 } }) }), length: 64, device: "laptop", onProof: () => { } }));
|
|
31
|
+
const readout = container.querySelector('span').textContent.replace(/\s+/g, ' ');
|
|
32
|
+
expect(readout).toContain('2 lines here');
|
|
33
|
+
expect(readout).not.toContain('5 lines here');
|
|
34
|
+
cleanup();
|
|
35
|
+
});
|
|
36
|
+
it('states the character delta with its direction', () => {
|
|
37
|
+
render(_jsx(ReflowMeter, { guard: guard({ delta: 12 }), length: 80, device: "wide", onProof: () => { } }));
|
|
38
|
+
expect(screen.getByText('(+12)')).toBeTruthy();
|
|
39
|
+
cleanup();
|
|
40
|
+
render(_jsx(ReflowMeter, { guard: guard({ delta: -9 }), length: 40, device: "wide", onProof: () => { } }));
|
|
41
|
+
expect(screen.getByText('(-9)')).toBeTruthy();
|
|
42
|
+
cleanup();
|
|
43
|
+
});
|
|
44
|
+
it('names the line count and its published value on every dot', () => {
|
|
45
|
+
// Colour alone must not carry the finding. Each dot's accessible name says
|
|
46
|
+
// what it measured and what it was, so the whole readout is reachable
|
|
47
|
+
// without seeing the tones.
|
|
48
|
+
render(_jsx(ReflowMeter, { guard: guard({
|
|
49
|
+
rows: rows({ mobile: { lines: 4, was: 2, state: 'grew-badly' } }),
|
|
50
|
+
worst: 'mobile',
|
|
51
|
+
}), length: 64, device: "wide", onProof: () => { } }));
|
|
52
|
+
const dot = screen.getByRole('button', { name: /^Mobile: 4 lines/ });
|
|
53
|
+
expect(dot.textContent).toContain('was 2 when published');
|
|
54
|
+
// The dot and the alert's proof button are distinguishable by name — two
|
|
55
|
+
// controls reading "Proof on Mobile" in one region are the same control to
|
|
56
|
+
// anyone navigating by voice or screen reader.
|
|
57
|
+
expect(screen.getByRole('button', { name: 'Proof on Mobile' })).not.toBe(dot);
|
|
58
|
+
cleanup();
|
|
59
|
+
});
|
|
60
|
+
it('takes the canvas to the breakpoint a dot names', () => {
|
|
61
|
+
const onProof = vi.fn();
|
|
62
|
+
render(_jsx(ReflowMeter, { guard: guard({ rows: rows({ mobile: { lines: 4, was: 2, state: 'grew-badly' } }) }), length: 64, device: "wide", onProof: onProof }));
|
|
63
|
+
fireEvent.click(screen.getByRole('button', { name: /^Mobile: 4 lines/ }));
|
|
64
|
+
expect(onProof).toHaveBeenCalledWith('mobile');
|
|
65
|
+
cleanup();
|
|
66
|
+
});
|
|
67
|
+
it('stays silent when nothing grew', () => {
|
|
68
|
+
// The alert is the interrupting element. It must appear only when wrapping
|
|
69
|
+
// actually changed, or editors learn to scroll past it.
|
|
70
|
+
render(_jsx(ReflowMeter, { guard: guard(), length: 40, device: "wide", onProof: () => { } }));
|
|
71
|
+
expect(screen.queryByText(/Wrapping changed/)).toBeNull();
|
|
72
|
+
cleanup();
|
|
73
|
+
});
|
|
74
|
+
it('says "every breakpoint" rather than listing all six', () => {
|
|
75
|
+
const all = rows(Object.fromEntries(BREAKPOINTS.map((b) => [b.id, { lines: 3, was: 2, state: 'grew' }])));
|
|
76
|
+
render(_jsx(ReflowMeter, { guard: guard({ rows: all, worst: 'mobile' }), length: 90, device: "wide", onProof: () => { } }));
|
|
77
|
+
expect(screen.getByText('every breakpoint')).toBeTruthy();
|
|
78
|
+
cleanup();
|
|
79
|
+
});
|
|
80
|
+
it('names the breakpoints while the list is short enough to read', () => {
|
|
81
|
+
render(_jsx(ReflowMeter, { guard: guard({
|
|
82
|
+
rows: rows({
|
|
83
|
+
mobile: { lines: 4, was: 2, state: 'grew-badly' },
|
|
84
|
+
tabletP: { lines: 3, was: 2, state: 'grew' },
|
|
85
|
+
}),
|
|
86
|
+
worst: 'mobile',
|
|
87
|
+
}), length: 90, device: "wide", onProof: () => { } }));
|
|
88
|
+
expect(screen.getByText('Tablet Portrait, Mobile')).toBeTruthy();
|
|
89
|
+
// The proof button names the one worth looking at, not the list.
|
|
90
|
+
expect(screen.getByRole('button', { name: 'Proof on Mobile' })).toBeTruthy();
|
|
91
|
+
cleanup();
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
//# sourceMappingURL=reflow-meter.render.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflow-meter.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/components/reflow-meter.render.test.tsx"],"names":[],"mappings":"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"}
|