@consilioweb/payload-seo-analyzer 1.12.0 → 1.14.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
@@ -1062,6 +1062,8 @@ var fr = {
1062
1062
  bulkOptimizeMeta: "Optimiser m\xE9ta (IA)",
1063
1063
  bulkOptimizing: "Analyse\u2026",
1064
1064
  bulkConfirm: "Confirmer ?",
1065
+ optimizeSite: "Optimiser le site",
1066
+ optimizeSiteHint: "Cible automatiquement les pages \xE0 probl\xE8me (m\xE9ta manquante, sans mot-cl\xE9, score faible) \u2192 aper\xE7u \u2192 appliquer",
1065
1067
  bulkPreviewTitle: "Corrections m\xE9ta propos\xE9es",
1066
1068
  bulkApply: "Appliquer",
1067
1069
  bulkApplying: "Application\u2026",
@@ -1664,6 +1666,8 @@ var en = {
1664
1666
  bulkOptimizeMeta: "Optimize meta (AI)",
1665
1667
  bulkOptimizing: "Analyzing\u2026",
1666
1668
  bulkConfirm: "Confirm?",
1669
+ optimizeSite: "Optimize site",
1670
+ optimizeSiteHint: "Auto-targets pages that need work (missing meta, no keyword, low score) \u2192 preview \u2192 apply",
1667
1671
  bulkPreviewTitle: "Proposed meta corrections",
1668
1672
  bulkApply: "Apply",
1669
1673
  bulkApplying: "Applying\u2026",
@@ -9538,9 +9542,9 @@ function SeoView() {
9538
9542
  },
9539
9543
  [selectedIds, fetchAudit]
9540
9544
  );
9541
- const handleBulkOptimizeMeta = useCallback(async () => {
9542
- const ids = Array.from(selectedIds).filter((k) => !k.startsWith("global:"));
9543
- if (ids.length === 0) return;
9545
+ const runBulkPreview = useCallback(async (ids) => {
9546
+ const clean = ids.filter((k) => !k.startsWith("global:"));
9547
+ if (clean.length === 0) return;
9544
9548
  setBulkOptimizing(true);
9545
9549
  setBulkPreview(null);
9546
9550
  try {
@@ -9548,7 +9552,7 @@ function SeoView() {
9548
9552
  method: "POST",
9549
9553
  headers: { "Content-Type": "application/json" },
9550
9554
  credentials: "include",
9551
- body: JSON.stringify({ ids, apply: false, limit: 100 })
9555
+ body: JSON.stringify({ ids: clean, apply: false, limit: 100 })
9552
9556
  });
9553
9557
  if (res.ok) {
9554
9558
  const data = await res.json();
@@ -9558,7 +9562,15 @@ function SeoView() {
9558
9562
  } catch {
9559
9563
  }
9560
9564
  setBulkOptimizing(false);
9561
- }, [selectedIds]);
9565
+ }, []);
9566
+ const handleBulkOptimizeMeta = useCallback(
9567
+ () => runBulkPreview(Array.from(selectedIds)),
9568
+ [selectedIds, runBulkPreview]
9569
+ );
9570
+ const handleOptimizeSite = useCallback(() => {
9571
+ 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);
9572
+ runBulkPreview(targets);
9573
+ }, [items, runBulkPreview]);
9562
9574
  const handleBulkApplyPreview = useCallback(async () => {
9563
9575
  if (!bulkPreview || bulkPreview.results.length === 0) return;
9564
9576
  setBulkApplying(true);
@@ -9925,6 +9937,16 @@ function SeoView() {
9925
9937
  ] })
9926
9938
  ] }),
