@consilioweb/payload-seo-analyzer 1.10.0 → 1.12.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,16 @@ 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: "Analyse\u2026",
1064
+ bulkConfirm: "Confirmer ?",
1065
+ bulkPreviewTitle: "Corrections m\xE9ta propos\xE9es",
1066
+ bulkApply: "Appliquer",
1067
+ bulkApplying: "Application\u2026",
1068
+ bulkCancel: "Annuler",
1069
+ bulkExport: "Exporter CSV",
1070
+ bulkNoChanges: "Aucune correction n\xE9cessaire sur la s\xE9lection.",
1071
+ bulkCappedNote: "limite atteinte (affine la s\xE9lection)",
1062
1072
  searchPlaceholder: "Rechercher (titre, slug, keyword)...",
1063
1073
  allCollections: "Toutes les collections",
1064
1074
  allScores: "Tous les scores",
@@ -1651,6 +1661,16 @@ var en = {
1651
1661
  pagesAnalyzed: "pages analyzed",
1652
1662
  markCornerstone: "Mark as cornerstone",
1653
1663
  unmarkCornerstone: "Unmark cornerstone",
1664
+ bulkOptimizeMeta: "Optimize meta (AI)",
1665
+ bulkOptimizing: "Analyzing\u2026",
1666
+ bulkConfirm: "Confirm?",
1667
+ bulkPreviewTitle: "Proposed meta corrections",
1668
+ bulkApply: "Apply",
1669
+ bulkApplying: "Applying\u2026",
1670
+ bulkCancel: "Cancel",
1671
+ bulkExport: "Export CSV",
1672
+ bulkNoChanges: "No corrections needed on the selection.",
1673
+ bulkCappedNote: "limit reached (narrow the selection)",
1654
1674
  searchPlaceholder: "Search (title, slug, keyword)...",
1655
1675
  allCollections: "All collections",
1656
1676
  allScores: "All scores",
@@ -9195,6 +9215,8 @@ function BulkActionBar({
9195
9215
  onExportCsv,
9196
9216
  onMarkCornerstone,
9197
9217
  onUnmarkCornerstone,
9218
+ onOptimizeMeta,
9219
+ optimizing,
9198
9220
  t
9199
9221
  }) {
9200
9222
  if (count === 0) return null;
@@ -9242,6 +9264,17 @@ function BulkActionBar({
9242
9264
  children: t.common.exportCsv
9243
9265
  }
9244
9266
  ),
9267
+ /* @__PURE__ */ jsx(
9268
+ "button",
9269
+ {
9270
+ onClick: () => {
9271
+ if (!optimizing) onOptimizeMeta();
9272
+ },
9273
+ disabled: optimizing,
9274
+ style: { ...btnBase, backgroundColor: "#7c3aed", color: "#fff", opacity: optimizing ? 0.6 : 1 },
9275
+ children: optimizing ? t.seoView.bulkOptimizing : `\u2728 ${t.seoView.bulkOptimizeMeta}`
9276
+ }
9277
+ ),
9245
9278
  /* @__PURE__ */ jsx(
9246
9279
  "button",
9247
9280
  {
@@ -9282,6 +9315,9 @@ function SeoView() {
9282
9315
  const [expandedId, setExpandedId] = useState(null);
9283
9316
  const [saving, setSaving] = useState(false);
9284
9317
  const [saveError, setSaveError] = useState(null);
9318
+ const [bulkOptimizing, setBulkOptimizing] = useState(false);
9319
+ const [bulkApplying, setBulkApplying] = useState(false);
9320
+ const [bulkPreview, setBulkPreview] = useState(null);
9285
9321
  const PAGE_SIZE = 50;
9286
9322
  const fetchAudit = useCallback(async (forceRefresh = false) => {
9287
9323
  setLoading(true);
@@ -9502,6 +9538,84 @@ function SeoView() {
9502
9538
  },
9503
9539
  [selectedIds, fetchAudit]
9504
9540
  );
9541
+ const handleBulkOptimizeMeta = useCallback(async () => {
9542
+ const ids = Array.from(selectedIds).filter((k) => !k.startsWith("global:"));
9543
+ if (ids.length === 0) return;
9544
+ setBulkOptimizing(true);
9545
+ setBulkPreview(null);
9546
+ try {
9547
+ const res = await fetch("/api/seo-plugin/ai-optimize-bulk", {
9548
+ method: "POST",
9549
+ headers: { "Content-Type": "application/json" },
9550
+ credentials: "include",
9551
+ body: JSON.stringify({ ids, apply: false, limit: 100 })
9552
+ });
9553
+ if (res.ok) {
9554
+ const data = await res.json();
9555
+ const changed = (data.results || []).filter((r) => r.changed && !r.error);
9556
+ setBulkPreview({ results: changed, capped: !!data.capped, total: data.processed || 0 });
9557
+ }
9558
+ } catch {
9559
+ }
9560
+ setBulkOptimizing(false);
9561
+ }, [selectedIds]);
9562
+ const handleBulkApplyPreview = useCallback(async () => {
9563
+ if (!bulkPreview || bulkPreview.results.length === 0) return;
9564
+ setBulkApplying(true);
9565
+ const corrections = bulkPreview.results.map((r) => ({
9566
+ collection: r.collection,
9567
+ id: r.id,
9568
+ metaTitle: r.after.metaTitle,
9569
+ metaDescription: r.after.metaDescription,
9570
+ focusKeyword: r.after.focusKeyword
9571
+ }));
9572
+ try {
9573
+ await fetch("/api/seo-plugin/ai-optimize-bulk", {
9574
+ method: "POST",
9575
+ headers: { "Content-Type": "application/json" },
9576
+ credentials: "include",
9577
+ body: JSON.stringify({ corrections, apply: true, limit: 100 })
9578
+ });
9579
+ } catch {
9580
+ }
9581
+ setBulkApplying(false);
9582
+ setBulkPreview(null);
9583
+ setSelectedIds(/* @__PURE__ */ new Set());
9584
+ fetchAudit();
9585
+ }, [bulkPreview, fetchAudit]);
9586
+ const handleExportBulkPreviewCsv = useCallback(() => {
9587
+ if (!bulkPreview) return;
9588
+ const header = [
9589
+ "collection",
9590
+ "id",
9591
+ "title",
9592
+ "before_title",
9593
+ "after_title",
9594
+ "before_description",
9595
+ "after_description",
9596
+ "before_keyword",
9597
+ "after_keyword"
9598
+ ];
9599
+ const rows = bulkPreview.results.map((r) => [
9600
+ r.collection,
9601
+ r.id,
9602
+ r.title,
9603
+ r.before.metaTitle,
9604
+ r.after.metaTitle,
9605
+ r.before.metaDescription,
9606
+ r.after.metaDescription,
9607
+ r.before.focusKeyword,
9608
+ r.after.focusKeyword
9609
+ ]);
9610
+ const csv = [header, ...rows].map((row) => row.map((c) => `"${String(c ?? "").replace(/"/g, '""')}"`).join(",")).join("\n");
9611
+ const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" });
9612
+ const url = URL.createObjectURL(blob);
9613
+ const a = document.createElement("a");
9614
+ a.href = url;
9615
+ a.download = `seo-bulk-optimize-${(/* @__PURE__ */ new Date()).toISOString().slice(0, 10)}.csv`;
9616
+ a.click();
9617
+ URL.revokeObjectURL(url);
9618
+ }, [bulkPreview]);
9505
9619
  const handleInlineSave = useCallback(
9506
9620
  async (item, metaTitle, metaDescription) => {
9507
9621
  setSaving(true);
@@ -10250,8 +10364,100 @@ function SeoView() {
10250
10364
  onExportCsv: handleBulkExportCsv,
10251
10365
  onMarkCornerstone: () => handleBulkCornerstone(true),
10252
10366
  onUnmarkCornerstone: () => handleBulkCornerstone(false),
10367
+ onOptimizeMeta: handleBulkOptimizeMeta,
10368
+ optimizing: bulkOptimizing,
10253
10369
  t
10254
10370
  }
10371
+ ),
10372
+ bulkPreview && /* @__PURE__ */ jsx(
10373
+ "div",
10374
+ {
10375
+ style: {
10376
+ position: "fixed",
10377
+ inset: 0,
10378
+ backgroundColor: "rgba(0,0,0,0.5)",
10379
+ zIndex: 100,
10380
+ display: "flex",
10381
+ alignItems: "center",
10382
+ justifyContent: "center",
10383
+ padding: 24,
10384
+ fontFamily: "var(--font-body, system-ui)"
10385
+ },
10386
+ onClick: () => {
10387
+ if (!bulkApplying) setBulkPreview(null);
10388
+ },
10389
+ children: /* @__PURE__ */ jsxs(
10390
+ "div",
10391
+ {
10392
+ onClick: (e) => e.stopPropagation(),
10393
+ style: {
10394
+ width: "min(900px, 100%)",
10395
+ maxHeight: "85vh",
10396
+ display: "flex",
10397
+ flexDirection: "column",
10398
+ backgroundColor: V2.bgCard,
10399
+ border: `1px solid ${V2.border}`,
10400
+ borderRadius: 12,
10401
+ overflow: "hidden"
10402
+ },
10403
+ children: [
10404
+ /* @__PURE__ */ jsxs("div", { style: { padding: "16px 20px", borderBottom: `1px solid ${V2.border}` }, children: [
10405
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 16, fontWeight: 800, color: V2.text }, children: t.seoView.bulkPreviewTitle }),
10406
+ /* @__PURE__ */ jsxs("div", { style: { fontSize: 12, color: V2.textSecondary, marginTop: 4 }, children: [
10407
+ bulkPreview.results.length,
10408
+ " / ",
10409
+ bulkPreview.total,
10410
+ bulkPreview.capped ? ` \xB7 ${t.seoView.bulkCappedNote}` : ""
10411
+ ] })
10412
+ ] }),
10413
+ /* @__PURE__ */ jsxs("div", { style: { overflowY: "auto", padding: "8px 20px", flex: 1 }, children: [
10414
+ bulkPreview.results.length === 0 && /* @__PURE__ */ jsx("div", { style: { padding: 24, textAlign: "center", color: V2.textSecondary, fontSize: 14 }, children: t.seoView.bulkNoChanges }),
10415
+ bulkPreview.results.map((r) => {
10416
+ const fields = [];
10417
+ if (r.before.metaTitle !== r.after.metaTitle) fields.push({ label: "Title", before: r.before.metaTitle, after: r.after.metaTitle });
10418
+ if (r.before.metaDescription !== r.after.metaDescription) fields.push({ label: "Description", before: r.before.metaDescription, after: r.after.metaDescription });
10419
+ if (r.before.focusKeyword !== r.after.focusKeyword) fields.push({ label: "Keyword", before: r.before.focusKeyword, after: r.after.focusKeyword });
10420
+ return /* @__PURE__ */ jsxs("div", { style: { padding: "10px 0", borderBottom: `1px solid ${V2.border}` }, children: [
10421
+ /* @__PURE__ */ jsxs("div", { style: { fontSize: 13, fontWeight: 700, color: V2.text, marginBottom: 6 }, children: [
10422
+ r.title || `${r.collection}/${r.id}`,
10423
+ " ",
10424
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 10, color: V2.textSecondary, fontWeight: 400 }, children: r.collection })
10425
+ ] }),
10426
+ fields.map((f, i) => /* @__PURE__ */ jsxs("div", { style: { marginBottom: 4, fontSize: 12 }, children: [
10427
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 10, fontWeight: 700, color: V2.textSecondary, textTransform: "uppercase" }, children: f.label }),
10428
+ /* @__PURE__ */ jsx("div", { style: { color: V2.red, textDecoration: f.before ? "line-through" : "none", opacity: 0.75 }, children: f.before || t.seoAnalyzer.emptyValue }),
10429
+ /* @__PURE__ */ jsx("div", { style: { color: V2.green, fontWeight: 600 }, children: f.after || t.seoAnalyzer.emptyValue })
10430
+ ] }, i))
10431
+ ] }, `${r.collection}::${r.id}`);
10432
+ })
10433
+ ] }),
10434
+ /* @__PURE__ */ jsxs("div", { style: { padding: "14px 20px", borderTop: `1px solid ${V2.border}`, display: "flex", justifyContent: "space-between", gap: 8 }, children: [
10435
+ /* @__PURE__ */ jsx(
10436
+ "button",
10437
+ {
10438
+ onClick: handleExportBulkPreviewCsv,
10439
+ disabled: bulkPreview.results.length === 0,
10440
+ style: { ...btnBase, backgroundColor: V2.cyan, color: "#000", opacity: bulkPreview.results.length === 0 ? 0.5 : 1 },
10441
+ children: t.seoView.bulkExport
10442
+ }
10443
+ ),
10444
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: 8 }, children: [
10445
+ /* @__PURE__ */ jsx("button", { onClick: () => setBulkPreview(null), disabled: bulkApplying, style: { ...btnBase, backgroundColor: V2.bg, color: V2.text }, children: t.seoView.bulkCancel }),
10446
+ /* @__PURE__ */ jsx(
10447
+ "button",
10448
+ {
10449
+ onClick: handleBulkApplyPreview,
10450
+ disabled: bulkApplying || bulkPreview.results.length === 0,
10451
+ style: { ...btnBase, backgroundColor: "#7c3aed", color: "#fff", opacity: bulkApplying || bulkPreview.results.length === 0 ? 0.6 : 1 },
10452
+ children: bulkApplying ? t.seoView.bulkApplying : `${t.seoView.bulkApply} (${bulkPreview.results.length})`
10453
+ }
10454
+ )
10455
+ ] })
10456
+ ] })
10457
+ ]
10458
+ }
10459
+ )
10460
+ }
10255
10461
  )
