@consilioweb/payload-seo-analyzer 1.13.0 → 1.15.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.cjs CHANGED
@@ -1068,6 +1068,8 @@ var fr = {
1068
1068
  bulkOptimizeMeta: "Optimiser m\xE9ta (IA)",
1069
1069
  bulkOptimizing: "Analyse\u2026",
1070
1070
  bulkConfirm: "Confirmer ?",
1071
+ optimizeSite: "Optimiser le site",
1072
+ optimizeSiteHint: "Cible automatiquement les pages \xE0 probl\xE8me (m\xE9ta manquante, sans mot-cl\xE9, score faible) \u2192 aper\xE7u \u2192 appliquer",
1071
1073
  bulkPreviewTitle: "Corrections m\xE9ta propos\xE9es",
1072
1074
  bulkApply: "Appliquer",
1073
1075
  bulkApplying: "Application\u2026",
@@ -1670,6 +1672,8 @@ var en = {
1670
1672
  bulkOptimizeMeta: "Optimize meta (AI)",
1671
1673
  bulkOptimizing: "Analyzing\u2026",
1672
1674
  bulkConfirm: "Confirm?",
1675
+ optimizeSite: "Optimize site",
1676
+ optimizeSiteHint: "Auto-targets pages that need work (missing meta, no keyword, low score) \u2192 preview \u2192 apply",
1673
1677
  bulkPreviewTitle: "Proposed meta corrections",
1674
1678
  bulkApply: "Apply",
1675
1679
  bulkApplying: "Applying\u2026",
@@ -9544,9 +9548,9 @@ function SeoView() {
9544
9548
  },
9545
9549
  [selectedIds, fetchAudit]
9546
9550
  );
9547
- const handleBulkOptimizeMeta = React4.useCallback(async () => {
9548
- const ids = Array.from(selectedIds).filter((k) => !k.startsWith("global:"));
9549
- if (ids.length === 0) return;
9551
+ const runBulkPreview = React4.useCallback(async (ids) => {
9552
+ const clean = ids.filter((k) => !k.startsWith("global:"));
9553
+ if (clean.length === 0) return;
9550
9554
  setBulkOptimizing(true);
9551
9555
  setBulkPreview(null);
9552
9556
  try {
@@ -9554,7 +9558,7 @@ function SeoView() {
9554
9558
  method: "POST",
9555
9559
  headers: { "Content-Type": "application/json" },
9556
9560
  credentials: "include",
9557
- body: JSON.stringify({ ids, apply: false, limit: 100 })
9561
+ body: JSON.stringify({ ids: clean, apply: false, limit: 100 })
9558
9562
  });
9559
9563
  if (res.ok) {
9560
9564
  const data = await res.json();
@@ -9564,7 +9568,15 @@ function SeoView() {
9564
9568
  } catch {
9565
9569
  }
9566
9570
  setBulkOptimizing(false);
9567
- }, [selectedIds]);
9571
+ }, []);
9572
+ const handleBulkOptimizeMeta = React4.useCallback(
9573
+ () => runBulkPreview(Array.from(selectedIds)),
9574
+ [selectedIds, runBulkPreview]
9575
+ );
9576
+ const handleOptimizeSite = React4.useCallback(() => {
9577
+ const targets = items.filter((i) => !i.collection.startsWith("global:")).filter((i) => !i.metaTitle || !i.metaDescription || !i.focusKeyword || i.score < 70).slice(0, 100).map(itemKey);
9578
+ runBulkPreview(targets);
9579
+ }, [items, runBulkPreview]);
9568
9580
  const handleBulkApplyPreview = React4.useCallback(async () => {
9569
9581
  if (!bulkPreview || bulkPreview.results.length === 0) return;
9570
9582
  setBulkApplying(true);
@@ -9931,6 +9943,16 @@ function SeoView() {
9931
9943
  ] })
9932
9944
  ] }),
9933
9945
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: 8 }, children: [
9946
+ /* @__PURE__ */ jsxRuntime.jsx(
9947
+ "button",
9948
+ {
9949
+ onClick: handleOptimizeSite,
9950
+ disabled: bulkOptimizing || items.length === 0,
9951
+ title: t.seoView.optimizeSiteHint,
9952
+ style: { ...btnBase, backgroundColor: "#7c3aed", color: "#fff", opacity: bulkOptimizing || items.length === 0 ? 0.6 : 1 },
9953
+ children: bulkOptimizing ? t.seoView.bulkOptimizing : `\u2728 ${t.seoView.optimizeSite}`
9954
+ }
9955
+ ),
9934
9956
  /* @__PURE__ */ jsxRuntime.jsxs(
9935
9957
  "button",
9936
9958
  {
@@ -16960,6 +16982,92 @@ function CoreWebVitalsPanel({ locale }) {
16960
16982
  );
16961
16983
  }
16962
16984
  var C5 = {
16985
+ text: "var(--theme-text, #1a1a1a)",
16986
+ sub: "var(--theme-elevation-600, #6b7280)",
16987
+ card: "var(--theme-elevation-50, #f9fafb)",
16988
+ border: "var(--theme-elevation-200, #e5e7eb)",
16989
+ green: "#22c55e",
16990
+ amber: "#f59e0b"
16991
+ };
16992
+ var S2 = {
16993
+ fr: {
16994
+ title: "Sant\xE9 du module SEO",
16995
+ subtitle: "Configuration et \xE9tat des int\xE9grations / jobs (lecture seule).",
16996
+ ok: "Tout est configur\xE9 \u2713",
16997
+ ai: "IA (Claude)",
16998
+ gsc: "Search Console",
16999
+ psi: "PageSpeed",
17000
+ alerts: "Alertes",
17001
+ rank: "Dernier relev\xE9 positions",
17002
+ none: "jamais",
17003
+ warnings: "\xC0 corriger"
17004
+ },
17005
+ en: {
17006
+ title: "SEO module health",
17007
+ subtitle: "Integration & background-job status (read-only).",
17008
+ ok: "All configured \u2713",
17009
+ ai: "AI (Claude)",
17010
+ gsc: "Search Console",
17011
+ psi: "PageSpeed",
17012
+ alerts: "Alerts",
17013
+ rank: "Last rank snapshot",
17014
+ none: "never",
17015
+ warnings: "To fix"
17016
+ }
17017
+ };
17018
+ function HealthPanel({ locale }) {
17019
+ const s = S2[locale] ?? S2.fr;
17020
+ const [h, setH] = React4.useState(null);
17021
+ const load = React4.useCallback(async () => {
17022
+ try {
17023
+ const res = await fetch("/api/seo-plugin/health", { credentials: "include", cache: "no-store" });
17024
+ if (res.ok) setH(await res.json());
17025
+ } catch {
17026
+ }
17027
+ }, []);
17028
+ React4.useEffect(() => {
17029
+ void load();
17030
+ }, [load]);
17031
+ if (!h) return null;
17032
+ const card = { padding: 16, borderRadius: 12, border: `1px solid ${C5.border}`, backgroundColor: C5.card, marginBottom: 20 };
17033
+ const dot = (on) => ({
17034
+ display: "inline-block",
17035
+ width: 8,
17036
+ height: 8,
17037
+ borderRadius: 999,
17038
+ marginRight: 6,
17039
+ backgroundColor: on ? C5.green : C5.sub
17040
+ });
17041
+ const chip = (label, on) => /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontSize: 12, color: C5.text, marginRight: 14, whiteSpace: "nowrap" }, children: [
17042
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: dot(on) }),
17043
+ label
17044
+ ] });
17045
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: card, children: [
17046
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", gap: 8, flexWrap: "wrap" }, children: [
17047
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
17048
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C5.text }, children: s.title }),
17049
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C5.sub, marginTop: 2 }, children: s.subtitle })
17050
+ ] }),
17051
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 12, fontWeight: 700, color: h.ok ? C5.green : C5.amber }, children: h.ok ? s.ok : `${h.warnings.length} \u26A0` })
17052
+ ] }),
17053
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: 12, display: "flex", flexWrap: "wrap", rowGap: 6 }, children: [
17054
+ chip(s.ai, h.config.aiKey),
17055
+ chip(s.gsc, h.config.gscConfigured && h.runtime.gscConnected),
17056
+ chip(s.psi, h.config.pageSpeedKey),
17057
+ chip(s.alerts, h.config.alertWebhook || h.config.alertEmail),
17058
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontSize: 12, color: C5.sub, whiteSpace: "nowrap" }, children: [
17059
+ s.rank,
17060
+ ": ",
17061
+ h.runtime.lastRankSnapshot ? new Date(h.runtime.lastRankSnapshot).toLocaleDateString(locale) : s.none
17062
+ ] })
17063
+ ] }),
17064
+ h.warnings.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: 12 }, children: [
17065
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 11, fontWeight: 700, color: C5.amber, textTransform: "uppercase", marginBottom: 4 }, children: s.warnings }),
17066
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 12, color: C5.sub, lineHeight: 1.6 }, children: h.warnings.map((w, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: w }, i)) })
17067
+ ] })
17068
+ ] });
17069
+ }
17070
+ var C6 = {
16963
17071
  text: "var(--theme-text, #1a1a1a)",
16964
17072
  sub: "var(--theme-elevation-600, #6b7280)",
16965
17073
  card: "var(--theme-elevation-50, #f9fafb)",
@@ -16969,7 +17077,7 @@ var C5 = {
16969
17077
  red: "#ef4444",
16970
17078
  blue: "#3b82f6"
16971
17079
  };
16972
- var S2 = {
17080
+ var S3 = {
16973
17081
  fr: {
16974
17082
  title: "Google Search Console",
16975
17083
  subtitle: "Connexion OAuth pour importer automatiquement clics, impressions et positions r\xE9elles.",
@@ -17016,7 +17124,7 @@ var S2 = {
17016
17124
  }
17017
17125
  };
17018
17126
  function GscPanel({ locale }) {
17019
- const s = S2[locale] ?? S2.fr;
17127
+ const s = S3[locale] ?? S3.fr;
17020
17128
  const [status, setStatus] = React4.useState(null);
17021
17129
  const [busy, setBusy] = React4.useState(false);
17022
17130
  const [error, setError] = React4.useState(null);
@@ -17083,9 +17191,9 @@ function GscPanel({ locale }) {
17083
17191
  const btn = (primary) => ({
17084
17192
  padding: "8px 12px",
17085
17193
  borderRadius: 8,
17086
- border: `1px solid ${primary ? C5.blue : C5.border}`,
17087
- backgroundColor: primary ? C5.blue : C5.bg,
17088
- color: primary ? "#fff" : C5.text,
17194
+ border: `1px solid ${primary ? C6.blue : C6.border}`,
17195
+ backgroundColor: primary ? C6.blue : C6.bg,
17196
+ color: primary ? "#fff" : C6.text,
17089
17197
  fontSize: 12,
17090
17198
  fontWeight: 700,
17091
17199
  cursor: "pointer",
@@ -17094,21 +17202,21 @@ function GscPanel({ locale }) {
17094
17202
  const card = {
17095
17203
  padding: 16,
17096
17204
  borderRadius: 12,
17097
- border: `1px solid ${C5.border}`,
17098
- backgroundColor: C5.card,
17205
+ border: `1px solid ${C6.border}`,
17206
+ backgroundColor: C6.card,
17099
17207
  marginBottom: 20
17100
17208
  };
17101
17209
  if (!status) {
17102
17210
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: card, children: [
17103
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C5.text }, children: s.title }),
17104
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C5.sub, marginTop: 6 }, children: "\u2026" })
17211
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C6.text }, children: s.title }),
17212
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C6.sub, marginTop: 6 }, children: "\u2026" })
17105
17213
  ] });
