@prenta/admin 0.98.0 → 0.98.1
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 +6 -0
- package/dist/__tests__/components/seo-score-bands.test.js +0 -7
- package/dist/__tests__/components/seo-score-bands.test.js.map +1 -1
- package/dist/__tests__/lib/page-audit-input.test.js +77 -1
- package/dist/__tests__/lib/page-audit-input.test.js.map +1 -1
- package/dist/__tests__/views/page-builder-seo-panel.render.test.d.ts +2 -0
- package/dist/__tests__/views/page-builder-seo-panel.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/page-builder-seo-panel.render.test.js +65 -0
- package/dist/__tests__/views/page-builder-seo-panel.render.test.js.map +1 -0
- package/dist/lib/page-audit-input.d.ts +14 -1
- package/dist/lib/page-audit-input.d.ts.map +1 -1
- package/dist/lib/page-audit-input.js +19 -0
- package/dist/lib/page-audit-input.js.map +1 -1
- package/dist/prenta-admin.css +1 -1
- package/dist/views/page-builder/ContextPanel.d.ts.map +1 -1
- package/dist/views/page-builder/ContextPanel.js +1 -1
- package/dist/views/page-builder/ContextPanel.js.map +1 -1
- package/dist/views/page-builder/SEOPanel.d.ts +1 -2
- package/dist/views/page-builder/SEOPanel.d.ts.map +1 -1
- package/dist/views/page-builder/SEOPanel.js +10 -75
- package/dist/views/page-builder/SEOPanel.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/components/seo-score-bands.test.ts +0 -7
- package/src/__tests__/lib/page-audit-input.test.ts +91 -1
- package/src/__tests__/views/page-builder-seo-panel.render.test.tsx +77 -0
- package/src/lib/page-audit-input.ts +36 -1
- package/src/views/page-builder/ContextPanel.tsx +0 -1
- package/src/views/page-builder/SEOPanel.tsx +40 -282
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextPanel.js","sourceRoot":"","sources":["../../../src/views/page-builder/ContextPanel.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ContextPanel.js","sourceRoot":"","sources":["../../../src/views/page-builder/ContextPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,6 @@ export interface BuilderSEOPanelProps {
|
|
|
4
4
|
tree: PageNode;
|
|
5
5
|
pageSettings: PageSettings;
|
|
6
6
|
onPageSettingsChange: (settings: Partial<PageSettings>) => void;
|
|
7
|
-
selectedNodeId: string | null;
|
|
8
7
|
}
|
|
9
|
-
export declare function BuilderSEOPanel({ tree, pageSettings, onPageSettingsChange,
|
|
8
|
+
export declare function BuilderSEOPanel({ tree, pageSettings, onPageSettingsChange, }: BuilderSEOPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
10
9
|
//# sourceMappingURL=SEOPanel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SEOPanel.d.ts","sourceRoot":"","sources":["../../../src/views/page-builder/SEOPanel.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SEOPanel.d.ts","sourceRoot":"","sources":["../../../src/views/page-builder/SEOPanel.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAK5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAElE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,QAAQ,CAAA;IACd,YAAY,EAAE,YAAY,CAAA;IAC1B,oBAAoB,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,CAAA;CAChE;AAkJD,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,YAAY,EACZ,oBAAoB,GACrB,EAAE,oBAAoB,2CAyDtB"}
|
|
@@ -1,77 +1,17 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
return 'text-success';
|
|
9
|
-
if (score >= 40)
|
|
10
|
-
return 'text-warning';
|
|
11
|
-
return 'text-destructive';
|
|
12
|
-
}
|
|
13
|
-
function getRingStrokeColor(score) {
|
|
14
|
-
if (score >= 70)
|
|
15
|
-
return 'rgb(34, 197, 94)';
|
|
16
|
-
if (score >= 40)
|
|
17
|
-
return 'rgb(245, 158, 11)';
|
|
18
|
-
return 'rgb(239, 68, 68)';
|
|
19
|
-
}
|
|
20
|
-
function getScoreLabel(score) {
|
|
21
|
-
if (score >= 80)
|
|
22
|
-
return 'Excellent';
|
|
23
|
-
if (score >= 70)
|
|
24
|
-
return 'Good';
|
|
25
|
-
if (score >= 50)
|
|
26
|
-
return 'Needs Work';
|
|
27
|
-
return 'Poor';
|
|
28
|
-
}
|
|
29
|
-
function StatusIcon({ status }) {
|
|
30
|
-
switch (status) {
|
|
31
|
-
case 'good':
|
|
32
|
-
return _jsx(CheckCircle2, { size: 14, className: "text-success shrink-0" });
|
|
33
|
-
case 'warning':
|
|
34
|
-
return _jsx(AlertCircle, { size: 14, className: "text-warning shrink-0" });
|
|
35
|
-
case 'error':
|
|
36
|
-
return _jsx(XCircle, { size: 14, className: "text-destructive shrink-0" });
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
function ScoreRing({ score }) {
|
|
40
|
-
const radius = 32;
|
|
41
|
-
const strokeWidth = 6;
|
|
42
|
-
const circumference = 2 * Math.PI * radius;
|
|
43
|
-
const progress = Math.min(score, 100) / 100;
|
|
44
|
-
const dashOffset = circumference * (1 - progress);
|
|
45
|
-
const size = (radius + strokeWidth) * 2;
|
|
46
|
-
return (_jsxs("div", { className: "relative", children: [_jsxs("svg", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, className: "-rotate-90", children: [_jsx("circle", { cx: size / 2, cy: size / 2, r: radius, fill: "none", stroke: "var(--border)", strokeWidth: strokeWidth }), _jsx("circle", { cx: size / 2, cy: size / 2, r: radius, fill: "none", stroke: getRingStrokeColor(score), strokeWidth: strokeWidth, strokeDasharray: circumference, strokeDashoffset: dashOffset, strokeLinecap: "round", className: "transition-all duration-700 ease-out" })] }), _jsx("div", { className: "absolute inset-0 flex items-center justify-center", children: _jsx("span", { className: `text-lg font-medium ${getScoreColor(score)}`, children: score }) })] }));
|
|
47
|
-
}
|
|
48
|
-
function ScoreSummary({ checks }) {
|
|
49
|
-
const passed = checks.filter((c) => c.status === 'good').length;
|
|
50
|
-
const warnings = checks.filter((c) => c.status === 'warning').length;
|
|
51
|
-
const errors = checks.filter((c) => c.status === 'error').length;
|
|
52
|
-
return (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(CheckCircle2, { size: 12, className: "text-success" }), _jsxs("span", { className: "text-muted-foreground text-xs", children: [passed, " passed"] })] }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(AlertCircle, { size: 12, className: "text-warning" }), _jsxs("span", { className: "text-muted-foreground text-xs", children: [warnings, " warnings"] })] }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(XCircle, { size: 12, className: "text-destructive" }), _jsxs("span", { className: "text-muted-foreground text-xs", children: [errors, " issues"] })] })] }));
|
|
53
|
-
}
|
|
3
|
+
import { useMemo, useState } from 'react';
|
|
4
|
+
import { auditPage } from '@prenta/core/seo/page-audit';
|
|
5
|
+
import { ChevronDown, ChevronUp, Eye, FileText, Globe, Search } from 'lucide-react';
|
|
6
|
+
import { PageAuditPanel } from '../../components/seo/PageAuditPanel.js';
|
|
7
|
+
import { buildPageAuditInputFromBuilder } from '../../lib/page-audit-input.js';
|
|
54
8
|
function CollapsibleSection({ title, icon: Icon, expanded, onToggle, children, }) {
|
|
55
9
|
return (_jsxs("div", { className: "border-border border-b last:border-b-0", children: [_jsxs("button", { type: "button", className: "hover:bg-muted/50 flex w-full items-center justify-between px-4 py-3 text-left transition-colors", onClick: onToggle, "aria-expanded": expanded, children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Icon, { size: 14, className: "text-muted-foreground" }), _jsx("span", { className: "text-foreground text-xs font-medium", children: title })] }), expanded ? (_jsx(ChevronUp, { size: 14, className: "text-muted-foreground" })) : (_jsx(ChevronDown, { size: 14, className: "text-muted-foreground" }))] }), expanded && _jsx("div", { className: "px-4 pb-4", children: children })] }));
|
|
56
10
|
}
|
|
57
|
-
function SEOChecksList({ checks }) {
|
|
58
|
-
return (_jsx("div", { className: "flex flex-col gap-2", children: checks.map((check) => (_jsxs("div", { className: "flex items-start gap-2", children: [_jsx(StatusIcon, { status: check.status }), _jsxs("div", { className: "flex flex-col", children: [_jsx("span", { className: "text-foreground text-xs font-medium", children: check.label }), _jsx("span", { className: "text-muted-foreground text-xs", children: check.detail })] })] }, check.id))) }));
|
|
59
|
-
}
|
|
60
|
-
function ReadabilityGrid({ readability }) {
|
|
61
|
-
const fleschLabel = readability.fleschScore >= 60
|
|
62
|
-
? 'Easy'
|
|
63
|
-
: readability.fleschScore >= 30
|
|
64
|
-
? 'Moderate'
|
|
65
|
-
: 'Difficult';
|
|
66
|
-
return (_jsxs("div", { className: "grid grid-cols-2 gap-3", children: [_jsxs("div", { className: "bg-muted/50 flex flex-col gap-1 rounded-md p-3", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(BarChart3, { size: 12, className: "text-muted-foreground" }), _jsx("span", { className: "text-muted-foreground text-xs", children: "Flesch Score" })] }), _jsx("span", { className: `text-sm font-medium ${getScoreColor(readability.fleschScore)}`, children: readability.fleschScore }), _jsx("span", { className: "text-muted-foreground text-xs", children: fleschLabel })] }), _jsxs("div", { className: "bg-muted/50 flex flex-col gap-1 rounded-md p-3", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(Type, { size: 12, className: "text-muted-foreground" }), _jsx("span", { className: "text-muted-foreground text-xs", children: "Word Count" })] }), _jsx("span", { className: "text-foreground text-sm font-medium", children: readability.wordCount }), _jsx("span", { className: "text-muted-foreground text-xs", children: readability.wordCount >= 300 ? 'Good length' : 'Short' })] }), _jsxs("div", { className: "bg-muted/50 flex flex-col gap-1 rounded-md p-3", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(FileText, { size: 12, className: "text-muted-foreground" }), _jsx("span", { className: "text-muted-foreground text-xs", children: "Avg Sentence" })] }), _jsxs("span", { className: "text-foreground text-sm font-medium", children: [readability.avgSentenceLength, " words"] }), _jsx("span", { className: "text-muted-foreground text-xs", children: readability.avgSentenceLength <= 20 ? 'Good' : 'Long' })] }), _jsxs("div", { className: "bg-muted/50 flex flex-col gap-1 rounded-md p-3", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(Clock, { size: 12, className: "text-muted-foreground" }), _jsx("span", { className: "text-muted-foreground text-xs", children: "Reading Time" })] }), _jsxs("span", { className: "text-foreground text-sm font-medium", children: [readability.readingTime, " min"] }), _jsxs("span", { className: "text-muted-foreground text-xs", children: ["~", readability.wordCount, " words"] })] })] }));
|
|
67
|
-
}
|
|
68
|
-
function PerBlockHints({ hints }) {
|
|
69
|
-
return (_jsx("div", { className: "flex flex-col gap-2", children: hints.map((hint, index) => (_jsxs("div", { className: "flex items-start gap-2", children: [_jsx(StatusIcon, { status: hint.status }), _jsxs("div", { className: "flex flex-col", children: [_jsx("span", { className: "text-foreground text-xs font-medium", children: hint.label }), _jsx("span", { className: "text-muted-foreground text-xs", children: hint.detail })] })] }, `${hint.id}-${index}`))) }));
|
|
70
|
-
}
|
|
71
11
|
function BasicSEOFields({ pageSettings, onPageSettingsChange, }) {
|
|
72
12
|
const metaTitleLength = (pageSettings.metaTitle || '').length;
|
|
73
13
|
const metaDescLength = (pageSettings.metaDescription || '').length;
|
|
74
|
-
return (_jsxs("div", { className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("label", { className: "text-foreground text-xs font-medium", children: "Meta Title" }), _jsxs("span", { className: `text-xs ${metaTitleLength > 60 ? 'text-destructive' : metaTitleLength > 0 ? 'text-muted-foreground' : 'text-muted-foreground'}`, children: [metaTitleLength, "/60"] })] }), _jsx("input", { type: "text", value: pageSettings.metaTitle || '', onChange: (e) => onPageSettingsChange({ metaTitle: e.target.value }), placeholder: "Page title for search engines", className: "bg-input-background border-border text-foreground placeholder:text-muted-foreground focus:ring-primary w-full rounded-md border px-3 py-2 text-sm focus:ring-1 focus:outline-none" })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("label", { className: "text-foreground text-xs font-medium", children: "Meta Description" }), _jsxs("span", { className: `text-xs ${metaDescLength > 160 ? 'text-destructive' : metaDescLength > 0 ? 'text-muted-foreground' : 'text-muted-foreground'}`, children: [metaDescLength, "/160"] })] }), _jsx("textarea", { value: pageSettings.metaDescription || '', onChange: (e) => onPageSettingsChange({ metaDescription: e.target.value }), placeholder: "Brief description of the page content", rows: 3, className: "bg-input-background border-border text-foreground placeholder:text-muted-foreground focus:ring-primary w-full resize-none rounded-md border px-3 py-2 text-sm focus:ring-1 focus:outline-none" })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx("label", { className: "text-foreground text-xs font-medium", children: "Focus Keyphrase" }), _jsx("input", { type: "text", value: pageSettings.focusKeyphrase || '', onChange: (e) => onPageSettingsChange({ focusKeyphrase: e.target.value }), placeholder: "Primary keyword or phrase", className: "bg-input-background border-border text-foreground placeholder:text-muted-foreground focus:ring-primary w-full rounded-md border px-3 py-2 text-sm focus:ring-1 focus:outline-none" })] })] }));
|
|
14
|
+
return (_jsxs("div", { className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("label", { htmlFor: "builder-meta-title", className: "text-foreground text-xs font-medium", children: "Meta Title" }), _jsxs("span", { className: `text-xs ${metaTitleLength > 60 ? 'text-destructive' : metaTitleLength > 0 ? 'text-muted-foreground' : 'text-muted-foreground'}`, children: [metaTitleLength, "/60"] })] }), _jsx("input", { id: "builder-meta-title", type: "text", value: pageSettings.metaTitle || '', onChange: (e) => onPageSettingsChange({ metaTitle: e.target.value }), placeholder: "Page title for search engines", className: "bg-input-background border-border text-foreground placeholder:text-muted-foreground focus:ring-primary w-full rounded-md border px-3 py-2 text-sm focus:ring-1 focus:outline-none" })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("label", { className: "text-foreground text-xs font-medium", children: "Meta Description" }), _jsxs("span", { className: `text-xs ${metaDescLength > 160 ? 'text-destructive' : metaDescLength > 0 ? 'text-muted-foreground' : 'text-muted-foreground'}`, children: [metaDescLength, "/160"] })] }), _jsx("textarea", { value: pageSettings.metaDescription || '', onChange: (e) => onPageSettingsChange({ metaDescription: e.target.value }), placeholder: "Brief description of the page content", rows: 3, className: "bg-input-background border-border text-foreground placeholder:text-muted-foreground focus:ring-primary w-full resize-none rounded-md border px-3 py-2 text-sm focus:ring-1 focus:outline-none" })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx("label", { className: "text-foreground text-xs font-medium", children: "Focus Keyphrase" }), _jsx("input", { type: "text", value: pageSettings.focusKeyphrase || '', onChange: (e) => onPageSettingsChange({ focusKeyphrase: e.target.value }), placeholder: "Primary keyword or phrase", className: "bg-input-background border-border text-foreground placeholder:text-muted-foreground focus:ring-primary w-full rounded-md border px-3 py-2 text-sm focus:ring-1 focus:outline-none" })] })] }));
|
|
75
15
|
}
|
|
76
16
|
function SearchPreview({ pageSettings }) {
|
|
77
17
|
const title = pageSettings.metaTitle || pageSettings.title || 'Untitled Page';
|
|
@@ -84,20 +24,15 @@ function SocialPreview({ pageSettings }) {
|
|
|
84
24
|
const description = pageSettings.metaDescription || 'No description set';
|
|
85
25
|
return (_jsxs("div", { className: "bg-background border-border overflow-hidden rounded-md border", children: [_jsx("p", { className: "text-muted-foreground px-4 pt-3 pb-2 text-xs", children: "Open Graph Preview" }), pageSettings.ogImage && (_jsx("div", { className: "bg-muted flex h-32 w-full items-center justify-center overflow-hidden", children: _jsx("img", { src: pageSettings.ogImage, alt: "OG preview", className: "h-full w-full object-cover" }) })), !pageSettings.ogImage && (_jsx("div", { className: "bg-muted flex h-32 w-full items-center justify-center", children: _jsx(Globe, { size: 24, className: "text-muted-foreground" }) })), _jsxs("div", { className: "flex flex-col gap-1 p-3", children: [_jsx("p", { className: "text-muted-foreground text-xs uppercase", children: "example.com" }), _jsx("p", { className: "text-foreground truncate text-sm font-medium", children: title }), _jsx("p", { className: "text-muted-foreground line-clamp-2 text-xs", children: description })] })] }));
|
|
86
26
|
}
|
|
87
|
-
export function BuilderSEOPanel({ tree, pageSettings, onPageSettingsChange,
|
|
88
|
-
const
|
|
89
|
-
const [expandedSections, setExpandedSections] = useState(['
|
|
27
|
+
export function BuilderSEOPanel({ tree, pageSettings, onPageSettingsChange, }) {
|
|
28
|
+
const audit = useMemo(() => auditPage(buildPageAuditInputFromBuilder({ tree, pageSettings })), [tree, pageSettings]);
|
|
29
|
+
const [expandedSections, setExpandedSections] = useState(['basicSeo']);
|
|
90
30
|
const toggleSection = (section) => {
|
|
91
31
|
setExpandedSections((prev) => prev.includes(section) ? prev.filter((s) => s !== section) : [...prev, section]);
|
|
92
32
|
};
|
|
93
|
-
const blockHints = useMemo(() => {
|
|
94
|
-
if (!selectedNodeId)
|
|
95
|
-
return [];
|
|
96
|
-
return analysis.perBlockHints.get(selectedNodeId) || [];
|
|
97
|
-
}, [analysis.perBlockHints, selectedNodeId]);
|
|
98
33
|
if (!tree.children || tree.children.length === 0) {
|
|
99
34
|
return (_jsxs("div", { className: "flex min-h-[200px] flex-col items-center justify-center p-6 text-center", children: [_jsx(Search, { size: 32, className: "text-muted-foreground mb-3" }), _jsx("p", { className: "text-foreground mb-1 text-sm font-medium", children: "SEO Analysis" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Add content to your page to see SEO analysis" })] }));
|
|
100
35
|
}
|
|
101
|
-
return (_jsxs("div", { className: "flex flex-col", children: [
|
|
36
|
+
return (_jsxs("div", { className: "flex flex-col", children: [_jsx(PageAuditPanel, { audit: audit }), _jsx(CollapsibleSection, { title: "Basic SEO", icon: FileText, expanded: expandedSections.includes('basicSeo'), onToggle: () => toggleSection('basicSeo'), children: _jsx(BasicSEOFields, { pageSettings: pageSettings, onPageSettingsChange: onPageSettingsChange }) }), _jsx(CollapsibleSection, { title: "Search Preview", icon: Eye, expanded: expandedSections.includes('searchPreview'), onToggle: () => toggleSection('searchPreview'), children: _jsx(SearchPreview, { pageSettings: pageSettings }) }), _jsx(CollapsibleSection, { title: "Social Preview", icon: Globe, expanded: expandedSections.includes('socialPreview'), onToggle: () => toggleSection('socialPreview'), children: _jsx(SocialPreview, { pageSettings: pageSettings }) })] }));
|
|
102
37
|
}
|
|
103
38
|
//# sourceMappingURL=SEOPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SEOPanel.js","sourceRoot":"","sources":["../../../src/views/page-builder/SEOPanel.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SEOPanel.js","sourceRoot":"","sources":["../../../src/views/page-builder/SEOPanel.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prenta/admin",
|
|
3
|
-
"version": "0.98.
|
|
3
|
+
"version": "0.98.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -99,7 +99,7 @@
|
|
|
99
99
|
"typescript": "^5.7.0",
|
|
100
100
|
"vitest": "^4.1.0",
|
|
101
101
|
"@prenta/component-blocks": "0.3.0",
|
|
102
|
-
"@prenta/core": "0.
|
|
102
|
+
"@prenta/core": "1.0.0",
|
|
103
103
|
"@prenta/plugin-ai": "0.6.0",
|
|
104
104
|
"@prenta/plugin-blocks": "0.2.0",
|
|
105
105
|
"@prenta/plugin-commerce": "0.2.0",
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
"@prenta/plugin-media": "0.2.0",
|
|
108
108
|
"@prenta/plugin-navigation": "0.3.0",
|
|
109
109
|
"@prenta/plugin-seo": "0.1.0",
|
|
110
|
-
"@prenta/sections-react": "0.17.
|
|
110
|
+
"@prenta/sections-react": "0.17.4"
|
|
111
111
|
},
|
|
112
112
|
"scripts": {
|
|
113
113
|
"build": "tsc --project tsconfig.json && npx @tailwindcss/cli -i src/styles/build-input.css -o dist/prenta-admin.css --minify",
|
|
@@ -36,13 +36,6 @@ describe('SEO score bands are defined once', () => {
|
|
|
36
36
|
// MEDIA SEO completeness (alt text, filenames), graded 80/30 because the
|
|
37
37
|
// population and the remedy are different from a page's SEO score.
|
|
38
38
|
'views/MediaSeoAudit.tsx',
|
|
39
|
-
// The legacy page-builder SEO panel, graded 70/40 for the colour and
|
|
40
|
-
// 80/70/50 for the label — BOTH different from the SEO tab's 80/60, so a
|
|
41
|
-
// page scoring 75 is green here and orange there. That is a real
|
|
42
|
-
// disagreement about the same number and needs a decision (followup 8),
|
|
43
|
-
// not a silent rewrite from a refactor. Exempt so this guard can protect
|
|
44
|
-
// the surfaces that ARE settled; remove the entry when it is resolved.
|
|
45
|
-
'views/page-builder/SEOPanel.tsx',
|
|
46
39
|
]
|
|
47
40
|
|
|
48
41
|
it('no other component restates a threshold', () => {
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest'
|
|
2
2
|
import { auditPage } from '@prenta/core/seo/page-audit'
|
|
3
3
|
import type { PageSection } from '@prenta/core/page-sections'
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
buildPageAuditInput,
|
|
6
|
+
buildPageAuditInputFromBuilder,
|
|
7
|
+
metaFromRecord,
|
|
8
|
+
} from '../../lib/page-audit-input.js'
|
|
5
9
|
import type { SeoContentRecord } from '../../lib/seo-service.js'
|
|
6
10
|
|
|
7
11
|
/**
|
|
@@ -142,3 +146,89 @@ describe('page audit input', () => {
|
|
|
142
146
|
expect(audit.seo.score).toBeNull()
|
|
143
147
|
})
|
|
144
148
|
})
|
|
149
|
+
|
|
150
|
+
function builderTree(heroData: Record<string, unknown>) {
|
|
151
|
+
return {
|
|
152
|
+
type: 'page',
|
|
153
|
+
children: [
|
|
154
|
+
{
|
|
155
|
+
type: 'section',
|
|
156
|
+
settings: {},
|
|
157
|
+
children: [
|
|
158
|
+
{
|
|
159
|
+
type: 'row',
|
|
160
|
+
children: [
|
|
161
|
+
{
|
|
162
|
+
type: 'column',
|
|
163
|
+
children: [{ type: 'block', settings: { blockType: 'hero' }, data: heroData }],
|
|
164
|
+
},
|
|
165
|
+
],
|
|
166
|
+
},
|
|
167
|
+
],
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
describe('buildPageAuditInputFromBuilder', () => {
|
|
174
|
+
it('maps pageSettings onto the same fields the editors use', () => {
|
|
175
|
+
const input = buildPageAuditInputFromBuilder({
|
|
176
|
+
tree: builderTree({
|
|
177
|
+
title: 'Headless CMS for modern teams',
|
|
178
|
+
image: { url: '/hero.webp', alt: 'A described image' },
|
|
179
|
+
}),
|
|
180
|
+
pageSettings: {
|
|
181
|
+
title: 'About Us',
|
|
182
|
+
slug: 'about',
|
|
183
|
+
metaTitle: 'Headless CMS for teams',
|
|
184
|
+
metaDescription: 'A described public page.',
|
|
185
|
+
focusKeyphrase: 'headless cms',
|
|
186
|
+
schemaType: 'WebPage',
|
|
187
|
+
ogImage: '/share.png',
|
|
188
|
+
},
|
|
189
|
+
})
|
|
190
|
+
|
|
191
|
+
expect(input.sections).toHaveLength(1)
|
|
192
|
+
expect(input.sections[0]!.sectionType).toBe('hero')
|
|
193
|
+
expect(input.seo.title).toBe('Headless CMS for teams')
|
|
194
|
+
expect(input.seo.description).toBe('A described public page.')
|
|
195
|
+
expect(input.seo.slug).toBe('about')
|
|
196
|
+
expect(input.seo.keyword).toBe('headless cms')
|
|
197
|
+
expect(input.seo.schema).toBe('WebPage')
|
|
198
|
+
expect(input.seo.ogImage).toBeUndefined()
|
|
199
|
+
expect(input.seo.robots).toEqual({ index: true, snippet: true })
|
|
200
|
+
expect(input.llmsTxt).toBe(true)
|
|
201
|
+
expect(input.brand).toBe('')
|
|
202
|
+
expect(input.author).toBeUndefined()
|
|
203
|
+
})
|
|
204
|
+
|
|
205
|
+
it('uses the document title when meta title is empty', () => {
|
|
206
|
+
const input = buildPageAuditInputFromBuilder({
|
|
207
|
+
tree: { type: 'page', children: [] },
|
|
208
|
+
pageSettings: { title: 'About Us', slug: 'about' },
|
|
209
|
+
})
|
|
210
|
+
expect(input.sections).toEqual([])
|
|
211
|
+
expect(input.seo.title).toBe('About Us')
|
|
212
|
+
})
|
|
213
|
+
|
|
214
|
+
it('lets a bridged hero alt satisfy images-have-alt', () => {
|
|
215
|
+
const withAlt = auditPage(
|
|
216
|
+
buildPageAuditInputFromBuilder({
|
|
217
|
+
tree: builderTree({
|
|
218
|
+
title: 'Headline',
|
|
219
|
+
image: { url: '/hero.webp', alt: 'Team at a whiteboard' },
|
|
220
|
+
}),
|
|
221
|
+
pageSettings: { title: 'About', slug: 'about' },
|
|
222
|
+
}),
|
|
223
|
+
)
|
|
224
|
+
expect(withAlt.seo.checks.find((c) => c.id === 'images-have-alt')?.outcome).toBe('pass')
|
|
225
|
+
|
|
226
|
+
const withoutAlt = auditPage(
|
|
227
|
+
buildPageAuditInputFromBuilder({
|
|
228
|
+
tree: builderTree({ title: 'Headline', image: { url: '/hero.webp' } }),
|
|
229
|
+
pageSettings: { title: 'About', slug: 'about' },
|
|
230
|
+
}),
|
|
231
|
+
)
|
|
232
|
+
expect(withoutAlt.seo.checks.find((c) => c.id === 'images-have-alt')?.outcome).toBe('fail')
|
|
233
|
+
})
|
|
234
|
+
})
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// @vitest-environment happy-dom
|
|
2
|
+
import { describe, expect, it, vi } from 'vitest'
|
|
3
|
+
import { render, screen } from '@testing-library/react'
|
|
4
|
+
import type { PageNode } from '@prenta/core'
|
|
5
|
+
import { BuilderSEOPanel } from '../../views/page-builder/SEOPanel.js'
|
|
6
|
+
|
|
7
|
+
const tree = {
|
|
8
|
+
id: 'page-1',
|
|
9
|
+
type: 'page',
|
|
10
|
+
children: [
|
|
11
|
+
{
|
|
12
|
+
id: 'sec-1',
|
|
13
|
+
type: 'section',
|
|
14
|
+
settings: {},
|
|
15
|
+
children: [
|
|
16
|
+
{
|
|
17
|
+
id: 'row-1',
|
|
18
|
+
type: 'row',
|
|
19
|
+
settings: {},
|
|
20
|
+
children: [
|
|
21
|
+
{
|
|
22
|
+
id: 'col-1',
|
|
23
|
+
type: 'column',
|
|
24
|
+
settings: { width: 12 },
|
|
25
|
+
children: [
|
|
26
|
+
{
|
|
27
|
+
id: 'blk-hero',
|
|
28
|
+
type: 'block',
|
|
29
|
+
settings: { blockType: 'hero' },
|
|
30
|
+
data: {
|
|
31
|
+
title: 'Welcome to Our Service',
|
|
32
|
+
image: { url: '/hero.webp', alt: 'Hero banner' },
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
} as PageNode
|
|
43
|
+
|
|
44
|
+
const pageSettings = {
|
|
45
|
+
title: 'Home',
|
|
46
|
+
slug: 'home',
|
|
47
|
+
metaTitle: 'Welcome to Our Service',
|
|
48
|
+
metaDescription: 'The public description.',
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
describe('BuilderSEOPanel', () => {
|
|
52
|
+
it('grades the live tree with the shared page audit panel and keeps meta fields', () => {
|
|
53
|
+
render(
|
|
54
|
+
<BuilderSEOPanel tree={tree} pageSettings={pageSettings} onPageSettingsChange={vi.fn()} />,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
expect(screen.getByRole('img', { name: /SEO score:/i })).toBeTruthy()
|
|
58
|
+
expect(screen.getByRole('img', { name: /GEO score:/i })).toBeTruthy()
|
|
59
|
+
expect(screen.getByText('SEO checks')).toBeTruthy()
|
|
60
|
+
expect(screen.getByText('GEO checks')).toBeTruthy()
|
|
61
|
+
expect(screen.getByLabelText('Meta Title')).toBeTruthy()
|
|
62
|
+
expect(screen.queryByText('Readability')).toBeNull()
|
|
63
|
+
expect(screen.queryByText('Block Hints')).toBeNull()
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
it('keeps the empty-tree copy when the canvas has no children', () => {
|
|
67
|
+
render(
|
|
68
|
+
<BuilderSEOPanel
|
|
69
|
+
tree={{ id: 'page-1', type: 'page', children: [] } as PageNode}
|
|
70
|
+
pageSettings={pageSettings}
|
|
71
|
+
onPageSettingsChange={vi.fn()}
|
|
72
|
+
/>,
|
|
73
|
+
)
|
|
74
|
+
expect(screen.getByText('Add content to your page to see SEO analysis')).toBeTruthy()
|
|
75
|
+
expect(screen.queryByRole('img', { name: /SEO score:/i })).toBeNull()
|
|
76
|
+
})
|
|
77
|
+
})
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { resolveRenderedMetaTitle } from '@prenta/core/client'
|
|
2
|
-
import type
|
|
2
|
+
import { layoutTreeToSections, type PageSection } from '@prenta/core/page-sections'
|
|
3
3
|
import type { PageAuditInput } from '@prenta/core/seo/page-audit'
|
|
4
4
|
import type { SeoContentRecord } from './seo-service.js'
|
|
5
5
|
|
|
@@ -102,3 +102,38 @@ export function metaFromRecord(record: SeoContentRecord): AuditMetaSource {
|
|
|
102
102
|
hasOgImage: Boolean(record.ogImage),
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
|
+
|
|
106
|
+
export interface BuilderAuditSource {
|
|
107
|
+
tree: unknown
|
|
108
|
+
pageSettings: {
|
|
109
|
+
title: string
|
|
110
|
+
slug: string
|
|
111
|
+
metaTitle?: string
|
|
112
|
+
metaDescription?: string
|
|
113
|
+
ogImage?: string
|
|
114
|
+
focusKeyphrase?: string
|
|
115
|
+
schemaType?: string
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export function buildPageAuditInputFromBuilder({
|
|
120
|
+
tree,
|
|
121
|
+
pageSettings,
|
|
122
|
+
}: BuilderAuditSource): PageAuditInput {
|
|
123
|
+
return buildPageAuditInput({
|
|
124
|
+
sections: layoutTreeToSections(tree),
|
|
125
|
+
meta: {
|
|
126
|
+
metaTitle: pageSettings.metaTitle ?? '',
|
|
127
|
+
metaDescription: pageSettings.metaDescription ?? '',
|
|
128
|
+
focusKeyword: pageSettings.focusKeyphrase ?? '',
|
|
129
|
+
structuredDataType: pageSettings.schemaType ?? '',
|
|
130
|
+
noindex: false,
|
|
131
|
+
nosnippet: false,
|
|
132
|
+
llmsInclude: 'AUTO',
|
|
133
|
+
hasOgImage: Boolean(pageSettings.ogImage),
|
|
134
|
+
},
|
|
135
|
+
slug: pageSettings.slug,
|
|
136
|
+
record: null,
|
|
137
|
+
fallbackTitle: pageSettings.title,
|
|
138
|
+
})
|
|
139
|
+
}
|