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

When Google changes the displayed title in search results, it does not disregard it for ranking purposes. The HTML title remains used for ranking; only the display in the SERPs changes according to the query.
51:56
🎥 Source video

Extracted from a Google Search Central video

⏱ 1h14 💬 EN 📅 11/12/2020 ✂ 46 statements
Watch on YouTube (51:56) →
Other statements from this video 45
  1. 1:01 Chaque modification de contenu ou de design impacte-t-elle vraiment le classement SEO ?
  2. 1:01 Pourquoi modifier le design ou le contenu de votre site peut-il faire plonger vos rankings ?
  3. 2:37 Les extensions de domaine (.com, .fr, .uk) influencent-elles vraiment le poids des backlinks ?
  4. 2:37 Les extensions de domaine (.com, .fr, .uk) influencent-elles vraiment la valeur des backlinks ?
  5. 4:06 Faut-il vraiment rediriger vos vieilles pages vers une archive pour préserver le SEO ?
  6. 4:13 Peut-on vraiment préserver le SEO d'anciennes pages en redirigeant vers une section archive ?
  7. 5:16 Bloquer un dossier via robots.txt tue-t-il le transfert de PageRank vers vos pages stratégiques ?
  8. 5:50 Faut-il bloquer par robots.txt les pages recevant des backlinks ?
  9. 6:27 Les liens depuis d'anciens communiqués de presse ont-ils vraiment une valeur SEO ?
  10. 6:54 Les liens issus de vieux communiqués de presse plombent-ils vraiment votre profil de backlinks ?
  11. 7:59 Comment Google détecte-t-il vraiment le contenu dupliqué et pourquoi ne cherche-t-il pas l'original ?
  12. 8:29 Le contenu dupliqué passe-partout nuit-il vraiment au SEO ?
  13. 9:29 Google se moque-t-il vraiment de savoir qui a publié le contenu original ?
  14. 10:03 L'originalité d'un contenu garantit-elle vraiment son classement dans Google ?
  15. 13:42 Les problèmes de migration de domaine amplifient-ils l'impact des Core Updates ?
  16. 13:46 Les migrations de site sont-elles vraiment aussi risquées qu'on le pense ?
  17. 20:28 Combien de temps faut-il vraiment pour qu'une migration de domaine se stabilise dans Google ?
  18. 22:06 Les migrations de domaine sont-elles vraiment sans risque selon Google ?
  19. 26:14 Faut-il vraiment reporter vos changements SEO pendant une Core Update ?
  20. 27:27 Faut-il vraiment mettre à jour tous les backlinks après une migration de domaine ?
  21. 29:00 Faut-il vraiment vérifier l'historique d'un domaine avant de l'acheter pour une migration SEO ?
  22. 31:01 Pourquoi Google maintient-il le filtre SafeSearch même après migration vers du contenu clean ?
  23. 32:03 Faut-il vraiment utiliser l'outil de changement d'adresse pour migrer entre sous-domaines ?
  24. 32:03 Faut-il utiliser l'outil de changement d'adresse lors d'une migration entre sous-domaines ?
  25. 33:10 Les Web Stories sont-elles vraiment indexables comme des pages normales ?
  26. 33:10 Les Web Stories peuvent-elles vraiment ranker comme des pages classiques ?
  27. 36:04 Les erreurs AMP nuisent-elles vraiment au classement Google ou est-ce un mythe ?
  28. 36:24 Les erreurs AMP impactent-elles vraiment le classement Google ?
  29. 37:49 Pourquoi nettoyer sa structure d'URLs booste-t-il vraiment le ranking de vos pages stratégiques ?
  30. 38:00 Pourquoi nettoyer votre structure d'URL peut-il résoudre vos problèmes de ranking ?
  31. 39:36 Le texte masqué pour l'accessibilité est-il pénalisé par Google ?
  32. 39:36 Le texte caché pour l'accessibilité nuit-il au référencement de votre site ?
  33. 41:10 Pourquoi vos impressions explosent-elles certains jours dans Search Console ?
  34. 42:45 Comment implémenter le schema paywall quand on fait des tests A/B avec plusieurs variations ?
  35. 44:03 Faut-il vraiment montrer le contenu complet à Googlebot si le paywall bloque les utilisateurs ?
  36. 48:00 Google réécrit-il vraiment vos titres pour améliorer vos clics sans toucher au classement ?
  37. 48:07 Google réécrit-il vos titres pour manipuler le taux de clic ?
  38. 49:49 Faut-il vraiment bourrer vos titres de toutes les variantes d'un mot-clé ?
  39. 50:50 Pourquoi Google réécrit-il vos balises title et comment forcer l'affichage de votre version originale ?
  40. 65:39 Faut-il vraiment arrêter d'optimiser les variations de mots-clés synonymes ?
  41. 65:39 Faut-il arrêter d'optimiser pour les synonymes et variations géographiques ?
  42. 67:16 Pourquoi Google bloque-t-il systématiquement les résultats enrichis pour les sites adultes ?
  43. 67:16 Les sites adultes peuvent-ils afficher des rich results dans Google ?
  44. 68:48 SafeSearch filtre-t-il vraiment l'intégralité d'un domaine si une partie seulement contient du contenu adulte ?
  45. 69:08 Un domaine adulte peut-il héberger des sections non-adultes sans pénaliser tout le site ?
