@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.cjs CHANGED
@@ -17355,9 +17355,210 @@ var C7 = {
17355
17355
  green: "#22c55e",
17356
17356
  red: "#ef4444",
17357
17357
  amber: "#f59e0b",
17358
- blue: "#3b82f6"
17358
+ violet: "#7c3aed"
17359
17359
  };
17360
17360
  var S4 = {
17361
+ fr: {
17362
+ title: "Opportunit\xE9s CTR (faible clic / bonne position)",
17363
+ 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.",
17364
+ needGsc: "Connectez Google Search Console ci-dessus pour activer les opportunit\xE9s CTR.",
17365
+ none: "Aucune opportunit\xE9 d\xE9tect\xE9e sur la p\xE9riode. \u{1F389}",
17366
+ loading: "Analyse des donn\xE9es GSC\u2026",
17367
+ page: "Page",
17368
+ pos: "Pos.",
17369
+ ctr: "CTR",
17370
+ expected: "attendu",
17371
+ potential: "Clics/mois potentiels",
17372
+ optimize: "Optimiser",
17373
+ optimizing: "\u2026",
17374
+ apply: "Appliquer",
17375
+ applied: "Appliqu\xE9 \u2713",
17376
+ noKey: "Cl\xE9 API Claude requise (ANTHROPIC_API_KEY).",
17377
+ open: "Ouvrir",
17378
+ refresh: "Rafra\xEEchir"
17379
+ },
17380
+ en: {
17381
+ title: "CTR opportunities (low clicks / good rank)",
17382
+ subtitle: "Pages that rank well but get few clicks (weak meta). Google Search Console data \u2192 targeted meta rewrite.",
17383
+ needGsc: "Connect Google Search Console above to enable CTR opportunities.",
17384
+ none: "No opportunities for the period. \u{1F389}",
17385
+ loading: "Analyzing GSC data\u2026",
17386
+ page: "Page",
17387
+ pos: "Pos.",
17388
+ ctr: "CTR",
17389
+ expected: "expected",
17390
+ potential: "Potential clicks/mo",
17391
+ optimize: "Optimize",
17392
+ optimizing: "\u2026",
17393
+ apply: "Apply",
17394
+ applied: "Applied \u2713",
17395
+ noKey: "Claude API key required (ANTHROPIC_API_KEY).",
17396
+ open: "Open",
17397
+ refresh: "Refresh"
17398
+ }
17399
+ };
17400
+ function CtrOpportunitiesPanel({ locale }) {
17401
+ const s = S4[locale] ?? S4.fr;
17402
+ const [opps, setOpps] = React4.useState(null);
17403
+ const [loading, setLoading] = React4.useState(true);
17404
+ const [notConnected, setNotConnected] = React4.useState(false);
17405
+ const [error, setError] = React4.useState(null);
17406
+ const [state, setState] = React4.useState({});
17407
+ const load = React4.useCallback(async () => {
17408
+ setLoading(true);
17409
+ setError(null);
17410
+ try {
17411
+ const res = await fetch("/api/seo-plugin/ctr-opportunities", { credentials: "include", cache: "no-store" });
17412
+ if (res.status === 403 || res.status === 409 || res.status === 400) {
17413
+ setNotConnected(true);
17414
+ return;
17415
+ }
17416
+ const json = await res.json();
17417
+ if (!res.ok) {
17418
+ setError(json.error || `Error ${res.status}`);
17419
+ return;
17420
+ }
17421
+ setNotConnected(false);
17422
+ setOpps(json.opportunities || []);
17423
+ } catch (e) {
17424
+ setError(e instanceof Error ? e.message : "Network error");
17425
+ } finally {
17426
+ setLoading(false);
17427
+ }
17428
+ }, []);
17429
+ React4.useEffect(() => {
17430
+ void load();
17431
+ }, [load]);
17432
+ const setRow = (url, patch) => setState((p) => ({ ...p, [url]: { ...p[url], ...patch } }));
17433
+ const optimize = async (o) => {
17434
+ if (!o.doc) return;
17435
+ setRow(o.url, { busy: true, error: void 0 });
17436
+ try {
17437
+ const res = await fetch("/api/seo-plugin/ai-optimize", {
17438
+ method: "POST",
17439
+ credentials: "include",
17440
+ headers: { "Content-Type": "application/json" },
17441
+ body: JSON.stringify({ collection: o.doc.collection, id: o.doc.id })
17442
+ });
17443
+ const json = await res.json();
17444
+ if (!res.ok) {
17445
+ setRow(o.url, { busy: false, error: json.code === "no_api_key" ? s.noKey : json.error || `Error ${res.status}` });
17446
+ return;
17447
+ }
17448
+ setRow(o.url, { busy: false, suggestion: { ...json.suggestions, current: json.current } });
17449
+ } catch (e) {
17450
+ setRow(o.url, { busy: false, error: e instanceof Error ? e.message : "Network error" });
17451
+ }
17452
+ };
17453
+ const apply = async (o) => {
17454
+ const rs = state[o.url];
17455
+ if (!o.doc || !rs?.suggestion) return;
17456
+ setRow(o.url, { busy: true, error: void 0 });
17457
+ const patch = {};
17458
+ if (rs.suggestion.metaTitle || rs.suggestion.metaDescription) {
17459
+ patch.meta = { title: rs.suggestion.metaTitle, description: rs.suggestion.metaDescription };
17460
+ }
17461
+ if (rs.suggestion.focusKeyword && rs.suggestion.focusKeyword !== rs.suggestion.current?.focusKeyword) {
17462
+ patch.focusKeyword = rs.suggestion.focusKeyword;
17463
+ }
17464
+ try {
17465
+ await fetch(`/api/${o.doc.collection}/${o.doc.id}`, {
17466
+ method: "PATCH",
17467
+ credentials: "include",
17468
+ headers: { "Content-Type": "application/json" },
17469
+ body: JSON.stringify(patch)
17470
+ });
17471
+ setRow(o.url, { busy: false, applied: true });
17472
+ } catch (e) {
17473
+ setRow(o.url, { busy: false, error: e instanceof Error ? e.message : "Network error" });
17474
+ }
17475
+ };
17476
+ const card = { padding: 16, borderRadius: 12, border: `1px solid ${C7.border}`, backgroundColor: C7.card, marginBottom: 20 };
17477
+ const btn = (bg) => ({
17478
+ padding: "5px 10px",
17479
+ borderRadius: 6,
17480
+ border: `1px solid ${bg}`,
17481
+ backgroundColor: bg,
17482
+ color: "#fff",
17483
+ fontSize: 11,
17484
+ fontWeight: 700,
17485
+ cursor: "pointer"
17486
+ });
17487
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: card, children: [
17488
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", gap: 8, flexWrap: "wrap" }, children: [
17489
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
17490
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C7.text }, children: s.title }),
17491
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C7.sub, marginTop: 2 }, children: s.subtitle })
17492
+ ] }),
17493
+ !notConnected && /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void load(), style: btn(C7.sub), children: s.refresh })
17494
+ ] }),
17495
+ error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: C7.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
17496
+ notConnected && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C7.sub }, children: s.needGsc }),
17497
+ loading && !notConnected && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C7.sub }, children: s.loading }),
17498
+ !loading && !notConnected && opps && opps.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C7.sub }, children: s.none }),
17499
+ !notConnected && opps && opps.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { overflowX: "auto", marginTop: 12 }, children: /* @__PURE__ */ jsxRuntime.jsxs("table", { style: { width: "100%", borderCollapse: "collapse", fontSize: 12 }, children: [
17500
+ /* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { style: { textAlign: "left", color: C7.sub }, children: [
17501
+ /* @__PURE__ */ jsxRuntime.jsx("th", { style: { padding: "6px 8px" }, children: s.page }),
17502
+ /* @__PURE__ */ jsxRuntime.jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.pos }),
17503
+ /* @__PURE__ */ jsxRuntime.jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.ctr }),
17504
+ /* @__PURE__ */ jsxRuntime.jsx("th", { style: { padding: "6px 8px", textAlign: "right" }, children: s.potential }),
17505
+ /* @__PURE__ */ jsxRuntime.jsx("th", { style: { padding: "6px 8px" } })
17506
+ ] }) }),
17507
+ /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: opps.slice(0, 50).map((o) => {
17508
+ const rs = state[o.url] || {};
17509
+ const path = (() => {
17510
+ try {
17511
+ return new URL(o.url).pathname;
17512
+ } catch {
17513
+ return o.url;
17514
+ }
17515
+ })();
17516
+ return /* @__PURE__ */ jsxRuntime.jsxs(React4__default.default.Fragment, { children: [
17517
+ /* @__PURE__ */ jsxRuntime.jsxs("tr", { style: { borderTop: `1px solid ${C7.border}`, color: C7.text }, children: [
17518
+ /* @__PURE__ */ jsxRuntime.jsx("td", { style: { padding: "6px 8px", maxWidth: 320, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: path }),
17519
+ /* @__PURE__ */ jsxRuntime.jsx("td", { style: { padding: "6px 8px", textAlign: "right" }, children: o.position.toFixed(1) }),
17520
+ /* @__PURE__ */ jsxRuntime.jsxs("td", { style: { padding: "6px 8px", textAlign: "right" }, children: [
17521
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: C7.red }, children: [
17522
+ (o.ctr * 100).toFixed(1),
17523
+ "%"
17524
+ ] }),
17525
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: C7.sub }, children: [
17526
+ " / ",
17527
+ (o.expectedCtr * 100).toFixed(0),
17528
+ "% ",
17529
+ s.expected
17530
+ ] })
17531
+ ] }),
17532
+ /* @__PURE__ */ jsxRuntime.jsxs("td", { style: { padding: "6px 8px", textAlign: "right", fontWeight: 700, color: C7.amber }, children: [
17533
+ "+",
17534
+ o.potentialClicks
17535
+ ] }),
17536
+ /* @__PURE__ */ jsxRuntime.jsx("td", { style: { padding: "6px 8px", textAlign: "right" }, children: rs.applied ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 11, fontWeight: 700, color: C7.green }, children: s.applied }) : o.doc ? rs.suggestion ? /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void apply(o), disabled: rs.busy, style: btn(C7.green), children: rs.busy ? s.optimizing : s.apply }) : /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void optimize(o), disabled: rs.busy, style: btn(C7.violet), children: rs.busy ? s.optimizing : `\u2728 ${s.optimize}` }) : /* @__PURE__ */ jsxRuntime.jsxs("a", { href: o.url, target: "_blank", rel: "noopener noreferrer", style: { fontSize: 11, color: C7.sub }, children: [
17537
+ s.open,
17538
+ " \u2197"
17539
+ ] }) })
17540
+ ] }),
17541
+ rs.suggestion && !rs.applied && /* @__PURE__ */ jsxRuntime.jsx("tr", { style: { color: C7.text }, children: /* @__PURE__ */ jsxRuntime.jsxs("td", { colSpan: 5, style: { padding: "0 8px 8px 8px" }, children: [
17542
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 11, color: C7.green, fontWeight: 600 }, children: rs.suggestion.metaTitle }),
17543
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 11, color: C7.sub }, children: rs.suggestion.metaDescription })
17544
+ ] }) }),
17545
+ rs.error && /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: 5, style: { padding: "0 8px 6px 8px", fontSize: 11, color: C7.red }, children: rs.error }) })
17546
+ ] }, o.url);
17547
+ }) })
17548
+ ] }) })
17549
+ ] });
17550
+ }
17551
+ var C8 = {
17552
+ text: "var(--theme-text, #1a1a1a)",
17553
+ sub: "var(--theme-elevation-600, #6b7280)",
17554
+ card: "var(--theme-elevation-50, #f9fafb)",
17555
+ border: "var(--theme-elevation-200, #e5e7eb)",
17556
+ green: "#22c55e",
17557
+ red: "#ef4444",
17558
+ amber: "#f59e0b",
17559
+ blue: "#3b82f6"
17560
+ };
17561
+ var S5 = {
17361
17562
  fr: {
17362
17563
  title: "Monitoring & alertes",
17363
17564
  subtitle: "Digest p\xE9riodique : r\xE9gressions de score, nouveaux 404, chutes de position (webhook / email).",
@@ -17400,7 +17601,7 @@ var S4 = {
17400
17601
  }
17401
17602
  };
17402
17603
  function AlertsPanel({ locale }) {
17403
- const s = S4[locale] ?? S4.fr;
17604
+ const s = S5[locale] ?? S5.fr;
17404
17605
  const [digest, setDigest] = React4.useState(null);
17405
17606
  const [config, setConfig] = React4.useState(null);
17406
17607
  const [loading, setLoading] = React4.useState(true);
@@ -17455,15 +17656,15 @@ function AlertsPanel({ locale }) {
17455
17656
  const card = {
17456
17657
  padding: 16,
17457
17658
  borderRadius: 12,
17458
- border: `1px solid ${C7.border}`,
17459
- backgroundColor: C7.card,
17659
+ border: `1px solid ${C8.border}`,
17660
+ backgroundColor: C8.card,
17460
17661
  marginBottom: 20
17461
17662
  };
17462
17663
  const btn = {
17463
17664
  padding: "8px 12px",
17464
17665
  borderRadius: 8,
17465
- border: `1px solid ${C7.blue}`,
17466
- backgroundColor: C7.blue,
17666
+ border: `1px solid ${C8.blue}`,
17667
+ backgroundColor: C8.blue,
17467
17668
  color: "#fff",
17468
17669
  fontSize: 12,
17469
17670
  fontWeight: 700,
@@ -17476,32 +17677,32 @@ function AlertsPanel({ locale }) {
17476
17677
  padding: "3px 8px",
17477
17678
  borderRadius: 999,
17478
17679
  color: "#fff",
17479
- backgroundColor: ok ? C7.green : C7.sub,
17680
+ backgroundColor: ok ? C8.green : C8.sub,
17480
17681
  marginRight: 6
17481
17682
  });
17482
17683
  const hasChannel = config && (config.webhookConfigured || config.emailConfigured);
17483
17684
  const list = (title, rows) => rows.length ? /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: 10 }, children: [
17484
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: 12, fontWeight: 700, color: C7.text, marginBottom: 4 }, children: [
17685
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: 12, fontWeight: 700, color: C8.text, marginBottom: 4 }, children: [
17485
17686
  title,
17486
17687
  " ",
17487
- /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: C7.amber }, children: [
17688
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: C8.amber }, children: [
17488
17689
  "(",
17489
17690
  rows.length,
17490
17691
  ")"
17491
17692
  ] })