17106
17214
  }
17107
17215
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: card, children: [
17108
17216
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: 8, flexWrap: "wrap" }, children: [
17109
17217
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
17110
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C5.text }, children: s.title }),
17111
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C5.sub, marginTop: 2 }, children: s.subtitle })
17218
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C6.text }, children: s.title }),
17219
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C6.sub, marginTop: 2 }, children: s.subtitle })
17112
17220
  ] }),
17113
17221
  /* @__PURE__ */ jsxRuntime.jsx(
17114
17222
  "span",
@@ -17119,14 +17227,14 @@ function GscPanel({ locale }) {
17119
17227
  padding: "4px 10px",
17120
17228
  borderRadius: 999,
17121
17229
  color: "#fff",
17122
- backgroundColor: status.connected ? C5.green : C5.sub
17230
+ backgroundColor: status.connected ? C6.green : C6.sub
17123
17231
  },
17124
17232
  children: status.connected ? "\u25CF " + s.connectedAs : "\u25CB"
17125
17233
  }
17126
17234
  )
17127
17235
  ] }),
17128
- error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: C5.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
17129
- !status.configured && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: 12, fontSize: 13, color: C5.sub, lineHeight: 1.5 }, children: [
17236
+ error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: C6.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
17237
+ !status.configured && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: 12, fontSize: 13, color: C6.sub, lineHeight: 1.5 }, children: [
17130
17238
  s.notConfigured,
17131
17239
  status.redirectUri && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: 8 }, children: [
17132
17240
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 700 }, children: s.redirectHint }),
@@ -17137,10 +17245,10 @@ function GscPanel({ locale }) {
17137
17245
  status.configured && !status.connected && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: 12 }, children: [
17138
17246
  /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: connect, disabled: busy, style: btn(true), children: s.connect }),
17139
17247
  /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void loadStatus(), disabled: busy, style: { ...btn(false), marginLeft: 8 }, children: s.refreshStatus }),
17140
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 11, color: C5.sub, marginTop: 8 }, children: s.connectHint })
17248
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 11, color: C6.sub, marginTop: 8 }, children: s.connectHint })
17141
17249
  ] }),
17142
17250
  status.configured && status.connected && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: 12 }, children: [
17143
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: 12, color: C5.sub, marginBottom: 10 }, children: [
17251
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: 12, color: C6.sub, marginBottom: 10 }, children: [
17144
17252
  s.connectedAs,
17145
17253
  status.connectedEmail ? ` \xB7 ${status.connectedEmail}` : "",
17146
17254
  status.propertyUrl ? ` \xB7 ${status.propertyUrl}` : ""
@@ -17150,17 +17258,17 @@ function GscPanel({ locale }) {
17150
17258
  /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void fetchData("page"), disabled: dataLoading, style: btn(dimension === "page"), children: s.byPage }),
17151
17259
  /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: disconnect, disabled: busy, style: btn(false), children: s.disconnect })
17152
17260
  ] }),
17153
- dataLoading && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 13, color: C5.sub }, children: s.fetching }),
17154
- rows && rows.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 13, color: C5.sub }, children: s.noData }),
17261
+ dataLoading && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 13, color: C6.sub }, children: s.fetching }),
17262
+ rows && rows.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 13, color: C6.sub }, children: s.noData }),
17155
17263
  rows && rows.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { overflowX: "auto" }, children: /* @__PURE__ */ jsxRuntime.jsxs("table", { style: { width: "100%", borderCollapse: "collapse", fontSize: 12 }, children: [
17156
- /* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { style: { textAlign: "left", color: C5.sub }, children: [
17264
+ /* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { style: { textAlign: "left", color: C6.sub }, children: [
17157
17265
  /* @__PURE__ */ jsxRuntime.jsx("th", { style: { padding: "6px 8px" }, children: dimension === "query" ? s.query : s.page }),
17158
17266
  /* @__PURE__ */ jsxRuntime.jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.clicks }),
17159
17267
  /* @__PURE__ */ jsxRuntime.jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.impressions }),
17160
17268
  /* @__PURE__ */ jsxRuntime.jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.ctr }),
17161
17269
  /* @__PURE__ */ jsxRuntime.jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.position })
17162
17270
  ] }) }),
17163
- /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: rows.map((r, i) => /* @__PURE__ */ jsxRuntime.jsxs("tr", { style: { borderTop: `1px solid ${C5.border}`, color: C5.text }, children: [
17271
+ /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: rows.map((r, i) => /* @__PURE__ */ jsxRuntime.jsxs("tr", { style: { borderTop: `1px solid ${C6.border}`, color: C6.text }, children: [
17164
17272
  /* @__PURE__ */ jsxRuntime.jsx("td", { style: { padding: "6px 8px", maxWidth: 320, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: r.keys?.[0] || "\u2014" }),
17165
17273
  /* @__PURE__ */ jsxRuntime.jsx("td", { style: { padding: "6px 8px", textAlign: "right", fontWeight: 700 }, children: r.clicks }),
17166
17274
  /* @__PURE__ */ jsxRuntime.jsx("td", { style: { padding: "6px 8px", textAlign: "right" }, children: r.impressions }),
@@ -17174,7 +17282,7 @@ function GscPanel({ locale }) {
17174
17282
  ] })
17175
17283
  ] });
17176
17284
  }
17177
- var C6 = {
17285
+ var C7 = {
17178
17286
  text: "var(--theme-text, #1a1a1a)",
17179
17287
  sub: "var(--theme-elevation-600, #6b7280)",
17180
17288
  card: "var(--theme-elevation-50, #f9fafb)",
@@ -17183,7 +17291,7 @@ var C6 = {
17183
17291
  red: "#ef4444",
17184
17292
  blue: "#3b82f6"
17185
17293
  };
17186
- var S3 = {
17294
+ var S4 = {
17187
17295
  fr: {
17188
17296
  title: "Suivi de positions (rank tracking)",
17189
17297
  subtitle: "Historique quotidien des positions Google (via Search Console) et mouvements dans le temps.",
@@ -17220,7 +17328,7 @@ var S3 = {
17220
17328
  }
17221
17329
  };
17222
17330
  function RankTrackingPanel({ locale }) {
17223
- const s = S3[locale] ?? S3.fr;
17331
+ const s = S4[locale] ?? S4.fr;
17224
17332
  const [movers, setMovers] = React4.useState(null);
17225
17333
  const [lastSnapshot, setLastSnapshot] = React4.useState(null);
17226
17334
  const [loading, setLoading] = React4.useState(true);
@@ -17277,15 +17385,15 @@ function RankTrackingPanel({ locale }) {
17277
17385
  const card = {
17278
17386
  padding: 16,
17279
17387
  borderRadius: 12,
17280
- border: `1px solid ${C6.border}`,
17281
- backgroundColor: C6.card,
17388
+ border: `1px solid ${C7.border}`,
17389
+ backgroundColor: C7.card,
17282
17390
  marginBottom: 20
17283
17391
  };
17284
17392
  const btn = {
17285
17393
  padding: "8px 12px",
17286
17394
  borderRadius: 8,
17287
- border: `1px solid ${C6.blue}`,
17288
- backgroundColor: C6.blue,
17395
+ border: `1px solid ${C7.blue}`,
17396
+ backgroundColor: C7.blue,
17289
17397
  color: "#fff",
17290
17398
  fontSize: 12,
17291
17399
  fontWeight: 700,
@@ -17294,16 +17402,16 @@ function RankTrackingPanel({ locale }) {
17294
17402
  };
17295
17403
  const renderDelta = (m) => {
17296
17404
  if (m.previousPosition === null) {
17297
- return /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: C6.sub, fontSize: 11 }, children: s.newQ });
17405
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: C7.sub, fontSize: 11 }, children: s.newQ });
17298
17406
  }
17299
17407
  if (Math.abs(m.delta) < 0.1) {
17300
- return /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: C6.sub, fontSize: 11 }, children: [
17408
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: C7.sub, fontSize: 11 }, children: [
17301
17409
  "\u2014 ",
17302
17410
  s.stable
17303
17411
  ] });
17304
17412
  }
17305
17413
  const up = m.delta > 0;
17306
- return /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: up ? C6.green : C6.red, fontWeight: 700, fontSize: 12 }, children: [
17414
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: up ? C7.green : C7.red, fontWeight: 700, fontSize: 12 }, children: [
17307
17415
  up ? "\u25B2" : "\u25BC",
17308
17416
  " ",
17309
17417
  Math.abs(m.delta).toFixed(1)
@@ -17312,31 +17420,31 @@ function RankTrackingPanel({ locale }) {
17312
17420
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: card, children: [
17313
17421
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: 8, flexWrap: "wrap" }, children: [
17314
17422
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
17315
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C6.text }, children: s.title }),
17316
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C6.sub, marginTop: 2 }, children: s.subtitle })
17423
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C7.text }, children: s.title }),
17424
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C7.sub, marginTop: 2 }, children: s.subtitle })
17317
17425
  ] }),