📅
Official statement from (5 years ago)
TL;DR

Google reaffirms that changing the display of a title in search results does not impact its role in ranking. The engine continues to leverage the original <title> tag to assess relevance, even if the SERPs show an automatically generated variation. This distinction between ranking signals and user display is crucial for properly prioritizing your on-page optimizations.

What you need to understand

Why does Google change the titles displayed in search results?

The engine sometimes replaces the </strong> tag with a title generated from the page content — <strong>H1</strong> tags, paragraphs, internal link anchors — when it believes the original doesn't sufficiently match the query. This dynamic rewriting aims to improve the <strong>contextual coherence</strong> between search intent and what Google displays to the user.</p> <p>In practical terms, your title may be perfectly optimized technically, but if Google determines that an H1 or a snippet of text better answers a specific query, it is that fragment that will appear in the SERPs. This process is <strong>algorithmic</strong> and varies from query to query for the same URL.</p> <h3>What does it mean that “the HTML title remains used for ranking”?</h3> <p>The <strong><title></strong> tag continues to convey its semantic signals to the ranking system, regardless of what the user sees in the results. Google analyzes the keywords, structure, and <strong>thematic relevance</strong> encoded in your original title to position the page.</p> <p>The modified display is merely a <strong>presentation layer</strong>—a decision made after ranking, at the time of generating snippets. The relevance signal remains extracted from the source HTML code. This means that optimizing your title for SEO retains its value even if you frequently notice rewrites in the SERPs.</p> <h3>Does this distinction have implications for your title strategy?</h3> <p>Yes, because it reveals that the <strong>SEO signal</strong> and <strong>user experience</strong> in the results are two decoupled mechanisms. You should continue working on your titles for ranking—relevant keyword density, clear structure, page differentiation—while accepting that Google adjusts the display according to the query context.</p> <p>This logic encourages you not to sacrifice the technical quality of your <title> tags on the grounds that Google sometimes rewrites them. The <strong>on-page optimization work</strong> remains effective. However, if a rewritten title generates a poor CTR, it's a display issue, not a ranking one—which guides your corrective actions differently.</p> <ul> <li><strong>Ranking Signal</strong>: extracted from the original <title> tag in the HTML code</li> <li><strong>Display in the SERPs</strong>: may be replaced by dynamically generated content (H1, paragraph, anchor)</li> <li><strong>Contextual Variation</strong>: the same page may show different titles depending on the query</li> <li><strong>On-page Optimization</strong>: remains essential to convey the right signals to the engine, even with frequent rewrites</li> <li><strong>CTR Impact</strong>: a rewritten title may affect the click-through rate without altering the page's ranking</li> </ul></div> </div> <div class="section-card ai-section"> <h2>SEO Expert opinion</h2> <div class="content" data-field="ai_expert_opinion"><h3>Is this statement consistent with field observations?</h3> <p>Yes, it confirms what A/B tests have shown for years: modifying an <strong>HTML title</strong> impacts positioning, even when Google displays something else in the results. Ranking fluctuations after a title overhaul remain measurable, proving that the engine indeed utilizes the original tag to assess <strong>semantic relevance</strong>.</p> <p>However, the gray area persists regarding the exact weighting. Google does not clarify whether a rewritten title systematically signals <strong>under-optimization of relevance</strong> that could indirectly penalize the page. Data is lacking to resolve this question. <strong>[To be verified]</strong> on significant volumes of pages involved in massive rewrites.</p> <h3>What nuances should be added to this assertion?</h3> <p>The statement leaves out the <strong>quality of the signal</strong> conveyed by a title deemed irrelevant by the algorithm. If Google rewrites it massively, it may be that the original tag conveys a vague or inappropriate signal—which could impact ranking, not because of ignorance of the title, but because this title was <strong>poorly constructed</strong>.</p> <p>Another point: Mueller says nothing about cases where the HTML title is <strong>empty, duplicated, or stuffed with keywords</strong>. In these extreme situations, the engine cannot extract any usable signal—the rewrite then becomes a crutch, not a tactical choice. Distinguishing these pathological cases from normal contextual rewrites is essential for accurately interpreting your diagnostics.</p> <h3>In what cases might this rule not fully apply?</h3> <p>When the page content <strong>blatantly contradicts</strong> the HTML title. If Google detects a marked inconsistency—title promising X, content delivering Y—the engine may devalue the signal of the original title in favor of what it extracts from the body of the page. The <strong>overall semantic coherence</strong> then takes precedence over the isolated tag.</p> <p>Another scenario: orphaned or poorly linked pages, where Google struggles to reconcile the title with the <strong>anchor text of backlinks</strong> and the thematic context of the site. In these conditions, the actual weight of the title may be diluted, even if technically it remains “used for ranking.” The signal exists, but its effectiveness collapses due to lack of confirmation from other elements.</p> <div class="alert"><strong>Warning:</strong> A title rewritten on 80% of impressions is not just a cosmetic issue. This often indicates a <strong>desynchronization between your SEO intent</strong> and what the algorithm deems relevant for your target queries. Diagnosing these discrepancies through the Search Console is a priority.</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 you do concretely for your HTML titles?</h3> <p>Continue to optimize your <strong><title></strong> tags for ranking: integrate primary keywords, respect a length of 50-60 characters, differentiate each page. The fact that Google sometimes rewrites the display does not diminish the importance of this <strong>technical optimization</strong>.</p> <p>At the same time, audit the rewrites through the <strong>Search Console</strong>: export the main queries, check in the SERPs if the displayed title corresponds to your HTML tag. If there are massive discrepancies on your strategic pages, it indicates that Google finds your title unsuitable—which suggests a <strong>semantic relevance issue</strong> to correct.</p> <h3>What mistakes should you avoid in managing your titles?</h3> <p>Do not sacrifice the quality of your HTML title on the grounds that “Google changes it anyway.” This reasoning overlooks that the <strong>ranking signal</strong> remains extracted from your original tag. A hastily crafted title conveys a vague signal, even if the display is corrected by the algorithm.</p> <p>Also, avoid over-optimizing to force the display. Stuffing a title with keywords to “impose” your version in the SERPs is counterproductive: you degrade the signal transmitted to the engine and increase the likelihood of an <strong>automatic rewrite</strong>. Prioritize clarity and coherence with the actual content of the page.</p> <h3>How can you check that your titles convey the right signal?</h3> <p>Compare your HTML titles with the <strong>H1 and subtitles</strong> of each page: if they are semantically coherent, the signal transmitted will be strong. If you notice marked divergences, it is a friction point that can justify rewrites and weaken your ranking.</p> <p>Use tools like Screaming Frog to detect <strong>title duplications</strong>, overly long or short tags, inconsistencies with meta description tags. A regular audit ensures that each page conveys a distinct and usable signal to the algorithm.</p> <ul class="checklist"> <li>Optimize each HTML title for ranking, regardless of observed rewrites</li> <li>Audit massive rewrites via the Search Console to identify relevance issues</li> <li>Ensure semantic coherence between title, H1, and main content of each page</li> <li>Eliminate title duplications across the entire site</li> <li>Do not over-optimize titles to force their display — prioritize clarity</li> <li>Monitor the CTR impact of rewrites and adjust content if necessary</li> </ul> <div class="summary">The distinction between ranking signal and user display redefines how you should approach title optimization. Technical work remains a priority, but analyzing rewrites becomes a diagnostic lever to detect misalignments between your SEO strategy and the algorithm's interpretation. These cross-optimized elements—tags, structure, semantic coherence—require fine expertise and regular monitoring. If you manage a site with hundreds of pages or critical positioning stakes, hiring a specialized SEO agency can help orchestrate these adjustments methodically and avoid technical pitfalls that dilute your relevance signals.</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">Un title réécrit par Google affecte-t-il le positionnement de la page ?</summary> <div class="faq-answer">Non, le classement repose sur la balise <title> d'origine dans le code HTML. La réécriture affichée dans les SERPs est une décision de présentation prise après le calcul du ranking.</div> </details> <details class="faq-item"> <summary class="faq-question">Pourquoi Google modifie-t-il certains titles et pas d'autres ?</summary> <div class="faq-answer">L'algorithme réécrit un title quand il estime qu'un autre élément de la page — H1, paragraphe, ancre — répond mieux à la requête formulée par l'utilisateur. C'est une logique de pertinence contextuelle.</div> </details> <details class="faq-item"> <summary class="faq-question">Dois-je arrêter d'optimiser mes titles si Google les réécrit souvent ?</summary> <div class="faq-answer">Non, vous devez au contraire renforcer l'optimisation. Un title réécrit systématiquement signale souvent un problème de pertinence ou de cohérence avec le contenu de la page.</div> </details> <details class="faq-item"> <summary class="faq-question">Comment savoir si mes titles sont réécrits dans les SERPs ?</summary> <div class="faq-answer">Exportez vos requêtes principales depuis la Search Console, puis vérifiez manuellement dans les résultats de recherche si le title affiché correspond à votre balise HTML.</div> </details> <details class="faq-item"> <summary class="faq-question">Un title réécrit peut-il impacter mon taux de clic ?</summary> <div class="faq-answer">Oui, si le title généré par Google est moins attractif ou moins clair que votre version originale, le CTR peut baisser. C'est un problème d'affichage, pas de ranking, mais il affecte la performance globale de la page.</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=title+HTML" class="seo-tag-pill">title HTML</a> <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=ranking" class="seo-tag-pill">ranking</a> <a href="/en/?q=optimisation+on-page" class="seo-tag-pill">optimisation on-page</a> <a href="/en/?q=Search+Console" class="seo-tag-pill">Search Console</a> <a href="/en/?q=signal+SEO" class="seo-tag-pill">signal SEO</a> <a href="/en/?q=pertinence" class="seo-tag-pill">pertinence</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/featured-snippets" class="tag" style="background: #d946ef20; color: #d946ef;">Featured Snippets & SERP</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">45</span> </h2> <p class="yt-same-intro"> Other SEO insights extracted from this same Google Search Central video · duration 1h14 · published on 11/12/2020 </p> <div class="related-grid yt-same-grid"> <a href="/en/d/impact-des-changements-de-contenu-et-design-sur-le-classement" class="related-item yt-same-item"> <div class="title">Chaque modification de contenu ou de design impacte-t-elle vraiment le classement SEO ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 1:01</span> </div> </a> <a href="/en/d/changement-de-contenu-et-design-peut-affecter-le-classement" class="related-item yt-same-item"> <div class="title">Pourquoi modifier le design ou le contenu de votre site peut-il faire plonger vos rankings ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 1:01</span> </div> </a> <a href="/en/d/evaluation-du-poids-des-backlinks-par-google" class="related-item yt-same-item"> <div class="title">Les extensions de domaine (.com, .fr, .uk) influencent-elles vraiment le poids des backlinks ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 2:37</span> </div> </a> <a href="/en/d/google-ne-differencie-pas-les-backlinks-par-extension-de-domaine" class="related-item yt-same-item"> <div class="title">Les extensions de domaine (.com, .fr, .uk) influencent-elles vraiment la valeur des backlinks ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 2:37</span> </div> </a> <a href="/en/d/rediriger-les-vieilles-pages-vers-archives-preserve-le-seo" class="related-item yt-same-item"> <div class="title">Faut-il vraiment rediriger vos vieilles pages vers une archive pour préserver le SEO ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 4:06</span> </div> </a> <a href="/en/d/redirection-de-contenu-archive-pour-preserver-le-seo" class="related-item yt-same-item"> <div class="title">Peut-on vraiment préserver le SEO d'anciennes pages en redirigeant vers une section archive ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 4:13</span> </div> </a> <a href="/en/d/bloquer-un-dossier-avec-robots-txt-empeche-le-transfert-de-valeur-seo" class="related-item yt-same-item"> <div class="title">Bloquer un dossier via robots.txt tue-t-il le transfert de PageRank vers vos pages stratégiques ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 5:16</span> </div> </a> <a href="/en/d/bloquer-par-robots-txt-empeche-le-transfert-de-valeur-des-liens" class="related-item yt-same-item"> <div class="title">Faut-il bloquer par robots.txt les pages recevant des backlinks ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 5:50</span> </div> </a> <a href="/en/d/valeur-limitee-des-liens-vers-d-anciens-communiques-de-presse" class="related-item yt-same-item"> <div class="title">Les liens depuis d'anciens communiqués de presse ont-ils vraiment une valeur SEO ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 6:27</span> </div> </a> <a href="/en/d/liens-de-communiques-de-presse-anciens-ont-peu-de-valeur" class="related-item yt-same-item"> <div class="title">Les liens issus de vieux communiqués de presse plombent-ils vraiment votre profil de backlinks ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 6:54</span> </div> </a> <a href="/en/d/detection-du-contenu-duplique-par-google" class="related-item yt-same-item"> <div class="title">Comment Google détecte-t-il vraiment le contenu dupliqué et pourquoi ne cherche-t-il pas l'original ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 7:59</span> </div> </a> <a href="/en/d/le-texte-passe-partout-copie-n-est-generalement-pas-problematique" class="related-item yt-same-item"> <div class="title">Le contenu dupliqué passe-partout nuit-il vraiment au SEO ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 8:29</span> </div> </a> <a href="/en/d/google-ne-determine-pas-le-proprietaire-original-du-contenu" class="related-item yt-same-item"> <div class="title">Google se moque-t-il vraiment de savoir qui a publié le contenu original ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 9:29</span> </div> </a> <a href="/en/d/l-originalite-ne-garantit-pas-la-pertinence-dans-les-resultats" class="related-item yt-same-item"> <div class="title">L'originalité d'un contenu garantit-elle vraiment son classement dans Google ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 10:03</span> </div> </a> <a href="/en/d/updates-core-peuvent-affecter-sites-avec-problemes-de-migration" class="related-item yt-same-item"> <div class="title">Les problèmes de migration de domaine amplifient-ils l'impact des Core Updates ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 13:42</span> </div> </a> <a href="/en/d/rarete-des-problemes-techniques-lors-des-migrations-de-site" class="related-item yt-same-item"> <div class="title">Les migrations de site sont-elles vraiment aussi risquées qu'on le pense ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 13:46</span> </div> </a> <a href="/en/d/delai-de-stabilisation-des-signaux-apres-migration-de-domaine" class="related-item yt-same-item"> <div class="title">Combien de temps faut-il vraiment pour qu'une migration de domaine se stabilise dans Google ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 20:28</span> </div> </a> <a href="/en/d/migrations-de-domaine-problemes-rares-mais-a-surveiller" class="related-item yt-same-item"> <div class="title">Les migrations de domaine sont-elles vraiment sans risque selon Google ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 22:06</span> </div> </a> <a href="/en/d/lancer-changements-de-site-pendant-core-update-n-est-pas-problematique" class="related-item yt-same-item"> <div class="title">Faut-il vraiment reporter vos changements SEO pendant une Core Update ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 26:14</span> </div> </a> <a href="/en/d/mettre-a-jour-les-backlinks-apres-migration-aide-la-canonicalisation" class="related-item yt-same-item"> <div class="title">Faut-il vraiment mettre à jour tous les backlinks après une migration de domaine ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 27:27</span> </div> </a> <a href="/en/d/verifier-l-historique-d-un-domaine-avant-migration" class="related-item yt-same-item"> <div class="title">Faut-il vraiment vérifier l'historique d'un domaine avant de l'acheter pour une migration SEO ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 29:00</span> </div> </a> <a href="/en/d/google-peut-mettre-du-temps-a-ajuster-filtrage-adulte-apres-migration" class="related-item yt-same-item"> <div class="title">Pourquoi Google maintient-il le filtre SafeSearch même après migration vers du contenu clean ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 31:01</span> </div> </a> <a href="/en/d/l-outil-de-changement-d-adresse-n-est-pas-necessaire-entre-sous-domaines" class="related-item yt-same-item"> <div class="title">Faut-il vraiment utiliser l'outil de changement d'adresse pour migrer entre sous-domaines ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 32:03</span> </div> </a> <a href="/en/d/pas-besoin-d-outil-de-changement-d-adresse-entre-sous-domaines" class="related-item yt-same-item"> <div class="title">Faut-il utiliser l'outil de changement d'adresse lors d'une migration entre sous-domaines ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 32:03</span> </div> </a> <a href="/en/d/les-web-stories-sont-des-pages-amp-normales-indexables" class="related-item yt-same-item"> <div class="title">Les Web Stories sont-elles vraiment indexables comme des pages normales ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 33:10</span> </div> </a> <a href="/en/d/web-stories-sont-des-pages-amp-indexables-normalement" class="related-item yt-same-item"> <div class="title">Les Web Stories peuvent-elles vraiment ranker comme des pages classiques ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 33:10</span> </div> </a> <a href="/en/d/les-erreurs-amp-n-affectent-pas-le-classement-mais-limitent-les-fonctionnalites" class="related-item yt-same-item"> <div class="title">Les erreurs AMP nuisent-elles vraiment au classement Google ou est-ce un mythe ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 36:04</span> </div> </a> <a href="/en/d/erreurs-amp-empechent-mise-en-cache-et-affichage-comme-alternate" class="related-item yt-same-item"> <div class="title">Les erreurs AMP impactent-elles vraiment le classement Google ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 36:24</span> </div> </a> <a href="/en/d/nettoyer-structure-d-urls-aide-a-concentrer-la-valeur-seo" class="related-item yt-same-item"> <div class="title">Pourquoi nettoyer sa structure d'URLs booste-t-il vraiment le ranking de vos pages stratégiques ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 37:49</span> </div> </a> <a href="/en/d/nettoyer-la-structure-d-url-ameliore-la-pertinence-des-pages" class="related-item yt-same-item"> <div class="title">Pourquoi nettoyer votre structure d'URL peut-il résoudre vos problèmes de ranking ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 38:00</span> </div> </a> <a href="/en/d/le-texte-masque-pour-l-accessibilite-n-est-pas-considere-comme-du-cloaking" class="related-item yt-same-item"> <div class="title">Le texte masqué pour l'accessibilité est-il pénalisé par Google ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 39:36</span> </div> </a> <a href="/en/d/texte-cache-pour-accessibilite-n-est-pas-considere-comme-spam" class="related-item yt-same-item"> <div class="title">Le texte caché pour l'accessibilité nuit-il au référencement de votre site ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 39:36</span> </div> </a> <a href="/en/d/pics-d-impressions-peuvent-etre-cycles-utilisateurs-ou-outils-de-rank" class="related-item yt-same-item"> <div class="title">Pourquoi vos impressions explosent-elles certains jours dans Search Console ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 41:10</span> </div> </a> <a href="/en/d/paywall-schema-utiliser-le-denominateur-commun-pour-tous-les-tests" class="related-item yt-same-item"> <div class="title">Comment implémenter le schema paywall quand on fait des tests A/B avec plusieurs variations ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 42:45</span> </div> </a> <a href="/en/d/googlebot-doit-voir-le-contenu-complet-et-le-markup-paywall" class="related-item yt-same-item"> <div class="title">Faut-il vraiment montrer le contenu complet à Googlebot si le paywall bloque les utilisateurs ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 44:03</span> </div> </a> <a href="/en/d/google-peut-reecrire-les-titres-selon-la-requete-de-l-utilisateur-2020" class="related-item yt-same-item"> <div class="title">Google réécrit-il vraiment vos titres pour améliorer vos clics sans toucher au classement ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 48:00</span> </div> </a> <a href="/en/d/google-peut-reecrire-les-titres-selon-la-requete-de-l-utilisateur" class="related-item yt-same-item"> <div class="title">Google réécrit-il vos titres pour manipuler le taux de clic ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 48:07</span> </div> </a> <a href="/en/d/l-accumulation-de-mots-cles-dans-les-titres-ne-garantit-pas-la-pertinence" class="related-item yt-same-item"> <div class="title">Faut-il vraiment bourrer vos titres de toutes les variantes d'un mot-clé ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 49:49</span> </div> </a> <a href="/en/d/ameliorer-les-titres-peut-augmenter-le-taux-de-clic" class="related-item yt-same-item"> <div class="title">Pourquoi Google réécrit-il vos balises title et comment forcer l'affichage de votre version originale ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 50:50</span> </div> </a> <a href="/en/d/google-comprend-les-synonymes-grace-au-machine-learning" class="related-item yt-same-item"> <div class="title">Faut-il vraiment arrêter d'optimiser les variations de mots-clés synonymes ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 65:39</span> </div> </a> <a href="/en/d/google-comprend-mieux-les-synonymes-grace-au-machine-learning" class="related-item yt-same-item"> <div class="title">Faut-il arrêter d'optimiser pour les synonymes et variations géographiques ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 65:39</span> </div> </a> <a href="/en/d/aucun-resultat-enrichi-n-est-supporte-pour-les-sites-adultes" class="related-item yt-same-item"> <div class="title">Pourquoi Google bloque-t-il systématiquement les résultats enrichis pour les sites adultes ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 67:16</span> </div> </a> <a href="/en/d/rich-results-non-supportes-pour-sites-adultes" class="related-item yt-same-item"> <div class="title">Les sites adultes peuvent-ils afficher des rich results dans Google ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 67:16</span> </div> </a> <a href="/en/d/les-filtres-safesearch-s-appliquent-au-niveau-du-domaine-entier" class="related-item yt-same-item"> <div class="title">SafeSearch filtre-t-il vraiment l'intégralité d'un domaine si une partie seulement contient du contenu adulte ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 68:48</span> </div> </a> <a href="/en/d/safe-search-applique-au-niveau-du-domaine-complet" class="related-item yt-same-item"> <div class="title">Un domaine adulte peut-il héberger des sections non-adultes sans pénaliser tout le site ?</div> <div class="meta"> <span class="yt-same-ts">⏱ 69:08</span> </div> </a> </div> <a href="https://www.youtube.com/watch?v=lTIR8hM5pbw" 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/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/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/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> <a href="/en/d/beware-of-domains-with-names-that-are-too-similar" class="related-item"> <div class="title">Could a domain name similar to a competitor harm your SEO?</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/googlebot-must-see-the-complete-content-and-the-paywall-markup"> <div class="nav-label">« Previous</div> <div class="nav-title">Googlebot must see the complete content AND the pa...</div> </a> <a href="/en/d/google-does-not-differentiate-backlinks-by-domain-extension" style="text-align: right;"> <div class="nav-label">Next »</div> <div class="nav-title">Google does not differentiate backlinks by domain ...</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="6729"> <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>