9927
9939
  /* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: 8 }, children: [
9940
+ /* @__PURE__ */ jsx(
9941
+ "button",
9942
+ {
9943
+ onClick: handleOptimizeSite,
9944
+ disabled: bulkOptimizing || items.length === 0,
9945
+ title: t.seoView.optimizeSiteHint,
9946
+ style: { ...btnBase, backgroundColor: "#7c3aed", color: "#fff", opacity: bulkOptimizing || items.length === 0 ? 0.6 : 1 },
9947
+ children: bulkOptimizing ? t.seoView.bulkOptimizing : `\u2728 ${t.seoView.optimizeSite}`
9948
+ }
9949
+ ),
9928
9950
  /* @__PURE__ */ jsxs(
9929
9951
  "button",
9930
9952
  {
@@ -17349,9 +17371,210 @@ var C7 = {
17349
17371
  green: "#22c55e",
17350
17372
  red: "#ef4444",
17351
17373
  amber: "#f59e0b",
17352
- blue: "#3b82f6"
17374
+ violet: "#7c3aed"
17353
17375
  };
17354
17376
  var S4 = {
17377
+ fr: {
17378
+ title: "Opportunit\xE9s CTR (faible clic / bonne position)",
17379
+ 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.",
17380
+ needGsc: "Connectez Google Search Console ci-dessus pour activer les opportunit\xE9s CTR.",
17381
+ none: "Aucune opportunit\xE9 d\xE9tect\xE9e sur la p\xE9riode. \u{1F389}",
17382
+ loading: "Analyse des donn\xE9es GSC\u2026",
17383
+ page: "Page",
17384
+ pos: "Pos.",
17385
+ ctr: "CTR",
17386
+ expected: "attendu",
17387
+ potential: "Clics/mois potentiels",
17388
+ optimize: "Optimiser",
17389
+ optimizing: "\u2026",
17390
+ apply: "Appliquer",
17391
+ applied: "Appliqu\xE9 \u2713",
17392
+ noKey: "Cl\xE9 API Claude requise (ANTHROPIC_API_KEY).",
17393
+ open: "Ouvrir",
17394
+ refresh: "Rafra\xEEchir"
17395
+ },
17396
+ en: {
17397
+ title: "CTR opportunities (low clicks / good rank)",
17398
+ subtitle: "Pages that rank well but get few clicks (weak meta). Google Search Console data \u2192 targeted meta rewrite.",
17399
+ needGsc: "Connect Google Search Console above to enable CTR opportunities.",
17400
+ none: "No opportunities for the period. \u{1F389}",
17401
+ loading: "Analyzing GSC data\u2026",
17402
+ page: "Page",
17403
+ pos: "Pos.",
17404
+ ctr: "CTR",
17405
+ expected: "expected",
17406
+ potential: "Potential clicks/mo",
17407
+ optimize: "Optimize",
17408
+ optimizing: "\u2026",
17409
+ apply: "Apply",
17410
+ applied: "Applied \u2713",
17411
+ noKey: "Claude API key required (ANTHROPIC_API_KEY).",
17412
+ open: "Open",
17413
+ refresh: "Refresh"
17414
+ }
17415
+ };
17416
+ function CtrOpportunitiesPanel({ locale }) {
17417
+ const s = S4[locale] ?? S4.fr;
17418
+ const [opps, setOpps] = useState(null);
17419
+ const [loading, setLoading] = useState(true);
17420
+ const [notConnected, setNotConnected] = useState(false);
17421
+ const [error, setError] = useState(null);
17422
+ const [state, setState] = useState({});
17423
+ const load = useCallback(async () => {
17424
+ setLoading(true);
17425
+ setError(null);
17426
+ try {
17427
+ const res = await fetch("/api/seo-plugin/ctr-opportunities", { credentials: "include", cache: "no-store" });
17428
+ if (res.status === 403 || res.status === 409 || res.status === 400) {
17429
+ setNotConnected(true);
17430
+ return;
17431
+ }
17432
+ const json = await res.json();
17433
+ if (!res.ok) {
17434
+ setError(json.error || `Error ${res.status}`);
17435
+ return;
17436
+ }
17437
+ setNotConnected(false);
17438
+ setOpps(json.opportunities || []);
17439
+ } catch (e) {
17440
+ setError(e instanceof Error ? e.message : "Network error");
17441
+ } finally {
17442
+ setLoading(false);
17443
+ }
17444
+ }, []);
17445
+ useEffect(() => {
17446
+ void load();
17447
+ }, [load]);
17448
+ const setRow = (url, patch) => setState((p) => ({ ...p, [url]: { ...p[url], ...patch } }));
17449
+ const optimize = async (o) => {
17450
+ if (!o.doc) return;
17451
+ setRow(o.url, { busy: true, error: void 0 });
17452
+ try {
17453
+ const res = await fetch("/api/seo-plugin/ai-optimize", {
17454
+ method: "POST",
17455
+ credentials: "include",
17456
+ headers: { "Content-Type": "application/json" },
17457
+ body: JSON.stringify({ collection: o.doc.collection, id: o.doc.id })
17458
+ });
17459
+ const json = await res.json();
17460
+ if (!res.ok) {
17461
+ setRow(o.url, { busy: false, error: json.code === "no_api_key" ? s.noKey : json.error || `Error ${res.status}` });
17462
+ return;
17463
+ }
17464
+ setRow(o.url, { busy: false, suggestion: { ...json.suggestions, current: json.current } });
17465
+ } catch (e) {
17466
+ setRow(o.url, { busy: false, error: e instanceof Error ? e.message : "Network error" });
17467
+ }
17468
+ };
17469
+ const apply = async (o) => {
17470
+ const rs = state[o.url];
17471
+ if (!o.doc || !rs?.suggestion) return;
17472
+ setRow(o.url, { busy: true, error: void 0 });
17473
+ const patch = {};
17474
+ if (rs.suggestion.metaTitle || rs.suggestion.metaDescription) {
17475
+ patch.meta = { title: rs.suggestion.metaTitle, description: rs.suggestion.metaDescription };
17476
+ }
17477
+ if (rs.suggestion.focusKeyword && rs.suggestion.focusKeyword !== rs.suggestion.current?.focusKeyword) {
17478
+ patch.focusKeyword = rs.suggestion.focusKeyword;
17479
+ }
17480
+ try {
17481
+ await fetch(`/api/${o.doc.collection}/${o.doc.id}`, {
17482
+ method: "PATCH",
17483
+ credentials: "include",
17484
+ headers: { "Content-Type": "application/json" },
17485
+ body: JSON.stringify(patch)
17486
+ });
17487
+ setRow(o.url, { busy: false, applied: true });
17488
+ } catch (e) {
17489
+ setRow(o.url, { busy: false, error: e instanceof Error ? e.message : "Network error" });
17490
+ }
17491
+ };
17492
+ const card = { padding: 16, borderRadius: 12, border: `1px solid ${C7.border}`, backgroundColor: C7.card, marginBottom: 20 };
17493
+ const btn = (bg) => ({
17494
+ padding: "5px 10px",
17495
+ borderRadius: 6,
17496
+ border: `1px solid ${bg}`,
17497
+ backgroundColor: bg,
17498
+ color: "#fff",
17499
+ fontSize: 11,
17500
+ fontWeight: 700,
17501
+ cursor: "pointer"
17502
+ });
17503
+ return /* @__PURE__ */ jsxs("div", { style: card, children: [
17504
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", gap: 8, flexWrap: "wrap" }, children: [
17505
+ /* @__PURE__ */ jsxs("div", { children: [
17506
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C7.text }, children: s.title }),
17507
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 12, color: C7.sub, marginTop: 2 }, children: s.subtitle })
17508
+ ] }),
17509
+ !notConnected && /* @__PURE__ */ jsx("button", { type: "button", onClick: () => void load(), style: btn(C7.sub), children: s.refresh })
17510
+ ] }),
17511
+ error && /* @__PURE__ */ jsx("div", { style: { color: C7.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
17512
+ notConnected && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C7.sub }, children: s.needGsc }),
17513
+ loading && !notConnected && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C7.sub }, children: s.loading }),
17514
+ !loading && !notConnected && opps && opps.length === 0 && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C7.sub }, children: s.none }),
17515
+ !notConnected && opps && opps.length > 0 && /* @__PURE__ */ jsx("div", { style: { overflowX: "auto", marginTop: 12 }, children: /* @__PURE__ */ jsxs("table", { style: { width: "100%", borderCollapse: "collapse", fontSize: 12 }, children: [
17516
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { style: { textAlign: "left", color: C7.sub }, children: [
17517
+ /* @__PURE__ */ jsx("th", { style: { padding: "6px 8px" }, children: s.page }),
17518
+ /* @__PURE__ */ jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.pos }),
17519
+ /* @__PURE__ */ jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.ctr }),
17520
+ /* @__PURE__ */ jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.potential }),
17521
+ /* @__PURE__ */ jsx("th", { style: { padding: "6px 8px" } })
17522
+ ] }) }),
17523
+ /* @__PURE__ */ jsx("tbody", { children: opps.slice(0, 50).map((o) => {
17524
+ const rs = state[o.url] || {};
17525
+ const path = (() => {
17526
+ try {
17527
+ return new URL(o.url).pathname;
17528
+ } catch {
17529
+ return o.url;
17530
+ }
17531
+ })();
17532
+ return /* @__PURE__ */ jsxs(React4.Fragment, { children: [
17533
+ /* @__PURE__ */ jsxs("tr", { style: { borderTop: `1px solid ${C7.border}`, color: C7.text }, children: [
17534
+ /* @__PURE__ */ jsx("td", { style: { padding: "6px 8px", maxWidth: 320, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: path }),
17535
+ /* @__PURE__ */ jsx("td", { style: { padding: "6px 8px", textAlign: "right" }, children: o.position.toFixed(1) }),
17536
+ /* @__PURE__ */ jsxs("td", { style: { padding: "6px 8px", textAlign: "right" }, children: [
17537
+ /* @__PURE__ */ jsxs("span", { style: { color: C7.red }, children: [
17538
+ (o.ctr * 100).toFixed(1),
17539
+ "%"
17540
+ ] }),
17541
+ /* @__PURE__ */ jsxs("span", { style: { color: C7.sub }, children: [
17542
+ " / ",
17543
+ (o.expectedCtr * 100).toFixed(0),
17544
+ "% ",
17545
+ s.expected
17546
+ ] })
17547
+ ] }),
17548
+ /* @__PURE__ */ jsxs("td", { style: { padding: "6px 8px", textAlign: "right", fontWeight: 700, color: C7.amber }, children: [
17549
+ "+",
17550
+ o.potentialClicks
17551
+ ] }),
17552
+ /* @__PURE__ */ jsx("td", { style: { padding: "6px 8px", textAlign: "right" }, children: rs.applied ? /* @__PURE__ */ jsx("span", { style: { fontSize: 11, fontWeight: 700, color: C7.green }, children: s.applied }) : o.doc ? rs.suggestion ? /* @__PURE__ */ jsx("button", { type: "button", onClick: () => void apply(o), disabled: rs.busy, style: btn(C7.green), children: rs.busy ? s.optimizing : s.apply }) : /* @__PURE__ */ jsx("button", { type: "button", onClick: () => void optimize(o), disabled: rs.busy, style: btn(C7.violet), children: rs.busy ? s.optimizing : `\u2728 ${s.optimize}` }) : /* @__PURE__ */ jsxs("a", { href: o.url, target: "_blank", rel: "noopener noreferrer", style: { fontSize: 11, color: C7.sub }, children: [
17553
+ s.open,
17554
+ " \u2197"
17555
+ ] }) })
17556
+ ] }),
17557
+ rs.suggestion && !rs.applied && /* @__PURE__ */ jsx("tr", { style: { color: C7.text }, children: /* @__PURE__ */ jsxs("td", { colSpan: 5, style: { padding: "0 8px 8px 8px" }, children: [
17558
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 11, color: C7.green, fontWeight: 600 }, children: rs.suggestion.metaTitle }),
17559
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 11, color: C7.sub }, children: rs.suggestion.metaDescription })
17560
+ ] }) }),
17561
+ rs.error && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: 5, style: { padding: "0 8px 6px 8px", fontSize: 11, color: C7.red }, children: rs.error }) })
17562
+ ] }, o.url);
17563
+ }) })
17564
+ ] }) })
17565
+ ] });
17566
+ }
17567
+ var C8 = {
17568
+ text: "var(--theme-text, #1a1a1a)",
17569
+ sub: "var(--theme-elevation-600, #6b7280)",
17570
+ card: "var(--theme-elevation-50, #f9fafb)",
17571
+ border: "var(--theme-elevation-200, #e5e7eb)",
17572
+ green: "#22c55e",
17573
+ red: "#ef4444",
17574
+ amber: "#f59e0b",
17575
+ blue: "#3b82f6"
17576
+ };
17577
+ var S5 = {
17355
17578
  fr: {
17356
17579
  title: "Monitoring & alertes",
17357
17580
  subtitle: "Digest p\xE9riodique : r\xE9gressions de score, nouveaux 404, chutes de position (webhook / email).",
@@ -17394,7 +17617,7 @@ var S4 = {
17394
17617
  }
17395
17618
  };
17396
17619
  function AlertsPanel({ locale }) {
17397
- const s = S4[locale] ?? S4.fr;
17620
+ const s = S5[locale] ?? S5.fr;
17398
17621
  const [digest, setDigest] = useState(null);
17399
17622
  const [config, setConfig] = useState(null);
17400
17623
  const [loading, setLoading] = useState(true);
@@ -17449,15 +17672,15 @@ function AlertsPanel({ locale }) {
17449
17672
  const card = {
17450
17673
  padding: 16,
17451
17674
  borderRadius: 12,
17452
- border: `1px solid ${C7.border}`,
17453
- backgroundColor: C7.card,
17675
+ border: `1px solid ${C8.border}`,
17676
+ backgroundColor: C8.card,
17454
17677
  marginBottom: 20
17455
17678
  };
17456
17679
  const btn = {
17457
17680
  padding: "8px 12px",
17458
17681
  borderRadius: 8,
17459
- border: `1px solid ${C7.blue}`,
17460
- backgroundColor: C7.blue,
17682
+ border: `1px solid ${C8.blue}`,
17683
+ backgroundColor: C8.blue,
17461
17684
  color: "#fff",
17462
17685
  fontSize: 12,
17463
17686
  fontWeight: 700,
@@ -17470,32 +17693,32 @@ function AlertsPanel({ locale }) {
17470
17693
  padding: "3px 8px",
17471
17694
  borderRadius: 999,
17472
17695
  color: "#fff",
17473
- backgroundColor: ok ? C7.green : C7.sub,
17696
+ backgroundColor: ok ? C8.green : C8.sub,
17474
17697
  marginRight: 6
17475
17698
  });
17476
17699
  const hasChannel = config && (config.webhookConfigured || config.emailConfigured);
17477
17700
  const list = (title, rows) => rows.length ? /* @__PURE__ */ jsxs("div", { style: { marginTop: 10 }, children: [
17478
- /* @__PURE__ */ jsxs("div", { style: { fontSize: 12, fontWeight: 700, color: C7.text, marginBottom: 4 }, children: [
17701
+ /* @__PURE__ */ jsxs("div", { style: { fontSize: 12, fontWeight: 700, color: C8.text, marginBottom: 4 }, children: [
17479
17702
  title,
17480
17703
  " ",
17481
- /* @__PURE__ */ jsxs("span", { style: { color: C7.amber }, children: [
17704
+ /* @__PURE__ */ jsxs("span", { style: { color: C8.amber }, children: [
17482
17705
  "(",
17483
17706
  rows.length,
17484
17707
  ")"
17485
17708
  ] })
17486
17709
  ] }),
17487
- /* @__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)) })
17710
+ /* @__PURE__ */ jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 12, color: C8.sub, lineHeight: 1.6 }, children: rows.slice(0, 8).map((r, i) => /* @__PURE__ */ jsx("li", { children: r }, i)) })
17488
17711
  ] }) : null;
17489
17712
  return /* @__PURE__ */ jsxs("div", { style: card, children: [
17490
17713
  /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: 8, flexWrap: "wrap" }, children: [
17491
17714
  /* @__PURE__ */ jsxs("div", { children: [
17492
- /* @__PURE__ */ jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C7.text }, children: s.title }),
17493
- /* @__PURE__ */ jsx("div", { style: { fontSize: 12, color: C7.sub, marginTop: 2 }, children: s.subtitle })
17715
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C8.text }, children: s.title }),
17716
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 12, color: C8.sub, marginTop: 2 }, children: s.subtitle })
17494
17717
  ] }),