17318
17426
  !notConnected && /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: snapshotNow, disabled: busy, style: btn, children: busy ? s.snapshotting : s.snapshot })
17319
17427
  ] }),
17320
- error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: C6.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
17321
- notConnected && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C6.sub }, children: s.needGsc }),
17428
+ error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: C7.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
17429
+ notConnected && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C7.sub }, children: s.needGsc }),
17322
17430
  !notConnected && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: 12 }, children: [
17323
- lastSnapshot && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: 11, color: C6.sub, marginBottom: 8 }, children: [
17431
+ lastSnapshot && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: 11, color: C7.sub, marginBottom: 8 }, children: [
17324
17432
  s.lastSnapshot,
17325
17433
  ": ",
17326
17434
  new Date(lastSnapshot).toLocaleString(locale),
17327
17435
  movers ? ` \xB7 ${movers.length} ${s.countLabel}` : ""
17328
17436
  ] }),
17329
- loading && !movers && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 13, color: C6.sub }, children: "\u2026" }),
17330
- movers && movers.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 13, color: C6.sub }, children: s.noData }),
17437
+ loading && !movers && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 13, color: C7.sub }, children: "\u2026" }),
17438
+ movers && movers.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 13, color: C7.sub }, children: s.noData }),
17331
17439
  movers && movers.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { overflowX: "auto" }, children: /* @__PURE__ */ jsxRuntime.jsxs("table", { style: { width: "100%", borderCollapse: "collapse", fontSize: 12 }, children: [
17332
- /* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { style: { textAlign: "left", color: C6.sub }, children: [
17440
+ /* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { style: { textAlign: "left", color: C7.sub }, children: [
17333
17441
  /* @__PURE__ */ jsxRuntime.jsx("th", { style: { padding: "6px 8px" }, children: s.query }),
17334
17442
  /* @__PURE__ */ jsxRuntime.jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.position }),
17335
17443
  /* @__PURE__ */ jsxRuntime.jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.change }),
17336
17444
  /* @__PURE__ */ jsxRuntime.jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.clicks }),
17337
17445
  /* @__PURE__ */ jsxRuntime.jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.impressions })
17338
17446
  ] }) }),
17339
- /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: movers.slice(0, 100).map((m, i) => /* @__PURE__ */ jsxRuntime.jsxs("tr", { style: { borderTop: `1px solid ${C6.border}`, color: C6.text }, children: [
17447
+ /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: movers.slice(0, 100).map((m, i) => /* @__PURE__ */ jsxRuntime.jsxs("tr", { style: { borderTop: `1px solid ${C7.border}`, color: C7.text }, children: [
17340
17448
  /* @__PURE__ */ jsxRuntime.jsx("td", { style: { padding: "6px 8px", maxWidth: 320, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: m.query }),
17341
17449
  /* @__PURE__ */ jsxRuntime.jsx("td", { style: { padding: "6px 8px", textAlign: "right", fontWeight: 700 }, children: m.position.toFixed(1) }),
17342
17450
  /* @__PURE__ */ jsxRuntime.jsx("td", { style: { padding: "6px 8px", textAlign: "right" }, children: renderDelta(m) }),
@@ -17347,7 +17455,7 @@ function RankTrackingPanel({ locale }) {
17347
17455
  ] })
17348
17456
  ] });
17349
17457
  }
17350
- var C7 = {
17458
+ var C8 = {
17351
17459
  text: "var(--theme-text, #1a1a1a)",
17352
17460
  sub: "var(--theme-elevation-600, #6b7280)",
17353
17461
  card: "var(--theme-elevation-50, #f9fafb)",
@@ -17357,7 +17465,7 @@ var C7 = {
17357
17465
  amber: "#f59e0b",
17358
17466
  violet: "#7c3aed"
17359
17467
  };
17360
- var S4 = {
17468
+ var S5 = {
17361
17469
  fr: {
17362
17470
  title: "Opportunit\xE9s CTR (faible clic / bonne position)",
17363
17471
  subtitle: "Pages bien positionn\xE9es mais peu cliqu\xE9es (m\xE9ta peu attractive). Donn\xE9es Google Search Console \u2192 r\xE9\xE9criture m\xE9ta cibl\xE9e.",
@@ -17398,7 +17506,7 @@ var S4 = {
17398
17506
  }
17399
17507
  };
17400
17508
  function CtrOpportunitiesPanel({ locale }) {
17401
- const s = S4[locale] ?? S4.fr;
17509
+ const s = S5[locale] ?? S5.fr;
17402
17510
  const [opps, setOpps] = React4.useState(null);
17403
17511
  const [loading, setLoading] = React4.useState(true);
17404
17512
  const [notConnected, setNotConnected] = React4.useState(false);
@@ -17473,7 +17581,7 @@ function CtrOpportunitiesPanel({ locale }) {
17473
17581
  setRow(o.url, { busy: false, error: e instanceof Error ? e.message : "Network error" });
17474
17582
  }
17475
17583
  };
17476
- const card = { padding: 16, borderRadius: 12, border: `1px solid ${C7.border}`, backgroundColor: C7.card, marginBottom: 20 };
17584
+ const card = { padding: 16, borderRadius: 12, border: `1px solid ${C8.border}`, backgroundColor: C8.card, marginBottom: 20 };
17477
17585
  const btn = (bg) => ({
17478
17586
  padding: "5px 10px",
17479
17587
  borderRadius: 6,
@@ -17487,17 +17595,17 @@ function CtrOpportunitiesPanel({ locale }) {
17487
17595
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: card, children: [
17488
17596
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", gap: 8, flexWrap: "wrap" }, children: [
17489
17597
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
17490
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C7.text }, children: s.title }),
17491
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C7.sub, marginTop: 2 }, children: s.subtitle })
17598
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C8.text }, children: s.title }),
17599
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C8.sub, marginTop: 2 }, children: s.subtitle })
17492
17600
  ] }),
17493
- !notConnected && /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void load(), style: btn(C7.sub), children: s.refresh })
17601
+ !notConnected && /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void load(), style: btn(C8.sub), children: s.refresh })
17494
17602
  ] }),
17495
- error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: C7.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
17496
- notConnected && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C7.sub }, children: s.needGsc }),
17497
- loading && !notConnected && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C7.sub }, children: s.loading }),
17498
- !loading && !notConnected && opps && opps.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C7.sub }, children: s.none }),
17603
+ error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: C8.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
17604
+ notConnected && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C8.sub }, children: s.needGsc }),
17605
+ loading && !notConnected && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C8.sub }, children: s.loading }),
17606
+ !loading && !notConnected && opps && opps.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C8.sub }, children: s.none }),
17499
17607
  !notConnected && opps && opps.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { overflowX: "auto", marginTop: 12 }, children: /* @__PURE__ */ jsxRuntime.jsxs("table", { style: { width: "100%", borderCollapse: "collapse", fontSize: 12 }, children: [
17500
- /* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { style: { textAlign: "left", color: C7.sub }, children: [
17608
+ /* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { style: { textAlign: "left", color: C8.sub }, children: [
17501
17609
  /* @__PURE__ */ jsxRuntime.jsx("th", { style: { padding: "6px 8px" }, children: s.page }),
17502
17610
  /* @__PURE__ */ jsxRuntime.jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.pos }),
17503
17611
  /* @__PURE__ */ jsxRuntime.jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.ctr }),
@@ -17514,41 +17622,41 @@ function CtrOpportunitiesPanel({ locale }) {
17514
17622
  }
17515
17623
  })();
