<!DOCTYPE html>
<html lang="fr" dir="ltr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Désoptimisation : analysez et corrigez la suroptimisation SEO de vos pages</title>
<meta name="description" content="Collez l'URL d'une page, obtenez un diagnostic de suroptimisation SEO et des recommandations concrètes pour retrouver une pertinence naturelle aux yeux de Google.">
<link rel="canonical" href="https://www.desoptimisation.com/">
<meta property="og:type" content="website">
<meta property="og:title" content="Désoptimisation — Diagnostiquez la suroptimisation SEO">
<meta property="og:description" content="Analysez vos pages web et corrigez les signaux de suroptimisation qui pénalisent votre référencement naturel.">
<meta property="og:url" content="https://www.desoptimisation.com/">
<meta property="og:locale" content="fr_FR">
<meta name="robots" content="index, follow">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;600;700&family=Inter:wght@400;500&display=swap" media="print" onload="this.media='all'">
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;600;700&family=Inter:wght@400;500&display=swap"></noscript>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebApplication",
"name": "Désoptimisation",
"url": "https://www.desoptimisation.com/",
"description": "Outil de diagnostic de suroptimisation SEO pour pages web.",
"applicationCategory": "BusinessApplication",
"operatingSystem": "Any",
"offers": { "@type": "Offer", "price": "0", "priceCurrency": "EUR" },
"inLanguage": "fr"
}
</script>
<style>
/* ═════════════════════════════════════════════
TOKENS — tout part d'ici, pas de magic values
═════════════════════════════════════════════ */
:root {
--c-bg: #0D1117;
--c-surface: #161B22;
--c-card: #1F2430;
--c-border: #2D3340;
--c-text: #E6EDF3;
--c-muted: #8B949E;
--c-accent: #FF4D00;
--c-accent-lo: rgba(255,77,0,.12);
--c-blue: #1A73E8;
--c-blue-lo: rgba(26,115,232,.15);
--c-green: #3FB950;
--c-yellow: #D29922;
--c-red: #F85149;
--f-display: 'Space Grotesk', system-ui, sans-serif;
--f-body: 'Inter', system-ui, sans-serif;
--f-mono: 'Cascadia Code', 'Fira Code', ui-monospace, monospace;
--radius: .5rem;
--radius-lg: 1rem;
--transition: 200ms ease;
/* Spacing scale fluide */
--s-1: .5rem;
--s-2: 1rem;
--s-3: 1.5rem;
--s-4: 2rem;
--s-6: 3rem;
--s-8: 4rem;
--s-12: 6rem;
}
/* ═══ RESET minimal & box-sizing ═══ */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; }
/* CWV : évite les layout shifts sur les images */
img, video { max-width: 100%; height: auto; display: block; }
/* Réduction de mouvement — A11y préférence système */
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; }
}
/* ═══ BASE ═══ */
body {
font-family: var(--f-body);
font-size: 1rem;
line-height: 1.6;
color: var(--c-text);
background: var(--c-bg);
-webkit-font-smoothing: antialiased;
}
/* Focus visible — A11y clavier */
:focus-visible {
outline: 2px solid var(--c-accent);
outline-offset: 3px;
border-radius: 3px;
}
/* ═══ LAYOUT CONTAINER ═══ */
.container {
width: 100%;
max-width: 68rem;
padding-inline: var(--s-4);
margin-inline: auto;
}
/* ═══ SKIP LINK — A11y navigation clavier ═══ */
.skip-link {
position: absolute;
top: -100%;
left: var(--s-2);
z-index: 1000;
background: var(--c-accent);
color: #fff;
padding: var(--s-1) var(--s-2);
border-radius: var(--radius);
font-weight: 600;
text-decoration: none;
font-family: var(--f-display);
}
.skip-link:focus { top: var(--s-2); }
/* ═══════════════════════════════════════
HEADER / NAVIGATION
═══════════════════════════════════════ */
.site-header {
position: sticky;
top: 0;
z-index: 100;
background: rgba(13,17,23,.92);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border-bottom: 1px solid var(--c-border);
}
.nav-inner {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--s-2);
padding-block: var(--s-2);
}
.logo {
font-family: var(--f-display);
font-size: 1.15rem;
font-weight: 700;
color: var(--c-text);
text-decoration: none;
letter-spacing: -.02em;
}
.logo span { color: var(--c-accent); }
/* Nav principale */
.nav-links {
display: flex;
align-items: center;
gap: var(--s-3);
list-style: none;
}
.nav-links a {
color: var(--c-muted);
text-decoration: none;
font-size: .875rem;
font-weight: 500;
transition: color var(--transition);
}
.nav-links a:hover { color: var(--c-text); }
.btn-nav {
background: var(--c-accent);
color: #fff !important;
padding: .4em 1em;
border-radius: var(--radius);
font-weight: 600 !important;
font-size: .875rem;
transition: background var(--transition), transform var(--transition) !important;
}
.btn-nav:hover { background: #e84400 !important; transform: translateY(-1px); }
/* Menu burger mobile */
.menu-toggle {
display: none;
background: none;
border: 1px solid var(--c-border);
color: var(--c-text);
padding: var(--s-1);
border-radius: var(--radius);
cursor: pointer;
line-height: 1;
}
.menu-toggle svg { display: block; }
@media (max-width: 640px) {
.menu-toggle { display: flex; align-items: center; justify-content: center; }
.nav-links {
display: none;
flex-direction: column;
position: absolute;
top: 100%;
left: 0; right: 0;
background: var(--c-surface);
border-bottom: 1px solid var(--c-border);
padding: var(--s-3) var(--s-4);
gap: var(--s-3);
}
.nav-links.is-open { display: flex; }
}
/* ═══════════════════════════════════════
HERO — Section principale
Signature : score-o-mètre animé CSS
═══════════════════════════════════════ */
.hero {
padding-block: var(--s-12) var(--s-8);
text-align: center;
}
.hero-eyebrow {
display: inline-flex;
align-items: center;
gap: .4em;
font-family: var(--f-mono);
font-size: .75rem;
color: var(--c-accent);
background: var(--c-accent-lo);
border: 1px solid rgba(255,77,0,.25);
padding: .3em .8em;
border-radius: 2rem;
margin-bottom: var(--s-3);
letter-spacing: .05em;
text-transform: uppercase;
}
.hero-eyebrow::before { content: "⚠"; }
.hero h1 {
font-family: var(--f-display);
font-size: clamp(2rem, 5vw + .5rem, 3.5rem);
font-weight: 700;
line-height: 1.1;
letter-spacing: -.03em;
color: var(--c-text);
max-width: 18ch;
margin-inline: auto;
margin-bottom: var(--s-3);
}
.hero h1 em {
font-style: normal;
color: var(--c-accent);
}
.hero-desc {
font-size: clamp(1rem, 2vw, 1.2rem);
color: var(--c-muted);
max-width: 52ch;
margin-inline: auto;
margin-bottom: var(--s-6);
}
/* ── Jauge signature ── */
.gauge-wrap {
display: flex;
justify-content: center;
margin-bottom: var(--s-6);
}
.gauge {
position: relative;
width: min(320px, 80vw);
}
.gauge-label {
font-family: var(--f-mono);
font-size: .7rem;
color: var(--c-muted);
display: flex;
justify-content: space-between;
margin-bottom: var(--s-1);
}
.gauge-track {
width: 100%;
height: 12px;
background: var(--c-card);
border-radius: 6px;
overflow: hidden;
border: 1px solid var(--c-border);
}
.gauge-fill {
height: 100%;
width: 0%;
border-radius: 6px;
background: linear-gradient(90deg, var(--c-green) 0%, var(--c-yellow) 55%, var(--c-red) 100%);
animation: gauge-grow 2.2s cubic-bezier(.22,1,.36,1) 0.5s forwards;
}
@keyframes gauge-grow {
0% { width: 0%; }
60% { width: 100%; }
75% { width: 82%; }
85% { width: 97%; }
100% { width: 92%; }
}
.gauge-needle {
position: absolute;
right: 8%;
top: 1.8rem;
font-size: .65rem;
color: var(--c-red);
font-family: var(--f-mono);
font-weight: 700;
animation: needle-appear 2.4s ease forwards;
opacity: 0;
}
@keyframes needle-appear {
0%, 80% { opacity: 0; transform: translateY(4px); }
100% { opacity: 1; transform: translateY(0); }
}
.gauge-caption {
margin-top: var(--s-1);
font-size: .75rem;
color: var(--c-muted);
text-align: center;
font-family: var(--f-mono);
}
.gauge-caption strong { color: var(--c-red); }
/* ── Formulaire hero ── */
.hero-form {
display: flex;
flex-direction: column;
gap: var(--s-2);
max-width: 560px;
margin-inline: auto;
}
.input-row {
display: flex;
gap: var(--s-2);
}
.url-input {
flex: 1;
background: var(--c-surface);
border: 1.5px solid var(--c-border);
color: var(--c-text);
font-family: var(--f-mono);
font-size: .875rem;
padding: .75em 1em;
border-radius: var(--radius);
transition: border-color var(--transition);
min-width: 0;
}
.url-input::placeholder { color: var(--c-muted); }
.url-input:focus { border-color: var(--c-blue); outline: none; }
.url-input:focus-visible { outline: 2px solid var(--c-accent); outline-offset: 2px; }
.btn-primary {
display: inline-flex;
align-items: center;
gap: .5em;
background: var(--c-accent);
color: #fff;
font-family: var(--f-display);
font-weight: 600;
font-size: .9rem;
padding: .75em 1.5em;
border: none;
border-radius: var(--radius);
cursor: pointer;
white-space: nowrap;
transition: background var(--transition), transform var(--transition), box-shadow var(--transition);
text-decoration: none;
}
.btn-primary:hover {
background: #e84400;
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(255,77,0,.35);
}
.btn-primary:active { transform: translateY(0); }
.hero-trust {
display: flex;
align-items: center;
justify-content: center;
gap: var(--s-3);
flex-wrap: wrap;
font-size: .8rem;
color: var(--c-muted);
margin-top: var(--s-2);
}
.trust-item { display: flex; align-items: center; gap: .4em; }
.trust-item::before { content: "✓"; color: var(--c-green); font-weight: 700; }
@media (max-width: 480px) {
.input-row { flex-direction: column; }
}
/* ═══════════════════════════════════════
SECTION — Problèmes communs
═══════════════════════════════════════ */
.section {
padding-block: var(--s-12);
}
.section-alt {
background: var(--c-surface);
border-top: 1px solid var(--c-border);
border-bottom: 1px solid var(--c-border);
}
.section-header {
text-align: center;
margin-bottom: var(--s-6);
}
.section-kicker {
font-family: var(--f-mono);
font-size: .75rem;
color: var(--c-blue);
text-transform: uppercase;
letter-spacing: .08em;
display: block;
margin-bottom: var(--s-1);
}
.section-header h2 {
font-family: var(--f-display);
font-size: clamp(1.5rem, 3.5vw, 2.2rem);
font-weight: 700;
letter-spacing: -.02em;
color: var(--c-text);
margin-bottom: var(--s-2);
}
.section-header p {
color: var(--c-muted);
max-width: 52ch;
margin-inline: auto;
font-size: .95rem;
}
/* Grille de cards problèmes */
.problems-grid {
display: flex;
flex-wrap: wrap;
gap: var(--s-3);
}
.problem-card {
flex: 1 1 260px;
background: var(--c-card);
border: 1px solid var(--c-border);
border-radius: var(--radius-lg);
padding: var(--s-4);
position: relative;
overflow: hidden;
transition: border-color var(--transition), transform var(--transition);
}
.problem-card:hover {
border-color: var(--c-accent);
transform: translateY(-3px);
}
.problem-card::before {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(135deg, var(--c-accent-lo) 0%, transparent 60%);
opacity: 0;
transition: opacity var(--transition);
}
.problem-card:hover::before { opacity: 1; }
.card-severity {
display: inline-block;
font-family: var(--f-mono);
font-size: .65rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: .06em;
padding: .2em .6em;
border-radius: 2rem;
margin-bottom: var(--s-2);
}
.severity-high { background: rgba(248,81,73,.15); color: var(--c-red); border: 1px solid rgba(248,81,73,.3); }
.severity-med { background: rgba(210,153,34,.15); color: var(--c-yellow); border: 1px solid rgba(210,153,34,.3); }
.severity-low { background: rgba(63,185,80,.15); color: var(--c-green); border: 1px solid rgba(63,185,80,.3); }
.problem-card h3 {
font-family: var(--f-display);
font-size: 1rem;
font-weight: 600;
color: var(--c-text);
margin-bottom: var(--s-1);
}
.problem-card p {
font-size: .875rem;
color: var(--c-muted);
line-height: 1.55;
}
.card-icon {
font-size: 1.5rem;
margin-bottom: var(--s-2);
display: block;
}
/* ═══════════════════════════════════════
SECTION — Comment ça marche
═══════════════════════════════════════ */
.how-steps {
display: flex;
flex-wrap: wrap;
gap: var(--s-4);
counter-reset: steps;
}
.step {
flex: 1 1 200px;
display: flex;
flex-direction: column;
gap: var(--s-2);
counter-increment: steps;
}
.step-number {
width: 2.5rem;
height: 2.5rem;
border-radius: 50%;
background: var(--c-accent-lo);
border: 1.5px solid rgba(255,77,0,.4);
display: flex;
align-items: center;
justify-content: center;
font-family: var(--f-display);
font-weight: 700;
font-size: .875rem;
color: var(--c-accent);
flex-shrink: 0;
}
.step-number::before { content: counter(steps); }
.step h3 {
font-family: var(--f-display);
font-size: 1.05rem;
font-weight: 600;
color: var(--c-text);
}
.step p { font-size: .875rem; color: var(--c-muted); }
/* ═══════════════════════════════════════
SECTION — Astuces désoptimisation
(encadrés code avec tips)
═══════════════════════════════════════ */
.tips-grid {
display: flex;
flex-wrap: wrap;
gap: var(--s-3);
}
.tip-block {
flex: 1 1 280px;
background: var(--c-card);
border: 1px solid var(--c-border);
border-left: 3px solid var(--c-blue);
border-radius: var(--radius-lg);
padding: var(--s-3) var(--s-4);
}
.tip-block h3 {
font-family: var(--f-display);
font-size: .95rem;
font-weight: 600;
color: var(--c-text);
margin-bottom: var(--s-1);
}
.tip-block p { font-size: .85rem; color: var(--c-muted); }
.code-compare {
display: flex;
flex-wrap: wrap;
gap: var(--s-3);
margin-top: var(--s-4);
}
.code-box {
flex: 1 1 240px;
background: var(--c-card);
border-radius: var(--radius-lg);
overflow: hidden;
}
.code-box-header {
display: flex;
align-items: center;
gap: .5em;
padding: .6em var(--s-2);
font-family: var(--f-mono);
font-size: .7rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: .06em;
}
.code-box-header.bad { background: rgba(248,81,73,.1); color: var(--c-red); border-bottom: 1px solid rgba(248,81,73,.2); }
.code-box-header.good { background: rgba(63,185,80,.1); color: var(--c-green); border-bottom: 1px solid rgba(63,185,80,.2); }
.code-box pre {
padding: var(--s-2) var(--s-3);
font-family: var(--f-mono);
font-size: .78rem;
color: var(--c-muted);
white-space: pre-wrap;
word-break: break-word;
line-height: 1.6;
}
.code-box pre .hl-bad { color: var(--c-red); }
.code-box pre .hl-good { color: var(--c-green); }
.code-box pre .hl-key { color: var(--c-blue); }
.code-box pre .hl-str { color: #79c0ff; }
/* ═══════════════════════════════════════
SECTION — Formulaire d'analyse complet
═══════════════════════════════════════ */
.cta-section {
padding-block: var(--s-12);
}
.cta-card {
background: linear-gradient(135deg, var(--c-surface) 0%, #1a1f2e 100%);
border: 1px solid var(--c-border);
border-radius: calc(var(--radius-lg) * 1.5);
padding: clamp(var(--s-4), 6vw, var(--s-8));
text-align: center;
}
.cta-card h2 {
font-family: var(--f-display);
font-size: clamp(1.4rem, 3vw, 2rem);
font-weight: 700;
letter-spacing: -.02em;
color: var(--c-text);
margin-bottom: var(--s-2);
}
.cta-card p {
color: var(--c-muted);
margin-bottom: var(--s-4);
font-size: .95rem;
max-width: 50ch;
margin-inline: auto;
margin-bottom: var(--s-4);
}
/* Formulaire analyse complet */
.analysis-form {
display: flex;
flex-direction: column;
gap: var(--s-3);
max-width: 560px;
margin-inline: auto;
text-align: left;
}
.form-group { display: flex; flex-direction: column; gap: .4em; }
.form-group label {
font-size: .8rem;
font-weight: 500;
color: var(--c-muted);
font-family: var(--f-display);
}
.form-group label span { color: var(--c-accent); }
.form-control {
background: var(--c-bg);
border: 1.5px solid var(--c-border);
color: var(--c-text);
font-family: var(--f-body);
font-size: .9rem;
padding: .7em 1em;
border-radius: var(--radius);
transition: border-color var(--transition);
width: 100%;
}
.form-control:focus { border-color: var(--c-blue); outline: none; box-shadow: 0 0 0 3px var(--c-blue-lo); }
.form-control::placeholder { color: var(--c-muted); font-size: .85rem; }
select.form-control { cursor: pointer; appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='%238B949E' d='M6 8L0 0h12z'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 1em center; padding-right: 2.5em; }
.form-row { display: flex; gap: var(--s-2); }
.form-row .form-group { flex: 1; }
.form-check {
display: flex;
align-items: flex-start;
gap: .5em;
font-size: .8rem;
color: var(--c-muted);
}
.form-check input[type="checkbox"] {
width: 1rem;
height: 1rem;
margin-top: .1em;
accent-color: var(--c-accent);
cursor: pointer;
flex-shrink: 0;
}
.form-check a { color: var(--c-blue); }
.btn-submit {
width: 100%;
padding: .875em;
font-size: 1rem;
justify-content: center;
}
/* État de chargement */
.btn-submit[aria-busy="true"] {
opacity: .7;
cursor: wait;
pointer-events: none;
}
.btn-submit[aria-busy="true"]::after {
content: '';
display: inline-block;
width: 1em;
height: 1em;
border: 2px solid rgba(255,255,255,.4);
border-top-color: #fff;
border-radius: 50%;
animation: spin .6s linear infinite;
margin-left: .5em;
}
@keyframes spin { to { transform: rotate(360deg); } }
/* Message résultat */
#form-result {
display: none;
padding: var(--s-3);
border-radius: var(--radius);
font-size: .875rem;
font-family: var(--f-display);
font-weight: 500;
}
#form-result.success {
display: block;
background: rgba(63,185,80,.1);
border: 1px solid rgba(63,185,80,.3);
color: var(--c-green);
}
#form-result.error {
display: block;
background: rgba(248,81,73,.1);
border: 1px solid rgba(248,81,73,.3);
color: var(--c-red);
}
/* ═══════════════════════════════════════
SECTION — Chiffres clés
═══════════════════════════════════════ */
.stats-row {
display: flex;
flex-wrap: wrap;
gap: var(--s-3);
}
.stat-item {
flex: 1 1 160px;
text-align: center;
padding: var(--s-4);
background: var(--c-card);
border: 1px solid var(--c-border);
border-radius: var(--radius-lg);
}
.stat-number {
font-family: var(--f-display);
font-size: clamp(2rem, 4vw, 2.8rem);
font-weight: 700;
color: var(--c-accent);
letter-spacing: -.03em;
display: block;
}
.stat-label {
font-size: .8rem;
color: var(--c-muted);
margin-top: .25em;
}
/* ═══════════════════════════════════════
SECTION FAQ — Schema FAQPage
═══════════════════════════════════════ */
.faq-list {
max-width: 680px;
margin-inline: auto;
display: flex;
flex-direction: column;
gap: var(--s-2);
}
.faq-item {
background: var(--c-card);
border: 1px solid var(--c-border);
border-radius: var(--radius-lg);
overflow: hidden;
}
.faq-question {
width: 100%;
background: none;
border: none;
text-align: left;
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--s-2);
padding: var(--s-3) var(--s-4);
cursor: pointer;
font-family: var(--f-display);
font-size: .95rem;
font-weight: 600;
color: var(--c-text);
transition: background var(--transition);
}
.faq-question:hover { background: rgba(255,255,255,.03); }
.faq-icon {
font-size: 1.2rem;
color: var(--c-muted);
flex-shrink: 0;
transition: transform var(--transition);
}
.faq-item.is-open .faq-icon { transform: rotate(45deg); color: var(--c-accent); }
.faq-answer {
display: none;
padding: 0 var(--s-4) var(--s-3);
font-size: .875rem;
color: var(--c-muted);
line-height: 1.65;
}
.faq-item.is-open .faq-answer { display: block; }
/* ═══════════════════════════════════════
FOOTER
═══════════════════════════════════════ */
.site-footer {
background: var(--c-surface);
border-top: 1px solid var(--c-border);
padding-block: var(--s-6);
}
.footer-inner {
display: flex;
flex-wrap: wrap;
gap: var(--s-4);
justify-content: space-between;
}
.footer-brand { flex: 1 1 200px; }
.footer-brand .logo { display: inline-block; margin-bottom: var(--s-2); }
.footer-brand p { font-size: .8rem; color: var(--c-muted); max-width: 28ch; }
.footer-links { flex: 1 1 120px; }
.footer-links h3 {
font-family: var(--f-display);
font-size: .8rem;
font-weight: 600;
color: var(--c-text);
text-transform: uppercase;
letter-spacing: .06em;
margin-bottom: var(--s-2);
}
.footer-links ul { list-style: none; display: flex; flex-direction: column; gap: .6em; }
.footer-links a { font-size: .8rem; color: var(--c-muted); text-decoration: none; transition: color var(--transition); }
.footer-links a:hover { color: var(--c-text); }
.footer-bottom {
margin-top: var(--s-4);
padding-top: var(--s-4);
border-top: 1px solid var(--c-border);
display: flex;
flex-wrap: wrap;
gap: var(--s-2);
justify-content: space-between;
align-items: center;
}
.footer-bottom p { font-size: .75rem; color: var(--c-muted); }
/* ═══════════════════════════════════════
TOAST NOTIFICATION
═══════════════════════════════════════ */
#toast {
position: fixed;
bottom: var(--s-4);
right: var(--s-4);
z-index: 999;
background: var(--c-card);
border: 1px solid var(--c-border);
border-left: 3px solid var(--c-green);
color: var(--c-text);
font-family: var(--f-display);
font-size: .875rem;
padding: var(--s-2) var(--s-3);
border-radius: var(--radius-lg);
box-shadow: 0 8px 32px rgba(0,0,0,.4);
transform: translateX(120%);
transition: transform .3s cubic-bezier(.22,1,.36,1);
max-width: 300px;
}
#toast.show { transform: translateX(0); }
/* ═══════════════════════════════════════
UTILITAIRES
═══════════════════════════════════════ */
.visually-hidden {
position: absolute;
width: 1px; height: 1px;
padding: 0; margin: -1px;
overflow: hidden;
clip: rect(0,0,0,0);
white-space: nowrap;
border: 0;
}
.text-center { text-align: center; }
.mt-4 { margin-top: var(--s-4); }
.mt-6 { margin-top: var(--s-6); }
</style>
</head>
<body>
<!-- A11y : lien d'évitement navigation clavier -->
<a href="#main-content" class="skip-link">Aller au contenu principal</a>
<!-- ═══════════════════════════════════
EN-TÊTE & NAVIGATION
role="banner" implicite sur <header>
═══════════════════════════════════ -->
<header class="site-header" role="banner">
<div class="container">
<nav class="nav-inner" aria-label="Navigation principale">
<a href="/" class="logo" aria-label="Désoptimisation — Accueil">
Dés<span>optimisation</span>
</a>
<!-- A11y : bouton burger avec état ARIA -->
<button class="menu-toggle" id="menu-toggle"
aria-expanded="false"
aria-controls="nav-links"
aria-label="Ouvrir le menu de navigation">
<svg width="20" height="20" viewbox="0 0 20 20" fill="none" aria-hidden="true" focusable="false">
<rect x="2" y="5" width="16" height="1.5" rx=".75" fill="currentColor"/>
<rect x="2" y="9.25" width="16" height="1.5" rx=".75" fill="currentColor"/>
<rect x="2" y="13.5" width="16" height="1.5" rx=".75" fill="currentColor"/>
</svg>
</button>
<ul class="nav-links" id="nav-links" role="list">
<li><a href="#comment-ca-marche">Comment ça marche</a></li>
<li><a href="#astuces">Astuces</a></li>
<li><a href="#faq">FAQ</a></li>
<li><a href="#analyser" class="btn-nav">Analyser ma page →</a></li>
</ul>
</nav>
</div>
</header>
<main id="main-content">
<section class="hero" aria-labelledby="hero-title">
<div class="container">
<p class="hero-eyebrow" role="note">Nouvelle mise à jour Google 2025</p>
<h1 id="hero-title">Désoptimisation :
Votre page est-elle<br>
<em>trop optimisée</em> ?
</h1>
<p class="hero-desc">
La suroptimisation pénalise autant que l'absence de SEO.
Analysez votre page, détectez les signaux suspects et retrouvez
une pertinence naturelle — sans modifier votre contenu utile.
</p>
<div class="gauge-wrap" role="img" aria-label="Exemple de score de suroptimisation à 92% — dangereux">
<div class="gauge">
<div class="gauge-label">
<span>0 — Naturel</span>
<span>100 — Pénalisé</span>
</div>
<div class="gauge-track" role="presentation">
<div class="gauge-fill"></div>
</div>
<div class="gauge-needle" aria-hidden="true">▲ 92%</div>
<p class="gauge-caption">Score suroptimisation :
<strong>CRITIQUE</strong> — votre page ressemble à du spam
</p>
</div>
</div>
<div role="search" aria-label="Analyser une URL">
<form class="hero-form" id="hero-url-form" novalidate
action="#analyser" method="GET">
<div class="input-row">
<label for="hero-url" class="visually-hidden">URL de la page à analyser</label>
<input
type="url"
id="hero-url"
name="url"
class="url-input"
placeholder="https://monsite.fr/ma-page-seo"
autocomplete="url"
spellcheck="false"
required
aria-required="true"
aria-describedby="hero-url-hint"
>
<button type="submit" class="btn-primary" aria-label="Lancer l'analyse de suroptimisation">
Analyser →
</button>
</div>
<p id="hero-url-hint" class="trust-item" style="font-size:.78rem;color:var(--c-muted);margin-top:.25rem;">
Entrez l'URL complète, avec https://
</p>
</form>
</div>
<ul class="hero-trust" role="list">
<li class="trust-item">Gratuit, sans compte</li>
<li class="trust-item">Résultats en 10 secondes</li>
<li class="trust-item">Données non stockées</li>
</ul>
</div>
</section><!-- /hero -->
<!-- ── STATS ── -->
<section class="section section-alt" aria-labelledby="stats-title">
<div class="container">
<h2 id="stats-title" class="visually-hidden">Désoptimisation en chiffres</h2>
<div class="stats-row">
<div class="stat-item">
<span class="stat-number" aria-label="78 pour cent">78%</span>
<p class="stat-label">des sites e-commerce analysés présentent au moins 3 signaux de suroptimisation</p>
</div>
<div class="stat-item">
<span class="stat-number" aria-label="Moins 34 pour cent">−34%</span>
<p class="stat-label">de trafic organique en moyenne après une pénalité de suroptimisation Google</p>
</div>
<div class="stat-item">
<span class="stat-number" aria-label="12">12</span>
<p class="stat-label">types de suroptimisation détectés automatiquement lors de l'analyse</p>
</div>
<div class="stat-item">
<span class="stat-number" aria-label="Moins de 10 secondes"><10s</span>
<p class="stat-label">pour obtenir un rapport complet et des recommandations personnalisées</p>
</div>
</div>
</div>
</section>
<!-- ── PROBLÈMES COMMUNS ── -->
<section class="section" id="problemes" aria-labelledby="problems-title">
<div class="container">
<header class="section-header">
<span class="section-kicker">Ce que détecte l'outil</span>
<h2 id="problems-title">12 signaux de suroptimisation qui font chuter votre trafic</h2>
<p>Google sait distinguer le contenu optimisé <em>pour lui</em> du contenu optimisé <em>pour les lecteurs</em>. Voici ce qu'il pénalise.</p>
</header>
<div class="problems-grid" role="list">
<article class="problem-card" role="listitem">
<span class="card-icon" aria-hidden="true">🔑</span>
<span class="card-severity severity-high">Critique</span>
<h3>Bourrage de mots-clés</h3>
<p>Une densité de keyword >3% dans un texte naturel déclenche des filtres algorithmiques depuis la mise à jour Panda.</p>
</article>
<article class="problem-card" role="listitem">
<span class="card-icon" aria-hidden="true">🏷️</span>
<span class="card-severity severity-high">Critique</span>
<h3>Title & meta surchargés</h3>
<p>Répéter 3 fois le même terme dans la balise <title> ou entasser des synonymes dans la meta description nuit à la pertinence.</p>
</article>
<article class="problem-card" role="listitem">
<span class="card-icon" aria-hidden="true">🔗</span>
<span class="card-severity severity-high">Critique</span>
<h3>Ancres de liens sur-optimisées</h3>
<p>Un profil de backlinks avec >60% d'ancres exact-match est un signal négatif identifié dans les guidelines Google Quality Rater.</p>
</article>
<article class="problem-card" role="listitem">
<span class="card-icon" aria-hidden="true">📋</span>
<span class="card-severity severity-med">Modéré</span>
<h3>Contenu IA sans valeur ajoutée</h3>
<p>Les pages générées en masse par IA sans véritable expertise editoriale sont ciblées par les Core Updates depuis 2024.</p>
</article>
<article class="problem-card" role="listitem">
<span class="card-icon" aria-hidden="true">📄</span>
<span class="card-severity severity-med">Modéré</span>
<h3>Pages quasi-dupliquées</h3>
<p>Des déclinaisons de pages sur des variantes de mots-clés proches cannibalisent mutuellement votre potentiel de ranking.</p>
</article>
<article class="problem-card" role="listitem">
<span class="card-icon" aria-hidden="true">🗂️</span>
<span class="card-severity severity-low">Faible</span>
<h3>Structure de titres artificiellement lourde</h3>
<p>Multiplier les H2/H3 contenant le mot-clé principal pour « couvrir le champ sémantique » au détriment de la lisibilité.</p>
</article>
</div>
</div>
</section>
<!-- ── COMMENT ÇA MARCHE ── -->
<section class="section section-alt" id="comment-ca-marche" aria-labelledby="how-title">
<div class="container">
<header class="section-header">
<span class="section-kicker">Processus</span>
<h2 id="how-title">Comment fonctionne l'analyse</h2>
<p>L'outil crawle votre page, analyse le HTML rendu côté client et compare vos signaux à des seuils empiriques issus de milliers d'audits.</p>
</header>
<ol class="how-steps" aria-label="Étapes du processus d'analyse">
<li class="step">
<div class="step-number" aria-label="Étape 1" role="img"></div>
<h3>Collez votre URL</h3>
<p>L'outil accepte toute page publique. Pas de plugin, pas de crawl de votre serveur.</p>
</li>
<li class="step">
<div class="step-number" aria-label="Étape 2" role="img"></div>
<h3>Analyse en temps réel</h3>
<p>Rendu HTML, calcul de densité, analyse des balises, profil d'ancres internes. En moins de 10 secondes.</p>
</li>
<li class="step">
<div class="step-number" aria-label="Étape 3" role="img"></div>
<h3>Rapport de suroptimisation</h3>
<p>Un score global et des recommandations priorisées selon le niveau de risque détecté sur votre page.</p>
</li>
<li class="step">
<div class="step-number" aria-label="Étape 4" role="img"></div>
<h3>Corrigez vos signaux</h3>
<p>Des exemples concrets avant/après pour chaque problème, adaptés à votre thématique.</p>
</li>
</ol>
</div>
</section>
<!-- ── ASTUCES DÉSOPTIMISATION ── -->
<section class="section" id="astuces" aria-labelledby="tips-title">
<div class="container">
<header class="section-header">
<span class="section-kicker">Guide pratique</span>
<h2 id="tips-title">5 techniques de désoptimisation à appliquer maintenant</h2>
<p>Ce ne sont pas des hacks — c'est simplement écrire et structurer pour les humains d'abord.</p>
</header>
<div class="tips-grid">
<div class="tip-block">
<h3>Variez le vocabulaire, pas le mot-clé</h3>
<p>Utilisez des synonymes, des termes de co-occurrence sémantique et des reformulations naturelles. Google comprend les entités, pas les répétitions exactes.</p>
</div>
<div class="tip-block">
<h3>Écrêtez le Title à 55 caractères</h3>
<p>Un title qui dépasse 55 caractères est tronqué dans les SERPs. Plus court = plus clair = meilleur CTR. Un seul intent par title.</p>
</div>
<div class="tip-block">
<h3>Diversifiez vos ancres internes</h3>
<p>Utilisez des ancres descriptives variées, pas toujours le mot-clé exact. "Voir le guide", "notre méthode", "en savoir plus sur X" valent mieux que 10 fois "formation SEO Paris".</p>
</div>
<div class="tip-block">
<h3>Supprimez les sections « rembourrage »</h3>
<p>Chaque H2 doit apporter une information absente des autres sections. Si vous ne pouvez pas résumer son apport en 1 phrase, supprimez-le.</p>
</div>
<div class="tip-block">
<h3>Publiez moins, publiez mieux</h3>
<p>Google préfère 10 pages de référence à 100 pages thin content. Fusionnez vos pages proches, consolidez votre autorité sur moins d'URLs.</p>
</div>
</div>
<div class="code-compare" role="group" aria-label="Comparaison code suroptimisé vs naturel">
<div class="code-box">
<div class="code-box-header bad" aria-label="Mauvais exemple">❌ Suroptimisé</div>
<pre aria-label="Exemple de balise title suroptimisée"><code><span class="hl-key"><title></span>
<span class="hl-bad">Formation SEO Paris | Cours SEO Paris
| Apprendre SEO Paris</span>
<span class="hl-key"></title></span>
<span class="hl-key"><meta</span> <span class="hl-str">name</span>=<span class="hl-str">"description"</span>
<span class="hl-str">content</span>=<span class="hl-str">"<span class="hl-bad">Formation SEO Paris</span> pour
apprendre le <span class="hl-bad">SEO Paris</span>. Notre
<span class="hl-bad">formation SEO Paris</span> pas chère."</span><span class="hl-key">/></span></code></pre>
</div>
<div class="code-box">
<div class="code-box-header good" aria-label="Bon exemple">✓ Naturel & efficace</div>
<pre aria-label="Exemple de balise title naturelle"><code><span class="hl-key"><title></span>
<span class="hl-good">Formation SEO à Paris</span> — Maîtrisez
le référencement naturel
<span class="hl-key"></title></span>
<span class="hl-key"><meta</span> <span class="hl-str">name</span>=<span class="hl-str">"description"</span>
<span class="hl-str">content</span>=<span class="hl-str">"Apprenez à optimiser vos
pages et à améliorer votre visibilité
Google. Formation pratique, 2 jours."</span><span class="hl-key">/></span></code></pre>
</div>
</div>
</div>
</section>
<!-- ── FORMULAIRE D'ANALYSE COMPLET ── -->
<section class="cta-section" id="analyser" aria-labelledby="cta-title">
<div class="container">
<div class="cta-card">
<h2 id="cta-title">Obtenez votre diagnostic gratuit</h2>
<p>
Entrez l'URL d'une page et votre email pour recevoir un rapport
complet de désoptimisation avec des recommandations adaptées à votre thématique.
</p>
<form class="analysis-form" id="analysis-form" novalidate aria-label="Formulaire d'analyse de suroptimisation">
<div class="form-group">
<label for="page-url">URL de la page à analyser <span aria-label="obligatoire">*</span></label>
<input
type="url"
id="page-url"
name="page_url"
class="form-control"
placeholder="https://monsite.fr/ma-page-optimisee"
autocomplete="url"
required
aria-required="true"
aria-describedby="page-url-error"
>
<span id="page-url-error" class="visually-hidden" role="alert" aria-live="polite"></span>
</div>
<div class="form-row">
<div class="form-group">
<label for="user-email">Email <span aria-label="obligatoire">*</span></label>
<input
type="email"
id="user-email"
name="email"
class="form-control"
placeholder="vous@votresite.fr"
autocomplete="email"
required
aria-required="true"
aria-describedby="email-error"
>
<span id="email-error" class="visually-hidden" role="alert" aria-live="polite"></span>
</div>
<div class="form-group">
<label for="user-role">Votre profil</label>
<select id="user-role" name="role" class="form-control" aria-label="Sélectionnez votre profil professionnel">
<option value="">— Choisir —</option>
<option value="webmaster">Webmaster / Développeur</option>
<option value="seo">Consultant SEO / SEM</option>
<option value="marketing">Marketing / Communication</option>
<option value="editor">Éditeur de site / Rédacteur</option>
<option value="other">Autre</option>
</select>
</div>
</div>
<div class="form-group">
<label for="theme">Thématique de la page</label>
<input
type="text"
id="theme"
name="theme"
class="form-control"
placeholder="ex. immobilier, e-commerce, santé, SaaS…"
autocomplete="off"
>
</div>
<div class="form-check">
<input type="checkbox" id="consent" name="consent" required aria-required="true">
<label for="consent">
J'accepte de recevoir mon rapport et les informations de
<a href="/mentions-legales" target="_blank" rel="noopener">
Désoptimisation.com
</a>
(désinscription à tout moment).
</label>
</div>
<div id="form-result" role="status" aria-live="polite"></div>
<button
type="submit"
class="btn-primary btn-submit"
aria-label="Lancer l'analyse et recevoir le rapport par email"
>
<svg width="16" height="16" viewbox="0 0 16 16" fill="none" aria-hidden="true" focusable="false">
<path d="M8 1.5a6.5 6.5 0 1 1 0 13 6.5 6.5 0 0 1 0-13zM8 0a8 8 0 1 0 0 16A8 8 0 0 0 8 0z" fill="currentColor" opacity=".5"/>
<path d="M8.5 4.5a.5.5 0 0 0-1 0v4a.5.5 0 0 0 .146.354l2.5 2.5a.5.5 0 0 0 .708-.708L8.5 8.293V4.5z" fill="currentColor"/>
</svg>
Analyser ma page gratuitement
</button>
<p style="font-size:.75rem;color:var(--c-muted);text-align:center;margin-top:.5rem;">
Gratuit · Résultats par email sous 2 min · Pas de spam
</p>
</form>
</div>
</div>
</section>
<!-- ── FAQ (Schema FAQPage) ── -->
<section class="section section-alt" id="faq" aria-labelledby="faq-title">
<div class="container">
<header class="section-header">
<span class="section-kicker">Questions fréquentes</span>
<h2 id="faq-title">Ce que les webmasters demandent le plus</h2>
</header>
<!-- Schema.org FAQPage — NE PAS abuser : max 5-7 questions pertinentes -->
<div class="faq-list" itemscope itemtype="https://schema.org/FAQPage">
<div class="faq-item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question">
<button class="faq-question" aria-expanded="false" aria-controls="faq-a1" id="faq-q1">
<span itemprop="name">Quelle est la différence entre optimisation SEO et suroptimisation ?</span>
<span class="faq-icon" aria-hidden="true">+</span>
</button>
<div class="faq-answer" id="faq-a1" role="region" aria-labelledby="faq-q1"
itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer">
<p itemprop="text">L'optimisation SEO consiste à rendre votre contenu clair et pertinent pour les moteurs de recherche sans le dégrader pour les lecteurs. La suroptimisation, c'est quand les signaux SEO deviennent si voyants — répétitions de mots-clés, ancres artificielles, structure gonflée — que l'algorithme les identifie comme manipulations. Le curseur est passé depuis 2022 : Google valorise les signaux naturels de l'<em>E-E-A-T</em> (expérience, expertise, autorité, fiabilité).</p>
</div>
</div>
<div class="faq-item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question">
<button class="faq-question" aria-expanded="false" aria-controls="faq-a2" id="faq-q2">
<span itemprop="name">Mon site a chuté après une Core Update — est-ce de la suroptimisation ?</span>
<span class="faq-icon" aria-hidden="true">+</span>
</button>
<div class="faq-answer" id="faq-a2" role="region" aria-labelledby="faq-q2"
itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer">
<p itemprop="text">Pas nécessairement — les Core Updates peuvent aussi pénaliser un manque de contenu de qualité, un faible E-E-A-T ou une mauvaise expérience utilisateur. Mais si vous avez utilisé des techniques d'optimisation intensives ces 6-12 derniers mois, la désoptimisation fait partie des premières pistes à explorer. L'outil identifie les signaux à risque pour vous aider à trier.</p>
</div>
</div>
<div class="faq-item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question">
<button class="faq-question" aria-expanded="false" aria-controls="faq-a3" id="faq-q3">
<span itemprop="name">Combien de temps faut-il pour récupérer après avoir désoptimisé ?</span>
<span class="faq-icon" aria-hidden="true">+</span>
</button>
<div class="faq-answer" id="faq-a3" role="region" aria-labelledby="faq-q3"
itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer">
<p itemprop="text">Après des corrections concrètes (réécriture du contenu, révision des balises, nettoyage du profil d'ancres), les effets sur les rankings apparaissent généralement lors de la prochaine Core Update ou du prochain recrawl complet — entre 4 et 12 semaines. La récupération après une pénalité manuelle est plus longue et nécessite une reconsidération.</p>
</div>
</div>
<div class="faq-item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question">
<button class="faq-question" aria-expanded="false" aria-controls="faq-a4" id="faq-q4">
<span itemprop="name">L'outil fonctionne-t-il pour les pages en langue étrangère ?</span>
<span class="faq-icon" aria-hidden="true">+</span>
</button>
<div class="faq-answer" id="faq-a4" role="region" aria-labelledby="faq-q4"
itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer">
<p itemprop="text">Oui. L'analyse porte sur des signaux structurels (balises, densité relative, structure de titres, ancres) qui sont indépendants de la langue. Les recommandations textuelles sont générées en français quelle que soit la langue de la page analysée. La prise en charge multilingue complète est prévue pour 2025.</p>
</div>
</div>
</div>
<!-- Schema JSON-LD FAQPage (duplique le microdata — les deux ont leurs avantages) -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Quelle est la différence entre optimisation SEO et suroptimisation ?",
"acceptedAnswer": {
"@type": "Answer",
"text": "L'optimisation SEO consiste à rendre votre contenu pertinent sans le dégrader pour les lecteurs. La suroptimisation, c'est quand les signaux deviennent si voyants que l'algorithme les identifie comme manipulations."
}
},
{
"@type": "Question",
"name": "Mon site a chuté après une Core Update — est-ce de la suroptimisation ?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Pas nécessairement. Les Core Updates peuvent aussi pénaliser un faible E-E-A-T. L'outil identifie les signaux à risque pour vous aider à trier."
}
}
]
}
</script>
</div>
</section>
</main>
<!-- ═══════════════════════════════════
PIED DE PAGE
═══════════════════════════════════ -->
<footer class="site-footer" role="contentinfo">
<div class="container">
<div class="footer-inner">
<div class="footer-brand">
<a href="/" class="logo" aria-label="Désoptimisation — Accueil">
Dés<span>optimisation</span>
</a>
<p>Diagnostiquez et corrigez la suroptimisation SEO de vos pages web. Retrouvez une pertinence naturelle.</p>
</div>
<nav class="footer-links" aria-label="Liens Outil">
<h3>Outil</h3>
<ul role="list">
<li><a href="#analyser">Analyser une page</a></li>
<li><a href="#astuces">Guide désoptimisation</a></li>
<li><a href="#faq">FAQ</a></li>
</ul>
</nav>
<nav class="footer-links" aria-label="Liens Ressources">
<h3>Ressources</h3>
<ul role="list">
<li><a href="#/blog">Blog SEO</a></li>
<li><a href="#/glossaire">Glossaire</a></li>
<li><a href="#/api">API (bêta)</a></li>
</ul>
</nav>
<nav class="footer-links" aria-label="Liens Légaux">
<h3>Légal</h3>
<ul role="list">
<li><a href="#/mentions-legales">Mentions légales</a></li>
<li><a href="#/confidentialite">Confidentialité</a></li>
<li><a href="#/cgv">CGU</a></li>
</ul>
</nav>
</div>
<div class="footer-bottom">
<p>© <span id="year"></span> Désoptimisation.com — Tous droits réservés</p>
<p>
<a href="#/accessibilite" style="color:var(--c-muted);font-size:.75rem;">Accessibilité</a> ·
<a href="#/sitemap.xml" style="color:var(--c-muted);font-size:.75rem;">Plan du site</a>
</p>
</div>
</div>
</footer>
<div id="toast" role="status" aria-live="polite" aria-atomic="true"></div>
<script>
(() => {
'use strict';
const yearEl = document.getElementById('year');
if (yearEl) yearEl.textContent = new Date().getFullYear();
const toggle = document.getElementById('menu-toggle');
const navLinks = document.getElementById('nav-links');
if (toggle && navLinks) {
toggle.addEventListener('click', () => {
const isOpen = navLinks.classList.toggle('is-open');
toggle.setAttribute('aria-expanded', isOpen);
toggle.setAttribute('aria-label', isOpen ? 'Fermer le menu' : 'Ouvrir le menu de navigation');
});
navLinks.querySelectorAll('a').forEach(a => {
a.addEventListener('click', () => {
navLinks.classList.remove('is-open');
toggle.setAttribute('aria-expanded', 'false');
});
});
}
document.querySelectorAll('.faq-question').forEach(btn => {
btn.addEventListener('click', () => {
const item = btn.closest('.faq-item');
const isOpen = item.classList.contains('is-open');
/* Fermer tous les items (comportement accordion) */
document.querySelectorAll('.faq-item').forEach(i => {
i.classList.remove('is-open');
i.querySelector('.faq-question').setAttribute('aria-expanded', 'false');
});
/* Ouvrir l'item cliqué si ce n'était pas déjà ouvert */
if (!isOpen) {
item.classList.add('is-open');
btn.setAttribute('aria-expanded', 'true');
}
});
});
/* ── Toast helper ── */
function showToast(msg, duration = 4000) {
const toast = document.getElementById('toast');
if (!toast) return;
toast.textContent = msg;
toast.classList.add('show');
setTimeout(() => toast.classList.remove('show'), duration);
}
/* ── Validation URL helper ── */
function isValidUrl(str) {
try {
const u = new URL(str);
return u.protocol === 'http:' || u.protocol === 'https:';
} catch { return false; }
}
/* ── Validation email helper ── */
function isValidEmail(str) {
return /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/.test(str);
}
/* ── Formulaire hero : scroll vers l'analyse complète + pré-remplissage ── */
const heroForm = document.getElementById('hero-url-form');
if (heroForm) {
heroForm.addEventListener('submit', e => {
e.preventDefault();
const urlInput = heroForm.querySelector('#hero-url');
const val = urlInput.value.trim();
if (!isValidUrl(val)) {
urlInput.focus();
urlInput.setCustomValidity('Entrez une URL valide commençant par https://');
urlInput.reportValidity();
return;
}
urlInput.setCustomValidity('');
/* Pré-remplir le champ URL du formulaire principal */
const mainUrlInput = document.getElementById('page-url');
if (mainUrlInput) mainUrlInput.value = val;
/* Scroll doux vers le formulaire principal */
document.getElementById('analyser')?.scrollIntoView({ behavior: 'smooth', block: 'start' });
/* Focus sur le champ email */
setTimeout(() => document.getElementById('user-email')?.focus(), 600);
});
}
/* ── Formulaire principal : validation & soumission ── */
const analysisForm = document.getElementById('analysis-form');
if (analysisForm) {
analysisForm.addEventListener('submit', async e => {
e.preventDefault();
const pageUrl = document.getElementById('page-url');
const email = document.getElementById('user-email');
const consent = document.getElementById('consent');
const btn = analysisForm.querySelector('.btn-submit');
const result = document.getElementById('form-result');
let hasError = false;
/* Validation URL */
const urlError = document.getElementById('page-url-error');
if (!isValidUrl(pageUrl.value.trim())) {
pageUrl.classList.add('is-invalid');
if (urlError) {
urlError.textContent = 'Entrez une URL valide (commençant par https://)';
urlError.classList.remove('visually-hidden');
}
pageUrl.focus();
hasError = true;
} else {
pageUrl.classList.remove('is-invalid');
if (urlError) urlError.classList.add('visually-hidden');
}
/* Validation email */
const emailError = document.getElementById('email-error');
if (!isValidEmail(email.value.trim())) {
if (!hasError) {
email.classList.add('is-invalid');
if (emailError) {
emailError.textContent = 'Entrez une adresse email valide';
emailError.classList.remove('visually-hidden');
}
email.focus();
}
hasError = true;
} else {
email.classList.remove('is-invalid');
if (emailError) emailError.classList.add('visually-hidden');
}
/* Validation consentement */
if (!consent.checked) {
if (!hasError) {
consent.focus();
showToast('⚠ Veuillez accepter les conditions pour continuer.');
}
hasError = true;
}
if (hasError) return;
/* État de chargement */
btn.setAttribute('aria-busy', 'true');
btn.textContent = 'Analyse en cours…';
/* Simulation appel API (remplacer par fetch() réel) */
await new Promise(r => setTimeout(r, 2200));
btn.removeAttribute('aria-busy');
btn.textContent = 'Analyser ma page gratuitement';
/* Succès */
result.className = 'success';
result.textContent = '✓ Rapport en route ! Vérifiez votre boîte mail (et vos spams si besoin).';
showToast('✓ Analyse lancée — rapport dans 2 minutes !');
/* Reset partiel du formulaire */
email.value = '';
consent.checked = false;
});
/* Effacer les erreurs à la saisie */
analysisForm.querySelectorAll('.form-control').forEach(input => {
input.addEventListener('input', () => {
input.classList.remove('is-invalid');
const errId = input.getAttribute('aria-describedby');
if (errId) {
const errEl = document.getElementById(errId);
if (errEl) errEl.classList.add('visually-hidden');
}
});
});
}
/* ── Smooth scroll pour les ancres internes
(complète le CSS scroll-behavior pour Safari ancien) ── */
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', e => {
const target = document.querySelector(anchor.getAttribute('href'));
if (target) {
e.preventDefault();
target.scrollIntoView({ behavior: 'smooth', block: 'start' });
/* A11y : déplacer le focus */
target.tabIndex = -1;
target.focus({ preventScroll: true });
}
});
});
/* ── Intersection Observer : reveal entrée des sections
(CWV : pas de JS lourd au chargement) ── */
if ('IntersectionObserver' in window) {
const revealObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.style.opacity = '1';
entry.target.style.transform = 'translateY(0)';
revealObserver.unobserve(entry.target);
}
});
}, { threshold: 0.1, rootMargin: '0px 0px -40px 0px' });
/* Respecter prefers-reduced-motion */
const prefersReduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
if (!prefersReduced) {
document.querySelectorAll('.problem-card, .step, .tip-block, .stat-item').forEach(el => {
el.style.opacity = '0';
el.style.transform = 'translateY(20px)';
el.style.transition = 'opacity .4s ease, transform .4s ease';
revealObserver.observe(el);
});
}
}
})();
</script>
</body>
</html>