Files
html/assets/weval-em-flagship.js
2026-04-18 12:34:18 +02:00

312 lines
16 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* WEVAL WEVIA EM + Huawei Overlay v106 — 2026-04-18
Additive, non-invasive. Split injection :
- Ribbon WEVIA EM + section flagships : UNIQUEMENT sur / (homepage)
- Bannière Huawei Cloud : UNIQUEMENT sur /marketplace
*/
(function () {
'use strict';
// Skip iframe context
if (window !== window.top) return;
var DISMISS_KEY = 'wv-em-ribbon-dismissed';
var HUAWEI_DISMISS_KEY = 'wv-huawei-banner-dismissed';
var SECTION_ID = 'wv-em-flagship-section';
var RIBBON_ID = 'wv-em-ribbon';
var HUAWEI_ID = 'huawei-banner-v2';
function qs(sel, root) { return (root || document).querySelector(sel); }
function isHomepage() {
var p = window.location.pathname;
return p === '/' || p === '/index.html' || p === '';
}
function isMarketplace() {
var p = window.location.pathname;
return p === '/marketplace' || p === '/marketplace/' || p.indexOf('/marketplace') === 0;
}
// ══════════════════════════════════════════════════════════════════
// WEVIA EM RIBBON (homepage only)
// ══════════════════════════════════════════════════════════════════
function buildRibbon() {
if (qs('#' + RIBBON_ID)) return null;
if (localStorage.getItem(DISMISS_KEY) === '1') return null;
var el = document.createElement('div');
el.id = RIBBON_ID;
el.className = 'wv-em-ribbon';
el.setAttribute('role', 'region');
el.setAttribute('aria-label', 'Nouveauté WEVIA EM');
el.innerHTML =
'<span class="wv-em-ribbon-badge">Flagship</span>' +
'<span class="wv-em-ribbon-txt"><strong>WEVIA EM</strong> — L\u2019IA souveraine qui orchestre votre value chain de bout en bout.</span>' +
'<a href="/products/wevia-em.html" class="wv-em-ribbon-link">Découvrir →</a>' +
'<button class="wv-em-ribbon-close" aria-label="Fermer">✕</button>';
var closeBtn = el.querySelector('.wv-em-ribbon-close');
closeBtn.addEventListener('click', function () {
el.classList.add('hide');
document.body.classList.remove('wv-em-ribbon-active');
try { localStorage.setItem(DISMISS_KEY, '1'); } catch (e) {}
setTimeout(function () { if (el.parentNode) el.parentNode.removeChild(el); }, 400);
});
return el;
}
function buildFlagshipSection() {
if (qs('#' + SECTION_ID)) return null;
var sec = document.createElement('section');
sec.id = SECTION_ID;
sec.className = 'wv-em-section';
sec.innerHTML =
'<div class="wv-em-section-wrap">' +
'<div class="wv-em-section-head">' +
'<div class="wv-em-stag">// Catalogue WEVAL</div>' +
'<h2>13 applications, <em>7 suites.</em> Une stack IA souveraine.</h2>' +
'<p class="wv-em-section-sub">De l\u2019orchestration multi-agents à l\u2019automatisation bureautique, de l\u2019intelligence pharmaceutique au marketing haute performance. Tout est propriété WEVAL, déployable chez vous, conforme RGPD et AI Act.</p>' +
'</div>' +
'<div class="wv-em-flag-grid">' +
'<a class="wv-em-flag p" href="/products/wevia-em.html">' +
'<div class="wv-em-flag-tag">Flagship</div>' +
'<h3>WEVIA EM</h3>' +
'<span class="wv-em-flag-tagline">Enterprise Model</span>' +
'<p>L\u2019IA souveraine qui orchestre la valeur de bout en bout. 930 agents, 9 métiers, POC 2 semaines.</p>' +
'</a>' +
'<a class="wv-em-flag t" href="/products/wevia-master.html">' +
'<div class="wv-em-flag-tag">Flagship</div>' +
'<h3>WEVIA Master</h3>' +
'<span class="wv-em-flag-tagline">Agent IA autonome</span>' +
'<p>L\u2019agent qui exécute, pas juste qui répond. Scanne, décide, apprend sur votre domaine métier.</p>' +
'</a>' +
'<a class="wv-em-flag g" href="/products/arsenal.html">' +
'<div class="wv-em-flag-tag">Flagship</div>' +
'<h3>Arsenal</h3>' +
'<span class="wv-em-flag-tagline">Framework ERP Intelligence</span>' +
'<p>150+ écrans modulaires. Brain Engine IA. Comble les 20 % que votre ERP ne fait pas.</p>' +
'</a>' +
'<a class="wv-em-flag c" href="/products/reachhcp.html">' +
'<div class="wv-em-flag-tag">Flagship</div>' +
'<h3>ReachHCP</h3>' +
'<span class="wv-em-flag-tagline">Base HCP mondiale</span>' +
'<p>Professionnels de santé consent-based, segmentation fine, conformité RGPD et HDS.</p>' +
'</a>' +
'</div>' +
'<div class="wv-em-suites-wrap">' +
'<div class="wv-em-suites-label">// 7 suites métier</div>' +
'<div class="wv-em-suites">' +
'<a class="wv-em-suite-chip" href="/solutions/wevia-enterprise.html">WEVIA Enterprise</a>' +
'<a class="wv-em-suite-chip" href="/solutions/marketing-cloud.html">WEVAL Marketing Cloud</a>' +
'<a class="wv-em-suite-chip" href="/solutions/pharma-cloud.html">WEVAL Pharma Cloud</a>' +
'<a class="wv-em-suite-chip" href="/solutions/advisory.html">WEVAL Advisory</a>' +
'<a class="wv-em-suite-chip" href="/solutions/productivity.html">WEVAL Productivity</a>' +
'<a class="wv-em-suite-chip" href="/solutions/commerce-data.html">WEVAL Commerce &amp; Data</a>' +
'<a class="wv-em-suite-chip" href="/solutions/cloud-security.html">WEVAL Cloud &amp; Security</a>' +
'</div>' +
'</div>' +
'<div class="wv-em-section-cta">' +
'<a href="/products/" class="wv-em-btn-primary">Voir le catalogue complet →</a>' +
'</div>' +
'</div>';
return sec;
}
// ══════════════════════════════════════════════════════════════════
// HUAWEI BANNER (marketplace only)
// ══════════════════════════════════════════════════════════════════
function buildHuaweiBanner() {
if (qs('#' + HUAWEI_ID)) return null;
if (localStorage.getItem(HUAWEI_DISMISS_KEY) === '1') return null;
// Inline HTML identical to what was in index.html before — zero regression on visual
var wrap = document.createElement('div');
wrap.id = HUAWEI_ID;
wrap.setAttribute('style', 'background:linear-gradient(135deg,#e94560 0%,#c13349 100%);color:white;padding:0;position:relative;z-index:999;box-shadow:0 4px 20px rgba(233,69,96,0.3);font-family:-apple-system,BlinkMacSystemFont,\'Segoe UI\',sans-serif');
wrap.innerHTML =
'<div style="max-width:1400px;margin:0 auto;padding:1rem 2rem;display:flex;align-items:center;justify-content:space-between;gap:1.5rem;flex-wrap:wrap">' +
'<div style="display:flex;align-items:center;gap:1rem;flex:1;min-width:280px">' +
'<svg style="width:44px;height:44px;fill:white;flex-shrink:0;filter:drop-shadow(0 2px 4px rgba(0,0,0,0.15))" viewBox="0 0 24 24"><path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96z"/></svg>' +
'<div style="text-align:center">' +
'<div style="font-weight:800;font-size:1.1rem;letter-spacing:-0.02em;line-height:1.2">' +
'<span class="banner-lang" data-lang="fr">🏆 Partenaire Certifié Huawei Cloud</span>' +
'<span class="banner-lang" data-lang="en" style="display:none">🏆 Certified Huawei Cloud Partner</span>' +
'</div>' +
'<div style="font-size:0.85rem;opacity:0.95;font-weight:500;margin-top:0.3rem;letter-spacing:0.01em">' +
'<span class="banner-lang" data-lang="fr">Infrastructure Cloud • IA &amp; Data • Haute Disponibilité • Accompagnement Expert</span>' +
'<span class="banner-lang" data-lang="en" style="display:none">Cloud Infrastructure • IA &amp; Data • High Availability • Expert Support</span>' +
'</div>' +
'</div>' +
'</div>' +
'<div style="display:flex;gap:0.75rem;align-items:center;flex-wrap:wrap;justify-content:center">' +
'<a href="/products/huawei-cloud.html" class="wv-huawei-cta-a" style="padding:0.7rem 1.5rem;background:white;color:#e94560;border-radius:8px;font-weight:700;text-decoration:none;font-size:0.9rem;white-space:nowrap;transition:all 0.3s;display:flex;align-items:center;gap:0.5rem;box-shadow:0 4px 12px rgba(0,0,0,0.15)">' +
'<span>📋</span>' +
'<span class="banner-lang" data-lang="fr">Voir le catalogue</span>' +
'<span class="banner-lang" data-lang="en" style="display:none">View catalog</span>' +
'</a>' +
'<a href="https://www.huaweicloud.com/intl/en-us/" target="_blank" rel="noopener" class="wv-huawei-cta-b" style="padding:0.7rem 1.5rem;background:rgba(255,255,255,0.15);border:2px solid white;color:white;border-radius:8px;font-weight:700;text-decoration:none;font-size:0.9rem;white-space:nowrap;transition:all 0.3s;display:flex;align-items:center;gap:0.5rem;backdrop-filter:blur(10px)">' +
'<span>☁️</span>' +
'<span class="banner-lang" data-lang="fr">Accéder au Cloud</span>' +
'<span class="banner-lang" data-lang="en" style="display:none">Access Cloud</span>' +
'</a>' +
'<button class="wv-huawei-lang-btn" style="padding:0.5rem 0.8rem;background:rgba(255,255,255,0.2);border:1px solid rgba(255,255,255,0.3);color:white;border-radius:6px;font-weight:600;cursor:pointer;font-size:0.85rem;transition:all 0.3s;backdrop-filter:blur(10px)"><span class="wv-huawei-lang-label">🌐 EN</span></button>' +
'<button class="wv-huawei-close-btn" style="background:rgba(255,255,255,0.15);border:none;color:white;font-size:1.4rem;cursor:pointer;padding:0.3rem 0.6rem;border-radius:6px;transition:all 0.3s;line-height:1;backdrop-filter:blur(10px)" title="Fermer" aria-label="Fermer">×</button>' +
'</div>' +
'</div>';
// Language toggle
var currentLang = 'fr';
var langBtn = wrap.querySelector('.wv-huawei-lang-btn');
var langLabel = wrap.querySelector('.wv-huawei-lang-label');
langBtn.addEventListener('click', function () {
currentLang = currentLang === 'fr' ? 'en' : 'fr';
var spans = wrap.querySelectorAll('.banner-lang');
for (var i = 0; i < spans.length; i++) {
spans[i].style.display = spans[i].getAttribute('data-lang') === currentLang ? '' : 'none';
}
langLabel.textContent = currentLang === 'fr' ? '🌐 EN' : '🌐 FR';
});
// Close
var closeBtn = wrap.querySelector('.wv-huawei-close-btn');
closeBtn.addEventListener('click', function () {
wrap.style.display = 'none';
try { localStorage.setItem(HUAWEI_DISMISS_KEY, '1'); } catch (e) {}
});
return wrap;
}
function injectHuaweiStyle() {
if (qs('#wv-huawei-banner-style')) return;
var s = document.createElement('style');
s.id = 'wv-huawei-banner-style';
s.textContent =
'@media (max-width:768px){' +
'#' + HUAWEI_ID + ' > div{padding:1rem !important;flex-direction:column !important;gap:1rem !important;}' +
'#' + HUAWEI_ID + ' svg{width:32px !important;height:32px !important;}' +
'#' + HUAWEI_ID + ' .banner-lang[data-lang]{font-size:0.9rem !important;}' +
'#' + HUAWEI_ID + ' a,#' + HUAWEI_ID + ' button{font-size:0.85rem !important;padding:0.6rem 1.2rem !important;}' +
'}' +
'@media (max-width:480px){' +
'#' + HUAWEI_ID + ' > div{padding:0.8rem !important;}' +
'#' + HUAWEI_ID + ' > div > div:last-child{width:100% !important;flex-direction:column !important;}' +
'#' + HUAWEI_ID + ' a{width:100% !important;justify-content:center !important;}' +
'}';
document.head.appendChild(s);
}
// ══════════════════════════════════════════════════════════════════
// INJECTORS
// ══════════════════════════════════════════════════════════════════
function injectRibbon() {
var el = buildRibbon();
if (!el) return;
document.body.insertBefore(el, document.body.firstChild);
document.body.classList.add('wv-em-ribbon-active');
}
function injectSection() {
var el = buildFlagshipSection();
if (!el) return;
var footer = qs('footer') || qs('[class*="footer"]') || qs('[class*="Footer"]');
if (footer && footer.parentNode) {
footer.parentNode.insertBefore(el, footer);
} else {
document.body.appendChild(el);
}
}
function injectHuaweiBanner() {
var el = buildHuaweiBanner();
if (!el) return;
injectHuaweiStyle();
document.body.insertBefore(el, document.body.firstChild);
}
function init() {
try {
if (isHomepage()) {
injectRibbon();
injectSection();
} else if (isMarketplace()) {
injectHuaweiBanner();
}
} catch (e) {
if (window.console) console.warn('[wv-em] init error', e);
}
}
function waitReactMount(callback, tries) {
tries = tries || 0;
if (tries > 40) return callback();
var root = document.getElementById('root') || document.getElementById('app') || document.querySelector('main');
if (root && root.children.length > 0) {
callback();
} else {
setTimeout(function () { waitReactMount(callback, tries + 1); }, 125);
}
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', function () { waitReactMount(init); });
} else {
waitReactMount(init);
}
// MutationObserver : re-inject si React re-render (SPA navigation)
var observer = new MutationObserver(function () {
if (isHomepage()) {
if (!qs('#' + SECTION_ID)) injectSection();
if (!qs('#' + RIBBON_ID) && localStorage.getItem(DISMISS_KEY) !== '1') injectRibbon();
} else if (isMarketplace()) {
if (!qs('#' + HUAWEI_ID) && localStorage.getItem(HUAWEI_DISMISS_KEY) !== '1') injectHuaweiBanner();
}
});
if (document.body) {
observer.observe(document.body, { childList: true, subtree: false });
} else {
document.addEventListener('DOMContentLoaded', function () {
observer.observe(document.body, { childList: true, subtree: false });
});
}
// Also react to SPA route changes (pushState/popstate)
var lastPath = window.location.pathname;
function handleRouteChange() {
if (window.location.pathname !== lastPath) {
lastPath = window.location.pathname;
// Remove stale elements
var rib = qs('#' + RIBBON_ID);
var sec = qs('#' + SECTION_ID);
var hua = qs('#' + HUAWEI_ID);
if (!isHomepage()) {
if (rib && rib.parentNode) rib.parentNode.removeChild(rib);
if (sec && sec.parentNode) sec.parentNode.removeChild(sec);
document.body.classList.remove('wv-em-ribbon-active');
}
if (!isMarketplace()) {
if (hua && hua.parentNode) hua.parentNode.removeChild(hua);
}
// Re-inject for current path
init();
}
}
window.addEventListener('popstate', handleRouteChange);
// Patch pushState to catch programmatic navigation
var origPushState = history.pushState;
history.pushState = function () {
origPushState.apply(this, arguments);
setTimeout(handleRouteChange, 100);
};
})();