17492
17693
  ] }),
17493
- /* @__PURE__ */ jsxRuntime.jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 12, color: C7.sub, lineHeight: 1.6 }, children: rows.slice(0, 8).map((r, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: r }, i)) })
17694
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 12, color: C8.sub, lineHeight: 1.6 }, children: rows.slice(0, 8).map((r, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: r }, i)) })
17494
17695
  ] }) : null;
17495
17696
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: card, children: [
17496
17697
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: 8, flexWrap: "wrap" }, children: [
17497
17698
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
17498
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C7.text }, children: s.title }),
17499
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C7.sub, marginTop: 2 }, children: s.subtitle })
17699
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C8.text }, children: s.title }),
17700
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C8.sub, marginTop: 2 }, children: s.subtitle })
17500
17701
  ] }),
17501
17702
  hasChannel && /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: sendNow, disabled: busy, style: btn, children: busy ? s.sending : s.sendNow })
17502
17703
  ] }),
17503
- error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: C7.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
17504
- notice && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: C7.green, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: notice }),
17704
+ error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: C8.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
17705
+ notice && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: C8.green, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: notice }),
17505
17706
  config && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: 12 }, children: [
17506
17707
  /* @__PURE__ */ jsxRuntime.jsxs("span", { style: chip(config.webhookConfigured, s.webhook), children: [
17507
17708
  s.webhook,
@@ -17514,15 +17715,15 @@ function AlertsPanel({ locale }) {
17514
17715
  config.emailConfigured ? s.configured : s.missing
17515
17716
  ] })
17516
17717
  ] }),
