@consilioweb/payload-seo-analyzer 1.12.0 → 1.13.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
@@ -17349,9 +17349,210 @@ var C7 = {
17349
17349
  green: "#22c55e",
17350
17350
  red: "#ef4444",
17351
17351
  amber: "#f59e0b",
17352
- blue: "#3b82f6"
17352
+ violet: "#7c3aed"
17353
17353
  };
17354
17354
  var S4 = {
17355
+ fr: {
17356
+ title: "Opportunit\xE9s CTR (faible clic / bonne position)",
17357
+ 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.",
17358
+ needGsc: "Connectez Google Search Console ci-dessus pour activer les opportunit\xE9s CTR.",
17359
+ none: "Aucune opportunit\xE9 d\xE9tect\xE9e sur la p\xE9riode. \u{1F389}",
17360
+ loading: "Analyse des donn\xE9es GSC\u2026",
17361
+ page: "Page",
17362
+ pos: "Pos.",
17363
+ ctr: "CTR",
17364
+ expected: "attendu",
17365
+ potential: "Clics/mois potentiels",
17366
+ optimize: "Optimiser",
17367
+ optimizing: "\u2026",
17368
+ apply: "Appliquer",
17369
+ applied: "Appliqu\xE9 \u2713",
17370
+ noKey: "Cl\xE9 API Claude requise (ANTHROPIC_API_KEY).",
17371
+ open: "Ouvrir",
17372
+ refresh: "Rafra\xEEchir"
17373
+ },
17374
+ en: {
17375
+ title: "CTR opportunities (low clicks / good rank)",
17376
+ subtitle: "Pages that rank well but get few clicks (weak meta). Google Search Console data \u2192 targeted meta rewrite.",
17377
+ needGsc: "Connect Google Search Console above to enable CTR opportunities.",
17378
+ none: "No opportunities for the period. \u{1F389}",
17379
+ loading: "Analyzing GSC data\u2026",
17380
+ page: "Page",
17381
+ pos: "Pos.",
17382
+ ctr: "CTR",
17383
+ expected: "expected",
17384
+ potential: "Potential clicks/mo",
17385
+ optimize: "Optimize",
17386
+ optimizing: "\u2026",
17387
+ apply: "Apply",
17388
+ applied: "Applied \u2713",
17389
+ noKey: "Claude API key required (ANTHROPIC_API_KEY).",
17390
+ open: "Open",
17391
+ refresh: "Refresh"
17392
+ }
17393
+ };
17394
+ function CtrOpportunitiesPanel({ locale }) {
17395
+ const s = S4[locale] ?? S4.fr;
17396
+ const [opps, setOpps] = useState(null);
17397
+ const [loading, setLoading] = useState(true);
17398
+ const [notConnected, setNotConnected] = useState(false);
17399
+ const [error, setError] = useState(null);
17400
+ const [state, setState] = useState({});
17401
+ const load = useCallback(async () => {
17402
+ setLoading(true);
17403
+ setError(null);
17404
+ try {
17405
+ const res = await fetch("/api/seo-plugin/ctr-opportunities", { credentials: "include", cache: "no-store" });
17406
+ if (res.status === 403 || res.status === 409 || res.status === 400) {
17407
+ setNotConnected(true);
17408
+ return;
17409
+ }
17410
+ const json = await res.json();
17411
+ if (!res.ok) {
17412
+ setError(json.error || `Error ${res.status}`);
17413
+ return;
17414
+ }
17415
+ setNotConnected(false);
17416
+ setOpps(json.opportunities || []);
17417
+ } catch (e) {
17418
+ setError(e instanceof Error ? e.message : "Network error");
17419
+ } finally {
17420
+ setLoading(false);
17421
+ }
17422
+ }, []);
17423
+ useEffect(() => {
17424
+ void load();
17425
+ }, [load]);
17426
+ const setRow = (url, patch) => setState((p) => ({ ...p, [url]: { ...p[url], ...patch } }));
17427
+ const optimize = async (o) => {
17428
+ if (!o.doc) return;
17429
+ setRow(o.url, { busy: true, error: void 0 });
17430
+ try {
17431
+ const res = await fetch("/api/seo-plugin/ai-optimize", {
17432
+ method: "POST",
17433
+ credentials: "include",
17434
+ headers: { "Content-Type": "application/json" },
17435
+ body: JSON.stringify({ collection: o.doc.collection, id: o.doc.id })
17436
+ });
17437
+ const json = await res.json();
17438
+ if (!res.ok) {
17439
+ setRow(o.url, { busy: false, error: json.code === "no_api_key" ? s.noKey : json.error || `Error ${res.status}` });
17440
+ return;
17441
+ }
17442
+ setRow(o.url, { busy: false, suggestion: { ...json.suggestions, current: json.current } });
17443
+ } catch (e) {
17444
+ setRow(o.url, { busy: false, error: e instanceof Error ? e.message : "Network error" });
17445
+ }
17446
+ };
17447
+ const apply = async (o) => {
17448
+ const rs = state[o.url];
17449
+ if (!o.doc || !rs?.suggestion) return;
17450
+ setRow(o.url, { busy: true, error: void 0 });
17451
+ const patch = {};
17452
+ if (rs.suggestion.metaTitle || rs.suggestion.metaDescription) {
17453
+ patch.meta = { title: rs.suggestion.metaTitle, description: rs.suggestion.metaDescription };
17454
+ }
17455
+ if (rs.suggestion.focusKeyword && rs.suggestion.focusKeyword !== rs.suggestion.current?.focusKeyword) {
17456
+ patch.focusKeyword = rs.suggestion.focusKeyword;
17457
+ }
17458
+ try {
17459
+ await fetch(`/api/${o.doc.collection}/${o.doc.id}`, {
17460
+ method: "PATCH",
17461
+ credentials: "include",
17462
+ headers: { "Content-Type": "application/json" },
17463
+ body: JSON.stringify(patch)
17464
+ });
17465
+ setRow(o.url, { busy: false, applied: true });
17466
+ } catch (e) {
17467
+ setRow(o.url, { busy: false, error: e instanceof Error ? e.message : "Network error" });
17468
+ }
17469
+ };
17470
+ const card = { padding: 16, borderRadius: 12, border: `1px solid ${C7.border}`, backgroundColor: C7.card, marginBottom: 20 };
17471
+ const btn = (bg) => ({
17472
+ padding: "5px 10px",
17473
+ borderRadius: 6,
17474
+ border: `1px solid ${bg}`,
17475
+ backgroundColor: bg,
17476
+ color: "#fff",
17477
+ fontSize: 11,
17478
+ fontWeight: 700,
17479
+ cursor: "pointer"
17480
+ });
17481
+ return /* @__PURE__ */ jsxs("div", { style: card, children: [
17482
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", gap: 8, flexWrap: "wrap" }, children: [
17483
+ /* @__PURE__ */ jsxs("div", { children: [
17484
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C7.text }, children: s.title }),
17485
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 12, color: C7.sub, marginTop: 2 }, children: s.subtitle })
17486
+ ] }),
17487
+ !notConnected && /* @__PURE__ */ jsx("button", { type: "button", onClick: () => void load(), style: btn(C7.sub), children: s.refresh })
17488
+ ] }),
17489
+ error && /* @__PURE__ */ jsx("div", { style: { color: C7.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
17490
+ notConnected && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C7.sub }, children: s.needGsc }),
17491
+ loading && !notConnected && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C7.sub }, children: s.loading }),
17492
+ !loading && !notConnected && opps && opps.length === 0 && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C7.sub }, children: s.none }),
17493
+ !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: [
17494
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { style: { textAlign: "left", color: C7.sub }, children: [
17495
+ /* @__PURE__ */ jsx("th", { style: { padding: "6px 8px" }, children: s.page }),
17496
+ /* @__PURE__ */ jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.pos }),
17497
+ /* @__PURE__ */ jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.ctr }),
17498
+ /* @__PURE__ */ jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.potential }),
17499
+ /* @__PURE__ */ jsx("th", { style: { padding: "6px 8px" } })
17500
+ ] }) }),
17501
+ /* @__PURE__ */ jsx("tbody", { children: opps.slice(0, 50).map((o) => {
17502
+ const rs = state[o.url] || {};
17503
+ const path = (() => {
17504
+ try {
17505
+ return new URL(o.url).pathname;
17506
+ } catch {
17507
+ return o.url;
17508
+ }
17509
+ })();
17510
+ return /* @__PURE__ */ jsxs(React4.Fragment, { children: [
17511
+ /* @__PURE__ */ jsxs("tr", { style: { borderTop: `1px solid ${C7.border}`, color: C7.text }, children: [
17512
+ /* @__PURE__ */ jsx("td", { style: { padding: "6px 8px", maxWidth: 320, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: path }),
17513
+ /* @__PURE__ */ jsx("td", { style: { padding: "6px 8px", textAlign: "right" }, children: o.position.toFixed(1) }),
17514
+ /* @__PURE__ */ jsxs("td", { style: { padding: "6px 8px", textAlign: "right" }, children: [
17515
+ /* @__PURE__ */ jsxs("span", { style: { color: C7.red }, children: [
17516
+ (o.ctr * 100).toFixed(1),
17517
+ "%"
17518
+ ] }),
17519
+ /* @__PURE__ */ jsxs("span", { style: { color: C7.sub }, children: [
17520
+ " / ",
17521
+ (o.expectedCtr * 100).toFixed(0),
17522
+ "% ",
17523
+ s.expected
17524
+ ] })
17525
+ ] }),
17526
+ /* @__PURE__ */ jsxs("td", { style: { padding: "6px 8px", textAlign: "right", fontWeight: 700, color: C7.amber }, children: [
17527
+ "+",
17528
+ o.potentialClicks
17529
+ ] }),
17530
+ /* @__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: [
17531
+ s.open,
17532
+ " \u2197"
17533
+ ] }) })
17534
+ ] }),
17535
+ rs.suggestion && !rs.applied && /* @__PURE__ */ jsx("tr", { style: { color: C7.text }, children: /* @__PURE__ */ jsxs("td", { colSpan: 5, style: { padding: "0 8px 8px 8px" }, children: [
17536
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 11, color: C7.green, fontWeight: 600 }, children: rs.suggestion.metaTitle }),
17537
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 11, color: C7.sub }, children: rs.suggestion.metaDescription })
17538
+ ] }) }),
17539
+ 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 }) })
17540
+ ] }, o.url);
17541
+ }) })
17542
+ ] }) })
17543
+ ] });
17544
+ }
17545
+ var C8 = {
17546
+ text: "var(--theme-text, #1a1a1a)",
17547
+ sub: "var(--theme-elevation-600, #6b7280)",
17548
+ card: "var(--theme-elevation-50, #f9fafb)",
17549
+ border: "var(--theme-elevation-200, #e5e7eb)",
17550
+ green: "#22c55e",
17551
+ red: "#ef4444",
17552
+ amber: "#f59e0b",
17553
+ blue: "#3b82f6"
17554
+ };
17555
+ var S5 = {
17355
17556
  fr: {
17356
17557
  title: "Monitoring & alertes",
17357
17558
  subtitle: "Digest p\xE9riodique : r\xE9gressions de score, nouveaux 404, chutes de position (webhook / email).",
@@ -17394,7 +17595,7 @@ var S4 = {
17394
17595
  }
17395
17596
  };
17396
17597
  function AlertsPanel({ locale }) {
17397
- const s = S4[locale] ?? S4.fr;
17598
+ const s = S5[locale] ?? S5.fr;
17398
17599
  const [digest, setDigest] = useState(null);
17399
17600
  const [config, setConfig] = useState(null);
17400
17601
  const [loading, setLoading] = useState(true);
@@ -17449,15 +17650,15 @@ function AlertsPanel({ locale }) {
17449
17650
  const card = {
17450
17651
  padding: 16,
17451
17652
  borderRadius: 12,
17452
- border: `1px solid ${C7.border}`,
17453
- backgroundColor: C7.card,
17653
+ border: `1px solid ${C8.border}`,
17654
+ backgroundColor: C8.card,
17454
17655
  marginBottom: 20
17455
17656
  };
17456
17657
  const btn = {
17457
17658
  padding: "8px 12px",
17458
17659
  borderRadius: 8,
17459
- border: `1px solid ${C7.blue}`,
17460
- backgroundColor: C7.blue,
17660
+ border: `1px solid ${C8.blue}`,
17661
+ backgroundColor: C8.blue,
17461
17662
  color: "#fff",
17462
17663
  fontSize: 12,
17463
17664
  fontWeight: 700,
@@ -17470,32 +17671,32 @@ function AlertsPanel({ locale }) {
17470
17671
  padding: "3px 8px",
17471
17672
  borderRadius: 999,
17472
17673
  color: "#fff",
17473
- backgroundColor: ok ? C7.green : C7.sub,
17674
+ backgroundColor: ok ? C8.green : C8.sub,
17474
17675
  marginRight: 6
17475
17676
  });
17476
17677
  const hasChannel = config && (config.webhookConfigured || config.emailConfigured);
17477
17678
  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: [
17679
+ /* @__PURE__ */ jsxs("div", { style: { fontSize: 12, fontWeight: 700, color: C8.text, marginBottom: 4 }, children: [
17479
17680
  title,
17480
17681
  " ",
17481
- /* @__PURE__ */ jsxs("span", { style: { color: C7.amber }, children: [
17682
+ /* @__PURE__ */ jsxs("span", { style: { color: C8.amber }, children: [
17482
17683
  "(",
17483
17684
  rows.length,
17484
17685
  ")"
17485
17686
  ] })
17486
17687
  ] }),
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)) })
17688
+ /* @__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
17689
  ] }) : null;
17489
17690
  return /* @__PURE__ */ jsxs("div", { style: card, children: [
17490
17691
  /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: 8, flexWrap: "wrap" }, children: [
17491
17692
  /* @__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 })
17693
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C8.text }, children: s.title }),
17694
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 12, color: C8.sub, marginTop: 2 }, children: s.subtitle })
17494
17695
  ] }),
17495
17696
  hasChannel && /* @__PURE__ */ jsx("button", { type: "button", onClick: sendNow, disabled: busy, style: btn, children: busy ? s.sending : s.sendNow })
17496
17697
  ] }),
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 }),
17698
+ error && /* @__PURE__ */ jsx("div", { style: { color: C8.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
17699
+ notice && /* @__PURE__ */ jsx("div", { style: { color: C8.green, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: notice }),
17499
17700
  config && /* @__PURE__ */ jsxs("div", { style: { marginTop: 12 }, children: [
17500
17701
  /* @__PURE__ */ jsxs("span", { style: chip(config.webhookConfigured, s.webhook), children: [
17501
17702
  s.webhook,
@@ -17508,15 +17709,15 @@ function AlertsPanel({ locale }) {
17508
17709
  config.emailConfigured ? s.configured : s.missing
17509
17710
  ] })
17510
17711
  ] }),
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 }),
17712
+ !loading && !hasChannel && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C8.sub }, children: s.notConfigured }),
17713
+ loading && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C8.sub }, children: s.loading }),
17513
17714
  digest && /* @__PURE__ */ jsxs("div", { style: { marginTop: 8 }, children: [
17514
- /* @__PURE__ */ jsxs("div", { style: { fontSize: 12, color: C7.sub, marginTop: 6 }, children: [
17715
+ /* @__PURE__ */ jsxs("div", { style: { fontSize: 12, color: C8.sub, marginTop: 6 }, children: [
17515
17716
  digest.totalIssues,
17516
17717
  " ",
17517
17718
  s.issues
17518
17719
  ] }),
17519
- digest.totalIssues === 0 && /* @__PURE__ */ jsx("div", { style: { marginTop: 8, fontSize: 13, color: C7.sub }, children: s.noIssues }),
17720
+ digest.totalIssues === 0 && /* @__PURE__ */ jsx("div", { style: { marginTop: 8, fontSize: 13, color: C8.sub }, children: s.noIssues }),
17520
17721
  list(
17521
17722
  s.scoreReg,
17522
17723
  digest.scoreRegressions.map((r) => `${r.collection}/${r.documentId} \u2014 ${r.from} \u2192 ${r.to} (\u2212${r.drop})`)
@@ -17526,7 +17727,7 @@ function AlertsPanel({ locale }) {
17526
17727
  ] })
17527
17728
  ] });
17528
17729
  }
17529
- var C8 = {
17730
+ var C9 = {
17530
17731
  text: "var(--theme-text, #1a1a1a)",
17531
17732
  sub: "var(--theme-elevation-600, #6b7280)",
17532
17733
  card: "var(--theme-elevation-50, #f9fafb)",
@@ -17536,7 +17737,7 @@ var C8 = {
17536
17737
  red: "#ef4444",
17537
17738
  violet: "#7c3aed"
17538
17739
  };
17539
- var S5 = {
17740
+ var S6 = {
17540
17741
  fr: {
17541
17742
  title: "Alt-text IA des images",
17542
17743
  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 +17770,7 @@ var S5 = {
17569
17770
  }
17570
17771
  };
17571
17772
  function AltTextPanel({ locale }) {
17572
- const s = S5[locale] ?? S5.fr;
17773
+ const s = S6[locale] ?? S6.fr;
17573
17774
  const [items, setItems] = useState(null);
17574
17775
  const [collection, setCollection] = useState("media");
17575
17776
  const [missingCount, setMissingCount] = useState(0);
@@ -17646,8 +17847,8 @@ function AltTextPanel({ locale }) {
17646
17847
  const card = {
17647
17848
  padding: 16,
17648
17849
  borderRadius: 12,
17649
- border: `1px solid ${C8.border}`,
17650
- backgroundColor: C8.card,
17850
+ border: `1px solid ${C9.border}`,
17851
+ backgroundColor: C9.card,
17651
17852
  marginBottom: 20
17652
17853
  };
17653
17854
  const btn = (bg) => ({
@@ -17663,18 +17864,18 @@ function AltTextPanel({ locale }) {
17663
17864
  return /* @__PURE__ */ jsxs("div", { style: card, children: [
17664
17865
  /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: 8, flexWrap: "wrap" }, children: [
17665
17866
  /* @__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 })
17867
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C9.text }, children: s.title }),
17868
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 12, color: C9.sub, marginTop: 2 }, children: s.subtitle })
17668
17869
  ] }),
17669
- status === "ok" && /* @__PURE__ */ jsx("button", { type: "button", onClick: () => void load(), style: btn(C8.sub), children: s.refresh })
17870
+ status === "ok" && /* @__PURE__ */ jsx("button", { type: "button", onClick: () => void load(), style: btn(C9.sub), children: s.refresh })
17670
17871
  ] }),
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 }),
17872
+ status === "forbidden" && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C9.sub }, children: s.forbidden }),
17873
+ status === "disabled" && /* @__PURE__ */ jsx("div", { style: { marginTop: 12, fontSize: 13, color: C9.sub }, children: s.disabled }),
17673
17874
  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 }),
17875
+ loading && /* @__PURE__ */ jsx("div", { style: { fontSize: 13, color: C9.sub }, children: s.loading }),
17876
+ !loading && items && items.length === 0 && /* @__PURE__ */ jsx("div", { style: { fontSize: 13, color: C9.sub }, children: s.none }),
17676
17877
  !loading && items && items.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
17677
- /* @__PURE__ */ jsxs("div", { style: { fontSize: 12, color: C8.sub, marginBottom: 10 }, children: [
17878
+ /* @__PURE__ */ jsxs("div", { style: { fontSize: 12, color: C9.sub, marginBottom: 10 }, children: [
17678
17879
  missingCount,
17679
17880
  " ",
17680
17881
  s.missing
@@ -17690,8 +17891,8 @@ function AltTextPanel({ locale }) {
17690
17891
  alignItems: "center",
17691
17892
  padding: 8,
17692
17893
  borderRadius: 8,
17693
- border: `1px solid ${C8.border}`,
17694
- backgroundColor: C8.bg
17894
+ border: `1px solid ${C9.border}`,
17895
+ backgroundColor: C9.bg
17695
17896
  },
17696
17897
  children: [
17697
17898
  /* @__PURE__ */ jsx(
@@ -17699,11 +17900,11 @@ function AltTextPanel({ locale }) {
17699
17900
  {
17700
17901
  src: item.url,
17701
17902
  alt: "",
17702
- style: { width: 48, height: 48, objectFit: "cover", borderRadius: 6, flexShrink: 0, border: `1px solid ${C8.border}` }
17903
+ style: { width: 48, height: 48, objectFit: "cover", borderRadius: 6, flexShrink: 0, border: `1px solid ${C9.border}` }
17703
17904
  }
17704
17905
  ),
17705
17906
  /* @__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 }),
17907
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 11, color: C9.sub, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: item.filename }),
17707
17908
  rs.alt !== void 0 ? /* @__PURE__ */ jsx(
17708
17909
  "input",
17709
17910
  {
@@ -17717,15 +17918,15 @@ function AltTextPanel({ locale }) {
17717
17918
  padding: "4px 8px",
17718
17919
  fontSize: 12,
17719
17920
  borderRadius: 6,
17720
- border: `1px solid ${C8.border}`,
17721
- backgroundColor: C8.bg,
17722
- color: C8.text
17921
+ border: `1px solid ${C9.border}`,
17922
+ backgroundColor: C9.bg,
17923
+ color: C9.text
17723
17924
  }
17724
17925
  }
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 })
17926
+ ) : /* @__PURE__ */ jsx("div", { style: { fontSize: 12, color: C9.sub, marginTop: 4, fontStyle: "italic" }, children: "\u2014" }),
17927
+ rs.error && /* @__PURE__ */ jsx("div", { style: { fontSize: 11, color: C9.red, marginTop: 2 }, children: rs.error })
17727
17928
  ] }),
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 }) })
17929
+ /* @__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
17930
  ]
17730
17931
  },
17731
17932
  item.id
@@ -18150,6 +18351,7 @@ function PerformanceView() {
18150
18351
  /* @__PURE__ */ jsx(CoreWebVitalsPanel, { locale }),
18151
18352
  /* @__PURE__ */ jsx(GscPanel, { locale }),
18152
18353
  /* @__PURE__ */ jsx(RankTrackingPanel, { locale }),
18354
+ /* @__PURE__ */ jsx(CtrOpportunitiesPanel, { locale }),
18153
18355
  /* @__PURE__ */ jsx(AlertsPanel, { locale }),
18154
18356
  /* @__PURE__ */ jsx(AltTextPanel, { locale }),
18155
18357
  showImport && /* @__PURE__ */ jsxs(
@@ -18675,7 +18877,7 @@ function PerformanceView() {
18675
18877
  }
18676
18878
  );
18677
18879
  }
18678
- var C9 = {
18880
+ var C10 = {
18679
18881
  text: "var(--theme-text, #1a1a1a)",
18680
18882
  sub: "var(--theme-elevation-600, #6b7280)",
18681
18883
  card: "var(--theme-elevation-50, #f9fafb)",
@@ -18685,7 +18887,7 @@ var C9 = {
18685
18887
  red: "#ef4444",
18686
18888
  blue: "#3b82f6"
18687
18889
  };
18688
- var S6 = {
18890
+ var S7 = {
18689
18891
  fr: {
18690
18892
  title: "Brief de contenu IA",
18691
18893
  subtitle: "G\xE9n\xE8re un plan r\xE9dactionnel optimis\xE9 pour un mot-cl\xE9 (plan, entit\xE9s, questions, longueur cible).",
@@ -18720,7 +18922,7 @@ var S6 = {
18720
18922
  }
18721
18923
  };
18722
18924
  function ContentBriefPanel({ locale }) {
18723
- const s = S6[locale] ?? S6.fr;
18925
+ const s = S7[locale] ?? S7.fr;
18724
18926
  const [keyword, setKeyword] = useState("");
18725
18927
  const [brief, setBrief] = useState(null);
18726
18928
  const [busy, setBusy] = useState(false);
@@ -18756,8 +18958,8 @@ function ContentBriefPanel({ locale }) {
18756
18958
  const card = {
18757
18959
  padding: 16,
18758
18960
  borderRadius: 12,
18759
- border: `1px solid ${C9.border}`,
18760
- backgroundColor: C9.card,
18961
+ border: `1px solid ${C10.border}`,
18962
+ backgroundColor: C10.card,
18761
18963
  marginBottom: 20
18762
18964
  };
18763
18965
  const chip = {
@@ -18766,14 +18968,14 @@ function ContentBriefPanel({ locale }) {
18766
18968
  padding: "3px 8px",
18767
18969
  borderRadius: 999,
18768
18970
  backgroundColor: "rgba(59,130,246,0.12)",
18769
- color: C9.blue,
18770
- border: `1px solid ${C9.border}`,
18971
+ color: C10.blue,
18972
+ border: `1px solid ${C10.border}`,
18771
18973
  margin: "0 6px 6px 0"
18772
18974
  };
18773
- const h4 = { fontSize: 12, fontWeight: 800, color: C9.text, margin: "14px 0 6px", textTransform: "uppercase" };
18975
+ const h4 = { fontSize: 12, fontWeight: 800, color: C10.text, margin: "14px 0 6px", textTransform: "uppercase" };
18774
18976
  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 }),
18977
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C10.text }, children: s.title }),
18978
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 12, color: C10.sub, marginTop: 2, marginBottom: 12 }, children: s.subtitle }),
18777
18979
  /* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: 8, flexWrap: "wrap" }, children: [
18778
18980
  /* @__PURE__ */ jsx(
18779
18981
  "input",
@@ -18790,9 +18992,9 @@ function ContentBriefPanel({ locale }) {
18790
18992
  padding: "8px 12px",
18791
18993
  fontSize: 13,
18792
18994
  borderRadius: 8,
18793
- border: `1px solid ${C9.border}`,
18794
- backgroundColor: C9.bg,
18795
- color: C9.text
18995
+ border: `1px solid ${C10.border}`,
18996
+ backgroundColor: C10.bg,
18997
+ color: C10.text
18796
18998
  }
18797
18999
  }
