@consilioweb/payload-seo-analyzer 1.10.0 → 1.11.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
@@ -1059,6 +1059,9 @@ var fr = {
1059
1059
  pagesAnalyzed: "pages analys\xE9es",
1060
1060
  markCornerstone: "Marquer pilier",
1061
1061
  unmarkCornerstone: "D\xE9marquer pilier",
1062
+ bulkOptimizeMeta: "Optimiser m\xE9ta (IA)",
1063
+ bulkOptimizing: "Optimisation\u2026",
1064
+ bulkConfirm: "Confirmer ?",
1062
1065
  searchPlaceholder: "Rechercher (titre, slug, keyword)...",
1063
1066
  allCollections: "Toutes les collections",
1064
1067
  allScores: "Tous les scores",
@@ -1651,6 +1654,9 @@ var en = {
1651
1654
  pagesAnalyzed: "pages analyzed",
1652
1655
  markCornerstone: "Mark as cornerstone",
1653
1656
  unmarkCornerstone: "Unmark cornerstone",
1657
+ bulkOptimizeMeta: "Optimize meta (AI)",
1658
+ bulkOptimizing: "Optimizing\u2026",
1659
+ bulkConfirm: "Confirm?",
1654
1660
  searchPlaceholder: "Search (title, slug, keyword)...",
1655
1661
  allCollections: "All collections",
1656
1662
  allScores: "All scores",
@@ -9195,8 +9201,11 @@ function BulkActionBar({
9195
9201
  onExportCsv,
9196
9202
  onMarkCornerstone,
9197
9203
  onUnmarkCornerstone,
9204
+ onOptimizeMeta,
9205
+ optimizing,
9198
9206
  t
9199
9207
  }) {
9208
+ const [confirmOptimize, setConfirmOptimize] = useState(false);
9200
9209
  if (count === 0) return null;
9201
9210
  return /* @__PURE__ */ jsxs(
9202
9211
  "div",
@@ -9242,6 +9251,24 @@ function BulkActionBar({
9242
9251
  children: t.common.exportCsv
9243
9252
  }
9244
9253
  ),
9254
+ /* @__PURE__ */ jsx(
9255
+ "button",
9256
+ {
9257
+ onClick: () => {
9258
+ if (optimizing) return;
9259
+ if (confirmOptimize) {
9260
+ setConfirmOptimize(false);
9261
+ onOptimizeMeta();
9262
+ } else {
9263
+ setConfirmOptimize(true);
9264
+ setTimeout(() => setConfirmOptimize(false), 4e3);
9265
+ }
9266
+ },
9267
+ disabled: optimizing,
9268
+ style: { ...btnBase, backgroundColor: "#7c3aed", color: "#fff", opacity: optimizing ? 0.6 : 1 },
9269
+ children: optimizing ? t.seoView.bulkOptimizing : confirmOptimize ? t.seoView.bulkConfirm : `\u2728 ${t.seoView.bulkOptimizeMeta}`
9270
+ }
9271
+ ),
9245
9272
  /* @__PURE__ */ jsx(
9246
9273
  "button",
9247
9274
  {
@@ -9282,6 +9309,7 @@ function SeoView() {
9282
9309
  const [expandedId, setExpandedId] = useState(null);
9283
9310
  const [saving, setSaving] = useState(false);
9284
9311
  const [saveError, setSaveError] = useState(null);
9312
+ const [bulkOptimizing, setBulkOptimizing] = useState(false);
9285
9313
  const PAGE_SIZE = 50;
9286
9314
  const fetchAudit = useCallback(async (forceRefresh = false) => {
9287
9315
  setLoading(true);
@@ -9502,6 +9530,45 @@ function SeoView() {
9502
9530
  },
9503
9531
  [selectedIds, fetchAudit]
9504
9532
  );
9533
+ const handleBulkOptimizeMeta = useCallback(async () => {
9534
+ const keys = Array.from(selectedIds);
9535
+ if (keys.length === 0) return;
9536
+ setBulkOptimizing(true);
9537
+ for (const key of keys) {
9538
+ const [collection, id] = key.split("::");
9539
+ if (!collection || !id || collection.startsWith("global:")) continue;
9540
+ try {
9541
+ const res = await fetch("/api/seo-plugin/ai-optimize", {
9542
+ method: "POST",
9543
+ headers: { "Content-Type": "application/json" },
9544
+ credentials: "include",
9545
+ body: JSON.stringify({ collection, id })
9546
+ });
9547
+ if (!res.ok) continue;
9548
+ const data = await res.json();
9549
+ const sug = data.suggestions || {};
9550
+ const patch = {};
9551
+ if (sug.metaTitle || sug.metaDescription) {
9552
+ patch.meta = { title: sug.metaTitle, description: sug.metaDescription };
9553
+ }
9554
+ if (sug.focusKeyword && sug.focusKeyword !== data.current?.focusKeyword) {
9555
+ patch.focusKeyword = sug.focusKeyword;
9556
+ }
9557
+ if (Object.keys(patch).length > 0) {
9558
+ await fetch(`/api/${collection}/${id}`, {
9559
+ method: "PATCH",
9560
+ headers: { "Content-Type": "application/json" },
9561
+ credentials: "include",
9562
+ body: JSON.stringify(patch)
9563
+ });
9564
+ }
9565
+ } catch {
9566
+ }
9567
+ }
9568
+ setBulkOptimizing(false);
9569
+ setSelectedIds(/* @__PURE__ */ new Set());
9570
+ fetchAudit();
9571
+ }, [selectedIds, fetchAudit]);
9505
9572
  const handleInlineSave = useCallback(
9506
9573
  async (item, metaTitle, metaDescription) => {
9507
9574
  setSaving(true);
@@ -10250,6 +10317,8 @@ function SeoView() {
10250
10317
  onExportCsv: handleBulkExportCsv,
10251
10318
  onMarkCornerstone: () => handleBulkCornerstone(true),
10252
10319
  onUnmarkCornerstone: () => handleBulkCornerstone(false),
10320
+ onOptimizeMeta: handleBulkOptimizeMeta,
10321
+ optimizing: bulkOptimizing,
10253
10322
  t
10254
10323
  }
10255
10324
  )
@@ -18469,6 +18538,183 @@ function PerformanceView() {
18469
18538
  }
18470
18539
  );
18471
18540
  }
18541
+ var C9 = {
18542
+ text: "var(--theme-text, #1a1a1a)",
18543
+ sub: "var(--theme-elevation-600, #6b7280)",
18544
+ card: "var(--theme-elevation-50, #f9fafb)",
18545
+ bg: "var(--theme-elevation-0, #fff)",
18546
+ border: "var(--theme-elevation-200, #e5e7eb)",
18547
+ violet: "#7c3aed",
18548
+ red: "#ef4444",
18549
+ blue: "#3b82f6"
18550
+ };
18551
+ var S6 = {
18552
+ fr: {
18553
+ title: "Brief de contenu IA",
18554
+ subtitle: "G\xE9n\xE8re un plan r\xE9dactionnel optimis\xE9 pour un mot-cl\xE9 (plan, entit\xE9s, questions, longueur cible).",
18555
+ placeholder: "Mot-cl\xE9 cible (ex : plombier paris)",
18556
+ generate: "G\xE9n\xE9rer le brief",
18557
+ generating: "G\xE9n\xE9ration\u2026",
18558
+ outline: "Plan sugg\xE9r\xE9",
18559
+ entities: "Entit\xE9s / termes \xE0 couvrir",
18560
+ questions: "Questions \xE0 traiter",
18561
+ links: "Id\xE9es de liens internes",
18562
+ words: "Longueur recommand\xE9e",
18563
+ wordsUnit: "mots",
18564
+ notes: "Conseils",
18565
+ noKey: "Cl\xE9 API Claude requise (ANTHROPIC_API_KEY).",
18566
+ disabled: "Fonction IA d\xE9sactiv\xE9e (features.aiFeatures)."
18567
+ },
18568
+ en: {
18569
+ title: "AI content brief",
18570
+ subtitle: "Generate an optimized writing brief for a keyword (outline, entities, questions, target length).",
18571
+ placeholder: "Target keyword (e.g. paris plumber)",
18572
+ generate: "Generate brief",
18573
+ generating: "Generating\u2026",
18574
+ outline: "Suggested outline",
18575
+ entities: "Entities / terms to cover",
18576
+ questions: "Questions to answer",
18577
+ links: "Internal link ideas",
18578
+ words: "Recommended length",
18579
+ wordsUnit: "words",
18580
+ notes: "Tips",
18581
+ noKey: "Claude API key required (ANTHROPIC_API_KEY).",
18582
+ disabled: "AI feature disabled (features.aiFeatures)."
18583
+ }
18584
+ };
18585
+ function ContentBriefPanel({ locale }) {
18586
+ const s = S6[locale] ?? S6.fr;
18587
+ const [keyword, setKeyword] = useState("");
18588
+ const [brief, setBrief] = useState(null);
18589
+ const [busy, setBusy] = useState(false);
18590
+ const [error, setError] = useState(null);
18591
+ const generate = async () => {
18592
+ if (!keyword.trim()) return;
18593
+ setBusy(true);
18594
+ setError(null);
18595
+ setBrief(null);
18596
+ try {
18597
+ const res = await fetch("/api/seo-plugin/ai-content-brief", {
18598
+ method: "POST",
18599
+ credentials: "include",
18600
+ headers: { "Content-Type": "application/json" },
18601
+ body: JSON.stringify({ keyword: keyword.trim() })
18602
+ });
18603
+ if (res.status === 404) {
18604
+ setError(s.disabled);
18605
+ return;
18606
+ }
18607
+ const json = await res.json();
18608
+ if (!res.ok) {
18609
+ setError(json.code === "no_api_key" ? s.noKey : json.error || `Error ${res.status}`);
18610
+ return;
18611
+ }
18612
+ setBrief(json.brief);
18613
+ } catch (e) {
18614
+ setError(e instanceof Error ? e.message : "Network error");
18615
+ } finally {
18616
+ setBusy(false);
18617
+ }
18618
+ };
18619
+ const card = {
18620
+ padding: 16,
18621
+ borderRadius: 12,
18622
+ border: `1px solid ${C9.border}`,
18623
+ backgroundColor: C9.card,
18624
+ marginBottom: 20
18625
+ };
18626
+ const chip = {
18627
+ display: "inline-block",
18628
+ fontSize: 11,
18629
+ padding: "3px 8px",
18630
+ borderRadius: 999,
18631
+ backgroundColor: "rgba(59,130,246,0.12)",
18632
+ color: C9.blue,
18633
+ border: `1px solid ${C9.border}`,
18634
+ margin: "0 6px 6px 0"
18635
+ };
18636
+ const h4 = { fontSize: 12, fontWeight: 800, color: C9.text, margin: "14px 0 6px", textTransform: "uppercase" };
18637
+ return /* @__PURE__ */ jsxs("div", { style: card, children: [
18638
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C9.text }, children: s.title }),
18639
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 12, color: C9.sub, marginTop: 2, marginBottom: 12 }, children: s.subtitle }),
18640
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: 8, flexWrap: "wrap" }, children: [
18641
+ /* @__PURE__ */ jsx(
18642
+ "input",
18643
+ {
18644
+ value: keyword,
18645
+ onChange: (e) => setKeyword(e.target.value),
18646
+ onKeyDown: (e) => {
18647
+ if (e.key === "Enter") void generate();
18648
+ },
18649
+ placeholder: s.placeholder,
18650
+ style: {
18651
+ flex: 1,
18652
+ minWidth: 220,
18653
+ padding: "8px 12px",
18654
+ fontSize: 13,
18655
+ borderRadius: 8,
18656
+ border: `1px solid ${C9.border}`,
18657
+ backgroundColor: C9.bg,
18658
+ color: C9.text
18659
+ }
18660
+ }
18661
+ ),
18662
+ /* @__PURE__ */ jsx(
18663
+ "button",
18664
+ {
18665
+ type: "button",
18666
+ onClick: () => void generate(),
18667
+ disabled: busy || !keyword.trim(),
18668
+ style: {
18669
+ padding: "8px 14px",
18670
+ borderRadius: 8,
18671
+ border: `1px solid ${C9.violet}`,
18672
+ backgroundColor: C9.violet,
18673
+ color: "#fff",
18674
+ fontSize: 12,
18675
+ fontWeight: 700,
18676
+ cursor: busy || !keyword.trim() ? "not-allowed" : "pointer",
18677
+ opacity: busy || !keyword.trim() ? 0.6 : 1
18678
+ },
18679
+ children: busy ? s.generating : `\u2728 ${s.generate}`
18680
+ }
18681
+ )
18682
+ ] }),
18683
+ error && /* @__PURE__ */ jsx("div", { style: { color: C9.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
18684
+ brief && /* @__PURE__ */ jsxs("div", { style: { marginTop: 8 }, children: [
18685
+ brief.recommendedWordCount > 0 && /* @__PURE__ */ jsxs("div", { style: { fontSize: 12, color: C9.sub, marginTop: 10 }, children: [
18686
+ s.words,
18687
+ ": ",
18688
+ /* @__PURE__ */ jsxs("b", { style: { color: C9.text }, children: [
18689
+ "~",
18690
+ brief.recommendedWordCount,
18691
+ " ",
18692
+ s.wordsUnit
18693
+ ] })
18694
+ ] }),
18695
+ brief.outline.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
18696
+ /* @__PURE__ */ jsx("div", { style: h4, children: s.outline }),
18697
+ /* @__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)) })
18698
+ ] }),
18699
+ brief.entities.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
18700
+ /* @__PURE__ */ jsx("div", { style: h4, children: s.entities }),
18701
+ /* @__PURE__ */ jsx("div", { children: brief.entities.map((e, i) => /* @__PURE__ */ jsx("span", { style: chip, children: e }, i)) })
18702
+ ] }),
18703
+ brief.questions.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
18704
+ /* @__PURE__ */ jsx("div", { style: h4, children: s.questions }),
18705
+ /* @__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)) })
18706
+ ] }),
18707
+ brief.internalLinkIdeas.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
18708
+ /* @__PURE__ */ jsx("div", { style: h4, children: s.links }),
18709
+ /* @__PURE__ */ jsx("div", { children: brief.internalLinkIdeas.map((l, i) => /* @__PURE__ */ jsx("span", { style: chip, children: l }, i)) })
18710
+ ] }),
18711
+ brief.notes.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
18712
+ /* @__PURE__ */ jsx("div", { style: h4, children: s.notes }),
18713
+ /* @__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)) })
18714
+ ] })
18715
+ ] })
18716
+ ] });
18717
+ }
18472
18718
  var V9 = {
18473
18719
  text: "var(--theme-text, #1a1a1a)",
18474
18720
  textSecondary: "var(--theme-elevation-600, #6b7280)",
@@ -18831,6 +19077,7 @@ function KeywordResearchView() {
18831
19077
  ]
18832
19078
  }
18833
19079
  ),
19080
+ /* @__PURE__ */ jsx(ContentBriefPanel, { locale }),
18834
19081
  /* @__PURE__ */ jsx(
18835
19082
  "div",
18836
19083
  {
@@ -19605,7 +19852,7 @@ var controlBtnStyle = {
19605
19852
  cursor: "pointer",
19606
19853
  lineHeight: 1.4
19607
19854
  };
19608
- var C9 = {
19855
+ var C10 = {
19609
19856
  cyan: "#00E5FF",
19610
19857
  black: "#000",
19611
19858
  green: "#22c55e",
@@ -19620,10 +19867,10 @@ var C9 = {
19620
19867
  var TITLE_MIN = 30;
19621
19868
  var TITLE_MAX = 60;
19622
19869
  function getCharColor(len) {
19623
- if (len === 0) return C9.textSecondary;
19624
- if (len >= TITLE_MIN && len <= TITLE_MAX) return C9.green;
19625
- if (len > 0 && len < TITLE_MIN) return C9.orange;
19626
- return C9.red;
19870
+ if (len === 0) return C10.textSecondary;
19871
+ if (len >= TITLE_MIN && len <= TITLE_MAX) return C10.green;
19872
+ if (len > 0 && len < TITLE_MIN) return C10.orange;
19873
+ return C10.red;
19627
19874
  }
19628
19875
  function getProgressPercent(len) {
19629
19876
  if (len === 0) return 0;
@@ -19631,9 +19878,9 @@ function getProgressPercent(len) {
19631
19878
  }
19632
19879
  function getProgressColor(len) {
19633
19880
  if (len === 0) return "var(--theme-elevation-200, #e5e7eb)";
19634
- if (len >= TITLE_MIN && len <= TITLE_MAX) return C9.green;
19635
- if (len < TITLE_MIN) return C9.orange;
19636
- return C9.red;
19881
+ if (len >= TITLE_MIN && len <= TITLE_MAX) return C10.green;
19882
+ if (len < TITLE_MIN) return C10.orange;
19883
+ return C10.red;
19637
19884
  }
19638
19885
  function MetaTitleField({
19639
19886
  path,
@@ -19704,7 +19951,7 @@ function MetaTitleField({
19704
19951
  style: {
19705
19952
  fontSize: 13,
19706
19953
  fontWeight: 700,
19707
- color: C9.textPrimary
19954
+ color: C10.textPrimary
19708
19955
  },
19709
19956
  children: t.metaTitle.label
19710
19957
  }
@@ -19744,9 +19991,9 @@ function MetaTitleField({
19744
19991
  fontSize: 14,
19745
19992
  fontFamily: "inherit",
19746
19993
  borderRadius: 8,
19747
- border: `2px solid ${C9.border}`,
19748
- backgroundColor: C9.surfaceBg,
19749
- color: C9.textPrimary,
19994
+ border: `2px solid ${C10.border}`,
19995
+ backgroundColor: C10.surfaceBg,
19996
+ color: C10.textPrimary,
19750
19997
  outline: "none",
19751
19998
  boxShadow: "2px 2px 0 0 var(--theme-border-color, rgba(0,0,0,1))"
19752
19999
  }
@@ -19764,9 +20011,9 @@ function MetaTitleField({
19764
20011
  gap: 5,
19765
20012
  padding: "8px 14px",
19766
20013
  borderRadius: 8,
19767
- border: `2px solid ${C9.border}`,
19768
- backgroundColor: loading ? C9.surface50 : C9.cyan,
19769
- color: loading ? C9.textSecondary : C9.black,
20014
+ border: `2px solid ${C10.border}`,
20015
+ backgroundColor: loading ? C10.surface50 : C10.cyan,
20016
+ color: loading ? C10.textSecondary : C10.black,
19770
20017
  fontWeight: 800,
19771
20018
  fontSize: 11,
19772
20019
  textTransform: "uppercase",
@@ -19813,7 +20060,7 @@ function MetaTitleField({
19813
20060
  justifyContent: "space-between",
19814
20061
  marginTop: 4,
19815
20062
  fontSize: 10,
19816
- color: C9.textSecondary
20063
+ color: C10.textSecondary
19817
20064
  },
19818
20065
  children: [
19819
20066
  /* @__PURE__ */ jsxs("span", { children: [
@@ -19847,9 +20094,9 @@ function MetaTitleField({
19847
20094
  borderRadius: 6,
19848
20095
  fontSize: 11,
19849
20096
  fontWeight: 600,
19850
- color: C9.red,
20097
+ color: C10.red,
19851
20098
  backgroundColor: "rgba(239,68,68,0.08)",
19852
- border: `1px solid ${C9.red}`
20099
+ border: `1px solid ${C10.red}`
19853
20100
  },
19854
20101
  children: error
19855
20102
  }
@@ -19858,7 +20105,7 @@ function MetaTitleField({
19858
20105
  }
19859
20106
  );
19860
20107
  }
19861
- var C10 = {
20108
+ var C11 = {
19862
20109
  cyan: "#00E5FF",
19863
20110
  black: "#000",
19864
20111
  green: "#22c55e",
@@ -19873,10 +20120,10 @@ var C10 = {
19873
20120
  var DESC_MIN = 120;
19874
20121
  var DESC_MAX = 160;
19875
20122
  function getCharColor2(len) {
19876
- if (len === 0) return C10.textSecondary;
19877
- if (len >= DESC_MIN && len <= DESC_MAX) return C10.green;
19878
- if (len > 0 && len < DESC_MIN) return C10.orange;
19879
- return C10.red;
20123
+ if (len === 0) return C11.textSecondary;
20124
+ if (len >= DESC_MIN && len <= DESC_MAX) return C11.green;
20125
+ if (len > 0 && len < DESC_MIN) return C11.orange;
20126
+ return C11.red;
19880
20127
  }
19881
20128
  function getProgressPercent2(len) {
19882
20129
  if (len === 0) return 0;
@@ -19884,9 +20131,9 @@ function getProgressPercent2(len) {
19884
20131
  }
19885
20132
  function getProgressColor2(len) {
19886
20133
  if (len === 0) return "var(--theme-elevation-200, #e5e7eb)";
19887
- if (len >= DESC_MIN && len <= DESC_MAX) return C10.green;
19888
- if (len < DESC_MIN) return C10.orange;
19889
- return C10.red;
20134
+ if (len >= DESC_MIN && len <= DESC_MAX) return C11.green;
20135
+ if (len < DESC_MIN) return C11.orange;
20136
+ return C11.red;
19890
20137
  }
19891
20138
  function MetaDescriptionField({
19892
20139
  path,
@@ -19957,7 +20204,7 @@ function MetaDescriptionField({
19957
20204
  style: {
19958
20205
  fontSize: 13,
19959
20206
  fontWeight: 700,
19960
- color: C10.textPrimary
20207
+ color: C11.textPrimary
19961
20208
  },
19962
20209
  children: t.metaDescription.label
19963
20210
  }
@@ -19997,9 +20244,9 @@ function MetaDescriptionField({
19997
20244
  fontSize: 14,
19998
20245
  fontFamily: "inherit",
19999
20246
  borderRadius: 8,
20000
- border: `2px solid ${C10.border}`,
20001
- backgroundColor: C10.surfaceBg,
20002
- color: C10.textPrimary,
20247
+ border: `2px solid ${C11.border}`,
20248
+ backgroundColor: C11.surfaceBg,
20249
+ color: C11.textPrimary,
20003
20250
  outline: "none",
20004
20251
  resize: "vertical",
20005
20252
  lineHeight: 1.5,
@@ -20019,9 +20266,9 @@ function MetaDescriptionField({
20019
20266
  gap: 5,
20020
20267
  padding: "8px 14px",
20021
20268
  borderRadius: 8,
20022
- border: `2px solid ${C10.border}`,
20023
- backgroundColor: loading ? C10.surface50 : C10.cyan,
20024
- color: loading ? C10.textSecondary : C10.black,
20269
+ border: `2px solid ${C11.border}`,
20270
+ backgroundColor: loading ? C11.surface50 : C11.cyan,
20271
+ color: loading ? C11.textSecondary : C11.black,
20025
20272
  fontWeight: 800,
20026
20273
  fontSize: 11,
20027
20274
  textTransform: "uppercase",
@@ -20069,7 +20316,7 @@ function MetaDescriptionField({
20069
20316
  justifyContent: "space-between",
20070
20317
  marginTop: 4,
20071
20318
  fontSize: 10,
20072
- color: C10.textSecondary
20319
+ color: C11.textSecondary
20073
20320
  },
20074
20321
  children: [
20075
20322
  /* @__PURE__ */ jsxs("span", { children: [
@@ -20103,9 +20350,9 @@ function MetaDescriptionField({
20103
20350
  borderRadius: 6,
20104
20351
  fontSize: 11,
20105
20352
  fontWeight: 600,
20106
- color: C10.red,
20353
+ color: C11.red,
20107
20354
  backgroundColor: "rgba(239,68,68,0.08)",
20108
- border: `1px solid ${C10.red}`
20355
+ border: `1px solid ${C11.red}`
20109
20356
  },
20110
20357
  children: error
20111
20358
  }
@@ -20114,7 +20361,7 @@ function MetaDescriptionField({
20114
20361
  }
20115
20362
  );
20116
20363
  }
20117
- var C11 = {
20364
+ var C12 = {
20118
20365
  cyan: "#00E5FF",
20119
20366
  black: "#000",
20120
20367
  white: "#fff",
@@ -20191,8 +20438,8 @@ function MetaImageField({
20191
20438
  gap: 10,
20192
20439
  padding: "10px 14px",
20193
20440
  borderRadius: 8,
20194
- border: `2px solid ${C11.border}`,
20195
- backgroundColor: C11.surfaceBg,
20441
+ border: `2px solid ${C12.border}`,
20442
+ backgroundColor: C12.surfaceBg,
20196
20443
  boxShadow: "2px 2px 0 0 var(--theme-border-color, rgba(0,0,0,1))"
20197
20444
  },
20198
20445
  children: [
@@ -20211,7 +20458,7 @@ function MetaImageField({
20211
20458
  fontWeight: 900,
20212
20459
  backgroundColor: hasImage ? "rgba(34,197,94,0.15)" : "rgba(255,138,0,0.15)",
20213
20460
  color: hasImage ? "#16a34a" : "#d97706",
20214
- border: `1px solid ${hasImage ? C11.green : C11.orange}`
20461
+ border: `1px solid ${hasImage ? C12.green : C12.orange}`
20215
20462
  },
20216
20463
  children: hasImage ? "\u2713" : "!"
20217
20464
  }
@@ -20223,7 +20470,7 @@ function MetaImageField({
20223
20470
  style: {
20224
20471
  fontSize: 12,
20225
20472
  fontWeight: 700,
20226
- color: C11.textPrimary
20473
+ color: C12.textPrimary
20227
20474
  },
20228
20475
  children: t.metaImage.label
20229
20476
  }
@@ -20233,7 +20480,7 @@ function MetaImageField({
20233
20480
  {
20234
20481
  style: {
20235
20482
  fontSize: 10,
20236
- color: C11.textSecondary,
20483
+ color: C12.textSecondary,
20237
20484
  lineHeight: 1.4
20238
20485
  },
20239
20486
  children: hasImage ? t.metaImage.imageSet : t.metaImage.noImage
@@ -20253,9 +20500,9 @@ function MetaImageField({
20253
20500
  gap: 5,
20254
20501
  padding: "8px 14px",
20255
20502
  borderRadius: 8,
20256
- border: `2px solid ${C11.border}`,
20257
- backgroundColor: loading ? C11.surface50 : success ? C11.green : C11.cyan,
20258
- color: loading ? C11.textSecondary : success ? C11.white : C11.black,
20503
+ border: `2px solid ${C12.border}`,
20504
+ backgroundColor: loading ? C12.surface50 : success ? C12.green : C12.cyan,
20505
+ color: loading ? C12.textSecondary : success ? C12.white : C12.black,
20259
20506
  fontWeight: 800,
20260
20507
  fontSize: 11,
20261
20508
  textTransform: "uppercase",
@@ -20282,9 +20529,9 @@ function MetaImageField({
20282
20529
  borderRadius: 6,
20283
20530
  fontSize: 11,
20284
20531
  fontWeight: 600,
20285
- color: C11.red,
20532
+ color: C12.red,
20286
20533
  backgroundColor: "rgba(239,68,68,0.08)",
20287
- border: `1px solid ${C11.red}`
20534
+ border: `1px solid ${C12.red}`
20288
20535
  },
20289
20536
  children: error
20290
20537
  }
@@ -20293,7 +20540,7 @@ function MetaImageField({
20293
20540
  }
20294
20541
  );
20295
20542
  }
20296
- var C12 = {
20543
+ var C13 = {
20297
20544
  black: "#000",
20298
20545
  white: "#fff",
20299
20546
  green: "#22c55e",
@@ -20307,15 +20554,15 @@ var C12 = {
20307
20554
  function getCompletenessColor(count) {
20308
20555
  switch (count) {
20309
20556
  case 0:
20310
- return C12.red;
20557
+ return C13.red;
20311
20558
  case 1:
20312
- return C12.orange;
20559
+ return C13.orange;
20313
20560
  case 2:
20314
- return C12.yellow;
20561
+ return C13.yellow;
20315
20562
  case 3:
20316
- return C12.green;
20563
+ return C13.green;
20317
20564
  default:
20318
- return C12.textSecondary;
20565
+ return C13.textSecondary;
20319
20566
  }
20320
20567
  }
20321
20568
  function getCompletenessLabel(count, ov) {
@@ -20373,8 +20620,8 @@ function OverviewField({
20373
20620
  fontFamily: "var(--font-body, Inter, system-ui, sans-serif)",
20374
20621
  padding: "12px 14px",
20375
20622
  borderRadius: 10,
20376
- border: `2px solid ${C12.border}`,
20377
- backgroundColor: C12.surfaceBg,
20623
+ border: `2px solid ${C13.border}`,
20624
+ backgroundColor: C13.surfaceBg,
20378
20625
  boxShadow: "3px 3px 0 0 var(--theme-border-color, rgba(0,0,0,1))",
20379
20626
  marginBottom: 12
20380
20627
  },
@@ -20397,7 +20644,7 @@ function OverviewField({
20397
20644
  fontWeight: 800,
20398
20645
  textTransform: "uppercase",
20399
20646
  letterSpacing: "0.04em",
20400
- color: C12.textPrimary
20647
+ color: C13.textPrimary
20401
20648
  },
20402
20649
  children: t.overview.metaCompleteness
20403
20650
  }
@@ -20412,8 +20659,8 @@ function OverviewField({
20412
20659
  fontSize: 11,
20413
20660
  fontWeight: 800,
20414
20661
  backgroundColor: completenessColor,
20415
- color: completenessColor === C12.yellow ? C12.black : C12.white,
20416
- border: `2px solid ${C12.border}`,
20662
+ color: completenessColor === C13.yellow ? C13.black : C13.white,
20663
+ border: `2px solid ${C13.border}`,
20417
20664
  textTransform: "uppercase",
20418
20665
  letterSpacing: "0.03em"
20419
20666
  },
@@ -20511,7 +20758,7 @@ function OverviewField({
20511
20758
  style: {
20512
20759
  fontSize: 12,
20513
20760
  fontWeight: 600,
20514
- color: item.filled ? C12.textPrimary : C12.textSecondary
20761
+ color: item.filled ? C13.textPrimary : C13.textSecondary
20515
20762
  },
20516
20763
  children: item.label
20517
20764
  }
@@ -20523,7 +20770,7 @@ function OverviewField({
20523
20770
  marginLeft: "auto",
20524
20771
  fontSize: 10,
20525
20772
  fontWeight: 700,
20526
- color: item.filled ? C12.green : C12.red,
20773
+ color: item.filled ? C13.green : C13.red,
20527
20774
  textTransform: "uppercase",
20528
20775
  letterSpacing: "0.03em"
20529
20776
  },
@@ -20540,7 +20787,7 @@ function OverviewField({
20540
20787
  }
20541
20788
  );
20542
20789
  }
20543
- var C13 = {
20790
+ var C14 = {
20544
20791
  cyan: "#00E5FF",
20545
20792
  black: "#000",
20546
20793
  white: "#fff",
@@ -20559,10 +20806,10 @@ var G = {
20559
20806
  descGrey: "#4d5156",
20560
20807
  faviconBg: "#e8eaed"};
20561
20808
  function charCountColor2(len, min, max) {
20562
- if (len >= min && len <= max) return C13.green;
20563
- if (len > 0 && len < min) return C13.orange;
20564
- if (len > max) return C13.red;
20565
- return C13.textSecondary;
20809
+ if (len >= min && len <= max) return C14.green;
20810
+ if (len > 0 && len < min) return C14.orange;
20811
+ if (len > max) return C14.red;
20812
+ return C14.textSecondary;
20566
20813
  }
20567
20814
  function truncateText(text, maxChars) {
20568
20815
  if (text.length <= maxChars) return text;
@@ -20617,8 +20864,8 @@ function SerpPreview({
20617
20864
  padding: "10px 12px",
20618
20865
  cursor: "pointer",
20619
20866
  borderRadius: 8,
20620
- border: `2px solid ${C13.border}`,
20621
- backgroundColor: C13.surface50,
20867
+ border: `2px solid ${C14.border}`,
20868
+ backgroundColor: C14.surface50,
20622
20869
  userSelect: "none"
20623
20870
  },
20624
20871
  children: [
@@ -20633,7 +20880,7 @@ function SerpPreview({
20633
20880
  fontWeight: 800,
20634
20881
  textTransform: "uppercase",
20635
20882
  letterSpacing: "0.04em",
20636
- color: C13.textPrimary
20883
+ color: C14.textPrimary
20637
20884
  },
20638
20885
  children: [
20639
20886
  /* @__PURE__ */ jsxs(
@@ -20665,7 +20912,7 @@ function SerpPreview({
20665
20912
  transition: "transform 0.2s",
20666
20913
  display: "inline-block",
20667
20914
  transform: open ? "rotate(90deg)" : "none",
20668
- color: C13.textSecondary
20915
+ color: C14.textSecondary
20669
20916
  },
20670
20917
  children: "\u25B6"
20671
20918
  }
@@ -20698,10 +20945,10 @@ function SerpPreview({
20698
20945
  "div",
20699
20946
  {
20700
20947
  style: {
20701
- backgroundColor: C13.white,
20702
- border: `2px solid ${C13.border}`,
20948
+ backgroundColor: C14.white,
20949
+ border: `2px solid ${C14.border}`,
20703
20950
  borderRadius: 12,
20704
- boxShadow: `3px 3px 0 0 ${C13.border}`,
20951
+ boxShadow: `3px 3px 0 0 ${C14.border}`,
20705
20952
  padding: isDesktop ? 20 : 14,
20706
20953
  maxWidth: isDesktop ? 650 : 380,
20707
20954
  overflow: "hidden"
@@ -20764,7 +21011,7 @@ function SerpPreview({
20764
21011
  style: {
20765
21012
  fontSize: 14,
20766
21013
  fontWeight: 400,
20767
- color: C13.black,
21014
+ color: C14.black,
20768
21015
  lineHeight: 1.3,
20769
21016
  whiteSpace: "nowrap",
20770
21017
  overflow: "hidden",
@@ -20828,7 +21075,7 @@ function SerpPreview({
20828
21075
  "span",
20829
21076
  {
20830
21077
  style: {
20831
- color: C13.textSecondary,
21078
+ color: C14.textSecondary,
20832
21079
  fontStyle: "italic",
20833
21080
  fontSize: titleFontSize - 2
20834
21081
  },
@@ -20857,7 +21104,7 @@ function SerpPreview({
20857
21104
  "span",
20858
21105
  {
20859
21106
  style: {
20860
- color: C13.textSecondary,
21107
+ color: C14.textSecondary,
20861
21108
  fontStyle: "italic",
20862
21109
  fontSize: descFontSize - 1
20863
21110
  },
@@ -20890,7 +21137,7 @@ function SerpPreview({
20890
21137
  fontSize: 11
20891
21138
  },
20892
21139
  children: [
20893
- /* @__PURE__ */ jsx("span", { style: { color: C13.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewTitle }),
21140
+ /* @__PURE__ */ jsx("span", { style: { color: C14.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewTitle }),
20894
21141
  /* @__PURE__ */ jsxs(
20895
21142
  "span",
20896
21143
  {
@@ -20919,7 +21166,7 @@ function SerpPreview({
20919
21166
  fontSize: 11
20920
21167
  },
20921
21168
  children: [
20922
- /* @__PURE__ */ jsx("span", { style: { color: C13.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewDescription }),
21169
+ /* @__PURE__ */ jsx("span", { style: { color: C14.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewDescription }),
20923
21170
  /* @__PURE__ */ jsxs(
20924
21171
  "span",
20925
21172
  {
@@ -20948,14 +21195,14 @@ function SerpPreview({
20948
21195
  fontSize: 11
20949
21196
  },
20950
21197
  children: [
20951
- /* @__PURE__ */ jsx("span", { style: { color: C13.textSecondary, fontWeight: 600 }, children: t.serpPreview.url }),
21198
+ /* @__PURE__ */ jsx("span", { style: { color: C14.textSecondary, fontWeight: 600 }, children: t.serpPreview.url }),
20952
21199
  /* @__PURE__ */ jsxs(
20953
21200
  "span",
20954
21201
  {
20955
21202
  style: {
20956
21203
  fontWeight: 700,
20957
21204
  fontVariantNumeric: "tabular-nums",
20958
- color: fullUrl.length <= 75 ? C13.green : C13.red
21205
+ color: fullUrl.length <= 75 ? C14.green : C14.red
20959
21206
  },
20960
21207
  children: [
20961
21208
  fullUrl.length,
@@ -20990,13 +21237,13 @@ function DeviceButton({
20990
21237
  gap: 5,
20991
21238
  padding: "4px 12px",
20992
21239
  borderRadius: 6,
20993
- border: `2px solid ${C13.border}`,
21240
+ border: `2px solid ${C14.border}`,
20994
21241
  fontSize: 11,
20995
21242
  fontWeight: 700,
20996
21243
  cursor: "pointer",
20997
- backgroundColor: active ? C13.cyan : C13.surfaceBg,
20998
- color: active ? C13.black : C13.textPrimary,
20999
- boxShadow: active ? `2px 2px 0 0 ${C13.border}` : "none",
21244
+ backgroundColor: active ? C14.cyan : C14.surfaceBg,
21245
+ color: active ? C14.black : C14.textPrimary,
21246
+ boxShadow: active ? `2px 2px 0 0 ${C14.border}` : "none",
21000
21247
  transition: "background-color 0.15s"
21001
21248
  },
21002
21249
  children: [