17495
17718
  hasChannel && /* @__PURE__ */ jsx("button", { type: "button", onClick: sendNow, disabled: busy, style: btn, children: busy ? s.sending : s.sendNow })
17496
17719
  ] }),
17497
- error && /* @__PURE__ */ jsx("div", { style: { color: C7.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
17498
- notice && /* @__PURE__ */ jsx("div", { style: { color: C7.green, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: notice }),
17720
+ error && /* @__PURE__ */ jsx("div", { style: { color: C8.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
17721
+ notice && /* @__PURE__ */ jsx("div", { style: { color: C8.green, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: notice }),
17499
17722
  config && /* @__PURE__ */ jsxs("div", { style: { marginTop: 12 }, children: [
17500
17723
  /* @__PURE__ */ jsxs("span", { style: chip(config.webhookConfigured, s.webhook), children: [
17501
17724
  s.webhook,
@@ -17508,15 +17731,15 @@ function AlertsPanel({ locale }) {
17508
17731
  config.emailConfigured ? s.configured : s.missing
17509
17732
  ] })
17510
17733
  ] }),
17511
- !loading && !hasChannel && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C7.sub }, children: s.notConfigured }),
17512
- loading && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C7.sub }, children: s.loading }),
17734
+ !loading && !hasChannel && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C8.sub }, children: s.notConfigured }),
17735
+ loading && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C8.sub }, children: s.loading }),
17513
17736
  digest && /* @__PURE__ */ jsxs("div", { style: { marginTop: 8 }, children: [
17514
- /* @__PURE__ */ jsxs("div", { style: { fontSize: 12, color: C7.sub, marginTop: 6 }, children: [
17737
+ /* @__PURE__ */ jsxs("div", { style: { fontSize: 12, color: C8.sub, marginTop: 6 }, children: [
17515
17738
  digest.totalIssues,
17516
17739
  " ",
17517
17740
  s.issues
17518
17741
  ] }),
17519
- digest.totalIssues === 0 && /* @__PURE__ */ jsx("div", { style: { marginTop: 8, fontSize: 13, color: C7.sub }, children: s.noIssues }),
17742
+ digest.totalIssues === 0 && /* @__PURE__ */ jsx("div", { style: { marginTop: 8, fontSize: 13, color: C8.sub }, children: s.noIssues }),
17520
17743
  list(
17521
17744
  s.scoreReg,
17522
17745
  digest.scoreRegressions.map((r) => `${r.collection}/${r.documentId} \u2014 ${r.from} \u2192 ${r.to} (\u2212${r.drop})`)
@@ -17526,7 +17749,7 @@ function AlertsPanel({ locale }) {
17526
17749
  ] })
17527
17750
  ] });
17528
17751
  }
17529
- var C8 = {
17752
+ var C9 = {
17530
17753
  text: "var(--theme-text, #1a1a1a)",
17531
17754
  sub: "var(--theme-elevation-600, #6b7280)",
17532
17755
  card: "var(--theme-elevation-50, #f9fafb)",
@@ -17536,7 +17759,7 @@ var C8 = {
17536
17759
  red: "#ef4444",
17537
17760
  violet: "#7c3aed"
17538
17761
  };
17539
- var S5 = {
17762
+ var S6 = {
17540
17763
  fr: {
17541
17764
  title: "Alt-text IA des images",
17542
17765
  subtitle: "G\xE9n\xE8re l'attribut alt des images qui n'en ont pas (Claude vision), pour l'accessibilit\xE9 et le SEO.",
@@ -17569,7 +17792,7 @@ var S5 = {
17569
17792
  }
17570
17793
  };
17571
17794
  function AltTextPanel({ locale }) {
17572
- const s = S5[locale] ?? S5.fr;
17795
+ const s = S6[locale] ?? S6.fr;
17573
17796
  const [items, setItems] = useState(null);
17574
17797
  const [collection, setCollection] = useState("media");
17575
17798
  const [missingCount, setMissingCount] = useState(0);
@@ -17646,8 +17869,8 @@ function AltTextPanel({ locale }) {
17646
17869
  const card = {
17647
17870
  padding: 16,
17648
17871
  borderRadius: 12,
17649
- border: `1px solid ${C8.border}`,
17650
- backgroundColor: C8.card,
17872
+ border: `1px solid ${C9.border}`,
17873
+ backgroundColor: C9.card,
17651
17874
  marginBottom: 20
17652
17875
  };
17653
17876
  const btn = (bg) => ({
@@ -17663,18 +17886,18 @@ function AltTextPanel({ locale }) {
17663
17886
  return /* @__PURE__ */ jsxs("div", { style: card, children: [
17664
17887
  /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: 8, flexWrap: "wrap" }, children: [
17665
17888
  /* @__PURE__ */ jsxs("div", { children: [
17666
- /* @__PURE__ */ jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C8.text }, children: s.title }),
17667
- /* @__PURE__ */ jsx("div", { style: { fontSize: 12, color: C8.sub, marginTop: 2 }, children: s.subtitle })
17889
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C9.text }, children: s.title }),
17890
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 12, color: C9.sub, marginTop: 2 }, children: s.subtitle })
17668
17891
  ] }),
17669
- status === "ok" && /* @__PURE__ */ jsx("button", { type: "button", onClick: () => void load(), style: btn(C8.sub), children: s.refresh })
17892
+ status === "ok" && /* @__PURE__ */ jsx("button", { type: "button", onClick: () => void load(), style: btn(C9.sub), children: s.refresh })
17670
17893
  ] }),
17671
- status === "forbidden" && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C8.sub }, children: s.forbidden }),
17672
- status === "disabled" && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C8.sub }, children: s.disabled }),
17894
+ status === "forbidden" && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C9.sub }, children: s.forbidden }),
17895
+ status === "disabled" && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C9.sub }, children: s.disabled }),
17673
17896
  status === "ok" && /* @__PURE__ */ jsxs("div", { style: { marginTop: 12 }, children: [
17674
- loading && /* @__PURE__ */ jsx("div", { style: { fontSize: 13, color: C8.sub }, children: s.loading }),
17675
- !loading && items && items.length === 0 && /* @__PURE__ */ jsx("div", { style: { fontSize: 13, color: C8.sub }, children: s.none }),
17897
+ loading && /* @__PURE__ */ jsx("div", { style: { fontSize: 13, color: C9.sub }, children: s.loading }),
17898
+ !loading && items && items.length === 0 && /* @__PURE__ */ jsx("div", { style: { fontSize: 13, color: C9.sub }, children: s.none }),
17676
17899
  !loading && items && items.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
17677
- /* @__PURE__ */ jsxs("div", { style: { fontSize: 12, color: C8.sub, marginBottom: 10 }, children: [
17900
+ /* @__PURE__ */ jsxs("div", { style: { fontSize: 12, color: C9.sub, marginBottom: 10 }, children: [
17678
17901
  missingCount,
17679
17902
  " ",
17680
17903
  s.missing
@@ -17690,8 +17913,8 @@ function AltTextPanel({ locale }) {
17690
17913
  alignItems: "center",
17691
17914
  padding: 8,
17692
17915
  borderRadius: 8,
17693
- border: `1px solid ${C8.border}`,
17694
- backgroundColor: C8.bg
17916
+ border: `1px solid ${C9.border}`,
17917
+ backgroundColor: C9.bg
17695
17918
  },
17696
17919
  children: [
17697
17920
  /* @__PURE__ */ jsx(
@@ -17699,11 +17922,11 @@ function AltTextPanel({ locale }) {
17699
17922
  {
17700
17923
  src: item.url,
17701
17924
  alt: "",
17702
- style: { width: 48, height: 48, objectFit: "cover", borderRadius: 6, flexShrink: 0, border: `1px solid ${C8.border}` }
17925
+ style: { width: 48, height: 48, objectFit: "cover", borderRadius: 6, flexShrink: 0, border: `1px solid ${C9.border}` }
17703
17926
  }
17704
17927
  ),
17705
17928
  /* @__PURE__ */ jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
17706
- /* @__PURE__ */ jsx("div", { style: { fontSize: 11, color: C8.sub, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: item.filename }),
17929
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 11, color: C9.sub, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: item.filename }),
17707
17930
  rs.alt !== void 0 ? /* @__PURE__ */ jsx(
17708
17931
  "input",
17709
17932
  {
@@ -17717,15 +17940,15 @@ function AltTextPanel({ locale }) {
17717
17940
  padding: "4px 8px",
17718
17941
  fontSize: 12,
17719
17942
  borderRadius: 6,
17720
- border: `1px solid ${C8.border}`,
17721
- backgroundColor: C8.bg,
17722
- color: C8.text
17943
+ border: `1px solid ${C9.border}`,
17944
+ backgroundColor: C9.bg,
17945
+ color: C9.text
17723
17946
  }
17724
17947
  }
17725
- ) : /* @__PURE__ */ jsx("div", { style: { fontSize: 12, color: C8.sub, marginTop: 4, fontStyle: "italic" }, children: "\u2014" }),
17726
- rs.error && /* @__PURE__ */ jsx("div", { style: { fontSize: 11, color: C8.red, marginTop: 2 }, children: rs.error })
17948
+ ) : /* @__PURE__ */ jsx("div", { style: { fontSize: 12, color: C9.sub, marginTop: 4, fontStyle: "italic" }, children: "\u2014" }),
17949
+ rs.error && /* @__PURE__ */ jsx("div", { style: { fontSize: 11, color: C9.red, marginTop: 2 }, children: rs.error })
17727
17950
  ] }),
17728
- /* @__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 }) })
17951
+ /* @__PURE__ */ jsx("div", { style: { flexShrink: 0 }, children: rs.applied ? /* @__PURE__ */ jsx("span", { style: { fontSize: 11, fontWeight: 700, color: C9.green }, children: s.applied }) : rs.alt !== void 0 ? /* @__PURE__ */ jsx("button", { type: "button", onClick: () => void apply(item), disabled: rs.busy, style: btn(C9.green), children: rs.busy ? s.generating : s.apply }) : /* @__PURE__ */ jsx("button", { type: "button", onClick: () => void generate(item), disabled: rs.busy, style: btn(C9.violet), children: rs.busy ? s.generating : s.generate }) })
17729
17952
  ]
17730
17953
  },
17731
17954
  item.id
@@ -18150,6 +18373,7 @@ function PerformanceView() {
18150
18373
  /* @__PURE__ */ jsx(CoreWebVitalsPanel, { locale }),
18151
18374
  /* @__PURE__ */ jsx(GscPanel, { locale }),
18152
18375
  /* @__PURE__ */ jsx(RankTrackingPanel, { locale }),
18376
+ /* @__PURE__ */ jsx(CtrOpportunitiesPanel, { locale }),
18153
18377
  /* @__PURE__ */ jsx(AlertsPanel, { locale }),
18154
18378
  /* @__PURE__ */ jsx(AltTextPanel, { locale }),
18155
18379
  showImport && /* @__PURE__ */ jsxs(
@@ -18675,7 +18899,7 @@ function PerformanceView() {
18675
18899
  }
18676
18900
  );
18677
18901
  }
18678
- var C9 = {
18902
+ var C10 = {
18679
18903
  text: "var(--theme-text, #1a1a1a)",
18680
18904
  sub: "var(--theme-elevation-600, #6b7280)",
18681
18905
  card: "var(--theme-elevation-50, #f9fafb)",
@@ -18685,7 +18909,7 @@ var C9 = {
18685
18909
  red: "#ef4444",
18686
18910
  blue: "#3b82f6"
18687
18911
  };
18688
- var S6 = {
18912
+ var S7 = {
18689
18913
  fr: {
18690
18914
  title: "Brief de contenu IA",
18691
18915
  subtitle: "G\xE9n\xE8re un plan r\xE9dactionnel optimis\xE9 pour un mot-cl\xE9 (plan, entit\xE9s, questions, longueur cible).",
@@ -18720,7 +18944,7 @@ var S6 = {
18720
18944
  }
18721
18945
  };
18722
18946
  function ContentBriefPanel({ locale }) {
18723
- const s = S6[locale] ?? S6.fr;
18947
+ const s = S7[locale] ?? S7.fr;
18724
18948
  const [keyword, setKeyword] = useState("");
18725
18949
  const [brief, setBrief] = useState(null);
18726
18950
  const [busy, setBusy] = useState(false);
@@ -18756,8 +18980,8 @@ function ContentBriefPanel({ locale }) {
18756
18980
  const card = {
18757
18981
  padding: 16,
18758
18982
  borderRadius: 12,
18759
- border: `1px solid ${C9.border}`,
18760
- backgroundColor: C9.card,
18983
+ border: `1px solid ${C10.border}`,
18984
+ backgroundColor: C10.card,
18761
18985
  marginBottom: 20
18762
18986
  };
18763
18987
  const chip = {
@@ -18766,14 +18990,14 @@ function ContentBriefPanel({ locale }) {
18766
18990
  padding: "3px 8px",
18767
18991
  borderRadius: 999,
18768
18992
  backgroundColor: "rgba(59,130,246,0.12)",
18769
- color: C9.blue,
18770
- border: `1px solid ${C9.border}`,
18993
+ color: C10.blue,
18994
+ border: `1px solid ${C10.border}`,
18771
18995
  margin: "0 6px 6px 0"
18772
18996
  };
18773
- const h4 = { fontSize: 12, fontWeight: 800, color: C9.text, margin: "14px 0 6px", textTransform: "uppercase" };
18997
+ const h4 = { fontSize: 12, fontWeight: 800, color: C10.text, margin: "14px 0 6px", textTransform: "uppercase" };
18774
18998
  return /* @__PURE__ */ jsxs("div", { style: card, children: [
18775
- /* @__PURE__ */ jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C9.text }, children: s.title }),
18776
- /* @__PURE__ */ jsx("div", { style: { fontSize: 12, color: C9.sub, marginTop: 2, marginBottom: 12 }, children: s.subtitle }),
18999
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C10.text }, children: s.title }),
19000
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 12, color: C10.sub, marginTop: 2, marginBottom: 12 }, children: s.subtitle }),
18777
19001
  /* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: 8, flexWrap: "wrap" }, children: [
18778
19002
  /* @__PURE__ */ jsx(
18779
19003
  "input",
@@ -18790,9 +19014,9 @@ function ContentBriefPanel({ locale }) {
18790
19014
  padding: "8px 12px",
18791
19015
  fontSize: 13,
18792
19016
  borderRadius: 8,
18793
- border: `1px solid ${C9.border}`,
18794
- backgroundColor: C9.bg,
18795
- color: C9.text
19017
+ border: `1px solid ${C10.border}`,
19018
+ backgroundColor: C10.bg,
19019
+ color: C10.text
18796
19020
  }
18797
19021
  }
18798
19022
  ),
@@ -18805,8 +19029,8 @@ function ContentBriefPanel({ locale }) {
18805
19029
  style: {
18806
19030
  padding: "8px 14px",
18807
19031
  borderRadius: 8,
18808
- border: `1px solid ${C9.violet}`,
18809
- backgroundColor: C9.violet,
19032
+ border: `1px solid ${C10.violet}`,
19033
+ backgroundColor: C10.violet,
18810
19034
  color: "#fff",
18811
19035
  fontSize: 12,
18812
19036
  fontWeight: 700,
@@ -18817,12 +19041,12 @@ function ContentBriefPanel({ locale }) {
18817
19041
  }
18818
19042
  )
18819
19043
  ] }),
18820
- error && /* @__PURE__ */ jsx("div", { style: { color: C9.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
19044
+ error && /* @__PURE__ */ jsx("div", { style: { color: C10.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
18821
19045
  brief && /* @__PURE__ */ jsxs("div", { style: { marginTop: 8 }, children: [
18822
- brief.recommendedWordCount > 0 && /* @__PURE__ */ jsxs("div", { style: { fontSize: 12, color: C9.sub, marginTop: 10 }, children: [
19046
+ brief.recommendedWordCount > 0 && /* @__PURE__ */ jsxs("div", { style: { fontSize: 12, color: C10.sub, marginTop: 10 }, children: [
18823
19047
  s.words,
18824
19048
  ": ",
18825
- /* @__PURE__ */ jsxs("b", { style: { color: C9.text }, children: [
19049
+ /* @__PURE__ */ jsxs("b", { style: { color: C10.text }, children: [
18826
19050
  "~",
18827
19051
  brief.recommendedWordCount,
18828
19052
  " ",
@@ -18831,7 +19055,7 @@ function ContentBriefPanel({ locale }) {
18831
19055
  ] }),
18832
19056
  brief.outline.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
18833
19057
  /* @__PURE__ */ jsx("div", { style: h4, children: s.outline }),
18834
- /* @__PURE__ */ jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 13, color: C9.text, lineHeight: 1.6 }, children: brief.outline.map((o, i) => /* @__PURE__ */ jsx("li", { style: { marginLeft: o.level === "h3" ? 18 : 0, color: o.level === "h3" ? C9.sub : C9.text, fontWeight: o.level === "h2" ? 700 : 400 }, children: o.text }, i)) })
19058
+ /* @__PURE__ */ jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 13, color: C10.text, lineHeight: 1.6 }, children: brief.outline.map((o, i) => /* @__PURE__ */ 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)) })
18835
19059
  ] }),
18836
19060
  brief.entities.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
18837
19061
  /* @__PURE__ */ jsx("div", { style: h4, children: s.entities }),
@@ -18839,7 +19063,7 @@ function ContentBriefPanel({ locale }) {
18839
19063
  ] }),
18840
19064
  brief.questions.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
18841
19065
  /* @__PURE__ */ jsx("div", { style: h4, children: s.questions }),
18842
- /* @__PURE__ */ jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 13, color: C9.text, lineHeight: 1.6 }, children: brief.questions.map((q, i) => /* @__PURE__ */ jsx("li", { children: q }, i)) })
19066
+ /* @__PURE__ */ jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 13, color: C10.text, lineHeight: 1.6 }, children: brief.questions.map((q, i) => /* @__PURE__ */ jsx("li", { children: q }, i)) })
18843
19067
  ] }),