17516
17624
  return /* @__PURE__ */ jsxRuntime.jsxs(React4__default.default.Fragment, { children: [
17517
- /* @__PURE__ */ jsxRuntime.jsxs("tr", { style: { borderTop: `1px solid ${C7.border}`, color: C7.text }, children: [
17625
+ /* @__PURE__ */ jsxRuntime.jsxs("tr", { style: { borderTop: `1px solid ${C8.border}`, color: C8.text }, children: [
17518
17626
  /* @__PURE__ */ jsxRuntime.jsx("td", { style: { padding: "6px 8px", maxWidth: 320, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: path }),
17519
17627
  /* @__PURE__ */ jsxRuntime.jsx("td", { style: { padding: "6px 8px", textAlign: "right" }, children: o.position.toFixed(1) }),
17520
17628
  /* @__PURE__ */ jsxRuntime.jsxs("td", { style: { padding: "6px 8px", textAlign: "right" }, children: [
17521
- /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: C7.red }, children: [
17629
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: C8.red }, children: [
17522
17630
  (o.ctr * 100).toFixed(1),
17523
17631
  "%"
17524
17632
  ] }),
17525
- /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: C7.sub }, children: [
17633
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: C8.sub }, children: [
17526
17634
  " / ",
17527
17635
  (o.expectedCtr * 100).toFixed(0),
17528
17636
  "% ",
17529
17637
  s.expected
17530
17638
  ] })
17531
17639
  ] }),
17532
- /* @__PURE__ */ jsxRuntime.jsxs("td", { style: { padding: "6px 8px", textAlign: "right", fontWeight: 700, color: C7.amber }, children: [
17640
+ /* @__PURE__ */ jsxRuntime.jsxs("td", { style: { padding: "6px 8px", textAlign: "right", fontWeight: 700, color: C8.amber }, children: [
17533
17641
  "+",
17534
17642
  o.potentialClicks
17535
17643
  ] }),
17536
- /* @__PURE__ */ jsxRuntime.jsx("td", { style: { padding: "6px 8px", textAlign: "right" }, children: rs.applied ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 11, fontWeight: 700, color: C7.green }, children: s.applied }) : o.doc ? rs.suggestion ? /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void apply(o), disabled: rs.busy, style: btn(C7.green), children: rs.busy ? s.optimizing : s.apply }) : /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void optimize(o), disabled: rs.busy, style: btn(C7.violet), children: rs.busy ? s.optimizing : `\u2728 ${s.optimize}` }) : /* @__PURE__ */ jsxRuntime.jsxs("a", { href: o.url, target: "_blank", rel: "noopener noreferrer", style: { fontSize: 11, color: C7.sub }, children: [
17644
+ /* @__PURE__ */ jsxRuntime.jsx("td", { style: { padding: "6px 8px", textAlign: "right" }, children: rs.applied ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 11, fontWeight: 700, color: C8.green }, children: s.applied }) : o.doc ? rs.suggestion ? /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void apply(o), disabled: rs.busy, style: btn(C8.green), children: rs.busy ? s.optimizing : s.apply }) : /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void optimize(o), disabled: rs.busy, style: btn(C8.violet), children: rs.busy ? s.optimizing : `\u2728 ${s.optimize}` }) : /* @__PURE__ */ jsxRuntime.jsxs("a", { href: o.url, target: "_blank", rel: "noopener noreferrer", style: { fontSize: 11, color: C8.sub }, children: [
17537
17645
  s.open,
17538
17646
  " \u2197"
17539
17647
  ] }) })
17540
17648
  ] }),
17541
- rs.suggestion && !rs.applied && /* @__PURE__ */ jsxRuntime.jsx("tr", { style: { color: C7.text }, children: /* @__PURE__ */ jsxRuntime.jsxs("td", { colSpan: 5, style: { padding: "0 8px 8px 8px" }, children: [
17542
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 11, color: C7.green, fontWeight: 600 }, children: rs.suggestion.metaTitle }),
17543
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 11, color: C7.sub }, children: rs.suggestion.metaDescription })
17649
+ rs.suggestion && !rs.applied && /* @__PURE__ */ jsxRuntime.jsx("tr", { style: { color: C8.text }, children: /* @__PURE__ */ jsxRuntime.jsxs("td", { colSpan: 5, style: { padding: "0 8px 8px 8px" }, children: [
17650
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 11, color: C8.green, fontWeight: 600 }, children: rs.suggestion.metaTitle }),
17651
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 11, color: C8.sub }, children: rs.suggestion.metaDescription })
17544
17652
  ] }) }),
17545
- rs.error && /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: 5, style: { padding: "0 8px 6px 8px", fontSize: 11, color: C7.red }, children: rs.error }) })
17653
+ rs.error && /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: 5, style: { padding: "0 8px 6px 8px", fontSize: 11, color: C8.red }, children: rs.error }) })
17546
17654
  ] }, o.url);
17547
17655
  }) })
17548
17656
  ] }) })
17549
17657
  ] });
17550
17658
  }
17551
- var C8 = {
17659
+ var C9 = {
17552
17660
  text: "var(--theme-text, #1a1a1a)",
17553
17661
  sub: "var(--theme-elevation-600, #6b7280)",
17554
17662
  card: "var(--theme-elevation-50, #f9fafb)",
@@ -17558,7 +17666,7 @@ var C8 = {
17558
17666
  amber: "#f59e0b",
17559
17667
  blue: "#3b82f6"
17560
17668
  };
17561
- var S5 = {
17669
+ var S6 = {
17562
17670
  fr: {
17563
17671
  title: "Monitoring & alertes",
17564
17672
  subtitle: "Digest p\xE9riodique : r\xE9gressions de score, nouveaux 404, chutes de position (webhook / email).",
@@ -17601,7 +17709,7 @@ var S5 = {
17601
17709
  }
17602
17710
  };
17603
17711
  function AlertsPanel({ locale }) {
17604
- const s = S5[locale] ?? S5.fr;
17712
+ const s = S6[locale] ?? S6.fr;
17605
17713
  const [digest, setDigest] = React4.useState(null);
17606
17714
  const [config, setConfig] = React4.useState(null);
17607
17715
  const [loading, setLoading] = React4.useState(true);
@@ -17656,15 +17764,15 @@ function AlertsPanel({ locale }) {
17656
17764
  const card = {
17657
17765
  padding: 16,
17658
17766
  borderRadius: 12,
17659
- border: `1px solid ${C8.border}`,
17660
- backgroundColor: C8.card,
17767
+ border: `1px solid ${C9.border}`,
17768
+ backgroundColor: C9.card,
17661
17769
  marginBottom: 20
17662
17770
  };
17663
17771
  const btn = {
17664
17772
  padding: "8px 12px",
17665
17773
  borderRadius: 8,
17666
- border: `1px solid ${C8.blue}`,
17667
- backgroundColor: C8.blue,
17774
+ border: `1px solid ${C9.blue}`,
17775
+ backgroundColor: C9.blue,
17668
17776
  color: "#fff",
17669
17777
  fontSize: 12,
17670
17778
  fontWeight: 700,
@@ -17677,32 +17785,32 @@ function AlertsPanel({ locale }) {
17677
17785
  padding: "3px 8px",
17678
17786
  borderRadius: 999,
17679
17787
  color: "#fff",
17680
- backgroundColor: ok ? C8.green : C8.sub,
17788
+ backgroundColor: ok ? C9.green : C9.sub,
17681
17789
  marginRight: 6
17682
17790
  });
17683
17791
  const hasChannel = config && (config.webhookConfigured || config.emailConfigured);
17684
17792
  const list = (title, rows) => rows.length ? /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: 10 }, children: [
17685
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: 12, fontWeight: 700, color: C8.text, marginBottom: 4 }, children: [
17793
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: 12, fontWeight: 700, color: C9.text, marginBottom: 4 }, children: [
17686
17794
  title,
17687
17795
  " ",
17688
- /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: C8.amber }, children: [
17796
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: C9.amber }, children: [
17689
17797
  "(",
17690
17798
  rows.length,
17691
17799
  ")"
17692
17800
  ] })
17693
17801
  ] }),
17694
- /* @__PURE__ */ jsxRuntime.jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 12, color: C8.sub, lineHeight: 1.6 }, children: rows.slice(0, 8).map((r, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: r }, i)) })
17802
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 12, color: C9.sub, lineHeight: 1.6 }, children: rows.slice(0, 8).map((r, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: r }, i)) })
17695
17803
  ] }) : null;
17696
17804
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: card, children: [
17697
17805
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: 8, flexWrap: "wrap" }, children: [
17698
17806
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
17699
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C8.text }, children: s.title }),
17700
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C8.sub, marginTop: 2 }, children: s.subtitle })
17807
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C9.text }, children: s.title }),
17808
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C9.sub, marginTop: 2 }, children: s.subtitle })
17701
17809
  ] }),
17702
17810
  hasChannel && /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: sendNow, disabled: busy, style: btn, children: busy ? s.sending : s.sendNow })
17703
17811
  ] }),
17704
- error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: C8.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
17705
- notice && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: C8.green, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: notice }),
17812
+ error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: C9.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
17813
+ notice && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: C9.green, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: notice }),
17706
17814
  config && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: 12 }, children: [
17707
17815
  /* @__PURE__ */ jsxRuntime.jsxs("span", { style: chip(config.webhookConfigured, s.webhook), children: [
17708
17816
  s.webhook,
@@ -17715,15 +17823,15 @@ function AlertsPanel({ locale }) {
17715
17823
  config.emailConfigured ? s.configured : s.missing
17716
17824
  ] })
17717
17825
  ] }),