17517
- !loading && !hasChannel && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C7.sub }, children: s.notConfigured }),
17518
- loading && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C7.sub }, children: s.loading }),
17718
+ !loading && !hasChannel && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C8.sub }, children: s.notConfigured }),
17719
+ loading && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C8.sub }, children: s.loading }),
17519
17720
  digest && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: 8 }, children: [
17520
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: 12, color: C7.sub, marginTop: 6 }, children: [
17721
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: 12, color: C8.sub, marginTop: 6 }, children: [
17521
17722
  digest.totalIssues,
17522
17723
  " ",
17523
17724
  s.issues
17524
17725
  ] }),
17525
- digest.totalIssues === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 8, fontSize: 13, color: C7.sub }, children: s.noIssues }),
17726
+ digest.totalIssues === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 8, fontSize: 13, color: C8.sub }, children: s.noIssues }),
17526
17727
  list(
17527
17728
  s.scoreReg,
17528
17729
  digest.scoreRegressions.map((r) => `${r.collection}/${r.documentId} \u2014 ${r.from} \u2192 ${r.to} (\u2212${r.drop})`)
@@ -17532,7 +17733,7 @@ function AlertsPanel({ locale }) {
17532
17733
  ] })
17533
17734
  ] });
17534
17735
  }
17535
- var C8 = {
17736
+ var C9 = {
17536
17737
  text: "var(--theme-text, #1a1a1a)",
17537
17738
  sub: "var(--theme-elevation-600, #6b7280)",
17538
17739
  card: "var(--theme-elevation-50, #f9fafb)",
@@ -17542,7 +17743,7 @@ var C8 = {
17542
17743
  red: "#ef4444",
17543
17744
  violet: "#7c3aed"
17544
17745
  };
17545
- var S5 = {
17746
+ var S6 = {
17546
17747
  fr: {
17547
17748
  title: "Alt-text IA des images",
17548
17749
  subtitle: "G\xE9n\xE8re l'attribut alt des images qui n'en ont pas (Claude vision), pour l'accessibilit\xE9 et le SEO.",
@@ -17575,7 +17776,7 @@ var S5 = {
17575
17776
  }
17576
17777
  };
17577
17778
  function AltTextPanel({ locale }) {
17578
- const s = S5[locale] ?? S5.fr;
17779
+ const s = S6[locale] ?? S6.fr;
17579
17780
  const [items, setItems] = React4.useState(null);
17580
17781
  const [collection, setCollection] = React4.useState("media");
17581
17782
  const [missingCount, setMissingCount] = React4.useState(0);
@@ -17652,8 +17853,8 @@ function AltTextPanel({ locale }) {
17652
17853
  const card = {
17653
17854
  padding: 16,
17654
17855
  borderRadius: 12,
17655
- border: `1px solid ${C8.border}`,
17656
- backgroundColor: C8.card,
17856
+ border: `1px solid ${C9.border}`,
17857
+ backgroundColor: C9.card,
17657
17858
  marginBottom: 20
17658
17859
  };
17659
17860
  const btn = (bg) => ({
@@ -17669,18 +17870,18 @@ function AltTextPanel({ locale }) {
17669
17870
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: card, children: [
17670
17871
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: 8, flexWrap: "wrap" }, children: [
17671
17872
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
17672
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C8.text }, children: s.title }),
17673
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C8.sub, marginTop: 2 }, children: s.subtitle })
17873
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C9.text }, children: s.title }),
17874
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C9.sub, marginTop: 2 }, children: s.subtitle })
17674
17875
  ] }),
17675
- status === "ok" && /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void load(), style: btn(C8.sub), children: s.refresh })
17876
+ status === "ok" && /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void load(), style: btn(C9.sub), children: s.refresh })
17676
17877
  ] }),
17677
- status === "forbidden" && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C8.sub }, children: s.forbidden }),
17678
- status === "disabled" && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C8.sub }, children: s.disabled }),
17878
+ status === "forbidden" && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C9.sub }, children: s.forbidden }),
17879
+ status === "disabled" && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 12, fontSize: 13, color: C9.sub }, children: s.disabled }),
17679
17880
  status === "ok" && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: 12 }, children: [
17680
- loading && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 13, color: C8.sub }, children: s.loading }),
17681
- !loading && items && items.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 13, color: C8.sub }, children: s.none }),
17881
+ loading && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 13, color: C9.sub }, children: s.loading }),
17882
+ !loading && items && items.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 13, color: C9.sub }, children: s.none }),
17682
17883
  !loading && items && items.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