18844
19068
  brief.internalLinkIdeas.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
18845
19069
  /* @__PURE__ */ jsx("div", { style: h4, children: s.links }),
@@ -18847,7 +19071,7 @@ function ContentBriefPanel({ locale }) {
18847
19071
  ] }),
18848
19072
  brief.notes.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
18849
19073
  /* @__PURE__ */ jsx("div", { style: h4, children: s.notes }),
18850
- /* @__PURE__ */ jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 12, color: C9.sub, lineHeight: 1.6 }, children: brief.notes.map((n, i) => /* @__PURE__ */ jsx("li", { children: n }, i)) })
19074
+ /* @__PURE__ */ jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 12, color: C10.sub, lineHeight: 1.6 }, children: brief.notes.map((n, i) => /* @__PURE__ */ jsx("li", { children: n }, i)) })
18851
19075
  ] })
18852
19076
  ] })
18853
19077
  ] });
@@ -19989,7 +20213,7 @@ var controlBtnStyle = {
19989
20213
  cursor: "pointer",
19990
20214
  lineHeight: 1.4
19991
20215
  };
19992
- var C10 = {
20216
+ var C11 = {
19993
20217
  cyan: "#00E5FF",
19994
20218
  black: "#000",
19995
20219
  green: "#22c55e",
@@ -20004,10 +20228,10 @@ var C10 = {
20004
20228
  var TITLE_MIN = 30;
20005
20229
  var TITLE_MAX = 60;
20006
20230
  function getCharColor(len) {
20007
- if (len === 0) return C10.textSecondary;
20008
- if (len >= TITLE_MIN && len <= TITLE_MAX) return C10.green;
20009
- if (len > 0 && len < TITLE_MIN) return C10.orange;
20010
- return C10.red;
20231
+ if (len === 0) return C11.textSecondary;
20232
+ if (len >= TITLE_MIN && len <= TITLE_MAX) return C11.green;
20233
+ if (len > 0 && len < TITLE_MIN) return C11.orange;
20234
+ return C11.red;
20011
20235
  }
20012
20236
  function getProgressPercent(len) {
20013
20237
  if (len === 0) return 0;
@@ -20015,9 +20239,9 @@ function getProgressPercent(len) {
20015
20239
  }
20016
20240
  function getProgressColor(len) {
20017
20241
  if (len === 0) return "var(--theme-elevation-200, #e5e7eb)";
20018
- if (len >= TITLE_MIN && len <= TITLE_MAX) return C10.green;
20019
- if (len < TITLE_MIN) return C10.orange;
20020
- return C10.red;
20242
+ if (len >= TITLE_MIN && len <= TITLE_MAX) return C11.green;
20243
+ if (len < TITLE_MIN) return C11.orange;
20244
+ return C11.red;
20021
20245
  }
20022
20246
  function MetaTitleField({
20023
20247
  path,
@@ -20088,7 +20312,7 @@ function MetaTitleField({
20088
20312
  style: {
20089
20313
  fontSize: 13,
20090
20314
  fontWeight: 700,
20091
- color: C10.textPrimary
20315
+ color: C11.textPrimary
20092
20316
  },
20093
20317
  children: t.metaTitle.label
20094
20318
  }
@@ -20128,9 +20352,9 @@ function MetaTitleField({
20128
20352
  fontSize: 14,
20129
20353
  fontFamily: "inherit",
20130
20354
  borderRadius: 8,
20131
- border: `2px solid ${C10.border}`,
20132
- backgroundColor: C10.surfaceBg,
20133
- color: C10.textPrimary,
20355
+ border: `2px solid ${C11.border}`,
20356
+ backgroundColor: C11.surfaceBg,
20357
+ color: C11.textPrimary,
20134
20358
  outline: "none",
20135
20359
  boxShadow: "2px 2px 0 0 var(--theme-border-color, rgba(0,0,0,1))"
20136
20360
  }
@@ -20148,9 +20372,9 @@ function MetaTitleField({
20148
20372
  gap: 5,
20149
20373
  padding: "8px 14px",
20150
20374
  borderRadius: 8,
20151
- border: `2px solid ${C10.border}`,
20152
- backgroundColor: loading ? C10.surface50 : C10.cyan,
20153
- color: loading ? C10.textSecondary : C10.black,
20375
+ border: `2px solid ${C11.border}`,
20376
+ backgroundColor: loading ? C11.surface50 : C11.cyan,
20377
+ color: loading ? C11.textSecondary : C11.black,
20154
20378
  fontWeight: 800,
20155
20379
  fontSize: 11,
20156
20380
  textTransform: "uppercase",
@@ -20197,7 +20421,7 @@ function MetaTitleField({
20197
20421
  justifyContent: "space-between",
20198
20422
  marginTop: 4,
20199
20423
  fontSize: 10,
20200
- color: C10.textSecondary
20424
+ color: C11.textSecondary
20201
20425
  },
20202
20426
  children: [
20203
20427
  /* @__PURE__ */ jsxs("span", { children: [
@@ -20231,9 +20455,9 @@ function MetaTitleField({
20231
20455
  borderRadius: 6,
20232
20456
  fontSize: 11,
20233
20457
  fontWeight: 600,
20234
- color: C10.red,
20458
+ color: C11.red,
20235
20459
  backgroundColor: "rgba(239,68,68,0.08)",
20236
- border: `1px solid ${C10.red}`
20460
+ border: `1px solid ${C11.red}`
20237
20461
  },
20238
20462
  children: error
20239
20463
  }
@@ -20242,7 +20466,7 @@ function MetaTitleField({
20242
20466
  }
20243
20467
  );
20244
20468
  }
20245
- var C11 = {
20469
+ var C12 = {
20246
20470
  cyan: "#00E5FF",
20247
20471
  black: "#000",
20248
20472
  green: "#22c55e",
@@ -20257,10 +20481,10 @@ var C11 = {
20257
20481
  var DESC_MIN = 120;
20258
20482
  var DESC_MAX = 160;
20259
20483
  function getCharColor2(len) {
20260
- if (len === 0) return C11.textSecondary;
20261
- if (len >= DESC_MIN && len <= DESC_MAX) return C11.green;
20262
- if (len > 0 && len < DESC_MIN) return C11.orange;
20263
- return C11.red;
20484
+ if (len === 0) return C12.textSecondary;
20485
+ if (len >= DESC_MIN && len <= DESC_MAX) return C12.green;
20486
+ if (len > 0 && len < DESC_MIN) return C12.orange;
20487
+ return C12.red;
20264
20488
  }
20265
20489
  function getProgressPercent2(len) {
20266
20490
  if (len === 0) return 0;
@@ -20268,9 +20492,9 @@ function getProgressPercent2(len) {
20268
20492
  }
20269
20493
  function getProgressColor2(len) {
20270
20494
  if (len === 0) return "var(--theme-elevation-200, #e5e7eb)";
20271
- if (len >= DESC_MIN && len <= DESC_MAX) return C11.green;
20272
- if (len < DESC_MIN) return C11.orange;
20273
- return C11.red;
20495
+ if (len >= DESC_MIN && len <= DESC_MAX) return C12.green;
20496
+ if (len < DESC_MIN) return C12.orange;
20497
+ return C12.red;
20274
20498
  }
20275
20499
  function MetaDescriptionField({
20276
20500
  path,
@@ -20341,7 +20565,7 @@ function MetaDescriptionField({
20341
20565
  style: {
20342
20566
  fontSize: 13,
20343
20567
  fontWeight: 700,
20344
- color: C11.textPrimary
20568
+ color: C12.textPrimary
20345
20569
  },
20346
20570
  children: t.metaDescription.label
20347
20571
  }
@@ -20381,9 +20605,9 @@ function MetaDescriptionField({
20381
20605
  fontSize: 14,
20382
20606
  fontFamily: "inherit",
20383
20607
  borderRadius: 8,
20384
- border: `2px solid ${C11.border}`,
20385
- backgroundColor: C11.surfaceBg,
20386
- color: C11.textPrimary,
20608
+ border: `2px solid ${C12.border}`,
20609
+ backgroundColor: C12.surfaceBg,
20610
+ color: C12.textPrimary,
20387
20611
  outline: "none",
20388
20612
  resize: "vertical",
20389
20613
  lineHeight: 1.5,
@@ -20403,9 +20627,9 @@ function MetaDescriptionField({
20403
20627
  gap: 5,
20404
20628
  padding: "8px 14px",
20405
20629
  borderRadius: 8,
20406
- border: `2px solid ${C11.border}`,
20407
- backgroundColor: loading ? C11.surface50 : C11.cyan,
20408
- color: loading ? C11.textSecondary : C11.black,
20630
+ border: `2px solid ${C12.border}`,
20631
+ backgroundColor: loading ? C12.surface50 : C12.cyan,
20632
+ color: loading ? C12.textSecondary : C12.black,
20409
20633
  fontWeight: 800,
20410
20634
  fontSize: 11,
20411
20635
  textTransform: "uppercase",
@@ -20453,7 +20677,7 @@ function MetaDescriptionField({
20453
20677
  justifyContent: "space-between",
20454
20678
  marginTop: 4,
20455
20679
  fontSize: 10,
20456
- color: C11.textSecondary
20680
+ color: C12.textSecondary
20457
20681
  },
20458
20682
  children: [
20459
20683
  /* @__PURE__ */ jsxs("span", { children: [
@@ -20487,9 +20711,9 @@ function MetaDescriptionField({
20487
20711
  borderRadius: 6,
20488
20712
  fontSize: 11,
20489
20713
  fontWeight: 600,
20490
- color: C11.red,
20714
+ color: C12.red,
20491
20715
  backgroundColor: "rgba(239,68,68,0.08)",
20492
- border: `1px solid ${C11.red}`
20716
+ border: `1px solid ${C12.red}`
20493
20717
  },
20494
20718
  children: error
20495
20719
  }
@@ -20498,7 +20722,7 @@ function MetaDescriptionField({
20498
20722
  }
20499
20723
  );
20500
20724
  }
20501
- var C12 = {
20725
+ var C13 = {
20502
20726
  cyan: "#00E5FF",
20503
20727
  black: "#000",
20504
20728
  white: "#fff",
@@ -20575,8 +20799,8 @@ function MetaImageField({
20575
20799
  gap: 10,
20576
20800
  padding: "10px 14px",
20577
20801
  borderRadius: 8,
20578
- border: `2px solid ${C12.border}`,
20579
- backgroundColor: C12.surfaceBg,
20802
+ border: `2px solid ${C13.border}`,
20803
+ backgroundColor: C13.surfaceBg,
20580
20804
  boxShadow: "2px 2px 0 0 var(--theme-border-color, rgba(0,0,0,1))"
20581
20805
  },
20582
20806
  children: [
@@ -20595,7 +20819,7 @@ function MetaImageField({
20595
20819
  fontWeight: 900,
20596
20820
  backgroundColor: hasImage ? "rgba(34,197,94,0.15)" : "rgba(255,138,0,0.15)",
20597
20821
  color: hasImage ? "#16a34a" : "#d97706",
20598
- border: `1px solid ${hasImage ? C12.green : C12.orange}`
20822
+ border: `1px solid ${hasImage ? C13.green : C13.orange}`
20599
20823
  },
20600
20824
  children: hasImage ? "\u2713" : "!"
20601
20825
  }
@@ -20607,7 +20831,7 @@ function MetaImageField({
20607
20831
  style: {
20608
20832
  fontSize: 12,
20609
20833
  fontWeight: 700,
20610
- color: C12.textPrimary
20834
+ color: C13.textPrimary
20611
20835
  },
20612
20836
  children: t.metaImage.label
20613
20837
  }
@@ -20617,7 +20841,7 @@ function MetaImageField({
20617
20841
  {
20618
20842
  style: {
20619
20843
  fontSize: 10,
20620
- color: C12.textSecondary,
20844
+ color: C13.textSecondary,
20621
20845
  lineHeight: 1.4
20622
20846
  },
20623
20847
  children: hasImage ? t.metaImage.imageSet : t.metaImage.noImage
@@ -20637,9 +20861,9 @@ function MetaImageField({
20637
20861
  gap: 5,
20638
20862
  padding: "8px 14px",
20639
20863
  borderRadius: 8,
20640
- border: `2px solid ${C12.border}`,
20641
- backgroundColor: loading ? C12.surface50 : success ? C12.green : C12.cyan,
20642
- color: loading ? C12.textSecondary : success ? C12.white : C12.black,
20864
+ border: `2px solid ${C13.border}`,
20865
+ backgroundColor: loading ? C13.surface50 : success ? C13.green : C13.cyan,
20866
+ color: loading ? C13.textSecondary : success ? C13.white : C13.black,
20643
20867
  fontWeight: 800,
20644
20868
  fontSize: 11,
20645
20869
  textTransform: "uppercase",
@@ -20666,9 +20890,9 @@ function MetaImageField({
20666
20890
  borderRadius: 6,
20667
20891
  fontSize: 11,
20668
20892
  fontWeight: 600,
20669
- color: C12.red,
20893
+ color: C13.red,
20670
20894
  backgroundColor: "rgba(239,68,68,0.08)",
20671
- border: `1px solid ${C12.red}`
20895
+ border: `1px solid ${C13.red}`
20672
20896
  },
20673
20897
  children: error
20674
20898
  }
@@ -20677,7 +20901,7 @@ function MetaImageField({
20677
20901
  }
20678
20902
  );
20679
20903
  }
20680
- var C13 = {
20904
+ var C14 = {
20681
20905
  black: "#000",
20682
20906
  white: "#fff",
20683
20907
  green: "#22c55e",
@@ -20691,15 +20915,15 @@ var C13 = {
20691
20915
  function getCompletenessColor(count) {
20692
20916
  switch (count) {
20693
20917
  case 0:
20694
- return C13.red;
20918
+ return C14.red;
20695
20919
  case 1:
20696
- return C13.orange;
20920
+ return C14.orange;
20697
20921
  case 2:
20698
- return C13.yellow;
20922
+ return C14.yellow;
20699
20923
  case 3:
20700
- return C13.green;
20924
+ return C14.green;
20701
20925
  default:
20702
- return C13.textSecondary;
20926
+ return C14.textSecondary;
20703
20927
  }
20704
20928
  }
20705
20929
  function getCompletenessLabel(count, ov) {
@@ -20757,8 +20981,8 @@ function OverviewField({
20757
20981
  fontFamily: "var(--font-body, Inter, system-ui, sans-serif)",
20758
20982
  padding: "12px 14px",
20759
20983
  borderRadius: 10,
20760
- border: `2px solid ${C13.border}`,
20761
- backgroundColor: C13.surfaceBg,
20984
+ border: `2px solid ${C14.border}`,
20985
+ backgroundColor: C14.surfaceBg,
20762
20986
  boxShadow: "3px 3px 0 0 var(--theme-border-color, rgba(0,0,0,1))",
20763
20987
  marginBottom: 12
20764
20988
  },
@@ -20781,7 +21005,7 @@ function OverviewField({
20781
21005
  fontWeight: 800,
20782
21006
  textTransform: "uppercase",
20783
21007
  letterSpacing: "0.04em",
20784
- color: C13.textPrimary
21008
+ color: C14.textPrimary
20785
21009
  },
20786
21010
  children: t.overview.metaCompleteness
20787
21011
  }
@@ -20796,8 +21020,8 @@ function OverviewField({
20796
21020
  fontSize: 11,
20797
21021
  fontWeight: 800,
20798
21022
  backgroundColor: completenessColor,
20799
- color: completenessColor === C13.yellow ? C13.black : C13.white,
20800
- border: `2px solid ${C13.border}`,
21023
+ color: completenessColor === C14.yellow ? C14.black : C14.white,
21024
+ border: `2px solid ${C14.border}`,
20801
21025
  textTransform: "uppercase",
20802
21026
  letterSpacing: "0.03em"
20803
21027
  },
@@ -20895,7 +21119,7 @@ function OverviewField({
20895
21119
  style: {
20896
21120
  fontSize: 12,
20897
21121
  fontWeight: 600,
20898
- color: item.filled ? C13.textPrimary : C13.textSecondary
21122
+ color: item.filled ? C14.textPrimary : C14.textSecondary
20899
21123
  },
20900
21124
  children: item.label
20901
21125
  }
@@ -20907,7 +21131,7 @@ function OverviewField({
20907
21131
  marginLeft: "auto",
20908
21132
  fontSize: 10,
20909
21133
  fontWeight: 700,
20910
- color: item.filled ? C13.green : C13.red,
21134
+ color: item.filled ? C14.green : C14.red,
20911
21135
  textTransform: "uppercase",
20912
21136
  letterSpacing: "0.03em"
20913
21137
  },
@@ -20924,7 +21148,7 @@ function OverviewField({
20924
21148
  }
20925
21149
  );
20926
21150
  }
20927
- var C14 = {
21151
+ var C15 = {
20928
21152
  cyan: "#00E5FF",
20929
21153
  black: "#000",
20930
21154
  white: "#fff",
@@ -20943,10 +21167,10 @@ var G = {
20943
21167
  descGrey: "#4d5156",
20944
21168
  faviconBg: "#e8eaed"};
20945
21169
  function charCountColor2(len, min, max) {
20946
- if (len >= min && len <= max) return C14.green;
20947
- if (len > 0 && len < min) return C14.orange;
20948
- if (len > max) return C14.red;
20949
- return C14.textSecondary;
21170
+ if (len >= min && len <= max) return C15.green;
21171
+ if (len > 0 && len < min) return C15.orange;
21172
+ if (len > max) return C15.red;
21173
+ return C15.textSecondary;
20950
21174
  }
20951
21175
  function truncateText(text, maxChars) {
20952
21176
  if (text.length <= maxChars) return text;
@@ -21001,8 +21225,8 @@ function SerpPreview({
21001
21225
  padding: "10px 12px",
21002
21226
  cursor: "pointer",
21003
21227
  borderRadius: 8,
21004
- border: `2px solid ${C14.border}`,
21005
- backgroundColor: C14.surface50,
21228
+ border: `2px solid ${C15.border}`,
21229
+ backgroundColor: C15.surface50,
21006
21230
  userSelect: "none"
21007
21231
  },
21008
21232
  children: [
@@ -21017,7 +21241,7 @@ function SerpPreview({
21017
21241
  fontWeight: 800,
21018
21242
  textTransform: "uppercase",
21019
21243
  letterSpacing: "0.04em",
21020
- color: C14.textPrimary
21244
+ color: C15.textPrimary
21021
21245
  },
21022
21246
  children: [
21023
21247
  /* @__PURE__ */ jsxs(
@@ -21049,7 +21273,7 @@ function SerpPreview({
21049
21273
  transition: "transform 0.2s",
21050
21274
  display: "inline-block",
21051
21275
  transform: open ? "rotate(90deg)" : "none",
21052
- color: C14.textSecondary
21276
+ color: C15.textSecondary
21053
21277
  },
21054
21278
  children: "\u25B6"
21055
21279
  }
@@ -21082,10 +21306,10 @@ function SerpPreview({
21082
21306
  "div",
21083
21307
  {
21084
21308
  style: {
21085
- backgroundColor: C14.white,
21086
- border: `2px solid ${C14.border}`,
21309
+ backgroundColor: C15.white,
21310
+ border: `2px solid ${C15.border}`,
21087
21311
  borderRadius: 12,
21088
- boxShadow: `3px 3px 0 0 ${C14.border}`,
21312
+ boxShadow: `3px 3px 0 0 ${C15.border}`,
21089
21313
  padding: isDesktop ? 20 : 14,
21090
21314
  maxWidth: isDesktop ? 650 : 380,
21091
21315
  overflow: "hidden"
@@ -21148,7 +21372,7 @@ function SerpPreview({
21148
21372
  style: {
21149
21373
  fontSize: 14,
21150
21374
  fontWeight: 400,
21151
- color: C14.black,
21375
+ color: C15.black,
21152
21376
  lineHeight: 1.3,
21153
21377
  whiteSpace: "nowrap",
21154
21378
  overflow: "hidden",
@@ -21212,7 +21436,7 @@ function SerpPreview({
21212
21436
  "span",
21213
21437
  {
21214
21438
  style: {
21215
- color: C14.textSecondary,
21439
+ color: C15.textSecondary,
21216
21440
  fontStyle: "italic",
21217
21441
  fontSize: titleFontSize - 2
21218
21442
  },
@@ -21241,7 +21465,7 @@ function SerpPreview({
21241
21465
  "span",
21242
21466
  {
21243
21467
  style: {
21244
- color: C14.textSecondary,
21468
+ color: C15.textSecondary,
21245
21469
  fontStyle: "italic",
21246
21470
  fontSize: descFontSize - 1
21247
21471
  },
@@ -21274,7 +21498,7 @@ function SerpPreview({
21274
21498
  fontSize: 11
21275
21499
  },
21276
21500
  children: [
21277
- /* @__PURE__ */ jsx("span", { style: { color: C14.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewTitle }),
21501
+ /* @__PURE__ */ jsx("span", { style: { color: C15.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewTitle }),
21278
21502
  /* @__PURE__ */ jsxs(
21279
21503
  "span",
21280
21504
  {
@@ -21303,7 +21527,7 @@ function SerpPreview({
21303
21527
  fontSize: 11
21304
21528
  },
21305
21529
  children: [
21306
- /* @__PURE__ */ jsx("span", { style: { color: C14.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewDescription }),
21530
+ /* @__PURE__ */ jsx("span", { style: { color: C15.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewDescription }),
21307
21531
  /* @__PURE__ */ jsxs(
21308
21532
  "span",
21309
21533
  {
@@ -21332,14 +21556,14 @@ function SerpPreview({
21332
21556
  fontSize: 11
21333
21557
  },
21334
21558
  children: [
21335
- /* @__PURE__ */ jsx("span", { style: { color: C14.textSecondary, fontWeight: 600 }, children: t.serpPreview.url }),
21559
+ /* @__PURE__ */ jsx("span", { style: { color: C15.textSecondary, fontWeight: 600 }, children: t.serpPreview.url }),
21336
21560
  /* @__PURE__ */ jsxs(
21337
21561
  "span",
21338
21562
  {
21339
21563
  style: {
21340
21564
  fontWeight: 700,
21341
21565
  fontVariantNumeric: "tabular-nums",
21342
- color: fullUrl.length <= 75 ? C14.green : C14.red
21566
+ color: fullUrl.length <= 75 ? C15.green : C15.red
21343
21567
  },
21344
21568
  children: [
21345
21569
  fullUrl.length,
@@ -21374,13 +21598,13 @@ function DeviceButton({
21374
21598
  gap: 5,
21375
21599
  padding: "4px 12px",
21376
21600
  borderRadius: 6,
21377
- border: `2px solid ${C14.border}`,
21601
+ border: `2px solid ${C15.border}`,
21378
21602
  fontSize: 11,
21379
21603
  fontWeight: 700,
21380
21604
  cursor: "pointer",
21381
- backgroundColor: active ? C14.cyan : C14.surfaceBg,
21382
- color: active ? C14.black : C14.textPrimary,
21383
- boxShadow: active ? `2px 2px 0 0 ${C14.border}` : "none",
21605
+ backgroundColor: active ? C15.cyan : C15.surfaceBg,
21606
+ color: active ? C15.black : C15.textPrimary,
21607
+ boxShadow: active ? `2px 2px 0 0 ${C15.border}` : "none",
21384
21608
  transition: "background-color 0.15s"
21385
21609
  },
21386
21610
  children: [