- Removed all OpenAI/Anthropic/Abbott/AbbVie/J&J references from 11 pages - Removed all internal IPs (88.198.4.195, 89.167.40.150) from placeholders - Removed hardcoded API key 'weval-playground-2026' from gpu-inference.html - Aligned GPU model names: qwen2.5:3b, phi3:mini, gemma2:2b (matches S202) - Replaced all Anthropic API calls with /api/content/generate.php proxy - Genericized MedReach country counts (no internal numbers) - Removed expansion dates (Q3/Q4 2026) and source names (EgyDoctors, DoktorTakvimi, SCFHS, Doctolib) - Replaced internal numbers (646, 604, 527, 1783, CX3, DoubleM) with generics - Internationalized all footers (Casablanca,Maroc -> International) - Replaced PMTA references in product catalogs with generic terms - Fixed Roadmap -> Plan de deploiement in products-index.html Co-authored-by: Yacineutt <Yacineutt@users.noreply.github.com>
579 lines
38 KiB
HTML
579 lines
38 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="fr">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>DeliverScore — Audit Deliverability Email Gratuit</title>
|
|
<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}
|
|
}
|
|
</style></head>
|
|
<body>
|
|
|
|
<nav>
|
|
<div class="logo">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, blacklists, 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="16" height="16" viewBox="0 0 16 16"><circle cx="8" cy="8" r="4" fill="currentColor" opacity=".5"/></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="16" height="16" viewBox="0 0 16 16"><circle cx="8" cy="8" r="4" fill="currentColor" opacity=".5"/></svg></div>
|
|
<h4>7 vérifications</h4>
|
|
<p>MX, SPF, DKIM, DMARC, Blacklists, SSL, Reverse DNS.</p></div>
|
|
<div class="feat">
|
|
<div class="feat-icon"><svg width="16" height="16" viewBox="0 0 16 16"><circle cx="8" cy="8" r="4" fill="currentColor" opacity=".5"/></svg></div>
|
|
<h4>Recommandations IA</h4>
|
|
<p>Actions concrètes pour améliorer votre deliverability.</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 blacklists.</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), blacklists (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 deliverability par rapport à vos concurrents.</p></details></div></div>
|
|
|
|
<footer>
|
|
<a href="https://weval-consulting.com">WEVAL Consulting</a> · Casablanca, Maroc · Un produit <a href="weval-products-hub.html">WEVAL Products</a></footer>
|
|
|
|
<script>
|
|
const API_URL = 'http://89.167.40.150:5890/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 blacklists...',
|
|
'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', 'blacklists', '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; // blacklists + 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)' },
|
|
blacklists: { name:'Blacklists', status:'pass', summary:'Clean — 0 listings across 8 blacklists' },
|
|
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 - 37 produits</div>
|
|
</div>
|
|
<button id="weval-bot-close" onclick="toggleBot()">×</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 deliverability email - SPF/DKIM/DMARC/blacklists. Score + recommandations IA.',price:'Gratuit + Pro $49/mo',url:'/products/deliverscore.html',category:'Email Intelligence'},
|
|
medreach: {name:'MedReach API',desc:'Base de 18596+ professionnels de sante verifies (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. DeepSeek R1, Qwen 2.5 sur RTX 4000 Ada. API OpenAI-compatible.',price:'Gratuit + Pro $99/mo',url:'/products/gpu-inference.html',category:'IA'},
|
|
contentfactory: {name:'AI Content Factory',desc:'Generation 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 qualite 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 Maroc.',price:'0-$29/mo',url:'/products/storeforge.html',category:'Commerce'},
|
|
leadforge: {name:'LeadForge',desc:'B2B Lead Intelligence sur mesure. Leads verifies tous secteurs. 0.30-0.$50/lead.',price:'0.30-0.$49/lead',url:'/products/workspace.html',category:'Data'},
|
|
mailwarm: {name:'MailWarm',desc:'Warmup 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 cle 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 reel MX+SMTP+disposable.',price:'$49/mo',url:'/products/workspace.html',category:'Email Intelligence'},
|
|
blacklistguard: {name:'BlacklistGuard',desc:'Monitoring 100+ blacklists RBL + alertes.',price:'$29/mo',url:'/products/workspace.html',category:'Email Intelligence'},
|
|
reputationai: {name:'ReputationAI',desc:'Score reputation domaine + historique.',price:'$39/mo',url:'/products/workspace.html',category:'Email Intelligence'},
|
|
copyai: {name:'CopyAI WEVAL',desc:'Copywriting IA - emails, sujets, CTA. GPU souverain.',price:'$39/mo',url:'/products/workspace.html',category:'IA'},
|
|
dataharvest: {name:'DataHarvest',desc:'Web Data Enrichment Intelligence avec rotation.',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. 5775+ medecins verifies.',price:'$299/mo',url:'/products/workspace.html',category:'Data'},
|
|
arsenal: {name:'Arsenal Framework',desc:'150+ ecrans. ERP Intelligence, Brain Engine, PMTA. Enterprise.',price:'2000-$9,999/mo',url:'/products/arsenal.html',category:'Flagship'},
|
|
wevads: {name:'WEVADS Platform',desc:'Infrastructure email complete. Brain Engine 646 configs. 6.65M 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>37 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 deliverability')">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 += `• <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 += `• <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='/contact-us'">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 creer 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="/contact-us">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 specifique pour "${userMsg}". Nos 37 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='/contact-us'">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>
|
|
|
|
</body>
|
|
<!-- WEVAL Self-Service Inject -->
|
|
<script>
|
|
// 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>';
|
|
document.body.appendChild(bar);
|
|
document.body.style.paddingBottom = '52px';
|
|
</script></html> |