17718
- !loading && !hasChannel && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C8.sub }, children: s.notConfigured }),
17719
- loading && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C8.sub }, children: s.loading }),
17826
+ !loading && !hasChannel && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C9.sub }, children: s.notConfigured }),
17827
+ loading && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C9.sub }, children: s.loading }),
17720
17828
  digest && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: 8 }, children: [
17721
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: 12, color: C8.sub, marginTop: 6 }, children: [
17829
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: 12, color: C9.sub, marginTop: 6 }, children: [
17722
17830
  digest.totalIssues,
17723
17831
  " ",
17724
17832
  s.issues
17725
17833
  ] }),
17726
- digest.totalIssues === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 8, fontSize: 13, color: C8.sub }, children: s.noIssues }),
17834
+ digest.totalIssues === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 8, fontSize: 13, color: C9.sub }, children: s.noIssues }),
17727
17835
  list(
17728
17836
  s.scoreReg,
17729
17837
  digest.scoreRegressions.map((r) => `${r.collection}/${r.documentId} \u2014 ${r.from} \u2192 ${r.to} (\u2212${r.drop})`)
@@ -17733,7 +17841,7 @@ function AlertsPanel({ locale }) {
17733
17841
  ] })
17734
17842
  ] });
17735
17843
  }
17736
- var C9 = {
17844
+ var C10 = {
17737
17845
  text: "var(--theme-text, #1a1a1a)",
17738
17846
  sub: "var(--theme-elevation-600, #6b7280)",
17739
17847
  card: "var(--theme-elevation-50, #f9fafb)",
@@ -17743,7 +17851,7 @@ var C9 = {
17743
17851
  red: "#ef4444",
17744
17852
  violet: "#7c3aed"
17745
17853
  };
17746
- var S6 = {
17854
+ var S7 = {
17747
17855
  fr: {
17748
17856
  title: "Alt-text IA des images",
17749
17857
  subtitle: "G\xE9n\xE8re l'attribut alt des images qui n'en ont pas (Claude vision), pour l'accessibilit\xE9 et le SEO.",
@@ -17776,7 +17884,7 @@ var S6 = {
17776
17884
  }
17777
17885
  };
17778
17886
  function AltTextPanel({ locale }) {
17779
- const s = S6[locale] ?? S6.fr;
17887
+ const s = S7[locale] ?? S7.fr;
17780
17888
  const [items, setItems] = React4.useState(null);
17781
17889
  const [collection, setCollection] = React4.useState("media");
17782
17890
  const [missingCount, setMissingCount] = React4.useState(0);
@@ -17853,8 +17961,8 @@ function AltTextPanel({ locale }) {
17853
17961
  const card = {
17854
17962
  padding: 16,
17855
17963
  borderRadius: 12,
17856
- border: `1px solid ${C9.border}`,
17857
- backgroundColor: C9.card,
17964
+ border: `1px solid ${C10.border}`,
17965
+ backgroundColor: C10.card,
17858
17966
  marginBottom: 20
17859
17967
  };
17860
17968
  const btn = (bg) => ({
@@ -17870,18 +17978,18 @@ function AltTextPanel({ locale }) {
17870
17978
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: card, children: [
17871
17979
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: 8, flexWrap: "wrap" }, children: [
17872
17980
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
17873
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C9.text }, children: s.title }),
17874
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C9.sub, marginTop: 2 }, children: s.subtitle })
17981
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C10.text }, children: s.title }),
17982
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C10.sub, marginTop: 2 }, children: s.subtitle })
17875
17983
  ] }),
17876
- status === "ok" && /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void load(), style: btn(C9.sub), children: s.refresh })
17984
+ status === "ok" && /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void load(), style: btn(C10.sub), children: s.refresh })
17877
17985
  ] }),
17878
- status === "forbidden" && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C9.sub }, children: s.forbidden }),
17879
- status === "disabled" && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C9.sub }, children: s.disabled }),
17986
+ status === "forbidden" && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C10.sub }, children: s.forbidden }),
17987
+ status === "disabled" && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C10.sub }, children: s.disabled }),
17880
17988
  status === "ok" && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: 12 }, children: [
17881
- loading && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 13, color: C9.sub }, children: s.loading }),
17882
- !loading && items && items.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 13, color: C9.sub }, children: s.none }),
17989
+ loading && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 13, color: C10.sub }, children: s.loading }),
17990
+ !loading && items && items.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 13, color: C10.sub }, children: s.none }),
17883
17991
  !loading && items && items.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
17884
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: 12, color: C9.sub, marginBottom: 10 }, children: [
17992
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: 12, color: C10.sub, marginBottom: 10 }, children: [
17885
17993
  missingCount,
17886
17994
  " ",
17887
17995
  s.missing
@@ -17897,8 +18005,8 @@ function AltTextPanel({ locale }) {
17897
18005
  alignItems: "center",
17898
18006
  padding: 8,
17899
18007
  borderRadius: 8,
17900
- border: `1px solid ${C9.border}`,
17901
- backgroundColor: C9.bg
18008
+ border: `1px solid ${C10.border}`,
18009
+ backgroundColor: C10.bg
17902
18010
  },
17903
18011
  children: [
17904
18012
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -17906,11 +18014,11 @@ function AltTextPanel({ locale }) {
17906
18014
  {
17907
18015
  src: item.url,
17908
18016
  alt: "",
17909
- style: { width: 48, height: 48, objectFit: "cover", borderRadius: 6, flexShrink: 0, border: `1px solid ${C9.border}` }
18017
+ style: { width: 48, height: 48, objectFit: "cover", borderRadius: 6, flexShrink: 0, border: `1px solid ${C10.border}` }
17910
18018
  }
17911
18019
  ),
17912
18020
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
17913
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 11, color: C9.sub, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: item.filename }),
18021
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 11, color: C10.sub, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: item.filename }),
17914
18022
  rs.alt !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx(
17915
18023
  "input",
17916
18024
  {
@@ -17924,15 +18032,15 @@ function AltTextPanel({ locale }) {
17924
18032
  padding: "4px 8px",
17925
18033
  fontSize: 12,
17926
18034
  borderRadius: 6,
17927
- border: `1px solid ${C9.border}`,
17928
- backgroundColor: C9.bg,
17929
- color: C9.text
18035
+ border: `1px solid ${C10.border}`,
18036
+ backgroundColor: C10.bg,
18037
+ color: C10.text
17930
18038
  }
17931
18039
  }
17932
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C9.sub, marginTop: 4, fontStyle: "italic" }, children: "\u2014" }),
17933
- rs.error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 11, color: C9.red, marginTop: 2 }, children: rs.error })
18040
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C10.sub, marginTop: 4, fontStyle: "italic" }, children: "\u2014" }),
18041
+ rs.error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 11, color: C10.red, marginTop: 2 }, children: rs.error })
17934
18042
  ] }),
17935
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { flexShrink: 0 }, children: rs.applied ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 11, fontWeight: 700, color: C9.green }, children: s.applied }) : rs.alt !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void apply(item), disabled: rs.busy, style: btn(C9.green), children: rs.busy ? s.generating : s.apply }) : /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void generate(item), disabled: rs.busy, style: btn(C9.violet), children: rs.busy ? s.generating : s.generate }) })
18043
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { flexShrink: 0 }, children: rs.applied ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 11, fontWeight: 700, color: C10.green }, children: s.applied }) : rs.alt !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void apply(item), disabled: rs.busy, style: btn(C10.green), children: rs.busy ? s.generating : s.apply }) : /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void generate(item), disabled: rs.busy, style: btn(C10.violet), children: rs.busy ? s.generating : s.generate }) })
17936
18044
  ]
17937
18045
  },
17938
18046
  item.id
@@ -18354,6 +18462,7 @@ function PerformanceView() {
18354
18462
  ]
18355
18463
  }
18356
18464
  ),
18465
+ /* @__PURE__ */ jsxRuntime.jsx(HealthPanel, { locale }),
18357
18466
  /* @__PURE__ */ jsxRuntime.jsx(CoreWebVitalsPanel, { locale }),
18358
18467
  /* @__PURE__ */ jsxRuntime.jsx(GscPanel, { locale }),
18359
18468
  /* @__PURE__ */ jsxRuntime.jsx(RankTrackingPanel, { locale }),
@@ -18883,7 +18992,7 @@ function PerformanceView() {
18883
18992
  }
18884
18993
  );
18885
18994
  }