17683
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: 12, color: C8.sub, marginBottom: 10 }, children: [
17884
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: 12, color: C9.sub, marginBottom: 10 }, children: [
17684
17885
  missingCount,
17685
17886
  " ",
17686
17887
  s.missing
@@ -17696,8 +17897,8 @@ function AltTextPanel({ locale }) {
17696
17897
  alignItems: "center",
17697
17898
  padding: 8,
17698
17899
  borderRadius: 8,
17699
- border: `1px solid ${C8.border}`,
17700
- backgroundColor: C8.bg
17900
+ border: `1px solid ${C9.border}`,
17901
+ backgroundColor: C9.bg
17701
17902
  },
17702
17903
  children: [
17703
17904
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -17705,11 +17906,11 @@ function AltTextPanel({ locale }) {
17705
17906
  {
17706
17907
  src: item.url,
17707
17908
  alt: "",
17708
- style: { width: 48, height: 48, objectFit: "cover", borderRadius: 6, flexShrink: 0, border: `1px solid ${C8.border}` }
17909
+ style: { width: 48, height: 48, objectFit: "cover", borderRadius: 6, flexShrink: 0, border: `1px solid ${C9.border}` }
17709
17910
  }
17710
17911
  ),
17711
17912
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
17712
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 11, color: C8.sub, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: item.filename }),
17913
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 11, color: C9.sub, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: item.filename }),
17713
17914
  rs.alt !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx(
17714
17915
  "input",
17715
17916
  {
@@ -17723,15 +17924,15 @@ function AltTextPanel({ locale }) {
17723
17924
  padding: "4px 8px",
17724
17925
  fontSize: 12,
17725
17926
  borderRadius: 6,
17726
- border: `1px solid ${C8.border}`,
17727
- backgroundColor: C8.bg,
17728
- color: C8.text
17927
+ border: `1px solid ${C9.border}`,
17928
+ backgroundColor: C9.bg,
17929
+ color: C9.text
17729
17930
  }
17730
17931
  }
17731
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C8.sub, marginTop: 4, fontStyle: "italic" }, children: "\u2014" }),
17732
- rs.error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 11, color: C8.red, marginTop: 2 }, children: rs.error })
17932
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C9.sub, marginTop: 4, fontStyle: "italic" }, children: "\u2014" }),
17933
+ rs.error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 11, color: C9.red, marginTop: 2 }, children: rs.error })
17733
17934
  ] }),
17734
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { flexShrink: 0 }, children: rs.applied ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 11, fontWeight: 700, color: C8.green }, children: s.applied }) : rs.alt !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void apply(item), disabled: rs.busy, style: btn(C8.green), children: rs.busy ? s.generating : s.apply }) : /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void generate(item), disabled: rs.busy, style: btn(C8.violet), children: rs.busy ? s.generating : s.generate }) })
17935
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { flexShrink: 0 }, children: rs.applied ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 11, fontWeight: 700, color: C9.green }, children: s.applied }) : rs.alt !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void apply(item), disabled: rs.busy, style: btn(C9.green), children: rs.busy ? s.generating : s.apply }) : /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => void generate(item), disabled: rs.busy, style: btn(C9.violet), children: rs.busy ? s.generating : s.generate }) })
17735
17936
  ]
17736
17937
  },
17737
17938
  item.id
@@ -18156,6 +18357,7 @@ function PerformanceView() {
18156
18357
  /* @__PURE__ */ jsxRuntime.jsx(CoreWebVitalsPanel, { locale }),
18157
18358
  /* @__PURE__ */ jsxRuntime.jsx(GscPanel, { locale }),
18158
18359
  /* @__PURE__ */ jsxRuntime.jsx(RankTrackingPanel, { locale }),
18360
+ /* @__PURE__ */ jsxRuntime.jsx(CtrOpportunitiesPanel, { locale }),
18159
18361
  /* @__PURE__ */ jsxRuntime.jsx(AlertsPanel, { locale }),
18160
18362
  /* @__PURE__ */ jsxRuntime.jsx(AltTextPanel, { locale }),
18161
18363
  showImport && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -18681,7 +18883,7 @@ function PerformanceView() {
18681
18883
  }
18682
18884
  );
18683
18885
  }
18684
- var C9 = {
18886
+ var C10 = {
18685
18887
  text: "var(--theme-text, #1a1a1a)",
18686
18888
  sub: "var(--theme-elevation-600, #6b7280)",
18687
18889
  card: "var(--theme-elevation-50, #f9fafb)",
@@ -18691,7 +18893,7 @@ var C9 = {
18691
18893
  red: "#ef4444",
18692
18894
  blue: "#3b82f6"
18693
18895
  };
18694
- var S6 = {
18896
+ var S7 = {
18695
18897
  fr: {
18696
18898
  title: "Brief de contenu IA",
18697
18899
  subtitle: "G\xE9n\xE8re un plan r\xE9dactionnel optimis\xE9 pour un mot-cl\xE9 (plan, entit\xE9s, questions, longueur cible).",
@@ -18726,7 +18928,7 @@ var S6 = {
18726
18928
  }
18727
18929
  };
18728
18930
  function ContentBriefPanel({ locale }) {
18729
- const s = S6[locale] ?? S6.fr;
18931
+ const s = S7[locale] ?? S7.fr;
18730
18932
  const [keyword, setKeyword] = React4.useState("");
18731
18933
  const [brief, setBrief] = React4.useState(null);
18732
18934
  const [busy, setBusy] = React4.useState(false);
@@ -18762,8 +18964,8 @@ function ContentBriefPanel({ locale }) {
18762
18964
  const card = {
18763
18965
  padding: 16,
18764
18966
  borderRadius: 12,
18765
- border: `1px solid ${C9.border}`,
18766
- backgroundColor: C9.card,
18967
+ border: `1px solid ${C10.border}`,
18968
+ backgroundColor: C10.card,
18767
18969
  marginBottom: 20
18768
18970
  };
18769
18971
  const chip = {
@@ -18772,14 +18974,14 @@ function ContentBriefPanel({ locale }) {
18772
18974
  padding: "3px 8px",
18773
18975
  borderRadius: 999,
18774
18976
  backgroundColor: "rgba(59,130,246,0.12)",
18775
- color: C9.blue,
18776
- border: `1px solid ${C9.border}`,
18977
+ color: C10.blue,
18978
+ border: `1px solid ${C10.border}`,
18777
18979
  margin: "0 6px 6px 0"
18778
18980
  };
18779
- const h4 = { fontSize: 12, fontWeight: 800, color: C9.text, margin: "14px 0 6px", textTransform: "uppercase" };
18981
+ const h4 = { fontSize: 12, fontWeight: 800, color: C10.text, margin: "14px 0 6px", textTransform: "uppercase" };
18780
18982
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: card, children: [
18781
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C9.text }, children: s.title }),
18782
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C9.sub, marginTop: 2, marginBottom: 12 }, children: s.subtitle }),
18983
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C10.text }, children: s.title }),
18984
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C10.sub, marginTop: 2, marginBottom: 12 }, children: s.subtitle }),
18783
18985
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: 8, flexWrap: "wrap" }, children: [
18784
18986
  /* @__PURE__ */ jsxRuntime.jsx(
18785
18987
  "input",
@@ -18796,9 +18998,9 @@ function ContentBriefPanel({ locale }) {
18796
18998
  padding: "8px 12px",
18797
18999
  fontSize: 13,
18798
19000
  borderRadius: 8,
18799
- border: `1px solid ${C9.border}`,
18800
- backgroundColor: C9.bg,
18801
- color: C9.text
19001
+ border: `1px solid ${C10.border}`,
19002
+ backgroundColor: C10.bg,
19003
+ color: C10.text
18802
19004
  }
18803
19005
  }
18804
19006
  ),
