@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/dist/client.js CHANGED
@@ -15904,7 +15904,7 @@ function getSchemaTypes(t) {
15904
15904
  }
15905
15905
  };
15906
15906
  }
15907
- function buildJsonLd(type, values) {
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(() => buildJsonLd(selectedType, values), [selectedType, values]);
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 C6 = {
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 C6.textSecondary;
19054
- if (len >= TITLE_MIN && len <= TITLE_MAX) return C6.green;
19055
- if (len > 0 && len < TITLE_MIN) return C6.orange;
19056
- return C6.red;
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 C6.green;
19065
- if (len < TITLE_MIN) return C6.orange;
19066
- return C6.red;
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: C6.textPrimary
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 ${C6.border}`,
19178
- backgroundColor: C6.surfaceBg,
19179
- color: C6.textPrimary,
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 ${C6.border}`,
19198
- backgroundColor: loading ? C6.surface50 : C6.cyan,
19199
- color: loading ? C6.textSecondary : C6.black,
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: C6.textSecondary
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: C6.red,
19850
+ color: C9.red,
19281
19851
  backgroundColor: "rgba(239,68,68,0.08)",
19282
- border: `1px solid ${C6.red}`
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 C7 = {
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 C7.textSecondary;
19307
- if (len >= DESC_MIN && len <= DESC_MAX) return C7.green;
19308
- if (len > 0 && len < DESC_MIN) return C7.orange;
19309
- return C7.red;
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 C7.green;
19318
- if (len < DESC_MIN) return C7.orange;
19319
- return C7.red;
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: C7.textPrimary
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 ${C7.border}`,
19431
- backgroundColor: C7.surfaceBg,
19432
- color: C7.textPrimary,
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 ${C7.border}`,
19453
- backgroundColor: loading ? C7.surface50 : C7.cyan,
19454
- color: loading ? C7.textSecondary : C7.black,
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: C7.textSecondary
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: C7.red,
20106
+ color: C10.red,
19537
20107
  backgroundColor: "rgba(239,68,68,0.08)",
19538
- border: `1px solid ${C7.red}`
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 C8 = {
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 ${C8.border}`,
19625
- backgroundColor: C8.surfaceBg,
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 ? C8.green : C8.orange}`
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: C8.textPrimary
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: C8.textSecondary,
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 ${C8.border}`,
19687
- backgroundColor: loading ? C8.surface50 : success ? C8.green : C8.cyan,
19688
- color: loading ? C8.textSecondary : success ? C8.white : C8.black,
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: C8.red,
20285
+ color: C11.red,
19716
20286
  backgroundColor: "rgba(239,68,68,0.08)",
19717
- border: `1px solid ${C8.red}`
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 C9 = {
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 C9.red;
20310
+ return C12.red;
19741
20311
  case 1:
19742
- return C9.orange;
20312
+ return C12.orange;
19743
20313
  case 2:
19744
- return C9.yellow;
20314
+ return C12.yellow;
19745
20315
  case 3:
19746
- return C9.green;
20316
+ return C12.green;
19747
20317
  default:
19748
- return C9.textSecondary;
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 ${C9.border}`,
19807
- backgroundColor: C9.surfaceBg,
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: C9.textPrimary
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 === C9.yellow ? C9.black : C9.white,
19846
- border: `2px solid ${C9.border}`,
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 ? C9.textPrimary : C9.textSecondary
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 ? C9.green : C9.red,
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 C10 = {
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 C10.green;
19993
- if (len > 0 && len < min) return C10.orange;
19994
- if (len > max) return C10.red;
19995
- return C10.textSecondary;
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 ${C10.border}`,
20051
- backgroundColor: C10.surface50,
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: C10.textPrimary
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: C10.textSecondary
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: C10.white,
20132
- border: `2px solid ${C10.border}`,
20701
+ backgroundColor: C13.white,
20702
+ border: `2px solid ${C13.border}`,
20133
20703
  borderRadius: 12,
20134
- boxShadow: `3px 3px 0 0 ${C10.border}`,
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: C10.black,
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: C10.textSecondary,
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: C10.textSecondary,
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: C10.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewTitle }),
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: C10.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewDescription }),
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: C10.textSecondary, fontWeight: 600 }, children: t.serpPreview.url }),
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 ? C10.green : C10.red
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 ${C10.border}`,
20993
+ border: `2px solid ${C13.border}`,
20424
20994
  fontSize: 11,
20425
20995
  fontWeight: 700,
20426
20996
  cursor: "pointer",
20427
- backgroundColor: active ? C10.cyan : C10.surfaceBg,
20428
- color: active ? C10.black : C10.textPrimary,
20429
- boxShadow: active ? `2px 2px 0 0 ${C10.border}` : "none",
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: [