31-mars: Use Cases v3, weval-faq-fix v10, widget fix, WhatsApp CTA, L99 DB queries fixed
This commit is contained in:
@@ -18,7 +18,7 @@ a{color:var(--cy);text-decoration:none}
|
||||
.stat::after{content:'';position:absolute;top:0;left:0;right:0;height:2px}
|
||||
.stat:nth-child(1)::after{background:var(--vi)}.stat:nth-child(2)::after{background:var(--gn)}.stat:nth-child(3)::after{background:var(--bl)}.stat:nth-child(4)::after{background:var(--ac)}.stat:nth-child(5)::after{background:var(--pk)}.stat:nth-child(6)::after{background:var(--cy)}
|
||||
.st-l{font-size:9px;color:var(--mu);text-transform:uppercase;letter-spacing:.8px;font-weight:600}.st-v{font-size:24px;font-weight:800;font-family:var(--mono);margin:3px 0}.st-s{font-size:9px;color:var(--mu2)}
|
||||
.grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:12px}
|
||||
.grid{display:grid;grid-template-columns:1fr;gap:12px;margin-bottom:12px}
|
||||
.card{background:var(--bg2);border:1px solid var(--bd);border-radius:8px;overflow:hidden}
|
||||
.card-h{padding:12px 16px;border-bottom:1px solid var(--bd);display:flex;justify-content:space-between;align-items:center}
|
||||
.card-t{font-size:12px;font-weight:700}.card-b{padding:12px 16px}
|
||||
@@ -39,9 +39,9 @@ a{color:var(--cy);text-decoration:none}
|
||||
.lb-sc{font-family:var(--mono);font-weight:700;font-size:12px;width:36px;text-align:right}
|
||||
.lb-pct{font-family:var(--mono);font-size:9px;width:36px;text-align:right;color:var(--mu)}
|
||||
.mx{width:100%;border-collapse:collapse;font-size:10px}
|
||||
.mx th{padding:5px 6px;font-size:8px;text-transform:uppercase;letter-spacing:.5px;color:var(--mu);border-bottom:1px solid var(--bd2);font-weight:600;text-align:center;position:sticky;top:0;background:var(--bg2)}
|
||||
.mx th{padding:2px 3px;font-size:6px;text-transform:uppercase;letter-spacing:.5px;color:var(--mu);border-bottom:1px solid var(--bd2);font-weight:600;text-align:center;position:sticky;top:0;background:var(--bg2)}
|
||||
.mx th:first-child{text-align:left}
|
||||
.mx td{padding:4px 6px;border-bottom:1px solid var(--bd);text-align:center;font-family:var(--mono);font-weight:600;font-size:10px}
|
||||
.mx td{padding:2px 3px;border-bottom:1px solid var(--bd);text-align:center;font-family:var(--mono);font-weight:600;font-size:8px}
|
||||
.mx td:first-child{text-align:left;font-family:var(--font);font-weight:600}
|
||||
.mx tr:hover{background:var(--bg3)}
|
||||
.sc-h{color:var(--gn)}.sc-m{color:var(--go)}.sc-l{color:var(--rd)}
|
||||
@@ -59,7 +59,7 @@ a{color:var(--cy);text-decoration:none}
|
||||
<div class="hdr">
|
||||
<div style="display:flex;align-items:center;gap:14px">
|
||||
<div style="width:36px;height:36px;background:linear-gradient(135deg,var(--vi),var(--pk));border-radius:8px;display:flex;align-items:center;justify-content:center;font-size:17px">🏆</div>
|
||||
<div><h1><span>AI Benchmark</span> vs OPUS 4.6</h1><div class="hdr-sub">18 AIs • 15 Categories • Continuous Improvement</div></div>
|
||||
<div><h1><span>AI Benchmark</span> vs OPUS 4.6</h1><div class="hdr-sub">84 AIs • 25 Categories • 100% OPUS Sovereign</div></div>
|
||||
</div>
|
||||
<div style="display:flex;gap:6px;align-items:center;flex-wrap:wrap">
|
||||
<a href="/oss-discovery.html" style="font-size:9px;padding:5px 10px;border:1px solid var(--bd);border-radius:4px;color:var(--mu2)">OSS 153 tools</a>
|
||||
@@ -79,7 +79,7 @@ function render(c){
|
||||
const A=c.all_ais||{},comp=c.composite||{},lb=c.leaderboard||{},gen=c.generated||'',R=c.report||{};
|
||||
const S=Object.entries(lb).sort((a,b)=>b[1]-a[1]),mx=S[0]?S[0][1]:90;
|
||||
const cats=Object.keys(comp).sort((a,b)=>(comp[b]||0)-(comp[a]||0));
|
||||
const cbs=['WEVIA','WEVCODE','MANAGER'];
|
||||
const cbs=['WEVIA','WEVCODE','MANAGER','DeerFlow','SENTINEL','Ethica_Chat','WEVADS_IA','ChatGPT_4o','Gemini_Pro','Grok_3','Claude_Opus'];
|
||||
const infras=Object.entries(A).filter(([n,a])=>!['OPUS','COMPOSITE','ECOSYSTEM',...cbs].includes(n));
|
||||
let h=`<div class="stats">
|
||||
<div class="stat"><div class="st-l">AIs</div><div class="st-v">${S.length}</div><div class="st-s">Cloud+Sovereign+Agents</div></div>
|
||||
@@ -104,8 +104,8 @@ return `<div class="lb-row">
|
||||
<div class="lb-pct">${vO}%</div>
|
||||
</div>`}).join('')}
|
||||
</div></div></div>
|
||||
<div class="card"><div class="card-h"><div class="card-t">📊 Chatbot Matrix</div><span class="badge b-bl">${cats.length}x${cbs.length}</span></div>
|
||||
<div class="card-b" style="padding:0;overflow:auto;max-height:480px">
|
||||
<div class="card"><div class="card-h"><div class="card-t">📊 AI Capability Matrix</div><span class="badge b-bl">${cats.length}x${cbs.length} (${Object.keys(A).length} total)</span></div>
|
||||
<div class="card-b" style="padding:0;overflow:auto;max-height:720px">
|
||||
<table class="mx"><tr><th>Category</th>${cbs.map(a=>`<th>${a}</th>`).join('')}<th style="color:var(--go)">BEST</th><th>OPUS</th></tr>
|
||||
${cats.map(cat=>{const b=comp[cat]||0;return `<tr><td>${cat}</td>${cbs.map(ai=>{const s=A[ai]?.caps?.[cat]||0;return `<td class="${sc(s)}">${s||'-'}</td>`}).join('')}<td class="${sc(b)}" style="font-weight:800">${b}</td><td style="color:var(--go)">90</td></tr>`}).join('')}
|
||||
<tr style="border-top:2px solid var(--bd2)"><td style="font-weight:800">AVG</td>${cbs.map(ai=>`<td class="${sc(A[ai]?.avg||0)}" style="font-weight:800">${A[ai]?.avg||'?'}</td>`).join('')}<td style="font-weight:800;color:var(--go)">${R.composite_avg}</td><td style="color:var(--go);font-weight:800">90</td></tr>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<title>WEVAL L99 Command Center — 2026-03-31 16:37:46</title>
|
||||
<title>WEVAL L99 Command Center — 2026-03-31 21:19:45</title>
|
||||
<style>
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{font-family:'Segoe UI',system-ui,-apple-system,sans-serif;background:#0f172a;color:#e2e8f0;padding:20px}
|
||||
@@ -27,18 +27,18 @@ th{color:#94a3b8;font-weight:600} .fail td{color:#f87171} .pass td{color:#4ade80
|
||||
<div class="subtitle">Lean Six Sigma · Theory of Constraints · Visual Regression · Self-Healing</div>
|
||||
<div class="score-box">
|
||||
<div><span class="score-big green">95%</span></div>
|
||||
<div><div class="score-label">161/169 PASS</div><div class="score-label">6 FAIL · 2 WARN</div>
|
||||
<div class="score-label">⏱ 77s · 2026-03-31 16:37:46</div></div>
|
||||
<div><div class="score-label">238/250 PASS</div><div class="score-label">10 FAIL · 2 WARN</div>
|
||||
<div class="score-label">⏱ 310s · 2026-03-31 21:19:45</div></div>
|
||||
</div></div>
|
||||
|
||||
<div class="metrics">
|
||||
<div class="metric"><div class="val green">161</div><div class="lbl">PASS</div></div>
|
||||
<div class="metric"><div class="val red">6</div><div class="lbl">FAIL</div></div>
|
||||
<div class="metric"><div class="val green">238</div><div class="lbl">PASS</div></div>
|
||||
<div class="metric"><div class="val red">10</div><div class="lbl">FAIL</div></div>
|
||||
<div class="metric"><div class="val yellow">2</div><div class="lbl">WARN</div></div>
|
||||
<div class="metric"><div class="val">77s</div><div class="lbl">Duration</div></div>
|
||||
<div class="metric"><div class="val">310s</div><div class="lbl">Duration</div></div>
|
||||
<div class="metric"><div class="val sigma">3.9σ</div><div class="lbl">Sigma Level</div></div>
|
||||
<div class="metric"><div class="val">5</div><div class="lbl">Videos</div></div>
|
||||
<div class="metric"><div class="val">20</div><div class="lbl">Screenshots</div></div>
|
||||
<div class="metric"><div class="val">11</div><div class="lbl">Videos</div></div>
|
||||
<div class="metric"><div class="val">77</div><div class="lbl">Screenshots</div></div>
|
||||
</div>
|
||||
|
||||
<div class="grid">
|
||||
@@ -58,22 +58,39 @@ th{color:#94a3b8;font-weight:600} .fail td{color:#f87171} .pass td{color:#4ade80
|
||||
<tr><td>🟢 L7</td><td>32/32</td><td>100%</td><td>0</td></tr>
|
||||
<tr><td>🟡 L8</td><td>20/21</td><td>95%</td><td>1</td></tr>
|
||||
<tr><td>🟢 L9</td><td>15/17</td><td>88%</td><td>0</td></tr>
|
||||
<tr><td>🟢 V10</td><td>6/6</td><td>100%</td><td>0</td></tr>
|
||||
<tr><td>🟢 V11</td><td>1/1</td><td>100%</td><td>0</td></tr>
|
||||
<tr><td>🟢 V12</td><td>7/7</td><td>100%</td><td>0</td></tr>
|
||||
<tr><td>🟢 V6</td><td>24/24</td><td>100%</td><td>0</td></tr>
|
||||
<tr><td>🟡 V7</td><td>21/22</td><td>95%</td><td>1</td></tr>
|
||||
<tr><td>🔴 V8</td><td>13/15</td><td>87%</td><td>2</td></tr>
|
||||
<tr><td>🟡 V9</td><td>5/6</td><td>83%</td><td>1</td></tr>
|
||||
</table></div>
|
||||
<div class="card"><h3>❌ Failures</h3><table><tr><th>Layer</th><th>Test</th><th>Detail</th></tr>
|
||||
<tr class="fail"><td>L2</td><td>Disk < 85%</td><td>99%</td></tr>
|
||||
<tr class="fail"><td>L2</td><td>Crons ≥ 20</td><td>0</td></tr>
|
||||
<tr class="fail"><td>L8</td><td>ethica-hcp-manager.html</td><td></td></tr>
|
||||
<tr class="fail"><td>V7</td><td>brain_editor.php</td><td></td></tr>
|
||||
<tr class="fail"><td>V8</td><td>ethica-hcp-manager.html</td><td></td></tr>
|
||||
<tr class="fail"><td>V8</td><td>ethica-drill.html</td><td></td></tr>
|
||||
<tr class="fail"><td>V9</td><td>brain_editor.php</td><td></td></tr>
|
||||
<tr class="fail"><td>L17</td><td>brain_config</td><td>0</td></tr>
|
||||
<tr class="fail"><td>L17</td><td>Sacred winners ≥ 9</td><td>0</td></tr>
|
||||
<tr class="fail"><td>L17</td><td>Contacts</td><td>0</td></tr>
|
||||
</table></div>
|
||||
</div>
|
||||
|
||||
<h2 style="margin:20px 0 12px;font-size:18px">🎬 Video Scenarios</h2><div class="grid"><div class="video-card"><h4>🎬 Scenario 1: Visitor Journey</h4><video controls width="100%"><source src="videos/scenario1-visitor-journey.webm" type="video/webm"></video><p class="PASS">PASS: Homepage→Carousel→Solutions→WEVIA→Contact→Booking (21s)</p></div>
|
||||
<div class="video-card"><h4>🎬 Scenario 2: WEVIA Chatbot</h4><video controls width="100%"><source src="videos/scenario2-chatbot-interaction.webm" type="video/webm"></video><p class="PASS">PASS: Open widget→Type message→Send (8s)</p></div>
|
||||
<div class="video-card"><h4>🎬 Scenario 3: Product Browsing</h4><video controls width="100%"><source src="videos/scenario3-product-browsing.webm" type="video/webm"></video><p class="PASS">PASS: 5 products browsed (9s)</p></div>
|
||||
<div class="video-card"><h4>🎬 Scenario 4: Responsive Testing</h4><video controls width="100%"><source src="videos/scenario4-responsive-test.webm" type="video/webm"></video><p class="PASS">PASS: 6 viewports tested (8s)</p></div>
|
||||
<div class="video-card"><h4>🎬 Scenario 5: Subdomain Tour</h4><video controls width="100%"><source src="videos/scenario5-subdomain-tour.webm" type="video/webm"></video><p class="PASS">PASS: CRM→DeerFlow→Auth→Kuma (13s)</p></div>
|
||||
<h2 style="margin:20px 0 12px;font-size:18px">🎬 Video Scenarios</h2><div class="grid"><div class="video-card"><h4>🎬 Scenario 1: Visitor Journey</h4><video controls width="100%"><source src="videos/scenario1-visitor-journey.webm" type="video/webm"></video><p class="PASS">PASS: Homepage→Carousel→Solutions→WEVIA→Contact→Booking (43s)</p></div>
|
||||
<div class="video-card"><h4>🎬 Scenario 2: WEVIA Chatbot</h4><video controls width="100%"><source src="videos/scenario2-chatbot-interaction.webm" type="video/webm"></video><p class="PASS">PASS: Open widget→Type message→Send (19s)</p></div>
|
||||
<div class="video-card"><h4>🎬 Scenario 3: Product Browsing</h4><video controls width="100%"><source src="videos/scenario3-product-browsing.webm" type="video/webm"></video><p class="PASS">PASS: 5 products browsed (22s)</p></div>
|
||||
<div class="video-card"><h4>🎬 Scenario 4: Responsive Testing</h4><video controls width="100%"><source src="videos/scenario4-responsive-test.webm" type="video/webm"></video><p class="PASS">PASS: 6 viewports tested (33s)</p></div>
|
||||
<div class="video-card"><h4>🎬 Scenario 5: Subdomain Tour</h4><video controls width="100%"><source src="videos/scenario5-subdomain-tour.webm" type="video/webm"></video><p class="PASS">PASS: CRM→DeerFlow→Auth→Kuma (28s)</p></div>
|
||||
<div class="video-card"><h4>🎬 V07-arsenal-deep</h4><video controls width="100%"><source src="videos/V07-arsenal-deep.webm" type="video/webm"></video><p class="PASS">PASS: 22 screens</p></div>
|
||||
<div class="video-card"><h4>🎬 V08-ethica</h4><video controls width="100%"><source src="videos/V08-ethica.webm" type="video/webm"></video><p class="PASS">PASS: 15 screens</p></div>
|
||||
<div class="video-card"><h4>🎬 V09-brain-ia</h4><video controls width="100%"><source src="videos/V09-brain-ia.webm" type="video/webm"></video><p class="PASS">PASS: Brain IA</p></div>
|
||||
<div class="video-card"><h4>🎬 V10-command-centers</h4><video controls width="100%"><source src="videos/V10-command-centers.webm" type="video/webm"></video><p class="PASS">PASS: 6 CCs</p></div>
|
||||
<div class="video-card"><h4>🎬 V11-deerflow</h4><video controls width="100%"><source src="videos/V11-deerflow.webm" type="video/webm"></video><p class="PASS">PASS: DeerFlow</p></div>
|
||||
<div class="video-card"><h4>🎬 V12-static</h4><video controls width="100%"><source src="videos/V12-static.webm" type="video/webm"></video><p class="PASS">PASS: Static pages</p></div>
|
||||
</div>
|
||||
<h2 style="margin:20px 0 12px;font-size:18px">📸 Visual Regression Screenshots</h2><div class="grid"><div class="screenshot-card"><h4>📸 Homepage Desktop</h4><img src="screenshots/homepage-desktop.png" width="100%"><p>1440x900</p></div>
|
||||
<div class="screenshot-card"><h4>📸 Carousel 3D</h4><img src="screenshots/carousel-desktop.png" width="100%"><p>1440x900</p></div>
|
||||
@@ -95,9 +112,66 @@ th{color:#94a3b8;font-weight:600} .fail td{color:#f87171} .pass td{color:#4ade80
|
||||
<div class="screenshot-card"><h4>📸 Subdomain: DeerFlow</h4><img src="screenshots/subdomain-deerflow.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 Subdomain: Authentik</h4><img src="screenshots/subdomain-auth.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 Subdomain: Uptime Kuma</h4><img src="screenshots/subdomain-monitor.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 arsenal-menu</h4><img src="screenshots/arsenal-menu.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 arsenal-sentinel-v4</h4><img src="screenshots/arsenal-sentinel-v4.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 arsenal-brain-send</h4><img src="screenshots/arsenal-brain-send.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 arsenal-command-center</h4><img src="screenshots/arsenal-command-center.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 arsenal-ceo-dashboard</h4><img src="screenshots/arsenal-ceo-dashboard.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 arsenal-emailing-pipeline</h4><img src="screenshots/arsenal-emailing-pipeline.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 arsenal-send-engines-dashboard</h4><img src="screenshots/arsenal-send-engines-dashboard.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 arsenal-cloud-account-factory</h4><img src="screenshots/arsenal-cloud-account-factory.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 arsenal-brain_editor</h4><img src="screenshots/arsenal-brain_editor.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 arsenal-kb-sync-monitor</h4><img src="screenshots/arsenal-kb-sync-monitor.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 arsenal-semi-auto-send</h4><img src="screenshots/arsenal-semi-auto-send.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 arsenal-wevads-architecture</h4><img src="screenshots/arsenal-wevads-architecture.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 arsenal-brain-report</h4><img src="screenshots/arsenal-brain-report.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 arsenal-brain-drilldown</h4><img src="screenshots/arsenal-brain-drilldown.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 arsenal-domain-manager</h4><img src="screenshots/arsenal-domain-manager.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 arsenal-reputation-monitor</h4><img src="screenshots/arsenal-reputation-monitor.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 arsenal-warming-engine</h4><img src="screenshots/arsenal-warming-engine.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 arsenal-send-capacity-dashboard</h4><img src="screenshots/arsenal-send-capacity-dashboard.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 arsenal-operations-overview</h4><img src="screenshots/arsenal-operations-overview.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 arsenal-guardian-dashboard</h4><img src="screenshots/arsenal-guardian-dashboard.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 arsenal-deal-pipeline</h4><img src="screenshots/arsenal-deal-pipeline.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 arsenal-performance-dashboard</h4><img src="screenshots/arsenal-performance-dashboard.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 ethica-ethica-dashboard</h4><img src="screenshots/ethica-ethica-dashboard.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 ethica-ethica-hcp-manager</h4><img src="screenshots/ethica-ethica-hcp-manager.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 ethica-ethica-real-scraper</h4><img src="screenshots/ethica-ethica-real-scraper.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 ethica-ethica-consent</h4><img src="screenshots/ethica-ethica-consent.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 ethica-ethica-track</h4><img src="screenshots/ethica-ethica-track.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 ethica-ethica-audit</h4><img src="screenshots/ethica-ethica-audit.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 ethica-ethica-campaigns</h4><img src="screenshots/ethica-ethica-campaigns.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 ethica-ethica-sms-engine</h4><img src="screenshots/ethica-ethica-sms-engine.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 ethica-ethica-chatbot</h4><img src="screenshots/ethica-ethica-chatbot.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 ethica-ethica-data-list</h4><img src="screenshots/ethica-ethica-data-list.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 ethica-ethica-diagnostic</h4><img src="screenshots/ethica-ethica-diagnostic.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 ethica-ethica-drill</h4><img src="screenshots/ethica-ethica-drill.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 ethica-ethica-google-badge</h4><img src="screenshots/ethica-ethica-google-badge.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 ethica-ethica-inscription</h4><img src="screenshots/ethica-ethica-inscription.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 ethica-ethica-app-v3</h4><img src="screenshots/ethica-ethica-app-v3.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 brain-brain-send</h4><img src="screenshots/brain-brain-send.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 brain-brain-report</h4><img src="screenshots/brain-brain-report.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 brain-brain-drilldown</h4><img src="screenshots/brain-brain-drilldown.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 brain-brain-central</h4><img src="screenshots/brain-brain-central.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 brain-brain-combo-discovery</h4><img src="screenshots/brain-brain-combo-discovery.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 brain-brain_editor</h4><img src="screenshots/brain-brain_editor.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 cc-command-center</h4><img src="screenshots/cc-command-center.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 cc-mega-command-center</h4><img src="screenshots/cc-mega-command-center.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 cc-blade-center</h4><img src="screenshots/cc-blade-center.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 cc-blade-ai</h4><img src="screenshots/cc-blade-ai.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 cc-l99</h4><img src="screenshots/cc-l99.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 cc-arsenal</h4><img src="screenshots/cc-arsenal.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 deerflow-main</h4><img src="screenshots/deerflow-main.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 static-apps</h4><img src="screenshots/static-apps.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 static-booking</h4><img src="screenshots/static-booking.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 static-case-studies</h4><img src="screenshots/static-case-studies.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 static-cgu</h4><img src="screenshots/static-cgu.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 static-monitoring</h4><img src="screenshots/static-monitoring.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 static-crons-monitor</h4><img src="screenshots/static-crons-monitor.png" width="100%"><p></p></div>
|
||||
<div class="screenshot-card"><h4>📸 static-ecosysteme-ia-maroc</h4><img src="screenshots/static-ecosysteme-ia-maroc.png" width="100%"><p></p></div>
|
||||
</div>
|
||||
|
||||
<div style="text-align:center;padding:20px;opacity:0.5;font-size:11px">
|
||||
WEVAL L99 Command Center v1.0 — Powered by Playwright · Lean Six Sigma · Theory of Constraints<br>
|
||||
Generated 2026-03-31 16:37:46 · 3 Servers · 169 Tests · 5 Videos · 20 Screenshots
|
||||
Generated 2026-03-31 21:19:45 · 3 Servers · 250 Tests · 11 Videos · 77 Screenshots
|
||||
</div></body></html>
|
||||
349
api/mcp.php
Normal file
349
api/mcp.php
Normal file
@@ -0,0 +1,349 @@
|
||||
<?php
|
||||
/**
|
||||
* WEVIA MCP Layer v1.0 — Model Context Protocol
|
||||
* Pattern #17 from Claude Code architecture
|
||||
*
|
||||
* Dual mode:
|
||||
* SERVER: Exposes WEVIA tools as MCP endpoints (JSON-RPC 2.0)
|
||||
* CLIENT: Consumes external MCP servers (tool discovery + invocation)
|
||||
*
|
||||
* Spec: https://modelcontextprotocol.io
|
||||
*
|
||||
* SERVER endpoint: /api/mcp.php (this file)
|
||||
* CLIENT: wevia_mcp_discover() + wevia_mcp_invoke()
|
||||
*
|
||||
* Usage: require_once __DIR__ . '/wevia-mcp-layer.php';
|
||||
*/
|
||||
|
||||
define('MCP_VERSION', '1.0.0');
|
||||
define('MCP_PROTOCOL', '2024-11-05'); // MCP spec version
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// MCP SERVER — Expose WEVIA tools as MCP endpoints
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
|
||||
function mcp_server_handle($request) {
|
||||
$method = $request['method'] ?? '';
|
||||
$params = $request['params'] ?? [];
|
||||
$id = $request['id'] ?? null;
|
||||
|
||||
switch ($method) {
|
||||
case 'initialize':
|
||||
return mcp_response($id, [
|
||||
'protocolVersion' => MCP_PROTOCOL,
|
||||
'capabilities' => [
|
||||
'tools' => ['listChanged' => false],
|
||||
'resources' => ['subscribe' => false, 'listChanged' => false],
|
||||
],
|
||||
'serverInfo' => [
|
||||
'name' => 'wevia-mcp-server',
|
||||
'version' => MCP_VERSION,
|
||||
'description' => 'WEVIA Sovereign AI — Tool Server'
|
||||
]
|
||||
]);
|
||||
|
||||
case 'tools/list':
|
||||
return mcp_response($id, ['tools' => mcp_list_tools()]);
|
||||
|
||||
case 'tools/call':
|
||||
$toolName = $params['name'] ?? '';
|
||||
$toolArgs = $params['arguments'] ?? [];
|
||||
return mcp_response($id, mcp_call_tool($toolName, $toolArgs));
|
||||
|
||||
case 'resources/list':
|
||||
return mcp_response($id, ['resources' => mcp_list_resources()]);
|
||||
|
||||
case 'resources/read':
|
||||
$uri = $params['uri'] ?? '';
|
||||
return mcp_response($id, mcp_read_resource($uri));
|
||||
|
||||
case 'ping':
|
||||
return mcp_response($id, []);
|
||||
|
||||
default:
|
||||
return mcp_error($id, -32601, "Method not found: $method");
|
||||
}
|
||||
}
|
||||
|
||||
function mcp_list_tools() {
|
||||
return [
|
||||
[
|
||||
'name' => 'wevia_chat',
|
||||
'description' => 'Send a message to WEVIA sovereign AI chatbot',
|
||||
'inputSchema' => [
|
||||
'type' => 'object',
|
||||
'properties' => [
|
||||
'message' => ['type' => 'string', 'description' => 'User message'],
|
||||
'mode' => ['type' => 'string', 'enum' => ['fast', 'balanced', 'verified'], 'default' => 'balanced'],
|
||||
'lang' => ['type' => 'string', 'default' => 'fr'],
|
||||
],
|
||||
'required' => ['message']
|
||||
]
|
||||
],
|
||||
[
|
||||
'name' => 'wevia_kb_search',
|
||||
'description' => 'Search WEVIA knowledge base (32 tables, 2490+ entries)',
|
||||
'inputSchema' => [
|
||||
'type' => 'object',
|
||||
'properties' => [
|
||||
'query' => ['type' => 'string', 'description' => 'Search query'],
|
||||
'limit' => ['type' => 'integer', 'default' => 5],
|
||||
],
|
||||
'required' => ['query']
|
||||
]
|
||||
],
|
||||
[
|
||||
'name' => 'wevia_pdf_generate',
|
||||
'description' => 'Generate a professional PDF document on any topic',
|
||||
'inputSchema' => [
|
||||
'type' => 'object',
|
||||
'properties' => [
|
||||
'topic' => ['type' => 'string', 'description' => 'Document topic/title'],
|
||||
'sections' => ['type' => 'integer', 'default' => 8],
|
||||
],
|
||||
'required' => ['topic']
|
||||
]
|
||||
],
|
||||
[
|
||||
'name' => 'wevia_mermaid',
|
||||
'description' => 'Generate a Mermaid diagram (flowchart, sequence, class, etc.)',
|
||||
'inputSchema' => [
|
||||
'type' => 'object',
|
||||
'properties' => [
|
||||
'description' => ['type' => 'string', 'description' => 'What to diagram'],
|
||||
'type' => ['type' => 'string', 'enum' => ['flowchart', 'sequence', 'class', 'state', 'er', 'gantt'], 'default' => 'flowchart'],
|
||||
],
|
||||
'required' => ['description']
|
||||
]
|
||||
],
|
||||
[
|
||||
'name' => 'wevia_web_search',
|
||||
'description' => 'Sovereign web search via SearXNG',
|
||||
'inputSchema' => [
|
||||
'type' => 'object',
|
||||
'properties' => [
|
||||
'query' => ['type' => 'string'],
|
||||
'max_results' => ['type' => 'integer', 'default' => 5],
|
||||
],
|
||||
'required' => ['query']
|
||||
]
|
||||
],
|
||||
[
|
||||
'name' => 'wevia_benchmark',
|
||||
'description' => 'Get AI ecosystem benchmark data (66 AIs, 222 skills)',
|
||||
'inputSchema' => [
|
||||
'type' => 'object',
|
||||
'properties' => [
|
||||
'ai_name' => ['type' => 'string', 'description' => 'Specific AI name or "all"'],
|
||||
],
|
||||
'required' => []
|
||||
]
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
function mcp_call_tool($name, $args) {
|
||||
switch ($name) {
|
||||
case 'wevia_chat':
|
||||
$ch = curl_init('http://127.0.0.1/wevia-ia/weval-chatbot-api.php');
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30,
|
||||
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
|
||||
CURLOPT_POSTFIELDS => json_encode([
|
||||
'message' => $args['message'] ?? '',
|
||||
'mode' => $args['mode'] ?? 'balanced',
|
||||
'lang' => $args['lang'] ?? 'fr',
|
||||
])
|
||||
]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
$d = json_decode($r, true);
|
||||
return ['content' => [['type' => 'text', 'text' => $d['response'] ?? 'No response']]];
|
||||
|
||||
case 'wevia_kb_search':
|
||||
$query = $args['query'] ?? '';
|
||||
$limit = $args['limit'] ?? 5;
|
||||
// Direct KB query
|
||||
try {
|
||||
@require_once('/opt/wevads/vault/credentials.php');
|
||||
$pdo = new PDO("pgsql:host=10.1.0.3;dbname=adx_system", "admin", "admin123");
|
||||
$st = $pdo->prepare("SELECT title, content, category FROM admin.wevia_kb WHERE LOWER(content) LIKE LOWER(?) LIMIT ?");
|
||||
$st->execute(["%$query%", $limit]);
|
||||
$results = $st->fetchAll(PDO::FETCH_ASSOC);
|
||||
return ['content' => [['type' => 'text', 'text' => json_encode($results, JSON_UNESCAPED_UNICODE)]]];
|
||||
} catch (Exception $e) {
|
||||
return ['content' => [['type' => 'text', 'text' => 'KB search error: ' . $e->getMessage()]]];
|
||||
}
|
||||
|
||||
case 'wevia_benchmark':
|
||||
$cache = @json_decode(@file_get_contents('/var/www/html/api/ai-benchmark-cache.json'), true);
|
||||
$aiName = $args['ai_name'] ?? 'all';
|
||||
if ($aiName === 'all') {
|
||||
$lb = $cache['leaderboard'] ?? [];
|
||||
arsort($lb);
|
||||
return ['content' => [['type' => 'text', 'text' => json_encode(array_slice($lb, 0, 20, true))]]];
|
||||
}
|
||||
$ai = $cache['all_ais'][$aiName] ?? null;
|
||||
return ['content' => [['type' => 'text', 'text' => $ai ? json_encode($ai) : "AI '$aiName' not found"]]];
|
||||
|
||||
case 'wevia_web_search':
|
||||
$ch = curl_init('http://127.0.0.1:8888/search?q=' . urlencode($args['query'] ?? '') . '&format=json&categories=general');
|
||||
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10]);
|
||||
$r = curl_exec($ch); curl_close($ch);
|
||||
$d = json_decode($r, true);
|
||||
$results = array_slice($d['results'] ?? [], 0, $args['max_results'] ?? 5);
|
||||
$text = implode("\n\n", array_map(fn($r) => "**{$r['title']}**\n{$r['url']}\n{$r['content']}", $results));
|
||||
return ['content' => [['type' => 'text', 'text' => $text ?: 'No results']]];
|
||||
|
||||
default:
|
||||
return ['content' => [['type' => 'text', 'text' => "Unknown tool: $name"]], 'isError' => true];
|
||||
}
|
||||
}
|
||||
|
||||
function mcp_list_resources() {
|
||||
return [
|
||||
['uri' => 'wevia://benchmark/leaderboard', 'name' => 'AI Benchmark Leaderboard', 'mimeType' => 'application/json'],
|
||||
['uri' => 'wevia://config/providers', 'name' => 'Active Providers', 'mimeType' => 'application/json'],
|
||||
['uri' => 'wevia://status/health', 'name' => 'System Health', 'mimeType' => 'application/json'],
|
||||
];
|
||||
}
|
||||
|
||||
function mcp_read_resource($uri) {
|
||||
switch ($uri) {
|
||||
case 'wevia://benchmark/leaderboard':
|
||||
$cache = @json_decode(@file_get_contents('/var/www/html/api/ai-benchmark-cache.json'), true);
|
||||
return ['contents' => [['uri' => $uri, 'mimeType' => 'application/json', 'text' => json_encode($cache['leaderboard'] ?? [])]]];
|
||||
case 'wevia://config/providers':
|
||||
return ['contents' => [['uri' => $uri, 'mimeType' => 'application/json', 'text' => json_encode(['chain' => 'Groq→Cerebras→SambaNova→Mistral→Alibaba', 'sovereign' => 'Local→EU→Free→Paid'])]]];
|
||||
case 'wevia://status/health':
|
||||
return ['contents' => [['uri' => $uri, 'mimeType' => 'application/json', 'text' => json_encode(['status' => 'ok', 'modules' => ['WCP' => 'v1.0', 'WSI' => 'v1.0', 'Dream' => 'active', 'MCP' => 'v1.0'], 'uptime' => exec('uptime -p 2>/dev/null')])]]];
|
||||
default:
|
||||
return ['contents' => []];
|
||||
}
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// MCP CLIENT — Consume external MCP servers
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
|
||||
function wevia_mcp_discover($serverUrl, $timeout = 10) {
|
||||
/**
|
||||
* Discover tools from an external MCP server.
|
||||
* Returns array of available tools with schemas.
|
||||
*/
|
||||
// Initialize
|
||||
$init = wevia_mcp_call($serverUrl, 'initialize', [
|
||||
'protocolVersion' => MCP_PROTOCOL,
|
||||
'capabilities' => [],
|
||||
'clientInfo' => ['name' => 'wevia-mcp-client', 'version' => MCP_VERSION]
|
||||
], $timeout);
|
||||
|
||||
if (!$init) return ['error' => 'init_failed'];
|
||||
|
||||
// List tools
|
||||
$tools = wevia_mcp_call($serverUrl, 'tools/list', [], $timeout);
|
||||
return $tools['tools'] ?? [];
|
||||
}
|
||||
|
||||
function wevia_mcp_invoke($serverUrl, $toolName, $arguments = [], $timeout = 30) {
|
||||
/**
|
||||
* Invoke a tool on an external MCP server.
|
||||
*/
|
||||
$result = wevia_mcp_call($serverUrl, 'tools/call', [
|
||||
'name' => $toolName,
|
||||
'arguments' => $arguments,
|
||||
], $timeout);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
function wevia_mcp_call($serverUrl, $method, $params = [], $timeout = 10) {
|
||||
$payload = json_encode([
|
||||
'jsonrpc' => '2.0',
|
||||
'id' => uniqid('mcp_'),
|
||||
'method' => $method,
|
||||
'params' => $params,
|
||||
]);
|
||||
|
||||
$ch = curl_init($serverUrl);
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_POST => true,
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_TIMEOUT => $timeout,
|
||||
CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'Accept: application/json'],
|
||||
CURLOPT_POSTFIELDS => $payload,
|
||||
]);
|
||||
$r = curl_exec($ch);
|
||||
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
|
||||
if ($code !== 200 || !$r) return null;
|
||||
$d = json_decode($r, true);
|
||||
return $d['result'] ?? null;
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// MCP REGISTRY — Track connected MCP servers
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
|
||||
function wevia_mcp_registry() {
|
||||
/**
|
||||
* Registry of known MCP servers.
|
||||
* Auto-populated by OSS Discovery + manual config.
|
||||
*/
|
||||
$registryFile = '/opt/wevads/vault/mcp-registry.json';
|
||||
if (!file_exists($registryFile)) {
|
||||
$default = [
|
||||
'servers' => [
|
||||
['name' => 'wevia-local', 'url' => 'http://127.0.0.1/api/mcp.php', 'type' => 'local', 'active' => true],
|
||||
],
|
||||
'last_scan' => null,
|
||||
];
|
||||
@file_put_contents($registryFile, json_encode($default, JSON_PRETTY_PRINT));
|
||||
return $default;
|
||||
}
|
||||
return json_decode(file_get_contents($registryFile), true) ?: [];
|
||||
}
|
||||
|
||||
function wevia_mcp_register_server($name, $url, $type = 'external') {
|
||||
$registry = wevia_mcp_registry();
|
||||
$registry['servers'][] = ['name' => $name, 'url' => $url, 'type' => $type, 'active' => true, 'added' => date('c')];
|
||||
@file_put_contents('/opt/wevads/vault/mcp-registry.json', json_encode($registry, JSON_PRETTY_PRINT));
|
||||
return true;
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// JSON-RPC HELPERS
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
|
||||
function mcp_response($id, $result) {
|
||||
return ['jsonrpc' => '2.0', 'id' => $id, 'result' => $result];
|
||||
}
|
||||
|
||||
function mcp_error($id, $code, $message) {
|
||||
return ['jsonrpc' => '2.0', 'id' => $id, 'error' => ['code' => $code, 'message' => $message]];
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// STANDALONE SERVER MODE — if called directly as /api/mcp.php
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
|
||||
if (basename($_SERVER['SCRIPT_FILENAME'] ?? '') === 'wevia-mcp-layer.php' ||
|
||||
basename($_SERVER['SCRIPT_FILENAME'] ?? '') === 'mcp.php') {
|
||||
header('Content-Type: application/json');
|
||||
|
||||
// Auth check
|
||||
$key = $_GET['k'] ?? $_SERVER['HTTP_X_MCP_KEY'] ?? '';
|
||||
if ($key !== 'WEVADS2026' && $key !== 'MCP2026') {
|
||||
http_response_code(403);
|
||||
die(json_encode(mcp_error(null, -32000, 'Unauthorized')));
|
||||
}
|
||||
|
||||
$body = json_decode(file_get_contents('php://input'), true);
|
||||
if (!$body || !isset($body['method'])) {
|
||||
die(json_encode(mcp_error(null, -32700, 'Parse error')));
|
||||
}
|
||||
|
||||
die(json_encode(mcp_server_handle($body)));
|
||||
}
|
||||
|
||||
error_log("MCP: wevia-mcp-layer v" . MCP_VERSION . " loaded (server+client)");
|
||||
@@ -208,7 +208,7 @@ if(p==='/methodologie'){window.location.replace('/methodologie.html')}
|
||||
|
||||
|
||||
<div id="root"></div>
|
||||
<script src="/weval-translate.js?v=34" defer></script>
|
||||
<script src="/weval-translate.js?v=31mar2026d" defer></script>
|
||||
|
||||
<script>
|
||||
(function(){var t=0,iv=setInterval(function(){var n=document.querySelector(".carousel-3d-next");if(n){clearInterval(iv);setInterval(function(){var b=document.querySelector(".carousel-3d-next");if(b)b.click()},3000)}if(++t>30)clearInterval(iv)},500)})();
|
||||
@@ -353,5 +353,5 @@ document.addEventListener('click', function(e) {
|
||||
}
|
||||
}, true);
|
||||
</script>
|
||||
<script src="/weval-faq-fix.js?v=2" defer></script></body>
|
||||
<script src="/weval-faq-fix.js?v=10" defer></script></body>
|
||||
</html>
|
||||
|
||||
5
méthodologie.html
Normal file
5
méthodologie.html
Normal file
@@ -0,0 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head><meta http-equiv="refresh" content="0;url=/methodologie.html"><link rel="canonical" href="https://weval-consulting.com/methodologie.html"></head>
|
||||
<body><script>window.location.replace("/methodologie.html")</script></body>
|
||||
</html>
|
||||
106
weval-faq-fix.js
106
weval-faq-fix.js
@@ -1,4 +1,6 @@
|
||||
/* FAQ French text fixes - v1 */
|
||||
/* WEVAL fixes v5 - safe */
|
||||
|
||||
/* 1. FAQ French accent fixes */
|
||||
(function(){
|
||||
var t=0,iv=setInterval(function(){
|
||||
var els=document.querySelectorAll('p,div,span');
|
||||
@@ -20,10 +22,15 @@
|
||||
},500);
|
||||
})();
|
||||
|
||||
|
||||
|
||||
/* Add References nav link after Products - uses <a> to bypass button click interceptor */
|
||||
/* 2. References nav link - <a> tag, FR/EN via localStorage */
|
||||
(function(){
|
||||
function getLang(){
|
||||
try{return localStorage.getItem('weval-lang')||'fr'}catch(e){return 'fr'}
|
||||
}
|
||||
function updateText(el){
|
||||
if(!el)return;
|
||||
el.textContent=getLang()==='en'?'References':'Références';
|
||||
}
|
||||
var t=0,iv=setInterval(function(){
|
||||
var nav=document.querySelector('.main-navigation');
|
||||
if(nav && !document.getElementById('nav-references')){
|
||||
@@ -39,15 +46,12 @@
|
||||
a.className='nav-link';
|
||||
a.href='/blog/use-cases.html';
|
||||
a.style.cssText='background:none;border:none;color:#374151;font-size:13.5px;font-weight:500;cursor:pointer;padding:.6rem .45rem;text-decoration:none;white-space:nowrap';
|
||||
/* Detect language */
|
||||
var isEN=document.documentElement.lang==='en'||document.querySelector('[data-lang="en"]:not([style*="display:none"])')!=null||document.querySelector('.lang-toggle.active,.language-btn.active')!=null;
|
||||
a.textContent=isEN?'References':'R\u00e9f\u00e9rences';
|
||||
updateText(a);
|
||||
if(prodLink.nextSibling){
|
||||
nav.insertBefore(a,prodLink.nextSibling);
|
||||
} else {
|
||||
nav.appendChild(a);
|
||||
}
|
||||
clearInterval(iv);
|
||||
}
|
||||
}
|
||||
/* Mobile nav */
|
||||
@@ -64,8 +68,7 @@
|
||||
ma.className=pm.className||'mobile-nav-link';
|
||||
ma.href='/blog/use-cases.html';
|
||||
ma.style.textDecoration='none';
|
||||
var isEN2=document.documentElement.lang==='en'||document.querySelector('[data-lang="en"]:not([style*="display:none"])')!=null;
|
||||
ma.textContent=isEN2?'References':'R\u00e9f\u00e9rences';
|
||||
updateText(ma);
|
||||
if(pm.nextSibling){
|
||||
pm.parentNode.insertBefore(ma,pm.nextSibling);
|
||||
} else {
|
||||
@@ -75,17 +78,80 @@
|
||||
}
|
||||
if(++t>40)clearInterval(iv);
|
||||
},500);
|
||||
|
||||
/* Watch for language changes */
|
||||
var origSet=localStorage.setItem.bind(localStorage);
|
||||
try{
|
||||
localStorage.setItem=function(k,v){
|
||||
origSet(k,v);
|
||||
if(k==='weval-lang'){
|
||||
updateText(document.getElementById('nav-references'));
|
||||
updateText(document.getElementById('nav-references-mobile'));
|
||||
}
|
||||
};
|
||||
}catch(e){}
|
||||
})();
|
||||
|
||||
/* Also listen for language changes to update the text */
|
||||
|
||||
/* 3. Fix footer links - accented URLs to actual file paths */
|
||||
(function(){
|
||||
var obs=new MutationObserver(function(){
|
||||
var ref=document.getElementById('nav-references');
|
||||
var refm=document.getElementById('nav-references-mobile');
|
||||
if(!ref&&!refm)return;
|
||||
var isEN=document.querySelector('.banner-lang[data-lang="en"]:not([style*="display:none"])')!=null;
|
||||
if(ref) ref.textContent=isEN?'References':'R\u00e9f\u00e9rences';
|
||||
if(refm) refm.textContent=isEN?'References':'R\u00e9f\u00e9rences';
|
||||
});
|
||||
obs.observe(document.body,{childList:true,subtree:true,attributes:true,attributeFilter:['style','class']});
|
||||
var t=0,iv=setInterval(function(){
|
||||
var links=document.querySelectorAll('a[href]');
|
||||
links.forEach(function(a){
|
||||
var h=a.getAttribute('href');
|
||||
if(h==='/méthodologie.html') a.setAttribute('href','/methodologie.html');
|
||||
});
|
||||
if(++t>40)clearInterval(iv);
|
||||
},800);
|
||||
})();
|
||||
|
||||
/* 4. Remove duplicate Products in nav */
|
||||
(function(){
|
||||
var t=0,iv=setInterval(function(){
|
||||
var nav=document.querySelector('.main-navigation');
|
||||
if(nav){
|
||||
var prods=[];
|
||||
nav.querySelectorAll('button,a').forEach(function(el){
|
||||
if((el.textContent||'').trim()==='Products') prods.push(el);
|
||||
});
|
||||
if(prods.length>1){
|
||||
prods[1].remove();
|
||||
clearInterval(iv);
|
||||
}
|
||||
}
|
||||
if(++t>40)clearInterval(iv);
|
||||
},600);
|
||||
})();
|
||||
|
||||
/* 5. WhatsApp button in sticky CTA bar next to Prendre RDV */
|
||||
(function(){
|
||||
var t=0,iv=setInterval(function(){
|
||||
var btns=document.querySelectorAll('button,a');
|
||||
var rdvBtn=null;
|
||||
btns.forEach(function(b){
|
||||
var txt=(b.textContent||'').trim();
|
||||
if(txt==='Prendre RDV'||txt==='Book a meeting') rdvBtn=b;
|
||||
});
|
||||
if(rdvBtn && !document.getElementById('wv-wa-cta')){
|
||||
var wa=document.createElement('a');
|
||||
wa.id='wv-wa-cta';
|
||||
wa.href='https://wa.me/33647087627?text=Bonjour%20WEVAL%2C%20je%20souhaite%20en%20savoir%20plus';
|
||||
wa.target='_blank';
|
||||
wa.rel='noopener';
|
||||
wa.style.cssText='display:inline-flex;align-items:center;gap:6px;background:#25D366;color:#fff;border:none;padding:8px 18px;border-radius:25px;font-size:13px;font-weight:600;text-decoration:none;white-space:nowrap;cursor:pointer;box-shadow:0 2px 8px rgba(37,211,102,0.4);transition:all .2s';
|
||||
wa.innerHTML='<svg width="16" height="16" viewBox="0 0 24 24" fill="white"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/></svg>WhatsApp';
|
||||
wa.onmouseover=function(){this.style.transform='translateY(-2px)';this.style.boxShadow='0 4px 12px rgba(37,211,102,0.5)'};
|
||||
wa.onmouseout=function(){this.style.transform='';this.style.boxShadow='0 2px 8px rgba(37,211,102,0.4)'};
|
||||
rdvBtn.parentNode.insertBefore(wa,rdvBtn.nextSibling);
|
||||
clearInterval(iv);
|
||||
}
|
||||
if(++t>50)clearInterval(iv);
|
||||
},600);
|
||||
})();
|
||||
|
||||
/* 6. Hide floating WhatsApp bubble (now in CTA bar) */
|
||||
(function(){
|
||||
var s=document.createElement('style');
|
||||
s.textContent='#weval-whatsapp{display:none!important}';
|
||||
document.head.appendChild(s);
|
||||
})();
|
||||
|
||||
@@ -1486,26 +1486,3 @@ if(nav && !document.getElementById('nav-sf')){
|
||||
}
|
||||
var att=0,iv=setInterval(function(){if(boot()||++att>40)clearInterval(iv);},500);
|
||||
})();
|
||||
|
||||
|
||||
/* FAQ French text fixes */
|
||||
(function(){
|
||||
var t=0,iv=setInterval(function(){
|
||||
var els=document.querySelectorAll('p,div,span');
|
||||
var fixed=0;
|
||||
els.forEach(function(el){
|
||||
if(!el.dataset.faqfix && el.textContent && el.textContent.length>20){
|
||||
var html=el.innerHTML;
|
||||
var orig=html;
|
||||
html=html.replace(/360\?\?/g,'360°');
|
||||
html=html.replace(/acceleree/g,'accélérée');
|
||||
html=html.replace(/Durabilite/g,'Durabilité');
|
||||
html=html.replace(/certifie et conforme/g,'certifié et conforme');
|
||||
html=html.replace(/securite les plus/g,'sécurité les plus');
|
||||
html=html.replace(/proprietaire/g,'propriétaire');
|
||||
if(html!==orig){el.innerHTML=html;el.dataset.faqfix='1';fixed++}
|
||||
}
|
||||
});
|
||||
if(fixed>0||++t>30)clearInterval(iv);
|
||||
},500);
|
||||
})();
|
||||
|
||||
@@ -83,12 +83,6 @@ body { font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-seri
|
||||
</style>
|
||||
<style>.in-widget .header{display:none!important}.in-widget #chat{height:100vh!important;padding-top:8px}</style><script>if(window!==window.parent)document.documentElement.classList.add("in-widget")</script>
|
||||
|
||||
/* Hide header when embedded as widget (iframe) */
|
||||
@media (max-height: 700px), (max-width: 500px) {
|
||||
.header { display: none !important; }
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
<script>
|
||||
if (window !== window.top) {
|
||||
|
||||
Reference in New Issue
Block a user