@consilioweb/payload-seo-analyzer 1.9.0 → 1.10.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/README.md +42 -0
- package/dist/client.cjs +655 -85
- package/dist/client.js +655 -85
- package/dist/index.cjs +1064 -211
- package/dist/index.d.cts +111 -3
- package/dist/index.d.ts +111 -3
- package/dist/index.js +1059 -212
- package/package.json +1 -1
package/dist/client.js
CHANGED
|
@@ -15904,7 +15904,7 @@ function getSchemaTypes(t) {
|
|
|
15904
15904
|
}
|
|
15905
15905
|
};
|
|
15906
15906
|
}
|
|
15907
|
-
function
|
|
15907
|
+
function buildJsonLd2(type, values) {
|
|
15908
15908
|
switch (type) {
|
|
15909
15909
|
case "LocalBusiness": {
|
|
15910
15910
|
const result = {
|
|
@@ -16185,7 +16185,7 @@ function SchemaBuilderView() {
|
|
|
16185
16185
|
[arrayName]: (prev[arrayName] || []).filter((_, i) => i !== index)
|
|
16186
16186
|
}));
|
|
16187
16187
|
}, []);
|
|
16188
|
-
const jsonLd = useMemo(() =>
|
|
16188
|
+
const jsonLd = useMemo(() => buildJsonLd2(selectedType, values), [selectedType, values]);
|
|
16189
16189
|
const jsonString = useMemo(() => JSON.stringify(jsonLd, null, 2), [jsonLd]);
|
|
16190
16190
|
const scriptTag = useMemo(
|
|
16191
16191
|
() => `<script type="application/ld+json">
|
|
@@ -16962,6 +16962,573 @@ function GscPanel({ locale }) {
|
|
|
16962
16962
|
] })
|
|
16963
16963
|
] });
|
|
16964
16964
|
}
|
|
16965
|
+
var C6 = {
|
|
16966
|
+
text: "var(--theme-text, #1a1a1a)",
|
|
16967
|
+
sub: "var(--theme-elevation-600, #6b7280)",
|
|
16968
|
+
card: "var(--theme-elevation-50, #f9fafb)",
|
|
16969
|
+
border: "var(--theme-elevation-200, #e5e7eb)",
|
|
16970
|
+
green: "#22c55e",
|
|
16971
|
+
red: "#ef4444",
|
|
16972
|
+
blue: "#3b82f6"
|
|
16973
|
+
};
|
|
16974
|
+
var S3 = {
|
|
16975
|
+
fr: {
|
|
16976
|
+
title: "Suivi de positions (rank tracking)",
|
|
16977
|
+
subtitle: "Historique quotidien des positions Google (via Search Console) et mouvements dans le temps.",
|
|
16978
|
+
needGsc: "Connectez Google Search Console ci-dessus pour activer le suivi de positions.",
|
|
16979
|
+
snapshot: "Relever maintenant",
|
|
16980
|
+
snapshotting: "Relev\xE9 en cours\u2026",
|
|
16981
|
+
noData: "Pas encore de donn\xE9es. Le relev\xE9 tourne automatiquement chaque jour ; cliquez \xAB Relever maintenant \xBB pour d\xE9marrer.",
|
|
16982
|
+
lastSnapshot: "Dernier relev\xE9",
|
|
16983
|
+
query: "Requ\xEAte",
|
|
16984
|
+
position: "Position",
|
|
16985
|
+
change: "\xC9volution",
|
|
16986
|
+
clicks: "Clics",
|
|
16987
|
+
impressions: "Impr.",
|
|
16988
|
+
stable: "stable",
|
|
16989
|
+
newQ: "nouveau",
|
|
16990
|
+
countLabel: "requ\xEAtes suivies"
|
|
16991
|
+
},
|
|
16992
|
+
en: {
|
|
16993
|
+
title: "Rank tracking",
|
|
16994
|
+
subtitle: "Daily Google position history (via Search Console) and movement over time.",
|
|
16995
|
+
needGsc: "Connect Google Search Console above to enable rank tracking.",
|
|
16996
|
+
snapshot: "Snapshot now",
|
|
16997
|
+
snapshotting: "Snapshotting\u2026",
|
|
16998
|
+
noData: 'No data yet. The snapshot runs automatically every day; click "Snapshot now" to start.',
|
|
16999
|
+
lastSnapshot: "Last snapshot",
|
|
17000
|
+
query: "Query",
|
|
17001
|
+
position: "Position",
|
|
17002
|
+
change: "Change",
|
|
17003
|
+
clicks: "Clicks",
|
|
17004
|
+
impressions: "Impr.",
|
|
17005
|
+
stable: "stable",
|
|
17006
|
+
newQ: "new",
|
|
17007
|
+
countLabel: "tracked queries"
|
|
17008
|
+
}
|
|
17009
|
+
};
|
|
17010
|
+
function RankTrackingPanel({ locale }) {
|
|
17011
|
+
const s = S3[locale] ?? S3.fr;
|
|
17012
|
+
const [movers, setMovers] = useState(null);
|
|
17013
|
+
const [lastSnapshot, setLastSnapshot] = useState(null);
|
|
17014
|
+
const [loading, setLoading] = useState(true);
|
|
17015
|
+
const [busy, setBusy] = useState(false);
|
|
17016
|
+
const [error, setError] = useState(null);
|
|
17017
|
+
const [notConnected, setNotConnected] = useState(false);
|
|
17018
|
+
const load = useCallback(async () => {
|
|
17019
|
+
setLoading(true);
|
|
17020
|
+
setError(null);
|
|
17021
|
+
try {
|
|
17022
|
+
const res = await fetch("/api/seo-plugin/rank-history", { credentials: "include", cache: "no-store" });
|
|
17023
|
+
if (res.status === 403 || res.status === 409) {
|
|
17024
|
+
setNotConnected(true);
|
|
17025
|
+
setMovers(null);
|
|
17026
|
+
return;
|
|
17027
|
+
}
|
|
17028
|
+
const json = await res.json();
|
|
17029
|
+
if (!res.ok) {
|
|
17030
|
+
setError(json.error || `Error ${res.status}`);
|
|
17031
|
+
return;
|
|
17032
|
+
}
|
|
17033
|
+
setMovers(json.movers || []);
|
|
17034
|
+
setLastSnapshot(json.lastSnapshot || null);
|
|
17035
|
+
} catch (e) {
|
|
17036
|
+
setError(e instanceof Error ? e.message : "Network error");
|
|
17037
|
+
} finally {
|
|
17038
|
+
setLoading(false);
|
|
17039
|
+
}
|
|
17040
|
+
}, []);
|
|
17041
|
+
useEffect(() => {
|
|
17042
|
+
void load();
|
|
17043
|
+
}, [load]);
|
|
17044
|
+
const snapshotNow = async () => {
|
|
17045
|
+
setBusy(true);
|
|
17046
|
+
setError(null);
|
|
17047
|
+
try {
|
|
17048
|
+
const res = await fetch("/api/seo-plugin/rank-snapshot", { method: "POST", credentials: "include" });
|
|
17049
|
+
const json = await res.json();
|
|
17050
|
+
if (res.status === 409) {
|
|
17051
|
+
setNotConnected(true);
|
|
17052
|
+
return;
|
|
17053
|
+
}
|
|
17054
|
+
if (!res.ok) {
|
|
17055
|
+
setError(json.error || json.reason || `Error ${res.status}`);
|
|
17056
|
+
return;
|
|
17057
|
+
}
|
|
17058
|
+
await load();
|
|
17059
|
+
} catch (e) {
|
|
17060
|
+
setError(e instanceof Error ? e.message : "Network error");
|
|
17061
|
+
} finally {
|
|
17062
|
+
setBusy(false);
|
|
17063
|
+
}
|
|
17064
|
+
};
|
|
17065
|
+
const card = {
|
|
17066
|
+
padding: 16,
|
|
17067
|
+
borderRadius: 12,
|
|
17068
|
+
border: `1px solid ${C6.border}`,
|
|
17069
|
+
backgroundColor: C6.card,
|
|
17070
|
+
marginBottom: 20
|
|
17071
|
+
};
|
|
17072
|
+
const btn = {
|
|
17073
|
+
padding: "8px 12px",
|
|
17074
|
+
borderRadius: 8,
|
|
17075
|
+
border: `1px solid ${C6.blue}`,
|
|
17076
|
+
backgroundColor: C6.blue,
|
|
17077
|
+
color: "#fff",
|
|
17078
|
+
fontSize: 12,
|
|
17079
|
+
fontWeight: 700,
|
|
17080
|
+
cursor: busy ? "wait" : "pointer",
|
|
17081
|
+
opacity: busy ? 0.6 : 1
|
|
17082
|
+
};
|
|
17083
|
+
const renderDelta = (m) => {
|
|
17084
|
+
if (m.previousPosition === null) {
|
|
17085
|
+
return /* @__PURE__ */ jsx("span", { style: { color: C6.sub, fontSize: 11 }, children: s.newQ });
|
|
17086
|
+
}
|
|
17087
|
+
if (Math.abs(m.delta) < 0.1) {
|
|
17088
|
+
return /* @__PURE__ */ jsxs("span", { style: { color: C6.sub, fontSize: 11 }, children: [
|
|
17089
|
+
"\u2014 ",
|
|
17090
|
+
s.stable
|
|
17091
|
+
] });
|
|
17092
|
+
}
|
|
17093
|
+
const up = m.delta > 0;
|
|
17094
|
+
return /* @__PURE__ */ jsxs("span", { style: { color: up ? C6.green : C6.red, fontWeight: 700, fontSize: 12 }, children: [
|
|
17095
|
+
up ? "\u25B2" : "\u25BC",
|
|
17096
|
+
" ",
|
|
17097
|
+
Math.abs(m.delta).toFixed(1)
|
|
17098
|
+
] });
|
|
17099
|
+
};
|
|
17100
|
+
return /* @__PURE__ */ jsxs("div", { style: card, children: [
|
|
17101
|
+
/* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: 8, flexWrap: "wrap" }, children: [
|
|
17102
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
17103
|
+
/* @__PURE__ */ jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C6.text }, children: s.title }),
|
|
17104
|
+
/* @__PURE__ */ jsx("div", { style: { fontSize: 12, color: C6.sub, marginTop: 2 }, children: s.subtitle })
|
|
17105
|
+
] }),
|
|
17106
|
+
!notConnected && /* @__PURE__ */ jsx("button", { type: "button", onClick: snapshotNow, disabled: busy, style: btn, children: busy ? s.snapshotting : s.snapshot })
|
|
17107
|
+
] }),
|
|
17108
|
+
error && /* @__PURE__ */ jsx("div", { style: { color: C6.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
|
|
17109
|
+
notConnected && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C6.sub }, children: s.needGsc }),
|
|
17110
|
+
!notConnected && /* @__PURE__ */ jsxs("div", { style: { marginTop: 12 }, children: [
|
|
17111
|
+
lastSnapshot && /* @__PURE__ */ jsxs("div", { style: { fontSize: 11, color: C6.sub, marginBottom: 8 }, children: [
|
|
17112
|
+
s.lastSnapshot,
|
|
17113
|
+
": ",
|
|
17114
|
+
new Date(lastSnapshot).toLocaleString(locale),
|
|
17115
|
+
movers ? ` \xB7 ${movers.length} ${s.countLabel}` : ""
|
|
17116
|
+
] }),
|
|
17117
|
+
loading && !movers && /* @__PURE__ */ jsx("div", { style: { fontSize: 13, color: C6.sub }, children: "\u2026" }),
|
|
17118
|
+
movers && movers.length === 0 && /* @__PURE__ */ jsx("div", { style: { fontSize: 13, color: C6.sub }, children: s.noData }),
|
|
17119
|
+
movers && movers.length > 0 && /* @__PURE__ */ jsx("div", { style: { overflowX: "auto" }, children: /* @__PURE__ */ jsxs("table", { style: { width: "100%", borderCollapse: "collapse", fontSize: 12 }, children: [
|
|
17120
|
+
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { style: { textAlign: "left", color: C6.sub }, children: [
|
|
17121
|
+
/* @__PURE__ */ jsx("th", { style: { padding: "6px 8px" }, children: s.query }),
|
|
17122
|
+
/* @__PURE__ */ jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.position }),
|
|
17123
|
+
/* @__PURE__ */ jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.change }),
|
|
17124
|
+
/* @__PURE__ */ jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.clicks }),
|
|
17125
|
+
/* @__PURE__ */ jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.impressions })
|
|
17126
|
+
] }) }),
|
|
17127
|
+
/* @__PURE__ */ jsx("tbody", { children: movers.slice(0, 100).map((m, i) => /* @__PURE__ */ jsxs("tr", { style: { borderTop: `1px solid ${C6.border}`, color: C6.text }, children: [
|
|
17128
|
+
/* @__PURE__ */ jsx("td", { style: { padding: "6px 8px", maxWidth: 320, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: m.query }),
|
|
17129
|
+
/* @__PURE__ */ jsx("td", { style: { padding: "6px 8px", textAlign: "right", fontWeight: 700 }, children: m.position.toFixed(1) }),
|
|
17130
|
+
/* @__PURE__ */ jsx("td", { style: { padding: "6px 8px", textAlign: "right" }, children: renderDelta(m) }),
|
|
17131
|
+
/* @__PURE__ */ jsx("td", { style: { padding: "6px 8px", textAlign: "right" }, children: m.clicks }),
|
|
17132
|
+
/* @__PURE__ */ jsx("td", { style: { padding: "6px 8px", textAlign: "right" }, children: m.impressions })
|
|
17133
|
+
] }, i)) })
|
|
17134
|
+
] }) })
|
|
17135
|
+
] })
|
|
17136
|
+
] });
|
|
17137
|
+
}
|
|
17138
|
+
var C7 = {
|
|
17139
|
+
text: "var(--theme-text, #1a1a1a)",
|
|
17140
|
+
sub: "var(--theme-elevation-600, #6b7280)",
|
|
17141
|
+
card: "var(--theme-elevation-50, #f9fafb)",
|
|
17142
|
+
border: "var(--theme-elevation-200, #e5e7eb)",
|
|
17143
|
+
green: "#22c55e",
|
|
17144
|
+
red: "#ef4444",
|
|
17145
|
+
amber: "#f59e0b",
|
|
17146
|
+
blue: "#3b82f6"
|
|
17147
|
+
};
|
|
17148
|
+
var S4 = {
|
|
17149
|
+
fr: {
|
|
17150
|
+
title: "Monitoring & alertes",
|
|
17151
|
+
subtitle: "Digest p\xE9riodique : r\xE9gressions de score, nouveaux 404, chutes de position (webhook / email).",
|
|
17152
|
+
notConfigured: "Aucun canal configur\xE9. D\xE9finissez SEO_ALERT_WEBHOOK_URL et/ou SEO_ALERT_EMAIL c\xF4t\xE9 serveur, puis activez features.alerts.",
|
|
17153
|
+
webhook: "Webhook",
|
|
17154
|
+
email: "Email",
|
|
17155
|
+
configured: "configur\xE9",
|
|
17156
|
+
missing: "absent",
|
|
17157
|
+
preview: "Aper\xE7u",
|
|
17158
|
+
sendNow: "Envoyer maintenant",
|
|
17159
|
+
sending: "Envoi\u2026",
|
|
17160
|
+
loading: "Chargement\u2026",
|
|
17161
|
+
noIssues: "Aucun probl\xE8me d\xE9tect\xE9 sur la p\xE9riode. \u{1F389}",
|
|
17162
|
+
scoreReg: "R\xE9gressions de score",
|
|
17163
|
+
notFound: "Nouveaux 404",
|
|
17164
|
+
rankDrops: "Chutes de position",
|
|
17165
|
+
sent: "Digest envoy\xE9",
|
|
17166
|
+
nothingToSend: "Rien \xE0 envoyer (aucun probl\xE8me).",
|
|
17167
|
+
issues: "probl\xE8me(s)"
|
|
17168
|
+
},
|
|
17169
|
+
en: {
|
|
17170
|
+
title: "Monitoring & alerts",
|
|
17171
|
+
subtitle: "Periodic digest: score regressions, new 404s, ranking drops (webhook / email).",
|
|
17172
|
+
notConfigured: "No channel configured. Set SEO_ALERT_WEBHOOK_URL and/or SEO_ALERT_EMAIL on the server, then enable features.alerts.",
|
|
17173
|
+
webhook: "Webhook",
|
|
17174
|
+
email: "Email",
|
|
17175
|
+
configured: "configured",
|
|
17176
|
+
missing: "missing",
|
|
17177
|
+
preview: "Preview",
|
|
17178
|
+
sendNow: "Send now",
|
|
17179
|
+
sending: "Sending\u2026",
|
|
17180
|
+
loading: "Loading\u2026",
|
|
17181
|
+
noIssues: "No issues for the period. \u{1F389}",
|
|
17182
|
+
scoreReg: "Score regressions",
|
|
17183
|
+
notFound: "New 404s",
|
|
17184
|
+
rankDrops: "Ranking drops",
|
|
17185
|
+
sent: "Digest sent",
|
|
17186
|
+
nothingToSend: "Nothing to send (no issues).",
|
|
17187
|
+
issues: "issue(s)"
|
|
17188
|
+
}
|
|
17189
|
+
};
|
|
17190
|
+
function AlertsPanel({ locale }) {
|
|
17191
|
+
const s = S4[locale] ?? S4.fr;
|
|
17192
|
+
const [digest, setDigest] = useState(null);
|
|
17193
|
+
const [config, setConfig] = useState(null);
|
|
17194
|
+
const [loading, setLoading] = useState(true);
|
|
17195
|
+
const [busy, setBusy] = useState(false);
|
|
17196
|
+
const [error, setError] = useState(null);
|
|
17197
|
+
const [notice, setNotice] = useState(null);
|
|
17198
|
+
const load = useCallback(async () => {
|
|
17199
|
+
setLoading(true);
|
|
17200
|
+
setError(null);
|
|
17201
|
+
try {
|
|
17202
|
+
const res = await fetch("/api/seo-plugin/alerts-digest", { credentials: "include", cache: "no-store" });
|
|
17203
|
+
if (res.status === 404 || res.status === 403) {
|
|
17204
|
+
setConfig({ webhookConfigured: false, emailConfigured: false, scoreDrop: 0, positionDrop: 0, windowHours: 0 });
|
|
17205
|
+
setDigest(null);
|
|
17206
|
+
return;
|
|
17207
|
+
}
|
|
17208
|
+
const json = await res.json();
|
|
17209
|
+
if (!res.ok) {
|
|
17210
|
+
setError(json.error || `Error ${res.status}`);
|
|
17211
|
+
return;
|
|
17212
|
+
}
|
|
17213
|
+
setDigest(json.digest);
|
|
17214
|
+
setConfig(json.config);
|
|
17215
|
+
} catch (e) {
|
|
17216
|
+
setError(e instanceof Error ? e.message : "Network error");
|
|
17217
|
+
} finally {
|
|
17218
|
+
setLoading(false);
|
|
17219
|
+
}
|
|
17220
|
+
}, []);
|
|
17221
|
+
useEffect(() => {
|
|
17222
|
+
void load();
|
|
17223
|
+
}, [load]);
|
|
17224
|
+
const sendNow = async () => {
|
|
17225
|
+
setBusy(true);
|
|
17226
|
+
setError(null);
|
|
17227
|
+
setNotice(null);
|
|
17228
|
+
try {
|
|
17229
|
+
const res = await fetch("/api/seo-plugin/alerts-run", { method: "POST", credentials: "include" });
|
|
17230
|
+
const json = await res.json();
|
|
17231
|
+
if (!res.ok) {
|
|
17232
|
+
setError(json.error || `Error ${res.status}`);
|
|
17233
|
+
return;
|
|
17234
|
+
}
|
|
17235
|
+
setNotice(json.delivery?.sent ? s.sent : s.nothingToSend);
|
|
17236
|
+
if (json.digest) setDigest(json.digest);
|
|
17237
|
+
} catch (e) {
|
|
17238
|
+
setError(e instanceof Error ? e.message : "Network error");
|
|
17239
|
+
} finally {
|
|
17240
|
+
setBusy(false);
|
|
17241
|
+
}
|
|
17242
|
+
};
|
|
17243
|
+
const card = {
|
|
17244
|
+
padding: 16,
|
|
17245
|
+
borderRadius: 12,
|
|
17246
|
+
border: `1px solid ${C7.border}`,
|
|
17247
|
+
backgroundColor: C7.card,
|
|
17248
|
+
marginBottom: 20
|
|
17249
|
+
};
|
|
17250
|
+
const btn = {
|
|
17251
|
+
padding: "8px 12px",
|
|
17252
|
+
borderRadius: 8,
|
|
17253
|
+
border: `1px solid ${C7.blue}`,
|
|
17254
|
+
backgroundColor: C7.blue,
|
|
17255
|
+
color: "#fff",
|
|
17256
|
+
fontSize: 12,
|
|
17257
|
+
fontWeight: 700,
|
|
17258
|
+
cursor: busy ? "wait" : "pointer",
|
|
17259
|
+
opacity: busy ? 0.6 : 1
|
|
17260
|
+
};
|
|
17261
|
+
const chip = (ok, label) => ({
|
|
17262
|
+
fontSize: 11,
|
|
17263
|
+
fontWeight: 700,
|
|
17264
|
+
padding: "3px 8px",
|
|
17265
|
+
borderRadius: 999,
|
|
17266
|
+
color: "#fff",
|
|
17267
|
+
backgroundColor: ok ? C7.green : C7.sub,
|
|
17268
|
+
marginRight: 6
|
|
17269
|
+
});
|
|
17270
|
+
const hasChannel = config && (config.webhookConfigured || config.emailConfigured);
|
|
17271
|
+
const list = (title, rows) => rows.length ? /* @__PURE__ */ jsxs("div", { style: { marginTop: 10 }, children: [
|
|
17272
|
+
/* @__PURE__ */ jsxs("div", { style: { fontSize: 12, fontWeight: 700, color: C7.text, marginBottom: 4 }, children: [
|
|
17273
|
+
title,
|
|
17274
|
+
" ",
|
|
17275
|
+
/* @__PURE__ */ jsxs("span", { style: { color: C7.amber }, children: [
|
|
17276
|
+
"(",
|
|
17277
|
+
rows.length,
|
|
17278
|
+
")"
|
|
17279
|
+
] })
|
|
17280
|
+
] }),
|
|
17281
|
+
/* @__PURE__ */ jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 12, color: C7.sub, lineHeight: 1.6 }, children: rows.slice(0, 8).map((r, i) => /* @__PURE__ */ jsx("li", { children: r }, i)) })
|
|
17282
|
+
] }) : null;
|
|
17283
|
+
return /* @__PURE__ */ jsxs("div", { style: card, children: [
|
|
17284
|
+
/* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: 8, flexWrap: "wrap" }, children: [
|
|
17285
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
17286
|
+
/* @__PURE__ */ jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C7.text }, children: s.title }),
|
|
17287
|
+
/* @__PURE__ */ jsx("div", { style: { fontSize: 12, color: C7.sub, marginTop: 2 }, children: s.subtitle })
|
|
17288
|
+
] }),
|
|
17289
|
+
hasChannel && /* @__PURE__ */ jsx("button", { type: "button", onClick: sendNow, disabled: busy, style: btn, children: busy ? s.sending : s.sendNow })
|
|
17290
|
+
] }),
|
|
17291
|
+
error && /* @__PURE__ */ jsx("div", { style: { color: C7.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
|
|
17292
|
+
notice && /* @__PURE__ */ jsx("div", { style: { color: C7.green, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: notice }),
|
|
17293
|
+
config && /* @__PURE__ */ jsxs("div", { style: { marginTop: 12 }, children: [
|
|
17294
|
+
/* @__PURE__ */ jsxs("span", { style: chip(config.webhookConfigured, s.webhook), children: [
|
|
17295
|
+
s.webhook,
|
|
17296
|
+
": ",
|
|
17297
|
+
config.webhookConfigured ? s.configured : s.missing
|
|
17298
|
+
] }),
|
|
17299
|
+
/* @__PURE__ */ jsxs("span", { style: chip(config.emailConfigured, s.email), children: [
|
|
17300
|
+
s.email,
|
|
17301
|
+
": ",
|
|
17302
|
+
config.emailConfigured ? s.configured : s.missing
|
|
17303
|
+
] })
|
|
17304
|
+
] }),
|
|
17305
|
+
!loading && !hasChannel && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C7.sub }, children: s.notConfigured }),
|
|
17306
|
+
loading && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C7.sub }, children: s.loading }),
|
|
17307
|
+
digest && /* @__PURE__ */ jsxs("div", { style: { marginTop: 8 }, children: [
|
|
17308
|
+
/* @__PURE__ */ jsxs("div", { style: { fontSize: 12, color: C7.sub, marginTop: 6 }, children: [
|
|
17309
|
+
digest.totalIssues,
|
|
17310
|
+
" ",
|
|
17311
|
+
s.issues
|
|
17312
|
+
] }),
|
|
17313
|
+
digest.totalIssues === 0 && /* @__PURE__ */ jsx("div", { style: { marginTop: 8, fontSize: 13, color: C7.sub }, children: s.noIssues }),
|
|
17314
|
+
list(
|
|
17315
|
+
s.scoreReg,
|
|
17316
|
+
digest.scoreRegressions.map((r) => `${r.collection}/${r.documentId} \u2014 ${r.from} \u2192 ${r.to} (\u2212${r.drop})`)
|
|
17317
|
+
),
|
|
17318
|
+
list(s.notFound, digest.newNotFound.map((n) => `${n.url} \u2014 ${n.count}\xD7`)),
|
|
17319
|
+
list(s.rankDrops, digest.rankDrops.map((d) => `\u201C${d.query}\u201D \u2014 #${d.from} \u2192 #${d.to} (\u25BC${d.drop})`))
|
|
17320
|
+
] })
|
|
17321
|
+
] });
|
|
17322
|
+
}
|
|
17323
|
+
var C8 = {
|
|
17324
|
+
text: "var(--theme-text, #1a1a1a)",
|
|
17325
|
+
sub: "var(--theme-elevation-600, #6b7280)",
|
|
17326
|
+
card: "var(--theme-elevation-50, #f9fafb)",
|
|
17327
|
+
bg: "var(--theme-elevation-0, #fff)",
|
|
17328
|
+
border: "var(--theme-elevation-200, #e5e7eb)",
|
|
17329
|
+
green: "#22c55e",
|
|
17330
|
+
red: "#ef4444",
|
|
17331
|
+
violet: "#7c3aed"
|
|
17332
|
+
};
|
|
17333
|
+
var S5 = {
|
|
17334
|
+
fr: {
|
|
17335
|
+
title: "Alt-text IA des images",
|
|
17336
|
+
subtitle: "G\xE9n\xE8re l'attribut alt des images qui n'en ont pas (Claude vision), pour l'accessibilit\xE9 et le SEO.",
|
|
17337
|
+
none: "Toutes les images ont un alt. \u{1F389}",
|
|
17338
|
+
forbidden: "R\xE9serv\xE9 aux administrateurs.",
|
|
17339
|
+
disabled: "Fonction IA d\xE9sactiv\xE9e (features.aiFeatures).",
|
|
17340
|
+
missing: "image(s) sans alt",
|
|
17341
|
+
generate: "G\xE9n\xE9rer",
|
|
17342
|
+
generating: "\u2026",
|
|
17343
|
+
apply: "Appliquer",
|
|
17344
|
+
applied: "Appliqu\xE9 \u2713",
|
|
17345
|
+
noKey: "Cl\xE9 API Claude requise (ANTHROPIC_API_KEY).",
|
|
17346
|
+
loading: "Chargement\u2026",
|
|
17347
|
+
refresh: "Rafra\xEEchir"
|
|
17348
|
+
},
|
|
17349
|
+
en: {
|
|
17350
|
+
title: "AI image alt-text",
|
|
17351
|
+
subtitle: "Generate alt text for images that lack one (Claude vision), for accessibility and SEO.",
|
|
17352
|
+
none: "All images have alt text. \u{1F389}",
|
|
17353
|
+
forbidden: "Admins only.",
|
|
17354
|
+
disabled: "AI feature disabled (features.aiFeatures).",
|
|
17355
|
+
missing: "image(s) without alt",
|
|
17356
|
+
generate: "Generate",
|
|
17357
|
+
generating: "\u2026",
|
|
17358
|
+
apply: "Apply",
|
|
17359
|
+
applied: "Applied \u2713",
|
|
17360
|
+
noKey: "Claude API key required (ANTHROPIC_API_KEY).",
|
|
17361
|
+
loading: "Loading\u2026",
|
|
17362
|
+
refresh: "Refresh"
|
|
17363
|
+
}
|
|
17364
|
+
};
|
|
17365
|
+
function AltTextPanel({ locale }) {
|
|
17366
|
+
const s = S5[locale] ?? S5.fr;
|
|
17367
|
+
const [items, setItems] = useState(null);
|
|
17368
|
+
const [collection, setCollection] = useState("media");
|
|
17369
|
+
const [missingCount, setMissingCount] = useState(0);
|
|
17370
|
+
const [loading, setLoading] = useState(true);
|
|
17371
|
+
const [state, setState] = useState({});
|
|
17372
|
+
const [status, setStatus] = useState("ok");
|
|
17373
|
+
const load = useCallback(async () => {
|
|
17374
|
+
setLoading(true);
|
|
17375
|
+
try {
|
|
17376
|
+
const res = await fetch("/api/seo-plugin/alt-text-audit", { credentials: "include", cache: "no-store" });
|
|
17377
|
+
if (res.status === 404) {
|
|
17378
|
+
setStatus("disabled");
|
|
17379
|
+
return;
|
|
17380
|
+
}
|
|
17381
|
+
if (res.status === 403) {
|
|
17382
|
+
setStatus("forbidden");
|
|
17383
|
+
return;
|
|
17384
|
+
}
|
|
17385
|
+
const json = await res.json();
|
|
17386
|
+
setStatus("ok");
|
|
17387
|
+
setItems(json.items || []);
|
|
17388
|
+
setMissingCount(json.missingCount || 0);
|
|
17389
|
+
setCollection(json.collection || "media");
|
|
17390
|
+
} catch {
|
|
17391
|
+
setItems([]);
|
|
17392
|
+
} finally {
|
|
17393
|
+
setLoading(false);
|
|
17394
|
+
}
|
|
17395
|
+
}, []);
|
|
17396
|
+
useEffect(() => {
|
|
17397
|
+
void load();
|
|
17398
|
+
}, [load]);
|
|
17399
|
+
const setRow = (id, patch) => setState((prev) => ({ ...prev, [id]: { ...prev[id], ...patch } }));
|
|
17400
|
+
const generate = async (item) => {
|
|
17401
|
+
setRow(item.id, { busy: true, error: void 0 });
|
|
17402
|
+
try {
|
|
17403
|
+
const res = await fetch("/api/seo-plugin/ai-alt-text", {
|
|
17404
|
+
method: "POST",
|
|
17405
|
+
credentials: "include",
|
|
17406
|
+
headers: { "Content-Type": "application/json" },
|
|
17407
|
+
body: JSON.stringify({ collection, id: item.id, apply: false })
|
|
17408
|
+
});
|
|
17409
|
+
const json = await res.json();
|
|
17410
|
+
if (!res.ok) {
|
|
17411
|
+
setRow(item.id, { busy: false, error: json.code === "no_api_key" ? s.noKey : json.error || `Error ${res.status}` });
|
|
17412
|
+
return;
|
|
17413
|
+
}
|
|
17414
|
+
setRow(item.id, { busy: false, alt: json.alt });
|
|
17415
|
+
} catch (e) {
|
|
17416
|
+
setRow(item.id, { busy: false, error: e instanceof Error ? e.message : "Network error" });
|
|
17417
|
+
}
|
|
17418
|
+
};
|
|
17419
|
+
const apply = async (item) => {
|
|
17420
|
+
const alt = state[item.id]?.alt;
|
|
17421
|
+
if (!alt) return;
|
|
17422
|
+
setRow(item.id, { busy: true, error: void 0 });
|
|
17423
|
+
try {
|
|
17424
|
+
const res = await fetch("/api/seo-plugin/ai-alt-text", {
|
|
17425
|
+
method: "POST",
|
|
17426
|
+
credentials: "include",
|
|
17427
|
+
headers: { "Content-Type": "application/json" },
|
|
17428
|
+
body: JSON.stringify({ collection, id: item.id, apply: true, altText: alt })
|
|
17429
|
+
});
|
|
17430
|
+
const json = await res.json();
|
|
17431
|
+
if (!res.ok) {
|
|
17432
|
+
setRow(item.id, { busy: false, error: json.error || `Error ${res.status}` });
|
|
17433
|
+
return;
|
|
17434
|
+
}
|
|
17435
|
+
setRow(item.id, { busy: false, applied: true });
|
|
17436
|
+
} catch (e) {
|
|
17437
|
+
setRow(item.id, { busy: false, error: e instanceof Error ? e.message : "Network error" });
|
|
17438
|
+
}
|
|
17439
|
+
};
|
|
17440
|
+
const card = {
|
|
17441
|
+
padding: 16,
|
|
17442
|
+
borderRadius: 12,
|
|
17443
|
+
border: `1px solid ${C8.border}`,
|
|
17444
|
+
backgroundColor: C8.card,
|
|
17445
|
+
marginBottom: 20
|
|
17446
|
+
};
|
|
17447
|
+
const btn = (bg) => ({
|
|
17448
|
+
padding: "6px 10px",
|
|
17449
|
+
borderRadius: 6,
|
|
17450
|
+
border: `1px solid ${bg}`,
|
|
17451
|
+
backgroundColor: bg,
|
|
17452
|
+
color: "#fff",
|
|
17453
|
+
fontSize: 11,
|
|
17454
|
+
fontWeight: 700,
|
|
17455
|
+
cursor: "pointer"
|
|
17456
|
+
});
|
|
17457
|
+
return /* @__PURE__ */ jsxs("div", { style: card, children: [
|
|
17458
|
+
/* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: 8, flexWrap: "wrap" }, children: [
|
|
17459
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
17460
|
+
/* @__PURE__ */ jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C8.text }, children: s.title }),
|
|
17461
|
+
/* @__PURE__ */ jsx("div", { style: { fontSize: 12, color: C8.sub, marginTop: 2 }, children: s.subtitle })
|
|
17462
|
+
] }),
|
|
17463
|
+
status === "ok" && /* @__PURE__ */ jsx("button", { type: "button", onClick: () => void load(), style: btn(C8.sub), children: s.refresh })
|
|
17464
|
+
] }),
|
|
17465
|
+
status === "forbidden" && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C8.sub }, children: s.forbidden }),
|
|
17466
|
+
status === "disabled" && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C8.sub }, children: s.disabled }),
|
|
17467
|
+
status === "ok" && /* @__PURE__ */ jsxs("div", { style: { marginTop: 12 }, children: [
|
|
17468
|
+
loading && /* @__PURE__ */ jsx("div", { style: { fontSize: 13, color: C8.sub }, children: s.loading }),
|
|
17469
|
+
!loading && items && items.length === 0 && /* @__PURE__ */ jsx("div", { style: { fontSize: 13, color: C8.sub }, children: s.none }),
|
|
17470
|
+
!loading && items && items.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
17471
|
+
/* @__PURE__ */ jsxs("div", { style: { fontSize: 12, color: C8.sub, marginBottom: 10 }, children: [
|
|
17472
|
+
missingCount,
|
|
17473
|
+
" ",
|
|
17474
|
+
s.missing
|
|
17475
|
+
] }),
|
|
17476
|
+
/* @__PURE__ */ jsx("div", { style: { display: "flex", flexDirection: "column", gap: 10 }, children: items.map((item) => {
|
|
17477
|
+
const rs = state[item.id] || {};
|
|
17478
|
+
return /* @__PURE__ */ jsxs(
|
|
17479
|
+
"div",
|
|
17480
|
+
{
|
|
17481
|
+
style: {
|
|
17482
|
+
display: "flex",
|
|
17483
|
+
gap: 12,
|
|
17484
|
+
alignItems: "center",
|
|
17485
|
+
padding: 8,
|
|
17486
|
+
borderRadius: 8,
|
|
17487
|
+
border: `1px solid ${C8.border}`,
|
|
17488
|
+
backgroundColor: C8.bg
|
|
17489
|
+
},
|
|
17490
|
+
children: [
|
|
17491
|
+
/* @__PURE__ */ jsx(
|
|
17492
|
+
"img",
|
|
17493
|
+
{
|
|
17494
|
+
src: item.url,
|
|
17495
|
+
alt: "",
|
|
17496
|
+
style: { width: 48, height: 48, objectFit: "cover", borderRadius: 6, flexShrink: 0, border: `1px solid ${C8.border}` }
|
|
17497
|
+
}
|
|
17498
|
+
),
|
|
17499
|
+
/* @__PURE__ */ jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
|
|
17500
|
+
/* @__PURE__ */ jsx("div", { style: { fontSize: 11, color: C8.sub, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: item.filename }),
|
|
17501
|
+
rs.alt !== void 0 ? /* @__PURE__ */ jsx(
|
|
17502
|
+
"input",
|
|
17503
|
+
{
|
|
17504
|
+
value: rs.alt,
|
|
17505
|
+
onChange: (e) => setRow(item.id, { alt: e.target.value }),
|
|
17506
|
+
disabled: rs.applied,
|
|
17507
|
+
maxLength: 125,
|
|
17508
|
+
style: {
|
|
17509
|
+
width: "100%",
|
|
17510
|
+
marginTop: 4,
|
|
17511
|
+
padding: "4px 8px",
|
|
17512
|
+
fontSize: 12,
|
|
17513
|
+
borderRadius: 6,
|
|
17514
|
+
border: `1px solid ${C8.border}`,
|
|
17515
|
+
backgroundColor: C8.bg,
|
|
17516
|
+
color: C8.text
|
|
17517
|
+
}
|
|
17518
|
+
}
|
|
17519
|
+
) : /* @__PURE__ */ jsx("div", { style: { fontSize: 12, color: C8.sub, marginTop: 4, fontStyle: "italic" }, children: "\u2014" }),
|
|
17520
|
+
rs.error && /* @__PURE__ */ jsx("div", { style: { fontSize: 11, color: C8.red, marginTop: 2 }, children: rs.error })
|
|
17521
|
+
] }),
|
|
17522
|
+
/* @__PURE__ */ jsx("div", { style: { flexShrink: 0 }, children: rs.applied ? /* @__PURE__ */ jsx("span", { style: { fontSize: 11, fontWeight: 700, color: C8.green }, children: s.applied }) : rs.alt !== void 0 ? /* @__PURE__ */ jsx("button", { type: "button", onClick: () => void apply(item), disabled: rs.busy, style: btn(C8.green), children: rs.busy ? s.generating : s.apply }) : /* @__PURE__ */ jsx("button", { type: "button", onClick: () => void generate(item), disabled: rs.busy, style: btn(C8.violet), children: rs.busy ? s.generating : s.generate }) })
|
|
17523
|
+
]
|
|
17524
|
+
},
|
|
17525
|
+
item.id
|
|
17526
|
+
);
|
|
17527
|
+
}) })
|
|
17528
|
+
] })
|
|
17529
|
+
] })
|
|
17530
|
+
] });
|
|
17531
|
+
}
|
|
16965
17532
|
var V8 = {
|
|
16966
17533
|
text: "var(--theme-text, #1a1a1a)",
|
|
16967
17534
|
textSecondary: "var(--theme-elevation-600, #6b7280)",
|
|
@@ -17376,6 +17943,9 @@ function PerformanceView() {
|
|
|
17376
17943
|
),
|
|
17377
17944
|
/* @__PURE__ */ jsx(CoreWebVitalsPanel, { locale }),
|
|
17378
17945
|
/* @__PURE__ */ jsx(GscPanel, { locale }),
|
|
17946
|
+
/* @__PURE__ */ jsx(RankTrackingPanel, { locale }),
|
|
17947
|
+
/* @__PURE__ */ jsx(AlertsPanel, { locale }),
|
|
17948
|
+
/* @__PURE__ */ jsx(AltTextPanel, { locale }),
|
|
17379
17949
|
showImport && /* @__PURE__ */ jsxs(
|
|
17380
17950
|
"div",
|
|
17381
17951
|
{
|
|
@@ -19035,7 +19605,7 @@ var controlBtnStyle = {
|
|
|
19035
19605
|
cursor: "pointer",
|
|
19036
19606
|
lineHeight: 1.4
|
|
19037
19607
|
};
|
|
19038
|
-
var
|
|
19608
|
+
var C9 = {
|
|
19039
19609
|
cyan: "#00E5FF",
|
|
19040
19610
|
black: "#000",
|
|
19041
19611
|
green: "#22c55e",
|
|
@@ -19050,10 +19620,10 @@ var C6 = {
|
|
|
19050
19620
|
var TITLE_MIN = 30;
|
|
19051
19621
|
var TITLE_MAX = 60;
|
|
19052
19622
|
function getCharColor(len) {
|
|
19053
|
-
if (len === 0) return
|
|
19054
|
-
if (len >= TITLE_MIN && len <= TITLE_MAX) return
|
|
19055
|
-
if (len > 0 && len < TITLE_MIN) return
|
|
19056
|
-
return
|
|
19623
|
+
if (len === 0) return C9.textSecondary;
|
|
19624
|
+
if (len >= TITLE_MIN && len <= TITLE_MAX) return C9.green;
|
|
19625
|
+
if (len > 0 && len < TITLE_MIN) return C9.orange;
|
|
19626
|
+
return C9.red;
|
|
19057
19627
|
}
|
|
19058
19628
|
function getProgressPercent(len) {
|
|
19059
19629
|
if (len === 0) return 0;
|
|
@@ -19061,9 +19631,9 @@ function getProgressPercent(len) {
|
|
|
19061
19631
|
}
|
|
19062
19632
|
function getProgressColor(len) {
|
|
19063
19633
|
if (len === 0) return "var(--theme-elevation-200, #e5e7eb)";
|
|
19064
|
-
if (len >= TITLE_MIN && len <= TITLE_MAX) return
|
|
19065
|
-
if (len < TITLE_MIN) return
|
|
19066
|
-
return
|
|
19634
|
+
if (len >= TITLE_MIN && len <= TITLE_MAX) return C9.green;
|
|
19635
|
+
if (len < TITLE_MIN) return C9.orange;
|
|
19636
|
+
return C9.red;
|
|
19067
19637
|
}
|
|
19068
19638
|
function MetaTitleField({
|
|
19069
19639
|
path,
|
|
@@ -19134,7 +19704,7 @@ function MetaTitleField({
|
|
|
19134
19704
|
style: {
|
|
19135
19705
|
fontSize: 13,
|
|
19136
19706
|
fontWeight: 700,
|
|
19137
|
-
color:
|
|
19707
|
+
color: C9.textPrimary
|
|
19138
19708
|
},
|
|
19139
19709
|
children: t.metaTitle.label
|
|
19140
19710
|
}
|
|
@@ -19174,9 +19744,9 @@ function MetaTitleField({
|
|
|
19174
19744
|
fontSize: 14,
|
|
19175
19745
|
fontFamily: "inherit",
|
|
19176
19746
|
borderRadius: 8,
|
|
19177
|
-
border: `2px solid ${
|
|
19178
|
-
backgroundColor:
|
|
19179
|
-
color:
|
|
19747
|
+
border: `2px solid ${C9.border}`,
|
|
19748
|
+
backgroundColor: C9.surfaceBg,
|
|
19749
|
+
color: C9.textPrimary,
|
|
19180
19750
|
outline: "none",
|
|
19181
19751
|
boxShadow: "2px 2px 0 0 var(--theme-border-color, rgba(0,0,0,1))"
|
|
19182
19752
|
}
|
|
@@ -19194,9 +19764,9 @@ function MetaTitleField({
|
|
|
19194
19764
|
gap: 5,
|
|
19195
19765
|
padding: "8px 14px",
|
|
19196
19766
|
borderRadius: 8,
|
|
19197
|
-
border: `2px solid ${
|
|
19198
|
-
backgroundColor: loading ?
|
|
19199
|
-
color: loading ?
|
|
19767
|
+
border: `2px solid ${C9.border}`,
|
|
19768
|
+
backgroundColor: loading ? C9.surface50 : C9.cyan,
|
|
19769
|
+
color: loading ? C9.textSecondary : C9.black,
|
|
19200
19770
|
fontWeight: 800,
|
|
19201
19771
|
fontSize: 11,
|
|
19202
19772
|
textTransform: "uppercase",
|
|
@@ -19243,7 +19813,7 @@ function MetaTitleField({
|
|
|
19243
19813
|
justifyContent: "space-between",
|
|
19244
19814
|
marginTop: 4,
|
|
19245
19815
|
fontSize: 10,
|
|
19246
|
-
color:
|
|
19816
|
+
color: C9.textSecondary
|
|
19247
19817
|
},
|
|
19248
19818
|
children: [
|
|
19249
19819
|
/* @__PURE__ */ jsxs("span", { children: [
|
|
@@ -19277,9 +19847,9 @@ function MetaTitleField({
|
|
|
19277
19847
|
borderRadius: 6,
|
|
19278
19848
|
fontSize: 11,
|
|
19279
19849
|
fontWeight: 600,
|
|
19280
|
-
color:
|
|
19850
|
+
color: C9.red,
|
|
19281
19851
|
backgroundColor: "rgba(239,68,68,0.08)",
|
|
19282
|
-
border: `1px solid ${
|
|
19852
|
+
border: `1px solid ${C9.red}`
|
|
19283
19853
|
},
|
|
19284
19854
|
children: error
|
|
19285
19855
|
}
|
|
@@ -19288,7 +19858,7 @@ function MetaTitleField({
|
|
|
19288
19858
|
}
|
|
19289
19859
|
);
|
|
19290
19860
|
}
|
|
19291
|
-
var
|
|
19861
|
+
var C10 = {
|
|
19292
19862
|
cyan: "#00E5FF",
|
|
19293
19863
|
black: "#000",
|
|
19294
19864
|
green: "#22c55e",
|
|
@@ -19303,10 +19873,10 @@ var C7 = {
|
|
|
19303
19873
|
var DESC_MIN = 120;
|
|
19304
19874
|
var DESC_MAX = 160;
|
|
19305
19875
|
function getCharColor2(len) {
|
|
19306
|
-
if (len === 0) return
|
|
19307
|
-
if (len >= DESC_MIN && len <= DESC_MAX) return
|
|
19308
|
-
if (len > 0 && len < DESC_MIN) return
|
|
19309
|
-
return
|
|
19876
|
+
if (len === 0) return C10.textSecondary;
|
|
19877
|
+
if (len >= DESC_MIN && len <= DESC_MAX) return C10.green;
|
|
19878
|
+
if (len > 0 && len < DESC_MIN) return C10.orange;
|
|
19879
|
+
return C10.red;
|
|
19310
19880
|
}
|
|
19311
19881
|
function getProgressPercent2(len) {
|
|
19312
19882
|
if (len === 0) return 0;
|
|
@@ -19314,9 +19884,9 @@ function getProgressPercent2(len) {
|
|
|
19314
19884
|
}
|
|
19315
19885
|
function getProgressColor2(len) {
|
|
19316
19886
|
if (len === 0) return "var(--theme-elevation-200, #e5e7eb)";
|
|
19317
|
-
if (len >= DESC_MIN && len <= DESC_MAX) return
|
|
19318
|
-
if (len < DESC_MIN) return
|
|
19319
|
-
return
|
|
19887
|
+
if (len >= DESC_MIN && len <= DESC_MAX) return C10.green;
|
|
19888
|
+
if (len < DESC_MIN) return C10.orange;
|
|
19889
|
+
return C10.red;
|
|
19320
19890
|
}
|
|
19321
19891
|
function MetaDescriptionField({
|
|
19322
19892
|
path,
|
|
@@ -19387,7 +19957,7 @@ function MetaDescriptionField({
|
|
|
19387
19957
|
style: {
|
|
19388
19958
|
fontSize: 13,
|
|
19389
19959
|
fontWeight: 700,
|
|
19390
|
-
color:
|
|
19960
|
+
color: C10.textPrimary
|
|
19391
19961
|
},
|
|
19392
19962
|
children: t.metaDescription.label
|
|
19393
19963
|
}
|
|
@@ -19427,9 +19997,9 @@ function MetaDescriptionField({
|
|
|
19427
19997
|
fontSize: 14,
|
|
19428
19998
|
fontFamily: "inherit",
|
|
19429
19999
|
borderRadius: 8,
|
|
19430
|
-
border: `2px solid ${
|
|
19431
|
-
backgroundColor:
|
|
19432
|
-
color:
|
|
20000
|
+
border: `2px solid ${C10.border}`,
|
|
20001
|
+
backgroundColor: C10.surfaceBg,
|
|
20002
|
+
color: C10.textPrimary,
|
|
19433
20003
|
outline: "none",
|
|
19434
20004
|
resize: "vertical",
|
|
19435
20005
|
lineHeight: 1.5,
|
|
@@ -19449,9 +20019,9 @@ function MetaDescriptionField({
|
|
|
19449
20019
|
gap: 5,
|
|
19450
20020
|
padding: "8px 14px",
|
|
19451
20021
|
borderRadius: 8,
|
|
19452
|
-
border: `2px solid ${
|
|
19453
|
-
backgroundColor: loading ?
|
|
19454
|
-
color: loading ?
|
|
20022
|
+
border: `2px solid ${C10.border}`,
|
|
20023
|
+
backgroundColor: loading ? C10.surface50 : C10.cyan,
|
|
20024
|
+
color: loading ? C10.textSecondary : C10.black,
|
|
19455
20025
|
fontWeight: 800,
|
|
19456
20026
|
fontSize: 11,
|
|
19457
20027
|
textTransform: "uppercase",
|
|
@@ -19499,7 +20069,7 @@ function MetaDescriptionField({
|
|
|
19499
20069
|
justifyContent: "space-between",
|
|
19500
20070
|
marginTop: 4,
|
|
19501
20071
|
fontSize: 10,
|
|
19502
|
-
color:
|
|
20072
|
+
color: C10.textSecondary
|
|
19503
20073
|
},
|
|
19504
20074
|
children: [
|
|
19505
20075
|
/* @__PURE__ */ jsxs("span", { children: [
|
|
@@ -19533,9 +20103,9 @@ function MetaDescriptionField({
|
|
|
19533
20103
|
borderRadius: 6,
|
|
19534
20104
|
fontSize: 11,
|
|
19535
20105
|
fontWeight: 600,
|
|
19536
|
-
color:
|
|
20106
|
+
color: C10.red,
|
|
19537
20107
|
backgroundColor: "rgba(239,68,68,0.08)",
|
|
19538
|
-
border: `1px solid ${
|
|
20108
|
+
border: `1px solid ${C10.red}`
|
|
19539
20109
|
},
|
|
19540
20110
|
children: error
|
|
19541
20111
|
}
|
|
@@ -19544,7 +20114,7 @@ function MetaDescriptionField({
|
|
|
19544
20114
|
}
|
|
19545
20115
|
);
|
|
19546
20116
|
}
|
|
19547
|
-
var
|
|
20117
|
+
var C11 = {
|
|
19548
20118
|
cyan: "#00E5FF",
|
|
19549
20119
|
black: "#000",
|
|
19550
20120
|
white: "#fff",
|
|
@@ -19621,8 +20191,8 @@ function MetaImageField({
|
|
|
19621
20191
|
gap: 10,
|
|
19622
20192
|
padding: "10px 14px",
|
|
19623
20193
|
borderRadius: 8,
|
|
19624
|
-
border: `2px solid ${
|
|
19625
|
-
backgroundColor:
|
|
20194
|
+
border: `2px solid ${C11.border}`,
|
|
20195
|
+
backgroundColor: C11.surfaceBg,
|
|
19626
20196
|
boxShadow: "2px 2px 0 0 var(--theme-border-color, rgba(0,0,0,1))"
|
|
19627
20197
|
},
|
|
19628
20198
|
children: [
|
|
@@ -19641,7 +20211,7 @@ function MetaImageField({
|
|
|
19641
20211
|
fontWeight: 900,
|
|
19642
20212
|
backgroundColor: hasImage ? "rgba(34,197,94,0.15)" : "rgba(255,138,0,0.15)",
|
|
19643
20213
|
color: hasImage ? "#16a34a" : "#d97706",
|
|
19644
|
-
border: `1px solid ${hasImage ?
|
|
20214
|
+
border: `1px solid ${hasImage ? C11.green : C11.orange}`
|
|
19645
20215
|
},
|
|
19646
20216
|
children: hasImage ? "\u2713" : "!"
|
|
19647
20217
|
}
|
|
@@ -19653,7 +20223,7 @@ function MetaImageField({
|
|
|
19653
20223
|
style: {
|
|
19654
20224
|
fontSize: 12,
|
|
19655
20225
|
fontWeight: 700,
|
|
19656
|
-
color:
|
|
20226
|
+
color: C11.textPrimary
|
|
19657
20227
|
},
|
|
19658
20228
|
children: t.metaImage.label
|
|
19659
20229
|
}
|
|
@@ -19663,7 +20233,7 @@ function MetaImageField({
|
|
|
19663
20233
|
{
|
|
19664
20234
|
style: {
|
|
19665
20235
|
fontSize: 10,
|
|
19666
|
-
color:
|
|
20236
|
+
color: C11.textSecondary,
|
|
19667
20237
|
lineHeight: 1.4
|
|
19668
20238
|
},
|
|
19669
20239
|
children: hasImage ? t.metaImage.imageSet : t.metaImage.noImage
|
|
@@ -19683,9 +20253,9 @@ function MetaImageField({
|
|
|
19683
20253
|
gap: 5,
|
|
19684
20254
|
padding: "8px 14px",
|
|
19685
20255
|
borderRadius: 8,
|
|
19686
|
-
border: `2px solid ${
|
|
19687
|
-
backgroundColor: loading ?
|
|
19688
|
-
color: loading ?
|
|
20256
|
+
border: `2px solid ${C11.border}`,
|
|
20257
|
+
backgroundColor: loading ? C11.surface50 : success ? C11.green : C11.cyan,
|
|
20258
|
+
color: loading ? C11.textSecondary : success ? C11.white : C11.black,
|
|
19689
20259
|
fontWeight: 800,
|
|
19690
20260
|
fontSize: 11,
|
|
19691
20261
|
textTransform: "uppercase",
|
|
@@ -19712,9 +20282,9 @@ function MetaImageField({
|
|
|
19712
20282
|
borderRadius: 6,
|
|
19713
20283
|
fontSize: 11,
|
|
19714
20284
|
fontWeight: 600,
|
|
19715
|
-
color:
|
|
20285
|
+
color: C11.red,
|
|
19716
20286
|
backgroundColor: "rgba(239,68,68,0.08)",
|
|
19717
|
-
border: `1px solid ${
|
|
20287
|
+
border: `1px solid ${C11.red}`
|
|
19718
20288
|
},
|
|
19719
20289
|
children: error
|
|
19720
20290
|
}
|
|
@@ -19723,7 +20293,7 @@ function MetaImageField({
|
|
|
19723
20293
|
}
|
|
19724
20294
|
);
|
|
19725
20295
|
}
|
|
19726
|
-
var
|
|
20296
|
+
var C12 = {
|
|
19727
20297
|
black: "#000",
|
|
19728
20298
|
white: "#fff",
|
|
19729
20299
|
green: "#22c55e",
|
|
@@ -19737,15 +20307,15 @@ var C9 = {
|
|
|
19737
20307
|
function getCompletenessColor(count) {
|
|
19738
20308
|
switch (count) {
|
|
19739
20309
|
case 0:
|
|
19740
|
-
return
|
|
20310
|
+
return C12.red;
|
|
19741
20311
|
case 1:
|
|
19742
|
-
return
|
|
20312
|
+
return C12.orange;
|
|
19743
20313
|
case 2:
|
|
19744
|
-
return
|
|
20314
|
+
return C12.yellow;
|
|
19745
20315
|
case 3:
|
|
19746
|
-
return
|
|
20316
|
+
return C12.green;
|
|
19747
20317
|
default:
|
|
19748
|
-
return
|
|
20318
|
+
return C12.textSecondary;
|
|
19749
20319
|
}
|
|
19750
20320
|
}
|
|
19751
20321
|
function getCompletenessLabel(count, ov) {
|
|
@@ -19803,8 +20373,8 @@ function OverviewField({
|
|
|
19803
20373
|
fontFamily: "var(--font-body, Inter, system-ui, sans-serif)",
|
|
19804
20374
|
padding: "12px 14px",
|
|
19805
20375
|
borderRadius: 10,
|
|
19806
|
-
border: `2px solid ${
|
|
19807
|
-
backgroundColor:
|
|
20376
|
+
border: `2px solid ${C12.border}`,
|
|
20377
|
+
backgroundColor: C12.surfaceBg,
|
|
19808
20378
|
boxShadow: "3px 3px 0 0 var(--theme-border-color, rgba(0,0,0,1))",
|
|
19809
20379
|
marginBottom: 12
|
|
19810
20380
|
},
|
|
@@ -19827,7 +20397,7 @@ function OverviewField({
|
|
|
19827
20397
|
fontWeight: 800,
|
|
19828
20398
|
textTransform: "uppercase",
|
|
19829
20399
|
letterSpacing: "0.04em",
|
|
19830
|
-
color:
|
|
20400
|
+
color: C12.textPrimary
|
|
19831
20401
|
},
|
|
19832
20402
|
children: t.overview.metaCompleteness
|
|
19833
20403
|
}
|
|
@@ -19842,8 +20412,8 @@ function OverviewField({
|
|
|
19842
20412
|
fontSize: 11,
|
|
19843
20413
|
fontWeight: 800,
|
|
19844
20414
|
backgroundColor: completenessColor,
|
|
19845
|
-
color: completenessColor ===
|
|
19846
|
-
border: `2px solid ${
|
|
20415
|
+
color: completenessColor === C12.yellow ? C12.black : C12.white,
|
|
20416
|
+
border: `2px solid ${C12.border}`,
|
|
19847
20417
|
textTransform: "uppercase",
|
|
19848
20418
|
letterSpacing: "0.03em"
|
|
19849
20419
|
},
|
|
@@ -19941,7 +20511,7 @@ function OverviewField({
|
|
|
19941
20511
|
style: {
|
|
19942
20512
|
fontSize: 12,
|
|
19943
20513
|
fontWeight: 600,
|
|
19944
|
-
color: item.filled ?
|
|
20514
|
+
color: item.filled ? C12.textPrimary : C12.textSecondary
|
|
19945
20515
|
},
|
|
19946
20516
|
children: item.label
|
|
19947
20517
|
}
|
|
@@ -19953,7 +20523,7 @@ function OverviewField({
|
|
|
19953
20523
|
marginLeft: "auto",
|
|
19954
20524
|
fontSize: 10,
|
|
19955
20525
|
fontWeight: 700,
|
|
19956
|
-
color: item.filled ?
|
|
20526
|
+
color: item.filled ? C12.green : C12.red,
|
|
19957
20527
|
textTransform: "uppercase",
|
|
19958
20528
|
letterSpacing: "0.03em"
|
|
19959
20529
|
},
|
|
@@ -19970,7 +20540,7 @@ function OverviewField({
|
|
|
19970
20540
|
}
|
|
19971
20541
|
);
|
|
19972
20542
|
}
|
|
19973
|
-
var
|
|
20543
|
+
var C13 = {
|
|
19974
20544
|
cyan: "#00E5FF",
|
|
19975
20545
|
black: "#000",
|
|
19976
20546
|
white: "#fff",
|
|
@@ -19989,10 +20559,10 @@ var G = {
|
|
|
19989
20559
|
descGrey: "#4d5156",
|
|
19990
20560
|
faviconBg: "#e8eaed"};
|
|
19991
20561
|
function charCountColor2(len, min, max) {
|
|
19992
|
-
if (len >= min && len <= max) return
|
|
19993
|
-
if (len > 0 && len < min) return
|
|
19994
|
-
if (len > max) return
|
|
19995
|
-
return
|
|
20562
|
+
if (len >= min && len <= max) return C13.green;
|
|
20563
|
+
if (len > 0 && len < min) return C13.orange;
|
|
20564
|
+
if (len > max) return C13.red;
|
|
20565
|
+
return C13.textSecondary;
|
|
19996
20566
|
}
|
|
19997
20567
|
function truncateText(text, maxChars) {
|
|
19998
20568
|
if (text.length <= maxChars) return text;
|
|
@@ -20047,8 +20617,8 @@ function SerpPreview({
|
|
|
20047
20617
|
padding: "10px 12px",
|
|
20048
20618
|
cursor: "pointer",
|
|
20049
20619
|
borderRadius: 8,
|
|
20050
|
-
border: `2px solid ${
|
|
20051
|
-
backgroundColor:
|
|
20620
|
+
border: `2px solid ${C13.border}`,
|
|
20621
|
+
backgroundColor: C13.surface50,
|
|
20052
20622
|
userSelect: "none"
|
|
20053
20623
|
},
|
|
20054
20624
|
children: [
|
|
@@ -20063,7 +20633,7 @@ function SerpPreview({
|
|
|
20063
20633
|
fontWeight: 800,
|
|
20064
20634
|
textTransform: "uppercase",
|
|
20065
20635
|
letterSpacing: "0.04em",
|
|
20066
|
-
color:
|
|
20636
|
+
color: C13.textPrimary
|
|
20067
20637
|
},
|
|
20068
20638
|
children: [
|
|
20069
20639
|
/* @__PURE__ */ jsxs(
|
|
@@ -20095,7 +20665,7 @@ function SerpPreview({
|
|
|
20095
20665
|
transition: "transform 0.2s",
|
|
20096
20666
|
display: "inline-block",
|
|
20097
20667
|
transform: open ? "rotate(90deg)" : "none",
|
|
20098
|
-
color:
|
|
20668
|
+
color: C13.textSecondary
|
|
20099
20669
|
},
|
|
20100
20670
|
children: "\u25B6"
|
|
20101
20671
|
}
|
|
@@ -20128,10 +20698,10 @@ function SerpPreview({
|
|
|
20128
20698
|
"div",
|
|
20129
20699
|
{
|
|
20130
20700
|
style: {
|
|
20131
|
-
backgroundColor:
|
|
20132
|
-
border: `2px solid ${
|
|
20701
|
+
backgroundColor: C13.white,
|
|
20702
|
+
border: `2px solid ${C13.border}`,
|
|
20133
20703
|
borderRadius: 12,
|
|
20134
|
-
boxShadow: `3px 3px 0 0 ${
|
|
20704
|
+
boxShadow: `3px 3px 0 0 ${C13.border}`,
|
|
20135
20705
|
padding: isDesktop ? 20 : 14,
|
|
20136
20706
|
maxWidth: isDesktop ? 650 : 380,
|
|
20137
20707
|
overflow: "hidden"
|
|
@@ -20194,7 +20764,7 @@ function SerpPreview({
|
|
|
20194
20764
|
style: {
|
|
20195
20765
|
fontSize: 14,
|
|
20196
20766
|
fontWeight: 400,
|
|
20197
|
-
color:
|
|
20767
|
+
color: C13.black,
|
|
20198
20768
|
lineHeight: 1.3,
|
|
20199
20769
|
whiteSpace: "nowrap",
|
|
20200
20770
|
overflow: "hidden",
|
|
@@ -20258,7 +20828,7 @@ function SerpPreview({
|
|
|
20258
20828
|
"span",
|
|
20259
20829
|
{
|
|
20260
20830
|
style: {
|
|
20261
|
-
color:
|
|
20831
|
+
color: C13.textSecondary,
|
|
20262
20832
|
fontStyle: "italic",
|
|
20263
20833
|
fontSize: titleFontSize - 2
|
|
20264
20834
|
},
|
|
@@ -20287,7 +20857,7 @@ function SerpPreview({
|
|
|
20287
20857
|
"span",
|
|
20288
20858
|
{
|
|
20289
20859
|
style: {
|
|
20290
|
-
color:
|
|
20860
|
+
color: C13.textSecondary,
|
|
20291
20861
|
fontStyle: "italic",
|
|
20292
20862
|
fontSize: descFontSize - 1
|
|
20293
20863
|
},
|
|
@@ -20320,7 +20890,7 @@ function SerpPreview({
|
|
|
20320
20890
|
fontSize: 11
|
|
20321
20891
|
},
|
|
20322
20892
|
children: [
|
|
20323
|
-
/* @__PURE__ */ jsx("span", { style: { color:
|
|
20893
|
+
/* @__PURE__ */ jsx("span", { style: { color: C13.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewTitle }),
|
|
20324
20894
|
/* @__PURE__ */ jsxs(
|
|
20325
20895
|
"span",
|
|
20326
20896
|
{
|
|
@@ -20349,7 +20919,7 @@ function SerpPreview({
|
|
|
20349
20919
|
fontSize: 11
|
|
20350
20920
|
},
|
|
20351
20921
|
children: [
|
|
20352
|
-
/* @__PURE__ */ jsx("span", { style: { color:
|
|
20922
|
+
/* @__PURE__ */ jsx("span", { style: { color: C13.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewDescription }),
|
|
20353
20923
|
/* @__PURE__ */ jsxs(
|
|
20354
20924
|
"span",
|
|
20355
20925
|
{
|
|
@@ -20378,14 +20948,14 @@ function SerpPreview({
|
|
|
20378
20948
|
fontSize: 11
|
|
20379
20949
|
},
|
|
20380
20950
|
children: [
|
|
20381
|
-
/* @__PURE__ */ jsx("span", { style: { color:
|
|
20951
|
+
/* @__PURE__ */ jsx("span", { style: { color: C13.textSecondary, fontWeight: 600 }, children: t.serpPreview.url }),
|
|
20382
20952
|
/* @__PURE__ */ jsxs(
|
|
20383
20953
|
"span",
|
|
20384
20954
|
{
|
|
20385
20955
|
style: {
|
|
20386
20956
|
fontWeight: 700,
|
|
20387
20957
|
fontVariantNumeric: "tabular-nums",
|
|
20388
|
-
color: fullUrl.length <= 75 ?
|
|
20958
|
+
color: fullUrl.length <= 75 ? C13.green : C13.red
|
|
20389
20959
|
},
|
|
20390
20960
|
children: [
|
|
20391
20961
|
fullUrl.length,
|
|
@@ -20420,13 +20990,13 @@ function DeviceButton({
|
|
|
20420
20990
|
gap: 5,
|
|
20421
20991
|
padding: "4px 12px",
|
|
20422
20992
|
borderRadius: 6,
|
|
20423
|
-
border: `2px solid ${
|
|
20993
|
+
border: `2px solid ${C13.border}`,
|
|
20424
20994
|
fontSize: 11,
|
|
20425
20995
|
fontWeight: 700,
|
|
20426
20996
|
cursor: "pointer",
|
|
20427
|
-
backgroundColor: active ?
|
|
20428
|
-
color: active ?
|
|
20429
|
-
boxShadow: active ? `2px 2px 0 0 ${
|
|
20997
|
+
backgroundColor: active ? C13.cyan : C13.surfaceBg,
|
|
20998
|
+
color: active ? C13.black : C13.textPrimary,
|
|
20999
|
+
boxShadow: active ? `2px 2px 0 0 ${C13.border}` : "none",
|
|
20430
21000
|
transition: "background-color 0.15s"
|
|
20431
21001
|
},
|
|
20432
21002
|
children: [
|