@@ -18811,8 +19013,8 @@ function ContentBriefPanel({ locale }) {
18811
19013
  style: {
18812
19014
  padding: "8px 14px",
18813
19015
  borderRadius: 8,
18814
- border: `1px solid ${C9.violet}`,
18815
- backgroundColor: C9.violet,
19016
+ border: `1px solid ${C10.violet}`,
19017
+ backgroundColor: C10.violet,
18816
19018
  color: "#fff",
18817
19019
  fontSize: 12,
18818
19020
  fontWeight: 700,
@@ -18823,12 +19025,12 @@ function ContentBriefPanel({ locale }) {
18823
19025
  }
18824
19026
  )
18825
19027
  ] }),
18826
- error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: C9.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
19028
+ error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: C10.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
18827
19029
  brief && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: 8 }, children: [
18828
- brief.recommendedWordCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: 12, color: C9.sub, marginTop: 10 }, children: [
19030
+ brief.recommendedWordCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: 12, color: C10.sub, marginTop: 10 }, children: [
18829
19031
  s.words,
18830
19032
  ": ",
18831
- /* @__PURE__ */ jsxRuntime.jsxs("b", { style: { color: C9.text }, children: [
19033
+ /* @__PURE__ */ jsxRuntime.jsxs("b", { style: { color: C10.text }, children: [
18832
19034
  "~",
18833
19035
  brief.recommendedWordCount,
18834
19036
  " ",
@@ -18837,7 +19039,7 @@ function ContentBriefPanel({ locale }) {
18837
19039
  ] }),
18838
19040
  brief.outline.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
18839
19041
  /* @__PURE__ */ jsxRuntime.jsx("div", { style: h4, children: s.outline }),
18840
- /* @__PURE__ */ jsxRuntime.jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 13, color: C9.text, lineHeight: 1.6 }, children: brief.outline.map((o, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { style: { marginLeft: o.level === "h3" ? 18 : 0, color: o.level === "h3" ? C9.sub : C9.text, fontWeight: o.level === "h2" ? 700 : 400 }, children: o.text }, i)) })
19042
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 13, color: C10.text, lineHeight: 1.6 }, children: brief.outline.map((o, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { style: { marginLeft: o.level === "h3" ? 18 : 0, color: o.level === "h3" ? C10.sub : C10.text, fontWeight: o.level === "h2" ? 700 : 400 }, children: o.text }, i)) })
18841
19043
  ] }),
18842
19044
  brief.entities.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
18843
19045
  /* @__PURE__ */ jsxRuntime.jsx("div", { style: h4, children: s.entities }),
@@ -18845,7 +19047,7 @@ function ContentBriefPanel({ locale }) {
18845
19047
  ] }),
18846
19048
  brief.questions.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
18847
19049
  /* @__PURE__ */ jsxRuntime.jsx("div", { style: h4, children: s.questions }),
18848
- /* @__PURE__ */ jsxRuntime.jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 13, color: C9.text, lineHeight: 1.6 }, children: brief.questions.map((q, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: q }, i)) })
19050
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 13, color: C10.text, lineHeight: 1.6 }, children: brief.questions.map((q, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: q }, i)) })
18849
19051
  ] }),
18850
19052
  brief.internalLinkIdeas.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
18851
19053
  /* @__PURE__ */ jsxRuntime.jsx("div", { style: h4, children: s.links }),
@@ -18853,7 +19055,7 @@ function ContentBriefPanel({ locale }) {
18853
19055
  ] }),
18854
19056
  brief.notes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
18855
19057
  /* @__PURE__ */ jsxRuntime.jsx("div", { style: h4, children: s.notes }),
18856
- /* @__PURE__ */ jsxRuntime.jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 12, color: C9.sub, lineHeight: 1.6 }, children: brief.notes.map((n, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: n }, i)) })
19058
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 12, color: C10.sub, lineHeight: 1.6 }, children: brief.notes.map((n, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: n }, i)) })
18857
19059
  ] })
18858
19060
  ] })
18859
19061
  ] });
@@ -19995,7 +20197,7 @@ var controlBtnStyle = {
19995
20197
  cursor: "pointer",
19996
20198
  lineHeight: 1.4
19997
20199
  };
