What does Google say about SEO? /
Quick SEO Quiz

Test your SEO knowledge in 3 questions

Less than 30 seconds. Find out how much you really know about Google search.

🕒 ~30s 🎯 3 questions 📚 SEO Google

Official statement

Google sometimes rewrites titles to make them more understandable for users, particularly by reversing the brand name and the page title. This does not cause any issues. Titles with keyword stuffing or too many keywords are especially affected.
649:38
🎥 Source video

Extracted from a Google Search Central video

⏱ 985h14 💬 EN 📅 26/02/2021 ✂ 39 statements
Watch on YouTube (649:38) →
Other statements from this video 38
  1. 21:28 Les sitemaps suffisent-ils vraiment à déclencher un recrawl rapide de vos pages modifiées ?
  2. 21:28 Peut-on forcer Google à recrawler immédiatement après un changement de prix ?
  3. 40:33 La taille de police influence-t-elle réellement le classement Google ?
  4. 40:33 La taille de police CSS impacte-t-elle vraiment vos positions dans Google ?
  5. 70:28 Le contenu masqué derrière un bouton Read More est-il vraiment indexé par Google ?
  6. 70:28 Le contenu masqué derrière un bouton « Lire plus » est-il vraiment indexé par Google ?
  7. 98:45 Le maillage interne surpasse-t-il vraiment le sitemap pour signaler vos pages stratégiques à Google ?
  8. 98:45 Le maillage interne est-il vraiment plus décisif que le sitemap pour hiérarchiser vos pages ?
  9. 111:39 Pourquoi l'API Search Console ne remonte-t-elle pas les URLs référentes des 404 ?
  10. 144:15 Pourquoi Google continue-t-il à crawler des URLs 404 vieilles de plusieurs années ?
  11. 182:01 Faut-il vraiment s'inquiéter d'avoir 30% d'URLs en 404 sur son site ?
  12. 182:01 Un taux de 404 élevé peut-il vraiment pénaliser votre référencement ?
  13. 217:15 Comment cibler plusieurs pays avec un seul domaine sans perdre son référencement local ?
  14. 217:15 Peut-on vraiment cibler différents pays sur un même domaine sans passer par les sous-domaines ?
  15. 227:52 Faut-il vraiment utiliser hreflang quand on cible plusieurs pays avec la même langue ?
  16. 227:52 Faut-il vraiment combiner hreflang et ciblage géographique en Search Console ?
  17. 276:47 Pourquoi vos breadcrumbs en données structurées n'apparaissent-ils pas dans les SERP ?
  18. 285:28 Pourquoi vos rich results disparaissent dans les SERP classiques alors qu'ils s'affichent en recherche site: ?
  19. 293:25 Les breadcrumbs invisibles bloquent-ils vraiment vos rich results dans Google ?
  20. 325:12 Faut-il vraiment optimiser l'hydration JavaScript pour Googlebot en SSR ?
  21. 347:05 Le nombre de mots est-il vraiment inutile pour ranker sur Google ?
  22. 347:05 Le nombre de mots est-il vraiment un facteur de classement pour Google ?
  23. 400:17 Le volume de trafic de votre site impacte-t-il votre score Core Web Vitals ?
  24. 415:20 Le volume de trafic influence-t-il vraiment vos Core Web Vitals ?
  25. 420:26 Les Core Web Vitals comptent-ils vraiment dans le classement Google ?
  26. 422:01 Les Core Web Vitals peuvent-ils vraiment booster votre classement sans contenu pertinent ?
  27. 510:42 Pourquoi Google ne peut-il pas garantir l'affichage de la bonne version locale de votre site ?
  28. 529:29 Faut-il vraiment dupliquer tous les codes pays dans le hreflang pour cibler plusieurs régions ?
  29. 531:48 Pourquoi hreflang en Amérique latine impose-t-il tous les codes pays un par un ?
  30. 574:05 PageSpeed Insights mesure-t-il vraiment la performance de votre site ?
  31. 598:16 Peut-on vraiment passer du long-tail au short-tail sans changer de stratégie ?
  32. 616:26 Peut-on vraiment masquer les dates dans les résultats de recherche Google ?
  33. 635:21 Faut-il arrêter de mettre à jour les dates de publication pour améliorer son référencement ?
  34. 650:37 Google réécrit vos balises title : peut-on vraiment l'en empêcher ?
  35. 688:58 Faut-il vraiment signaler les bugs SERP avec des requêtes génériques pour espérer une réponse de Google ?
  36. 870:33 Les nouveaux sites e-commerce doivent-ils d'abord prouver leur légitimité hors de Google ?
  37. 937:08 La longueur du title est-elle vraiment un facteur de classement sur Google ?
  38. 940:42 La longueur des balises title est-elle vraiment un critère de classement Google ?
📅
Official statement from (5 years ago)
TL;DR

Google frequently modifies the title tags displayed in search results, often by reversing the brand name and title or by rephrasing titles stuffed with keywords. Mueller claims this is done to improve user understanding without penalties. For an SEO, this means that optimizing titles no longer guarantees they will appear exactly as intended — and it’s crucial to monitor how Google actually interprets them in the SERPs.

What you need to understand

Why does Google rewrite page titles?<\/h3>

Google no longer simply displays your <title><\/strong> tag faithfully. The algorithm analyzes the page content, the anchor texts of inbound links<\/strong>, H1 headings, and even the context of the query to generate a title that it believes better addresses the search intent.<\/p>

Specifically, if your title is "The 10 Best Cheap Nike Running Shoes 2024 Sale", Google might display "Nike — Running Shoes" or completely rephrase it to avoid keyword stuffing<\/strong>. The stated goal is to make the title more readable, but this takes away part of the SEO’s control over the message conveyed in the SERPs.<\/p>

What is brand name/title inversion?<\/h3>

Mueller explicitly mentions inversion<\/strong>: if your title is "SEO Tips | MySite", Google might display "MySite: SEO Tips". This cosmetic change might seem trivial, but it alters the visual hierarchy and impact at a first glance in the search results.<\/p>

This practice has been common for several years, but the statement formalizes that it is not a bug<\/strong> or anomaly — it's intentional behavior from the engine. Google believes that certain title structures are counterproductive for the user and reserves the right to correct them.<\/p>

Which titles are particularly affected by these rewrites?<\/h3>

Titles packed with keywords<\/strong> are at the forefront. If you have stacked variations of queries ("cheap sale running shoes for women men children"), expect Google to drastically simplify it.<\/p>

Titles that are too long (beyond 60-70 characters) are also truncated or rewritten. However, Google can also draw from your H1 tags<\/strong>, the text of your external anchors, or even the meta description if none of the elements seem satisfactory. This means that a perfectly optimized title can be ignored if Google believes another page element better describes the content.<\/p>

  • Keyword stuffing<\/strong>: avoid piling up keywords in the title — Google will systematically rephrase it.<\/li>
  • Brand/title structure<\/strong>: the order you choose can be reversed without notice or penalty.<\/li>
  • H1/title consistency<\/strong>: if your H1 is more explicit than your title, Google may use it instead.<\/li>
  • External anchors<\/strong>: Google analyzes how third-party sites name your pages to extract an alternative title.<\/li>
  • Optimal length<\/strong>: aim for 50-60 characters to limit rewrites, without absolute guarantees.<\/li><\/ul>

SEO Expert opinion

Is this statement consistent with on-the-ground observations?<\/h3>

Yes, but it downplays the extent of the phenomenon. SEOs have noted for years that Google rewrites titles in over 60% of cases<\/strong> (according to several independent studies). Mueller presents this as a momentary improvement when it has become the norm.<\/p>

The problem is that Google provides no precise criteria<\/strong> to anticipate these rewrites. We know that keyword stuffing is targeted, but what about a simple and optimized title that still gets rewritten? [To be verified]<\/strong>: Google claims this "causes no problems", but a poorly reformulated title can degrade the CTR and thus indirectly the rankings — this is not without consequence.<\/p>

What nuances should be added to this statement?<\/h3>

Mueller does not mention that rewrites can vary depending on the query<\/strong>. For the same page, Google may display a different title if the user searches for "running shoes" or "Nike Air Zoom". This means your title is dynamic, tailored to context — but you no longer control the message.<\/p>

Another point: saying "this does not cause problems" is a dangerous generalization. If Google replaces your carefully crafted title for CTR with a flat formula derived from the H1, your click-through rate may drop. And Google knows this perfectly well — it just doesn’t discuss it.<\/p>

In which cases does this rewriting pose a problem?<\/h3>

When your editorial strategy<\/strong> relies on a catchy title to generate clicks. If Google neutralizes it with a generic title, you lose a differentiation lever against competitors in the SERPs.<\/p>

E-commerce sites are particularly affected: a title like "Nike Air Zoom Pegasus 40 — 30% off | RunShop" may be replaced by "Nike Air Zoom Pegasus 40 — RunShop", removing the promotional argument that generates clicks.<\/p>

