312 lines
16 KiB
JavaScript
312 lines
16 KiB
JavaScript
/* 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 & Data</a>' +
|
||
'<a class="wv-em-suite-chip" href="/solutions/cloud-security.html">WEVAL Cloud & 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 & Data • Haute Disponibilité • Accompagnement Expert</span>' +
|
||
'<span class="banner-lang" data-lang="en" style="display:none">Cloud Infrastructure • IA & 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);
|
||
};
|
||
})();
|