19998
- var C10 = {
20200
+ var C11 = {
19999
20201
  cyan: "#00E5FF",
20000
20202
  black: "#000",
20001
20203
  green: "#22c55e",
@@ -20010,10 +20212,10 @@ var C10 = {
20010
20212
  var TITLE_MIN = 30;
20011
20213
  var TITLE_MAX = 60;
20012
20214
  function getCharColor(len) {
20013
- if (len === 0) return C10.textSecondary;
20014
- if (len >= TITLE_MIN && len <= TITLE_MAX) return C10.green;
20015
- if (len > 0 && len < TITLE_MIN) return C10.orange;
20016
- return C10.red;
20215
+ if (len === 0) return C11.textSecondary;
20216
+ if (len >= TITLE_MIN && len <= TITLE_MAX) return C11.green;
20217
+ if (len > 0 && len < TITLE_MIN) return C11.orange;
20218
+ return C11.red;
20017
20219
  }
20018
20220
  function getProgressPercent(len) {
20019
20221
  if (len === 0) return 0;
@@ -20021,9 +20223,9 @@ function getProgressPercent(len) {
20021
20223
  }
20022
20224
  function getProgressColor(len) {
20023
20225
  if (len === 0) return "var(--theme-elevation-200, #e5e7eb)";
20024
- if (len >= TITLE_MIN && len <= TITLE_MAX) return C10.green;
20025
- if (len < TITLE_MIN) return C10.orange;
20026
- return C10.red;
20226
+ if (len >= TITLE_MIN && len <= TITLE_MAX) return C11.green;
20227
+ if (len < TITLE_MIN) return C11.orange;
20228
+ return C11.red;
20027
20229
  }
20028
20230
  function MetaTitleField({
20029
20231
  path,
@@ -20094,7 +20296,7 @@ function MetaTitleField({
20094
20296
  style: {
20095
20297
  fontSize: 13,
20096
20298
  fontWeight: 700,
20097
- color: C10.textPrimary
20299
+ color: C11.textPrimary
20098
20300
  },
20099
20301
  children: t.metaTitle.label
20100
20302
  }
@@ -20134,9 +20336,9 @@ function MetaTitleField({
20134
20336
  fontSize: 14,
20135
20337
  fontFamily: "inherit",
20136
20338
  borderRadius: 8,
20137
- border: `2px solid ${C10.border}`,
20138
- backgroundColor: C10.surfaceBg,
20139
- color: C10.textPrimary,
20339
+ border: `2px solid ${C11.border}`,
20340
+ backgroundColor: C11.surfaceBg,
20341
+ color: C11.textPrimary,
20140
20342
  outline: "none",
20141
20343
  boxShadow: "2px 2px 0 0 var(--theme-border-color, rgba(0,0,0,1))"
20142
20344
  }
@@ -20154,9 +20356,9 @@ function MetaTitleField({
20154
20356
  gap: 5,
20155
20357
  padding: "8px 14px",
20156
20358
  borderRadius: 8,
20157
- border: `2px solid ${C10.border}`,
20158
- backgroundColor: loading ? C10.surface50 : C10.cyan,
20159
- color: loading ? C10.textSecondary : C10.black,
20359
+ border: `2px solid ${C11.border}`,
20360
+ backgroundColor: loading ? C11.surface50 : C11.cyan,
20361
+ color: loading ? C11.textSecondary : C11.black,
20160
20362
  fontWeight: 800,
20161
20363
  fontSize: 11,
20162
20364
  textTransform: "uppercase",
@@ -20203,7 +20405,7 @@ function MetaTitleField({
20203
20405
  justifyContent: "space-between",
20204
20406
  marginTop: 4,
20205
20407
  fontSize: 10,
20206
- color: C10.textSecondary
20408
+ color: C11.textSecondary
20207
20409
  },
20208
20410
  children: [
20209
20411
  /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
@@ -20237,9 +20439,9 @@ function MetaTitleField({
20237
20439
  borderRadius: 6,
20238
20440
  fontSize: 11,
20239
20441
  fontWeight: 600,
20240
- color: C10.red,
20442
+ color: C11.red,
20241
20443
  backgroundColor: "rgba(239,68,68,0.08)",
20242
- border: `1px solid ${C10.red}`
20444
+ border: `1px solid ${C11.red}`
20243
20445
  },
20244
20446
  children: error
20245
20447
  }
@@ -20248,7 +20450,7 @@ function MetaTitleField({
20248
20450
  }
20249
20451
  );
20250
20452
  }
20251
- var C11 = {
20453
+ var C12 = {
20252
20454
  cyan: "#00E5FF",
20253
20455
  black: "#000",
20254
20456
  green: "#22c55e",
@@ -20263,10 +20465,10 @@ var C11 = {
20263
20465
  var DESC_MIN = 120;
20264
20466
  var DESC_MAX = 160;
20265
20467
  function getCharColor2(len) {
20266
- if (len === 0) return C11.textSecondary;
20267
- if (len >= DESC_MIN && len <= DESC_MAX) return C11.green;
20268
- if (len > 0 && len < DESC_MIN) return C11.orange;
20269
- return C11.red;
20468
+ if (len === 0) return C12.textSecondary;
20469
+ if (len >= DESC_MIN && len <= DESC_MAX) return C12.green;
20470
+ if (len > 0 && len < DESC_MIN) return C12.orange;
20471
+ return C12.red;
20270
20472
  }
20271
20473
  function getProgressPercent2(len) {
20272
20474
  if (len === 0) return 0;
@@ -20274,9 +20476,9 @@ function getProgressPercent2(len) {
20274
20476
  }
20275
20477
  function getProgressColor2(len) {
20276
20478
  if (len === 0) return "var(--theme-elevation-200, #e5e7eb)";
20277
- if (len >= DESC_MIN && len <= DESC_MAX) return C11.green;
20278
- if (len < DESC_MIN) return C11.orange;
20279
- return C11.red;
20479
+ if (len >= DESC_MIN && len <= DESC_MAX) return C12.green;
20480
+ if (len < DESC_MIN) return C12.orange;
20481
+ return C12.red;
20280
20482
  }
20281
20483
  function MetaDescriptionField({
20282
20484
  path,
@@ -20347,7 +20549,7 @@ function MetaDescriptionField({
20347
20549
  style: {
20348
20550
  fontSize: 13,
20349
20551
  fontWeight: 700,
20350
- color: C11.textPrimary
20552
+ color: C12.textPrimary
20351
20553
  },
20352
20554
  children: t.metaDescription.label
20353
20555
  }
@@ -20387,9 +20589,9 @@ function MetaDescriptionField({
20387
20589
  fontSize: 14,
20388
20590
  fontFamily: "inherit",
20389
20591
  borderRadius: 8,
20390
- border: `2px solid ${C11.border}`,
20391
- backgroundColor: C11.surfaceBg,
20392
- color: C11.textPrimary,
20592
+ border: `2px solid ${C12.border}`,
20593
+ backgroundColor: C12.surfaceBg,
20594
+ color: C12.textPrimary,
20393
20595
  outline: "none",
20394
20596
  resize: "vertical",
20395
20597
  lineHeight: 1.5,
@@ -20409,9 +20611,9 @@ function MetaDescriptionField({
20409
20611
  gap: 5,
20410
20612
  padding: "8px 14px",
20411
20613
  borderRadius: 8,
20412
- border: `2px solid ${C11.border}`,
20413
- backgroundColor: loading ? C11.surface50 : C11.cyan,
20414
- color: loading ? C11.textSecondary : C11.black,
20614
+ border: `2px solid ${C12.border}`,
20615
+ backgroundColor: loading ? C12.surface50 : C12.cyan,
20616
+ color: loading ? C12.textSecondary : C12.black,
20415
20617
  fontWeight: 800,
20416
20618
  fontSize: 11,
20417
20619
  textTransform: "uppercase",
@@ -20459,7 +20661,7 @@ function MetaDescriptionField({
20459
20661
  justifyContent: "space-between",
20460
20662
  marginTop: 4,
20461
20663
  fontSize: 10,
20462
- color: C11.textSecondary
20664
+ color: C12.textSecondary
20463
20665
  },
20464
20666
  children: [
20465
20667
  /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
@@ -20493,9 +20695,9 @@ function MetaDescriptionField({
20493
20695
  borderRadius: 6,
20494
20696
  fontSize: 11,
20495
20697
  fontWeight: 600,
20496
- color: C11.red,
20698
+ color: C12.red,
20497
20699
  backgroundColor: "rgba(239,68,68,0.08)",
20498
- border: `1px solid ${C11.red}`
20700
+ border: `1px solid ${C12.red}`
20499
20701
  },
20500
20702
  children: error
20501
20703
  }
@@ -20504,7 +20706,7 @@ function MetaDescriptionField({
20504
20706
  }
20505
20707
  );
20506
20708
  }
20507
- var C12 = {
20709
+ var C13 = {
20508
20710
  cyan: "#00E5FF",
20509
20711
  black: "#000",
20510
20712
  white: "#fff",
@@ -20581,8 +20783,8 @@ function MetaImageField({
20581
20783
  gap: 10,
20582
20784
  padding: "10px 14px",
20583
20785
  borderRadius: 8,
20584
- border: `2px solid ${C12.border}`,
20585
- backgroundColor: C12.surfaceBg,
20786
+ border: `2px solid ${C13.border}`,
20787
+ backgroundColor: C13.surfaceBg,
20586
20788
  boxShadow: "2px 2px 0 0 var(--theme-border-color, rgba(0,0,0,1))"
20587
20789
  },
20588
20790
  children: [
@@ -20601,7 +20803,7 @@ function MetaImageField({
20601
20803
  fontWeight: 900,
20602
20804
  backgroundColor: hasImage ? "rgba(34,197,94,0.15)" : "rgba(255,138,0,0.15)",
20603
20805
  color: hasImage ? "#16a34a" : "#d97706",
20604
- border: `1px solid ${hasImage ? C12.green : C12.orange}`
20806
+ border: `1px solid ${hasImage ? C13.green : C13.orange}`
20605
20807
  },
20606
20808
  children: hasImage ? "\u2713" : "!"
20607
20809
  }
@@ -20613,7 +20815,7 @@ function MetaImageField({
20613
20815
  style: {
20614
20816
  fontSize: 12,
20615
20817
  fontWeight: 700,
20616
- color: C12.textPrimary
20818
+ color: C13.textPrimary
20617
20819
  },
20618
20820
  children: t.metaImage.label
20619
20821
  }
@@ -20623,7 +20825,7 @@ function MetaImageField({
20623
20825
  {
20624
20826
  style: {
20625
20827
  fontSize: 10,
20626
- color: C12.textSecondary,
20828
+ color: C13.textSecondary,
20627
20829
  lineHeight: 1.4
20628
20830
  },
20629
20831
  children: hasImage ? t.metaImage.imageSet : t.metaImage.noImage
@@ -20643,9 +20845,9 @@ function MetaImageField({
20643
20845
  gap: 5,
20644
20846
  padding: "8px 14px",
20645
20847
  borderRadius: 8,
20646
- border: `2px solid ${C12.border}`,
20647
- backgroundColor: loading ? C12.surface50 : success ? C12.green : C12.cyan,
20648
- color: loading ? C12.textSecondary : success ? C12.white : C12.black,
20848
+ border: `2px solid ${C13.border}`,
20849
+ backgroundColor: loading ? C13.surface50 : success ? C13.green : C13.cyan,
20850
+ color: loading ? C13.textSecondary : success ? C13.white : C13.black,
20649
20851
  fontWeight: 800,
20650
20852
  fontSize: 11,
20651
20853
  textTransform: "uppercase",
@@ -20672,9 +20874,9 @@ function MetaImageField({
20672
20874
  borderRadius: 6,
20673
20875
  fontSize: 11,
20674
20876
  fontWeight: 600,
20675
- color: C12.red,
20877
+ color: C13.red,
20676
20878
  backgroundColor: "rgba(239,68,68,0.08)",
20677
- border: `1px solid ${C12.red}`
20879
+ border: `1px solid ${C13.red}`
20678
20880
  },
20679
20881
  children: error
20680
20882
  }
@@ -20683,7 +20885,7 @@ function MetaImageField({
20683
20885
  }
20684
20886
  );
20685
20887
  }
20686
- var C13 = {
20888
+ var C14 = {
20687
20889
  black: "#000",
20688
20890
  white: "#fff",
20689
20891
  green: "#22c55e",
@@ -20697,15 +20899,15 @@ var C13 = {
20697
20899
  function getCompletenessColor(count) {
20698
20900
  switch (count) {
20699
20901
  case 0:
20700
- return C13.red;
20902
+ return C14.red;
20701
20903
  case 1:
20702
- return C13.orange;
20904
+ return C14.orange;
20703
20905
  case 2:
20704
- return C13.yellow;
20906
+ return C14.yellow;
20705
20907
  case 3:
20706
- return C13.green;
20908
+ return C14.green;
20707
20909
  default:
20708
- return C13.textSecondary;
20910
+ return C14.textSecondary;
20709
20911
  }
20710
20912
  }
20711
20913
  function getCompletenessLabel(count, ov) {
@@ -20763,8 +20965,8 @@ function OverviewField({
20763
20965
  fontFamily: "var(--font-body, Inter, system-ui, sans-serif)",
20764
20966
  padding: "12px 14px",
20765
20967
  borderRadius: 10,
20766
- border: `2px solid ${C13.border}`,
20767
- backgroundColor: C13.surfaceBg,
20968
+ border: `2px solid ${C14.border}`,
20969
+ backgroundColor: C14.surfaceBg,
20768
20970
  boxShadow: "3px 3px 0 0 var(--theme-border-color, rgba(0,0,0,1))",
20769
20971
  marginBottom: 12
20770
20972
  },
@@ -20787,7 +20989,7 @@ function OverviewField({
20787
20989
  fontWeight: 800,
20788
20990
  textTransform: "uppercase",
20789
20991
  letterSpacing: "0.04em",
20790
- color: C13.textPrimary
20992
+ color: C14.textPrimary
20791
20993
  },
20792
20994
  children: t.overview.metaCompleteness
20793
20995
  }
@@ -20802,8 +21004,8 @@ function OverviewField({
20802
21004
  fontSize: 11,
20803
21005
  fontWeight: 800,
20804
21006
  backgroundColor: completenessColor,
20805
- color: completenessColor === C13.yellow ? C13.black : C13.white,
20806
- border: `2px solid ${C13.border}`,
21007
+ color: completenessColor === C14.yellow ? C14.black : C14.white,
21008
+ border: `2px solid ${C14.border}`,
20807
21009
  textTransform: "uppercase",
20808
21010
  letterSpacing: "0.03em"
20809
21011
  },
@@ -20901,7 +21103,7 @@ function OverviewField({
20901
21103
  style: {
20902
21104
  fontSize: 12,
20903
21105
  fontWeight: 600,
20904
- color: item.filled ? C13.textPrimary : C13.textSecondary
21106
+ color: item.filled ? C14.textPrimary : C14.textSecondary
20905
21107
  },
20906
21108
  children: item.label
20907
21109
  }
@@ -20913,7 +21115,7 @@ function OverviewField({
20913
21115
  marginLeft: "auto",
20914
21116
  fontSize: 10,
20915
21117
  fontWeight: 700,
20916
- color: item.filled ? C13.green : C13.red,
21118
+ color: item.filled ? C14.green : C14.red,
20917
21119
  textTransform: "uppercase",
20918
21120
  letterSpacing: "0.03em"
20919
21121
  },
@@ -20930,7 +21132,7 @@ function OverviewField({
20930
21132
  }
20931
21133
  );
20932
21134
  }
20933
- var C14 = {
21135
+ var C15 = {
20934
21136
  cyan: "#00E5FF",
20935
21137
  black: "#000",
20936
21138
  white: "#fff",
@@ -20949,10 +21151,10 @@ var G = {
20949
21151
  descGrey: "#4d5156",
20950
21152
  faviconBg: "#e8eaed"};
20951
21153
  function charCountColor2(len, min, max) {
20952
- if (len >= min && len <= max) return C14.green;
20953
- if (len > 0 && len < min) return C14.orange;
20954
- if (len > max) return C14.red;
20955
- return C14.textSecondary;
21154
+ if (len >= min && len <= max) return C15.green;
21155
+ if (len > 0 && len < min) return C15.orange;
21156
+ if (len > max) return C15.red;
21157
+ return C15.textSecondary;
20956
21158
  }
20957
21159
  function truncateText(text, maxChars) {
20958
21160
  if (text.length <= maxChars) return text;
@@ -21007,8 +21209,8 @@ function SerpPreview({
21007
21209
  padding: "10px 12px",
21008
21210
  cursor: "pointer",
21009
21211
  borderRadius: 8,
21010
- border: `2px solid ${C14.border}`,
21011
- backgroundColor: C14.surface50,
21212
+ border: `2px solid ${C15.border}`,
21213
+ backgroundColor: C15.surface50,
21012
21214
  userSelect: "none"
21013
21215
  },
21014
21216
  children: [
@@ -21023,7 +21225,7 @@ function SerpPreview({
21023
21225
  fontWeight: 800,
21024
21226
  textTransform: "uppercase",
21025
21227
  letterSpacing: "0.04em",
21026
- color: C14.textPrimary
21228
+ color: C15.textPrimary
21027
21229
  },
21028
21230
  children: [
21029
21231
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -21055,7 +21257,7 @@ function SerpPreview({
21055
21257
  transition: "transform 0.2s",
21056
21258
  display: "inline-block",
21057
21259
  transform: open ? "rotate(90deg)" : "none",
21058
- color: C14.textSecondary
21260
+ color: C15.textSecondary
21059
21261
  },
21060
21262
  children: "\u25B6"
21061
21263
  }
@@ -21088,10 +21290,10 @@ function SerpPreview({
21088
21290
  "div",
21089
21291
  {
21090
21292
  style: {
21091
- backgroundColor: C14.white,
21092
- border: `2px solid ${C14.border}`,
21293
+ backgroundColor: C15.white,
21294
+ border: `2px solid ${C15.border}`,
21093
21295
  borderRadius: 12,
21094
- boxShadow: `3px 3px 0 0 ${C14.border}`,
21296
+ boxShadow: `3px 3px 0 0 ${C15.border}`,
21095
21297
  padding: isDesktop ? 20 : 14,
21096
21298
  maxWidth: isDesktop ? 650 : 380,
21097
21299
  overflow: "hidden"
@@ -21154,7 +21356,7 @@ function SerpPreview({
21154
21356
  style: {
21155
21357
  fontSize: 14,
21156
21358
  fontWeight: 400,
21157
- color: C14.black,
21359
+ color: C15.black,
21158
21360
  lineHeight: 1.3,
21159
21361
  whiteSpace: "nowrap",
21160
21362
  overflow: "hidden",
@@ -21218,7 +21420,7 @@ function SerpPreview({
21218
21420
  "span",
21219
21421
  {
21220
21422
  style: {
21221
- color: C14.textSecondary,
21423
+ color: C15.textSecondary,
21222
21424
  fontStyle: "italic",
21223
21425
  fontSize: titleFontSize - 2
21224
21426
  },
@@ -21247,7 +21449,7 @@ function SerpPreview({
21247
21449
  "span",
21248
21450
  {
21249
21451
  style: {
21250
- color: C14.textSecondary,
21452
+ color: C15.textSecondary,
21251
21453
  fontStyle: "italic",
21252
21454
  fontSize: descFontSize - 1
21253
21455
  },
@@ -21280,7 +21482,7 @@ function SerpPreview({
21280
21482
  fontSize: 11
21281
21483
  },
21282
21484
  children: [
21283
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: C14.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewTitle }),
21485
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: C15.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewTitle }),
21284
21486
  /* @__PURE__ */ jsxRuntime.jsxs(
21285
21487
  "span",
21286
21488
  {
@@ -21309,7 +21511,7 @@ function SerpPreview({
21309
21511
  fontSize: 11
21310
21512
  },
21311
21513
  children: [
21312
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: C14.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewDescription }),
21514
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: C15.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewDescription }),
21313
21515
  /* @__PURE__ */ jsxRuntime.jsxs(
21314
21516
  "span",
21315
21517
  {
@@ -21338,14 +21540,14 @@ function SerpPreview({
21338
21540
  fontSize: 11
21339
21541
  },
21340
21542
  children: [
21341
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: C14.textSecondary, fontWeight: 600 }, children: t.serpPreview.url }),
21543
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: C15.textSecondary, fontWeight: 600 }, children: t.serpPreview.url }),
21342
21544
  /* @__PURE__ */ jsxRuntime.jsxs(
21343
21545
  "span",
21344
21546
  {
21345
21547
  style: {
21346
21548
  fontWeight: 700,
21347
21549
  fontVariantNumeric: "tabular-nums",
21348
- color: fullUrl.length <= 75 ? C14.green : C14.red
21550
+ color: fullUrl.length <= 75 ? C15.green : C15.red
21349
21551
  },
21350
21552
  children: [
21351
21553
  fullUrl.length,
@@ -21380,13 +21582,13 @@ function DeviceButton({
21380
21582
  gap: 5,
21381
21583
  padding: "4px 12px",
21382
21584
  borderRadius: 6,
21383
- border: `2px solid ${C14.border}`,
21585
+ border: `2px solid ${C15.border}`,
21384
21586
  fontSize: 11,
21385
21587
  fontWeight: 700,
21386
21588
  cursor: "pointer",
21387
- backgroundColor: active ? C14.cyan : C14.surfaceBg,
21388
- color: active ? C14.black : C14.textPrimary,
21389
- boxShadow: active ? `2px 2px 0 0 ${C14.border}` : "none",
21589
+ backgroundColor: active ? C15.cyan : C15.surfaceBg,
21590
+ color: active ? C15.black : C15.textPrimary,
21591
+ boxShadow: active ? `2px 2px 0 0 ${C15.border}` : "none",
21390
21592
  transition: "background-color 0.15s"
21391
21593
  },
21392
21594
  children: [