10256
10462
  ]
10257
10463
  }
@@ -18469,6 +18675,183 @@ function PerformanceView() {
18469
18675
  }
18470
18676
  );
18471
18677
  }
18678
+ var C9 = {
18679
+ text: "var(--theme-text, #1a1a1a)",
18680
+ sub: "var(--theme-elevation-600, #6b7280)",
18681
+ card: "var(--theme-elevation-50, #f9fafb)",
18682
+ bg: "var(--theme-elevation-0, #fff)",
18683
+ border: "var(--theme-elevation-200, #e5e7eb)",
18684
+ violet: "#7c3aed",
18685
+ red: "#ef4444",
18686
+ blue: "#3b82f6"
18687
+ };
18688
+ var S6 = {
18689
+ fr: {
18690
+ title: "Brief de contenu IA",
18691
+ subtitle: "G\xE9n\xE8re un plan r\xE9dactionnel optimis\xE9 pour un mot-cl\xE9 (plan, entit\xE9s, questions, longueur cible).",
18692
+ placeholder: "Mot-cl\xE9 cible (ex : plombier paris)",
18693
+ generate: "G\xE9n\xE9rer le brief",
18694
+ generating: "G\xE9n\xE9ration\u2026",
18695
+ outline: "Plan sugg\xE9r\xE9",
18696
+ entities: "Entit\xE9s / termes \xE0 couvrir",
18697
+ questions: "Questions \xE0 traiter",
18698
+ links: "Id\xE9es de liens internes",
18699
+ words: "Longueur recommand\xE9e",
18700
+ wordsUnit: "mots",
18701
+ notes: "Conseils",
18702
+ noKey: "Cl\xE9 API Claude requise (ANTHROPIC_API_KEY).",
18703
+ disabled: "Fonction IA d\xE9sactiv\xE9e (features.aiFeatures)."
18704
+ },
18705
+ en: {
18706
+ title: "AI content brief",
18707
+ subtitle: "Generate an optimized writing brief for a keyword (outline, entities, questions, target length).",
18708
+ placeholder: "Target keyword (e.g. paris plumber)",
18709
+ generate: "Generate brief",
18710
+ generating: "Generating\u2026",
18711
+ outline: "Suggested outline",
18712
+ entities: "Entities / terms to cover",
18713
+ questions: "Questions to answer",
18714
+ links: "Internal link ideas",
18715
+ words: "Recommended length",
18716
+ wordsUnit: "words",
18717
+ notes: "Tips",
18718
+ noKey: "Claude API key required (ANTHROPIC_API_KEY).",
18719
+ disabled: "AI feature disabled (features.aiFeatures)."
18720
+ }
18721
+ };
18722
+ function ContentBriefPanel({ locale }) {
18723
+ const s = S6[locale] ?? S6.fr;
18724
+ const [keyword, setKeyword] = useState("");
18725
+ const [brief, setBrief] = useState(null);
18726
+ const [busy, setBusy] = useState(false);
18727
+ const [error, setError] = useState(null);
18728
+ const generate = async () => {
18729
+ if (!keyword.trim()) return;
18730
+ setBusy(true);
18731
+ setError(null);
18732
+ setBrief(null);
18733
+ try {
18734
+ const res = await fetch("/api/seo-plugin/ai-content-brief", {
18735
+ method: "POST",
18736
+ credentials: "include",
18737
+ headers: { "Content-Type": "application/json" },
18738
+ body: JSON.stringify({ keyword: keyword.trim() })
18739
+ });
18740
+ if (res.status === 404) {
18741
+ setError(s.disabled);
18742
+ return;
18743
+ }
18744
+ const json = await res.json();
18745
+ if (!res.ok) {
18746
+ setError(json.code === "no_api_key" ? s.noKey : json.error || `Error ${res.status}`);
18747
+ return;
18748
+ }
18749
+ setBrief(json.brief);
18750
+ } catch (e) {
18751
+ setError(e instanceof Error ? e.message : "Network error");
18752
+ } finally {
18753
+ setBusy(false);
18754
+ }
18755
+ };
18756
+ const card = {
18757
+ padding: 16,
18758
+ borderRadius: 12,
18759
+ border: `1px solid ${C9.border}`,
18760
+ backgroundColor: C9.card,
18761
+ marginBottom: 20
18762
+ };
18763
+ const chip = {
18764
+ display: "inline-block",
18765
+ fontSize: 11,
18766
+ padding: "3px 8px",
18767
+ borderRadius: 999,
18768
+ backgroundColor: "rgba(59,130,246,0.12)",
18769
+ color: C9.blue,
18770
+ border: `1px solid ${C9.border}`,
18771
+ margin: "0 6px 6px 0"
18772
+ };
18773
+ const h4 = { fontSize: 12, fontWeight: 800, color: C9.text, margin: "14px 0 6px", textTransform: "uppercase" };
18774
+ return /* @__PURE__ */ jsxs("div", { style: card, children: [
18775
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 16, fontWeight: 800, color: C9.text }, children: s.title }),
18776
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 12, color: C9.sub, marginTop: 2, marginBottom: 12 }, children: s.subtitle }),
18777
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: 8, flexWrap: "wrap" }, children: [
18778
+ /* @__PURE__ */ jsx(
18779
+ "input",
18780
+ {
18781
+ value: keyword,
18782
+ onChange: (e) => setKeyword(e.target.value),
18783
+ onKeyDown: (e) => {
18784
+ if (e.key === "Enter") void generate();
18785
+ },
18786
+ placeholder: s.placeholder,
18787
+ style: {
18788
+ flex: 1,
18789
+ minWidth: 220,
18790
+ padding: "8px 12px",
18791
+ fontSize: 13,
18792
+ borderRadius: 8,
18793
+ border: `1px solid ${C9.border}`,
18794
+ backgroundColor: C9.bg,
18795
+ color: C9.text
18796
+ }
18797
+ }
18798
+ ),
18799
+ /* @__PURE__ */ jsx(
18800
+ "button",
18801
+ {
18802
+ type: "button",
18803
+ onClick: () => void generate(),
18804
+ disabled: busy || !keyword.trim(),
18805
+ style: {
18806
+ padding: "8px 14px",
18807
+ borderRadius: 8,
18808
+ border: `1px solid ${C9.violet}`,
18809
+ backgroundColor: C9.violet,
18810
+ color: "#fff",
18811
+ fontSize: 12,
18812
+ fontWeight: 700,
18813
+ cursor: busy || !keyword.trim() ? "not-allowed" : "pointer",
18814
+ opacity: busy || !keyword.trim() ? 0.6 : 1
18815
+ },
18816
+ children: busy ? s.generating : `\u2728 ${s.generate}`
18817
+ }
18818
+ )
18819
+ ] }),
18820
+ error && /* @__PURE__ */ jsx("div", { style: { color: C9.red, fontSize: 13, fontWeight: 600, marginTop: 10 }, children: error }),
18821
+ brief && /* @__PURE__ */ jsxs("div", { style: { marginTop: 8 }, children: [
18822
+ brief.recommendedWordCount > 0 && /* @__PURE__ */ jsxs("div", { style: { fontSize: 12, color: C9.sub, marginTop: 10 }, children: [
18823
+ s.words,
18824
+ ": ",
18825
+ /* @__PURE__ */ jsxs("b", { style: { color: C9.text }, children: [
18826
+ "~",
18827
+ brief.recommendedWordCount,
18828
+ " ",
18829
+ s.wordsUnit
18830
+ ] })
18831
+ ] }),
18832
+ brief.outline.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
18833
+ /* @__PURE__ */ jsx("div", { style: h4, children: s.outline }),
18834
+ /* @__PURE__ */ jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 13, color: C9.text, lineHeight: 1.6 }, children: brief.outline.map((o, i) => /* @__PURE__ */ jsx("li", { style: { marginLeft: o.level === "h3" ? 18 : 0, color: o.level === "h3" ? C9.sub : C9.text, fontWeight: o.level === "h2" ? 700 : 400 }, children: o.text }, i)) })
18835
+ ] }),
18836
+ brief.entities.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
18837
+ /* @__PURE__ */ jsx("div", { style: h4, children: s.entities }),
18838
+ /* @__PURE__ */ jsx("div", { children: brief.entities.map((e, i) => /* @__PURE__ */ jsx("span", { style: chip, children: e }, i)) })
18839
+ ] }),
18840
+ brief.questions.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
18841
+ /* @__PURE__ */ jsx("div", { style: h4, children: s.questions }),
18842
+ /* @__PURE__ */ jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 13, color: C9.text, lineHeight: 1.6 }, children: brief.questions.map((q, i) => /* @__PURE__ */ jsx("li", { children: q }, i)) })
18843
+ ] }),
18844
+ brief.internalLinkIdeas.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
18845
+ /* @__PURE__ */ jsx("div", { style: h4, children: s.links }),
18846
+ /* @__PURE__ */ jsx("div", { children: brief.internalLinkIdeas.map((l, i) => /* @__PURE__ */ jsx("span", { style: chip, children: l }, i)) })
18847
+ ] }),
18848
+ brief.notes.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
18849
+ /* @__PURE__ */ jsx("div", { style: h4, children: s.notes }),
18850
+ /* @__PURE__ */ jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 12, color: C9.sub, lineHeight: 1.6 }, children: brief.notes.map((n, i) => /* @__PURE__ */ jsx("li", { children: n }, i)) })
18851
+ ] })
18852
+ ] })
18853
+ ] });
18854
+ }
18472
18855
  var V9 = {
18473
18856
  text: "var(--theme-text, #1a1a1a)",
18474
18857
  textSecondary: "var(--theme-elevation-600, #6b7280)",
@@ -18831,6 +19214,7 @@ function KeywordResearchView() {
18831
19214
  ]
18832
19215
  }