18886
- var C10 = {
18995
+ var C11 = {
18887
18996
  text: "var(--theme-text, #1a1a1a)",
18888
18997
  sub: "var(--theme-elevation-600, #6b7280)",
18889
18998
  card: "var(--theme-elevation-50, #f9fafb)",
@@ -18893,7 +19002,7 @@ var C10 = {
18893
19002
  red: "#ef4444",
18894
19003
  blue: "#3b82f6"
18895
19004
  };
18896
- var S7 = {
19005
+ var S8 = {
18897
19006
  fr: {
18898
19007
  title: "Brief de contenu IA",
18899
19008
  subtitle: "G\xE9n\xE8re un plan r\xE9dactionnel optimis\xE9 pour un mot-cl\xE9 (plan, entit\xE9s, questions, longueur cible).",
@@ -18928,7 +19037,7 @@ var S7 = {
18928
19037
  }
18929
19038
  };
18930
19039
  function ContentBriefPanel({ locale }) {
18931
- const s = S7[locale] ?? S7.fr;
19040
+ const s = S8[locale] ?? S8.fr;
18932
19041
  const [keyword, setKeyword] = React4.useState("");
18933
19042
  const [brief, setBrief] = React4.useState(null);
18934
19043
  const [busy, setBusy] = React4.useState(false);
@@ -18964,8 +19073,8 @@ function ContentBriefPanel({ locale }) {
18964
19073
  const card = {
18965
19074
  padding: 16,
18966
19075
  borderRadius: 12,
18967
- border: `1px solid ${C10.border}`,
18968
- backgroundColor: C10.card,
19076
+ border: `1px solid ${C11.border}`,
19077
+ backgroundColor: C11.card,
18969
19078
  marginBottom: 20
18970
19079
  };
18971
19080
  const chip = {
@@ -18974,14 +19083,14 @@ function ContentBriefPanel({ locale }) {
18974
19083
  padding: "3px 8px",
18975
19084
  borderRadius: 999,
18976
19085
  backgroundColor: "rgba(59,130,246,0.12)",
18977
- color: C10.blue,
18978
- border: `1px solid ${C10.border}`,
19086
+ color: C11.blue,
19087
+ border: `1px solid ${C11.border}`,
18979
19088
  margin: "0 6px 6px 0"
18980
19089
  };
18981
- const h4 = { fontSize: 12, fontWeight: 800, color: C10.text, margin: "14px 0 6px", textTransform: "uppercase" };
19090
+ const h4 = { fontSize: 12, fontWeight: 800, color: C11.text, margin: "14px 0 6px", textTransform: "uppercase" };
18982
19091
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: card, children: [
18983
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C10.text }, children: s.title }),
18984
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C10.sub, marginTop: 2, marginBottom: 12 }, children: s.subtitle }),
19092
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C11.text }, children: s.title }),
19093
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C11.sub, marginTop: 2, marginBottom: 12 }, children: s.subtitle }),
18985
19094
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: 8, flexWrap: "wrap" }, children: [
18986
19095
  /* @__PURE__ */ jsxRuntime.jsx(
18987
19096
  "input",
@@ -18998,9 +19107,9 @@ function ContentBriefPanel({ locale }) {
18998
19107
  padding: "8px 12px",
18999
19108
  fontSize: 13,
19000
19109
  borderRadius: 8,
19001
- border: `1px solid ${C10.border}`,
19002
- backgroundColor: C10.bg,
19003
- color: C10.text
19110
+ border: `1px solid ${C11.border}`,
19111
+ backgroundColor: C11.bg,
19112
+ color: C11.text
19004
19113
  }
19005
19114
  }
19006
19115
  ),
@@ -19013,8 +19122,8 @@ function ContentBriefPanel({ locale }) {
19013
19122
  style: {
19014
19123
  padding: "8px 14px",
19015
19124
  borderRadius: 8,
19016
- border: `1px solid ${C10.violet}`,
19017
- backgroundColor: C10.violet,
19125
+ border: `1px solid ${C11.violet}`,
19126
+ backgroundColor: C11.violet,
19018
19127
  color: "#fff",
19019
19128
  fontSize: 12,
19020
19129
  fontWeight: 700,
@@ -19025,12 +19134,12 @@ function ContentBriefPanel({ locale }) {
19025
19134
  }
19026
19135
  )
19027
19136
  ] }),
19028
- error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: C10.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
19137
+ error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: C11.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
19029
19138
  brief && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: 8 }, children: [
19030
- brief.recommendedWordCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: 12, color: C10.sub, marginTop: 10 }, children: [
19139
+ brief.recommendedWordCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: 12, color: C11.sub, marginTop: 10 }, children: [
19031
19140
  s.words,
19032
19141
  ": ",
19033
- /* @__PURE__ */ jsxRuntime.jsxs("b", { style: { color: C10.text }, children: [
19142
+ /* @__PURE__ */ jsxRuntime.jsxs("b", { style: { color: C11.text }, children: [
19034
19143
  "~",
19035
19144
  brief.recommendedWordCount,
19036
19145
  " ",
@@ -19039,7 +19148,7 @@ function ContentBriefPanel({ locale }) {
19039
19148
  ] }),
19040
19149
  brief.outline.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
19041
19150
  /* @__PURE__ */ jsxRuntime.jsx("div", { style: h4, children: s.outline }),
19042
- /* @__PURE__ */ jsxRuntime.jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 13, color: C10.text, lineHeight: 1.6 }, children: brief.outline.map((o, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { style: { marginLeft: o.level === "h3" ? 18 : 0, color: o.level === "h3" ? C10.sub : C10.text, fontWeight: o.level === "h2" ? 700 : 400 }, children: o.text }, i)) })
19151
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 13, color: C11.text, lineHeight: 1.6 }, children: brief.outline.map((o, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { style: { marginLeft: o.level === "h3" ? 18 : 0, color: o.level === "h3" ? C11.sub : C11.text, fontWeight: o.level === "h2" ? 700 : 400 }, children: o.text }, i)) })
19043
19152
  ] }),
19044
19153
  brief.entities.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
19045
19154
  /* @__PURE__ */ jsxRuntime.jsx("div", { style: h4, children: s.entities }),
@@ -19047,7 +19156,7 @@ function ContentBriefPanel({ locale }) {
19047
19156
  ] }),
19048
19157
  brief.questions.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
19049
19158
  /* @__PURE__ */ jsxRuntime.jsx("div", { style: h4, children: s.questions }),
19050
- /* @__PURE__ */ jsxRuntime.jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 13, color: C10.text, lineHeight: 1.6 }, children: brief.questions.map((q, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: q }, i)) })
19159
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 13, color: C11.text, lineHeight: 1.6 }, children: brief.questions.map((q, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: q }, i)) })
19051
19160
  ] }),
19052
19161
  brief.internalLinkIdeas.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
19053
19162
  /* @__PURE__ */ jsxRuntime.jsx("div", { style: h4, children: s.links }),
@@ -19055,7 +19164,7 @@ function ContentBriefPanel({ locale }) {
19055
19164
  ] }),
19056
19165
  brief.notes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
19057
19166
  /* @__PURE__ */ jsxRuntime.jsx("div", { style: h4, children: s.notes }),
19058
- /* @__PURE__ */ jsxRuntime.jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 12, color: C10.sub, lineHeight: 1.6 }, children: brief.notes.map((n, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: n }, i)) })
19167
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 12, color: C11.sub, lineHeight: 1.6 }, children: brief.notes.map((n, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: n }, i)) })
19059
19168
  ] })
19060
19169
  ] })
19061
19170
  ] });
@@ -20197,7 +20306,7 @@ var controlBtnStyle = {
20197
20306
  cursor: "pointer",
20198
20307
  lineHeight: 1.4
20199
20308
  };
