@prenta/admin 0.97.1 → 0.97.2
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 +16 -0
- package/dist/__tests__/components/seo-score-bands.test.d.ts +2 -0
- package/dist/__tests__/components/seo-score-bands.test.d.ts.map +1 -0
- package/dist/__tests__/components/seo-score-bands.test.js +96 -0
- package/dist/__tests__/components/seo-score-bands.test.js.map +1 -0
- package/dist/components/SEOPerformance.d.ts.map +1 -1
- package/dist/components/SEOPerformance.js +7 -2
- package/dist/components/SEOPerformance.js.map +1 -1
- package/dist/components/posts/badges.d.ts +1 -1
- package/dist/components/posts/badges.d.ts.map +1 -1
- package/dist/components/posts/badges.js +26 -12
- package/dist/components/posts/badges.js.map +1 -1
- package/dist/components/seo/primitives.d.ts +14 -1
- package/dist/components/seo/primitives.d.ts.map +1 -1
- package/dist/components/seo/primitives.js +14 -1
- package/dist/components/seo/primitives.js.map +1 -1
- package/dist/views/Pages.d.ts.map +1 -1
- package/dist/views/Pages.js +4 -1
- package/dist/views/Pages.js.map +1 -1
- package/package.json +5 -5
- package/src/__tests__/components/seo-score-bands.test.ts +99 -0
- package/src/components/SEOPerformance.tsx +7 -2
- package/src/components/posts/badges.tsx +29 -12
- package/src/components/seo/primitives.tsx +14 -1
- package/src/views/Pages.tsx +4 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @actuate-media/cms-admin
|
|
2
2
|
|
|
3
|
+
## 0.97.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- ff45075: SEO score bands come from one function
|
|
8
|
+
|
|
9
|
+
The thresholds that turn a 0–100 SEO score into good/fair/poor were written out in several places that all happened to agree. Four surfaces grading the same score — the Posts list palette and indicator, the SEO performance badge, and the Pages list badge — now derive from `gradeFromScore`, and a source-level guard fails by filename if a fifth appears.
|
|
10
|
+
|
|
11
|
+
That matters because followup 8 asks whether the "fair" floor should be 55 or 60. Changing it would have moved the SEO tab's ring and left the other surfaces on 60, so a page scoring 55–59 would have shown a warning badge in one list beside a passing ring in the editor.
|
|
12
|
+
|
|
13
|
+
No rendered colour changes. A pinned table of edge scores (0, 1, 59, 60, 79, 80, 100) proves it.
|
|
14
|
+
|
|
15
|
+
One latent inconsistency is fixed along the way: `SeoScoreIndicator` mapped score → palette key → token class, and the last hop painted anything that was not green or orange as destructive — so a zero score resolved to the `gray` key and then rendered a red dot. It derives from `gradeMeta` now.
|
|
16
|
+
|
|
17
|
+
Three other band sets are deliberately left alone and documented as exempt: the page-builder _design_ score (80/65/50) and the media SEO audit (80/30) are different metrics, and the legacy page-builder SEO panel grades the same score at 70/40 — a real disagreement with the SEO tab that needs a product decision rather than a silent rewrite.
|
|
18
|
+
|
|
3
19
|
## 0.97.1
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo-score-bands.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/components/seo-score-bands.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { readFileSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { join, sep } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { describe, expect, it } from 'vitest';
|
|
5
|
+
import { gradeFromScore, gradeMeta } from '../../components/seo/primitives.js';
|
|
6
|
+
import { seoScorePalette } from '../../components/posts/badges.js';
|
|
7
|
+
/**
|
|
8
|
+
* The SEO score bands live in exactly one function.
|
|
9
|
+
*
|
|
10
|
+
* They were written out three times — `gradeFromScore`, the Posts list's score
|
|
11
|
+
* palette, and the SEO performance badge — plus a fourth mapping from palette
|
|
12
|
+
* key to token class inside the score indicator. All of them agreed, so
|
|
13
|
+
* nothing looked wrong; the cost was latent.
|
|
14
|
+
*
|
|
15
|
+
* It would have arrived with followup 8, which asks whether the "fair" floor
|
|
16
|
+
* should be 55 (the design handoff) or 60 (this code). Editing that number in
|
|
17
|
+
* `gradeFromScore` would have left the other surfaces on 60, so a page scoring
|
|
18
|
+
* 55-59 would show a green-ish ring beside an orange Posts badge.
|
|
19
|
+
*/
|
|
20
|
+
describe('SEO score bands are defined once', () => {
|
|
21
|
+
const PKG = fileURLToPath(new URL('../../../', import.meta.url));
|
|
22
|
+
/**
|
|
23
|
+
* Files allowed to name their own thresholds, and why. Anything not listed
|
|
24
|
+
* here that compares a score against a band edge is grading the SEO score
|
|
25
|
+
* and must use `gradeFromScore`.
|
|
26
|
+
*/
|
|
27
|
+
const EXEMPT = [
|
|
28
|
+
// The one function that defines the SEO bands.
|
|
29
|
+
'components/seo/primitives.tsx',
|
|
30
|
+
// A DESIGN score, not the SEO score — its own metric, its own bands
|
|
31
|
+
// (80/65/50). Sharing thresholds here would be a false economy.
|
|
32
|
+
'views/page-builder/DesignScore.tsx',
|
|
33
|
+
// MEDIA SEO completeness (alt text, filenames), graded 80/30 because the
|
|
34
|
+
// population and the remedy are different from a page's SEO score.
|
|
35
|
+
'views/MediaSeoAudit.tsx',
|
|
36
|
+
// The legacy page-builder SEO panel, graded 70/40 for the colour and
|
|
37
|
+
// 80/70/50 for the label — BOTH different from the SEO tab's 80/60, so a
|
|
38
|
+
// page scoring 75 is green here and orange there. That is a real
|
|
39
|
+
// disagreement about the same number and needs a decision (followup 8),
|
|
40
|
+
// not a silent rewrite from a refactor. Exempt so this guard can protect
|
|
41
|
+
// the surfaces that ARE settled; remove the entry when it is resolved.
|
|
42
|
+
'views/page-builder/SEOPanel.tsx',
|
|
43
|
+
];
|
|
44
|
+
it('no other component restates a threshold', () => {
|
|
45
|
+
const offenders = [];
|
|
46
|
+
const walk = (dir) => {
|
|
47
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
48
|
+
const full = join(dir, entry.name);
|
|
49
|
+
if (entry.isDirectory()) {
|
|
50
|
+
walk(full);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (!/\.tsx?$/.test(entry.name) || /\.test\.tsx?$/.test(entry.name))
|
|
54
|
+
continue;
|
|
55
|
+
const rel = full.slice(PKG.length).replaceAll(sep, '/');
|
|
56
|
+
if (EXEMPT.some((e) => rel.endsWith(e)))
|
|
57
|
+
continue;
|
|
58
|
+
const src = readFileSync(full, 'utf8');
|
|
59
|
+
// A score compared against a band edge is the shape being banned.
|
|
60
|
+
if (/\bscore\s*>=?\s*(80|60|55)\b/.test(src))
|
|
61
|
+
offenders.push(rel);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
walk(join(PKG, 'src'));
|
|
65
|
+
expect(offenders, `score thresholds restated in: ${offenders.join(', ')}`).toEqual([]);
|
|
66
|
+
});
|
|
67
|
+
/**
|
|
68
|
+
* Pinned so the refactor is provably behaviour-preserving, and so changing a
|
|
69
|
+
* band is a deliberate act that updates this table rather than a silent
|
|
70
|
+
* shift. 59/60 and 79/80 are the edges; 0 is the "never audited" case.
|
|
71
|
+
*/
|
|
72
|
+
it.each([
|
|
73
|
+
[0, 'critical', 'gray'],
|
|
74
|
+
[1, 'poor', 'red'],
|
|
75
|
+
[59, 'poor', 'red'],
|
|
76
|
+
[60, 'fair', 'orange'],
|
|
77
|
+
[79, 'fair', 'orange'],
|
|
78
|
+
[80, 'good', 'green'],
|
|
79
|
+
[100, 'good', 'green'],
|
|
80
|
+
])('score %i is %s and paints %s', (score, grade, tagColor) => {
|
|
81
|
+
expect(gradeFromScore(score)).toBe(grade);
|
|
82
|
+
expect(seoScorePalette(score)).toBe(tagColor);
|
|
83
|
+
});
|
|
84
|
+
it('an unscored post is grey rather than a failure', () => {
|
|
85
|
+
expect(seoScorePalette(null)).toBe('gray');
|
|
86
|
+
expect(seoScorePalette(Number.NaN)).toBe('gray');
|
|
87
|
+
});
|
|
88
|
+
it('every grade has a token class, so no surface has to invent one', () => {
|
|
89
|
+
for (const grade of ['good', 'fair', 'poor', 'critical']) {
|
|
90
|
+
const meta = gradeMeta(grade);
|
|
91
|
+
expect(meta.dot, grade).toMatch(/^bg-/);
|
|
92
|
+
expect(meta.text, grade).toMatch(/^text-/);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
//# sourceMappingURL=seo-score-bands.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo-score-bands.test.js","sourceRoot":"","sources":["../../../src/__tests__/components/seo-score-bands.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SEOPerformance.d.ts","sourceRoot":"","sources":["../../src/components/SEOPerformance.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SEOPerformance.d.ts","sourceRoot":"","sources":["../../src/components/SEOPerformance.tsx"],"names":[],"mappings":"AAyCA,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC;AAED,wBAAgB,cAAc,CAAC,EAAE,UAAU,EAAE,EAAE,mBAAmB,kDAqHjE"}
|
|
@@ -2,10 +2,15 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { Search, FileWarning, ImageOff, LinkIcon, ChevronLeft, ChevronRight, } from 'lucide-react';
|
|
4
4
|
import { useState } from 'react';
|
|
5
|
+
import { gradeFromScore, gradeMeta } from './seo/primitives.js';
|
|
5
6
|
import { useApiData } from '../lib/useApiData.js';
|
|
7
|
+
/**
|
|
8
|
+
* The bands and their colours both come from the SEO primitives — this used to
|
|
9
|
+
* restate 80/60 twice on adjacent lines, and `gradeMeta` already returns
|
|
10
|
+
* exactly the token classes it was hand-writing.
|
|
11
|
+
*/
|
|
6
12
|
function ScoreBadge({ score }) {
|
|
7
|
-
const
|
|
8
|
-
const bg = score >= 80 ? 'bg-success/10' : score >= 60 ? 'bg-warning/10' : 'bg-destructive/10';
|
|
13
|
+
const { text: color, bg } = gradeMeta(gradeFromScore(score));
|
|
9
14
|
return (_jsx("span", { className: `inline-flex h-9 w-9 items-center justify-center rounded-full text-sm font-medium ${color} ${bg}`, children: score }));
|
|
10
15
|
}
|
|
11
16
|
export function SEOPerformance({ onNavigate }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SEOPerformance.js","sourceRoot":"","sources":["../../src/components/SEOPerformance.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EACL,MAAM,EAEN,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,YAAY,GACb,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAYjD,SAAS,UAAU,CAAC,EAAE,KAAK,EAAqB;IAC9C,MAAM,
|
|
1
|
+
{"version":3,"file":"SEOPerformance.js","sourceRoot":"","sources":["../../src/components/SEOPerformance.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EACL,MAAM,EAEN,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,YAAY,GACb,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAYjD;;;;GAIG;AACH,SAAS,UAAU,CAAC,EAAE,KAAK,EAAqB;IAC9C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAA;IAC5D,OAAO,CACL,eACE,SAAS,EAAE,oFAAoF,KAAK,IAAI,EAAE,EAAE,YAE3G,KAAK,GACD,CACR,CAAA;AACH,CAAC;AAMD,MAAM,UAAU,cAAc,CAAC,EAAE,UAAU,EAAuB;IAChE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,UAAU,CAAa,cAAc,CAAC,CAAA;IACvE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IACnC,MAAM,OAAO,GAAG,CAAC,CAAA;IAEjB,IAAI,OAAO,IAAI,KAAK,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IAE1C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAA;IACjC,MAAM,WAAW,GACf,MAAM,CAAC,uBAAuB,GAAG,MAAM,CAAC,mBAAmB,GAAG,MAAM,CAAC,cAAc,CAAA;IACrF,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAA;IACxC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAA;IACtE,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAA;IAEtE,OAAO,CACL,eAAK,SAAS,EAAC,yCAAyC,aACtD,eAAK,SAAS,EAAC,8DAA8D,aAC3E,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,MAAM,IAAC,SAAS,EAAC,+BAA+B,GAAG,EACpD,aAAI,SAAS,EAAC,qCAAqC,gCAAqB,IACpE,EACL,WAAW,GAAG,CAAC,IAAI,CAClB,gBAAM,SAAS,EAAC,+BAA+B,aAC5C,WAAW,YAAQ,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,cAC3C,CACR,IACG,EAEN,eAAK,SAAS,EAAC,mFAAmF,aAChG,eAAK,SAAS,EAAC,mBAAmB,aAChC,aAAI,SAAS,EAAC,0CAA0C,uCAA4B,EACpF,eAAK,SAAS,EAAC,WAAW,aACvB,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACrB,eAAmB,SAAS,EAAC,wCAAwC,aACnE,eAAK,SAAS,EAAC,qBAAqB,aAClC,YAAG,SAAS,EAAC,8CAA8C,YAAE,IAAI,CAAC,KAAK,GAAK,EAC5E,YAAG,SAAS,EAAC,0CAA0C,YAAE,IAAI,CAAC,UAAU,GAAK,IACzE,EACN,KAAC,UAAU,IAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAI,KALzB,IAAI,CAAC,EAAE,CAMX,CACP,CAAC,EACD,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CACvB,YAAG,SAAS,EAAC,gDAAgD,yCAEzD,CACL,IACG,EACL,UAAU,CAAC,MAAM,GAAG,OAAO,IAAI,CAC9B,eAAK,SAAS,EAAC,oGAAoG,aACjH,uCACW,IAAI,GAAG,OAAO,GAAG,CAAC,OAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,SAAK,GAAG,EACtF,UAAU,CAAC,MAAM,IACb,EACP,eAAK,SAAS,EAAC,yBAAyB,aACtC,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,EAC7C,QAAQ,EAAE,IAAI,KAAK,CAAC,EACpB,SAAS,EAAC,iDAAiD,YAE3D,KAAC,WAAW,IAAC,SAAS,EAAC,aAAa,GAAG,GAChC,EACT,oCACQ,IAAI,GAAG,CAAC,UAAM,UAAU,IACzB,EACP,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,EAC1D,QAAQ,EAAE,IAAI,IAAI,UAAU,GAAG,CAAC,EAChC,SAAS,EAAC,iDAAiD,YAE3D,KAAC,YAAY,IAAC,SAAS,EAAC,aAAa,GAAG,GACjC,IACL,IACF,CACP,IACG,EAEN,eAAK,SAAS,EAAC,mBAAmB,aAChC,aAAI,SAAS,EAAC,0CAA0C,2BAAgB,EACxE,eAAK,SAAS,EAAC,WAAW,aACxB,eAAK,SAAS,EAAC,mCAAmC,aAChD,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,WAAW,IAAC,SAAS,EAAC,sBAAsB,GAAG,EAChD,eAAM,SAAS,EAAC,yBAAyB,0CAAiC,IACtE,EACN,eAAM,SAAS,EAAC,qCAAqC,YAClD,MAAM,CAAC,uBAAuB,GAC1B,IACH,EACN,eAAK,SAAS,EAAC,mCAAmC,aAChD,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,QAAQ,IAAC,SAAS,EAAC,sBAAsB,GAAG,EAC7C,eAAM,SAAS,EAAC,yBAAyB,sCAA6B,IAClE,EACN,eAAM,SAAS,EAAC,qCAAqC,YAClD,MAAM,CAAC,mBAAmB,GACtB,IACH,EACN,eAAK,SAAS,EAAC,mCAAmC,aAChD,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,QAAQ,IAAC,SAAS,EAAC,sBAAsB,GAAG,EAC7C,eAAM,SAAS,EAAC,yBAAyB,iCAAwB,IAC7D,EACN,eAAM,SAAS,EAAC,qCAAqC,YAAE,MAAM,CAAC,cAAc,GAAQ,IAChF,IACF,EACL,WAAW,GAAG,CAAC,IAAI,CAClB,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,EACnC,SAAS,EAAC,6DAA6D,gCAGhE,CACV,IACG,IACF,IACF,CACP,CAAA;AACH,CAAC"}
|
|
@@ -21,7 +21,7 @@ export declare function PostTypeBadge({ label, color, onClick, }: {
|
|
|
21
21
|
color: string | null;
|
|
22
22
|
onClick?: () => void;
|
|
23
23
|
}): ReactNode;
|
|
24
|
-
export declare function seoScorePalette(score: number | null):
|
|
24
|
+
export declare function seoScorePalette(score: number | null): TagColorKey;
|
|
25
25
|
export declare function SeoScoreIndicator({ score }: {
|
|
26
26
|
score: number | null;
|
|
27
27
|
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"badges.d.ts","sourceRoot":"","sources":["../../../src/components/posts/badges.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"badges.d.ts","sourceRoot":"","sources":["../../../src/components/posts/badges.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAI5D;;;;GAIG;AAEH,eAAO,MAAM,cAAc,uEAAwE,CAAA;AAEnG,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAA;AA+CzD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;QA7ClB,MAAM;UAAQ,MAAM;UAAQ,MAAM;YAAU,MAAM;EAgD1F;AAgBD,wBAAgB,eAAe,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,2CAMjE;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,KAAK,EACL,OAAO,GACR,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB,GAAG,SAAS,CAWZ;AAoBD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,CAGjE;AAED,wBAAgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,2CA0BpE"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { StatusBadge } from '../ui/StatusBadge.js';
|
|
4
|
+
import { gradeFromScore, gradeMeta } from '../seo/primitives.js';
|
|
4
5
|
/**
|
|
5
6
|
* Shared status / type / SEO indicators for the Posts admin area.
|
|
6
7
|
* Tag / post-type accent colors use dedicated `--tag-*` tokens so each
|
|
@@ -79,16 +80,27 @@ export function PostTypeBadge({ label, color, onClick, }) {
|
|
|
79
80
|
}
|
|
80
81
|
return _jsx("span", { className: className, children: label });
|
|
81
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* Palette key for a post's SEO score.
|
|
85
|
+
*
|
|
86
|
+
* The bands come from `gradeFromScore` rather than being restated here — this
|
|
87
|
+
* used to carry its own copy of 80/60/1, which agreed with the canonical one
|
|
88
|
+
* only for as long as nobody changed either.
|
|
89
|
+
*
|
|
90
|
+
* `critical` maps to gray, not red: a score of exactly 0 means "never audited"
|
|
91
|
+
* in this list, and colouring that as a failure would report a problem the
|
|
92
|
+
* page may not have. A null score is the same case and takes the same colour.
|
|
93
|
+
*/
|
|
94
|
+
const GRADE_TAG_COLOR = {
|
|
95
|
+
good: 'green',
|
|
96
|
+
fair: 'orange',
|
|
97
|
+
poor: 'red',
|
|
98
|
+
critical: 'gray',
|
|
99
|
+
};
|
|
82
100
|
export function seoScorePalette(score) {
|
|
83
101
|
if (score === null || Number.isNaN(score))
|
|
84
102
|
return 'gray';
|
|
85
|
-
|
|
86
|
-
return 'green';
|
|
87
|
-
if (score >= 60)
|
|
88
|
-
return 'orange';
|
|
89
|
-
if (score >= 1)
|
|
90
|
-
return 'red';
|
|
91
|
-
return 'gray';
|
|
103
|
+
return GRADE_TAG_COLOR[gradeFromScore(score)];
|
|
92
104
|
}
|
|
93
105
|
export function SeoScoreIndicator({ score }) {
|
|
94
106
|
const colorKey = seoScorePalette(score);
|
|
@@ -96,10 +108,12 @@ export function SeoScoreIndicator({ score }) {
|
|
|
96
108
|
if (score === null) {
|
|
97
109
|
return (_jsxs("span", { className: "text-muted-foreground inline-flex items-center gap-1.5 text-xs", children: [_jsx("span", { "aria-hidden": true, className: `h-2 w-2 rounded-full ${p.bg.split(' ')[0]}` }), _jsx("span", { className: "tabular-nums", children: "\u2014" })] }));
|
|
98
110
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
111
|
+
// The dot's semantic colour comes from `gradeMeta`, not from a third mapping
|
|
112
|
+
// of colour key -> token. That chain was `score -> palette key -> class`, and
|
|
113
|
+
// its final hop treated everything that was not green or orange as
|
|
114
|
+
// destructive — including the `gray` a zero score resolves to, so the key
|
|
115
|
+
// said gray while the dot rendered red. Deriving from the grade removes the
|
|
116
|
+
// hop and the disagreement; the rendered colour is unchanged for every score.
|
|
117
|
+
return (_jsxs("span", { className: "text-foreground inline-flex items-center gap-1.5 text-xs", children: [_jsx("span", { "aria-hidden": true, className: `h-2 w-2 rounded-full ${gradeMeta(gradeFromScore(score)).dot}` }), _jsx("span", { className: "tabular-nums", children: score })] }));
|
|
104
118
|
}
|
|
105
119
|
//# sourceMappingURL=badges.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"badges.js","sourceRoot":"","sources":["../../../src/components/posts/badges.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAGZ,OAAO,EAAE,WAAW,EAAwB,MAAM,sBAAsB,CAAA;AAGxE;;;;GAIG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAU,CAAA;AAInG,MAAM,OAAO,GAAoF;IAC/F,MAAM,EAAE;QACN,EAAE,EAAE,oBAAoB;QACxB,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE,mBAAmB;KAC5B;IACD,KAAK,EAAE;QACL,EAAE,EAAE,mBAAmB;QACvB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE,kBAAkB;KAC3B;IACD,MAAM,EAAE;QACN,EAAE,EAAE,oBAAoB;QACxB,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE,mBAAmB;KAC5B;IACD,GAAG,EAAE;QACH,EAAE,EAAE,iBAAiB;QACrB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,gBAAgB;KACzB;IACD,IAAI,EAAE;QACJ,EAAE,EAAE,kBAAkB;QACtB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,iBAAiB;KAC1B;IACD,IAAI,EAAE;QACJ,EAAE,EAAE,kBAAkB;QACtB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,iBAAiB;KAC1B;IACD,IAAI,EAAE;QACJ,EAAE,EAAE,kBAAkB;QACtB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,iBAAiB;KAC1B;CACF,CAAA;AAED,MAAM,UAAU,UAAU,CAAC,KAAgC;IACzD,IAAI,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC,IAAI,CAAA;IAC/B,OAAO,OAAO,CAAC,KAAoB,CAAC,IAAI,OAAO,CAAC,IAAI,CAAA;AACtD,CAAC;AAED,MAAM,YAAY,GAA+B;IAC/C,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,UAAU;CACrB,CAAA;AAED,MAAM,WAAW,GAAwC;IACvD,SAAS,EAAE,SAAS;IACpB,KAAK,EAAE,SAAS;IAChB,SAAS,EAAE,SAAS;IACpB,QAAQ,EAAE,OAAO;CAClB,CAAA;AAED,MAAM,UAAU,eAAe,CAAC,EAAE,MAAM,EAA0B;IAChE,OAAO,CACL,KAAC,WAAW,IAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,gBAAc,WAAW,YAAY,CAAC,MAAM,CAAC,EAAE,YAClF,YAAY,CAAC,MAAM,CAAC,GACT,CACf,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,EACL,KAAK,EACL,OAAO,GAKR;IACC,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;IAC3B,MAAM,SAAS,GAAG,yEAAyE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;IAC3G,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CACL,iBAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,SAAS,mBAAmB,YAC/E,KAAK,GACC,CACV,CAAA;IACH,CAAC;IACD,OAAO,eAAM,SAAS,EAAE,SAAS,YAAG,KAAK,GAAQ,CAAA;AACnD,CAAC;AAED,MAAM,
|
|
1
|
+
{"version":3,"file":"badges.js","sourceRoot":"","sources":["../../../src/components/posts/badges.tsx"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,20 @@ export interface GradeMeta {
|
|
|
12
12
|
dot: string;
|
|
13
13
|
}
|
|
14
14
|
export declare function gradeMeta(grade: SeoGrade): GradeMeta;
|
|
15
|
-
/**
|
|
15
|
+
/**
|
|
16
|
+
* Grade band from a numeric 0-100 score — the ONLY place the thresholds live.
|
|
17
|
+
*
|
|
18
|
+
* They were written out three times: here, in the Posts list's score palette,
|
|
19
|
+
* and in the SEO performance badge. All three agreed, so nothing was visibly
|
|
20
|
+
* wrong; the cost was latent and arrived on change. Followup 8 asks whether the
|
|
21
|
+
* "fair" floor should be 55 (the design handoff) or 60 (this code), and editing
|
|
22
|
+
* that number here would have left the other two saying 60 — the Posts badge
|
|
23
|
+
* and the performance widget silently disagreeing with the score ring for every
|
|
24
|
+
* page scoring 55-59.
|
|
25
|
+
*
|
|
26
|
+
* Both now derive from this function, so settling that question is a one-line
|
|
27
|
+
* change with nowhere to miss.
|
|
28
|
+
*/
|
|
16
29
|
export declare function gradeFromScore(score: number): SeoGrade;
|
|
17
30
|
export declare function severityMeta(severity: SeoSeverity): GradeMeta;
|
|
18
31
|
export declare function SeoStatusBadge({ label, tone, }: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../../src/components/seo/primitives.tsx"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAItC,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAIrE,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,CAqBpD;AAED
|
|
1
|
+
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../../src/components/seo/primitives.tsx"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAItC,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAIrE,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,CAqBpD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAKtD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,WAAW,GAAG,SAAS,CAmB7D;AAYD,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,IAAI,GACL,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAA;CACxD,2CAEA;AAED,yDAAyD;AACzD,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,SAAc,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CAoB3F;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,2CAUrD;AAID,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,WAAW,EACX,MAAM,EACN,QAAQ,EACR,SAAc,GACf,EAAE;IACD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,QAAQ,EAAE,SAAS,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,2CAeA;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAkB,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,2CAWpE;AAED,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,KAAK,EACL,WAAW,EACX,MAAM,GACP,EAAE;IACD,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,SAAS,CAAA;CACnB,2CAaA;AAED,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,2CAkB5F;AAID,eAAO,MAAM,UAAU,kQAC0O,CAAA;AAEjQ,eAAO,MAAM,YAAY,wQAC8O,CAAA;AAEvQ,eAAO,MAAM,YAAY,iNACuL,CAAA"}
|
|
@@ -25,7 +25,20 @@ export function gradeMeta(grade) {
|
|
|
25
25
|
};
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
-
/**
|
|
28
|
+
/**
|
|
29
|
+
* Grade band from a numeric 0-100 score — the ONLY place the thresholds live.
|
|
30
|
+
*
|
|
31
|
+
* They were written out three times: here, in the Posts list's score palette,
|
|
32
|
+
* and in the SEO performance badge. All three agreed, so nothing was visibly
|
|
33
|
+
* wrong; the cost was latent and arrived on change. Followup 8 asks whether the
|
|
34
|
+
* "fair" floor should be 55 (the design handoff) or 60 (this code), and editing
|
|
35
|
+
* that number here would have left the other two saying 60 — the Posts badge
|
|
36
|
+
* and the performance widget silently disagreeing with the score ring for every
|
|
37
|
+
* page scoring 55-59.
|
|
38
|
+
*
|
|
39
|
+
* Both now derive from this function, so settling that question is a one-line
|
|
40
|
+
* change with nowhere to miss.
|
|
41
|
+
*/
|
|
29
42
|
export function gradeFromScore(score) {
|
|
30
43
|
if (score >= 80)
|
|
31
44
|
return 'good';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../../src/components/seo/primitives.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAQZ,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACzF,OAAO,EAAE,WAAW,EAAwB,MAAM,sBAAsB,CAAA;AAYxE,MAAM,UAAU,SAAS,CAAC,KAAe;IACvC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM;YACT,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,YAAY,EAAE,CAAA;QACxF,KAAK,MAAM;YACT,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,YAAY,EAAE,CAAA;QACxF,KAAK,MAAM;YACT,OAAO;gBACL,KAAK,EAAE,MAAM;gBACb,IAAI,EAAE,kBAAkB;gBACxB,EAAE,EAAE,mBAAmB;gBACvB,GAAG,EAAE,gBAAgB;aACtB,CAAA;QACH;YACE,OAAO;gBACL,KAAK,EAAE,UAAU;gBACjB,IAAI,EAAE,kBAAkB;gBACxB,EAAE,EAAE,mBAAmB;gBACvB,GAAG,EAAE,gBAAgB;aACtB,CAAA;IACL,CAAC;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../../src/components/seo/primitives.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pages.d.ts","sourceRoot":"","sources":["../../src/views/Pages.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Pages.d.ts","sourceRoot":"","sources":["../../src/views/Pages.tsx"],"names":[],"mappings":"AA0BA,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC;AA0ED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,EAAE,UAAU,EAAE,EAAE,UAAU,2CA8e/C"}
|
package/dist/views/Pages.js
CHANGED
|
@@ -6,6 +6,7 @@ import { toast } from 'sonner';
|
|
|
6
6
|
import { sortByRelevance, toggleSort } from '../lib/search.js';
|
|
7
7
|
import { useApiData } from '../lib/useApiData.js';
|
|
8
8
|
import { cmsApi } from '../lib/api.js';
|
|
9
|
+
import { gradeFromScore, gradeMeta } from '../components/seo/primitives.js';
|
|
9
10
|
import { FolderTree } from '../components/FolderTree.js';
|
|
10
11
|
const COLOR_PALETTE = [
|
|
11
12
|
{ bg: 'bg-chart-1/15', text: 'text-chart-1' },
|
|
@@ -46,7 +47,9 @@ function textValue(value) {
|
|
|
46
47
|
return String(value ?? '');
|
|
47
48
|
}
|
|
48
49
|
function SeoScoreBadge({ score }) {
|
|
49
|
-
|
|
50
|
+
// Bands and colour both from the SEO primitives — this restated 80/60, which
|
|
51
|
+
// is the same score the SEO tab grades, so the two could drift apart.
|
|
52
|
+
const color = gradeMeta(gradeFromScore(score)).dot;
|
|
50
53
|
return (_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: `h-2.5 w-2.5 rounded-full ${color}` }), _jsx("span", { className: "text-muted-foreground text-xs", children: score })] }));
|
|
51
54
|
}
|
|
52
55
|
function FolderBadge({ name }) {
|
package/dist/views/Pages.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pages.js","sourceRoot":"","sources":["../../src/views/Pages.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Pages.js","sourceRoot":"","sources":["../../src/views/Pages.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.97.
|
|
3
|
+
"version": "0.97.2",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -98,16 +98,16 @@
|
|
|
98
98
|
"tailwindcss": "^4.0.0",
|
|
99
99
|
"typescript": "^5.7.0",
|
|
100
100
|
"vitest": "^4.1.0",
|
|
101
|
-
"@prenta/
|
|
102
|
-
"@prenta/core": "0.122.0",
|
|
101
|
+
"@prenta/core": "0.123.0",
|
|
103
102
|
"@prenta/plugin-ai": "0.6.0",
|
|
103
|
+
"@prenta/component-blocks": "0.3.0",
|
|
104
104
|
"@prenta/plugin-blocks": "0.2.0",
|
|
105
105
|
"@prenta/plugin-commerce": "0.2.0",
|
|
106
106
|
"@prenta/plugin-forms": "0.1.0",
|
|
107
107
|
"@prenta/plugin-media": "0.2.0",
|
|
108
|
-
"@prenta/plugin-navigation": "0.3.0",
|
|
109
108
|
"@prenta/plugin-seo": "0.1.0",
|
|
110
|
-
"@prenta/
|
|
109
|
+
"@prenta/plugin-navigation": "0.3.0",
|
|
110
|
+
"@prenta/sections-react": "0.17.2"
|
|
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",
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { readFileSync, readdirSync } from 'node:fs'
|
|
2
|
+
import { join, sep } from 'node:path'
|
|
3
|
+
import { fileURLToPath } from 'node:url'
|
|
4
|
+
import { describe, expect, it } from 'vitest'
|
|
5
|
+
|
|
6
|
+
import { gradeFromScore, gradeMeta } from '../../components/seo/primitives.js'
|
|
7
|
+
import { seoScorePalette } from '../../components/posts/badges.js'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The SEO score bands live in exactly one function.
|
|
11
|
+
*
|
|
12
|
+
* They were written out three times — `gradeFromScore`, the Posts list's score
|
|
13
|
+
* palette, and the SEO performance badge — plus a fourth mapping from palette
|
|
14
|
+
* key to token class inside the score indicator. All of them agreed, so
|
|
15
|
+
* nothing looked wrong; the cost was latent.
|
|
16
|
+
*
|
|
17
|
+
* It would have arrived with followup 8, which asks whether the "fair" floor
|
|
18
|
+
* should be 55 (the design handoff) or 60 (this code). Editing that number in
|
|
19
|
+
* `gradeFromScore` would have left the other surfaces on 60, so a page scoring
|
|
20
|
+
* 55-59 would show a green-ish ring beside an orange Posts badge.
|
|
21
|
+
*/
|
|
22
|
+
describe('SEO score bands are defined once', () => {
|
|
23
|
+
const PKG = fileURLToPath(new URL('../../../', import.meta.url))
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Files allowed to name their own thresholds, and why. Anything not listed
|
|
27
|
+
* here that compares a score against a band edge is grading the SEO score
|
|
28
|
+
* and must use `gradeFromScore`.
|
|
29
|
+
*/
|
|
30
|
+
const EXEMPT = [
|
|
31
|
+
// The one function that defines the SEO bands.
|
|
32
|
+
'components/seo/primitives.tsx',
|
|
33
|
+
// A DESIGN score, not the SEO score — its own metric, its own bands
|
|
34
|
+
// (80/65/50). Sharing thresholds here would be a false economy.
|
|
35
|
+
'views/page-builder/DesignScore.tsx',
|
|
36
|
+
// MEDIA SEO completeness (alt text, filenames), graded 80/30 because the
|
|
37
|
+
// population and the remedy are different from a page's SEO score.
|
|
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
|
+
]
|
|
47
|
+
|
|
48
|
+
it('no other component restates a threshold', () => {
|
|
49
|
+
const offenders: string[] = []
|
|
50
|
+
const walk = (dir: string) => {
|
|
51
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
52
|
+
const full = join(dir, entry.name)
|
|
53
|
+
if (entry.isDirectory()) {
|
|
54
|
+
walk(full)
|
|
55
|
+
continue
|
|
56
|
+
}
|
|
57
|
+
if (!/\.tsx?$/.test(entry.name) || /\.test\.tsx?$/.test(entry.name)) continue
|
|
58
|
+
const rel = full.slice(PKG.length).replaceAll(sep, '/')
|
|
59
|
+
if (EXEMPT.some((e) => rel.endsWith(e))) continue
|
|
60
|
+
const src = readFileSync(full, 'utf8')
|
|
61
|
+
// A score compared against a band edge is the shape being banned.
|
|
62
|
+
if (/\bscore\s*>=?\s*(80|60|55)\b/.test(src)) offenders.push(rel)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
walk(join(PKG, 'src'))
|
|
66
|
+
expect(offenders, `score thresholds restated in: ${offenders.join(', ')}`).toEqual([])
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Pinned so the refactor is provably behaviour-preserving, and so changing a
|
|
71
|
+
* band is a deliberate act that updates this table rather than a silent
|
|
72
|
+
* shift. 59/60 and 79/80 are the edges; 0 is the "never audited" case.
|
|
73
|
+
*/
|
|
74
|
+
it.each([
|
|
75
|
+
[0, 'critical', 'gray'],
|
|
76
|
+
[1, 'poor', 'red'],
|
|
77
|
+
[59, 'poor', 'red'],
|
|
78
|
+
[60, 'fair', 'orange'],
|
|
79
|
+
[79, 'fair', 'orange'],
|
|
80
|
+
[80, 'good', 'green'],
|
|
81
|
+
[100, 'good', 'green'],
|
|
82
|
+
])('score %i is %s and paints %s', (score, grade, tagColor) => {
|
|
83
|
+
expect(gradeFromScore(score as number)).toBe(grade)
|
|
84
|
+
expect(seoScorePalette(score as number)).toBe(tagColor)
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
it('an unscored post is grey rather than a failure', () => {
|
|
88
|
+
expect(seoScorePalette(null)).toBe('gray')
|
|
89
|
+
expect(seoScorePalette(Number.NaN)).toBe('gray')
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
it('every grade has a token class, so no surface has to invent one', () => {
|
|
93
|
+
for (const grade of ['good', 'fair', 'poor', 'critical'] as const) {
|
|
94
|
+
const meta = gradeMeta(grade)
|
|
95
|
+
expect(meta.dot, grade).toMatch(/^bg-/)
|
|
96
|
+
expect(meta.text, grade).toMatch(/^text-/)
|
|
97
|
+
}
|
|
98
|
+
})
|
|
99
|
+
})
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
ChevronRight,
|
|
11
11
|
} from 'lucide-react'
|
|
12
12
|
import { useState } from 'react'
|
|
13
|
+
import { gradeFromScore, gradeMeta } from './seo/primitives.js'
|
|
13
14
|
import { useApiData } from '../lib/useApiData.js'
|
|
14
15
|
|
|
15
16
|
interface SEOSummary {
|
|
@@ -22,9 +23,13 @@ interface SEOSummary {
|
|
|
22
23
|
topContent: { id: string; title: string; collection: string; score: number }[]
|
|
23
24
|
}
|
|
24
25
|
|
|
26
|
+
/**
|
|
27
|
+
* The bands and their colours both come from the SEO primitives — this used to
|
|
28
|
+
* restate 80/60 twice on adjacent lines, and `gradeMeta` already returns
|
|
29
|
+
* exactly the token classes it was hand-writing.
|
|
30
|
+
*/
|
|
25
31
|
function ScoreBadge({ score }: { score: number }) {
|
|
26
|
-
const
|
|
27
|
-
const bg = score >= 80 ? 'bg-success/10' : score >= 60 ? 'bg-warning/10' : 'bg-destructive/10'
|
|
32
|
+
const { text: color, bg } = gradeMeta(gradeFromScore(score))
|
|
28
33
|
return (
|
|
29
34
|
<span
|
|
30
35
|
className={`inline-flex h-9 w-9 items-center justify-center rounded-full text-sm font-medium ${color} ${bg}`}
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
import type { ReactNode } from 'react'
|
|
4
4
|
import { StatusBadge, type StatusBadgeTone } from '../ui/StatusBadge.js'
|
|
5
5
|
import type { PostStatus } from '../../lib/posts-service.js'
|
|
6
|
+
import type { SeoGrade } from '../../lib/seo-service.js'
|
|
7
|
+
import { gradeFromScore, gradeMeta } from '../seo/primitives.js'
|
|
6
8
|
|
|
7
9
|
/**
|
|
8
10
|
* Shared status / type / SEO indicators for the Posts admin area.
|
|
@@ -107,12 +109,27 @@ export function PostTypeBadge({
|
|
|
107
109
|
return <span className={className}>{label}</span>
|
|
108
110
|
}
|
|
109
111
|
|
|
110
|
-
|
|
112
|
+
/**
|
|
113
|
+
* Palette key for a post's SEO score.
|
|
114
|
+
*
|
|
115
|
+
* The bands come from `gradeFromScore` rather than being restated here — this
|
|
116
|
+
* used to carry its own copy of 80/60/1, which agreed with the canonical one
|
|
117
|
+
* only for as long as nobody changed either.
|
|
118
|
+
*
|
|
119
|
+
* `critical` maps to gray, not red: a score of exactly 0 means "never audited"
|
|
120
|
+
* in this list, and colouring that as a failure would report a problem the
|
|
121
|
+
* page may not have. A null score is the same case and takes the same colour.
|
|
122
|
+
*/
|
|
123
|
+
const GRADE_TAG_COLOR: Record<SeoGrade, TagColorKey> = {
|
|
124
|
+
good: 'green',
|
|
125
|
+
fair: 'orange',
|
|
126
|
+
poor: 'red',
|
|
127
|
+
critical: 'gray',
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export function seoScorePalette(score: number | null): TagColorKey {
|
|
111
131
|
if (score === null || Number.isNaN(score)) return 'gray'
|
|
112
|
-
|
|
113
|
-
if (score >= 60) return 'orange'
|
|
114
|
-
if (score >= 1) return 'red'
|
|
115
|
-
return 'gray'
|
|
132
|
+
return GRADE_TAG_COLOR[gradeFromScore(score)]
|
|
116
133
|
}
|
|
117
134
|
|
|
118
135
|
export function SeoScoreIndicator({ score }: { score: number | null }) {
|
|
@@ -126,17 +143,17 @@ export function SeoScoreIndicator({ score }: { score: number | null }) {
|
|
|
126
143
|
</span>
|
|
127
144
|
)
|
|
128
145
|
}
|
|
146
|
+
// The dot's semantic colour comes from `gradeMeta`, not from a third mapping
|
|
147
|
+
// of colour key -> token. That chain was `score -> palette key -> class`, and
|
|
148
|
+
// its final hop treated everything that was not green or orange as
|
|
149
|
+
// destructive — including the `gray` a zero score resolves to, so the key
|
|
150
|
+
// said gray while the dot rendered red. Deriving from the grade removes the
|
|
151
|
+
// hop and the disagreement; the rendered colour is unchanged for every score.
|
|
129
152
|
return (
|
|
130
153
|
<span className="text-foreground inline-flex items-center gap-1.5 text-xs">
|
|
131
154
|
<span
|
|
132
155
|
aria-hidden
|
|
133
|
-
className={`h-2 w-2 rounded-full ${
|
|
134
|
-
colorKey === 'green'
|
|
135
|
-
? 'bg-success'
|
|
136
|
-
: colorKey === 'orange'
|
|
137
|
-
? 'bg-warning'
|
|
138
|
-
: 'bg-destructive'
|
|
139
|
-
}`}
|
|
156
|
+
className={`h-2 w-2 rounded-full ${gradeMeta(gradeFromScore(score)).dot}`}
|
|
140
157
|
/>
|
|
141
158
|
<span className="tabular-nums">{score}</span>
|
|
142
159
|
</span>
|
|
@@ -43,7 +43,20 @@ export function gradeMeta(grade: SeoGrade): GradeMeta {
|
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
/**
|
|
46
|
+
/**
|
|
47
|
+
* Grade band from a numeric 0-100 score — the ONLY place the thresholds live.
|
|
48
|
+
*
|
|
49
|
+
* They were written out three times: here, in the Posts list's score palette,
|
|
50
|
+
* and in the SEO performance badge. All three agreed, so nothing was visibly
|
|
51
|
+
* wrong; the cost was latent and arrived on change. Followup 8 asks whether the
|
|
52
|
+
* "fair" floor should be 55 (the design handoff) or 60 (this code), and editing
|
|
53
|
+
* that number here would have left the other two saying 60 — the Posts badge
|
|
54
|
+
* and the performance widget silently disagreeing with the score ring for every
|
|
55
|
+
* page scoring 55-59.
|
|
56
|
+
*
|
|
57
|
+
* Both now derive from this function, so settling that question is a one-line
|
|
58
|
+
* change with nowhere to miss.
|
|
59
|
+
*/
|
|
47
60
|
export function gradeFromScore(score: number): SeoGrade {
|
|
48
61
|
if (score >= 80) return 'good'
|
|
49
62
|
if (score >= 60) return 'fair'
|
package/src/views/Pages.tsx
CHANGED
|
@@ -19,6 +19,7 @@ import { toast } from 'sonner'
|
|
|
19
19
|
import { sortByRelevance, type SortConfig, toggleSort } from '../lib/search.js'
|
|
20
20
|
import { useApiData } from '../lib/useApiData.js'
|
|
21
21
|
import { cmsApi } from '../lib/api.js'
|
|
22
|
+
import { gradeFromScore, gradeMeta } from '../components/seo/primitives.js'
|
|
22
23
|
import { FolderTree, type FolderSelection } from '../components/FolderTree.js'
|
|
23
24
|
|
|
24
25
|
type PageSortKey = 'title' | 'author' | 'template' | 'status' | 'date'
|
|
@@ -67,7 +68,9 @@ function textValue(value: unknown): string {
|
|
|
67
68
|
}
|
|
68
69
|
|
|
69
70
|
function SeoScoreBadge({ score }: { score: number }) {
|
|
70
|
-
|
|
71
|
+
// Bands and colour both from the SEO primitives — this restated 80/60, which
|
|
72
|
+
// is the same score the SEO tab grades, so the two could drift apart.
|
|
73
|
+
const color = gradeMeta(gradeFromScore(score)).dot
|
|
71
74
|
return (
|
|
72
75
|
<div className="flex items-center gap-1.5">
|
|
73
76
|
<span className={`h-2.5 w-2.5 rounded-full ${color}`} />
|