18833
19216
  ),
19217
+ /* @__PURE__ */ jsx(ContentBriefPanel, { locale }),
18834
19218
  /* @__PURE__ */ jsx(
18835
19219
  "div",
18836
19220
  {
@@ -19605,7 +19989,7 @@ var controlBtnStyle = {
19605
19989
  cursor: "pointer",
19606
19990
  lineHeight: 1.4
19607
19991
  };
19608
- var C9 = {
19992
+ var C10 = {
19609
19993
  cyan: "#00E5FF",
19610
19994
  black: "#000",
19611
19995
  green: "#22c55e",
@@ -19620,10 +20004,10 @@ var C9 = {
19620
20004
  var TITLE_MIN = 30;
19621
20005
  var TITLE_MAX = 60;
19622
20006
  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;
20007
+ if (len === 0) return C10.textSecondary;
20008
+ if (len >= TITLE_MIN && len <= TITLE_MAX) return C10.green;
20009
+ if (len > 0 && len < TITLE_MIN) return C10.orange;
20010
+ return C10.red;
19627
20011
  }
19628
20012
  function getProgressPercent(len) {
19629
20013
  if (len === 0) return 0;
@@ -19631,9 +20015,9 @@ function getProgressPercent(len) {
19631
20015
  }
19632
20016
  function getProgressColor(len) {
19633
20017
  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;
20018
+ if (len >= TITLE_MIN && len <= TITLE_MAX) return C10.green;
20019
+ if (len < TITLE_MIN) return C10.orange;
20020
+ return C10.red;
19637
20021
  }
19638
20022
  function MetaTitleField({
19639
20023
  path,
@@ -19704,7 +20088,7 @@ function MetaTitleField({
19704
20088
  style: {
19705
20089
  fontSize: 13,
19706
20090
  fontWeight: 700,
19707
- color: C9.textPrimary
20091
+ color: C10.textPrimary
19708
20092
  },
19709
20093
  children: t.metaTitle.label
19710
20094
  }
@@ -19744,9 +20128,9 @@ function MetaTitleField({
19744
20128
  fontSize: 14,
19745
20129
  fontFamily: "inherit",
19746
20130
  borderRadius: 8,
19747
- border: `2px solid ${C9.border}`,
19748
- backgroundColor: C9.surfaceBg,
19749
- color: C9.textPrimary,
20131
+ border: `2px solid ${C10.border}`,
20132
+ backgroundColor: C10.surfaceBg,
20133
+ color: C10.textPrimary,
19750
20134
  outline: "none",
19751
20135
  boxShadow: "2px 2px 0 0 var(--theme-border-color, rgba(0,0,0,1))"
19752
20136
  }
@@ -19764,9 +20148,9 @@ function MetaTitleField({
19764
20148
  gap: 5,
19765
20149
  padding: "8px 14px",
19766
20150
  borderRadius: 8,
19767
- border: `2px solid ${C9.border}`,
19768
- backgroundColor: loading ? C9.surface50 : C9.cyan,
19769
- color: loading ? C9.textSecondary : C9.black,
20151
+ border: `2px solid ${C10.border}`,
20152
+ backgroundColor: loading ? C10.surface50 : C10.cyan,
20153
+ color: loading ? C10.textSecondary : C10.black,
19770
20154
  fontWeight: 800,
19771
20155
  fontSize: 11,
19772
20156
  textTransform: "uppercase",
@@ -19813,7 +20197,7 @@ function MetaTitleField({
19813
20197
  justifyContent: "space-between",
19814
20198
  marginTop: 4,
19815
20199
  fontSize: 10,
19816
- color: C9.textSecondary
20200
+ color: C10.textSecondary
19817
20201
  },
19818
20202
  children: [
19819
20203
  /* @__PURE__ */ jsxs("span", { children: [
@@ -19847,9 +20231,9 @@ function MetaTitleField({
19847
20231
  borderRadius: 6,
19848
20232
  fontSize: 11,
19849
20233
  fontWeight: 600,
19850
- color: C9.red,
20234
+ color: C10.red,
19851
20235
  backgroundColor: "rgba(239,68,68,0.08)",
19852
- border: `1px solid ${C9.red}`
20236
+ border: `1px solid ${C10.red}`
19853
20237
  },
19854
20238
  children: error
19855
20239
  }
@@ -19858,7 +20242,7 @@ function MetaTitleField({
19858
20242
  }
19859
20243
  );
19860
20244
  }
19861
- var C10 = {
20245
+ var C11 = {
19862
20246
  cyan: "#00E5FF",
19863
20247
  black: "#000",
19864
20248
  green: "#22c55e",
@@ -19873,10 +20257,10 @@ var C10 = {
19873
20257
  var DESC_MIN = 120;
19874
20258
  var DESC_MAX = 160;
19875
20259
  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;
20260
+ if (len === 0) return C11.textSecondary;
20261
+ if (len >= DESC_MIN && len <= DESC_MAX) return C11.green;
20262
+ if (len > 0 && len < DESC_MIN) return C11.orange;
20263
+ return C11.red;
19880
20264
  }
19881
20265
  function getProgressPercent2(len) {
19882
20266
  if (len === 0) return 0;
@@ -19884,9 +20268,9 @@ function getProgressPercent2(len) {
19884
20268
  }
19885
20269
  function getProgressColor2(len) {
19886
20270
  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;
20271
+ if (len >= DESC_MIN && len <= DESC_MAX) return C11.green;
20272
+ if (len < DESC_MIN) return C11.orange;
20273
+ return C11.red;
19890
20274
  }
19891
20275
  function MetaDescriptionField({
19892
20276
  path,
@@ -19957,7 +20341,7 @@ function MetaDescriptionField({
19957
20341
  style: {
19958
20342
  fontSize: 13,
19959
20343
  fontWeight: 700,
19960
- color: C10.textPrimary
20344
+ color: C11.textPrimary
19961
20345
  },
19962
20346
  children: t.metaDescription.label
19963
20347
  }
@@ -19997,9 +20381,9 @@ function MetaDescriptionField({
19997
20381
  fontSize: 14,
19998
20382
  fontFamily: "inherit",
19999
20383
  borderRadius: 8,
20000
- border: `2px solid ${C10.border}`,
20001
- backgroundColor: C10.surfaceBg,
20002
- color: C10.textPrimary,
20384
+ border: `2px solid ${C11.border}`,
20385
+ backgroundColor: C11.surfaceBg,
20386
+ color: C11.textPrimary,
20003
20387
  outline: "none",
20004
20388
  resize: "vertical",
20005
20389
  lineHeight: 1.5,
@@ -20019,9 +20403,9 @@ function MetaDescriptionField({
20019
20403
  gap: 5,
20020
20404
  padding: "8px 14px",
20021
20405
  borderRadius: 8,
20022
- border: `2px solid ${C10.border}`,
20023
- backgroundColor: loading ? C10.surface50 : C10.cyan,
20024
- color: loading ? C10.textSecondary : C10.black,
20406
+ border: `2px solid ${C11.border}`,
20407
+ backgroundColor: loading ? C11.surface50 : C11.cyan,
20408
+ color: loading ? C11.textSecondary : C11.black,
20025
20409
  fontWeight: 800,
20026
20410
  fontSize: 11,
20027
20411
  textTransform: "uppercase",
@@ -20069,7 +20453,7 @@ function MetaDescriptionField({
20069
20453
  justifyContent: "space-between",
20070
20454
  marginTop: 4,
20071
20455
  fontSize: 10,
20072
- color: C10.textSecondary
20456
+ color: C11.textSecondary
20073
20457
  },
20074
20458
  children: [
20075
20459
  /* @__PURE__ */ jsxs("span", { children: [
@@ -20103,9 +20487,9 @@ function MetaDescriptionField({
20103
20487
  borderRadius: 6,
20104
20488
  fontSize: 11,
20105
20489
  fontWeight: 600,
20106
- color: C10.red,
20490
+ color: C11.red,
20107
20491
  backgroundColor: "rgba(239,68,68,0.08)",
20108
- border: `1px solid ${C10.red}`
20492
+ border: `1px solid ${C11.red}`
20109
20493
  },
20110
20494
  children: error
20111
20495
  }
@@ -20114,7 +20498,7 @@ function MetaDescriptionField({
20114
20498
  }
20115
20499
  );
20116
20500
  }
20117
- var C11 = {
20501
+ var C12 = {
20118
20502
  cyan: "#00E5FF",
20119
20503
  black: "#000",
20120
20504
  white: "#fff",
@@ -20191,8 +20575,8 @@ function MetaImageField({
20191
20575
  gap: 10,
20192
20576
  padding: "10px 14px",
20193
20577
  borderRadius: 8,
20194
- border: `2px solid ${C11.border}`,
20195
- backgroundColor: C11.surfaceBg,
20578
+ border: `2px solid ${C12.border}`,
20579
+ backgroundColor: C12.surfaceBg,
20196
20580
  boxShadow: "2px 2px 0 0 var(--theme-border-color, rgba(0,0,0,1))"
20197
20581
  },
20198
20582
  children: [
@@ -20211,7 +20595,7 @@ function MetaImageField({
20211
20595
  fontWeight: 900,
20212
20596
  backgroundColor: hasImage ? "rgba(34,197,94,0.15)" : "rgba(255,138,0,0.15)",
20213
20597
  color: hasImage ? "#16a34a" : "#d97706",
20214
- border: `1px solid ${hasImage ? C11.green : C11.orange}`
20598
+ border: `1px solid ${hasImage ? C12.green : C12.orange}`
20215
20599
  },
20216
20600
  children: hasImage ? "\u2713" : "!"
20217
20601
  }
@@ -20223,7 +20607,7 @@ function MetaImageField({
20223
20607
  style: {
20224
20608
  fontSize: 12,
20225
20609
  fontWeight: 700,
20226
- color: C11.textPrimary
20610
+ color: C12.textPrimary
20227
20611
  },
20228
20612
  children: t.metaImage.label
20229
20613
  }
@@ -20233,7 +20617,7 @@ function MetaImageField({
20233
20617
  {
20234
20618
  style: {
20235
20619
  fontSize: 10,
20236
- color: C11.textSecondary,
20620
+ color: C12.textSecondary,
20237
20621
  lineHeight: 1.4
20238
20622
  },
20239
20623
  children: hasImage ? t.metaImage.imageSet : t.metaImage.noImage
@@ -20253,9 +20637,9 @@ function MetaImageField({
20253
20637
  gap: 5,
20254
20638
  padding: "8px 14px",
20255
20639
  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,
20640
+ border: `2px solid ${C12.border}`,
20641
+ backgroundColor: loading ? C12.surface50 : success ? C12.green : C12.cyan,
20642
+ color: loading ? C12.textSecondary : success ? C12.white : C12.black,
20259
20643
  fontWeight: 800,
20260
20644
  fontSize: 11,
20261
20645
  textTransform: "uppercase",
@@ -20282,9 +20666,9 @@ function MetaImageField({
20282
20666
  borderRadius: 6,
20283
20667
  fontSize: 11,
20284
20668
  fontWeight: 600,
20285
- color: C11.red,
20669
+ color: C12.red,
20286
20670
  backgroundColor: "rgba(239,68,68,0.08)",
20287
- border: `1px solid ${C11.red}`
20671
+ border: `1px solid ${C12.red}`
20288
20672
  },
20289
20673
  children: error
20290
20674
  }
@@ -20293,7 +20677,7 @@ function MetaImageField({
20293
20677
  }
20294
20678
  );
20295
20679
  }
20296
- var C12 = {
20680
+ var C13 = {
20297
20681
  black: "#000",
20298
20682
  white: "#fff",
20299
20683
  green: "#22c55e",
@@ -20307,15 +20691,15 @@ var C12 = {
20307
20691
  function getCompletenessColor(count) {
20308
20692
  switch (count) {
20309
20693
  case 0:
20310
- return C12.red;
20694
+ return C13.red;
20311
20695
  case 1:
20312
- return C12.orange;
20696
+ return C13.orange;
20313
20697
  case 2:
20314
- return C12.yellow;
20698
+ return C13.yellow;
20315
20699
  case 3:
20316
- return C12.green;
20700
+ return C13.green;
20317
20701
  default:
20318
- return C12.textSecondary;
20702
+ return C13.textSecondary;
20319
20703
  }
20320
20704
  }
20321
20705
  function getCompletenessLabel(count, ov) {
@@ -20373,8 +20757,8 @@ function OverviewField({
20373
20757
  fontFamily: "var(--font-body, Inter, system-ui, sans-serif)",
20374
20758
  padding: "12px 14px",
20375
20759
  borderRadius: 10,
20376
- border: `2px solid ${C12.border}`,
20377
- backgroundColor: C12.surfaceBg,
20760
+ border: `2px solid ${C13.border}`,
20761
+ backgroundColor: C13.surfaceBg,
20378
20762
  boxShadow: "3px 3px 0 0 var(--theme-border-color, rgba(0,0,0,1))",
20379
20763
  marginBottom: 12
20380
20764
  },
@@ -20397,7 +20781,7 @@ function OverviewField({
20397
20781
  fontWeight: 800,
20398
20782
  textTransform: "uppercase",
20399
20783
  letterSpacing: "0.04em",
20400
- color: C12.textPrimary
20784
+ color: C13.textPrimary
20401
20785
  },
20402
20786
  children: t.overview.metaCompleteness
20403
20787
  }
@@ -20412,8 +20796,8 @@ function OverviewField({
20412
20796
  fontSize: 11,
20413
20797
  fontWeight: 800,
20414
20798
  backgroundColor: completenessColor,
20415
- color: completenessColor === C12.yellow ? C12.black : C12.white,
20416
- border: `2px solid ${C12.border}`,
20799
+ color: completenessColor === C13.yellow ? C13.black : C13.white,
20800
+ border: `2px solid ${C13.border}`,
20417
20801
  textTransform: "uppercase",
20418
20802
  letterSpacing: "0.03em"
20419
20803
  },
@@ -20511,7 +20895,7 @@ function OverviewField({
20511
20895
  style: {
20512
20896
  fontSize: 12,
20513
20897
  fontWeight: 600,
20514
- color: item.filled ? C12.textPrimary : C12.textSecondary
20898
+ color: item.filled ? C13.textPrimary : C13.textSecondary
20515
20899
  },
20516
20900
  children: item.label
20517
20901
  }
@@ -20523,7 +20907,7 @@ function OverviewField({
20523
20907
  marginLeft: "auto",
20524
20908
  fontSize: 10,
20525
20909
  fontWeight: 700,
20526
- color: item.filled ? C12.green : C12.red,
20910
+ color: item.filled ? C13.green : C13.red,
20527
20911
  textTransform: "uppercase",
20528
20912
  letterSpacing: "0.03em"
20529
20913
  },
@@ -20540,7 +20924,7 @@ function OverviewField({
20540
20924
  }
20541
20925
  );
20542
20926
  }
20543
- var C13 = {
20927
+ var C14 = {
20544
20928
  cyan: "#00E5FF",
20545
20929
  black: "#000",
20546
20930
  white: "#fff",
@@ -20559,10 +20943,10 @@ var G = {
20559
20943
  descGrey: "#4d5156",
20560
20944
  faviconBg: "#e8eaed"};
20561
20945
  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;
20946
+ if (len >= min && len <= max) return C14.green;
20947
+ if (len > 0 && len < min) return C14.orange;
20948
+ if (len > max) return C14.red;
20949
+ return C14.textSecondary;
20566
20950
  }
20567
20951
  function truncateText(text, maxChars) {
20568
20952
  if (text.length <= maxChars) return text;
@@ -20617,8 +21001,8 @@ function SerpPreview({
20617
21001
  padding: "10px 12px",
20618
21002
  cursor: "pointer",
20619
21003
  borderRadius: 8,
20620
- border: `2px solid ${C13.border}`,
20621
- backgroundColor: C13.surface50,
21004
+ border: `2px solid ${C14.border}`,
21005
+ backgroundColor: C14.surface50,
20622
21006
  userSelect: "none"
20623
21007
  },
20624
21008
  children: [
@@ -20633,7 +21017,7 @@ function SerpPreview({
20633
21017
  fontWeight: 800,
20634
21018
  textTransform: "uppercase",
20635
21019
  letterSpacing: "0.04em",
20636
- color: C13.textPrimary
21020
+ color: C14.textPrimary
20637
21021
  },
20638
21022
  children: [
20639
21023
  /* @__PURE__ */ jsxs(
@@ -20665,7 +21049,7 @@ function SerpPreview({
20665
21049
  transition: "transform 0.2s",
20666
21050
  display: "inline-block",
20667
21051
  transform: open ? "rotate(90deg)" : "none",
20668
- color: C13.textSecondary
21052
+ color: C14.textSecondary
20669
21053
  },
20670
21054
  children: "\u25B6"
20671
21055
  }
@@ -20698,10 +21082,10 @@ function SerpPreview({
20698
21082
  "div",
20699
21083
  {
20700
21084
  style: {
20701
- backgroundColor: C13.white,
20702
- border: `2px solid ${C13.border}`,
21085
+ backgroundColor: C14.white,
21086
+ border: `2px solid ${C14.border}`,
20703
21087
  borderRadius: 12,
20704
- boxShadow: `3px 3px 0 0 ${C13.border}`,
21088
+ boxShadow: `3px 3px 0 0 ${C14.border}`,
20705
21089
  padding: isDesktop ? 20 : 14,
20706
21090
  maxWidth: isDesktop ? 650 : 380,
20707
21091
  overflow: "hidden"
@@ -20764,7 +21148,7 @@ function SerpPreview({
20764
21148
  style: {
20765
21149
  fontSize: 14,
20766
21150
  fontWeight: 400,
20767
- color: C13.black,
21151
+ color: C14.black,
20768
21152
  lineHeight: 1.3,
20769
21153
  whiteSpace: "nowrap",
20770
21154
  overflow: "hidden",
@@ -20828,7 +21212,7 @@ function SerpPreview({
20828
21212
  "span",
20829
21213
  {
20830
21214
  style: {
20831
- color: C13.textSecondary,
21215
+ color: C14.textSecondary,
20832
21216
  fontStyle: "italic",
20833
21217
  fontSize: titleFontSize - 2
20834
21218
  },
@@ -20857,7 +21241,7 @@ function SerpPreview({
20857
21241
  "span",
20858
21242
  {
20859
21243
  style: {
20860
- color: C13.textSecondary,
21244
+ color: C14.textSecondary,
20861
21245
  fontStyle: "italic",
20862
21246
  fontSize: descFontSize - 1
20863
21247
  },
@@ -20890,7 +21274,7 @@ function SerpPreview({
20890
21274
  fontSize: 11
20891
21275
  },
20892
21276
  children: [
20893
- /* @__PURE__ */ jsx("span", { style: { color: C13.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewTitle }),
21277
+ /* @__PURE__ */ jsx("span", { style: { color: C14.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewTitle }),
20894
21278
  /* @__PURE__ */ jsxs(
20895
21279
  "span",
20896
21280
  {
@@ -20919,7 +21303,7 @@ function SerpPreview({
20919
21303
  fontSize: 11
20920
21304
  },
20921
21305
  children: [
20922
- /* @__PURE__ */ jsx("span", { style: { color: C13.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewDescription }),
21306
+ /* @__PURE__ */ jsx("span", { style: { color: C14.textSecondary, fontWeight: 600 }, children: t.serpPreview.previewDescription }),
20923
21307
  /* @__PURE__ */ jsxs(
20924
21308
  "span",
20925
21309
  {
@@ -20948,14 +21332,14 @@ function SerpPreview({
20948
21332
  fontSize: 11
20949
21333
  },
20950
21334
  children: [
20951
- /* @__PURE__ */ jsx("span", { style: { color: C13.textSecondary, fontWeight: 600 }, children: t.serpPreview.url }),
21335
+ /* @__PURE__ */ jsx("span", { style: { color: C14.textSecondary, fontWeight: 600 }, children: t.serpPreview.url }),
20952
21336
  /* @__PURE__ */ jsxs(
20953
21337
  "span",
20954
21338
  {
20955
21339
  style: {
20956
21340
  fontWeight: 700,
20957
21341
  fontVariantNumeric: "tabular-nums",
20958
- color: fullUrl.length <= 75 ? C13.green : C13.red
21342
+ color: fullUrl.length <= 75 ? C14.green : C14.red
20959
21343
  },
20960
21344
  children: [
20961
21345
  fullUrl.length,
@@ -20990,13 +21374,13 @@ function DeviceButton({
20990
21374
  gap: 5,
20991
21375
  padding: "4px 12px",
20992
21376
  borderRadius: 6,
20993
- border: `2px solid ${C13.border}`,
21377
+ border: `2px solid ${C14.border}`,
20994
21378
  fontSize: 11,
20995
21379
  fontWeight: 700,
20996
21380
  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",
21381
+ backgroundColor: active ? C14.cyan : C14.surfaceBg,
21382
+ color: active ? C14.black : C14.textPrimary,
21383
+ boxShadow: active ? `2px 2px 0 0 ${C14.border}` : "none",
21000
21384
  transition: "background-color 0.15s"
21001
21385
  },
21002
21386
  children: [