18798
19000
  ),
@@ -18805,8 +19007,8 @@ function ContentBriefPanel({ locale }) {
18805
19007
  style: {
18806
19008
  padding: "8px 14px",
18807
19009
  borderRadius: 8,
18808
- border: `1px solid ${C9.violet}`,
18809
- backgroundColor: C9.violet,
19010
+ border: `1px solid ${C10.violet}`,
19011
+ backgroundColor: C10.violet,
18810
19012
  color: "#fff",
18811
19013
  fontSize: 12,
18812
19014
  fontWeight: 700,
@@ -18817,12 +19019,12 @@ function ContentBriefPanel({ locale }) {
18817
19019
  }
18818
19020
  )
18819
19021
  ] }),
18820
- error && /* @__PURE__ */ jsx("div", { style: { color: C9.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
19022
+ error && /* @__PURE__ */ jsx("div", { style: { color: C10.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
18821
19023
  brief && /* @__PURE__ */ jsxs("div", { style: { marginTop: 8 }, children: [
18822
- brief.recommendedWordCount > 0 && /* @__PURE__ */ jsxs("div", { style: { fontSize: 12, color: C9.sub, marginTop: 10 }, children: [
19024
+ brief.recommendedWordCount > 0 && /* @__PURE__ */ jsxs("div", { style: { fontSize: 12, color: C10.sub, marginTop: 10 }, children: [
18823
19025
  s.words,
18824
19026
  ": ",
18825
- /* @__PURE__ */ jsxs("b", { style: { color: C9.text }, children: [
19027
+ /* @__PURE__ */ jsxs("b", { style: { color: C10.text }, children: [
18826
19028
  "~",
18827
19029
  brief.recommendedWordCount,
18828
19030
  " ",
@@ -18831,7 +19033,7 @@ function ContentBriefPanel({ locale }) {
18831
19033
  ] }),
18832
19034
  brief.outline.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
18833
19035
  /* @__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)) })
19036
+ /* @__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
19037
  ] }),
18836
19038
  brief.entities.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
18837
19039
  /* @__PURE__ */ jsx("div", { style: h4, children: s.entities }),
@@ -18839,7 +19041,7 @@ function ContentBriefPanel({ locale }) {
18839
19041
  ] }),
18840
19042
  brief.questions.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
18841
19043
  /* @__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)) })
19044
+ /* @__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
19045
  ] }),
18844
19046
  brief.internalLinkIdeas.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
18845
19047
  /* @__PURE__ */ jsx("div", { style: h4, children: s.links }),
@@ -18847,7 +19049,7 @@ function ContentBriefPanel({ locale }) {
18847
19049
  ] }),
18848
19050
  brief.notes.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
18849
19051
  /* @__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)) })
19052
+ /* @__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
19053
  ] })
18852
19054
  ] })
18853
19055
  ] });
@@ -19989,7 +20191,7 @@ var controlBtnStyle = {
19989
20191
  cursor: "pointer",
19990
20192
  lineHeight: 1.4
19991
20193
  };
19992
- var C10 = {
20194
+ var C11 = {
19993
20195
  cyan: "#00E5FF",
19994
20196
  black: "#000",
19995
20197
  green: "#22c55e",
@@ -20004,10 +20206,10 @@ var C10 = {
20004
20206
  var TITLE_MIN = 30;
20005
20207
  var TITLE_MAX = 60;
20006
20208
  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;
20209
+ if (len === 0) return C11.textSecondary;
20210
+ if (len >= TITLE_MIN && len <= TITLE_MAX) return C11.green;
20211
+ if (len > 0 && len < TITLE_MIN) return C11.orange;
20212
+ return C11.red;
20011
20213
  }
20012
20214
  function getProgressPercent(len) {
20013
20215
  if (len === 0) return 0;
@@ -20015,9 +20217,9 @@ function getProgressPercent(len) {
20015
20217
  }
20016
20218
  function getProgressColor(len) {
20017
20219
  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;
20220
+ if (len >= TITLE_MIN && len <= TITLE_MAX) return C11.green;
20221
+ if (len < TITLE_MIN) return C11.orange;
20222
+ return C11.red;
20021
20223
  }
20022
20224
  function MetaTitleField({
20023
20225
  path,
@@ -20088,7 +20290,7 @@ function MetaTitleField({
20088
20290
  style: {
20089
20291
  fontSize: 13,
20090
20292
  fontWeight: 700,
20091
- color: C10.textPrimary
20293
+ color: C11.textPrimary
20092
20294
  },
20093
20295
  children: t.metaTitle.label
20094
20296
  }
@@ -20128,9 +20330,9 @@ function MetaTitleField({
20128
20330
  fontSize: 14,
20129
20331
  fontFamily: "inherit",
20130
20332
  borderRadius: 8,
20131
- border: `2px solid ${C10.border}`,
20132
- backgroundColor: C10.surfaceBg,
20133
- color: C10.textPrimary,
20333
+ border: `2px solid ${C11.border}`,
20334
+ backgroundColor: C11.surfaceBg,
20335
+ color: C11.textPrimary,
20134
20336
  outline: "none",
20135
20337
  boxShadow: "2px 2px 0 0 var(--theme-border-color, rgba(0,0,0,1))"
20136
20338
  }
@@ -20148,9 +20350,9 @@ function MetaTitleField({
20148
20350
  gap: 5,
20149
20351
  padding: "8px 14px",
20150
20352
  borderRadius: 8,
20151
- border: `2px solid ${C10.border}`,
20152
- backgroundColor: loading ? C10.surface50 : C10.cyan,
20153
- color: loading ? C10.textSecondary : C10.black,
20353
+ border: `2px solid ${C11.border}`,
20354
+ backgroundColor: loading ? C11.surface50 : C11.cyan,
20355
+ color: loading ? C11.textSecondary : C11.black,
20154
20356
  fontWeight: 800,
20155
20357
  fontSize: 11,
20156
20358
  textTransform: "uppercase",
@@ -20197,7 +20399,7 @@ function MetaTitleField({
20197
20399
  justifyContent: "space-between",
20198
20400
  marginTop: 4,
20199
20401
  fontSize: 10,
20200
- color: C10.textSecondary
20402
+ color: C11.textSecondary
20201
20403
  },
20202
20404
  children: [
20203
20405
  /* @__PURE__ */ jsxs("span", { children: [
@@ -20231,9 +20433,9 @@ function MetaTitleField({
20231
20433
  borderRadius: 6,
20232
20434
  fontSize: 11,
20233
20435
  fontWeight: 600,
20234
- color: C10.red,
20436
+ color: C11.red,
20235
20437
  backgroundColor: "rgba(239,68,68,0.08)",
20236
- border: `1px solid ${C10.red}`
20438
+ border: `1px solid ${C11.red}`
20237
20439
  },
20238
20440
  children: error
20239
20441
  }
@@ -20242,7 +20444,7 @@ function MetaTitleField({
20242
20444
  }
20243
20445
  );
20244
20446
  }
20245
- var C11 = {
20447
+ var C12 = {
20246
20448
  cyan: "#00E5FF",
20247
20449
  black: "#000",
20248
20450
  green: "#22c55e",
@@ -20257,10 +20459,10 @@ var C11 = {
20257
20459
  var DESC_MIN = 120;
20258
20460
  var DESC_MAX = 160;
20259
20461
  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;
20462
+ if (len === 0) return C12.textSecondary;
20463
+ if (len >= DESC_MIN && len <= DESC_MAX) return C12.green;
20464
+ if (len > 0 && len < DESC_MIN) return C12.orange;
20465
+ return C12.red;
20264
20466
  }
20265
20467
  function getProgressPercent2(len) {
20266
20468
  if (len === 0) return 0;
@@ -20268,9 +20470,9 @@ function getProgressPercent2(len) {
20268
20470
  }
20269
20471
  function getProgressColor2(len) {
20270
20472
  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;
20473
+ if (len >= DESC_MIN && len <= DESC_MAX) return C12.green;
20474
+ if (len < DESC_MIN) return C12.orange;
20475
+ return C12.red;
20274
20476
  }
20275
20477
  function MetaDescriptionField({
20276
20478
  path,
@@ -20341,7 +20543,7 @@ function MetaDescriptionField({
20341
20543
  style: {
20342
20544
  fontSize: 13,
20343
20545
  fontWeight: 700,
20344
- color: C11.textPrimary
20546
+ color: C12.textPrimary
20345
20547
  },
20346
20548
  children: t.metaDescription.label
20347
20549
  }
@@ -20381,9 +20583,9 @@ function MetaDescriptionField({
20381
20583
  fontSize: 14,
20382
20584
  fontFamily: "inherit",
20383
20585
  borderRadius: 8,
20384
- border: `2px solid ${C11.border}`,
20385
- backgroundColor: C11.surfaceBg,
20386
- color: C11.textPrimary,
20586
+ border: `2px solid ${C12.border}`,
20587
+ backgroundColor: C12.surfaceBg,
20588
+ color: C12.textPrimary,
20387
20589
  outline: "none",
20388
20590
  resize: "vertical",
20389
20591
  lineHeight: 1.5,
@@ -20403,9 +20605,9 @@ function MetaDescriptionField({
20403
20605
  gap: 5,
20404
20606
  padding: "8px 14px",
20405
20607
  borderRadius: 8,
20406
- border: `2px solid ${C11.border}`,
20407
- backgroundColor: loading ? C11.surface50 : C11.cyan,
20408
- color: loading ? C11.textSecondary : C11.black,
20608
+ border: `2px solid ${C12.border}`,
20609
+ backgroundColor: loading ? C12.surface50 : C12.cyan,
20610
+ color: loading ? C12.textSecondary : C12.black,
20409
20611
  fontWeight: 800,
20410
20612
  fontSize: 11,
20411
20613
  textTransform: "uppercase",
@@ -20453,7 +20655,7 @@ function MetaDescriptionField({
20453
20655
  justifyContent: "space-between",
20454
20656
  marginTop: 4,
20455
20657
  fontSize: 10,
20456
- color: C11.textSecondary
20658
+ color: C12.textSecondary
20457
20659
  },
20458
20660
  children: [
20459
20661
  /* @__PURE__ */ jsxs("span", { children: [
@@ -20487,9 +20689,9 @@ function MetaDescriptionField({
20487
20689
  borderRadius: 6,
20488
20690
  fontSize: 11,
20489
20691
  fontWeight: 600,
20490
- color: C11.red,
20692
+ color: C12.red,
20491
20693
  backgroundColor: "rgba(239,68,68,0.08)",
20492
- border: `1px solid ${C11.red}`
20694
+ border: `1px solid ${C12.red}`
20493
20695
  },
20494
20696
  children: error
20495
20697
  }
@@ -20498,7 +20700,7 @@ function MetaDescriptionField({
20498
20700
  }
20499
20701
  );
20500
20702
  }
20501
- var C12 = {
20703
+ var C13 = {
20502
20704
  cyan: "#00E5FF",
20503
20705
  black: "#000",
20504
20706
  white: "#fff",
@@ -20575,8 +20777,8 @@ function MetaImageField({
20575
20777
  gap: 10,
20576
20778
  padding: "10px 14px",
20577
20779
  borderRadius: 8,
20578
- border: `2px solid ${C12.border}`,
20579
- backgroundColor: C12.surfaceBg,
20780
+ border: `2px solid ${C13.border}`,
20781
+ backgroundColor: C13.surfaceBg,
20580
20782
  boxShadow: "2px 2px 0 0 var(--theme-border-color, rgba(0,0,0,1))"
20581
20783
  },
20582
20784
  children: [
@@ -20595,7 +20797,7 @@ function MetaImageField({
20595
20797
  fontWeight: 900,
20596
20798
  backgroundColor: hasImage ? "rgba(34,197,94,0.15)" : "rgba(255,138,0,0.15)",
20597
20799
  color: hasImage ? "#16a34a" : "#d97706",
20598
- border: `1px solid ${hasImage ? C12.green : C12.orange}`
20800
+ border: `1px solid ${hasImage ? C13.green : C13.orange}`
20599
20801
  },
20600
20802
  children: hasImage ? "\u2713" : "!"
20601
20803
  }
@@ -20607,7 +20809,7 @@ function MetaImageField({
20607
20809
  style: {
20608
20810
  fontSize: 12,
20609
20811
  fontWeight: 700,
20610
- color: C12.textPrimary
20812
+ color: C13.textPrimary
20611
20813
  },
20612
20814
  children: t.metaImage.label
20613
20815
  }
@@ -20617,7 +20819,7 @@ function MetaImageField({
20617
20819
  {
20618
20820
  style: {
20619
20821
  fontSize: 10,
20620
- color: C12.textSecondary,
20822
+ color: C13.textSecondary,
20621
20823
  lineHeight: 1.4
20622
20824
  },
20623
20825
  children: hasImage ? t.metaImage.imageSet : t.metaImage.noImage
@@ -20637,9 +20839,9 @@ function MetaImageField({
20637
20839
  gap: 5,
20638
20840
  padding: "8px 14px",
20639
20841
  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,
20842
+ border: `2px solid ${C13.border}`,
20843
+ backgroundColor: loading ? C13.surface50 : success ? C13.green : C13.cyan,
20844
+ color: loading ? C13.textSecondary : success ? C13.white : C13.black,
20643
20845
  fontWeight: 800,
20644
20846
  fontSize: 11,
20645
20847
  textTransform: "uppercase",
@@ -20666,9 +20868,9 @@ function MetaImageField({
20666
20868
  borderRadius: 6,
20667
20869
  fontSize: 11,
20668
20870
  fontWeight: 600,
20669
- color: C12.red,
20871
+ color: C13.red,
20670
20872
  backgroundColor: "rgba(239,68,68,0.08)",
20671
- border: `1px solid ${C12.red}`
20873
+ border: `1px solid ${C13.red}`
20672
20874
  },
20673
20875
  children: error
20674
20876
  }
@@ -20677,7 +20879,7 @@ function MetaImageField({
20677
20879
  }
20678
20880
  );
20679
20881
  }
20680
- var C13 = {
20882
+ var C14 = {
20681
20883
  black: "#000",
20682
20884
  white: "#fff",
20683
20885
  green: "#22c55e",
@@ -20691,15 +20893,15 @@ var C13 = {
20691
20893
  function getCompletenessColor(count) {
20692
20894
  switch (count) {
20693
20895
  case 0:
20694
- return C13.red;
20896
+ return C14.red;
20695
20897
  case 1:
20696
- return C13.orange;
20898
+ return C14.orange;
20697
20899
  case 2:
20698
- return C13.yellow;
20900
+ return C14.yellow;
20699
20901
  case 3:
20700
- return C13.green;
20902
+ return C14.green;
20701
20903
  default:
20702
- return C13.textSecondary;
20904
+ return C14.textSecondary;
20703
20905
  }
20704
20906
  }
20705
20907
  function getCompletenessLabel(count, ov) {
@@ -20757,8 +20959,8 @@ function OverviewField({
20757
20959
  fontFamily: "var(--font-body, Inter, system-ui, sans-serif)",
20758
20960
  padding: "12px 14px",
20759
20961
  borderRadius: 10,
20760
- border: `2px solid ${C13.border}`,
20761
- backgroundColor: C13.surfaceBg,
20962
+ border: `2px solid ${C14.border}`,
20963
+ backgroundColor: C14.surfaceBg,
20762
20964
  boxShadow: "3px 3px 0 0 var(--theme-border-color, rgba(0,0,0,1))",
20763
20965
  marginBottom: 12
20764
20966
  },
@@ -20781,7 +20983,7 @@ function OverviewField({
20781
20983
  fontWeight: 800,
20782
20984
  textTransform: "uppercase",
20783
20985
  letterSpacing: "0.04em",
20784
- color: C13.textPrimary
20986
+ color: C14.textPrimary
20785
20987
  },
20786
20988
  children: t.overview.metaCompleteness
20787
20989
  }
@@ -20796,8 +20998,8 @@ function OverviewField({
20796
20998
  fontSize: 11,
20797
20999
  fontWeight: 800,
20798
21000
  backgroundColor: completenessColor,
20799
- color: completenessColor === C13.yellow ? C13.black : C13.white,
20800
- border: `2px solid ${C13.border}`,
21001
+ color: completenessColor === C14.yellow ? C14.black : C14.white,
21002
+ border: `2px solid ${C14.border}`,
20801
21003
  textTransform: "uppercase",
20802
21004
  letterSpacing: "0.03em"
20803
21005
  },
@@ -20895,7 +21097,7 @@ function OverviewField({
20895
21097
  style: {
20896
21098
  fontSize: 12,
20897
21099
  fontWeight: 600,
20898
- color: item.filled ? C13.textPrimary : C13.textSecondary
21100
+ color: item.filled ? C14.textPrimary : C14.textSecondary
20899
21101
  },
20900
21102
  children: item.label
20901
21103
  }
@@ -20907,7 +21109,7 @@ function OverviewField({
20907
21109
  marginLeft: "auto",
20908
21110
  fontSize: 10,
20909
21111
  fontWeight: 700,
20910
- color: item.filled ? C13.green : C13.red,
21112
+ color: item.filled ? C14.green : C14.red,
20911
21113
  textTransform: "uppercase",
20912
21114
  letterSpacing: "0.03em"
20913
21115
  },
@@ -20924,7 +21126,7 @@ function OverviewField({
20924
21126
  }
20925
21127
  );
20926
21128
  }
20927
- var C14 = {
21129
+ var C15 = {
20928
21130
  cyan: "#00E5FF",
20929
21131
  black: "#000",
20930
21132
  white: "#fff",
@@ -20943,10 +21145,10 @@ var G = {
20943
21145
  descGrey: "#4d5156",
20944
21146
  faviconBg: "#e8eaed"};
20945
21147
  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;
21148
+ if (len >= min && len <= max) return C15.green;
21149
+ if (len > 0 && len < min) return C15.orange;
21150
+ if (len > max) return C15.red;
21151
+ return C15.textSecondary;
20950
21152
  }
20951
21153
  function truncateText(text, maxChars) {
20952
21154
  if (text.length <= maxChars) return text;
@@ -21001,8 +21203,8 @@ function SerpPreview({
21001
21203
  padding: "10px 12px",
21002
21204
  cursor: "pointer",
21003
21205
  borderRadius: 8,
21004
- border: `2px solid ${C14.border}`,
21005
- backgroundColor: C14.surface50,
21206
+ border: `2px solid ${C15.border}`,
21207
+ backgroundColor: C15.surface50,
21006
21208
  userSelect: "none"
21007
21209
  },
21008
21210
  children: [
@@ -21017,7 +21219,7 @@ function SerpPreview({
21017
21219
  fontWeight: 800,
21018
21220
  textTransform: "uppercase",
21019
21221
  letterSpacing: "0.04em",
21020
- color: C14.textPrimary
21222
+ color: C15.textPrimary
21021
21223
  },
21022
21224
  children: [
21023
21225
  /* @__PURE__ */ jsxs(
@@ -21049,7 +21251,7 @@ function SerpPreview({
21049
21251
  transition: "transform 0.2s",
21050
21252
  display: "inline-block",
21051
21253
  transform: open ? "rotate(90deg)" : "none",
21052
- color: C14.textSecondary
21254
+ color: C15.textSecondary
21053
21255
  },
21054
21256
  children: "\u25B6"
21055
21257
  }
@@ -21082,10 +21284,10 @@ function SerpPreview({
21082
21284
  "div",
21083
21285
  {
21084
21286
  style: {
21085
- backgroundColor: C14.white,
21086
- border: `2px solid ${C14.border}`,
21287
+ backgroundColor: C15.white,
21288
+ border: `2px solid ${C15.border}`,
21087
21289
  borderRadius: 12,
21088
- boxShadow: `3px 3px 0 0 ${C14.border}`,
21290
+ boxShadow: `3px 3px 0 0 ${C15.border}`,
21089
21291
  padding: isDesktop ? 20 : 14,
21090
21292
  maxWidth: isDesktop ? 650 : 380,
21091
21293
  overflow: "hidden"
@@ -21148,7 +21350,7 @@ function SerpPreview({
21148
21350
  style: {
21149
21351
  fontSize: 14,
21150
21352
  fontWeight: 400,
21151
- color: C14.black,
21353
+ color: C15.black,
21152
21354
  lineHeight: 1.3,
21153
21355
  whiteSpace: "nowrap",
21154
21356
  overflow: "hidden",
@@ -21212,7 +21414,7 @@ function SerpPreview({
21212
21414
  "span",
21213
21415
  {
21214
21416
  style: {
21215
- color: C14.textSecondary,
21417
+ color: C15.textSecondary,
21216
21418
  fontStyle: "italic",
21217
21419
  fontSize: titleFontSize - 2
21218
21420
  },
@@ -21241,7 +21443,7 @@ function SerpPreview({
21241
21443
  "span",
21242
21444
  {
21243
21445
  style: {
21244
- color: C14.textSecondary,
21446
+ color: C15.textSecondary,
21245
21447
  fontStyle: "italic",
21246
21448
  fontSize: descFontSize - 1
21247
21449
  },
@@ -21274,7 +21476,7 @@ function SerpPreview({
21274
21476
  fontSize: 11
21275
21477
  },
21276
21478
  children: [
21277
- /* @__PURE__ */ jsx("span", { style: { color: C14.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewTitle }),
21479
+ /* @__PURE__ */ jsx("span", { style: { color: C15.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewTitle }),
21278
21480
  /* @__PURE__ */ jsxs(
21279
21481
  "span",
21280
21482
  {
@@ -21303,7 +21505,7 @@ function SerpPreview({
21303
21505
  fontSize: 11
21304
21506
  },
21305
21507
  children: [
21306
- /* @__PURE__ */ jsx("span", { style: { color: C14.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewDescription }),
21508
+ /* @__PURE__ */ jsx("span", { style: { color: C15.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewDescription }),
21307
21509
  /* @__PURE__ */ jsxs(
21308
21510
  "span",
21309
21511
  {
@@ -21332,14 +21534,14 @@ function SerpPreview({
21332
21534
  fontSize: 11
21333
21535
  },
21334
21536
  children: [
21335
- /* @__PURE__ */ jsx("span", { style: { color: C14.textSecondary, fontWeight: 600 }, children: t.serpPreview.url }),
21537
+ /* @__PURE__ */ jsx("span", { style: { color: C15.textSecondary, fontWeight: 600 }, children: t.serpPreview.url }),
21336
21538
  /* @__PURE__ */ jsxs(
21337
21539
  "span",
21338
21540
  {
21339
21541
  style: {
21340
21542
  fontWeight: 700,
21341
21543
  fontVariantNumeric: "tabular-nums",
21342
- color: fullUrl.length <= 75 ? C14.green : C14.red
21544
+ color: fullUrl.length <= 75 ? C15.green : C15.red
21343
21545
  },
21344
21546
  children: [
21345
21547
  fullUrl.length,
@@ -21374,13 +21576,13 @@ function DeviceButton({
21374
21576
  gap: 5,
21375
21577
  padding: "4px 12px",
21376
21578
  borderRadius: 6,
21377
- border: `2px solid ${C14.border}`,
21579
+ border: `2px solid ${C15.border}`,
21378
21580
  fontSize: 11,
21379
21581
  fontWeight: 700,
21380
21582
  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",
21583
+ backgroundColor: active ? C15.cyan : C15.surfaceBg,
21584
+ color: active ? C15.black : C15.textPrimary,
21585
+ boxShadow: active ? `2px 2px 0 0 ${C15.border}` : "none",
21384
21586
  transition: "background-color 0.15s"
21385
21587
  },
21386
21588
  children: [