20200
- var C11 = {
20309
+ var C12 = {
20201
20310
  cyan: "#00E5FF",
20202
20311
  black: "#000",
20203
20312
  green: "#22c55e",
@@ -20212,10 +20321,10 @@ var C11 = {
20212
20321
  var TITLE_MIN = 30;
20213
20322
  var TITLE_MAX = 60;
20214
20323
  function getCharColor(len) {
20215
- if (len === 0) return C11.textSecondary;
20216
- if (len >= TITLE_MIN && len <= TITLE_MAX) return C11.green;
20217
- if (len > 0 && len < TITLE_MIN) return C11.orange;
20218
- return C11.red;
20324
+ if (len === 0) return C12.textSecondary;
20325
+ if (len >= TITLE_MIN && len <= TITLE_MAX) return C12.green;
20326
+ if (len > 0 && len < TITLE_MIN) return C12.orange;
20327
+ return C12.red;
20219
20328
  }
20220
20329
  function getProgressPercent(len) {
20221
20330
  if (len === 0) return 0;
@@ -20223,9 +20332,9 @@ function getProgressPercent(len) {
20223
20332
  }
20224
20333
  function getProgressColor(len) {
20225
20334
  if (len === 0) return "var(--theme-elevation-200, #e5e7eb)";
20226
- if (len >= TITLE_MIN && len <= TITLE_MAX) return C11.green;
20227
- if (len < TITLE_MIN) return C11.orange;
20228
- return C11.red;
20335
+ if (len >= TITLE_MIN && len <= TITLE_MAX) return C12.green;
20336
+ if (len < TITLE_MIN) return C12.orange;
20337
+ return C12.red;
20229
20338
  }
20230
20339
  function MetaTitleField({
20231
20340
  path,
@@ -20296,7 +20405,7 @@ function MetaTitleField({
20296
20405
  style: {
20297
20406
  fontSize: 13,
20298
20407
  fontWeight: 700,
20299
- color: C11.textPrimary
20408
+ color: C12.textPrimary
20300
20409
  },
20301
20410
  children: t.metaTitle.label
20302
20411
  }
@@ -20336,9 +20445,9 @@ function MetaTitleField({
20336
20445
  fontSize: 14,
20337
20446
  fontFamily: "inherit",
20338
20447
  borderRadius: 8,
20339
- border: `2px solid ${C11.border}`,
20340
- backgroundColor: C11.surfaceBg,
20341
- color: C11.textPrimary,
20448
+ border: `2px solid ${C12.border}`,
20449
+ backgroundColor: C12.surfaceBg,
20450
+ color: C12.textPrimary,
20342
20451
  outline: "none",
20343
20452
  boxShadow: "2px 2px 0 0 var(--theme-border-color, rgba(0,0,0,1))"
20344
20453
  }
@@ -20356,9 +20465,9 @@ function MetaTitleField({
20356
20465
  gap: 5,
20357
20466
  padding: "8px 14px",
20358
20467
  borderRadius: 8,
20359
- border: `2px solid ${C11.border}`,
20360
- backgroundColor: loading ? C11.surface50 : C11.cyan,
20361
- color: loading ? C11.textSecondary : C11.black,
20468
+ border: `2px solid ${C12.border}`,
20469
+ backgroundColor: loading ? C12.surface50 : C12.cyan,
20470
+ color: loading ? C12.textSecondary : C12.black,
20362
20471
  fontWeight: 800,
20363
20472
  fontSize: 11,
20364
20473
  textTransform: "uppercase",
@@ -20405,7 +20514,7 @@ function MetaTitleField({
20405
20514
  justifyContent: "space-between",
20406
20515
  marginTop: 4,
20407
20516
  fontSize: 10,
20408
- color: C11.textSecondary
20517
+ color: C12.textSecondary
20409
20518
  },
20410
20519
  children: [
20411
20520
  /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
@@ -20439,9 +20548,9 @@ function MetaTitleField({
20439
20548
  borderRadius: 6,
20440
20549
  fontSize: 11,
20441
20550
  fontWeight: 600,
20442
- color: C11.red,
20551
+ color: C12.red,
20443
20552
  backgroundColor: "rgba(239,68,68,0.08)",
20444
- border: `1px solid ${C11.red}`
20553
+ border: `1px solid ${C12.red}`
20445
20554
  },
20446
20555
  children: error
20447
20556
  }
@@ -20450,7 +20559,7 @@ function MetaTitleField({
20450
20559
  }
20451
20560
  );
20452
20561
  }
20453
- var C12 = {
20562
+ var C13 = {
20454
20563
  cyan: "#00E5FF",
20455
20564
  black: "#000",
20456
20565
  green: "#22c55e",
@@ -20465,10 +20574,10 @@ var C12 = {
20465
20574
  var DESC_MIN = 120;
20466
20575
  var DESC_MAX = 160;
20467
20576
  function getCharColor2(len) {
20468
- if (len === 0) return C12.textSecondary;
20469
- if (len >= DESC_MIN && len <= DESC_MAX) return C12.green;
20470
- if (len > 0 && len < DESC_MIN) return C12.orange;
20471
- return C12.red;
20577
+ if (len === 0) return C13.textSecondary;
20578
+ if (len >= DESC_MIN && len <= DESC_MAX) return C13.green;
20579
+ if (len > 0 && len < DESC_MIN) return C13.orange;
20580
+ return C13.red;
20472
20581
  }
20473
20582
  function getProgressPercent2(len) {
20474
20583
  if (len === 0) return 0;
@@ -20476,9 +20585,9 @@ function getProgressPercent2(len) {
20476
20585
  }
20477
20586
  function getProgressColor2(len) {
20478
20587
  if (len === 0) return "var(--theme-elevation-200, #e5e7eb)";
20479
- if (len >= DESC_MIN && len <= DESC_MAX) return C12.green;
20480
- if (len < DESC_MIN) return C12.orange;
20481
- return C12.red;
20588
+ if (len >= DESC_MIN && len <= DESC_MAX) return C13.green;
20589
+ if (len < DESC_MIN) return C13.orange;
20590
+ return C13.red;
20482
20591
  }
20483
20592
  function MetaDescriptionField({
20484
20593
  path,
@@ -20549,7 +20658,7 @@ function MetaDescriptionField({
20549
20658
  style: {
20550
20659
  fontSize: 13,
20551
20660
  fontWeight: 700,
20552
- color: C12.textPrimary
20661
+ color: C13.textPrimary
20553
20662
  },
20554
20663
  children: t.metaDescription.label
20555
20664
  }
@@ -20589,9 +20698,9 @@ function MetaDescriptionField({
20589
20698
  fontSize: 14,
20590
20699
  fontFamily: "inherit",
20591
20700
  borderRadius: 8,
20592
- border: `2px solid ${C12.border}`,
20593
- backgroundColor: C12.surfaceBg,
20594
- color: C12.textPrimary,
20701
+ border: `2px solid ${C13.border}`,
20702
+ backgroundColor: C13.surfaceBg,
20703
+ color: C13.textPrimary,
20595
20704
  outline: "none",
20596
20705
  resize: "vertical",
20597
20706
  lineHeight: 1.5,
@@ -20611,9 +20720,9 @@ function MetaDescriptionField({
20611
20720
  gap: 5,
20612
20721
  padding: "8px 14px",
20613
20722
  borderRadius: 8,
20614
- border: `2px solid ${C12.border}`,
20615
- backgroundColor: loading ? C12.surface50 : C12.cyan,
20616
- color: loading ? C12.textSecondary : C12.black,
20723
+ border: `2px solid ${C13.border}`,
20724
+ backgroundColor: loading ? C13.surface50 : C13.cyan,
20725
+ color: loading ? C13.textSecondary : C13.black,
20617
20726
  fontWeight: 800,
20618
20727
  fontSize: 11,
20619
20728
  textTransform: "uppercase",
@@ -20661,7 +20770,7 @@ function MetaDescriptionField({
20661
20770
  justifyContent: "space-between",
20662
20771
  marginTop: 4,
20663
20772
  fontSize: 10,
20664
- color: C12.textSecondary
20773
+ color: C13.textSecondary
20665
20774
  },
20666
20775
  children: [
20667
20776
  /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
@@ -20695,9 +20804,9 @@ function MetaDescriptionField({
20695
20804
  borderRadius: 6,
20696
20805
  fontSize: 11,
20697
20806
  fontWeight: 600,
20698
- color: C12.red,
20807
+ color: C13.red,
20699
20808
  backgroundColor: "rgba(239,68,68,0.08)",
20700
- border: `1px solid ${C12.red}`
20809
+ border: `1px solid ${C13.red}`
20701
20810
  },
20702
20811
  children: error
20703
20812
  }
@@ -20706,7 +20815,7 @@ function MetaDescriptionField({
20706
20815
  }
20707
20816
  );
20708
20817
  }
20709
- var C13 = {
20818
+ var C14 = {
20710
20819
  cyan: "#00E5FF",
20711
20820
  black: "#000",
20712
20821
  white: "#fff",
@@ -20783,8 +20892,8 @@ function MetaImageField({
20783
20892
  gap: 10,
20784
20893
  padding: "10px 14px",
20785
20894
  borderRadius: 8,
20786
- border: `2px solid ${C13.border}`,
20787
- backgroundColor: C13.surfaceBg,
20895
+ border: `2px solid ${C14.border}`,
20896
+ backgroundColor: C14.surfaceBg,
20788
20897
  boxShadow: "2px 2px 0 0 var(--theme-border-color, rgba(0,0,0,1))"
20789
20898
  },
20790
20899
  children: [
@@ -20803,7 +20912,7 @@ function MetaImageField({
20803
20912
  fontWeight: 900,
20804
20913
  backgroundColor: hasImage ? "rgba(34,197,94,0.15)" : "rgba(255,138,0,0.15)",
20805
20914
  color: hasImage ? "#16a34a" : "#d97706",
20806
- border: `1px solid ${hasImage ? C13.green : C13.orange}`
20915
+ border: `1px solid ${hasImage ? C14.green : C14.orange}`
20807
20916
  },
20808
20917
  children: hasImage ? "\u2713" : "!"
20809
20918
  }
@@ -20815,7 +20924,7 @@ function MetaImageField({
20815
20924
  style: {
20816
20925
  fontSize: 12,
20817
20926
  fontWeight: 700,
20818
- color: C13.textPrimary
20927
+ color: C14.textPrimary
20819
20928
  },
20820
20929
  children: t.metaImage.label
20821
20930
  }
@@ -20825,7 +20934,7 @@ function MetaImageField({
20825
20934
  {
20826
20935
  style: {
20827
20936
  fontSize: 10,
20828
- color: C13.textSecondary,
20937
+ color: C14.textSecondary,
20829
20938
  lineHeight: 1.4
20830
20939
  },
20831
20940
  children: hasImage ? t.metaImage.imageSet : t.metaImage.noImage
@@ -20845,9 +20954,9 @@ function MetaImageField({
20845
20954
  gap: 5,
20846
20955
  padding: "8px 14px",
20847
20956
  borderRadius: 8,
20848
- border: `2px solid ${C13.border}`,
20849
- backgroundColor: loading ? C13.surface50 : success ? C13.green : C13.cyan,
20850
- color: loading ? C13.textSecondary : success ? C13.white : C13.black,
20957
+ border: `2px solid ${C14.border}`,
20958
+ backgroundColor: loading ? C14.surface50 : success ? C14.green : C14.cyan,
20959
+ color: loading ? C14.textSecondary : success ? C14.white : C14.black,
20851
20960
  fontWeight: 800,
20852
20961
  fontSize: 11,
20853
20962
  textTransform: "uppercase",
@@ -20874,9 +20983,9 @@ function MetaImageField({
20874
20983
  borderRadius: 6,
20875
20984
  fontSize: 11,
20876
20985
  fontWeight: 600,
20877
- color: C13.red,
20986
+ color: C14.red,
20878
20987
  backgroundColor: "rgba(239,68,68,0.08)",
20879
- border: `1px solid ${C13.red}`
20988
+ border: `1px solid ${C14.red}`
20880
20989
  },
20881
20990
  children: error
20882
20991
  }
@@ -20885,7 +20994,7 @@ function MetaImageField({
20885
20994
  }
20886
20995
  );
20887
20996
  }
20888
- var C14 = {
20997
+ var C15 = {
20889
20998
  black: "#000",
20890
20999
  white: "#fff",
20891
21000
  green: "#22c55e",
@@ -20899,15 +21008,15 @@ var C14 = {
20899
21008
  function getCompletenessColor(count) {
20900
21009
  switch (count) {
20901
21010
  case 0:
20902
- return C14.red;
21011
+ return C15.red;
20903
21012
  case 1:
20904
- return C14.orange;
21013
+ return C15.orange;
20905
21014
  case 2:
20906
- return C14.yellow;
21015
+ return C15.yellow;
20907
21016
  case 3:
20908
- return C14.green;
21017
+ return C15.green;
20909
21018
  default:
20910
- return C14.textSecondary;
21019
+ return C15.textSecondary;
20911
21020
  }
20912
21021
  }
20913
21022
  function getCompletenessLabel(count, ov) {
@@ -20965,8 +21074,8 @@ function OverviewField({
20965
21074
  fontFamily: "var(--font-body, Inter, system-ui, sans-serif)",
20966
21075
  padding: "12px 14px",
20967
21076
  borderRadius: 10,
20968
- border: `2px solid ${C14.border}`,
20969
- backgroundColor: C14.surfaceBg,
21077
+ border: `2px solid ${C15.border}`,
21078
+ backgroundColor: C15.surfaceBg,
20970
21079
  boxShadow: "3px 3px 0 0 var(--theme-border-color, rgba(0,0,0,1))",
20971
21080
  marginBottom: 12
20972
21081
  },
@@ -20989,7 +21098,7 @@ function OverviewField({
20989
21098
  fontWeight: 800,
20990
21099
  textTransform: "uppercase",
20991
21100
  letterSpacing: "0.04em",
20992
- color: C14.textPrimary
21101
+ color: C15.textPrimary
20993
21102
  },
20994
21103
  children: t.overview.metaCompleteness
20995
21104
  }
@@ -21004,8 +21113,8 @@ function OverviewField({
21004
21113
  fontSize: 11,
21005
21114
  fontWeight: 800,
21006
21115
  backgroundColor: completenessColor,
21007
- color: completenessColor === C14.yellow ? C14.black : C14.white,
21008
- border: `2px solid ${C14.border}`,
21116
+ color: completenessColor === C15.yellow ? C15.black : C15.white,
21117
+ border: `2px solid ${C15.border}`,
21009
21118
  textTransform: "uppercase",
21010
21119
  letterSpacing: "0.03em"
21011
21120
  },
@@ -21103,7 +21212,7 @@ function OverviewField({
21103
21212
  style: {
21104
21213
  fontSize: 12,
21105
21214
  fontWeight: 600,
21106
- color: item.filled ? C14.textPrimary : C14.textSecondary
21215
+ color: item.filled ? C15.textPrimary : C15.textSecondary
21107
21216
  },
21108
21217
  children: item.label
21109
21218
  }
@@ -21115,7 +21224,7 @@ function OverviewField({
21115
21224
  marginLeft: "auto",
21116
21225
  fontSize: 10,
21117
21226
  fontWeight: 700,
21118
- color: item.filled ? C14.green : C14.red,
21227
+ color: item.filled ? C15.green : C15.red,
21119
21228
  textTransform: "uppercase",
21120
21229
  letterSpacing: "0.03em"
21121
21230
  },
@@ -21132,7 +21241,7 @@ function OverviewField({
21132
21241
  }
21133
21242
  );
21134
21243
  }
21135
- var C15 = {
21244
+ var C16 = {
21136
21245
  cyan: "#00E5FF",
21137
21246
  black: "#000",
21138
21247
  white: "#fff",
@@ -21151,10 +21260,10 @@ var G = {
21151
21260
  descGrey: "#4d5156",
21152
21261
  faviconBg: "#e8eaed"};
21153
21262
  function charCountColor2(len, min, max) {
21154
- if (len >= min && len <= max) return C15.green;
21155
- if (len > 0 && len < min) return C15.orange;
21156
- if (len > max) return C15.red;
21157
- return C15.textSecondary;
21263
+ if (len >= min && len <= max) return C16.green;
21264
+ if (len > 0 && len < min) return C16.orange;
21265
+ if (len > max) return C16.red;
21266
+ return C16.textSecondary;
21158
21267
  }
21159
21268
  function truncateText(text, maxChars) {
21160
21269
  if (text.length <= maxChars) return text;
@@ -21209,8 +21318,8 @@ function SerpPreview({
21209
21318
  padding: "10px 12px",
21210
21319
  cursor: "pointer",
21211
21320
  borderRadius: 8,
21212
- border: `2px solid ${C15.border}`,
21213
- backgroundColor: C15.surface50,
21321
+ border: `2px solid ${C16.border}`,
21322
+ backgroundColor: C16.surface50,
21214
21323
  userSelect: "none"
21215
21324
  },
21216
21325
  children: [
@@ -21225,7 +21334,7 @@ function SerpPreview({
21225
21334
  fontWeight: 800,
21226
21335
  textTransform: "uppercase",
21227
21336
  letterSpacing: "0.04em",
21228
- color: C15.textPrimary
21337
+ color: C16.textPrimary
21229
21338
  },
21230
21339
  children: [
21231
21340
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -21257,7 +21366,7 @@ function SerpPreview({
21257
21366
  transition: "transform 0.2s",
21258
21367
  display: "inline-block",
21259
21368
  transform: open ? "rotate(90deg)" : "none",
21260
- color: C15.textSecondary
21369
+ color: C16.textSecondary
21261
21370
  },
21262
21371
  children: "\u25B6"
21263
21372
  }
@@ -21290,10 +21399,10 @@ function SerpPreview({
21290
21399
  "div",
21291
21400
  {
21292
21401
  style: {
21293
- backgroundColor: C15.white,
21294
- border: `2px solid ${C15.border}`,
21402
+ backgroundColor: C16.white,
21403
+ border: `2px solid ${C16.border}`,
21295
21404
  borderRadius: 12,
21296
- boxShadow: `3px 3px 0 0 ${C15.border}`,
21405
+ boxShadow: `3px 3px 0 0 ${C16.border}`,
21297
21406
  padding: isDesktop ? 20 : 14,
21298
21407
  maxWidth: isDesktop ? 650 : 380,
21299
21408
  overflow: "hidden"
@@ -21356,7 +21465,7 @@ function SerpPreview({
21356
21465
  style: {
21357
21466
  fontSize: 14,
21358
21467
  fontWeight: 400,
21359
- color: C15.black,
21468
+ color: C16.black,
21360
21469
  lineHeight: 1.3,
21361
21470
  whiteSpace: "nowrap",
21362
21471
  overflow: "hidden",
@@ -21420,7 +21529,7 @@ function SerpPreview({
21420
21529
  "span",
21421
21530
  {
21422
21531
  style: {
21423
- color: C15.textSecondary,
21532
+ color: C16.textSecondary,
21424
21533
  fontStyle: "italic",
21425
21534
  fontSize: titleFontSize - 2
21426
21535
  },
@@ -21449,7 +21558,7 @@ function SerpPreview({
21449
21558
  "span",
21450
21559
  {
21451
21560
  style: {
21452
- color: C15.textSecondary,
21561
+ color: C16.textSecondary,
21453
21562
  fontStyle: "italic",
21454
21563
  fontSize: descFontSize - 1
21455
21564
  },
@@ -21482,7 +21591,7 @@ function SerpPreview({
21482
21591
  fontSize: 11
21483
21592
  },
21484
21593
  children: [
21485
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: C15.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewTitle }),
21594
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: C16.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewTitle }),
21486
21595
  /* @__PURE__ */ jsxRuntime.jsxs(
21487
21596
  "span",
21488
21597
  {
@@ -21511,7 +21620,7 @@ function SerpPreview({
21511
21620
  fontSize: 11
21512
21621
  },
21513
21622
  children: [
21514
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: C15.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewDescription }),
21623
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: C16.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewDescription }),
21515
21624
  /* @__PURE__ */ jsxRuntime.jsxs(
21516
21625
  "span",
21517
21626
  {
@@ -21540,14 +21649,14 @@ function SerpPreview({
21540
21649
  fontSize: 11
21541
21650
  },
21542
21651
  children: [
21543
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: C15.textSecondary, fontWeight: 600 }, children: t.serpPreview.url }),
21652
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: C16.textSecondary, fontWeight: 600 }, children: t.serpPreview.url }),
21544
21653
  /* @__PURE__ */ jsxRuntime.jsxs(
21545
21654
  "span",
21546
21655
  {
21547
21656
  style: {
21548
21657
  fontWeight: 700,
21549
21658
  fontVariantNumeric: "tabular-nums",
21550
- color: fullUrl.length <= 75 ? C15.green : C15.red
21659
+ color: fullUrl.length <= 75 ? C16.green : C16.red
21551
21660
  },
21552
21661
  children: [
21553
21662
  fullUrl.length,
@@ -21582,13 +21691,13 @@ function DeviceButton({
21582
21691
  gap: 5,
21583
21692
  padding: "4px 12px",
21584
21693
  borderRadius: 6,
21585
- border: `2px solid ${C15.border}`,
21694
+ border: `2px solid ${C16.border}`,
21586
21695
  fontSize: 11,
21587
21696
  fontWeight: 700,
21588
21697
  cursor: "pointer",
21589
- backgroundColor: active ? C15.cyan : C15.surfaceBg,
21590
- color: active ? C15.black : C15.textPrimary,
21591
- boxShadow: active ? `2px 2px 0 0 ${C15.border}` : "none",
21698
+ backgroundColor: active ? C16.cyan : C16.surfaceBg,
21699
+ color: active ? C16.black : C16.textPrimary,
21700
+ boxShadow: active ? `2px 2px 0 0 ${C16.border}` : "none",
21592
21701
  transition: "background-color 0.15s"
21593
21702
  },
21594
21703
  children: [