Files
html/products/deliverscore.html
2026-04-12 22:57:03 +02:00

676 lines
50 KiB
HTML

<!DOCTYPE html>
<html lang="fr">
<head>
<link rel="icon" href="/favicon.ico" type="image/x-icon">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DeliverScore — Audit Délivrabilité Email Gratuit</title>
<meta name="description" content="DeliverScore — Audit Délivrabilité Email Gratuit - Solutions IA souveraines pour entreprises">
<link href="https://fonts.googleapis.com/css2?family=Space+Mono:wght@400;700&family=Outfit:wght@300;400;500;600;700;800&display=swap" rel="stylesheet">
<style>
:root {
--bg:#060a14; --surface:#0d1525; --border:rgba(0,201,167,0.1);
--teal:#00c9a7; --teal15:rgba(0,201,167,0.15);
--red:#ff5c5c; --yellow:#f0c674; --green:#00c9a7;
--silver:#7a8ba5; --white:#edf2f7;
}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Outfit',sans-serif;background:var(--bg);color:var(--white);overflow-x:hidden}
body::before{content:'';position:fixed;inset:0;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");pointer-events:none;z-index:1000}
nav{position:fixed;top:0;width:100%;padding:1rem 4%;display:flex;justify-content:space-between;align-items:center;z-index:100;backdrop-filter:blur(20px);background:rgba(6,10,20,0.8);border-bottom:1px solid var(--border)}
.logo{font-weight:800;font-size:1.4rem;letter-spacing:-0.03em}
.logo span{color:var(--teal)}
.hero{min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:7rem 4% 4rem;position:relative}
.hero::after{content:'';position:absolute;top:5%;left:50%;transform:translateX(-50%);width:600px;height:600px;background:radial-gradient(circle,rgba(0,201,167,0.06) 0%,transparent 70%);border-radius:50%;pointer-events:none}
h1{font-size:3.5rem;font-weight:800;line-height:1.05;letter-spacing:-0.04em;margin-bottom:1rem}
h1 em{font-style:normal;color:var(--teal)}
.sub{font-size:1.1rem;color:var(--silver);max-width:500px;line-height:1.7;margin-bottom:2.5rem}
/* SCANNER */
.scanner{background:var(--surface);border:1px solid var(--border);border-radius:16px;padding:2rem;max-width:600px;width:100%;position:relative;z-index:2}
.scanner-input{display:flex;gap:0.8rem}
.scanner-input input{flex:1;background:rgba(0,0,0,0.3);border:1px solid rgba(255,255,255,0.1);border-radius:10px;padding:0.9rem 1.2rem;font-size:1rem;color:var(--white);font-family:'Outfit',sans-serif;outline:none;transition:border 0.3s}
.scanner-input input:focus{border-color:var(--teal)}
.scanner-input input::placeholder{color:rgba(255,255,255,0.25)}
.btn-scan{background:var(--teal);color:var(--bg);padding:0.9rem 2rem;border-radius:10px;font-weight:700;font-size:0.95rem;border:none;cursor:pointer;transition:all 0.3s;font-family:'Outfit',sans-serif;white-space:nowrap}
.btn-scan:hover{background:#00e6be;transform:translateY(-1px)}
.btn-scan:disabled{opacity:0.5;cursor:not-allowed;transform:none}
.scanner-note{font-size:0.75rem;color:var(--silver);margin-top:0.8rem;text-align:center}
/* RESULTS */
#results{display:none;margin-top:2rem;max-width:800px;width:100%;padding:0 4%}
.score-ring{width:160px;height:160px;margin:0 auto 1.5rem;position:relative}
.score-ring svg{width:160px;height:160px;transform:rotate(-90deg)}
.score-ring circle{fill:none;stroke-width:10;stroke-linecap:round}
.ring-bg{stroke:rgba(255,255,255,0.06)}
.ring-fill{stroke:var(--teal);stroke-dasharray:440;stroke-dashoffset:440;transition:stroke-dashoffset 1.5s ease}
.score-value{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center}
.score-num{font-family:'Space Mono',monospace;font-size:2.8rem;font-weight:700}
.score-grade{font-size:0.85rem;color:var(--silver);margin-top:-0.2rem}
.checks{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:1rem;margin-top:1.5rem}
.check{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:1.2rem;transition:all 0.3s}
.check-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:0.5rem}
.check-name{font-weight:600;font-size:0.95rem}
.check-status{font-family:'Space Mono',monospace;font-size:0.72rem;font-weight:700;padding:0.2rem 0.6rem;border-radius:100px}
.status-pass{background:rgba(0,201,167,0.15);color:var(--green)}
.status-partial{background:rgba(240,198,116,0.15);color:var(--yellow)}
.status-fail{background:rgba(255,92,92,0.15);color:var(--red)}
.check-summary{font-size:0.82rem;color:var(--silver);line-height:1.5}
.recs{margin-top:2rem}
.recs h3{font-size:1.2rem;font-weight:700;margin-bottom:1rem}
.rec{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:1.2rem;margin-bottom:0.8rem;display:flex;gap:1rem;align-items:flex-start}
.rec-priority{font-family:'Space Mono',monospace;font-size:0.65rem;font-weight:700;padding:0.2rem 0.6rem;border-radius:100px;white-space:nowrap;margin-top:0.15rem}
.rec-title{font-weight:600;font-size:0.95rem;margin-bottom:0.3rem}
.rec-desc{font-size:0.82rem;color:var(--silver);line-height:1.5}
.upgrade-banner{margin-top:2rem;text-align:center;padding:2rem;background:linear-gradient(135deg,var(--surface),rgba(0,201,167,0.04));border:1px solid var(--border);border-radius:16px}
.upgrade-banner h3{margin-bottom:0.5rem}
.upgrade-banner p{color:var(--silver);font-size:0.9rem;margin-bottom:1rem}
.btn-upgrade{display:inline-block;background:var(--teal);color:var(--bg);padding:0.7rem 1.8rem;border-radius:8px;font-weight:700;font-size:0.9rem;text-decoration:none;transition:all 0.3s}
.btn-upgrade:hover{background:#00e6be}
/* LOADING */
.loading{display:none;text-align:center;padding:3rem}
.spinner{width:40px;height:40px;border:3px solid rgba(0,201,167,0.2);border-top-color:var(--teal);border-radius:50%;animation:spin 0.8s linear infinite;margin:0 auto 1rem}
@keyframes spin{to{transform:rotate(360deg)}}
.loading-text{color:var(--silver);font-size:0.9rem}
/* FEATURES */
.features{max-width:900px;margin:4rem auto;padding:0 4%;display:grid;grid-template-columns:repeat(3,1fr);gap:1.2rem}
.feat{text-align:center;padding:1.5rem}
.feat-icon{font-size:1.8rem;margin-bottom:0.8rem}
.feat h4{font-size:0.95rem;font-weight:600;margin-bottom:0.4rem}
.feat p{font-size:0.82rem;color:var(--silver);line-height:1.5}
footer{padding:2rem 4%;text-align:center;font-size:0.78rem;color:var(--silver);border-top:1px solid rgba(255,255,255,0.04)}
footer a{color:var(--teal);text-decoration:none}
@media(max-width:700px){
h1{font-size:2.2rem}
.scanner-input{flex-direction:column}
.features{grid-template-columns:1fr}
.checks{grid-template-columns:1fr}
}
body{background:#0b0d14!important;color:#e2e8f0!important}
section{background:transparent!important}
h1,h2,h3,h4{color:#f1f5f9!important}
h1 em,h2 em{color:#d4a843!important}
p,li,span,label,small{color:#94a3b8!important}
b,strong{color:#e2e8f0!important}
a{color:#60a5fa!important}
input,select,textarea{background:#0b0d14!important;color:#e2e8f0!important;border:1px solid #1e293b!important;border-radius:8px!important}
input::placeholder,textarea::placeholder{color:#475569!important}
.hero,.cta,[class*="hero"],[class*="cta"]{background:transparent!important}
[class*="card"],[class*="plan"],[class*="feat"],[class*="block"],[class*="item"],[class*="tier"]{background:linear-gradient(135deg,#111827,#0f172a)!important;border:1px solid #1e293b!important;border-radius:12px!important}
[class*="stat"]{background:rgba(255,255,255,.03)!important;border:1px solid #1e293b!important;border-radius:12px!important}
table{border-color:#1e293b!important}
th{background:#111827!important;color:#94a3b8!important;border-color:#1e293b!important}
td{border-color:#1e293b!important;color:#e2e8f0!important}
.badge,[class*="badge"]{background:rgba(212,168,67,.1)!important;color:#d4a843!important;border:1px solid rgba(212,168,67,.2)!important}
footer,nav{display:none!important}
hr{border-color:#1e293b!important}
code,pre{background:#1e293b!important;color:#e2e8f0!important}
div[style*="background: #f"],div[style*="background:#f"],div[style*="background: white"],div[style*="background:white"],div[style*="background-color: #f"],div[style*="background-color:#f"]{background:#111827!important}
input,select,textarea{background:#0b0d14!important;color:#e2e8f0!important;border:1px solid #1e293b!important;border-radius:8px!important}input::placeholder{color:#475569!important}</style><style>/* Hide nav in iframe */
@media all{.in-iframe nav{display:none!important}.in-iframe .hero{padding-top:3rem!important;min-height:auto!important}.in-iframe footer{display:none!important}.in-iframe .cta{display:none!important}.in-iframe .wv-links{display:none!important}.wv-links{display:none!important}}</style>
<script>if(window!==window.top)document.documentElement.classList.add('in-iframe');</script>
<link rel="canonical" href="https://weval-consulting.com/products/deliverscore.html">
<meta property="og:title" content="DeliverScore — Audit Délivrabilité Email Gratuit">
<meta property="og:description" content="DeliverScore — Audit Délivrabilité Email Gratuit - Solutions IA souveraines pour entreprises">
<meta property="og:url" content="https://weval-consulting.com/products/deliverscore.html">
<meta property="og:type" content="website">
<meta property="og:site_name" content="WEVAL Consulting">
<meta property="og:image" content="https://weval-consulting.com/assets/logo-weval-png-DChrMGao.png">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="DeliverScore — Audit Délivrabilité Email Gratuit">
<meta name="twitter:description" content="DeliverScore — Audit Délivrabilité Email Gratuit - Solutions IA souveraines pour entreprises">
<link rel="alternate" hreflang="fr" href="https://weval-consulting.com/products/deliverscore.html">
<link rel="alternate" hreflang="x-default" href="https://weval-consulting.com/products/deliverscore.html">
<link rel="stylesheet" href="/assets/dark-iframe.css"></head>
<body>
<nav>
<div class="logo" style="display:flex;align-items:center;gap:8px"><img src="/assets/logo-deliverscore.svg" alt="" style="width:32px;height:32px">Deliver<span>Score</span></div>
<a href="/products/workspace.html" style="color:var(--teal);text-decoration:none;font-weight:600;font-size:0.85rem">Contact →</a></nav>
<section class="hero">
<h1>Votre domaine arrive-t-il<br>en <em>inbox</em> ?</h1>
<p class="sub">Scan gratuit en 10 secondes. SPF, DKIM, DMARC, listes de blocage, SSL — tout vérifié.</p>
<div class="scanner">
<div class="scanner-input">
<input type="text" id="domainInput" placeholder="votre-domaine.com" autocomplete="off" spellcheck="false">
<button class="btn-scan" id="scanBtn" onclick="startScan()">Scanner →</button></div>
<div class="scanner-note">Gratuit — aucune inscription requise</div></div>
<div class="loading" id="loading">
<div class="spinner"></div>
<div class="loading-text" id="loadingText">Analyse DNS en cours...</div></div></section>
<div id="results"></div>
<div class="features">
<div class="feat">
<div class="feat-icon"><svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg></div>
<h4>Scan en 10 secondes</h4>
<p>Vérification complète de votre configuration email en un clic.</p></div>
<div class="feat">
<div class="feat-icon"><svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="11" width="18" height="11" rx="2"/><path d="M7 11V7a5 5 0 0110 0v4"/></svg></div>
<h4>7 vérifications</h4>
<p>MX, SPF, DKIM, DMARC, Liste de blocages, SSL, Reverse DNS.</p></div>
<div class="feat">
<div class="feat-icon"><svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2a7 7 0 017 7c0 3-2 5-4 6v1H9v-1c-2-1-4-3-4-6a7 7 0 017-7z"/><line x1="9" y1="18" x2="15" y2="18"/></svg></div>
<h4>Recommandations IA</h4>
<p>Actions concrètes pour améliorer votre délivrabilité.</p></div></div>
<!-- HOW IT WORKS -->
<div style="max-width:800px;margin:4rem auto;padding:0 4%">
<h2 style="font-size:1.8rem;font-weight:800;letter-spacing:-0.03em;text-align:center;margin-bottom:2rem">Comment ça marche</h2>
<div style="display:grid;grid-template-columns:repeat(3,1fr);gap:2rem;text-align:center">
<div>
<div style="width:48px;height:48px;border-radius:50%;background:rgba(0,201,167,0.15);display:flex;align-items:center;justify-content:center;margin:0 auto 0.8rem;font-family:'Space Mono',monospace;font-weight:700;color:var(--teal);font-size:1.1rem">1</div>
<h4 style="font-size:0.95rem;font-weight:600;margin-bottom:0.3rem">Entrez votre domaine</h4>
<p style="font-size:0.82rem;color:var(--silver);line-height:1.5">Tapez votre nom de domaine. Aucune inscription requise.</p></div>
<div>
<div style="width:48px;height:48px;border-radius:50%;background:rgba(0,201,167,0.15);display:flex;align-items:center;justify-content:center;margin:0 auto 0.8rem;font-family:'Space Mono',monospace;font-weight:700;color:var(--teal);font-size:1.1rem">2</div>
<h4 style="font-size:0.95rem;font-weight:600;margin-bottom:0.3rem">Analyse automatique</h4>
<p style="font-size:0.82rem;color:var(--silver);line-height:1.5">7 vérifications DNS en parallèle + scan de 8 listes de blocage.</p></div>
<div>
<div style="width:48px;height:48px;border-radius:50%;background:rgba(0,201,167,0.15);display:flex;align-items:center;justify-content:center;margin:0 auto 0.8rem;font-family:'Space Mono',monospace;font-weight:700;color:var(--teal);font-size:1.1rem">3</div>
<h4 style="font-size:0.95rem;font-weight:600;margin-bottom:0.3rem">Score + Actions</h4>
<p style="font-size:0.82rem;color:var(--silver);line-height:1.5">Score de 0 à 100, grade A+ à F, et recommandations prioritaires.</p></div></div></div>
<!-- PRICING MINI -->
<div style="max-width:800px;margin:3rem auto;padding:0 4%">
<h2 style="font-size:1.8rem;font-weight:800;text-align:center;margin-bottom:0.5rem">Tarifs</h2>
<p style="text-align:center;color:var(--silver);font-size:0.9rem;margin-bottom:2rem">Le scan basique est gratuit. Passez en Pro pour le détail complet.</p>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:1.2rem">
<div style="background:var(--surface);border:1px solid var(--border);border-radius:14px;padding:1.5rem">
<div style="font-size:0.75rem;font-weight:600;text-transform:uppercase;letter-spacing:0.1em;color:var(--silver);margin-bottom:0.5rem">Gratuit</div>
<div style="font-family:'Space Mono',monospace;font-size:2rem;font-weight:700;margin-bottom:0.5rem">$0</div>
<p style="font-size:0.8rem;color:var(--silver);margin-bottom:1rem">Score + grade + pass/fail par check + 3 recommandations</p>
<div style="font-size:0.78rem;color:var(--silver);line-height:1.8">✓ 10 scans/heure<br>✓ Score global + grade<br>✓ Pass/Fail par vérification<br>✓ Top 3 recommandations</div></div>
<div style="background:rgba(0,201,167,0.03);border:1px solid rgba(0,201,167,0.2);border-radius:14px;padding:1.5rem">
<div style="font-size:0.75rem;font-weight:600;text-transform:uppercase;letter-spacing:0.1em;color:var(--teal);margin-bottom:0.5rem">Pro</div>
<div style="font-family:'Space Mono',monospace;font-size:2rem;font-weight:700;margin-bottom:0.5rem">$49<span style="font-size:0.8rem;color:var(--silver);font-family:'Outfit',sans-serif">/mo</span></div>
<p style="font-size:0.8rem;color:var(--silver);margin-bottom:1rem">Records DNS bruts + monitoring continu + alertes</p>
<div style="font-size:0.78rem;color:var(--silver);line-height:1.8">✓ 100 scans/heure<br>✓ Records DNS détaillés<br>✓ Toutes recommandations IA<br>✓ Monitoring continu<br>✓ Alertes email/Telegram<br>✓ Historique des scores<br>✓ Rapport PDF mensuel</div></div></div></div>
<!-- FAQ -->
<div style="max-width:700px;margin:3rem auto;padding:0 4%">
<h2 style="font-size:1.8rem;font-weight:800;text-align:center;margin-bottom:2rem">Questions fréquentes</h2>
<div style="display:flex;flex-direction:column;gap:0.8rem">
<details style="background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:1rem 1.2rem">
<summary style="font-weight:600;font-size:0.9rem;cursor:pointer;list-style:none;display:flex;justify-content:space-between;align-items:center">Qu'est-ce que le score DeliverScore mesure ?<span style="color:var(--teal)">+</span></summary>
<p style="font-size:0.82rem;color:var(--silver);line-height:1.6;margin-top:0.8rem">Le score analyse 7 aspects de votre configuration email : MX records (serveurs de réception), SPF (autorisation d envoi), DKIM (signature cryptographique), DMARC (politique d'authentification), listes de blocage (8 listes noires vérifiées), SSL (certificat du domaine), et reverse DNS (résolution inverse des IPs). Chaque check a un poids dans le score final de 0 à 100.</p></details>
<details style="background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:1rem 1.2rem">
<summary style="font-weight:600;font-size:0.9rem;cursor:pointer;list-style:none;display:flex;justify-content:space-between;align-items:center">Mes données sont-elles sécurisées ?<span style="color:var(--teal)">+</span></summary>
<p style="font-size:0.82rem;color:var(--silver);line-height:1.6;margin-top:0.8rem">Nous analysons uniquement les records DNS publics de votre domaine — les mêmes informations accessibles à n'importe qui via une requête DNS. Aucune donnée privée n'est collectée ou stockée.</p></details>
<details style="background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:1rem 1.2rem">
<summary style="font-weight:600;font-size:0.9rem;cursor:pointer;list-style:none;display:flex;justify-content:space-between;align-items:center">Quel score dois-je viser ?<span style="color:var(--teal)">+</span></summary>
<p style="font-size:0.82rem;color:var(--silver);line-height:1.6;margin-top:0.8rem">Un score de 80+ (grade A) signifie que votre configuration est solide. Un score de 90+ (A+) est excellent. En dessous de 60, des actions critiques sont nécessaires — suivez nos recommandations par ordre de priorité.</p></details>
<details style="background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:1rem 1.2rem">
<summary style="font-weight:600;font-size:0.9rem;cursor:pointer;list-style:none;display:flex;justify-content:space-between;align-items:center">Puis-je scanner le domaine d'un concurrent ?<span style="color:var(--teal)">+</span></summary>
<p style="font-size:0.82rem;color:var(--silver);line-height:1.6;margin-top:0.8rem">Oui, les DNS records sont publics. C'est un excellent moyen de benchmarker votre délivrabilité par rapport à vos concurrents.</p></details></div></div>
<footer>
<a href="https://weval-consulting.com">WEVAL Consulting</a> · France · Maroc · États-Unis · International · Un produit <a href="weval-products-hub.html">WEVAL Products</a></footer>
<script>
const API_URL = '/api/deliverscore/scan.php'; // Change to actual URL when deployed
const loadingMessages = [
'Analyse des records MX...',
'Vérification SPF...',
'Recherche des sélecteurs DKIM...',
'Analyse DMARC...',
'Scan des listes de blocage...',
'Vérification SSL...',
'Calcul du score...'
];
document.getElementById('domainInput').addEventListener('keypress', (e) => {
if (e.key === 'Enter') startScan();
});
async function startScan() {
const domain = document.getElementById('domainInput').value.trim()
.replace(/^https?:\/\//, '').replace(/^www\./, '').split('/')[0];
if (!domain || !domain.includes('.')) {
alert('Entrez un nom de domaine valide (ex: example.com)');
return;
}
const btn = document.getElementById('scanBtn');
const loading = document.getElementById('loading');
const results = document.getElementById('results');
btn.disabled = true;
btn.textContent = 'Scan...';
loading.style.display = 'block';
results.style.display = 'none';
results.innerHTML = '';
// Animate loading messages
let msgIdx = 0;
const msgInterval = setInterval(() => {
document.getElementById('loadingText').textContent = loadingMessages[msgIdx % loadingMessages.length];
msgIdx++;
}, 1500);
try {
const res = await fetch(`${API_URL}?domain=${encodeURIComponent(domain)}`);
const data = await res.json();
clearInterval(msgInterval);
loading.style.display = 'none';
if (data.error) {
results.style.display = 'block';
results.innerHTML = `<div style="text-align:center;padding:2rem;color:var(--red)">${data.error}</div>`;
return;
}
renderResults(data);
} catch (err) {
clearInterval(msgInterval);
loading.style.display = 'none';
// DEMO MODE — simulate results if API not deployed
renderResults(generateDemoResults(domain));
} finally {
btn.disabled = false;
btn.textContent = 'Scanner →';
}
}
function renderResults(data) {
const results = document.getElementById('results');
results.style.display = 'block';
const scoreColor = data.score >= 80 ? 'var(--green)' : data.score >= 60 ? 'var(--yellow)' : 'var(--red)';
const dashOffset = 440 - (440 * data.score / 100);
let html = `
<div class="score-ring">
<svg viewBox="0 0 160 160">
<circle class="ring-bg" cx="80" cy="80" r="70"/>
<circle class="ring-fill" cx="80" cy="80" r="70" style="stroke:${scoreColor};stroke-dashoffset:${dashOffset}"/></svg>
<div class="score-value">
<div class="score-num" style="color:${scoreColor}">${data.score}</div>
<div class="score-grade">${data.domain} — Grade ${data.grade}</div></div></div>
<div class="checks">`;
const checkOrder = ['mx', 'spf', 'dkim', 'dmarc', 'listes de blocage', 'ssl', 'reverse_dns'];
for (const key of checkOrder) {
const c = data.checks[key];
if (!c) continue;
const statusClass = c.status === 'pass' ? 'status-pass' : c.status === 'partial' ? 'status-partial' : 'status-fail';
const statusLabel = c.status === 'pass' ? 'PASS' : c.status === 'partial' ? 'WARN' : 'FAIL';
html += `
<div class="check">
<div class="check-head">
<span class="check-name">${c.name}</span>
<span class="check-status ${statusClass}">${statusLabel}</span></div>
<div class="check-summary">${c.summary}</div></div>`;
}
html += '</div>';
// Recommendations
if (data.recommendations && data.recommendations.length > 0) {
html += '<div class="recs"><h3>Recommandations</h3>';
for (const r of data.recommendations) {
const pColor = r.priority === 'critical' ? 'var(--red)' : r.priority === 'high' ? 'var(--yellow)' : 'var(--teal)';
const pBg = r.priority === 'critical' ? 'rgba(255,92,92,0.15)' : r.priority === 'high' ? 'rgba(240,198,116,0.15)' : 'rgba(0,201,167,0.15)';
html += `
<div class="rec">
<span class="rec-priority" style="color:${pColor};background:${pBg}">${r.priority.toUpperCase()}</span>
<div>
<div class="rec-title">${r.title}</div>
<div class="rec-desc">${r.desc}</div></div></div>`;
}
html += '</div>';
}
html += `
<div class="upgrade-banner">
<h3>Rapport détaillé + monitoring continu</h3>
<p>Obtenez les records DNS bruts, l'historique de vos scores, et des alertes en temps réel.</p>
<a href="/products/workspace.html" class="btn-upgrade">Passer en Pro — $49/mo →</a></div>`;
results.innerHTML = html;
results.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
function generateDemoResults(domain) {
// Demo data when API is not yet deployed
const hasSpf = Math.random() > 0.3;
const hasDkim = Math.random() > 0.4;
const hasDmarc = Math.random() > 0.5;
let score = 15; // MX always pass in demo
if (hasSpf) score += 20;
if (hasDkim) score += 20;
if (hasDmarc) score += 20;
score += 15 + 5 + 5; // listes de blocage + ssl + rdns
return {
domain, score, grade: score >= 90 ? 'A+' : score >= 80 ? 'A' : score >= 70 ? 'B' : score >= 60 ? 'C' : 'D',
checks: {
mx: { name:'MX Records', status:'pass', summary:`2 MX records found for ${domain}` },
spf: { name:'SPF Record', status: hasSpf ? 'pass' : 'fail', summary: hasSpf ? 'SPF record configured with -all' : 'No SPF record found' },
dkim: { name:'DKIM', status: hasDkim ? 'pass' : 'fail', summary: hasDkim ? '2 DKIM selectors found' : 'No DKIM selectors detected' },
dmarc: { name:'DMARC', status: hasDmarc ? 'pass' : 'partial', summary: hasDmarc ? 'DMARC policy: quarantine' : 'DMARC policy: none (monitoring only)' },
listes de blocage: { name:'Liste de blocages', status:'pass', summary:'Clean — 0 listings across 8 listes de blocage' },
ssl: { name:'SSL/TLS', status:'pass', summary:'SSL valid — 245 days remaining' },
reverse_dns: { name:'Reverse DNS', status:'pass', summary:'2/2 IPs have reverse DNS' }
},
recommendations: [
...(!hasSpf ? [{priority:'critical',title:'Add SPF record',desc:'Create a TXT record with v=spf1 to authenticate your email senders.'}] : []),
...(!hasDkim ? [{priority:'critical',title:'Configure DKIM',desc:'No DKIM signatures detected. Configure DKIM with your email provider.'}] : []),
...(!hasDmarc ? [{priority:'high',title:'Strengthen DMARC policy',desc:'Upgrade DMARC from none to quarantine or reject.'}] : []),
{priority:'info',title:'Note: demo mode',desc:'This is simulated data. Deploy the API for real DNS scanning results.'}
]
};
}
</script><!-- WEVAL Product Assistant Chatbot Widget -->
<div id="weval-bot-widget" style="position:fixed;bottom:20px;right:20px;z-index:9999;font-family:'Inter',system-ui,sans-serif">
<style>
#weval-bot-btn{width:56px;height:56px;border-radius:50%;background:linear-gradient(135deg,#6366f1,#8b5cf6);border:none;cursor:pointer;box-shadow:0 4px 24px rgba(99,102,241,.4);display:flex;align-items:center;justify-content:center;transition:transform .2s,box-shadow .2s}
#weval-bot-btn:hover{transform:scale(1.08);box-shadow:0 6px 32px rgba(99,102,241,.5)}
#weval-bot-btn svg{width:28px;height:28px;fill:#fff}
#weval-bot-badge{position:absolute;top:-2px;right:-2px;width:14px;height:14px;background:#22c55e;border-radius:50%;border:2px solid #fff;animation:pulse-badge 2s infinite}
@keyframes pulse-badge{0%,100%{opacity:1}50%{opacity:.5}}
#weval-bot-panel{display:none;position:fixed;bottom:90px;right:20px;width:380px;max-height:520px;background:#0f1629;border:1px solid rgba(99,102,241,.2);border-radius:16px;box-shadow:0 12px 48px rgba(0,0,0,.5);overflow:hidden;flex-direction:column}
#weval-bot-panel.open{display:flex}
#weval-bot-head{background:linear-gradient(135deg,#6366f1,#8b5cf6);padding:14px 18px;display:flex;align-items:center;gap:10px}
#weval-bot-head .avatar{width:36px;height:36px;border-radius:50%;background:rgba(255,255,255,.2);display:flex;align-items:center;justify-content:center;font-size:18px}
#weval-bot-head .info{flex:1;color:#fff}
#weval-bot-head .info .name{font-weight:600;font-size:14px}
#weval-bot-head .info .status{font-size:11px;opacity:.8}
#weval-bot-close{background:none;border:none;color:rgba(255,255,255,.7);cursor:pointer;font-size:20px;padding:4px}
#weval-bot-msgs{flex:1;overflow-y:auto;padding:14px;display:flex;flex-direction:column;gap:10px;min-height:280px;max-height:360px}
.bot-msg{max-width:85%;padding:10px 14px;border-radius:12px;font-size:13px;line-height:1.5;word-wrap:break-word}
.bot-msg.bot{background:rgba(99,102,241,.12);color:#e2e8f0;border-bottom-left-radius:4px;align-self:flex-start}
.bot-msg.user{background:#6366f1;color:#fff;border-bottom-right-radius:4px;align-self:flex-end}
.bot-msg a{color:#818cf8;text-decoration:underline}
.bot-typing{display:flex;gap:4px;padding:10px 14px;align-self:flex-start}
.bot-typing span{width:6px;height:6px;background:#6366f1;border-radius:50%;animation:bounce .6s infinite alternate}
.bot-typing span:nth-child(2){animation-delay:.2s}
.bot-typing span:nth-child(3){animation-delay:.4s}
@keyframes bounce{to{opacity:.3;transform:translateY(-4px)}}
#weval-bot-input-area{padding:10px 14px;border-top:1px solid rgba(255,255,255,.06);display:flex;gap:8px}
#weval-bot-input{flex:1;background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.1);border-radius:8px;padding:8px 12px;color:#e2e8f0;font-size:13px;outline:none}
#weval-bot-input::placeholder{color:rgba(255,255,255,.3)}
#weval-bot-send{background:#6366f1;border:none;border-radius:8px;padding:8px 12px;color:#fff;cursor:pointer;font-size:13px;font-weight:600}
#weval-bot-send:hover{background:#5558e6}
.quick-btns{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
.quick-btn{background:rgba(99,102,241,.15);border:1px solid rgba(99,102,241,.25);color:#a5b4fc;padding:5px 10px;border-radius:6px;font-size:11px;cursor:pointer;transition:all .15s}
.quick-btn:hover{background:rgba(99,102,241,.3);color:#fff}
</style>
<button id="weval-bot-btn" onclick="toggleBot()">
<svg viewBox="0 0 24 24"><path d="M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z"/></svg>
<div id="weval-bot-badge"></div>
</button>
<div id="weval-bot-panel">
<div id="weval-bot-head">
<div class="avatar">W</div>
<div class="info">
<div class="name">WEVAL Assistant</div>
<div class="status">En ligne - 62 produits</div>
</div>
<button id="weval-bot-close" onclick="toggleBot()">&times;</button>
</div>
<div id="weval-bot-msgs"></div>
<div id="weval-bot-input-area">
<input id="weval-bot-input" placeholder="Posez une question sur nos produits..." onkeypress="if(event.key==='Enter')sendBot()">
<button id="weval-bot-send" onclick="sendBot()">Envoyer</button>
</div>
</div>
<script>
const PRODUCTS_KB = {
deliVerscore: {name:'DeliverScore',desc:'Audit délivrabilité email - SPF/DKIM/DMARC/listes de blocage. Score + recommandations IA.',price:'Gratuit + Pro $49/mo',url:'/products/deliverscore.html',category:'Email Intelligence'},
medreach: {name:'MedReach API',desc:'Base de 15000++ professionnels de santé vérifiés (Afrique, Europe, Moyen-Orient, Asie, Europe). API REST + export.',price:'Gratuit + Pro $299/mo',url:'/products/medreach.html',category:'Data'},
gpu: {name:'WEVIA Inference',desc:'IA-as-a-Service. WEVIA Deep, WEVIA sur GPU dédié. API fournisseurs IA cloud-compatible.',price:'Gratuit + Pro $99/mo',url:'/products/gpu-inference.html',category:'IA'},
contentfactory: {name:'AI Content Factory',desc:'Génération de contenu IA - articles, fiches produits, LinkedIn. 6 templates.',price:'Gratuit + Pro $29/mo',url:'/products/content-factory.html',category:'IA'},
proposalai: {name:'ProposalAI',desc:'Generateur de propositions commerciales qualité Big4. Brief -> propale en 30 sec.',price:'Gratuit + Pro $19/mo',url:'/products/proposalai.html',category:'IA'},
blueprintai: {name:'BlueprintAI',desc:'Process docs, BPMN, CDC, blueprints L1/L2/L3, 8D, RACI.',price:'$25/mo',url:'/products/blueprintai.html',category:'IA'},
storeforge: {name:'StoreForge',desc:'E-commerce IA. Boutique en 5 min. Descriptions IA, chatbot WEVIA, paiement international.',price:'0-$29/mo',url:'/products/storeforge.html',category:'Commerce'},
leadforge: {name:'LeadForge',desc:'B2B Lead Intelligence sur mesure. Leads vérifiés tous secteurs. 0.30-0.$50/lead.',price:'0.30-0.$49/lead',url:'/products/workspace.html',category:'Data'},
mailwarm: {name:'MailWarm',desc:'Optimisation email automatique. 500+ seeds. Inbox 90%+ en 4-6 semaines.',price:'$29/compte/mo',url:'/products/workspace.html',category:'Email'},
sentinel: {name:'Sentinel Monitor',desc:'Cyber monitoring PME - SSL, ports, DNS, OWASP. Alertes Telegram.',price:'Gratuit + Pro $49/mo',url:'/products/workspace.html',category:'Security'},
outreachai: {name:'OutreachAI',desc:'Cold outreach IA. Upload leads -> IA personnalisé, envoi -> tracking.',price:'$199/mo',url:'/products/workspace.html',category:'Email'},
wevia: {name:'WEVIA White-Label',desc:'Chatbot IA clé en main. Widget embed 5 min. KB custom, memoire, vision.',price:'100-$299/mo',url:'/products/wevia-whitelabel.html',category:'IA'},
emailverify: {name:'EmailVerify',desc:'Validation email temps réel MX+SMTP+disposable.',price:'$49/mo',url:'/products/workspace.html',category:'Email Intelligence'},
blacklistguard: {name:'BlacklistGuard',desc:'Monitoring 100+ listes de blocage RBL + alertes.',price:'$29/mo',url:'/products/workspace.html',category:'Email Intelligence'},
reputationai: {name:'RéputationAI',desc:'Score réputation domaine + historique.',price:'$39/mo',url:'/products/workspace.html',category:'Email Intelligence'},
copyai: {name:'CopyAI WEVAL',desc:'Copywriting IA - emails, sujets, CTA. Cloud souveraine.',price:'$39/mo',url:'/products/workspace.html',category:'IA'},
dataharvest: {name:'DataInsight',desc:'Intelligence d\'enrichissement de donn\u00e9es B2B.',price:'$99/mo',url:'/products/workspace.html',category:'Data'},
smsforge: {name:'SMSForge',desc:'SMS marketing international (190+ pays).',price:'$49/mo',url:'/products/workspace.html',category:'Marketing'},
adscontrol: {name:'AdsControl',desc:'Multi-channel ads FB/Google/LinkedIn/TikTok.',price:'$99/mo',url:'/products/workspace.html',category:'Marketing'},
wevalcrm: {name:'WEVAL CRM',desc:'CRM leger pipeline + contacts + IA.',price:'Gratuit + Pro $29/mo',url:'/products/workspace.html',category:'Business'},
canvasai: {name:'CanvasAI',desc:'Design IA - visuels, bannieres, logos.',price:'$29/mo',url:'/products/workspace.html',category:'IA'},
devforge: {name:'DevForge AI',desc:'12 modules dev: specs, tests, code gen, API design, security review.',price:'$199/mo',url:'/products/workspace.html',category:'Dev'},
ethica: {name:'Ethica B2B',desc:'Plateforme HCP internationale. plusieurs milliers+ médecins vérifiés.',price:'$299/mo',url:'/products/workspace.html',category:'Data'},
arsenal: {name:'Arsenal Framework',desc:'150+ ecrans. ERP Intelligence, Brain Engine, moteur envoi. Enterprise.',price:'2000-$9,999/mo',url:'/products/arsenal.html',category:'Flagship'},
wevads: {name:'WEVADS Platform',desc:'Infrastructure email complete. Brain Engine centaines de configurations. millions de contacts.',price:'Enterprise',url:'/products/wevads.html',category:'Flagship'},
};
function getProductList() {
return Object.values(PRODUCTS_KB).map(p => `<b>${p.name}</b> - ${p.desc} (<a href="${p.url}">${p.price}</a>)`).join('<br><br>');
}
function findProducts(query) {
const q = query.toLowerCase();
const matches = [];
const keywords = {
email: ['deliVerscore','emailverify','blacklistguard','reputationai','mailwarm','outreachai'],
ia: ['gpu','contentfactory','proposalai','blueprintai','copyai','canvasai','devforge','wevia'],
data: ['medreach','leadforge','dataharvest','ethica'],
security: ['sentinel','blacklistguard'],
ecommerce: ['storeforge'],
marketing: ['smsforge','adscontrol','outreachai'],
crm: ['wevalcrm'],
sap: ['arsenal'],
enterprise: ['arsenal','wevads','wevia'],
gratuit: [],
prix: [],
maroc: ['medreach','ethica','smsforge','storeforge'],
};
for (const [kw, ids] of Object.entries(keywords)) {
if (q.includes(kw)) ids.forEach(id => { if (!matches.includes(id)) matches.push(id); });
}
// Also search in product names and descriptions
for (const [id, p] of Object.entries(PRODUCTS_KB)) {
if (p.name.toLowerCase().includes(q) || p.desc.toLowerCase().includes(q) || p.category.toLowerCase().includes(q)) {
if (!matches.includes(id)) matches.push(id);
}
}
return matches.map(id => PRODUCTS_KB[id]).filter(Boolean);
}
function botReply(userMsg) {
const q = userMsg.toLowerCase();
// Greetings
if (/^(bonjour|salut|hello|hi|hey|coucou)/.test(q)) {
return `Bonjour ! Je suis l'assistant WEVAL. Nous avons <b>62 produits SaaS</b> en production. Comment puis-je vous aider ?<div class="quick-btns"><span class="quick-btn" onclick="askBot('Quels sont vos produits?')">Voir les produits</span><span class="quick-btn" onclick="askBot('email délivrabilité')">Email</span><span class="quick-btn" onclick="askBot('intelligence artificielle')">IA</span><span class="quick-btn" onclick="askBot('prix')">Tarifs</span></div>`;
}
// List all
if (/tous|tout|liste|produit|service|catalogue|quoi/.test(q)) {
const cats = {};
Object.values(PRODUCTS_KB).forEach(p => { if (!cats[p.category]) cats[p.category]=[]; cats[p.category].push(p); });
let html = `Voici nos <b>${Object.keys(PRODUCTS_KB).length} produits</b> par categorie :<br><br>`;
for (const [cat, prods] of Object.entries(cats)) {
html += `<b>${cat}</b><br>`;
prods.forEach(p => { html += `&bull; <a href="${p.url}">${p.name}</a> - ${p.price}<br>`; });
html += '<br>';
}
html += `<div class="quick-btns"><span class="quick-btn" onclick="askBot('email')">Email</span><span class="quick-btn" onclick="askBot('IA')">IA</span><span class="quick-btn" onclick="askBot('essayer gratuit')">Gratuit</span></div>`;
return html;
}
// Pricing
if (/prix|tarif|cout|combien|pricing|gratuit|free/.test(q)) {
const free = Object.values(PRODUCTS_KB).filter(p => p.price.toLowerCase().includes('gratuit'));
let html = `<b>Produits avec plan gratuit (${free.length}):</b><br>`;
free.forEach(p => { html += `&bull; <a href="${p.url}">${p.name}</a> - ${p.price}<br>`; });
html += `<br>Tous les prix sont sur <a href="/products/">notre catalogue</a>. Besoin d'un devis personnalisé ?<div class="quick-btns"><span class="quick-btn" onclick="askBot('demo')">Demander une demo</span><span class="quick-btn" onclick="window.location.href='/booking.html'">Nous contacter</span></div>`;
return html;
}
// Demo / essai
if (/demo|essai|tester|try|commencer|start/.test(q)) {
return `Pour commencer gratuitement :<br><br>1. <a href="/products/workspace.html">Ouvrir le Workspace</a> et créer un compte<br>2. Vous aurez acces a tous les produits gratuits<br>3. Testez DeliverScore, WEVIA Inference, Content Factory...<br><br>Ou <a href="#cta">contactez-nous</a> pour une demo personnalisée !<div class="quick-btns"><span class="quick-btn" onclick="window.location.href='/products/workspace.html'">Ouvrir Workspace</span></div>`;
}
// Specific product search
const matches = findProducts(q);
if (matches.length > 0) {
let html = `J'ai trouve <b>${matches.length} produit(s)</b> correspondant :<br><br>`;
matches.slice(0, 6).forEach(p => {
html += `<b><a href="${p.url}">${p.name}</a></b><br>${p.desc}<br><i>${p.price}</i><br><br>`;
});
if (matches.length > 6) html += `...et ${matches.length - 6} autres.<br>`;
html += `<div class="quick-btns"><span class="quick-btn" onclick="window.location.href='${matches[0].url}'">Voir ${matches[0].name}</span><span class="quick-btn" onclick="askBot('prix')">Tarifs</span></div>`;
return html;
}
// Default - suggest contacting or browsing
return `Je n'ai pas trouve de produit spécifique pour "${userMsg}". Nos 62 produits couvrent : Email Intelligence, IA/GPU, Data, Security, Marketing, E-commerce et Dev.<br><br><div class="quick-btns"><span class="quick-btn" onclick="askBot('tous les produits')">Voir tout</span><span class="quick-btn" onclick="window.location.href='/booking.html'">Contacter WEVAL</span><span class="quick-btn" onclick="window.location.href='/products/workspace.html'">Workspace</span></div>`;
}
function toggleBot() {
const p = document.getElementById('weval-bot-panel');
p.classList.toggle('open');
if (p.classList.contains('open') && document.getElementById('weval-bot-msgs').children.length === 0) {
addMsg('bot', `Bonjour ! Je suis l'assistant produits WEVAL. Nous proposons <b>37 SaaS</b> en production. Que recherchez-vous ?<div class="quick-btns"><span class="quick-btn" onclick="askBot('Tous les produits')">Catalogue</span><span class="quick-btn" onclick="askBot('email')">Email</span><span class="quick-btn" onclick="askBot('intelligence artificielle')">IA</span><span class="quick-btn" onclick="askBot('gratuit')">Gratuit</span><span class="quick-btn" onclick="askBot('demo')">Demo</span></div>`);
}
document.getElementById('weval-bot-badge').style.display = 'none';
}
function addMsg(type, html) {
const msgs = document.getElementById('weval-bot-msgs');
const div = document.createElement('div');
div.className = 'bot-msg ' + type;
div.innerHTML = html;
msgs.appendChild(div);
msgs.scrollTop = msgs.scrollHeight;
}
function askBot(q) {
document.getElementById('weval-bot-input').value = q;
sendBot();
}
function sendBot() {
const input = document.getElementById('weval-bot-input');
const msg = input.value.trim();
if (!msg) return;
input.value = '';
addMsg('user', msg);
// Show typing
const msgs = document.getElementById('weval-bot-msgs');
const typing = document.createElement('div');
typing.className = 'bot-typing';
typing.innerHTML = '<span></span><span></span><span></span>';
msgs.appendChild(typing);
msgs.scrollTop = msgs.scrollHeight;
setTimeout(() => {
typing.remove();
addMsg('bot', botReply(msg));
}, 400 + Math.random() * 600);
}
</script>
</div>
<style>
.ev-trust{display:flex;gap:2rem;justify-content:center;flex-wrap:wrap;padding:1.5rem 4%;background:rgba(255,255,255,.02);border-top:1px solid rgba(255,255,255,.04);margin:2rem 0}
.ev-trust-i{display:flex;align-items:center;gap:.4rem;font-size:.8rem;color:#7a8ba5}.ev-trust-i strong{color:#edf2f7}
.ev-chat{max-width:800px;margin:3rem auto;padding:0 4%}.ev-cb{background:#0c1222;border:1px solid rgba(255,255,255,.06);border-radius:14px;overflow:hidden}
.ev-ch{padding:.8rem 1.2rem;border-bottom:1px solid rgba(255,255,255,.06);font-size:.9rem;font-weight:600}
.ev-cm{min-height:200px;max-height:350px;overflow-y:auto;padding:1rem}.ev-ce{text-align:center;padding:2rem;color:#7a8ba5;font-size:.82rem}
.ev-sg{display:flex;gap:.4rem;flex-wrap:wrap;justify-content:center;margin-top:.8rem}
.ev-sg button{padding:.35rem .7rem;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.08);border-radius:16px;color:#edf2f7;font-size:.72rem;cursor:pointer;font-family:Outfit}
.ev-ci{padding:.8rem 1.2rem;border-top:1px solid rgba(255,255,255,.06);display:flex;gap:.5rem}
.ev-ci textarea{flex:1;resize:none;min-height:36px;max-height:100px;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.08);color:#edf2f7;border-radius:8px;padding:.5rem .7rem;font-family:Outfit;font-size:.82rem;outline:none}
.ev-ci button{background:#10b981;color:#fff;border:none;border-radius:8px;padding:.5rem 1rem;font-weight:700;cursor:pointer;font-family:Outfit;font-size:.82rem}
.ev-mu{background:rgba(255,255,255,.05);border-radius:8px 8px 2px 8px;padding:.5rem .8rem;margin:6px 0;max-width:70%;margin-left:auto;font-size:.82rem;color:#edf2f7}
.ev-ma{background:rgba(255,255,255,.03);border:1px solid rgba(255,255,255,.04);border-radius:2px 8px 8px 8px;padding:.6rem .9rem;margin:6px 0;max-width:85%;font-size:.82rem;color:#edf2f7;line-height:1.6}
.ev-ma strong{color:#fff}
.ev-ld{display:inline-block;width:6px;height:6px;border-radius:50%;background:#10b981;margin:0 2px;animation:evp .8s infinite}.ev-ld:nth-child(2){animation-delay:.2s}.ev-ld:nth-child(3){animation-delay:.4s}
@keyframes evp{0%,100%{opacity:1}50%{opacity:.3}}
</style>
<div class="ev-trust">
<div class="ev-trust-i"><strong>44</strong> produits SaaS</div>
<div class="ev-trust-i"><strong>Cloud</strong> souverain</div>
<div class="ev-trust-i"><strong>API</strong> REST</div>
<div class="ev-trust-i"><strong>RGPD</strong> conforme</div>
<div class="ev-trust-i"><strong>France</strong> · Maroc · États-Unis · International</div>
</div>
<div class="ev-chat"><div class="ev-cb">
<div class="ev-ch"><span style="color:#10b981"></span> DeliverScore — Assistant IA</div>
<div class="ev-cm" id="ev2-msgs"><div class="ev-ce" id="ev2-empty">Posez votre question sur DeliverScore<div class="ev-sg">
<button onclick="ev2sg('Fonctionnalités principales')">Fonctionnalités</button>
<button onclick="ev2sg('Comment ca marche')">Comment ca marche</button>
<button onclick="ev2sg('Tarifs')">Tarifs</button>
</div></div></div>
<div class="ev-ci"><textarea id="ev2-i" rows="1" placeholder="Votre question..." onkeydown="if(event.key==='Enter'&&!event.shiftKey){event.preventDefault();ev2send()}"></textarea><button onclick="ev2send()">Envoyer</button></div>
</div></div>
<script>
var ev2ctx="Tu es DeliverScore, expert en audit de délivrabilité email. Analyse SPF, DKIM, DMARC, MX, listes de blocage, score de délivrabilité.";var ev2h=[];
function ev2esc(s){var d=document.createElement("div");d.textContent=s;return d.innerHTML}
function ev2md(m){return m.replace(/\*\*(.*?)\*\*/g,"<strong>$1</strong>").replace(/\n\n/g,"<br><br>")}
function ev2sg(q){document.getElementById("ev2-i").value=q;ev2send()}
async function ev2send(){var i=document.getElementById("ev2-i"),m=i.value.trim();if(!m)return;var a=document.getElementById("ev2-msgs"),es=document.getElementById("ev2-empty");if(es)es.remove();a.innerHTML+='<div class="ev-mu">'+ev2esc(m)+'</div>';i.value="";a.scrollTop=a.scrollHeight;var lid="ev2l"+Date.now();a.innerHTML+='<div class="ev-ma" id="'+lid+'"><span class="ev-ld"></span><span class="ev-ld"></span><span class="ev-ld"></span></div>';a.scrollTop=a.scrollHeight;try{ev2h.push({role:"user",content:m});var r=await fetch("/api/weval-ia-fast.php",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:"[INSTRUCTION SYSTEME: "+ev2ctx+"]\n\nDemande utilisateur: "+m,mode:"full",history:ev2h.slice(-6)})});var j=await r.json();var rp=j.response||j.error||"Erreur";ev2h.push({role:"assistant",content:rp});var el=document.getElementById(lid);if(el)el.outerHTML='<div class="ev-ma">'+ev2md(rp)+"</div>";}catch(ex){var el=document.getElementById(lid);if(el)el.innerHTML="Erreur: "+ex.message;}a.scrollTop=a.scrollHeight;}
</script>
<style>.dm-box{background:#0c1222;border:1px solid rgba(255,255,255,.06);border-radius:14px;padding:1.5rem;margin:2rem auto;max-width:800px}.dm-box h3{font-size:1rem;font-weight:600;margin-bottom:1rem;display:flex;align-items:center;gap:.5rem}.dm-row{display:flex;gap:.6rem;margin-bottom:1rem}.dm-row input{flex:1;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.08);border-radius:8px;padding:.6rem .8rem;color:#edf2f7;font-family:Outfit;font-size:.85rem;outline:none}.dm-row button{background:var(--a,#7c5cfc);color:#05080f;border:none;border-radius:8px;padding:.6rem 1.2rem;font-weight:700;cursor:pointer;font-family:Outfit;font-size:.85rem;white-space:nowrap}.dm-out{min-height:80px;padding:1rem;background:rgba(0,0,0,.2);border-radius:8px;font-size:.82rem;color:#edf2f7;line-height:1.6}.dm-out strong{color:#fff}.dm-out pre{background:rgba(0,0,0,.3);padding:.5rem;border-radius:6px;font-size:.75rem;margin:.4rem 0;overflow-x:auto}.dm-ld{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--a,#7c5cfc);margin:0 2px;animation:dmp .8s infinite}.dm-ld:nth-child(2){animation-delay:.2s}.dm-ld:nth-child(3){animation-delay:.4s}@keyframes dmp{0%,100%{opacity:1}50%{opacity:.3}}</style>
<div class="dm-box" id="demo"><h3>⚡ DeliverScore — Demo Live</h3>
<div class="dm-row"><input id="dm-deliverscore" placeholder="Entrez un domaine" onkeydown="if(event.key==='Enter')dm_deliverscore()"><button onclick="dm_deliverscore()">Tester</button></div>
<div class="dm-out" id="dmo-deliverscore">Testez DeliverScore en direct — aucune inscription.</div></div>
<script>
async function dm_deliverscore(){var q=document.getElementById("dm-deliverscore").value.trim();if(!q)return;var o=document.getElementById("dmo-deliverscore");o.innerHTML='<span class="dm-ld"></span><span class="dm-ld"></span><span class="dm-ld"></span>';try{var r=await fetch("/api/weval-ia-fast.php",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:"[INSTRUCTION SYSTEME: Reponds de facon structurée et professionnelle.]\n\nDemande utilisateur: Analyse la délivrabilité email du domaine: "+q,mode:"full"})});var j=await r.json();o.innerHTML=(j.response||"Erreur").replace(/\*\*(.*?)\*\*/g,"<strong>$1</strong>").replace(/\n\n/g,"<br><br>");}catch(e){o.innerHTML="Erreur: "+e.message}}
</script>
<div id="cta" style="max-width:600px;margin:2rem auto;padding:0 4%">
<div style="background:#0c1222;border:1px solid rgba(99,102,241,.15);border-radius:14px;padding:1.5rem">
<h3 style="font-size:1rem;font-weight:700;margin-bottom:.8rem;color:#818cf8">Demander un accès</h3>
<input id="ct-name" type="text" placeholder="Votre nom" style="width:100%;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.08);border-radius:8px;padding:.6rem;font-size:.85rem;color:#edf2f7;font-family:inherit;margin-bottom:.6rem;outline:none">
<input id="ct-email" type="email" placeholder="Email professionnel" style="width:100%;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.08);border-radius:8px;padding:.6rem;font-size:.85rem;color:#edf2f7;font-family:inherit;margin-bottom:.6rem;outline:none">
<button onclick="ctS()" id="ct-btn" style="width:100%;background:#6366f1;color:#fff;border:none;border-radius:8px;padding:.7rem;font-weight:700;cursor:pointer;font-size:.9rem">Envoyer</button>
<div id="ct-ok" style="display:none;text-align:center;padding:1rem;color:#10b981;font-weight:600">Demande envoyee !</div>
</div></div>
<script>async function ctS(){var n=document.getElementById("ct-name").value.trim(),e=document.getElementById("ct-email").value.trim();if(!n||!e){alert("Nom et email requis");return;}document.getElementById("ct-btn").disabled=true;try{await fetch("/api/contact",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:n,email:e,source:location.pathname,ts:new Date().toISOString()})})}catch(x){}document.getElementById("ct-btn").style.display="none";document.getElementById("ct-ok").style.display="block";}</script>
<script defer src=/assets/dm-enhance.js></script></body>
<!-- WEVAL Self-Service Inject -->
<script>
if(window===window.top){
// Replace all contact mailto links with signup portal
document.querySelectorAll('a[href*="mailto:"]').forEach(a => {
if(a.classList.contains('btn-p') || a.classList.contains('btn-f') || a.classList.contains('btn-n') || a.classList.contains('btn-nav') || a.classList.contains('btn-primary') || a.classList.contains('btn-price-fill') || a.textContent.includes('Commencer') || a.textContent.includes('Commander') || a.textContent.includes('Essayer') || a.textContent.includes('Souscrire') || a.textContent.includes('Créer') || a.textContent.includes('Obtenir') || a.textContent.includes('Démarrer') || a.textContent.includes('Rejoindre')) {
a.href = '/products/workspace.html';
a.removeAttribute('target');
}
});
// Add floating CTA
const bar = document.createElement('div');
bar.innerHTML = '<div style="position:fixed;bottom:0;left:0;right:0;z-index:999;background:rgba(5,8,15,0.95);backdrop-filter:blur(10px);border-top:1px solid rgba(0,201,167,0.15);padding:0.6rem 4%;display:flex;justify-content:space-between;align-items:center"><div style="font-size:0.82rem;color:#7a8ba5"><strong style="color:#edf2f7">WEVAL Products</strong> · <span style="color:#00c9a7">Self-service</span> · Inscription en 30 secondes</div><a href="/products/workspace.html" style="background:#00c9a7;color:#05080f;padding:0.5rem 1.2rem;border-radius:6px;font-weight:700;font-size:0.82rem;text-decoration:none">Créer mon compte gratuit →</a></div>';
if(window.self===window.top){document.body.appendChild(bar);}
document.body.style.paddingBottom = '52px';
}
</script></html>