What does Google say about SEO? /

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 Does every change to content or design really affect SEO rankings?
  2. 1:01 What impact can changing your site's design or content have on your rankings?
  3. 2:37 Do domain extensions (.com, .fr, .uk) really influence the weight of backlinks?
  4. 2:37 Do domain extensions (.com, .fr, .uk) really influence the value of backlinks?
  5. 4:06 Does redirecting your old pages to an archive really help preserve SEO?
  6. 4:13 Can redirecting to an archive section really help preserve the SEO of old pages?
  7. 5:16 Does blocking a folder via robots.txt kill the PageRank transfer to your strategic pages?
  8. 5:50 Should you block pages receiving backlinks with robots.txt?
  9. 6:27 Do links from old press releases really hold any SEO value?
  10. 6:54 Do links from old press releases really drag down your backlink profile?
  11. 7:59 How does Google truly detect duplicate content and why doesn't it seek the original?
  12. 8:29 Does boilerplate content really harm SEO?
  13. 9:29 Does Google really not care who published the original content?
  14. 10:03 Does content originality really ensure top rankings on Google?
  15. 13:42 Do domain migration problems amplify the impact of Core Updates?
  16. 13:46 Are site migrations really as risky as they seem?
  17. 20:28 How long does it really take for a domain migration to stabilize in Google?
  18. 22:06 Are domain migrations really risk-free according to Google?
  19. 26:14 Should you really delay your SEO changes during a Core Update?
  20. 27:27 Should you really update all backlinks after a domain migration?
  21. 29:00 Should you really check a domain's history before purchasing it for an SEO migration?
  22. 31:01 Why does Google maintain SafeSearch filtering even after migrating to clean content?
  23. 32:03 Do you really need the address change tool to migrate between subdomains?
  24. 32:03 Should you really use the address change tool when migrating between subdomains?
  25. 33:10 Are Web Stories really indexable like regular pages?
  26. 33:10 Can Web Stories really rank like traditional pages?
  27. 36:04 Do AMP errors really harm Google rankings, or is it just a myth?
  28. 36:24 Do AMP errors really affect your Google ranking?
  29. 37:49 How does cleaning up your URL structure really enhance the ranking of your strategic pages?
  30. 38:00 How can cleaning up your URL structure solve your ranking problems?
  31. 39:36 Is it true that hidden text for accessibility is penalized by Google?
  32. 39:36 Does hidden text for accessibility really harm your site's SEO?
  33. 41:10 Why do your impressions skyrocket on certain days in Search Console?
  34. 42:45 How can you implement paywall schema when conducting A/B tests with multiple variations?
  35. 44:03 Should you really show the complete content to Googlebot if the paywall blocks users?
  36. 48:00 Does Google really rewrite your titles to boost clicks without affecting rankings?
  37. 48:07 Does Google rewrite your titles to manipulate your click-through rates?
  38. 49:49 Should you really stuff your titles with every keyword variation?
  39. 50:50 Is it true that Google rewrites your title tags, and how can you ensure your original version gets displayed?
  40. 65:39 Should you really stop optimizing for synonymous keywords?
  41. 65:39 Should you stop optimizing for synonyms and geographical variations?
  42. 67:16 Why does Google consistently block rich results for adult sites?
  43. 67:16 Can adult sites actually display rich results on Google?
  44. 68:48 Does SafeSearch really filter the entire domain if only a part contains adult content?
  45. 69:08 Can an adult domain host non-adult sections without penalizing the entire 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-of-content-and-design-changes-on-rankings" class="related-item yt-same-item"> <div class="title">Does every change to content or design really affect SEO rankings?</div> <div class="meta"> <span class="yt-same-ts">⏱ 1:01</span> </div> </a> <a href="/en/d/changing-content-and-design-can-affect-rankings" class="related-item yt-same-item"> <div class="title">What impact can changing your site's design or content have on your rankings?</div> <div class="meta"> <span class="yt-same-ts">⏱ 1:01</span> </div> </a> <a href="/en/d/evaluation-of-backlink-weight-by-google" class="related-item yt-same-item"> <div class="title">Do domain extensions (.com, .fr, .uk) really influence the weight of backlinks?</div> <div class="meta"> <span class="yt-same-ts">⏱ 2:37</span> </div> </a> <a href="/en/d/google-does-not-differentiate-backlinks-by-domain-extension" class="related-item yt-same-item"> <div class="title">Do domain extensions (.com, .fr, .uk) really influence the value of backlinks?</div> <div class="meta"> <span class="yt-same-ts">⏱ 2:37</span> </div> </a> <a href="/en/d/redirecting-old-pages-to-archives-preserves-seo" class="related-item yt-same-item"> <div class="title">Does redirecting your old pages to an archive really help preserve SEO?</div> <div class="meta"> <span class="yt-same-ts">⏱ 4:06</span> </div> </a> <a href="/en/d/redirecting-archived-content-to-preserve-seo" class="related-item yt-same-item"> <div class="title">Can redirecting to an archive section really help preserve the SEO of old pages?</div> <div class="meta"> <span class="yt-same-ts">⏱ 4:13</span> </div> </a> <a href="/en/d/blocking-a-folder-with-robots-txt-prevents-seo-value-transfer" class="related-item yt-same-item"> <div class="title">Does blocking a folder via robots.txt kill the PageRank transfer to your strategic pages?</div> <div class="meta"> <span class="yt-same-ts">⏱ 5:16</span> </div> </a> <a href="/en/d/blocking-by-robots-txt-prevents-link-value-transfer" class="related-item yt-same-item"> <div class="title">Should you block pages receiving backlinks with robots.txt?</div> <div class="meta"> <span class="yt-same-ts">⏱ 5:50</span> </div> </a> <a href="/en/d/limited-value-of-links-from-old-press-releases" class="related-item yt-same-item"> <div class="title">Do links from old press releases really hold any SEO value?</div> <div class="meta"> <span class="yt-same-ts">⏱ 6:27</span> </div> </a> <a href="/en/d/old-press-release-links-hold-little-value" class="related-item yt-same-item"> <div class="title">Do links from old press releases really drag down your backlink profile?</div> <div class="meta"> <span class="yt-same-ts">⏱ 6:54</span> </div> </a> <a href="/en/d/duplicate-content-detection-by-google" class="related-item yt-same-item"> <div class="title">How does Google truly detect duplicate content and why doesn't it seek the original?</div> <div class="meta"> <span class="yt-same-ts">⏱ 7:59</span> </div> </a> <a href="/en/d/the-boilerplate-text-usually-isn-t-a-problem" class="related-item yt-same-item"> <div class="title">Does boilerplate content really harm SEO?</div> <div class="meta"> <span class="yt-same-ts">⏱ 8:29</span> </div> </a> <a href="/en/d/google-does-not-determine-the-original-owner-of-the-content" class="related-item yt-same-item"> <div class="title">Does Google really not care who published the original content?</div> <div class="meta"> <span class="yt-same-ts">⏱ 9:29</span> </div> </a> <a href="/en/d/originality-doesn-t-guarantee-relevance-in-search-results" class="related-item yt-same-item"> <div class="title">Does content originality really ensure top rankings on Google?</div> <div class="meta"> <span class="yt-same-ts">⏱ 10:03</span> </div> </a> <a href="/en/d/core-updates-can-affect-sites-with-migration-issues" class="related-item yt-same-item"> <div class="title">Do domain migration problems amplify the impact of Core Updates?</div> <div class="meta"> <span class="yt-same-ts">⏱ 13:42</span> </div> </a> <a href="/en/d/rarity-of-technical-issues-during-site-migrations" class="related-item yt-same-item"> <div class="title">Are site migrations really as risky as they seem?</div> <div class="meta"> <span class="yt-same-ts">⏱ 13:46</span> </div> </a> <a href="/en/d/stabilization-delay-of-signals-after-domain-migration" class="related-item yt-same-item"> <div class="title">How long does it really take for a domain migration to stabilize in Google?</div> <div class="meta"> <span class="yt-same-ts">⏱ 20:28</span> </div> </a> <a href="/en/d/domain-migrations-rare-issues-to-watch-out-for" class="related-item yt-same-item"> <div class="title">Are domain migrations really risk-free according to Google?</div> <div class="meta"> <span class="yt-same-ts">⏱ 22:06</span> </div> </a> <a href="/en/d/launching-site-changes-during-a-core-update-is-not-a-problem" class="related-item yt-same-item"> <div class="title">Should you really delay your SEO changes during a Core Update?</div> <div class="meta"> <span class="yt-same-ts">⏱ 26:14</span> </div> </a> <a href="/en/d/updating-backlinks-after-migration-aids-canonicalization" class="related-item yt-same-item"> <div class="title">Should you really update all backlinks after a domain migration?</div> <div class="meta"> <span class="yt-same-ts">⏱ 27:27</span> </div> </a> <a href="/en/d/check-a-domain-s-history-before-migration" class="related-item yt-same-item"> <div class="title">Should you really check a domain's history before purchasing it for an SEO migration?</div> <div class="meta"> <span class="yt-same-ts">⏱ 29:00</span> </div> </a> <a href="/en/d/google-may-take-time-to-adjust-safesearch-filtering-after-migration" class="related-item yt-same-item"> <div class="title">Why does Google maintain SafeSearch filtering even after migrating to clean content?</div> <div class="meta"> <span class="yt-same-ts">⏱ 31:01</span> </div> </a> <a href="/en/d/the-address-change-tool-is-not-necessary-between-subdomains" class="related-item yt-same-item"> <div class="title">Do you really need the address change tool to migrate between subdomains?</div> <div class="meta"> <span class="yt-same-ts">⏱ 32:03</span> </div> </a> <a href="/en/d/no-need-for-address-change-tool-between-subdomains" class="related-item yt-same-item"> <div class="title">Should you really use the address change tool when migrating between subdomains?</div> <div class="meta"> <span class="yt-same-ts">⏱ 32:03</span> </div> </a> <a href="/en/d/web-stories-are-normal-indexable-amp-pages" class="related-item yt-same-item"> <div class="title">Are Web Stories really indexable like regular pages?</div> <div class="meta"> <span class="yt-same-ts">⏱ 33:10</span> </div> </a> <a href="/en/d/web-stories-are-normally-indexable-amp-pages" class="related-item yt-same-item"> <div class="title">Can Web Stories really rank like traditional pages?</div> <div class="meta"> <span class="yt-same-ts">⏱ 33:10</span> </div> </a> <a href="/en/d/amp-errors-don-t-affect-ranking-but-limit-functionalities" class="related-item yt-same-item"> <div class="title">Do AMP errors really harm Google rankings, or is it just a myth?</div> <div class="meta"> <span class="yt-same-ts">⏱ 36:04</span> </div> </a> <a href="/en/d/amp-errors-prevent-caching-and-displaying-as-alternate" class="related-item yt-same-item"> <div class="title">Do AMP errors really affect your Google ranking?</div> <div class="meta"> <span class="yt-same-ts">⏱ 36:24</span> </div> </a> <a href="/en/d/cleaning-url-structure-helps-concentrate-seo-value" class="related-item yt-same-item"> <div class="title">How does cleaning up your URL structure really enhance the ranking of your strategic pages?</div> <div class="meta"> <span class="yt-same-ts">⏱ 37:49</span> </div> </a> <a href="/en/d/cleaning-up-url-structure-enhances-page-relevance" class="related-item yt-same-item"> <div class="title">How can cleaning up your URL structure solve your ranking problems?</div> <div class="meta"> <span class="yt-same-ts">⏱ 38:00</span> </div> </a> <a href="/en/d/hidden-text-for-accessibility-is-not-considered-cloaking" class="related-item yt-same-item"> <div class="title">Is it true that hidden text for accessibility is penalized by Google?</div> <div class="meta"> <span class="yt-same-ts">⏱ 39:36</span> </div> </a> <a href="/en/d/hidden-text-for-accessibility-is-not-considered-spam" class="related-item yt-same-item"> <div class="title">Does hidden text for accessibility really harm your site's SEO?</div> <div class="meta"> <span class="yt-same-ts">⏱ 39:36</span> </div> </a> <a href="/en/d/spikes-in-impressions-can-be-user-cycles-or-rank-tracking-tools" class="related-item yt-same-item"> <div class="title">Why do your impressions skyrocket on certain days in Search Console?</div> <div class="meta"> <span class="yt-same-ts">⏱ 41:10</span> </div> </a> <a href="/en/d/paywall-schema-using-the-common-denominator-for-all-tests" class="related-item yt-same-item"> <div class="title">How can you implement paywall schema when conducting A/B tests with multiple variations?</div> <div class="meta"> <span class="yt-same-ts">⏱ 42:45</span> </div> </a> <a href="/en/d/googlebot-must-see-the-complete-content-and-the-paywall-markup" class="related-item yt-same-item"> <div class="title">Should you really show the complete content to Googlebot if the paywall blocks users?</div> <div class="meta"> <span class="yt-same-ts">⏱ 44:03</span> </div> </a> <a href="/en/d/google-can-rewrite-titles-based-on-the-user-s-query" class="related-item yt-same-item"> <div class="title">Does Google really rewrite your titles to boost clicks without affecting rankings?</div> <div class="meta"> <span class="yt-same-ts">⏱ 48:00</span> </div> </a> <a href="/en/d/google-can-rewrite-titles-based-on-user-queries" class="related-item yt-same-item"> <div class="title">Does Google rewrite your titles to manipulate your click-through rates?</div> <div class="meta"> <span class="yt-same-ts">⏱ 48:07</span> </div> </a> <a href="/en/d/the-accumulation-of-keywords-in-titles-does-not-guarantee-relevance" class="related-item yt-same-item"> <div class="title">Should you really stuff your titles with every keyword variation?</div> <div class="meta"> <span class="yt-same-ts">⏱ 49:49</span> </div> </a> <a href="/en/d/improving-titles-can-increase-click-through-rate" class="related-item yt-same-item"> <div class="title">Is it true that Google rewrites your title tags, and how can you ensure your original version gets displayed?</div> <div class="meta"> <span class="yt-same-ts">⏱ 50:50</span> </div> </a> <a href="/en/d/google-understands-synonyms-thanks-to-machine-learning" class="related-item yt-same-item"> <div class="title">Should you really stop optimizing for synonymous keywords?</div> <div class="meta"> <span class="yt-same-ts">⏱ 65:39</span> </div> </a> <a href="/en/d/google-better-understands-synonyms-thanks-to-machine-learning" class="related-item yt-same-item"> <div class="title">Should you stop optimizing for synonyms and geographical variations?</div> <div class="meta"> <span class="yt-same-ts">⏱ 65:39</span> </div> </a> <a href="/en/d/no-rich-results-are-supported-for-adult-sites" class="related-item yt-same-item"> <div class="title">Why does Google consistently block rich results for adult sites?</div> <div class="meta"> <span class="yt-same-ts">⏱ 67:16</span> </div> </a> <a href="/en/d/unsupported-rich-results-for-adult-sites" class="related-item yt-same-item"> <div class="title">Can adult sites actually display rich results on Google?</div> <div class="meta"> <span class="yt-same-ts">⏱ 67:16</span> </div> </a> <a href="/en/d/safesearch-filters-apply-at-the-entire-domain-level" class="related-item yt-same-item"> <div class="title">Does SafeSearch really filter the entire domain if only a part contains adult content?</div> <div class="meta"> <span class="yt-same-ts">⏱ 68:48</span> </div> </a> <a href="/en/d/safe-search-applied-at-the-complete-domain-level" class="related-item yt-same-item"> <div class="title">Can an adult domain host non-adult sections without penalizing the entire 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/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/google-does-not-differentiate-backlinks-by-domain-extension"> <div class="nav-label">« Previous</div> <div class="nav-title">Google does not differentiate backlinks by domain ...</div> </a> <a href="/en/d/google-does-not-determine-the-original-owner-of-the-content" style="text-align: right;"> <div class="nav-label">Next »</div> <div class="nav-title">Google does not determine the original owner of th...</div> </a> </div> <div class="back-link"> <a href="/en/" class="btn">« Back to results</a> </div> <!-- Boutons de partage sociaux (bas de page) --> <div class="share-block" data-entity-type="declaration" data-entity-id="6729" data-share-lang="en"> <div class="share-block-label"> <span class="share-icon" aria-hidden="true">🔗</span> <span>Share this article</span> </div> <div class="share-buttons"> <a class="share-btn share-btn-facebook" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fseoclaims.com%2Fen%2Fd%2Fan-unseen-title-doesn-t-mean-it-s-ignored-for-ranking" target="_blank" rel="noopener nofollow" data-network="facebook" aria-label="Share on Facebook" title="Share on Facebook"> <svg viewBox="0 0 24 24" width="18" height="18" aria-hidden="true"><path fill="currentColor" d="M22 12.06C22 6.5 17.52 2 12 2S2 6.5 2 12.06c0 5 3.66 9.13 8.44 9.88v-6.99H7.9v-2.89h2.54V9.85c0-2.51 1.49-3.89 3.78-3.89 1.09 0 2.24.2 2.24.2v2.46h-1.26c-1.24 0-1.63.77-1.63 1.56v1.88h2.78l-.45 2.89h-2.33v6.99C18.34 21.19 22 17.06 22 12.06z"/></svg> <span class="share-btn-text">Facebook</span> </a> <a class="share-btn share-btn-twitter" href="https://twitter.com/intent/tweet?text=According%20to%20Google%20%22Does%20a%20modified%20HTML%20title%20lose%20its%20ranking%20power%20in%20the%20SERPs%3F%22%0A%0Ahttps%3A%2F%2Fseoclaims.com%2Fen%2Fd%2Fan-unseen-title-doesn-t-mean-it-s-ignored-for-ranking%0A%0APlease%20RT%21" target="_blank" rel="noopener nofollow" data-network="twitter" aria-label="Share on X" title="Share on X"> <svg viewBox="0 0 24 24" width="16" height="16" aria-hidden="true"><path fill="currentColor" d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg> <span class="share-btn-text">X</span> </a> <a class="share-btn share-btn-linkedin" href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fseoclaims.com%2Fen%2Fd%2Fan-unseen-title-doesn-t-mean-it-s-ignored-for-ranking" target="_blank" rel="noopener nofollow" data-network="linkedin" aria-label="Share on LinkedIn" title="Share on LinkedIn"> <svg viewBox="0 0 24 24" width="18" height="18" aria-hidden="true"><path fill="currentColor" d="M20.45 20.45h-3.55v-5.57c0-1.33-.03-3.04-1.85-3.04-1.85 0-2.13 1.45-2.13 2.94v5.67H9.36V9h3.41v1.56h.05c.48-.9 1.64-1.85 3.38-1.85 3.61 0 4.28 2.38 4.28 5.47v6.27zM5.34 7.43a2.06 2.06 0 1 1 0-4.12 2.06 2.06 0 0 1 0 4.12zm1.78 13.02H3.56V9h3.56v11.45zM22.22 0H1.77C.79 0 0 .77 0 1.72v20.56C0 23.23.79 24 1.77 24h20.45c.98 0 1.78-.77 1.78-1.72V1.72C24 .77 23.2 0 22.22 0z"/></svg> <span class="share-btn-text">LinkedIn</span> </a> <a class="share-btn share-btn-email" href="mailto:?subject=According%20to%20Google%20%22Does%20a%20modified%20HTML%20title%20lose%20its%20ranking%20power%20in%20the%20SERPs%3F%22&body=According%20to%20Google%20%22Does%20a%20modified%20HTML%20title%20lose%20its%20ranking%20power%20in%20the%20SERPs%3F%22%0A%0AGoogle%20reaffirms%20that%20changing%20the%20display%20of%20a%20title%20in%20search%20results%20does%20not%20impact%20its%20role%20in%20ranking.%20The%20engine%20continues%20to%20leverage%20the%20original%20%3Ctitl%0A%0Ahttps%3A%2F%2Fseoclaims.com%2Fen%2Fd%2Fan-unseen-title-doesn-t-mean-it-s-ignored-for-ranking%0A%0APlease%20RT%21" data-network="email" aria-label="Share by email" title="Share by email"> <svg viewBox="0 0 24 24" width="18" height="18" aria-hidden="true"><path fill="currentColor" d="M2 4h20c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H2c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2zm10 7L2.4 6h19.2L12 11zm0 2L2 7v11h20V7l-10 6z"/></svg> <span class="share-btn-text">Email</span> </a> <button type="button" class="share-btn share-btn-copy" data-network="copy" data-copy-url="https://seoclaims.com/en/d/an-unseen-title-doesn-t-mean-it-s-ignored-for-ranking" data-label-copy="Copy link" data-label-copied="Link copied!" aria-label="Copy link" title="Copy link"> <svg viewBox="0 0 24 24" width="18" height="18" aria-hidden="true"><path fill="currentColor" d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"/></svg> <span class="share-btn-text">Copy link</span> </button> </div> </div> <script> (function(){ var blocks = document.querySelectorAll('.share-block:not([data-share-init])'); blocks.forEach(function(block){ block.setAttribute('data-share-init', '1'); var entityType = block.dataset.entityType; var entityId = block.dataset.entityId; var shareLang = block.dataset.shareLang || 'fr'; function track(network){ try { var fd = new FormData(); fd.append('entity_type', entityType); fd.append('entity_id', entityId); fd.append('network', network); fd.append('lang', shareLang); if (navigator.sendBeacon) { navigator.sendBeacon('https://seoclaims.com/api/share-track.php', fd); } else { fetch('https://seoclaims.com/api/share-track.php', { method:'POST', body: fd, keepalive: true }); } } catch(e){} } block.querySelectorAll('.share-btn').forEach(function(btn){ var network = btn.dataset.network; if (network === 'copy') { btn.addEventListener('click', function(){ var url = btn.dataset.copyUrl; var done = function(){ var txt = btn.querySelector('.share-btn-text'); var orig = btn.dataset.labelCopy; if (txt) txt.textContent = btn.dataset.labelCopied; btn.classList.add('share-btn-success'); setTimeout(function(){ if (txt) txt.textContent = orig; btn.classList.remove('share-btn-success'); }, 1800); }; if (navigator.clipboard && window.isSecureContext) { navigator.clipboard.writeText(url).then(done).catch(function(){ window.prompt(btn.dataset.labelCopy, url); }); } else { var ta = document.createElement('textarea'); ta.value = url; ta.style.position='fixed'; ta.style.left='-9999px'; document.body.appendChild(ta); ta.select(); try { document.execCommand('copy'); done(); } catch(e){ window.prompt(btn.dataset.labelCopy, url); } document.body.removeChild(ta); } track('copy'); }); return; } btn.addEventListener('click', function(e){ track(network); if (network === 'facebook' || network === 'twitter' || network === 'linkedin') { e.preventDefault(); window.open(btn.href, 'shareWindow', 'width=620,height=620,resizable=yes,scrollbars=yes'); } // email : laisse le mailto: par defaut }); }); }); })(); </script> </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>