@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.cjs CHANGED
@@ -1065,6 +1065,9 @@ var fr = {
1065
1065
  pagesAnalyzed: "pages analys\xE9es",
1066
1066
  markCornerstone: "Marquer pilier",
1067
1067
  unmarkCornerstone: "D\xE9marquer pilier",
1068
+ bulkOptimizeMeta: "Optimiser m\xE9ta (IA)",
1069
+ bulkOptimizing: "Optimisation\u2026",
1070
+ bulkConfirm: "Confirmer ?",
1068
1071
  searchPlaceholder: "Rechercher (titre, slug, keyword)...",
1069
1072
  allCollections: "Toutes les collections",
1070
1073
  allScores: "Tous les scores",
@@ -1657,6 +1660,9 @@ var en = {
1657
1660
  pagesAnalyzed: "pages analyzed",
1658
1661
  markCornerstone: "Mark as cornerstone",
1659
1662
  unmarkCornerstone: "Unmark cornerstone",
1663
+ bulkOptimizeMeta: "Optimize meta (AI)",
1664
+ bulkOptimizing: "Optimizing\u2026",
1665
+ bulkConfirm: "Confirm?",
1660
1666
  searchPlaceholder: "Search (title, slug, keyword)...",
1661
1667
  allCollections: "All collections",
1662
1668
  allScores: "All scores",
@@ -9201,8 +9207,11 @@ function BulkActionBar({
9201
9207
  onExportCsv,
9202
9208
  onMarkCornerstone,
9203
9209
  onUnmarkCornerstone,
9210
+ onOptimizeMeta,
9211
+ optimizing,
9204
9212
  t
9205
9213
  }) {
9214
+ const [confirmOptimize, setConfirmOptimize] = React4.useState(false);
9206
9215
  if (count === 0) return null;
9207
9216
  return /* @__PURE__ */ jsxRuntime.jsxs(
9208
9217
  "div",
@@ -9248,6 +9257,24 @@ function BulkActionBar({
9248
9257
  children: t.common.exportCsv
9249
9258
  }
9250
9259
  ),
9260
+ /* @__PURE__ */ jsxRuntime.jsx(
9261
+ "button",
9262
+ {
9263
+ onClick: () => {
9264
+ if (optimizing) return;
9265
+ if (confirmOptimize) {
9266
+ setConfirmOptimize(false);
9267
+ onOptimizeMeta();
9268
+ } else {
9269
+ setConfirmOptimize(true);
9270
+ setTimeout(() => setConfirmOptimize(false), 4e3);
9271
+ }
9272
+ },
9273
+ disabled: optimizing,
9274
+ style: { ...btnBase, backgroundColor: "#7c3aed", color: "#fff", opacity: optimizing ? 0.6 : 1 },
9275
+ children: optimizing ? t.seoView.bulkOptimizing : confirmOptimize ? t.seoView.bulkConfirm : `\u2728 ${t.seoView.bulkOptimizeMeta}`
9276
+ }
9277
+ ),
9251
9278
  /* @__PURE__ */ jsxRuntime.jsx(
9252
9279
  "button",
9253
9280
  {
@@ -9288,6 +9315,7 @@ function SeoView() {
9288
9315
  const [expandedId, setExpandedId] = React4.useState(null);
9289
9316
  const [saving, setSaving] = React4.useState(false);
9290
9317
  const [saveError, setSaveError] = React4.useState(null);
9318
+ const [bulkOptimizing, setBulkOptimizing] = React4.useState(false);
9291
9319
  const PAGE_SIZE = 50;
9292
9320
  const fetchAudit = React4.useCallback(async (forceRefresh = false) => {
9293
9321
  setLoading(true);
@@ -9508,6 +9536,45 @@ function SeoView() {
9508
9536
  },
9509
9537
  [selectedIds, fetchAudit]
9510
9538
  );
9539
+ const handleBulkOptimizeMeta = React4.useCallback(async () => {
9540
+ const keys = Array.from(selectedIds);
9541
+ if (keys.length === 0) return;
9542
+ setBulkOptimizing(true);
9543
+ for (const key of keys) {
9544
+ const [collection, id] = key.split("::");
9545
+ if (!collection || !id || collection.startsWith("global:")) continue;
9546
+ try {
9547
+ const res = await fetch("/api/seo-plugin/ai-optimize", {
9548
+ method: "POST",
9549
+ headers: { "Content-Type": "application/json" },
9550
+ credentials: "include",
9551
+ body: JSON.stringify({ collection, id })
9552
+ });
9553
+ if (!res.ok) continue;
9554
+ const data = await res.json();
9555
+ const sug = data.suggestions || {};
9556
+ const patch = {};
9557
+ if (sug.metaTitle || sug.metaDescription) {
9558
+ patch.meta = { title: sug.metaTitle, description: sug.metaDescription };
9559
+ }
9560
+ if (sug.focusKeyword && sug.focusKeyword !== data.current?.focusKeyword) {
9561
+ patch.focusKeyword = sug.focusKeyword;
9562
+ }
9563
+ if (Object.keys(patch).length > 0) {
9564
+ await fetch(`/api/${collection}/${id}`, {
9565
+ method: "PATCH",
9566
+ headers: { "Content-Type": "application/json" },
9567
+ credentials: "include",
9568
+ body: JSON.stringify(patch)
9569
+ });
9570
+ }
9571
+ } catch {
9572
+ }
9573
+ }
9574
+ setBulkOptimizing(false);
9575
+ setSelectedIds(/* @__PURE__ */ new Set());
9576
+ fetchAudit();
9577
+ }, [selectedIds, fetchAudit]);
9511
9578
  const handleInlineSave = React4.useCallback(
9512
9579
  async (item, metaTitle, metaDescription) => {
9513
9580
  setSaving(true);
@@ -10256,6 +10323,8 @@ function SeoView() {
10256
10323
  onExportCsv: handleBulkExportCsv,
10257
10324
  onMarkCornerstone: () => handleBulkCornerstone(true),
10258
10325
  onUnmarkCornerstone: () => handleBulkCornerstone(false),
10326
+ onOptimizeMeta: handleBulkOptimizeMeta,
10327
+ optimizing: bulkOptimizing,
10259
10328
  t
10260
10329
  }
10261
10330
  )
@@ -18475,6 +18544,183 @@ function PerformanceView() {
18475
18544
  }
18476
18545
  );
18477
18546
  }
18547
+ var C9 = {
18548
+ text: "var(--theme-text, #1a1a1a)",
18549
+ sub: "var(--theme-elevation-600, #6b7280)",
18550
+ card: "var(--theme-elevation-50, #f9fafb)",
18551
+ bg: "var(--theme-elevation-0, #fff)",
18552
+ border: "var(--theme-elevation-200, #e5e7eb)",
18553
+ violet: "#7c3aed",
18554
+ red: "#ef4444",
18555
+ blue: "#3b82f6"
18556
+ };
18557
+ var S6 = {
18558
+ fr: {
18559
+ title: "Brief de contenu IA",
18560
+ subtitle: "G\xE9n\xE8re un plan r\xE9dactionnel optimis\xE9 pour un mot-cl\xE9 (plan, entit\xE9s, questions, longueur cible).",
18561
+ placeholder: "Mot-cl\xE9 cible (ex : plombier paris)",
18562
+ generate: "G\xE9n\xE9rer le brief",
18563
+ generating: "G\xE9n\xE9ration\u2026",
18564
+ outline: "Plan sugg\xE9r\xE9",
18565
+ entities: "Entit\xE9s / termes \xE0 couvrir",
18566
+ questions: "Questions \xE0 traiter",
18567
+ links: "Id\xE9es de liens internes",
18568
+ words: "Longueur recommand\xE9e",
18569
+ wordsUnit: "mots",
18570
+ notes: "Conseils",
18571
+ noKey: "Cl\xE9 API Claude requise (ANTHROPIC_API_KEY).",
18572
+ disabled: "Fonction IA d\xE9sactiv\xE9e (features.aiFeatures)."
18573
+ },
18574
+ en: {
18575
+ title: "AI content brief",
18576
+ subtitle: "Generate an optimized writing brief for a keyword (outline, entities, questions, target length).",
18577
+ placeholder: "Target keyword (e.g. paris plumber)",
18578
+ generate: "Generate brief",
18579
+ generating: "Generating\u2026",
18580
+ outline: "Suggested outline",
18581
+ entities: "Entities / terms to cover",
18582
+ questions: "Questions to answer",
18583
+ links: "Internal link ideas",
18584
+ words: "Recommended length",
18585
+ wordsUnit: "words",
18586
+ notes: "Tips",
18587
+ noKey: "Claude API key required (ANTHROPIC_API_KEY).",
18588
+ disabled: "AI feature disabled (features.aiFeatures)."
18589
+ }
18590
+ };
18591
+ function ContentBriefPanel({ locale }) {
18592
+ const s = S6[locale] ?? S6.fr;
18593
+ const [keyword, setKeyword] = React4.useState("");
18594
+ const [brief, setBrief] = React4.useState(null);
18595
+ const [busy, setBusy] = React4.useState(false);
18596
+ const [error, setError] = React4.useState(null);
18597
+ const generate = async () => {
18598
+ if (!keyword.trim()) return;
18599
+ setBusy(true);
18600
+ setError(null);
18601
+ setBrief(null);
18602
+ try {
18603
+ const res = await fetch("/api/seo-plugin/ai-content-brief", {
18604
+ method: "POST",
18605
+ credentials: "include",
18606
+ headers: { "Content-Type": "application/json" },
18607
+ body: JSON.stringify({ keyword: keyword.trim() })
18608
+ });
18609
+ if (res.status === 404) {
18610
+ setError(s.disabled);
18611
+ return;
18612
+ }
18613
+ const json = await res.json();
18614
+ if (!res.ok) {
18615
+ setError(json.code === "no_api_key" ? s.noKey : json.error || `Error ${res.status}`);
18616
+ return;
18617
+ }
18618
+ setBrief(json.brief);
18619
+ } catch (e) {
18620
+ setError(e instanceof Error ? e.message : "Network error");
18621
+ } finally {
18622
+ setBusy(false);
18623
+ }
18624
+ };
18625
+ const card = {
18626
+ padding: 16,
18627
+ borderRadius: 12,
18628
+ border: `1px solid ${C9.border}`,
18629
+ backgroundColor: C9.card,
18630
+ marginBottom: 20
18631
+ };
18632
+ const chip = {
18633
+ display: "inline-block",
18634
+ fontSize: 11,
18635
+ padding: "3px 8px",
18636
+ borderRadius: 999,
18637
+ backgroundColor: "rgba(59,130,246,0.12)",
18638
+ color: C9.blue,
18639
+ border: `1px solid ${C9.border}`,
18640
+ margin: "0 6px 6px 0"
18641
+ };
18642
+ const h4 = { fontSize: 12, fontWeight: 800, color: C9.text, margin: "14px 0 6px", textTransform: "uppercase" };
18643
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: card, children: [
18644
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C9.text }, children: s.title }),
18645
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: C9.sub, marginTop: 2, marginBottom: 12 }, children: s.subtitle }),
18646
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: 8, flexWrap: "wrap" }, children: [
18647
+ /* @__PURE__ */ jsxRuntime.jsx(
18648
+ "input",
18649
+ {
18650
+ value: keyword,
18651
+ onChange: (e) => setKeyword(e.target.value),
18652
+ onKeyDown: (e) => {
18653
+ if (e.key === "Enter") void generate();
18654
+ },
18655
+ placeholder: s.placeholder,
18656
+ style: {
18657
+ flex: 1,
18658
+ minWidth: 220,
18659
+ padding: "8px 12px",
18660
+ fontSize: 13,
18661
+ borderRadius: 8,
18662
+ border: `1px solid ${C9.border}`,
18663
+ backgroundColor: C9.bg,
18664
+ color: C9.text
18665
+ }
18666
+ }
18667
+ ),
18668
+ /* @__PURE__ */ jsxRuntime.jsx(
18669
+ "button",
18670
+ {
18671
+ type: "button",
18672
+ onClick: () => void generate(),
18673
+ disabled: busy || !keyword.trim(),
18674
+ style: {
18675
+ padding: "8px 14px",
18676
+ borderRadius: 8,
18677
+ border: `1px solid ${C9.violet}`,
18678
+ backgroundColor: C9.violet,
18679
+ color: "#fff",
18680
+ fontSize: 12,
18681
+ fontWeight: 700,
18682
+ cursor: busy || !keyword.trim() ? "not-allowed" : "pointer",
18683
+ opacity: busy || !keyword.trim() ? 0.6 : 1
18684
+ },
18685
+ children: busy ? s.generating : `\u2728 ${s.generate}`
18686
+ }
18687
+ )
18688
+ ] }),
18689
+ error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: C9.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
18690
+ brief && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: 8 }, children: [
18691
+ brief.recommendedWordCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: 12, color: C9.sub, marginTop: 10 }, children: [
18692
+ s.words,
18693
+ ": ",
18694
+ /* @__PURE__ */ jsxRuntime.jsxs("b", { style: { color: C9.text }, children: [
18695
+ "~",
18696
+ brief.recommendedWordCount,
18697
+ " ",
18698
+ s.wordsUnit
18699
+ ] })
18700
+ ] }),
18701
+ brief.outline.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
18702
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: h4, children: s.outline }),
18703
+ /* @__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)) })
18704
+ ] }),
18705
+ brief.entities.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
18706
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: h4, children: s.entities }),
18707
+ /* @__PURE__ */ jsxRuntime.jsx("div", { children: brief.entities.map((e, i) => /* @__PURE__ */ jsxRuntime.jsx("span", { style: chip, children: e }, i)) })
18708
+ ] }),
18709
+ brief.questions.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
18710
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: h4, children: s.questions }),
18711
+ /* @__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)) })
18712
+ ] }),
18713
+ brief.internalLinkIdeas.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
18714
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: h4, children: s.links }),
18715
+ /* @__PURE__ */ jsxRuntime.jsx("div", { children: brief.internalLinkIdeas.map((l, i) => /* @__PURE__ */ jsxRuntime.jsx("span", { style: chip, children: l }, i)) })
18716
+ ] }),
18717
+ brief.notes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
18718
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: h4, children: s.notes }),
18719
+ /* @__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)) })
18720
+ ] })
18721
+ ] })
18722
+ ] });
18723
+ }
18478
18724
  var V9 = {
18479
18725
  text: "var(--theme-text, #1a1a1a)",
18480
18726
  textSecondary: "var(--theme-elevation-600, #6b7280)",
@@ -18837,6 +19083,7 @@ function KeywordResearchView() {
18837
19083
  ]
18838
19084
  }
18839
19085
  ),
19086
+ /* @__PURE__ */ jsxRuntime.jsx(ContentBriefPanel, { locale }),
18840
19087
  /* @__PURE__ */ jsxRuntime.jsx(
18841
19088
  "div",
18842
19089
  {
@@ -19611,7 +19858,7 @@ var controlBtnStyle = {
19611
19858
  cursor: "pointer",
19612
19859
  lineHeight: 1.4
19613
19860
  };
19614
- var C9 = {
19861
+ var C10 = {
19615
19862
  cyan: "#00E5FF",
19616
19863
  black: "#000",
19617
19864
  green: "#22c55e",
@@ -19626,10 +19873,10 @@ var C9 = {
19626
19873
  var TITLE_MIN = 30;
19627
19874
  var TITLE_MAX = 60;
19628
19875
  function getCharColor(len) {
19629
- if (len === 0) return C9.textSecondary;
19630
- if (len >= TITLE_MIN && len <= TITLE_MAX) return C9.green;
19631
- if (len > 0 && len < TITLE_MIN) return C9.orange;
19632
- return C9.red;
19876
+ if (len === 0) return C10.textSecondary;
19877
+ if (len >= TITLE_MIN && len <= TITLE_MAX) return C10.green;
19878
+ if (len > 0 && len < TITLE_MIN) return C10.orange;
19879
+ return C10.red;
19633
19880
  }
19634
19881
  function getProgressPercent(len) {
19635
19882
  if (len === 0) return 0;
@@ -19637,9 +19884,9 @@ function getProgressPercent(len) {
19637
19884
  }
19638
19885
  function getProgressColor(len) {
19639
19886
  if (len === 0) return "var(--theme-elevation-200, #e5e7eb)";
19640
- if (len >= TITLE_MIN && len <= TITLE_MAX) return C9.green;
19641
- if (len < TITLE_MIN) return C9.orange;
19642
- return C9.red;
19887
+ if (len >= TITLE_MIN && len <= TITLE_MAX) return C10.green;
19888
+ if (len < TITLE_MIN) return C10.orange;
19889
+ return C10.red;
19643
19890
  }
19644
19891
  function MetaTitleField({
19645
19892
  path,
@@ -19710,7 +19957,7 @@ function MetaTitleField({
19710
19957
  style: {
19711
19958
  fontSize: 13,
19712
19959
  fontWeight: 700,
19713
- color: C9.textPrimary
19960
+ color: C10.textPrimary
19714
19961
  },
19715
19962
  children: t.metaTitle.label
19716
19963
  }
@@ -19750,9 +19997,9 @@ function MetaTitleField({
19750
19997
  fontSize: 14,
19751
19998
  fontFamily: "inherit",
19752
19999
  borderRadius: 8,
19753
- border: `2px solid ${C9.border}`,
19754
- backgroundColor: C9.surfaceBg,
19755
- color: C9.textPrimary,
20000
+ border: `2px solid ${C10.border}`,
20001
+ backgroundColor: C10.surfaceBg,
20002
+ color: C10.textPrimary,
19756
20003
  outline: "none",
19757
20004
  boxShadow: "2px 2px 0 0 var(--theme-border-color, rgba(0,0,0,1))"
19758
20005
  }
@@ -19770,9 +20017,9 @@ function MetaTitleField({
19770
20017
  gap: 5,
19771
20018
  padding: "8px 14px",
19772
20019
  borderRadius: 8,
19773
- border: `2px solid ${C9.border}`,
19774
- backgroundColor: loading ? C9.surface50 : C9.cyan,
19775
- color: loading ? C9.textSecondary : C9.black,
20020
+ border: `2px solid ${C10.border}`,
20021
+ backgroundColor: loading ? C10.surface50 : C10.cyan,
20022
+ color: loading ? C10.textSecondary : C10.black,
19776
20023
  fontWeight: 800,
19777
20024
  fontSize: 11,
19778
20025
  textTransform: "uppercase",
@@ -19819,7 +20066,7 @@ function MetaTitleField({
19819
20066
  justifyContent: "space-between",
19820
20067
  marginTop: 4,
19821
20068
  fontSize: 10,
19822
- color: C9.textSecondary
20069
+ color: C10.textSecondary
19823
20070
  },
19824
20071
  children: [
19825
20072
  /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
@@ -19853,9 +20100,9 @@ function MetaTitleField({
19853
20100
  borderRadius: 6,
19854
20101
  fontSize: 11,
19855
20102
  fontWeight: 600,
19856
- color: C9.red,
20103
+ color: C10.red,
19857
20104
  backgroundColor: "rgba(239,68,68,0.08)",
19858
- border: `1px solid ${C9.red}`
20105
+ border: `1px solid ${C10.red}`
19859
20106
  },
19860
20107
  children: error
19861
20108
  }
@@ -19864,7 +20111,7 @@ function MetaTitleField({
19864
20111
  }
19865
20112
  );
19866
20113
  }
19867
- var C10 = {
20114
+ var C11 = {
19868
20115
  cyan: "#00E5FF",
19869
20116
  black: "#000",
19870
20117
  green: "#22c55e",
@@ -19879,10 +20126,10 @@ var C10 = {
19879
20126
  var DESC_MIN = 120;
19880
20127
  var DESC_MAX = 160;
19881
20128
  function getCharColor2(len) {
19882
- if (len === 0) return C10.textSecondary;
19883
- if (len >= DESC_MIN && len <= DESC_MAX) return C10.green;
19884
- if (len > 0 && len < DESC_MIN) return C10.orange;
19885
- return C10.red;
20129
+ if (len === 0) return C11.textSecondary;
20130
+ if (len >= DESC_MIN && len <= DESC_MAX) return C11.green;
20131
+ if (len > 0 && len < DESC_MIN) return C11.orange;
20132
+ return C11.red;
19886
20133
  }
19887
20134
  function getProgressPercent2(len) {
19888
20135
  if (len === 0) return 0;
@@ -19890,9 +20137,9 @@ function getProgressPercent2(len) {
19890
20137
  }
19891
20138
  function getProgressColor2(len) {
19892
20139
  if (len === 0) return "var(--theme-elevation-200, #e5e7eb)";
19893
- if (len >= DESC_MIN && len <= DESC_MAX) return C10.green;
19894
- if (len < DESC_MIN) return C10.orange;
19895
- return C10.red;
20140
+ if (len >= DESC_MIN && len <= DESC_MAX) return C11.green;
20141
+ if (len < DESC_MIN) return C11.orange;
20142
+ return C11.red;
19896
20143
  }
19897
20144
  function MetaDescriptionField({
19898
20145
  path,
@@ -19963,7 +20210,7 @@ function MetaDescriptionField({
19963
20210
  style: {
19964
20211
  fontSize: 13,
19965
20212
  fontWeight: 700,
19966
- color: C10.textPrimary
20213
+ color: C11.textPrimary
19967
20214
  },
19968
20215
  children: t.metaDescription.label
19969
20216
  }
@@ -20003,9 +20250,9 @@ function MetaDescriptionField({
20003
20250
  fontSize: 14,
20004
20251
  fontFamily: "inherit",
20005
20252
  borderRadius: 8,
20006
- border: `2px solid ${C10.border}`,
20007
- backgroundColor: C10.surfaceBg,
20008
- color: C10.textPrimary,
20253
+ border: `2px solid ${C11.border}`,
20254
+ backgroundColor: C11.surfaceBg,
20255
+ color: C11.textPrimary,
20009
20256
  outline: "none",
20010
20257
  resize: "vertical",
20011
20258
  lineHeight: 1.5,
@@ -20025,9 +20272,9 @@ function MetaDescriptionField({
20025
20272
  gap: 5,
20026
20273
  padding: "8px 14px",
20027
20274
  borderRadius: 8,
20028
- border: `2px solid ${C10.border}`,
20029
- backgroundColor: loading ? C10.surface50 : C10.cyan,
20030
- color: loading ? C10.textSecondary : C10.black,
20275
+ border: `2px solid ${C11.border}`,
20276
+ backgroundColor: loading ? C11.surface50 : C11.cyan,
20277
+ color: loading ? C11.textSecondary : C11.black,
20031
20278
  fontWeight: 800,
20032
20279
  fontSize: 11,
20033
20280
  textTransform: "uppercase",
@@ -20075,7 +20322,7 @@ function MetaDescriptionField({
20075
20322
  justifyContent: "space-between",
20076
20323
  marginTop: 4,
20077
20324
  fontSize: 10,
20078
- color: C10.textSecondary
20325
+ color: C11.textSecondary
20079
20326
  },
20080
20327
  children: [
20081
20328
  /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
@@ -20109,9 +20356,9 @@ function MetaDescriptionField({
20109
20356
  borderRadius: 6,
20110
20357
  fontSize: 11,
20111
20358
  fontWeight: 600,
20112
- color: C10.red,
20359
+ color: C11.red,
20113
20360
  backgroundColor: "rgba(239,68,68,0.08)",
20114
- border: `1px solid ${C10.red}`
20361
+ border: `1px solid ${C11.red}`
20115
20362
  },
20116
20363
  children: error
20117
20364
  }
@@ -20120,7 +20367,7 @@ function MetaDescriptionField({
20120
20367
  }
20121
20368
  );
20122
20369
  }
20123
- var C11 = {
20370
+ var C12 = {
20124
20371
  cyan: "#00E5FF",
20125
20372
  black: "#000",
20126
20373
  white: "#fff",
@@ -20197,8 +20444,8 @@ function MetaImageField({
20197
20444
  gap: 10,
20198
20445
  padding: "10px 14px",
20199
20446
  borderRadius: 8,
20200
- border: `2px solid ${C11.border}`,
20201
- backgroundColor: C11.surfaceBg,
20447
+ border: `2px solid ${C12.border}`,
20448
+ backgroundColor: C12.surfaceBg,
20202
20449
  boxShadow: "2px 2px 0 0 var(--theme-border-color, rgba(0,0,0,1))"
20203
20450
  },
20204
20451
  children: [
@@ -20217,7 +20464,7 @@ function MetaImageField({
20217
20464
  fontWeight: 900,
20218
20465
  backgroundColor: hasImage ? "rgba(34,197,94,0.15)" : "rgba(255,138,0,0.15)",
20219
20466
  color: hasImage ? "#16a34a" : "#d97706",
20220
- border: `1px solid ${hasImage ? C11.green : C11.orange}`
20467
+ border: `1px solid ${hasImage ? C12.green : C12.orange}`
20221
20468
  },
20222
20469
  children: hasImage ? "\u2713" : "!"
20223
20470
  }
@@ -20229,7 +20476,7 @@ function MetaImageField({
20229
20476
  style: {
20230
20477
  fontSize: 12,
20231
20478
  fontWeight: 700,
20232
- color: C11.textPrimary
20479
+ color: C12.textPrimary
20233
20480
  },
20234
20481
  children: t.metaImage.label
20235
20482
  }
@@ -20239,7 +20486,7 @@ function MetaImageField({
20239
20486
  {
20240
20487
  style: {
20241
20488
  fontSize: 10,
20242
- color: C11.textSecondary,
20489
+ color: C12.textSecondary,
20243
20490
  lineHeight: 1.4
20244
20491
  },
20245
20492
  children: hasImage ? t.metaImage.imageSet : t.metaImage.noImage
@@ -20259,9 +20506,9 @@ function MetaImageField({
20259
20506
  gap: 5,
20260
20507
  padding: "8px 14px",
20261
20508
  borderRadius: 8,
20262
- border: `2px solid ${C11.border}`,
20263
- backgroundColor: loading ? C11.surface50 : success ? C11.green : C11.cyan,
20264
- color: loading ? C11.textSecondary : success ? C11.white : C11.black,
20509
+ border: `2px solid ${C12.border}`,
20510
+ backgroundColor: loading ? C12.surface50 : success ? C12.green : C12.cyan,
20511
+ color: loading ? C12.textSecondary : success ? C12.white : C12.black,
20265
20512
  fontWeight: 800,
20266
20513
  fontSize: 11,
20267
20514
  textTransform: "uppercase",
@@ -20288,9 +20535,9 @@ function MetaImageField({
20288
20535
  borderRadius: 6,
20289
20536
  fontSize: 11,
20290
20537
  fontWeight: 600,
20291
- color: C11.red,
20538
+ color: C12.red,
20292
20539
  backgroundColor: "rgba(239,68,68,0.08)",
20293
- border: `1px solid ${C11.red}`
20540
+ border: `1px solid ${C12.red}`
20294
20541
  },
20295
20542
  children: error
20296
20543
  }
@@ -20299,7 +20546,7 @@ function MetaImageField({
20299
20546
  }
20300
20547
  );
20301
20548
  }
20302
- var C12 = {
20549
+ var C13 = {
20303
20550
  black: "#000",
20304
20551
  white: "#fff",
20305
20552
  green: "#22c55e",
@@ -20313,15 +20560,15 @@ var C12 = {
20313
20560
  function getCompletenessColor(count) {
20314
20561
  switch (count) {
20315
20562
  case 0:
20316
- return C12.red;
20563
+ return C13.red;
20317
20564
  case 1:
20318
- return C12.orange;
20565
+ return C13.orange;
20319
20566
  case 2:
20320
- return C12.yellow;
20567
+ return C13.yellow;
20321
20568
  case 3:
20322
- return C12.green;
20569
+ return C13.green;
20323
20570
  default:
20324
- return C12.textSecondary;
20571
+ return C13.textSecondary;
20325
20572
  }
20326
20573
  }
20327
20574
  function getCompletenessLabel(count, ov) {
@@ -20379,8 +20626,8 @@ function OverviewField({
20379
20626
  fontFamily: "var(--font-body, Inter, system-ui, sans-serif)",
20380
20627
  padding: "12px 14px",
20381
20628
  borderRadius: 10,
20382
- border: `2px solid ${C12.border}`,
20383
- backgroundColor: C12.surfaceBg,
20629
+ border: `2px solid ${C13.border}`,
20630
+ backgroundColor: C13.surfaceBg,
20384
20631
  boxShadow: "3px 3px 0 0 var(--theme-border-color, rgba(0,0,0,1))",
20385
20632
  marginBottom: 12
20386
20633
  },
@@ -20403,7 +20650,7 @@ function OverviewField({
20403
20650
  fontWeight: 800,
20404
20651
  textTransform: "uppercase",
20405
20652
  letterSpacing: "0.04em",
20406
- color: C12.textPrimary
20653
+ color: C13.textPrimary
20407
20654
  },
20408
20655
  children: t.overview.metaCompleteness
20409
20656
  }
@@ -20418,8 +20665,8 @@ function OverviewField({
20418
20665
  fontSize: 11,
20419
20666
  fontWeight: 800,
20420
20667
  backgroundColor: completenessColor,
20421
- color: completenessColor === C12.yellow ? C12.black : C12.white,
20422
- border: `2px solid ${C12.border}`,
20668
+ color: completenessColor === C13.yellow ? C13.black : C13.white,
20669
+ border: `2px solid ${C13.border}`,
20423
20670
  textTransform: "uppercase",
20424
20671
  letterSpacing: "0.03em"
20425
20672
  },
@@ -20517,7 +20764,7 @@ function OverviewField({
20517
20764
  style: {
20518
20765
  fontSize: 12,
20519
20766
  fontWeight: 600,
20520
- color: item.filled ? C12.textPrimary : C12.textSecondary
20767
+ color: item.filled ? C13.textPrimary : C13.textSecondary
20521
20768
  },
20522
20769
  children: item.label
20523
20770
  }
@@ -20529,7 +20776,7 @@ function OverviewField({
20529
20776
  marginLeft: "auto",
20530
20777
  fontSize: 10,
20531
20778
  fontWeight: 700,
20532
- color: item.filled ? C12.green : C12.red,
20779
+ color: item.filled ? C13.green : C13.red,
20533
20780
  textTransform: "uppercase",
20534
20781
  letterSpacing: "0.03em"
20535
20782
  },
@@ -20546,7 +20793,7 @@ function OverviewField({
20546
20793
  }
20547
20794
  );
20548
20795
  }
20549
- var C13 = {
20796
+ var C14 = {
20550
20797
  cyan: "#00E5FF",
20551
20798
  black: "#000",
20552
20799
  white: "#fff",
@@ -20565,10 +20812,10 @@ var G = {
20565
20812
  descGrey: "#4d5156",
20566
20813
  faviconBg: "#e8eaed"};
20567
20814
  function charCountColor2(len, min, max) {
20568
- if (len >= min && len <= max) return C13.green;
20569
- if (len > 0 && len < min) return C13.orange;
20570
- if (len > max) return C13.red;
20571
- return C13.textSecondary;
20815
+ if (len >= min && len <= max) return C14.green;
20816
+ if (len > 0 && len < min) return C14.orange;
20817
+ if (len > max) return C14.red;
20818
+ return C14.textSecondary;
20572
20819
  }
20573
20820
  function truncateText(text, maxChars) {
20574
20821
  if (text.length <= maxChars) return text;
@@ -20623,8 +20870,8 @@ function SerpPreview({
20623
20870
  padding: "10px 12px",
20624
20871
  cursor: "pointer",
20625
20872
  borderRadius: 8,
20626
- border: `2px solid ${C13.border}`,
20627
- backgroundColor: C13.surface50,
20873
+ border: `2px solid ${C14.border}`,
20874
+ backgroundColor: C14.surface50,
20628
20875
  userSelect: "none"
20629
20876
  },
20630
20877
  children: [
@@ -20639,7 +20886,7 @@ function SerpPreview({
20639
20886
  fontWeight: 800,
20640
20887
  textTransform: "uppercase",
20641
20888
  letterSpacing: "0.04em",
20642
- color: C13.textPrimary
20889
+ color: C14.textPrimary
20643
20890
  },
20644
20891
  children: [
20645
20892
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -20671,7 +20918,7 @@ function SerpPreview({
20671
20918
  transition: "transform 0.2s",
20672
20919
  display: "inline-block",
20673
20920
  transform: open ? "rotate(90deg)" : "none",
20674
- color: C13.textSecondary
20921
+ color: C14.textSecondary
20675
20922
  },
20676
20923
  children: "\u25B6"
20677
20924
  }
@@ -20704,10 +20951,10 @@ function SerpPreview({
20704
20951
  "div",
20705
20952
  {
20706
20953
  style: {
20707
- backgroundColor: C13.white,
20708
- border: `2px solid ${C13.border}`,
20954
+ backgroundColor: C14.white,
20955
+ border: `2px solid ${C14.border}`,
20709
20956
  borderRadius: 12,
20710
- boxShadow: `3px 3px 0 0 ${C13.border}`,
20957
+ boxShadow: `3px 3px 0 0 ${C14.border}`,
20711
20958
  padding: isDesktop ? 20 : 14,
20712
20959
  maxWidth: isDesktop ? 650 : 380,
20713
20960
  overflow: "hidden"
@@ -20770,7 +21017,7 @@ function SerpPreview({
20770
21017
  style: {
20771
21018
  fontSize: 14,
20772
21019
  fontWeight: 400,
20773
- color: C13.black,
21020
+ color: C14.black,
20774
21021
  lineHeight: 1.3,
20775
21022
  whiteSpace: "nowrap",
20776
21023
  overflow: "hidden",
@@ -20834,7 +21081,7 @@ function SerpPreview({
20834
21081
  "span",
20835
21082
  {
20836
21083
  style: {
20837
- color: C13.textSecondary,
21084
+ color: C14.textSecondary,
20838
21085
  fontStyle: "italic",
20839
21086
  fontSize: titleFontSize - 2
20840
21087
  },
@@ -20863,7 +21110,7 @@ function SerpPreview({
20863
21110
  "span",
20864
21111
  {
20865
21112
  style: {
20866
- color: C13.textSecondary,
21113
+ color: C14.textSecondary,
20867
21114
  fontStyle: "italic",
20868
21115
  fontSize: descFontSize - 1
20869
21116
  },
@@ -20896,7 +21143,7 @@ function SerpPreview({
20896
21143
  fontSize: 11
20897
21144
  },
20898
21145
  children: [
20899
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: C13.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewTitle }),
21146
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: C14.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewTitle }),
20900
21147
  /* @__PURE__ */ jsxRuntime.jsxs(
20901
21148
  "span",
20902
21149
  {
@@ -20925,7 +21172,7 @@ function SerpPreview({
20925
21172
  fontSize: 11
20926
21173
  },
20927
21174
  children: [
20928
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: C13.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewDescription }),
21175
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: C14.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewDescription }),
20929
21176
  /* @__PURE__ */ jsxRuntime.jsxs(
20930
21177
  "span",
20931
21178
  {
@@ -20954,14 +21201,14 @@ function SerpPreview({
20954
21201
  fontSize: 11
20955
21202
  },
20956
21203
  children: [
20957
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: C13.textSecondary, fontWeight: 600 }, children: t.serpPreview.url }),
21204
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: C14.textSecondary, fontWeight: 600 }, children: t.serpPreview.url }),
20958
21205
  /* @__PURE__ */ jsxRuntime.jsxs(
20959
21206
  "span",
20960
21207
  {
20961
21208
  style: {
20962
21209
  fontWeight: 700,
20963
21210
  fontVariantNumeric: "tabular-nums",
20964
- color: fullUrl.length <= 75 ? C13.green : C13.red
21211
+ color: fullUrl.length <= 75 ? C14.green : C14.red
20965
21212
  },
20966
21213
  children: [
20967
21214
  fullUrl.length,
@@ -20996,13 +21243,13 @@ function DeviceButton({
20996
21243
  gap: 5,
20997
21244
  padding: "4px 12px",
20998
21245
  borderRadius: 6,
20999
- border: `2px solid ${C13.border}`,
21246
+ border: `2px solid ${C14.border}`,
21000
21247
  fontSize: 11,
21001
21248
  fontWeight: 700,
21002
21249
  cursor: "pointer",
21003
- backgroundColor: active ? C13.cyan : C13.surfaceBg,
21004
- color: active ? C13.black : C13.textPrimary,
21005
- boxShadow: active ? `2px 2px 0 0 ${C13.border}` : "none",
21250
+ backgroundColor: active ? C14.cyan : C14.surfaceBg,
21251
+ color: active ? C14.black : C14.textPrimary,
21252
+ boxShadow: active ? `2px 2px 0 0 ${C14.border}` : "none",
21006
21253
  transition: "background-color 0.15s"
21007
21254
  },
21008
21255
  children: [