@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.
- package/README.md +47 -93
- package/dist/ai-copilot-client.d.ts +2 -0
- package/dist/built-in-locations.d.ts +18 -0
- package/dist/content-ai-arsenal.d.ts +28 -0
- package/dist/existing-media-harvester.d.ts +33 -0
- package/dist/extended-schemas.d.ts +84 -0
- package/dist/features-knowledge-harvester.d.ts +56 -0
- package/dist/geo-citation-scorer.d.ts +34 -0
- package/dist/i18n-detector.d.ts +1 -1
- package/dist/index.d.ts +32 -7
- package/dist/index.js +538 -82
- package/dist/index.mjs +2028 -163
- package/dist/internal-pagerank-graph.d.ts +59 -0
- package/dist/knowledge-bank-builder.d.ts +91 -0
- package/dist/marketing-skills-engine.d.ts +74 -0
- package/dist/matrix-engine.d.ts +26 -0
- package/dist/power-words-psychology.d.ts +27 -15
- package/dist/public-manifest-engine.d.ts +58 -0
- package/dist/rag-knowledge-engine.d.ts +50 -0
- package/dist/rate-limited-translator.d.ts +19 -0
- package/dist/token-quota-manager.d.ts +4 -0
- package/package.json +11 -3
- package/TUTORIEL_INTEGRATION_SITE.md +0 -283
- package/connectors/cloudflare-worker/worker.js +0 -106
- package/connectors/laravel/LynxSeoController.php +0 -37
- package/connectors/wordpress/lynxseo-admin-app.js +0 -2611
- package/connectors/wordpress/lynxseo-connector.php +0 -1712
- package/connectors/wordpress/lynxseo-connector.zip +0 -0
- package/lynxflow-seo-engine-1.2.0.tgz +0 -0
- package/src/ad-intelligence-cro.ts +0 -140
- package/src/ai-bots-log-analyzer.ts +0 -127
- package/src/ai-copilot-client.ts +0 -99
- package/src/analytics-client.ts +0 -315
- package/src/auth-key.ts +0 -262
- package/src/backlinks-client.ts +0 -85
- package/src/brand-dna-calendar.ts +0 -120
- package/src/brand-icons.ts +0 -138
- package/src/built-in-locations.ts +0 -170
- package/src/content-ai-arsenal.ts +0 -268
- package/src/copy-frameworks-master.ts +0 -89
- package/src/cro-copywriting-engine.ts +0 -105
- package/src/crosslink-scorer.ts +0 -101
- package/src/embeddable-seo-widget.ts +0 -57
- package/src/engine.test.ts +0 -386
- package/src/engine.ts +0 -813
- package/src/existing-media-harvester.ts +0 -98
- package/src/extended-schemas.ts +0 -589
- package/src/features-knowledge-harvester.ts +0 -190
- package/src/free-public-tools.ts +0 -224
- package/src/geo-mesh-linking.ts +0 -93
- package/src/google-business-profile.ts +0 -280
- package/src/i18n-detector.ts +0 -98
- package/src/i18n-dictionary.ts +0 -422
- package/src/index.ts +0 -164
- package/src/indexnow-client.ts +0 -94
- package/src/instant-matrix-search.ts +0 -48
- package/src/isr-cache-manager.ts +0 -78
- package/src/keyword-permutator.ts +0 -118
- package/src/knowledge-bank-builder.ts +0 -299
- package/src/knowledge-graph-linker.ts +0 -81
- package/src/lago-token-meter.ts +0 -120
- package/src/legal-disclaimers.ts +0 -407
- package/src/llm-content-cleaner.ts +0 -64
- package/src/llm-prompt.ts +0 -323
- package/src/master-marketing-engine.ts +0 -314
- package/src/matrix-engine.ts +0 -1204
- package/src/mcp-seo-server.ts +0 -108
- package/src/ngram-density-analyzer.ts +0 -108
- package/src/og-image-generator.ts +0 -109
- package/src/power-words-psychology.ts +0 -369
- package/src/public-manifest-engine.ts +0 -109
- package/src/rag-knowledge-engine.ts +0 -163
- package/src/rank-math-parity.ts +0 -235
- package/src/rate-limited-translator.ts +0 -110
- package/src/real-reviews-sync.ts +0 -207
- package/src/rss-syndication-feed.ts +0 -56
- package/src/schema-builder.ts +0 -134
- package/src/seo-opportunities-decay.ts +0 -154
- package/src/serp-client.ts +0 -89
- package/src/serp-history-alerts.ts +0 -75
- package/src/site-auditor.ts +0 -83
- package/src/site-crawler.ts +0 -406
- package/src/slug-engine.ts +0 -183
- package/src/social-ads-seo.ts +0 -211
- package/src/social-growth-suite.ts +0 -310
- package/src/social-trend-seo.ts +0 -103
- package/src/social-video-seo.ts +0 -100
- package/src/team-rbac.ts +0 -61
- package/src/technical-rules-auditor.ts +0 -171
- package/src/token-quota-manager.ts +0 -91
- package/src/types.ts +0 -143
- package/src/ui-icons.ts +0 -134
- package/src/urlytics-engine.ts +0 -97
- package/src/video-youtube-analyzer.ts +0 -81
- package/src/yoast-parity.ts +0 -161
- 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
|
-
}
|