Warning:<\/strong> Google does not notify you when it rewrites your titles. You must manually monitor the SERPs or use tracking tools to detect discrepancies between your tag and what is actually displayed.<\/div></div> </div> <div class="section-card ai-section"> <h2>Practical impact and recommendations</h2> <div class="content" data-field="ai_practical_impact"><h3>What should be done concretely to limit rewrites?<\/h3><p>Write <strong>clear and descriptive titles<\/strong> that accurately reflect the page content. Avoid any repetition of keywords or artificial phrasing. Google rewrites a natural and relevant title less often than an over-optimized title.<\/p><p>Ensure that your <strong>H1 tag<\/strong> is consistent with your title, without being identical. If Google does not find your title satisfactory, it will draw from the H1 — so make sure this is also well-crafted. Also, check that the <strong>anchor texts of inbound links<\/strong> use phrasings aligned with your title strategy, as Google uses them as an alternative source.<\/p><h3>What mistakes should absolutely be avoided?<\/h3><p>Do not stuff your titles with keywords. "Nike Adidas cheap women's running shoes promo" will be systematically rewritten. Favor <strong>a main query + differentiator<\/strong>: "Women’s Running Shoes — 24-Hour Delivery".<\/p><p>Avoid titles that are too long. Beyond 60 characters, Google truncates or rewrites them. And never duplicate your title and H1 word-for-word — this deprives Google of a credible alternative and increases the risk of uncontrolled rewriting. Finally, do not rely on the meta description to compensate for a poor title: Google almost never uses it to generate a replacement title.<\/p><h3>How can I check that my titles are displayed correctly?<\/h3><p>Conduct <strong>regular manual searches<\/strong> on your target queries to compare the displayed title with your HTML tag. Use tools like Screaming Frog or SEMrush to extract crawled titles, then compare them with the actual SERPs.<\/p><p>Set up automated SERP monitoring on your strategic pages. Some tools allow you to receive alerts as soon as a title is modified by Google. If you notice systematic rewrites across a category of pages, it’s a sign of a <strong>structural issue<\/strong> to fix (keyword stuffing, overly long titles, H1/title inconsistency).<\/p><ul class="checklist"><li>Write titles of up to 50-60 characters, clear and descriptive<\/li><li>Remove any repetition or accumulation of keywords<\/li><li>Align the H1 tag with the title without duplicating them<\/li><li>Manually monitor the SERPs or use a tracking tool<\/li><li>Analyze backlink anchors to ensure their consistency with your title strategy<\/li><li>Fix pages whose titles are systematically rewritten<\/li><\/ul><div class="summary">The rewriting of titles by Google has become an unavoidable reality. You can no longer just optimize your <title> tags and expect them to display as they are. You now need to actively monitor the SERPs, align all signals (title, H1, external anchors), and accept a degree of unpredictability. These adjustments require fine technical and editorial expertise — if you do not have the internal resources to manage this monitoring and correct deviations, support from a specialized SEO agency can save you time and secure your performance in search results.<\/div></div> </div> <!-- FAQ --> <div class="section-card"> <h2>❓ Frequently Asked Questions</h2> <div class="faq-list"> <details class="faq-item"> <summary class="faq-question">Google pénalise-t-il les sites dont il réécrit les titles ?</summary> <div class="faq-answer">Non, la réécriture d'un title n'entraîne aucune pénalité algorithmique. Google modifie simplement l'affichage dans les SERP pour améliorer la lisibilité, sans impact direct sur le classement.</div> </details> <details class="faq-item"> <summary class="faq-question">Peut-on forcer Google à afficher exactement le title qu'on a rédigé ?</summary> <div class="faq-answer">Non, il n'existe aucun moyen technique de bloquer la réécriture. Google décide souverainement en fonction de la requête, du contenu de la page et de son algorithme d'affichage.</div> </details> <details class="faq-item"> <summary class="faq-question">La meta description peut-elle être utilisée pour générer un title de remplacement ?</summary> <div class="faq-answer">Très rarement. Google privilégie les H1, les ancres de backlinks ou le contenu principal de la page. La meta description sert quasi exclusivement au snippet sous le titre.</div> </details> <details class="faq-item"> <summary class="faq-question">Si Google réécrit mon title, cela impacte-t-il mon CTR ?</summary> <div class="faq-answer">Oui, potentiellement. Un title réécrité de manière moins percutante peut réduire le taux de clic, ce qui peut indirectement affecter vos positions à moyen terme.</div> </details> <details class="faq-item"> <summary class="faq-question">Faut-il dupliquer le title et le H1 pour éviter les réécritures ?</summary> <div class="faq-answer">Non, c'est contre-productif. Si Google estime votre title insatisfaisant et qu'il trouve un H1 identique, il cherchera une alternative ailleurs (ancres, contenu). Gardez-les cohérents mais distincts.</div> </details> </div> </div> <!-- Tags SEO --> <div class="seo-tags-block"> <span class="seo-tags-label">🏷 Related Topics</span> <div class="seo-tags"> <a href="/en/?q=balise+title" class="seo-tag-pill">balise title</a> <a href="/en/?q=r%C3%A9%C3%A9criture+SERP" class="seo-tag-pill">réécriture SERP</a> <a href="/en/?q=keyword+stuffing" class="seo-tag-pill">keyword stuffing</a> <a href="/en/?q=H1" class="seo-tag-pill">H1</a> <a href="/en/?q=CTR" class="seo-tag-pill">CTR</a> <a href="/en/?q=optimisation+on-page" class="seo-tag-pill">optimisation on-page</a> <a href="/en/?q=affichage+Google" class="seo-tag-pill">affichage Google</a> <a href="/en/?q=ancres+backlinks" class="seo-tag-pill">ancres backlinks</a> </div> </div> <!-- Categories --> <div class="declaration-tags"> <a href="/en/c/anciennete-historique" class="tag" style="background: #94a3b820; color: #94a3b8;">Domain Age & History</a> <a href="/en/c/contenu" class="tag" style="background: #10b98120; color: #10b981;">Content</a> <a href="/en/c/penalites-spam" class="tag" style="background: #dc262620; color: #dc2626;">Penalties & Spam</a> </div> <!-- Syntheses thematiques liees --> <!-- Autres declarations de la meme video YouTube --> <div class="section-card yt-same-video"> <h2> 🎥 From the same video <span class="yt-same-count">38</span> </h2> <p class="yt-same-intro"> Other SEO insights extracted from this same Google Search Central video · duration 985h14 · published on 26/02/2021 </p> <div class="related-grid yt-same-grid"> <a href="/en/d/les-sitemaps-permettent-d-informer-google-des-changements-de-page" class="related-item yt-same-item"> <div class="title">Les sitemaps suffisent-ils vraiment à déclencher un recrawl rapide de vos pages modifiées ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 21:28</span> </div> </a> <a href="/en/d/google-ne-peut-pas-garantir-le-recrawl-immediat-apres-changement-de-prix" class="related-item yt-same-item"> <div class="title">Peut-on forcer Google à recrawler immédiatement après un changement de prix ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 21:28</span> </div> </a> <a href="/en/d/la-taille-de-la-police-n-affecte-pas-le-classement-2021" class="related-item yt-same-item"> <div class="title">La taille de police influence-t-elle réellement le classement Google ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 40:33</span> </div> </a> <a href="/en/d/la-taille-de-la-police-n-affecte-pas-le-classement" class="related-item yt-same-item"> <div class="title">La taille de police CSS impacte-t-elle vraiment vos positions dans Google ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 40:33</span> </div> </a> <a href="/en/d/le-contenu-masque-par-read-more-read-less-est-indexe" class="related-item yt-same-item"> <div class="title">Le contenu masqué derrière un bouton Read More est-il vraiment indexé par Google ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 70:28</span> </div> </a> <a href="/en/d/contenu-masque-avec-read-more-est-indexable-s-il-est-charge-au-depart" class="related-item yt-same-item"> <div class="title">Le contenu masqué derrière un bouton « Lire plus » est-il vraiment indexé par Google ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 70:28</span> </div> </a> <a href="/en/d/l-importance-des-pages-se-communique-via-le-maillage-interne" class="related-item yt-same-item"> <div class="title">Le maillage interne surpasse-t-il vraiment le sitemap pour signaler vos pages stratégiques à Google ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 98:45</span> </div> </a> <a href="/en/d/l-importance-des-pages-se-signale-par-le-maillage-interne" class="related-item yt-same-item"> <div class="title">Le maillage interne est-il vraiment plus décisif que le sitemap pour hiérarchiser vos pages ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 98:45</span> </div> </a> <a href="/en/d/l-api-search-console-n-inclut-pas-les-url-referentes-pour-les-404" class="related-item yt-same-item"> <div class="title">Pourquoi l'API Search Console ne remonte-t-elle pas les URLs référentes des 404 ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 111:39</span> </div> </a> <a href="/en/d/google-garde-en-memoire-et-retente-les-anciennes-urls-pendant-des-annees" class="related-item yt-same-item"> <div class="title">Pourquoi Google continue-t-il à crawler des URLs 404 vieilles de plusieurs années ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 144:15</span> </div> </a> <a href="/en/d/les-404-sont-normaux-et-n-impactent-pas-la-qualite-du-site" class="related-item yt-same-item"> <div class="title">Faut-il vraiment s'inquiéter d'avoir 30% d'URLs en 404 sur son site ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 182:01</span> </div> </a> <a href="/en/d/un-taux-eleve-de-404-n-est-pas-un-signal-de-qualite-negatif" class="related-item yt-same-item"> <div class="title">Un taux de 404 élevé peut-il vraiment pénaliser votre référencement ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 182:01</span> </div> </a> <a href="/en/d/le-ciblage-geographique-fonctionne-au-niveau-sous-domaine-et-sous-dossier" class="related-item yt-same-item"> <div class="title">Comment cibler plusieurs pays avec un seul domaine sans perdre son référencement local ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 217:15</span> </div> </a> <a href="/en/d/le-ciblage-geographique-peut-etre-applique-au-niveau-du-sous-repertoire" class="related-item yt-same-item"> <div class="title">Peut-on vraiment cibler différents pays sur un même domaine sans passer par les sous-domaines ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 217:15</span> </div> </a> <a href="/en/d/hreflang-recommande-pour-contenu-multilingue-multi-pays" class="related-item yt-same-item"> <div class="title">Faut-il vraiment utiliser hreflang quand on cible plusieurs pays avec la même langue ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 227:52</span> </div> </a> <a href="/en/d/hreflang-recommande-en-complement-du-ciblage-geographique" class="related-item yt-same-item"> <div class="title">Faut-il vraiment combiner hreflang et ciblage géographique en Search Console ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 227:52</span> </div> </a> <a href="/en/d/les-breadcrumbs-doivent-etre-visibles-pour-generer-des-rich-results" class="related-item yt-same-item"> <div class="title">Pourquoi vos breadcrumbs en données structurées n'apparaissent-ils pas dans les SERP ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 276:47</span> </div> </a> <a href="/en/d/test-de-qualite-pour-rich-results-avec-une-recherche-site" class="related-item yt-same-item"> <div class="title">Pourquoi vos rich results disparaissent dans les SERP classiques alors qu'ils s'affichent en recherche site: ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 285:28</span> </div> </a> <a href="/en/d/les-breadcrumbs-doivent-etre-visibles-pour-les-rich-results" class="related-item yt-same-item"> <div class="title">Les breadcrumbs invisibles bloquent-ils vraiment vos rich results dans Google ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 293:25</span> </div> </a> <a href="/en/d/l-hydration-javascript-pour-ssr-n-est-pas-critique-pour-googlebot" class="related-item yt-same-item"> <div class="title">Faut-il vraiment optimiser l'hydration JavaScript pour Googlebot en SSR ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 325:12</span> </div> </a> <a href="/en/d/le-nombre-de-mots-n-est-pas-un-facteur-de-classement-2021" class="related-item yt-same-item"> <div class="title">Le nombre de mots est-il vraiment inutile pour ranker sur Google ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 347:05</span> </div> </a> <a href="/en/d/le-nombre-de-mots-n-est-ni-facteur-de-qualite-ni-de-classement" class="related-item yt-same-item"> <div class="title">Le nombre de mots est-il vraiment un facteur de classement pour Google ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 347:05</span> </div> </a> <a href="/en/d/core-web-vitals-ne-depend-pas-du-volume-de-trafic" class="related-item yt-same-item"> <div class="title">Le volume de trafic de votre site impacte-t-il votre score Core Web Vitals ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 400:17</span> </div> </a> <a href="/en/d/les-core-web-vitals-ne-dependent-pas-du-volume-de-trafic" class="related-item yt-same-item"> <div class="title">Le volume de trafic influence-t-il vraiment vos Core Web Vitals ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 415:20</span> </div> </a> <a href="/en/d/la-pertinence-reste-plus-importante-que-core-web-vitals" class="related-item yt-same-item"> <div class="title">Les Core Web Vitals comptent-ils vraiment dans le classement Google ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 420:26</span> </div> </a> <a href="/en/d/la-pertinence-reste-plus-importante-que-les-core-web-vitals" class="related-item yt-same-item"> <div class="title">Les Core Web Vitals peuvent-ils vraiment booster votre classement sans contenu pertinent ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 422:01</span> </div> </a> <a href="/en/d/impossible-de-garantir-l-affichage-de-la-bonne-version-locale" class="related-item yt-same-item"> <div class="title">Pourquoi Google ne peut-il pas garantir l'affichage de la bonne version locale de votre site ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 510:42</span> </div> </a> <a href="/en/d/hreflang-necessite-tous-les-codes-pays-pour-ciblage-multiple" class="related-item yt-same-item"> <div class="title">Faut-il vraiment dupliquer tous les codes pays dans le hreflang pour cibler plusieurs régions ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 529:29</span> </div> </a> <a href="/en/d/hreflang-pour-l-amerique-latine-necessite-tous-les-codes-pays" class="related-item yt-same-item"> <div class="title">Pourquoi hreflang en Amérique latine impose-t-il tous les codes pays un par un ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 531:48</span> </div> </a> <a href="/en/d/les-tests-pagespeed-insights-utilisent-des-donnees-predictives" class="related-item yt-same-item"> <div class="title">PageSpeed Insights mesure-t-il vraiment la performance de votre site ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 574:05</span> </div> </a> <a href="/en/d/aucune-astuce-pour-passer-du-long-tail-au-short-tail" class="related-item yt-same-item"> <div class="title">Peut-on vraiment passer du long-tail au short-tail sans changer de stratégie ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 598:16</span> </div> </a> <a href="/en/d/impossible-de-supprimer-completement-les-dates-des-snippets" class="related-item yt-same-item"> <div class="title">Peut-on vraiment masquer les dates dans les résultats de recherche Google ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 616:26</span> </div> </a> <a href="/en/d/la-date-affichee-n-est-pas-un-facteur-de-classement" class="related-item yt-same-item"> <div class="title">Faut-il arrêter de mettre à jour les dates de publication pour améliorer son référencement ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 635:21</span> </div> </a> <a href="/en/d/google-reecrit-les-titres-pour-ameliorer-la-comprehension" class="related-item yt-same-item"> <div class="title">Google réécrit vos balises title : peut-on vraiment l'en empêcher ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 650:37</span> </div> </a> <a href="/en/d/soumettre-des-requetes-generiques-pour-signaler-des-problemes" class="related-item yt-same-item"> <div class="title">Faut-il vraiment signaler les bugs SERP avec des requêtes génériques pour espérer une réponse de Google ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 688:58</span> </div> </a> <a href="/en/d/nouveaux-sites-necessitent-des-signaux-de-qualite-externes" class="related-item yt-same-item"> <div class="title">Les nouveaux sites e-commerce doivent-ils d'abord prouver leur légitimité hors de Google ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 870:33</span> </div> </a> <a href="/en/d/la-longueur-du-titre-n-est-pas-un-facteur-de-classement-strict" class="related-item yt-same-item"> <div class="title">La longueur du title est-elle vraiment un facteur de classement sur Google ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 937:08</span> </div> </a> <a href="/en/d/la-longueur-du-title-n-est-pas-un-facteur-de-classement-strict" class="related-item yt-same-item"> <div class="title">La longueur des balises title est-elle vraiment un critère de classement Google ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 940:42</span> </div> </a> </div> <a href="https://www.youtube.com/watch?v=PQrnhpNTOtE" target="_blank" rel="noopener" class="yt-same-source-link"> 🎥 Watch the full video on YouTube → </a> </div> <!-- Declarations similaires --> <div class="section-card"> <h2>Related statements</h2> <div class="related-grid"> <a href="/en/d/anyone-who-claims-to-know-everything-about-seo-is-a-fraud" class="related-item"> <div class="title">Why can't anyone truly master SEO 100%?</div> <div class="meta"> John Mueller · Apr 2026 · <span class="stars">★★★</span> </div> </a> <a href="/en/d/seo-is-complex-multifaceted-and-resilient" class="related-item"> <div class="title">Can we really afford to do anything in SEO without facing consequences?</div> <div class="meta"> John Mueller · Apr 2026 · <span class="stars">★★</span> </div> </a> <a href="/en/d/use-of-custom-javascript-metrics" class="related-item"> <div class="title">Does Google use custom JavaScript scripts to evaluate your pages?</div> <div class="meta"> Martin Splitt · Apr 2026 · <span class="stars">★★★</span> </div> </a> <a href="/en/d/the-importance-of-http-archive-for-seo" class="related-item"> <div class="title">Is Google finally revealing how it really analyzes your pages with HTTP Archive?</div> <div class="meta"> Gary Illyes · Apr 2026 · <span class="stars">★★★</span> </div> </a> <a href="/en/d/google-can-ignore-links-from-spammy-sites" class="related-item"> <div class="title">Can Google really ignore all links from a spammy site?</div> <div class="meta"> John Mueller · Apr 2026 · <span class="stars">★★★</span> </div> </a> <a href="/en/d/markdown-versions-are-not-very-useful-from-an-seo-perspective" class="related-item"> <div class="title">Should you offer Markdown versions of your content to enhance your visibility in AI-generated results?</div> <div class="meta"> John Mueller · Apr 2026 · <span class="stars">★★</span> </div> </a> </div> </div> <!-- Prev/Next --> <div class="prev-next"> <a href="/en/d/relevance-remains-more-important-than-core-web-vitals"> <div class="nav-label">« Previous</div> <div class="nav-title">Relevance Remains More Important Than Core Web Vit...</div> </a> <a href="/en/d/sitemaps-help-inform-google-of-page-changes" style="text-align: right;"> <div class="nav-label">Next »</div> <div class="nav-title">Sitemaps help inform Google of page changes...</div> </a> </div> <div class="back-link"> <a href="/en/" class="btn">« Back to results</a> </div> </div> <style> .comments-section { max-width: 860px; margin: 40px auto; padding: 0 20px; } .comments-title { font-size: 1.3rem; font-weight: 700; color: #1e293b; margin: 0 0 20px; padding-bottom: 12px; border-bottom: 2px solid #f1f5f9; } .comments-count { font-weight: 400; font-size: .9rem; color: #94a3b8; } .comments-empty { color: #94a3b8; font-style: italic; margin-bottom: 24px; } .comments-list { margin-bottom: 28px; } .comment-item { padding: 16px 0; border-bottom: 1px solid #f1f5f9; } .comment-item:last-child { border-bottom: none; } .comment-pending { background: #fffbeb; border-left: 3px solid #f59e0b; padding-left: 14px; border-radius: 6px; margin: 4px 0; } .comment-pending-badge { display: inline-block; font-size: .7rem; font-weight: 600; color: #92400e; background: #fef3c7; padding: 1px 8px; border-radius: 10px; margin-left: 8px; } .comment-meta { display: flex; align-items: center; gap: 10px; margin-bottom: 6px; } .comment-author { font-weight: 600; font-size: .95rem; color: #1e293b; } .comment-date { font-size: .8rem; color: #94a3b8; } .comment-body { font-size: .93rem; line-height: 1.6; color: #475569; } .comment-form { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 12px; padding: 24px; position: relative; } .comment-form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 16px; } .comment-form-field { margin-bottom: 12px; } .comment-form-field label { display: block; font-size: .85rem; font-weight: 600; color: #475569; margin-bottom: 4px; } .comment-form-field input, .comment-form-field textarea { width: 100%; padding: 10px 12px; border: 1px solid #d1d5db; border-radius: 8px; font-size: .9rem; font-family: inherit; background: #fff; transition: border-color .2s; box-sizing: border-box; } .comment-form-field input:focus, .comment-form-field textarea:focus { outline: none; border-color: #1a73e8; box-shadow: 0 0 0 3px rgba(26, 115, 232, .1); } .comment-form-field textarea { resize: vertical; min-height: 100px; } .comment-form-charcount { font-size: .75rem; color: #94a3b8; text-align: right; margin-top: 4px; } .comment-form-footer { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; } .comment-submit-btn { padding: 10px 24px; background: #1a73e8; color: #fff; border: none; border-radius: 8px; font-size: .9rem; font-weight: 600; cursor: pointer; transition: opacity .2s; } .comment-submit-btn:hover { opacity: .88; } .comment-submit-btn:disabled { opacity: .5; cursor: default; } .comment-form-notice { font-size: .8rem; color: #94a3b8; font-style: italic; } .comment-feedback { margin-top: 12px; padding: 10px 14px; border-radius: 8px; font-size: .9rem; font-weight: 500; } .comment-feedback-success { background: #d1fae5; color: #065f46; } .comment-feedback-error { background: #fee2e2; color: #991b1b; } @media (max-width: 768px) { .comment-form-row { grid-template-columns: 1fr; gap: 0; } .comments-section { padding: 0 16px; } } </style> <section class="comments-section" id="comments"> <h3 class="comments-title">💬 Comments <span class="comments-count">(0)</span></h3> <div class="comments-list" id="comments-list"> <p class="comments-empty" id="comments-empty">Be the first to comment.</p> </div> <form class="comment-form" id="comment-form" novalidate> <input type="hidden" name="page_type" value="declaration"> <input type="hidden" name="page_id" value="5844"> <input type="hidden" name="lang" value="en"> <!-- Honeypot anti-spam --> <div style="position:absolute;left:-9999px;" aria-hidden="true"> <label for="website">Do not fill this field</label> <input type="text" id="website" name="website" tabindex="-1" autocomplete="off"> </div> <div class="comment-form-row"> <div class="comment-form-field"> <label for="comment-name">Name or alias *</label> <input type="text" id="comment-name" name="author_name" required maxlength="100" autocomplete="name"> </div> <div class="comment-form-field"> <label for="comment-email">Email (optional, not published)</label> <input type="email" id="comment-email" name="author_email" maxlength="255" autocomplete="email"> </div> </div> <div class="comment-form-field"> <label for="comment-content">Your comment *</label> <textarea id="comment-content" name="content" required maxlength="2000" rows="4"></textarea> <div class="comment-form-charcount"><span id="comment-chars">2000</span> characters remaining</div> </div> <div class="comment-form-footer"> <button type="submit" class="comment-submit-btn">Post comment</button> <span class="comment-form-notice">Comments are moderated before publication.</span> </div> <div id="comment-feedback" class="comment-feedback" style="display:none;"></div> </form> </section> <script> (function() { var form = document.getElementById('comment-form'); if (!form) return; var textarea = document.getElementById('comment-content'); var charsEl = document.getElementById('comment-chars'); var feedback = document.getElementById('comment-feedback'); var API_URL = 'https://seoclaims.com/api/comments.php'; // Compteur de caracteres textarea.addEventListener('input', function() { var remaining = 2000 - this.value.length; charsEl.textContent = remaining; charsEl.style.color = remaining < 100 ? '#dc2626' : ''; }); form.addEventListener('submit', function(e) { e.preventDefault(); var btn = form.querySelector('.comment-submit-btn'); btn.disabled = true; var origText = btn.textContent; btn.textContent = '...'; feedback.style.display = 'none'; var data = { action: 'submit', page_type: form.querySelector('[name="page_type"]').value, page_id: parseInt(form.querySelector('[name="page_id"]').value), author_name: form.querySelector('[name="author_name"]').value.trim(), author_email: form.querySelector('[name="author_email"]').value.trim(), content: form.querySelector('[name="content"]').value.trim(), lang: form.querySelector('[name="lang"]').value, website: form.querySelector('[name="website"]').value }; fetch(API_URL, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }) .then(function(r) { return r.json(); }) .then(function(res) { if (res.success) { feedback.className = 'comment-feedback comment-feedback-success'; feedback.textContent = res.message; feedback.style.display = 'block'; // Inserer le commentaire en ligne (en attente de moderation) var list = document.getElementById('comments-list'); var empty = document.getElementById('comments-empty'); if (empty) empty.remove(); var pendingLabel = 'Awaiting moderation'; var now = new Date(); var day = String(now.getDate()).padStart(2,'0'); var month = String(now.getMonth()+1).padStart(2,'0'); var dateStr = day + '/' + month + '/' + now.getFullYear(); var div = document.createElement('div'); div.className = 'comment-item comment-pending'; div.innerHTML = '<div class="comment-meta">' + '<span class="comment-author">' + data.author_name.replace(/</g,'<') + '</span>' + '<span class="comment-date">' + dateStr + '</span>' + '<span class="comment-pending-badge">' + pendingLabel + '</span>' + '</div>' + '<div class="comment-body">' + data.content.replace(/</g,'<').replace(/\n/g,'<br>') + '</div>'; list.appendChild(div); form.querySelector('[name="content"]').value = ''; form.querySelector('[name="author_name"]').value = ''; form.querySelector('[name="author_email"]').value = ''; charsEl.textContent = '2000'; } else { feedback.className = 'comment-feedback comment-feedback-error'; feedback.textContent = res.error; feedback.style.display = 'block'; btn.disabled = false; btn.textContent = origText; } }) .catch(function() { feedback.className = 'comment-feedback comment-feedback-error'; feedback.textContent = 'Erreur réseau'; feedback.style.display = 'block'; btn.disabled = false; btn.textContent = origText; }); }); })(); </script> <section class="nl-inline-section"> <div class="nl-inline-inner"> <div class="nl-inline-icon">🔔</div> <div class="nl-inline-text"> <h2 class="nl-inline-headline">Get real-time analysis of the latest Google SEO declarations</h2> <p class="nl-inline-sub">Be the first to know every time a new official Google statement drops — with full expert analysis.</p> </div> <div class="nl-inline-action"> <form class="nl-inline-form" id="nl-inline-form" novalidate> <input type="email" name="email" placeholder="Your email address" required autocomplete="email"> <button type="submit">Subscribe for free</button> </form> <div class="nl-inline-privacy">No spam. Unsubscribe in one click.</div> </div> </div> </section> <style> .nl-inline-section { background: linear-gradient(135deg, #0f172a 0%, #1e3a5f 50%, #0f172a 100%); padding: 52px 24px; margin: 0; } .nl-inline-inner { max-width: 960px; margin: 0 auto; display: grid; grid-template-columns: auto 1fr auto; gap: 24px 32px; align-items: center; } .nl-inline-icon { font-size: 40px; line-height: 1; } .nl-inline-headline { font-size: clamp(16px, 2vw, 20px); font-weight: 700; color: #f0f9ff; margin: 0 0 6px; line-height: 1.35; } .nl-inline-sub { font-size: 14px; color: #7fb8d8; margin: 0; line-height: 1.55; } .nl-inline-action { min-width: 300px; } .nl-inline-form { display: flex; gap: 8px; } .nl-inline-form input[type="email"] { flex: 1; padding: 11px 14px; border: 1px solid rgba(14,165,233,.4); border-radius: 8px; background: rgba(255,255,255,.07); color: #f0f9ff; font-size: 14px; outline: none; min-width: 0; transition: border-color .2s, background .2s; } .nl-inline-form input[type="email"]::placeholder { color: #5a91b0; } .nl-inline-form input[type="email"]:focus { border-color: #0ea5e9; background: rgba(255,255,255,.12); } .nl-inline-form button { padding: 11px 18px; background: linear-gradient(135deg, #0ea5e9, #7c3aed); color: #fff; border: none; border-radius: 8px; font-size: 14px; font-weight: 600; cursor: pointer; white-space: nowrap; transition: opacity .2s; } .nl-inline-form button:hover { opacity: .88; } .nl-inline-form button:disabled { opacity: .55; cursor: default; } .nl-inline-privacy { font-size: 12px; color: #4a7a96; margin-top: 7px; text-align: center; } @media (max-width: 768px) { .nl-inline-inner { grid-template-columns: auto 1fr; grid-template-rows: auto auto; } .nl-inline-action { grid-column: 1 / -1; min-width: 0; } .nl-inline-form { flex-wrap: wrap; } .nl-inline-form input[type="email"] { min-width: 200px; } } </style> <script> (function() { var form = document.getElementById('nl-inline-form'); if (!form) return; var LANG = 'en'; var API_URL = 'https://seoclaims.com/api/subscribe'; var COOKIE = 'nl_subscribed'; var MSG = { success: 'You\'re in! You\'ll receive the next analyses.', already: 'You are already subscribed.', error: 'Something went wrong, please try again.', }; function getCookie(n) { return document.cookie.split(';').some(function(c) { return c.trim().startsWith(n + '='); }); } function setCookie(n, days) { var d = new Date(); d.setDate(d.getDate() + days); document.cookie = n + '=1;expires=' + d.toUTCString() + ';path=/;SameSite=Lax'; } // Masquer si deja inscrit if (getCookie(COOKIE)) { var section = form.closest('.nl-inline-section'); if (section) section.style.display = 'none'; return; } form.addEventListener('submit', function(e) { e.preventDefault(); var email = form.querySelector('input[type="email"]').value.trim(); var btn = form.querySelector('button'); btn.disabled = true; var orig = btn.textContent; btn.textContent = '...'; fetch(API_URL, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email: email, lang: LANG }) }) .then(function(r) { return r.json(); }) .then(function(data) { if (data.success) { setCookie(COOKIE, 365); form.innerHTML = '<div style="color:#0d9488;font-weight:600;font-size:15px;padding:10px 0;">✓ ' + (data.already ? MSG.already : MSG.success) + '</div>'; // Masquer aussi banniere footer et popup si presents var banner = document.getElementById('nl-banner'); var popup = document.getElementById('nl-popup'); if (banner) banner.style.display = 'none'; if (popup) popup.style.display = 'none'; } else { btn.disabled = false; btn.textContent = orig; var err = form.querySelector('.nl-inline-err'); if (!err) { err = document.createElement('div'); err.className = 'nl-inline-err'; err.style.cssText = 'color:#dc2626;font-size:13px;margin-top:6px;'; form.parentNode.insertBefore(err, form.nextSibling); } err.textContent = data.error || MSG.error; } }) .catch(function() { btn.disabled = false; btn.textContent = orig; }); }); })(); </script> <footer class="site-footer"> <div class="footer-inner"> <!-- ====== Row 1 : About + Navigation + Resources ====== --> <div class="footer-top"> <div> <div class="footer-brand"> <picture> <source srcset="https://seoclaims.com/assets/logo.webp" type="image/webp"> <img src="https://seoclaims.com/assets/logo.png" alt="SEO Declarations" class="footer-logo" loading="lazy" width="132" height="72"> </picture> </div> <p>SEO Claims collects, analyzes and translates <a href="/en/declarations">official Google statements</a> about search engine optimization, sourced from <a href="/en/articles">published articles</a> and <a href="/en/videos">YouTube videos</a> by Google Search Central. Each statement is enriched with <a href="/en/declarations">AI analysis</a>, classified by <a href="/en/declarations">SEO category</a> and attributed to its <a href="/en/speaker/john-mueller">author</a>. An essential tool for SEO professionals who want to know exactly what Google recommends.</p> </div> <div> <div class="footer-heading">Navigation</div> <nav class="footer-nav"> <a href="/en/declarations" class="footer-link">Statements</a> <a href="/en/labs/" class="footer-link">Labs SEO</a> <a href="/en/speaker/john-mueller" class="footer-link">Authors</a> <a href="/en/sitemap-declarations" class="footer-link">Sitemap</a> <a href="/en/top-seo-agencies-france" class="footer-link">Top SEO Agencies</a> <a href="/en/legal" class="footer-link">Legal Notice</a> </nav> </div> <div> <div class="footer-heading">Resources</div> <nav class="footer-nav"> <a href="https://search.google.com/search-console" target="_blank" rel="noopener" class="footer-link">Google Search Console</a> <a href="https://pagespeed.web.dev/" target="_blank" rel="noopener" class="footer-link">PageSpeed Insights</a> <a href="https://search.google.com/test/rich-results" target="_blank" rel="noopener" class="footer-link">Rich Results Test</a> <a href="https://developer.chrome.com/docs/lighthouse/" target="_blank" rel="noopener" class="footer-link">Lighthouse</a> <a href="https://developers.google.com/search/docs" target="_blank" rel="noopener" class="footer-link">Google Search Guidelines</a> <a href="/en/google-tools" class="footer-link" style="color: #60a5fa; font-weight: 600;">All Google Tools →</a> </nav> </div> </div> <!-- ====== Row 2 : 3 piliers SEO — Top 5 categories par vues ====== --> <div class="footer-pillars"> <!-- Semantique --> <details class="footer-pillar-details" open> <summary class="footer-pillar-title"> <span style="display:flex;align-items:center;gap:8px;"> <span class="footer-pillar-dot" style="background: #60a5fa;"></span> <span class="footer-pillar-label" style="color: #60a5fa;">Semantic</span> </span> </summary> <nav class="footer-pillar-nav"> <a href="/en/c/ia-seo" class="footer-pillar-link"> <span>AI & SEO</span> <span class="footer-pillar-count">9673</span> </a> <a href="/en/c/contenu" class="footer-pillar-link"> <span>Content</span> <span class="footer-pillar-count">5585</span> </a> <a href="/en/c/nom-domaine" class="footer-pillar-link"> <span>Domain Name</span> <span class="footer-pillar-count">1943</span> </a> <a href="/en/c/pdf-fichiers" class="footer-pillar-link"> <span>PDF & Files</span> <span class="footer-pillar-count">497</span> </a> <a href="/en/c/discover-actualites" class="footer-pillar-link"> <span>Discover & News</span> <span class="footer-pillar-count">343</span> </a> </nav> </details> <!-- Technique --> <details class="footer-pillar-details" open> <summary class="footer-pillar-title"> <span style="display:flex;align-items:center;gap:8px;"> <span class="footer-pillar-dot" style="background: #34d399;"></span> <span class="footer-pillar-label" style="color: #34d399;">Technical</span> </span> </summary> <nav class="footer-pillar-nav"> <a href="/en/c/anciennete-historique" class="footer-pillar-link"> <span>Domain Age & History</span> <span class="footer-pillar-count">6840</span> </a> <a href="/en/c/crawl-indexation" class="footer-pillar-link"> <span>Crawl & Indexing</span> <span class="footer-pillar-count">3560</span> </a> <a href="/en/c/javascript-technique" class="footer-pillar-link"> <span>JavaScript & Technical SEO</span> <span class="footer-pillar-count">2358</span> </a> <a href="/en/c/search-console" class="footer-pillar-link"> <span>Search Console</span> <span class="footer-pillar-count">1848</span> </a> <a href="/en/c/performance-web" class="footer-pillar-link"> <span>Web Performance</span> <span class="footer-pillar-count">105</span> </a> </nav> </details> <!-- Autorite --> <details class="footer-pillar-details" open> <summary class="footer-pillar-title"> <span style="display:flex;align-items:center;gap:8px;"> <span class="footer-pillar-dot" style="background: #fbbf24;"></span> <span class="footer-pillar-label" style="color: #fbbf24;">Authority</span> </span> </summary> <nav class="footer-pillar-nav"> <a href="/en/c/liens-backlinks" class="footer-pillar-link"> <span>Links & Backlinks</span> <span class="footer-pillar-count">2076</span> </a> <a href="/en/c/reseaux-sociaux" class="footer-pillar-link"> <span>Social Media</span> <span class="footer-pillar-count">541</span> </a> <a href="/en/c/penalites-spam" class="footer-pillar-link"> <span>Penalties & Spam</span> <span class="footer-pillar-count">515</span> </a> <a href="/en/c/algorithmes" class="footer-pillar-link"> <span>Algorithms</span> <span class="footer-pillar-count">416</span> </a> <a href="/en/c/recherche-locale" class="footer-pillar-link"> <span>Local Search</span> <span class="footer-pillar-count">116</span> </a> </nav> </details> </div> <!-- ====== Row 3 : Dernieres prises de parole ====== --> <div class="footer-popular"> <div class="footer-popular-title">Latest Google statements on SEO</div> <div class="footer-popular-grid"> <a href="/en/d/celui-qui-dit-tout-savoir-sur-le-seo-est-un-imposteur" class="footer-popular-link"> <span class="footer-popular-meta"> <span class="footer-popular-date">Apr 2026</span> <span class="footer-popular-speaker">John Mueller</span> </span> <span class="footer-popular-text">Pourquoi personne ne peut vraiment maîtriser le SEO à 100% ?</span> </a> <a href="/en/d/le-seo-est-complexe-multiforme-et-resilient" class="footer-popular-link"> <span class="footer-popular-meta"> <span class="footer-popular-date">Apr 2026</span> <span class="footer-popular-speaker">John Mueller</span> </span> <span class="footer-popular-text">Peut-on vraiment se permettre de faire n'importe quoi en SEO sans conséq…</span> </a> <a href="/en/d/usage-de-custom-javascript-metrics" class="footer-popular-link"> <span class="footer-popular-meta"> <span class="footer-popular-date">Apr 2026</span> <span class="footer-popular-speaker">Martin Splitt</span> </span> <span class="footer-popular-text">Google utilise-t-il des scripts JavaScript personnalisés pour évaluer vo…</span> </a> <a href="/en/d/requete-sql-dans-bigquery-pour-l-analyse-seo" class="footer-popular-link"> <span class="footer-popular-meta"> <span class="footer-popular-date">Apr 2026</span> <span class="footer-popular-speaker">Gary Illyes</span> </span> <span class="footer-popular-text">Faut-il vraiment maîtriser SQL et BigQuery pour faire du SEO en 2025 ?</span> </a> <a href="/en/d/recommandations-sur-la-taille-des-fichiers-robots-txt" class="footer-popular-link"> <span class="footer-popular-meta"> <span class="footer-popular-date">Apr 2026</span> <span class="footer-popular-speaker">Martin Splitt</span> </span> <span class="footer-popular-text">Faut-il vraiment respecter la limite de 100KB pour votre fichier robots.…</span> </a> <a href="/en/d/importancia-d-http-archive-pour-le-seo" class="footer-popular-link"> <span class="footer-popular-meta"> <span class="footer-popular-date">Apr 2026</span> <span class="footer-popular-speaker">Gary Illyes</span> </span> <span class="footer-popular-text">HTTP Archive : Google révèle-t-il enfin comment il analyse vraiment vos …</span> </a> <a href="/en/d/utilisation-de-bigquery-pour-analyser-les-sites-web" class="footer-popular-link"> <span class="footer-popular-meta"> <span class="footer-popular-date">Apr 2026</span> <span class="footer-popular-speaker">Martin Splitt</span> </span> <span class="footer-popular-text">BigQuery est-il vraiment indispensable pour analyser vos données SEO à g…</span> </a> <a href="/en/d/nouvelle-collecte-de-donnees-robots-txt-avec-http-archive" class="footer-popular-link"> <span class="footer-popular-meta"> <span class="footer-popular-date">Apr 2026</span> <span class="footer-popular-speaker">Gary Illyes</span> </span> <span class="footer-popular-text">Pourquoi Google publie-t-il soudainement des données massives sur l'usag…</span> </a> </div> </div> <!-- ====== Row 4 : Copyright ====== --> <div class="footer-bottom"> <span>© 2026 SEO Declarations. All rights reserved.</span> <span>This site is not affiliated with Google. Statements presented are from public Google communications.</span> </div> </div> </footer> <!-- ====== Popup Newsletter (une fois par session) ====== --> <div class="nl-popup-overlay" id="nl-popup" style="display:none;" role="dialog" aria-modal="true" aria-label="Get a complete real-time analysis of the latest Google SEO declarations"> <div class="nl-popup-box"> <button class="nl-popup-close" id="nl-popup-close" aria-label="Close">×</button> <div class="nl-popup-header"> <div class="nl-popup-badge">Stay ahead</div> <h3 class="nl-popup-title">Get a complete real-time analysis of the latest Google SEO declarations</h3> <p class="nl-popup-sub">Be the first to know every time a new official Google SEO statement drops, with full analysis included.</p> </div> <form class="nl-form nl-popup-form" data-lang="en" id="nl-popup-form"> <div class="nl-popup-input-group"> <input type="email" name="email" placeholder="Your email address" required autocomplete="email"> <button type="submit">Subscribe for free</button> </div> </form> <div class="nl-popup-trust"> <span class="nl-popup-trust-icon">🔒</span> <span>No spam. Unsubscribe in one click.</span> </div> </div> </div> <style> /* === Newsletter Popup === */ .nl-popup-overlay { position: fixed; inset: 0; background: rgba(15,23,42,.6); backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); z-index: 9999; display: flex; align-items: center; justify-content: center; padding: 20px; animation: nlFadeIn .3s ease; } .nl-popup-box { background: linear-gradient(165deg, #ffffff 0%, #f8fafc 100%); border-radius: 20px; padding: 40px 36px 32px; max-width: 460px; width: 100%; position: relative; box-shadow: 0 25px 80px rgba(0,0,0,.2), 0 0 0 1px rgba(0,0,0,.05); animation: nlSlideUp .4s cubic-bezier(.16,1,.3,1); text-align: center; } .nl-popup-close { position: absolute; top: 12px; right: 14px; background: none; border: none; font-size: 22px; color: #94a3b8; cursor: pointer; line-height: 1; padding: 6px 10px; border-radius: 8px; transition: color .2s, background .2s; } .nl-popup-close:hover { color: #374151; background: #f1f5f9; } .nl-popup-header { margin-bottom: 24px; } .nl-popup-badge { display: inline-block; background: linear-gradient(135deg, #0ea5e9, #7c3aed); color: #fff; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .08em; padding: 5px 14px; border-radius: 20px; margin-bottom: 16px; } .nl-popup-title { font-size: 22px; font-weight: 800; color: #0f172a; line-height: 1.3; margin: 0 0 10px; } .nl-popup-sub { font-size: 14px; color: #64748b; line-height: 1.6; margin: 0; } .nl-popup-input-group { display: flex; gap: 0; border-radius: 12px; overflow: hidden; box-shadow: 0 2px 8px rgba(0,0,0,.08), 0 0 0 1px rgba(0,0,0,.06); } .nl-popup-form input[type="email"] { flex: 1; padding: 14px 16px; background: #fff; color: #1e293b; border: none; font-size: 15px; outline: none; min-width: 0; } .nl-popup-form input[type="email"]::placeholder { color: #94a3b8; } .nl-popup-form button { padding: 14px 22px; background: linear-gradient(135deg, #0ea5e9, #6d28d9); color: #fff; border: none; font-size: 14px; font-weight: 700; cursor: pointer; white-space: nowrap; transition: opacity .2s; } .nl-popup-form button:hover { opacity: .9; } .nl-popup-form button:disabled { opacity: .5; cursor: default; } .nl-popup-trust { display: flex; align-items: center; justify-content: center; gap: 6px; margin-top: 14px; font-size: 12px; color: #94a3b8; } .nl-popup-trust-icon { font-size: 13px; } .nl-popup-msg { padding: 16px; border-radius: 12px; font-weight: 600; font-size: 15px; margin-top: 4px; } .nl-popup-msg.success { background: #ecfdf5; color: #059669; } .nl-popup-msg.error { background: #fef2f2; color: #dc2626; } @media (max-width: 480px) { .nl-popup-box { padding: 32px 20px 24px; } .nl-popup-input-group { flex-direction: column; border-radius: 12px; } .nl-popup-form input[type="email"] { border-bottom: 1px solid #e2e8f0; } .nl-popup-form button { padding: 14px; border-radius: 0 0 12px 12px; } .nl-popup-title { font-size: 19px; } } @keyframes nlFadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes nlSlideUp { from { transform: translateY(30px) scale(.97); opacity: 0; } to { transform: translateY(0) scale(1); opacity: 1; } } </style> <script> (function() { var LANG = 'en'; var API_URL = 'https://seoclaims.com/api/subscribe'; var COOKIE = 'nl_subscribed'; var SESSION_KEY = 'nl_popup_shown'; var MSG = { success: 'You\'re in! Check your inbox.', already: 'You are already subscribed.', error: 'Something went wrong, please try again.', }; function getCookie(n) { return document.cookie.split(';').some(c => c.trim().startsWith(n + '=')); } function setCookie(n, days) { var d = new Date(); d.setDate(d.getDate() + days); document.cookie = n + '=1;expires=' + d.toUTCString() + ';path=/;SameSite=Lax'; } function closePopup(popup) { popup.style.opacity = '0'; setTimeout(function() { popup.style.display = 'none'; }, 300); sessionStorage.setItem(SESSION_KEY, '1'); } function showMsg(container, text, type) { var existing = container.querySelector('.nl-popup-msg'); if (existing) existing.remove(); var el = document.createElement('div'); el.className = 'nl-popup-msg ' + type; el.textContent = text; container.appendChild(el); } document.addEventListener('DOMContentLoaded', function() { var popup = document.getElementById('nl-popup'); var popupForm = document.getElementById('nl-popup-form'); var closeBtn = document.getElementById('nl-popup-close'); if (!popup || !popupForm) return; // Ne pas afficher si : deja inscrit OU deja vu cette session if (getCookie(COOKIE) || sessionStorage.getItem(SESSION_KEY)) return; // Afficher apres 30% scroll OU 20 secondes var nlShown = false; function showNlPopup() { if (nlShown) return; nlShown = true; popup.style.display = 'flex'; sessionStorage.setItem(SESSION_KEY, '1'); } var scrollHandler = function() { var pct = window.scrollY / (document.body.scrollHeight - window.innerHeight); if (pct > 0.3) { showNlPopup(); window.removeEventListener('scroll', scrollHandler); } }; window.addEventListener('scroll', scrollHandler, {passive: true}); setTimeout(showNlPopup, 20000); closeBtn.addEventListener('click', function() { closePopup(popup); }); popup.addEventListener('click', function(e) { if (e.target === popup) closePopup(popup); }); document.addEventListener('keydown', function(e) { if (e.key === 'Escape' && popup.style.display === 'flex') closePopup(popup); }); popupForm.addEventListener('submit', function(e) { e.preventDefault(); var email = popupForm.querySelector('input[type="email"]').value.trim(); var btn = popupForm.querySelector('button[type="submit"]'); btn.disabled = true; var origText = btn.textContent; btn.textContent = '...'; fetch(API_URL, { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({email: email, lang: LANG}) }) .then(function(r) { return r.json(); }) .then(function(data) { btn.disabled = false; btn.textContent = origText; if (data.success) { setCookie(COOKIE, 365); popupForm.style.display = 'none'; showMsg(popup.querySelector('.nl-popup-box'), data.already ? MSG.already : MSG.success, 'success'); // Masquer aussi le bloc inline si present var inline = document.querySelector('.nl-inline-section'); if (inline) inline.style.display = 'none'; setTimeout(function() { closePopup(popup); }, 2500); } else { showMsg(popup.querySelector('.nl-popup-box'), data.error || MSG.error, 'error'); } }) .catch(function() { btn.disabled = false; btn.textContent = origText; showMsg(popup.querySelector('.nl-popup-box'), MSG.error, 'error'); }); }); }); })(); </script> <!-- WebSite + Organization Schema --> <script type="application/ld+json"> { "@context": "https://schema.org", "@graph": [ { "@type": "WebSite", "@id": "https://seoclaims.com/#website", "name": "SEO Declarations", "url": "https://seoclaims.com", "inLanguage": [ "fr-FR", "en" ], "publisher": { "@id": "https://seoclaims.com/#organization" }, "potentialAction": { "@type": "SearchAction", "target": { "@type": "EntryPoint", "urlTemplate": "https://seoclaims.com/?q={search_term_string}" }, "query-input": "required name=search_term_string" } }, { "@type": "Organization", "@id": "https://seoclaims.com/#organization", "name": "SEO Declarations", "url": "https://seoclaims.com", "logo": { "@type": "ImageObject", "url": "https://seoclaims.com/assets/logo.png", "width": 512, "height": 512 }, "description": "Search engine for official Google SEO declarations, bilingual analysis and AI-enriched context.", "knowsAbout": [ "Search Engine Optimization", "Google Search", "Core Web Vitals", "Technical SEO", "Content SEO", "Link building", "Structured data", "AI search optimization" ], "sameAs": [] } ] }</script> <!-- ==================== CHATBOT WIDGET ==================== --> <button id="cbw-launcher" type="button" aria-label="Ask the SEO assistant a question" title="Ask the SEO assistant a question"> <svg viewBox="0 0 24 24" width="26" height="26" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path> </svg> <span class="cbw-launcher-label">SEO Assistant</span> <span class="cbw-launcher-pulse" aria-hidden="true"></span> </button> <div id="cbw-panel" role="dialog" aria-label="SEO Assistant" aria-hidden="true"> <div class="cbw-head"> <div class="cbw-head-txt"> <strong>SEO Assistant</strong> <span>Powered by official Google declarations</span> </div> <div class="cbw-head-actions"> <a href="https://seoclaims.com/en/chatbot" class="cbw-icon-btn" title="Open full version" aria-label="Open full version"> <svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 3h6v6"></path><path d="M10 14L21 3"></path><path d="M21 14v5a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5"></path></svg> </a> <button type="button" id="cbw-close" class="cbw-icon-btn" title="Close" aria-label="Close"> <svg viewBox="0 0 24 24" width="20" height="20" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6L6 18"></path><path d="M6 6l12 12"></path></svg> </button> </div> </div> <div class="cbw-body" id="cbw-messages" aria-live="polite"> <div class="cbw-msg assistant cbw-welcome">Hi! Ask me anything about SEO and Google — I answer with cited sources from official declarations.</div> </div> <form class="cbw-form" id="cbw-form" autocomplete="off"> <textarea id="cbw-input" rows="1" placeholder="Ask a question..." maxlength="500" required></textarea> <button type="submit" id="cbw-send" aria-label="Send"> <svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><line x1="22" y1="2" x2="11" y2="13"></line><polygon points="22 2 15 22 11 13 2 9 22 2"></polygon></svg> </button> </form> </div> <style> #cbw-launcher { position: fixed; bottom: 24px; right: 24px; z-index: 9998; display: flex; align-items: center; gap: 8px; padding: 14px 20px 14px 16px; background: linear-gradient(135deg, #7c3aed 0%, #5b21b6 100%); color: #fff; border: none; border-radius: 999px; box-shadow: 0 8px 24px rgba(124,58,237,.35); font-family: inherit; font-size: .93rem; font-weight: 600; cursor: pointer; transition: transform .15s ease, box-shadow .15s ease; } #cbw-launcher:hover { transform: translateY(-2px); box-shadow: 0 12px 28px rgba(124,58,237,.45); } #cbw-launcher svg { flex-shrink: 0; } .cbw-launcher-label { white-space: nowrap; } .cbw-launcher-pulse { position: absolute; top: -2px; right: -2px; width: 12px; height: 12px; background: #10b981; border: 2px solid #fff; border-radius: 50%; animation: cbwPulse 2s infinite; } @keyframes cbwPulse { 0%,100% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.3); opacity: .7; } } #cbw-panel { position: fixed; bottom: 24px; right: 24px; z-index: 9999; width: 400px; max-width: calc(100vw - 32px); height: 560px; max-height: calc(100vh - 48px); background: #fff; border-radius: 16px; box-shadow: 0 20px 60px rgba(0,0,0,.2); display: grid; grid-template-rows: auto 1fr auto; overflow: hidden; transform: translateY(20px) scale(.96); opacity: 0; pointer-events: none; transition: transform .22s ease, opacity .22s ease; font-family: inherit; } #cbw-panel[aria-hidden="false"] { transform: translateY(0) scale(1); opacity: 1; pointer-events: auto; } #cbw-panel[aria-hidden="false"] ~ #cbw-launcher, body.cbw-open #cbw-launcher { opacity: 0; pointer-events: none; transform: scale(.8); } .cbw-head { display: flex; align-items: center; justify-content: space-between; padding: 14px 16px; background: linear-gradient(135deg, #7c3aed, #5b21b6); color: #fff; } .cbw-head-txt strong { display: block; font-size: .97rem; line-height: 1.2; } .cbw-head-txt span { display: block; font-size: .75rem; opacity: .85; margin-top: 2px; } .cbw-head-actions { display: flex; gap: 6px; } .cbw-icon-btn { width: 32px; height: 32px; display: inline-flex; align-items: center; justify-content: center; background: rgba(255,255,255,.12); color: #fff; border: none; border-radius: 8px; cursor: pointer; text-decoration: none; transition: background .15s; } .cbw-icon-btn:hover { background: rgba(255,255,255,.22); } .cbw-body { flex: 1; overflow-y: auto; padding: 16px; display: flex; flex-direction: column; gap: 12px; background: #fafafa; } .cbw-msg { max-width: 92%; padding: 10px 14px; border-radius: 12px; font-size: .9rem; line-height: 1.55; animation: cbwIn .2s ease-out; } @keyframes cbwIn { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: translateY(0); } } .cbw-msg.user { align-self: flex-end; background: linear-gradient(135deg, #1a73e8, #1557b0); color: #fff; border-bottom-right-radius: 3px; } .cbw-msg.assistant { align-self: flex-start; background: #fff; border: 1px solid #e2e8f0; border-bottom-left-radius: 3px; color: #1e293b; } .cbw-msg.assistant.error { background: #fef2f2; border-color: #fecaca; color: #991b1b; } .cbw-msg.cbw-welcome { background: linear-gradient(135deg, #f3e8ff, #ede9fe); border-color: #c4b5fd; color: #5b21b6; } .cbw-citation { display: inline-block; background: #ede9fe; color: #5b21b6; font-size: .75rem; font-weight: 700; padding: 0 6px; border-radius: 8px; margin: 0 2px; text-decoration: none; vertical-align: 1px; } .cbw-hint { display: inline-block; background: #fef3c7; color: #92400e; font-style: normal; font-size: .82rem; padding: 1px 7px; border-radius: 6px; margin-left: 4px; font-weight: 500; } .cbw-citation:hover { background: #ddd6fe; } .cbw-sources { margin-top: 10px; padding-top: 9px; border-top: 1px dashed #cbd5e1; } .cbw-sources-title { font-size: .7rem; text-transform: uppercase; letter-spacing: .4px; font-weight: 700; color: #64748b; margin-bottom: 6px; } .cbw-src { display: block; padding: 8px 10px; background: #fff; border: 1px solid #e2e8f0; border-left: 3px solid #7c3aed; border-radius: 6px; margin-bottom: 5px; font-size: .78rem; color: inherit; text-decoration: none; transition: transform .12s; } .cbw-src:hover { transform: translateX(2px); border-color: #7c3aed; } .cbw-src strong { display: block; color: #1e293b; margin-bottom: 1px; font-size: .8rem; line-height: 1.3; } .cbw-src .cbw-src-meta { color: #64748b; font-size: .7rem; } .cbw-src .cbw-src-id { display: inline-block; background: #ede9fe; color: #5b21b6; font-family: monospace; font-size: .68rem; font-weight: 700; padding: 0 5px; border-radius: 4px; margin-right: 4px; } .cbw-typing { display: flex; gap: 4px; padding: 10px 14px; } .cbw-typing span { width: 7px; height: 7px; border-radius: 50%; background: #7c3aed; opacity: .5; animation: cbwTyping 1.2s infinite; } .cbw-typing span:nth-child(2) { animation-delay: .15s; } .cbw-typing span:nth-child(3) { animation-delay: .3s; } @keyframes cbwTyping { 0%,80%,100% { transform: scale(.7); opacity: .4; } 40% { transform: scale(1); opacity: 1; } } .cbw-form { display: flex; gap: 8px; padding: 12px; background: #fff; border-top: 1px solid #e2e8f0; } .cbw-form textarea { flex: 1; padding: 10px 12px; border: 1px solid #cbd5e1; border-radius: 10px; font-size: .9rem; font-family: inherit; resize: none; min-height: 40px; max-height: 110px; outline: none; transition: border-color .15s; } .cbw-form textarea:focus { border-color: #7c3aed; box-shadow: 0 0 0 3px rgba(124,58,237,.12); } .cbw-form button { width: 42px; height: 42px; display: inline-flex; align-items: center; justify-content: center; background: linear-gradient(135deg, #7c3aed, #5b21b6); color: #fff; border: none; border-radius: 10px; cursor: pointer; flex-shrink: 0; } .cbw-form button:disabled { opacity: .5; cursor: not-allowed; } @media (max-width: 640px) { #cbw-launcher { bottom: 16px; right: 16px; padding: 12px 16px 12px 14px; font-size: .85rem; } .cbw-launcher-label { display: none; } #cbw-launcher { padding: 14px; } #cbw-panel { top: 0; bottom: 0; left: 0; right: 0; width: 100vw; max-width: 100vw; /* dvh = dynamic viewport height : se reduit quand le clavier mobile s'ouvre */ /* fallback vh pour navigateurs tres anciens */ height: 100vh; height: 100dvh; max-height: 100vh; max-height: 100dvh; border-radius: 0; } /* Laisse le clavier rogner l'espace du body, pas de la frame entiere */ .cbw-body { overscroll-behavior: contain; } } @media print { #cbw-launcher, #cbw-panel { display: none !important; } } </style> <script> (function() { const LANG = "en"; const T = {"sending":"...","send":"Send","sources":"Sources","rate_limit":"Limit of 10 questions per hour reached.","error":"Error. Please try again.","too_short":"Question too short."}; const launcher = document.getElementById('cbw-launcher'); const panel = document.getElementById('cbw-panel'); const closeBtn = document.getElementById('cbw-close'); const msgsEl = document.getElementById('cbw-messages'); const formEl = document.getElementById('cbw-form'); const inputEl = document.getElementById('cbw-input'); const sendBtn = document.getElementById('cbw-send'); // Sync panel height to the visual viewport (keyboard-aware) sur mobile // Necessaire car Chrome Android n'honore pas toujours 100dvh correctement // quand le clavier virtuel s'ouvre : la panel reste a 100vh et le contenu // du haut est pousse hors ecran. function syncViewport() { if (!window.visualViewport) return; if (panel.getAttribute('aria-hidden') !== 'false') return; if (window.innerWidth > 640) { panel.style.height = ''; return; } panel.style.height = window.visualViewport.height + 'px'; } function open() { panel.setAttribute('aria-hidden', 'false'); document.body.classList.add('cbw-open'); syncViewport(); if (window.visualViewport) { window.visualViewport.addEventListener('resize', syncViewport); window.visualViewport.addEventListener('scroll', syncViewport); } // Afficher le message de bienvenue au chargement msgsEl.scrollTop = 0; setTimeout(() => inputEl.focus(), 200); } function close() { panel.setAttribute('aria-hidden', 'true'); document.body.classList.remove('cbw-open'); panel.style.height = ''; if (window.visualViewport) { window.visualViewport.removeEventListener('resize', syncViewport); window.visualViewport.removeEventListener('scroll', syncViewport); } } launcher.addEventListener('click', open); closeBtn.addEventListener('click', close); document.addEventListener('keydown', e => { if (e.key === 'Escape' && panel.getAttribute('aria-hidden') === 'false') close(); }); function esc(s) { return String(s).replace(/[&<>"']/g, c => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c])); } function renderAnswer(answer, sources, queryId) { const byId = {}; (sources || []).forEach(s => { byId[s.id] = s; }); let html = esc(answer).replace(/\[#(\d+)\]/g, (m, id) => { const s = byId[id]; if (!s) return ''; return '<a class="cbw-citation" href="' + esc(s.url) + '" target="_blank" rel="noopener" data-qid="' + (queryId||0) + '" data-sid="' + id + '" data-kind="citation">#' + id + '</a>'; }); // Markdown italique *texte* -> <em>texte</em> (non greedy, non multiligne) html = html.replace(/\*([^*\n]+?)\*/g, '<em class="cbw-hint">$1</em>'); return html.replace(/\n/g, '<br>'); } function renderSources(sources, queryId) { if (!sources || !sources.length) return ''; let out = '<div class="cbw-sources"><div class="cbw-sources-title">' + esc(T.sources) + '</div>'; sources.forEach(s => { const meta = [s.speaker, s.date].filter(Boolean).join(' · '); out += '<a class="cbw-src" href="' + esc(s.url) + '" target="_blank" rel="noopener" data-qid="' + (queryId||0) + '" data-sid="' + s.id + '" data-kind="source_card">' + '<strong><span class="cbw-src-id">#' + s.id + '</span>' + esc(s.title || '') + '</strong>' + '<div class="cbw-src-meta">' + meta + '</div></a>'; }); return out + '</div>'; } // Beacon de clic : non bloquant, n'empeche pas la navigation function logClick(qid, sid, kind) { if (!qid || !sid) return; const payload = JSON.stringify({ query_id: qid, source_id: sid, kind }); try { if (navigator.sendBeacon) { navigator.sendBeacon('/api/chatbot-click', new Blob([payload], {type: 'application/json'})); } else { fetch('/api/chatbot-click', { method: 'POST', headers: {'Content-Type':'application/json'}, body: payload, keepalive: true }).catch(() => {}); } } catch (e) {} } // Delegation d'evenement sur le conteneur messages msgsEl.addEventListener('click', function(e) { const a = e.target.closest('a[data-qid][data-sid]'); if (!a) return; logClick(parseInt(a.dataset.qid, 10), parseInt(a.dataset.sid, 10), a.dataset.kind || 'source_card'); }); function addUserMsg(txt) { const d = document.createElement('div'); d.className = 'cbw-msg user'; d.innerHTML = esc(txt).replace(/\n/g, '<br>'); msgsEl.appendChild(d); scroll(); } function addBot(data, isError) { const d = document.createElement('div'); d.className = 'cbw-msg assistant' + (isError ? ' error' : ''); if (typeof data === 'string') d.innerHTML = esc(data); else { const qid = data.query_id || 0; d.innerHTML = renderAnswer(data.answer || '', data.sources || [], qid) + renderSources(data.sources || [], qid); } msgsEl.appendChild(d); // Pas de scroll : on laisse l'utilisateur sur sa question, il scrolle lui-meme pour lire la reponse } function showTyping() { const d = document.createElement('div'); d.className = 'cbw-msg assistant'; d.id = 'cbw-typing'; d.innerHTML = '<div class="cbw-typing"><span></span><span></span><span></span></div>'; msgsEl.appendChild(d); // Pas de scroll sur l'indicateur de frappe non plus } function hideTyping() { const t = document.getElementById('cbw-typing'); if (t) t.remove(); } function scroll() { msgsEl.scrollTop = msgsEl.scrollHeight; } async function ask(question, origin) { origin = origin || 'widget'; addUserMsg(question); inputEl.value = ''; inputEl.style.height = 'auto'; sendBtn.disabled = true; showTyping(); try { const resp = await fetch('/api/chatbot', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ question, lang: LANG, referer: window.location.pathname, origin }) }); hideTyping(); const data = await resp.json(); if (!resp.ok) { addBot(data.error === 'rate_limit' ? T.rate_limit : T.error, true); } else { addBot(data, false); } } catch (e) { hideTyping(); addBot(T.error, true); } finally { sendBtn.disabled = false; inputEl.focus(); } } // API publique pour declencher le chatbot depuis d'autres pages // Usage : window.ChatbotSEO.ask("Ma question", "search_fallback") window.ChatbotSEO = { open, close, ask: function(question, origin) { if (!question || question.length < 3) return; open(); // Laisser l'animation d'ouverture se lancer puis envoyer setTimeout(() => ask(question, origin || 'search_fallback'), 350); } }; inputEl.addEventListener('input', function() { this.style.height = 'auto'; this.style.height = Math.min(this.scrollHeight, 110) + 'px'; }); inputEl.addEventListener('keydown', function(e) { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); formEl.requestSubmit(); } }); formEl.addEventListener('submit', function(e) { e.preventDefault(); const q = inputEl.value.trim(); if (q.length < 3) { addBot(T.too_short, true); return; } ask(q); }); })(); </script> <nav class="mobile-nav" aria-label="Mobile navigation"> <a href="/en/" class="mobile-nav-item"> <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/></svg> <span>Search</span> </a> <a href="/en/declarations" class="mobile-nav-item"> <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="7" height="7"/><rect x="14" y="3" width="7" height="7"/><rect x="3" y="14" width="7" height="7"/><rect x="14" y="14" width="7" height="7"/></svg> <span>Categories</span> </a> <a href="/en/?browse=1&sort=date_desc" class="mobile-nav-item"> <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg> <span>Recent</span> </a> <a href="/" class="mobile-nav-item mobile-nav-lang"> <svg width="22" height="16" viewBox="0 0 640 480"> <rect width="213" height="480" fill="#002654"/><rect x="213" width="214" height="480" fill="#fff"/><rect x="427" width="213" height="480" fill="#ce1126"/> </svg> <span>FR</span> </a> </nav> <!-- Lightbox (self-contained) --> <div id="lightbox" style="display:none;position:fixed;inset:0;z-index:99999;background:rgba(0,0,0,.9);align-items:center;justify-content:center;padding:16px;cursor:zoom-out;" onclick="closeLightbox()"> <button onclick="closeLightbox();event.stopPropagation();" style="position:absolute;top:12px;right:16px;z-index:100000;width:44px;height:44px;border:none;background:rgba(255,255,255,.2);color:#fff;font-size:1.6rem;border-radius:50%;cursor:pointer;" aria-label="Fermer">×</button> <img id="lightbox-img" src="" alt="" style="max-width:95%;max-height:90vh;border-radius:8px;box-shadow:0 8px 40px rgba(0,0,0,.5);" onclick="event.stopPropagation()"> </div> <script> function openLightbox(src){ var lb=document.getElementById('lightbox'); document.getElementById('lightbox-img').src=src; lb.style.display='flex'; document.body.style.overflow='hidden'; } function closeLightbox(){ document.getElementById('lightbox').style.display='none'; document.body.style.overflow=''; } document.addEventListener('keydown',function(e){if(e.key==='Escape')closeLightbox();}); function ytPlay(card) { var vid = card.dataset.vid; var ts = parseInt(card.dataset.ts) || 0; card.classList.add('playing'); card.innerHTML = '<iframe src="https://www.youtube-nocookie.com/embed/' + vid + '?autoplay=1&rel=0&modestbranding=1' + (ts > 0 ? '&start=' + ts : '') + '" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>'; } </script> </body> </html>