@lynxflow/seo-engine 1.8.30 → 2.0.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.
Files changed (96) hide show
  1. package/README.md +47 -93
  2. package/dist/ai-copilot-client.d.ts +2 -0
  3. package/dist/built-in-locations.d.ts +18 -0
  4. package/dist/content-ai-arsenal.d.ts +28 -0
  5. package/dist/existing-media-harvester.d.ts +33 -0
  6. package/dist/extended-schemas.d.ts +84 -0
  7. package/dist/features-knowledge-harvester.d.ts +56 -0
  8. package/dist/geo-citation-scorer.d.ts +34 -0
  9. package/dist/i18n-detector.d.ts +1 -1
  10. package/dist/index.d.ts +32 -7
  11. package/dist/index.js +538 -82
  12. package/dist/index.mjs +2028 -163
  13. package/dist/internal-pagerank-graph.d.ts +59 -0
  14. package/dist/knowledge-bank-builder.d.ts +91 -0
  15. package/dist/marketing-skills-engine.d.ts +74 -0
  16. package/dist/matrix-engine.d.ts +26 -0
  17. package/dist/power-words-psychology.d.ts +27 -15
  18. package/dist/public-manifest-engine.d.ts +58 -0
  19. package/dist/rag-knowledge-engine.d.ts +50 -0
  20. package/dist/rate-limited-translator.d.ts +19 -0
  21. package/dist/token-quota-manager.d.ts +4 -0
  22. package/package.json +11 -3
  23. package/TUTORIEL_INTEGRATION_SITE.md +0 -283
  24. package/connectors/cloudflare-worker/worker.js +0 -106
  25. package/connectors/laravel/LynxSeoController.php +0 -37
  26. package/connectors/wordpress/lynxseo-admin-app.js +0 -2611
  27. package/connectors/wordpress/lynxseo-connector.php +0 -1712
  28. package/connectors/wordpress/lynxseo-connector.zip +0 -0
  29. package/lynxflow-seo-engine-1.2.0.tgz +0 -0
  30. package/src/ad-intelligence-cro.ts +0 -140
  31. package/src/ai-bots-log-analyzer.ts +0 -127
  32. package/src/ai-copilot-client.ts +0 -99
  33. package/src/analytics-client.ts +0 -315
  34. package/src/auth-key.ts +0 -262
  35. package/src/backlinks-client.ts +0 -85
  36. package/src/brand-dna-calendar.ts +0 -120
  37. package/src/brand-icons.ts +0 -138
  38. package/src/built-in-locations.ts +0 -170
  39. package/src/content-ai-arsenal.ts +0 -268
  40. package/src/copy-frameworks-master.ts +0 -89
  41. package/src/cro-copywriting-engine.ts +0 -105
  42. package/src/crosslink-scorer.ts +0 -101
  43. package/src/embeddable-seo-widget.ts +0 -57
  44. package/src/engine.test.ts +0 -386
  45. package/src/engine.ts +0 -813
  46. package/src/existing-media-harvester.ts +0 -98
  47. package/src/extended-schemas.ts +0 -589
  48. package/src/features-knowledge-harvester.ts +0 -190
  49. package/src/free-public-tools.ts +0 -224
  50. package/src/geo-mesh-linking.ts +0 -93
  51. package/src/google-business-profile.ts +0 -280
  52. package/src/i18n-detector.ts +0 -98
  53. package/src/i18n-dictionary.ts +0 -422
  54. package/src/index.ts +0 -164
  55. package/src/indexnow-client.ts +0 -94
  56. package/src/instant-matrix-search.ts +0 -48
  57. package/src/isr-cache-manager.ts +0 -78
  58. package/src/keyword-permutator.ts +0 -118
  59. package/src/knowledge-bank-builder.ts +0 -299
  60. package/src/knowledge-graph-linker.ts +0 -81
  61. package/src/lago-token-meter.ts +0 -120
  62. package/src/legal-disclaimers.ts +0 -407
  63. package/src/llm-content-cleaner.ts +0 -64
  64. package/src/llm-prompt.ts +0 -323
  65. package/src/master-marketing-engine.ts +0 -314
  66. package/src/matrix-engine.ts +0 -1204
  67. package/src/mcp-seo-server.ts +0 -108
  68. package/src/ngram-density-analyzer.ts +0 -108
  69. package/src/og-image-generator.ts +0 -109
  70. package/src/power-words-psychology.ts +0 -369
  71. package/src/public-manifest-engine.ts +0 -109
  72. package/src/rag-knowledge-engine.ts +0 -163
  73. package/src/rank-math-parity.ts +0 -235
  74. package/src/rate-limited-translator.ts +0 -110
  75. package/src/real-reviews-sync.ts +0 -207
  76. package/src/rss-syndication-feed.ts +0 -56
  77. package/src/schema-builder.ts +0 -134
  78. package/src/seo-opportunities-decay.ts +0 -154
  79. package/src/serp-client.ts +0 -89
  80. package/src/serp-history-alerts.ts +0 -75
  81. package/src/site-auditor.ts +0 -83
  82. package/src/site-crawler.ts +0 -406
  83. package/src/slug-engine.ts +0 -183
  84. package/src/social-ads-seo.ts +0 -211
  85. package/src/social-growth-suite.ts +0 -310
  86. package/src/social-trend-seo.ts +0 -103
  87. package/src/social-video-seo.ts +0 -100
  88. package/src/team-rbac.ts +0 -61
  89. package/src/technical-rules-auditor.ts +0 -171
  90. package/src/token-quota-manager.ts +0 -91
  91. package/src/types.ts +0 -143
  92. package/src/ui-icons.ts +0 -134
  93. package/src/urlytics-engine.ts +0 -97
  94. package/src/video-youtube-analyzer.ts +0 -81
  95. package/src/yoast-parity.ts +0 -161
  96. package/tsconfig.json +0 -15
@@ -1,170 +0,0 @@
1
- /**
2
- * 🌍 Built-in Global Geographic & Demographic Database
3
- * Automatically provisions verified cities, populations, currencies, and coordinates
4
- * across Europe, North America, and international markets without requiring the user to list cities manually.
5
- */
6
-
7
- import { PseoLocation } from "./matrix-engine";
8
-
9
- export const BUILT_IN_LOCATIONS_DATABASE: Record<string, PseoLocation[]> = {
10
- fr: [
11
- { slug: "paris", name: "Paris", region: "Île-de-France", country: "France", population: 2_161_000, currency: "EUR", currencySymbol: "€", latitude: 48.8566, longitude: 2.3522, neighborSlugs: ["boulogne-billancourt", "saint-denis", "montreuil"] },
12
- { slug: "marseille", name: "Marseille", region: "Provence-Alpes-Côte d'Azur", country: "France", population: 873_000, currency: "EUR", currencySymbol: "€", latitude: 43.2965, longitude: 5.3698, neighborSlugs: ["aix-en-provence", "aubagne", "toulon"] },
13
- { slug: "lyon", name: "Lyon", region: "Auvergne-Rhône-Alpes", country: "France", population: 522_000, currency: "EUR", currencySymbol: "€", latitude: 45.764, longitude: 4.8357, neighborSlugs: ["villeurbanne", "venissieux", "saint-etienne"] },
14
- { slug: "toulouse", name: "Toulouse", region: "Occitanie", country: "France", population: 498_000, currency: "EUR", currencySymbol: "€", latitude: 43.6047, longitude: 1.4442, neighborSlugs: ["montauban", "albi", "colomiers"] },
15
- { slug: "nice", name: "Nice", region: "Provence-Alpes-Côte d'Azur", country: "France", population: 343_000, currency: "EUR", currencySymbol: "€", latitude: 43.7102, longitude: 7.262, neighborSlugs: ["cannes", "antibes", "monaco"] },
16
- { slug: "nantes", name: "Nantes", region: "Pays de la Loire", country: "France", population: 320_000, currency: "EUR", currencySymbol: "€", latitude: 47.2184, longitude: -1.5536, neighborSlugs: ["saint-nazaire", "angers", "rennes"] },
17
- { slug: "montpellier", name: "Montpellier", region: "Occitanie", country: "France", population: 299_000, currency: "EUR", currencySymbol: "€", latitude: 43.6108, longitude: 3.8767, neighborSlugs: ["nimes", "beziers", "sete"] },
18
- { slug: "strasbourg", name: "Strasbourg", region: "Grand Est", country: "France", population: 290_000, currency: "EUR", currencySymbol: "€", latitude: 48.5734, longitude: 7.7521, neighborSlugs: ["mulhouse", "colmar", "metz"] },
19
- { slug: "bordeaux", name: "Bordeaux", region: "Nouvelle-Aquitaine", country: "France", population: 260_000, currency: "EUR", currencySymbol: "€", latitude: 44.8378, longitude: -0.5792, neighborSlugs: ["merignac", "pessac", "arcachon"] },
20
- { slug: "lille", name: "Lille", region: "Hauts-de-France", country: "France", population: 236_000, currency: "EUR", currencySymbol: "€", latitude: 50.6292, longitude: 3.0573, neighborSlugs: ["roubaix", "tourcoing", "villeneuve-d-ascq"] },
21
- { slug: "rennes", name: "Rennes", region: "Bretagne", country: "France", population: 222_000, currency: "EUR", currencySymbol: "€", latitude: 48.1173, longitude: -1.6778, neighborSlugs: ["saint-malo", "brest", "nantes"] },
22
- { slug: "toulon", name: "Toulon", region: "Provence-Alpes-Côte d'Azur", country: "France", population: 179_000, currency: "EUR", currencySymbol: "€", latitude: 43.1242, longitude: 5.928, neighborSlugs: ["hyeres", "la-seyne-sur-mer", "marseille"] },
23
- { slug: "reims", name: "Reims", region: "Grand Est", country: "France", population: 179_000, currency: "EUR", currencySymbol: "€", latitude: 49.2583, longitude: 4.0317, neighborSlugs: ["chalons-en-champagne", "troyes", "metz"] },
24
- { slug: "saint-etienne", name: "Saint-Étienne", region: "Auvergne-Rhône-Alpes", country: "France", population: 174_000, currency: "EUR", currencySymbol: "€", latitude: 45.4397, longitude: 4.3872, neighborSlugs: ["lyon", "roanne", "saint-chamond"] },
25
- { slug: "le-havre", name: "Le Havre", region: "Normandie", country: "France", population: 166_000, currency: "EUR", currencySymbol: "€", latitude: 49.4944, longitude: 0.1079, neighborSlugs: ["rouen", "caen", "honfleur"] },
26
- { slug: "grenoble", name: "Grenoble", region: "Auvergne-Rhône-Alpes", country: "France", population: 158_000, currency: "EUR", currencySymbol: "€", latitude: 45.1885, longitude: 5.7245, neighborSlugs: ["echirolles", "chambery", "annecy"] },
27
- { slug: "dijon", name: "Dijon", region: "Bourgogne-Franche-Comté", country: "France", population: 159_000, currency: "EUR", currencySymbol: "€", latitude: 47.322, longitude: 5.0415, neighborSlugs: ["besancon", "chalon-sur-saone", "beaune"] },
28
- { slug: "angers", name: "Angers", region: "Pays de la Loire", country: "France", population: 155_000, currency: "EUR", currencySymbol: "€", latitude: 47.4784, longitude: -0.5632, neighborSlugs: ["saumur", "cholet", "nantes"] },
29
- { slug: "villeurbanne", name: "Villeurbanne", region: "Auvergne-Rhône-Alpes", country: "France", population: 154_000, currency: "EUR", currencySymbol: "€", latitude: 45.7667, longitude: 4.8833, neighborSlugs: ["lyon", "bron", "caluire-et-cuire"] },
30
- { slug: "nimes", name: "Nîmes", region: "Occitanie", country: "France", population: 148_000, currency: "EUR", currencySymbol: "€", latitude: 43.8367, longitude: 4.3601, neighborSlugs: ["montpellier", "avignon", "arles"] },
31
- { slug: "aix-en-provence", name: "Aix-en-Provence", region: "Provence-Alpes-Côte d'Azur", country: "France", population: 147_000, currency: "EUR", currencySymbol: "€", latitude: 43.5297, longitude: 5.4474, neighborSlugs: ["marseille", "gardanne", "salon-de-provence"] },
32
- { slug: "clermont-ferrand", name: "Clermont-Ferrand", region: "Auvergne-Rhône-Alpes", country: "France", population: 147_000, currency: "EUR", currencySymbol: "€", latitude: 45.7772, longitude: 3.087, neighborSlugs: ["riom", "cournon-d-auvergne", "vichy"] },
33
- { slug: "brest", name: "Brest", region: "Bretagne", country: "France", population: 139_000, currency: "EUR", currencySymbol: "€", latitude: 48.3904, longitude: -4.4861, neighborSlugs: ["quimper", "morlaix", "rennes"] },
34
- { slug: "tours", name: "Tours", region: "Centre-Val de Loire", country: "France", population: 137_000, currency: "EUR", currencySymbol: "€", latitude: 47.3941, longitude: 0.6848, neighborSlugs: ["orleans", "blois", "angers"] },
35
- { slug: "amiens", name: "Amiens", region: "Hauts-de-France", country: "France", population: 134_000, currency: "EUR", currencySymbol: "€", latitude: 49.8941, longitude: 2.2958, neighborSlugs: ["beauvais", "compiegne", "lille"] },
36
- { slug: "annecy", name: "Annecy", region: "Auvergne-Rhône-Alpes", country: "France", population: 131_000, currency: "EUR", currencySymbol: "€", latitude: 45.8992, longitude: 6.1294, neighborSlugs: ["chambery", "geneve", "grenoble"] },
37
- ],
38
-
39
- es: [
40
- { slug: "madrid", name: "Madrid", region: "Comunidad de Madrid", country: "Spain", population: 3_300_000, currency: "EUR", currencySymbol: "€", latitude: 40.4168, longitude: -3.7038, neighborSlugs: ["alcala-de-henares", "mostoles", "getafe"] },
41
- { slug: "barcelona", name: "Barcelona", region: "Catalunya", country: "Spain", population: 1_636_000, currency: "EUR", currencySymbol: "€", latitude: 41.3851, longitude: 2.1734, neighborSlugs: ["hospitalet-de-llobregat", "badalona", "terrassa"] },
42
- { slug: "valencia", name: "Valencia", region: "Comunitat Valenciana", country: "Spain", population: 800_000, currency: "EUR", currencySymbol: "€", latitude: 39.4699, longitude: -0.3763, neighborSlugs: ["alicante", "castellon-de-la-plana", "gandia"] },
43
- { slug: "sevilla", name: "Sevilla", region: "Andalucía", country: "Spain", population: 688_000, currency: "EUR", currencySymbol: "€", latitude: 37.3891, longitude: -5.9845, neighborSlugs: ["cordoba", "huelva", "cadiz"] },
44
- { slug: "zaragoza", name: "Zaragoza", region: "Aragón", country: "Spain", population: 675_000, currency: "EUR", currencySymbol: "€", latitude: 41.6488, longitude: -0.8891, neighborSlugs: ["huesca", "teruel", "madrid"] },
45
- { slug: "malaga", name: "Málaga", region: "Andalucía", country: "Spain", population: 579_000, currency: "EUR", currencySymbol: "€", latitude: 36.7213, longitude: -4.4214, neighborSlugs: ["marbella", "torremolinos", "granada"] },
46
- { slug: "bilbao", name: "Bilbao", region: "País Vasco", country: "Spain", population: 346_000, currency: "EUR", currencySymbol: "€", latitude: 43.263, longitude: -2.935, neighborSlugs: ["san-sebastian", "vitoria-gasteiz", "santander"] },
47
- ],
48
-
49
- de: [
50
- { slug: "berlin", name: "Berlin", region: "Berlin", country: "Germany", population: 3_645_000, currency: "EUR", currencySymbol: "€", latitude: 52.52, longitude: 13.405, neighborSlugs: ["potsdam", "cottbus", "brandenburg"] },
51
- { slug: "hamburg", name: "Hamburg", region: "Hamburg", country: "Germany", population: 1_841_000, currency: "EUR", currencySymbol: "€", latitude: 53.5511, longitude: 9.9937, neighborSlugs: ["luebeck", "bremen", "kiel"] },
52
- { slug: "muenchen", name: "München", region: "Bayern", country: "Germany", population: 1_472_000, currency: "EUR", currencySymbol: "€", latitude: 48.1351, longitude: 11.582, neighborSlugs: ["augsburg", "ingolstadt", "rosenheim"] },
53
- { slug: "koeln", name: "Köln", region: "Nordrhein-Westfalen", country: "Germany", population: 1_086_000, currency: "EUR", currencySymbol: "€", latitude: 50.9375, longitude: 6.9603, neighborSlugs: ["duesseldorf", "bonn", "leverkusen"] },
54
- { slug: "frankfurt", name: "Frankfurt am Main", region: "Hessen", country: "Germany", population: 753_000, currency: "EUR", currencySymbol: "€", latitude: 50.1109, longitude: 8.6821, neighborSlugs: ["wiesbaden", "mainz", "darmstadt"] },
55
- { slug: "stuttgart", name: "Stuttgart", region: "Baden-Württemberg", country: "Germany", population: 635_000, currency: "EUR", currencySymbol: "€", latitude: 48.7758, longitude: 9.1829, neighborSlugs: ["esslingen", "ludwigsburg", "karlsruhe"] },
56
- ],
57
-
58
- uk: [
59
- { slug: "london", name: "London", region: "Greater London", country: "United Kingdom", population: 8_982_000, currency: "GBP", currencySymbol: "£", latitude: 51.5074, longitude: -0.1278, neighborSlugs: ["croydon", "watford", "reading"] },
60
- { slug: "birmingham", name: "Birmingham", region: "West Midlands", country: "United Kingdom", population: 1_149_000, currency: "GBP", currencySymbol: "£", latitude: 52.4862, longitude: -1.8904, neighborSlugs: ["coventry", "wolverhampton", "solihull"] },
61
- { slug: "manchester", name: "Manchester", region: "Greater Manchester", country: "United Kingdom", population: 553_000, currency: "GBP", currencySymbol: "£", latitude: 53.4808, longitude: -2.2426, neighborSlugs: ["salford", "bolton", "stockport"] },
62
- { slug: "edinburgh", name: "Edinburgh", region: "Scotland", country: "United Kingdom", population: 527_000, currency: "GBP", currencySymbol: "£", latitude: 55.9533, longitude: -3.1883, neighborSlugs: ["glasgow", "livingston", "dundee"] },
63
- ],
64
-
65
- us: [
66
- { slug: "new-york", name: "New York", region: "NY", country: "United States", population: 8_336_000, currency: "USD", currencySymbol: "$", latitude: 40.7128, longitude: -74.006, neighborSlugs: ["brooklyn", "queens", "jersey-city"] },
67
- { slug: "los-angeles", name: "Los Angeles", region: "CA", country: "United States", population: 3_979_000, currency: "USD", currencySymbol: "$", latitude: 34.0522, longitude: -118.2437, neighborSlugs: ["long-beach", "pasadena", "glendale"] },
68
- { slug: "chicago", name: "Chicago", region: "IL", country: "United States", population: 2_693_000, currency: "USD", currencySymbol: "$", latitude: 41.8781, longitude: -87.6298, neighborSlugs: ["evanston", "naperville", "aurora"] },
69
- { slug: "houston", name: "Houston", region: "TX", country: "United States", population: 2_320_000, currency: "USD", currencySymbol: "$", latitude: 29.7604, longitude: -95.3698, neighborSlugs: ["the-woodlands", "sugar-land", "katy"] },
70
- { slug: "miami", name: "Miami", region: "FL", country: "United States", population: 442_000, currency: "USD", currencySymbol: "$", latitude: 25.7617, longitude: -80.1918, neighborSlugs: ["fort-lauderdale", "miami-beach", "hialeah"] },
71
- { slug: "san-francisco", name: "San Francisco", region: "CA", country: "United States", population: 873_000, currency: "USD", currencySymbol: "$", latitude: 37.7749, longitude: -122.4194, neighborSlugs: ["oakland", "san-jose", "berkeley"] },
72
- ],
73
-
74
- be: [
75
- { slug: "bruxelles", name: "Bruxelles", region: "Bruxelles-Capitale", country: "Belgium", population: 1_220_000, currency: "EUR", currencySymbol: "€", latitude: 50.8503, longitude: 4.3517, neighborSlugs: ["anvers", "gand", "liege"] },
76
- { slug: "anvers", name: "Anvers", region: "Flandre", country: "Belgium", population: 530_000, currency: "EUR", currencySymbol: "€", latitude: 51.2194, longitude: 4.4025, neighborSlugs: ["bruxelles", "malines", "gand"] },
77
- { slug: "liege", name: "Liège", region: "Wallonie", country: "Belgium", population: 197_000, currency: "EUR", currencySymbol: "€", latitude: 50.6326, longitude: 5.5797, neighborSlugs: ["namur", "charleroi", "bruxelles"] },
78
- ],
79
-
80
- ch: [
81
- { slug: "zurich", name: "Zürich", region: "Zürich", country: "Switzerland", population: 434_000, currency: "CHF", currencySymbol: "CHF", latitude: 47.3769, longitude: 8.5417, neighborSlugs: ["bale", "berne", "lucerne"] },
82
- { slug: "geneve", name: "Genève", region: "Genève", country: "Switzerland", population: 203_000, currency: "EUR", currencySymbol: "CHF", latitude: 46.2044, longitude: 6.1432, neighborSlugs: ["lausanne", "annecy", "nyon"] },
83
- { slug: "lausanne", name: "Lausanne", region: "Vaud", country: "Switzerland", population: 140_000, currency: "CHF", currencySymbol: "CHF", latitude: 46.5197, longitude: 6.6323, neighborSlugs: ["geneve", "montreux", "vevey"] },
84
- ],
85
-
86
- it: [
87
- { slug: "roma", name: "Roma", region: "Lazio", country: "Italy", population: 2_873_000, currency: "EUR", currencySymbol: "€", latitude: 41.9028, longitude: 12.4964, neighborSlugs: ["latina", "fiumicino", "tivoli"] },
88
- { slug: "milano", name: "Milano", region: "Lombardia", country: "Italy", population: 1_366_000, currency: "EUR", currencySymbol: "€", latitude: 45.4642, longitude: 9.19, neighborSlugs: ["monza", "bergamo", "brescia"] },
89
- { slug: "torino", name: "Torino", region: "Piemonte", country: "Italy", population: 870_000, currency: "EUR", currencySymbol: "€", latitude: 45.0703, longitude: 7.6869, neighborSlugs: ["novara", "alessandria", "asti"] },
90
- ],
91
-
92
- ca: [
93
- { slug: "toronto", name: "Toronto", region: "ON", country: "Canada", population: 2_794_000, currency: "CAD", currencySymbol: "$", latitude: 43.6532, longitude: -79.3832, neighborSlugs: ["mississauga", "brampton", "markham"] },
94
- { slug: "montreal", name: "Montréal", region: "QC", country: "Canada", population: 1_762_000, currency: "CAD", currencySymbol: "$", latitude: 45.5017, longitude: -73.5673, neighborSlugs: ["laval", "longueuil", "quebec"] },
95
- { slug: "vancouver", name: "Vancouver", region: "BC", country: "Canada", population: 662_000, currency: "CAD", currencySymbol: "$", latitude: 49.2827, longitude: -123.1207, neighborSlugs: ["burnaby", "richmond", "surrey"] },
96
- ],
97
- };
98
-
99
- /**
100
- * Resolves built-in locations by country code or territory keyword.
101
- * Supports: "fr", "france", "es", "spain", "de", "germany", "uk", "us", "be", "ch", "it", "ca", "europe", "international", "all"
102
- */
103
- export function resolveBuiltInLocations(territories?: string[] | string): PseoLocation[] {
104
- if (!territories) {
105
- // Default: France + Belgium + Switzerland if unspecified
106
- return [...BUILT_IN_LOCATIONS_DATABASE.fr];
107
- }
108
-
109
- const requested = (Array.isArray(territories) ? territories : [territories]).map((t) => t.toLowerCase().trim());
110
- const results: PseoLocation[] = [];
111
- const addedSlugs = new Set<string>();
112
-
113
- const isAllOrEurope = requested.some((t) => ["europe", "international", "all", "global", "world"].includes(t));
114
-
115
- if (isAllOrEurope) {
116
- for (const list of Object.values(BUILT_IN_LOCATIONS_DATABASE)) {
117
- for (const loc of list) {
118
- if (!addedSlugs.has(loc.slug)) {
119
- addedSlugs.add(loc.slug);
120
- results.push(loc);
121
- }
122
- }
123
- }
124
- return results;
125
- }
126
-
127
- const countryAliasMap: Record<string, string> = {
128
- france: "fr",
129
- fr: "fr",
130
- spain: "es",
131
- espagne: "es",
132
- es: "es",
133
- germany: "de",
134
- allemagne: "de",
135
- de: "de",
136
- uk: "uk",
137
- gb: "uk",
138
- "united kingdom": "uk",
139
- angleterre: "uk",
140
- us: "us",
141
- usa: "us",
142
- "united states": "us",
143
- etatsunis: "us",
144
- belgium: "be",
145
- belgique: "be",
146
- be: "be",
147
- switzerland: "ch",
148
- suisse: "ch",
149
- ch: "ch",
150
- italy: "it",
151
- italie: "it",
152
- it: "it",
153
- canada: "ca",
154
- ca: "ca",
155
- };
156
-
157
- for (const req of requested) {
158
- const code = countryAliasMap[req.replace(/[^a-z0-9]/g, "")];
159
- if (code && BUILT_IN_LOCATIONS_DATABASE[code]) {
160
- for (const loc of BUILT_IN_LOCATIONS_DATABASE[code]) {
161
- if (!addedSlugs.has(loc.slug)) {
162
- addedSlugs.add(loc.slug);
163
- results.push(loc);
164
- }
165
- }
166
- }
167
- }
168
-
169
- return results.length > 0 ? results : [...BUILT_IN_LOCATIONS_DATABASE.fr];
170
- }
@@ -1,268 +0,0 @@
1
- /**
2
- * 🪄 LynxSEO Content AI Master Arsenal (40+ Tools & Copywriting Formulas)
3
- *
4
- * Provides complete parity and superiority over Rank Math Content AI, Yoast AI, and AIOSEO:
5
- * - 40+ Dedicated AI Generation Tools
6
- * - 6 Master Copywriting Formulas (AIDA, PAS, BAB, HERO, SPIN, IDCA)
7
- * - 1-Click Long-Form Blog Post Wizard
8
- * - AI Link Genius & Internal Link Opportunities
9
- * - 1-Click Fix Failed SEO Tests with AI
10
- * - AI Brand Visibility & AI Search Tracker
11
- * - 125+ Curated SEO Prompt Templates
12
- */
13
-
14
- export interface ContentAiToolDefinition {
15
- id: string;
16
- category: "blogging" | "seo_meta" | "copywriting" | "ecommerce" | "social" | "workflow";
17
- name: string;
18
- icon: string;
19
- description: string;
20
- inputs: { name: string; label: string; placeholder: string; type?: "text" | "textarea" | "select"; options?: string[] }[];
21
- systemPrompt: string;
22
- }
23
-
24
- export const CONTENT_AI_40_TOOLS: ContentAiToolDefinition[] = [
25
- // ─── 1. BLOGGING & EDITORIAL (8 Tools) ───
26
- {
27
- id: "blog_ideas",
28
- category: "blogging",
29
- name: "Idées d'Articles de Blog",
30
- icon: "💡",
31
- description: "Trouvez 10 angles d'articles captivants à fort potentiel de trafic pour votre niche.",
32
- inputs: [{ name: "topic", label: "Sujet ou Thématique", placeholder: "Ex: Rénovation énergétique, SEO local..." }],
33
- systemPrompt: "Génère 10 idées d'articles de blog innovantes, captivantes et optimisées pour le SEO avec estimation du volume de recherche."
34
- },
35
- {
36
- id: "blog_outline",
37
- category: "blogging",
38
- name: "Plan d'Article Détaillé",
39
- icon: "🧾",
40
- description: "Structurez vos articles avec une hiérarchie H2/H3 claire et optimisée pour Google.",
41
- inputs: [{ name: "title", label: "Titre de l'article", placeholder: "Ex: Guide complet de la pompe à chaleur en 2026" }],
42
- systemPrompt: "Rédige un plan complet d'article de blog avec balises H2 et H3, points clés et intentions de recherche."
43
- },
44
- {
45
- id: "blog_intro",
46
- category: "blogging",
47
- name: "Introduction Captivante",
48
- icon: "👋",
49
- description: "Rédigez une accroche irrésistible qui retient l'attention dès les premières secondes.",
50
- inputs: [{ name: "title", label: "Titre", placeholder: "Titre de votre article..." }],
51
- systemPrompt: "Rédige une introduction captivante utilisant la méthode du crochet (Hook), du problème et de la promesse."
52
- },
53
- {
54
- id: "blog_conclusion",
55
- category: "blogging",
56
- name: "Conclusion & Appel à l'Action",
57
- icon: "🏁",
58
- description: "Terminez vos articles avec un résumé percutant et un appel à l'action clair.",
59
- inputs: [{ name: "summary", label: "Points clés", placeholder: "Principales conclusions..." }],
60
- systemPrompt: "Rédige une conclusion mémorable résumant les bénéfices et incitant à l'action (CTA)."
61
- },
62
- {
63
- id: "paragraph_writer",
64
- category: "blogging",
65
- name: "Rédacteur de Paragraphe",
66
- icon: "🖋️",
67
- description: "Développez une idée en un paragraphe fluide, sourcé et agréable à lire.",
68
- inputs: [{ name: "idea", label: "Idée directrice", placeholder: "Ce que vous voulez expliquer..." }],
69
- systemPrompt: "Développe cette idée en un paragraphe informatif, percutant et optimisé pour le référencement."
70
- },
71
- {
72
- id: "paragraph_rewriter",
73
- category: "blogging",
74
- name: "Réécriture & Clarté",
75
- icon: "📝",
76
- description: "Reformulez un texte pour améliorer son style tout en préservant son sens exact.",
77
- inputs: [{ name: "text", label: "Texte à réécrire", placeholder: "Collez votre texte...", type: "textarea" }],
78
- systemPrompt: "Réécris ce texte avec un style dynamique, moderne et sans faute."
79
- },
80
- {
81
- id: "sentence_expander",
82
- category: "blogging",
83
- name: "Développeur de Phrases",
84
- icon: "📖",
85
- description: "Donnez de la profondeur et des exemples concrets à une phrase trop concise.",
86
- inputs: [{ name: "sentence", label: "Phrase de départ", placeholder: "Phrase à enrichir..." }],
87
- systemPrompt: "Enrichis cette phrase en lui apportant des détails, du contexte et une argumentation solide."
88
- },
89
- {
90
- id: "text_summarizer",
91
- category: "blogging",
92
- name: "Synthèse & Résumé Exécutif",
93
- icon: "📙",
94
- description: "Condensez un long document en 3 à 5 points clés essentiels.",
95
- inputs: [{ name: "content", label: "Contenu long", placeholder: "Collez l'article complet...", type: "textarea" }],
96
- systemPrompt: "Résume ce texte sous forme de Direct Answer et de 4 puces concises."
97
- },
98
-
99
- // ─── 2. FORMULES MAÎTRESSES DE COPYWRITING (6 Formules) ───
100
- {
101
- id: "copy_aida",
102
- category: "copywriting",
103
- name: "Formule AIDA (Attention - Intérêt - Désir - Action)",
104
- icon: "🤑",
105
- description: "La formule reine de conversion pour capter, intéresser, séduire et convertir.",
106
- inputs: [{ name: "offer", label: "Offre ou Produit", placeholder: "Description de votre offre..." }],
107
- systemPrompt: "Rédige un texte de vente structuré selon la formule AIDA (Attention, Intérêt, Désir, Action)."
108
- },
109
- {
110
- id: "copy_pas",
111
- category: "copywriting",
112
- name: "Formule PAS (Problème - Agitation - Solution)",
113
- icon: "😲",
114
- description: "Identifiez la douleur du prospect, amplifiez ses risques et offrez votre solution.",
115
- inputs: [{ name: "pain", label: "Problème client", placeholder: "Le problème que vous résolvez..." }],
116
- systemPrompt: "Rédige un copywriting percutant suivant la formule PAS (Problem, Agitate, Solution)."
117
- },
118
- {
119
- id: "copy_bab",
120
- category: "copywriting",
121
- name: "Formule BAB (Before - After - Bridge)",
122
- icon: "😌",
123
- description: "Montrez la situation avant, la vie idéale après, et votre offre comme passerelle.",
124
- inputs: [{ name: "transformation", label: "Transformation offerte", placeholder: "Avant vs Après..." }],
125
- systemPrompt: "Rédige une histoire de vente selon la formule Before-After-Bridge."
126
- },
127
- {
128
- id: "copy_hero",
129
- category: "copywriting",
130
- name: "Formule HERO (Hook - Empathy - Response - Outcome)",
131
- icon: "🤠",
132
- description: "Créez une connexion émotionnelle forte et démontrez les résultats concrets.",
133
- inputs: [{ name: "mission", label: "Votre mission", placeholder: "Votre proposition de valeur..." }],
134
- systemPrompt: "Rédige un argumentaire de vente suivant la structure HERO."
135
- },
136
- {
137
- id: "copy_spin",
138
- category: "copywriting",
139
- name: "Formule SPIN (Situation - Problème - Implication - Need-payoff)",
140
- icon: "🤨",
141
- description: "La méthode consultative B2B pour vendre des prestations et solutions complexes.",
142
- inputs: [{ name: "b2b_context", label: "Contexte B2B", placeholder: "Le secteur et l'enjeu stratégique..." }],
143
- systemPrompt: "Développe un argumentaire de vente B2B selon la méthode SPIN Selling."
144
- },
145
- {
146
- id: "copy_idca",
147
- category: "copywriting",
148
- name: "Formule IDCA (Identifier - Développer - Communiquer - Agir)",
149
- icon: "🤔",
150
- description: "Structurez une argumentation commerciale logique et engageante.",
151
- inputs: [{ name: "strategy", label: "Proposition", placeholder: "Ce que vous proposez..." }],
152
- systemPrompt: "Rédige un message percutant selon la stratégie IDCA."
153
- },
154
-
155
- // ─── 3. E-COMMERCE & WOOCOMMERCE (5 Tools) ───
156
- {
157
- id: "ecom_product_desc",
158
- category: "ecommerce",
159
- name: "Fiche Produit WooCommerce Haute Conversion",
160
- icon: "🛍️",
161
- description: "Rédigez une fiche produit irrésistible avec caractéristiques et bénéfices émotionnels.",
162
- inputs: [{ name: "product", label: "Nom & détails du produit", placeholder: "Nom, caractéristiques techniques..." }],
163
- systemPrompt: "Rédige une fiche produit persuasive avec titre accrocheur, bénéfices clients et fiche technique."
164
- },
165
- {
166
- id: "ecom_pros_cons",
167
- category: "ecommerce",
168
- name: "Tableau Avantages & Inconvénients",
169
- icon: "👍",
170
- description: "Présentez une évaluation honnête et rassurante qui renforce la confiance E-E-A-T.",
171
- inputs: [{ name: "product_name", label: "Produit ou Service", placeholder: "Nom du produit..." }],
172
- systemPrompt: "Génère un comparatif équilibré Avantages (Pros) et Limites (Cons) avec verdict expert."
173
- },
174
- {
175
- id: "ecom_faq",
176
- category: "ecommerce",
177
- name: "FAQ Produit & Schéma FAQPage",
178
- icon: "❓",
179
- description: "Répondez aux 5 questions les plus fréquentes des acheteurs avec balisage JSON-LD.",
180
- inputs: [{ name: "product_topic", label: "Sujet ou Produit", placeholder: "Ex: Délais de livraison, garantie..." }],
181
- systemPrompt: "Rédige 5 questions/réponses précises avec balisage FAQPage Schema.org."
182
- },
183
- {
184
- id: "ecom_review",
185
- category: "ecommerce",
186
- name: "Synthèse d'Avis & Témoignages",
187
- icon: "⭐️",
188
- description: "Résumez les retours d'expérience clients en preuves sociales percutantes.",
189
- inputs: [{ name: "feedback", label: "Retours clients bruts", placeholder: "Notes, commentaires clients..." }],
190
- systemPrompt: "Transforme ces retours en une synthèse d'avis clients structurée avec note globale."
191
- },
192
-
193
- // ─── 4. RÉSEAUX SOCIAUX & MULTIMÉDIA (6 Tools) ───
194
- {
195
- id: "social_youtube_script",
196
- category: "social",
197
- name: "Script Vidéo YouTube & Shorts",
198
- icon: "📹",
199
- description: "Générez un script vidéo rythmé avec accroche, visuels à afficher et conclusion CTA.",
200
- inputs: [{ name: "video_topic", label: "Sujet de la vidéo", placeholder: "De quoi traite la vidéo..." }],
201
- systemPrompt: "Rédige un script vidéo YouTube complet avec timestamps, indications visuelles et voix off."
202
- },
203
- {
204
- id: "social_facebook",
205
- category: "social",
206
- name: "Post Facebook & Groupe",
207
- icon: "📱",
208
- description: "Créez une publication engageante avec émojis et question ouverte pour maximiser les partages.",
209
- inputs: [{ name: "post_idea", label: "Message clé", placeholder: "Votre annonce ou conseil..." }],
210
- systemPrompt: "Rédige une publication Facebook engageante optimisée pour susciter des commentaires et réactions."
211
- },
212
- {
213
- id: "social_tweet",
214
- category: "social",
215
- name: "Thread X (Twitter) & Post Viral",
216
- icon: "🐦",
217
- description: "Structurez un thread éducatif percutant prêt à devenir viral sur X.",
218
- inputs: [{ name: "thread_topic", label: "Sujet du thread", placeholder: "Le conseil ou l'analyse à partager..." }],
219
- systemPrompt: "Rédige un thread X de 5 tweets concis, captivants et riches en valeur ajoutée."
220
- },
221
- {
222
- id: "social_instagram",
223
- category: "social",
224
- name: "Légende Instagram & Hashtags",
225
- icon: "📷",
226
- description: "Rédigez une légende esthétique accompagnée de 15 hashtags stratégiques.",
227
- inputs: [{ name: "photo_context", label: "Contexte de la photo", placeholder: "Ce que montre le visuel..." }],
228
- systemPrompt: "Rédige une légende Instagram percutante avec hook initial et liste de hashtags ciblés."
229
- },
230
- {
231
- id: "social_email_promo",
232
- category: "social",
233
- name: "Newsletter & Email de Vente",
234
- icon: "📧",
235
- description: "Rédigez un email promotionnel avec taux d'ouverture et de clic maximisés.",
236
- inputs: [{ name: "email_goal", label: "Objectif de l'email", placeholder: "Lancement de produit, promo..." }],
237
- systemPrompt: "Rédige un email avec 3 propositions d'objets à fort taux d'ouverture et corps de texte persuasif."
238
- },
239
-
240
- // ─── 5. WORKFLOWS & AUTOMATISATION SEO (5 Tools) ───
241
- {
242
- id: "seo_fix_tests",
243
- category: "workflow",
244
- name: "Corriger les Tests SEO Échoués en 1 Clic",
245
- icon: "🛡️",
246
- description: "Analyse les erreurs de votre page et génère automatiquement le correctif parfait.",
247
- inputs: [{ name: "failed_test", label: "Test échoué", placeholder: "Ex: Mot-clé absent de l'introduction, méta trop courte..." }],
248
- systemPrompt: "Fournis le texte exact corrigé et optimisé pour valider immédiatement le test SEO à 100/100."
249
- },
250
- {
251
- id: "ai_link_genius",
252
- category: "workflow",
253
- name: "AI Link Genius (Opportunités de Liens)",
254
- icon: "🔗",
255
- description: "Détecte les opportunités de maillage interne dans vos textes et propose les ancres idéales.",
256
- inputs: [{ name: "article_text", label: "Texte de l'article", placeholder: "Collez votre article...", type: "textarea" }],
257
- systemPrompt: "Identifie les 5 meilleures opportunités de liens internes avec ancres exactes et URLs suggérées."
258
- },
259
- {
260
- id: "rankbot_assistant",
261
- category: "workflow",
262
- name: "RankBot — Assistant SEO 24/7",
263
- icon: "🤖",
264
- description: "Posez n'importe quelle question stratégique sur votre référencement, vos balises ou vos concurrents.",
265
- inputs: [{ name: "question", label: "Votre question SEO", placeholder: "Ex: Comment surclasser mon concurrent sur ce mot-clé ?" }],
266
- systemPrompt: "Tu es RankBot, l'expert SEO le plus expérimenté au monde. Réponds avec précision, méthodes concrètes et code si nécessaire."
267
- }
268
- ];
@@ -1,89 +0,0 @@
1
- /**
2
- * ✍️ Master Copywriting & AI-SEO Prompt Frameworks Engine
3
- *
4
- * Implements the complete set of formulas from marketingskills:
5
- * 1. 5 Battle-Tested Headline Formulas (Outcome, Problem, Audience, Differentiation, Proof)
6
- * 2. The Human Action Model (Discomfort ➔ Vision ➔ Path)
7
- * 3. 40-60 Word Concise AEO / GEO Definition Answer Block for LLM Citation
8
- * 4. Google AI Query Fan-Out Generator (5-10 concurrent semantic sub-queries)
9
- * 5. Value Equation & Grand Slam Offer Stack (Alex Hormozi)
10
- */
11
-
12
- export interface HeadlineVariants {
13
- outcomeFocused: string; // "{Achieve outcome} without {pain point}"
14
- problemFocused: string; // "Stop [pain]. Start [pleasure]."
15
- audienceFocused: string; // "{Service} pensé pour {target audience}"
16
- differentiationFocused: string; // "La méthode zéro-base de données pour {outcome}"
17
- proofFocused: string; // "Rejoignez 1 200+ entreprises qui ont {outcome}"
18
- }
19
-
20
- export interface HumanActionModelCopy {
21
- discomfortState: string; // Current painful friction
22
- visionState: string; // Desirable effortless future
23
- actionPath: string; // Immediate clear step
24
- }
25
-
26
- export class CopywritingFrameworksMaster {
27
- /**
28
- * 1. Generates 5 high-converting headline variants based on marketingskills formulas.
29
- */
30
- static generateHeadlines(opts: {
31
- serviceName: string;
32
- desiredOutcome: string;
33
- painPoint: string;
34
- targetAudience: string;
35
- metricProof: string;
36
- }): HeadlineVariants {
37
- return {
38
- outcomeFocused: `${opts.desiredOutcome} sans ${opts.painPoint}`,
39
- problemFocused: `Arrêtez ${opts.painPoint}. Commencez à ${opts.desiredOutcome}.`,
40
- audienceFocused: `${opts.serviceName} pour ${opts.targetAudience} : ${opts.desiredOutcome}`,
41
- differentiationFocused: `Le moyen le plus rapide de ${opts.desiredOutcome} sans configuration complexe`,
42
- proofFocused: `${opts.metricProof} font confiance à ${opts.serviceName} pour ${opts.desiredOutcome}`,
43
- };
44
- }
45
-
46
- /**
47
- * 2. Human Action Model (Discomfort ➔ Vision ➔ Path).
48
- */
49
- static generateHumanActionModel(opts: {
50
- painPoint: string;
51
- desiredOutcome: string;
52
- solutionName: string;
53
- timeframe: string;
54
- }): HumanActionModelCopy {
55
- return {
56
- discomfortState: `Aujourd'hui, vous perdez un temps précieux avec ${opts.painPoint}, ce qui freine directement votre croissance.`,
57
- visionState: `Imaginez pouvoir ${opts.desiredOutcome} automatiquement et recevoir des prospects qualifiés 24/7.`,
58
- actionPath: `Activez ${opts.solutionName} en moins de ${opts.timeframe} et débloquez votre plein potentiel d'acquisition.`,
59
- };
60
- }
61
-
62
- /**
63
- * 3. 40-60 Word Direct-Answer GEO Block (Gold standard for ChatGPT, Perplexity & Google AI Overviews).
64
- */
65
- static generateAeoAnswerBlock(opts: {
66
- term: string;
67
- definition: string;
68
- keyBenefit: string;
69
- proofStat: string;
70
- }): string {
71
- return `${opts.term} est ${opts.definition}. Cette solution permet de ${opts.keyBenefit}, enregistrant ${opts.proofStat}. Elle est conçue pour optimiser l'indexation sur les moteurs traditionnels et les réponses de recherche IA (ChatGPT Search, Perplexity).`;
72
- }
73
-
74
- /**
75
- * 4. Query Fan-Out Generator: 8 related queries that Google AI Overviews fan out to.
76
- */
77
- static generateQueryFanOut(topic: string, serviceSlug: string): string[] {
78
- return [
79
- `Comment fonctionne ${topic} ?`,
80
- `Meilleur outil pour ${topic} en 2026`,
81
- `Prix et tarif ${serviceSlug}`,
82
- `Avis clients et comparatif ${serviceSlug}`,
83
- `Alternatives à ${serviceSlug}`,
84
- `Intégration ${topic} avec CRM et site web`,
85
- `Comment automatiser ${topic} sans code ?`,
86
- `Calculateur de ROI pour ${topic}`,
87
- ];
88
- }
89
- }
@@ -1,105 +0,0 @@
1
- /**
2
- * ✍️ Automated Copywriting & CRO Injection Engine (Inspiration: marketingskills)
3
- *
4
- * Automatically generates high-converting sales copy blocks using proven frameworks:
5
- * 1. PAS (Problem - Agitation - Solution)
6
- * 2. AIDA (Attention - Interest - Desire - Action)
7
- * 3. Trust & Social Proof Elements (Risk Reducers, Guarantees, Badges)
8
- * 4. High-Conversion Sticky CTAs
9
- */
10
-
11
- export interface CopywritingInput {
12
- brandName: string;
13
- solutionName: string;
14
- targetNicheOrCity: string;
15
- painPoint: string;
16
- agitation: string;
17
- outcome: string;
18
- priceMonthly?: number;
19
- currencySymbol?: string;
20
- }
21
-
22
- export class CroCopywritingEngine {
23
- /**
24
- * Returns structured PAS (Problem - Agitation - Solution) text data.
25
- */
26
- static generatePasCopy(solutionName: string, targetNiche: string): { problem: string; agitation: string; solution: string } {
27
- return {
28
- problem: `Les professionnels de ${targetNiche} perdent jusqu'à 15 heures par semaine sur des tâches manuelles répétitives.`,
29
- agitation: `Sans automatisation, les relances sont oubliées, les opportunités clients s'évaporent et la rentabilité stagne.`,
30
- solution: `${solutionName} automatise 100% de vos processus pour vous permettre de vous concentrer sur vos clients et votre croissance.`,
31
- };
32
- }
33
-
34
- /**
35
- * Generates a PAS (Problem - Agitation - Solution) sales block in HTML.
36
- */
37
- static generatePasBlock(input: CopywritingInput): string {
38
- return `
39
- <section class="cro-pas-framework my-8 p-6 bg-slate-900 border border-slate-800 rounded-xl">
40
- <div class="pas-problem mb-4">
41
- <span class="inline-block text-xs font-semibold px-2 py-1 bg-red-950 text-red-400 rounded">Le Problème</span>
42
- <h3 class="text-xl font-bold text-white mt-2">${input.painPoint}</h3>
43
- </div>
44
- <div class="pas-agitation mb-4 text-slate-300">
45
- <p>${input.agitation}</p>
46
- </div>
47
- <div class="pas-solution mt-4 pt-4 border-t border-slate-800">
48
- <span class="inline-block text-xs font-semibold px-2 py-1 bg-emerald-950 text-emerald-400 rounded">La Solution ${input.brandName}</span>
49
- <h4 class="text-lg font-bold text-white mt-1">${input.solutionName} pour ${input.targetNicheOrCity}</h4>
50
- <p class="text-emerald-300 font-medium mt-1">➔ ${input.outcome}</p>
51
- </div>
52
- </section>
53
- `.trim();
54
- }
55
-
56
- /**
57
- * Generates a High-Converting Social Proof & Trust Badges block.
58
- */
59
- static generateTrustBadgesBlock(input: {
60
- guaranteeDays?: number;
61
- rating?: string;
62
- reviewCount?: number;
63
- freeTrialDays?: number;
64
- }): string {
65
- const guarantee = input.guaranteeDays ? `Garantie Satisfait ou Remboursé ${input.guaranteeDays} Jours` : "Sans engagement";
66
- const trial = input.freeTrialDays ? `Essai gratuit ${input.freeTrialDays} jours sans carte bancaire` : "Déploiement immédiat";
67
-
68
- return `
69
- <div class="cro-trust-badges flex flex-wrap gap-4 items-center justify-center my-6 text-sm text-slate-300">
70
- <div class="flex items-center gap-2 bg-slate-800/80 px-3 py-1.5 rounded-lg border border-slate-700">
71
- <span>🔒</span>
72
- <span>Paiement 100% Sécurisé & RGPD</span>
73
- </div>
74
- <div class="flex items-center gap-2 bg-slate-800/80 px-3 py-1.5 rounded-lg border border-slate-700">
75
- <span>⚡</span>
76
- <span>${trial}</span>
77
- </div>
78
- <div class="flex items-center gap-2 bg-slate-800/80 px-3 py-1.5 rounded-lg border border-slate-700">
79
- <span>🛡️</span>
80
- <span>${guarantee}</span>
81
- </div>
82
- </div>
83
- `.trim();
84
- }
85
-
86
- /**
87
- * Generates an Instant WhatsApp / Direct Call conversion trigger button (inspired by Jacobo).
88
- */
89
- static generateInstantConverterWidget(phoneNumber: string, brandOrMessage: string, serviceName?: string): string {
90
- const cleanPhone = phoneNumber.replace(/[^0-9+]/g, "");
91
- const msg = serviceName
92
- ? `Bonjour ${brandOrMessage}, je souhaite en savoir plus sur votre solution ${serviceName}.`
93
- : brandOrMessage;
94
- const encodedMsg = encodeURIComponent(msg);
95
-
96
- return `
97
- <div class="instant-converter-widget fixed bottom-6 right-6 z-50 flex flex-col gap-2">
98
- <a href="https://wa.me/${cleanPhone}?text=${encodedMsg}" target="_blank" rel="noopener noreferrer" class="flex items-center gap-2 px-4 py-3 bg-emerald-600 hover:bg-emerald-500 text-white font-bold rounded-full shadow-2xl transition duration-200">
99
- <svg class="w-6 h-6 fill-current" viewBox="0 0 24 24"><path d="M.057 24l1.687-6.163c-1.041-1.804-1.588-3.849-1.587-5.946.003-6.556 5.338-11.891 11.893-11.891 3.181.001 6.167 1.24 8.413 3.488 2.245 2.248 3.481 5.236 3.48 8.414-.003 6.557-5.338 11.892-11.893 11.892-1.99-.001-3.951-.5-5.688-1.448l-6.305 1.654zm6.597-3.807c1.676.995 3.276 1.591 5.392 1.592 5.448 0 9.886-4.434 9.889-9.885.002-5.462-4.415-9.89-9.881-9.892-5.452 0-9.887 4.434-9.889 9.884-.001 2.225.651 3.891 1.746 5.634l-.999 3.648 3.742-.981z"/></svg>
100
- <span>Discuter en direct</span>
101
- </a>
102
- </div>
103
- `.trim();
104
- }
105
- }