V134 Opus workspace premium logos high quality + sidebar order + WEVIA-inspired glyphs - 3 demandes Yacine - demande 1 logos high quality 79 modules utilisent maintenant tous des assets SVG logo- existants dans /assets/ via ICONS_AUTO resolver 80 mappings module key to asset file logo-consulting logo-proposalai logo-blueprintai logo-medreach logo-wevialife logo-ethica logo-arsenal logo-sentinel logo-cloudbridge logo-dataharvest logo-wevia-enterprise etc - demande 2 ordre suites match sidebar exact Conseil Services 8 IA Productivite 21 Marketing 16 Sante Pharma 7 Data 6 Cloud 12 Enterprise 9 fin de la logique sort by length ancienne - demande 3 getFallbackLogoSVG upgraded ultra premium inspire WEVIA official 13 glyphs contextuels par famille mail email envelope AI document sparks dashboard chart cloud shield medical cross people code terminal scout target video play form builder funnel lead linkedin LI brain-lobe WEVIA par defaut - dual linear gradient a78bfa 7c3aed violet 4ade80 16a34a green fbbf24 d97706 orange f87171 dc2626 red 60a5fa 2563eb blue 94a3b8 475569 gray - radial shine overlay 35pct - glow filter gaussian blur 1.2 - chattr discipline - GOLD v134-workspace-premium-logos-sidebar-order/workspace.html.GOLD - Playwright 79 asset logos + 79 premium fallback + 0 broken + 7 suites sidebar order exact + zero errors pageerror - NR 153 sur 153 preserved - doctrines 1 scan 3 GOLD 4 honnete 13 cause racine 14 additif 16 non regression 60 UX premium ULTRA
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled

This commit is contained in:
Opus
2026-04-22 00:35:53 +02:00
parent 4cdd2f56ba
commit ee1ce9d791

View File

@@ -524,6 +524,96 @@ function renderHome(){
'emailwl':'/assets/logo-mailforge.svg',
'consultingpkg':'/assets/logo-consulting.svg',
};
// V134 · Smart logo resolver · auto-match module key → /assets/logo-KEY.svg
// Full map for all 79 modules using existing assets in /var/www/html/assets/
var ICONS_AUTO = {
// Match module keys to logo-*.svg / .png files that exist
svc: '/assets/logo-consulting.svg',
consultingpkg: '/assets/logo-consulting.svg',
academy: '/assets/logo-academy.svg',
weviaagency: '/assets/logo-wevia-official.svg',
wevalcrm: '/assets/logo-dashboard.svg',
cloudcost: '/assets/logo-cloudcost.svg',
pa: '/assets/logo-proposalai.svg',
bp: '/assets/logo-blueprintai.svg',
canvasai: '/assets/logo-canvasai.svg',
copyai: '/assets/logo-copyai.svg',
df: '/assets/logo-devforge.svg',
translate: '/assets/logo-translateai.svg',
meeting: '/assets/logo-meeting-summary.svg',
ppt: '/assets/logo-presentationai.svg',
contracts: '/assets/logo-contractai.svg',
bizplan: '/assets/logo-bizplan.svg',
esign: '/assets/logo-esignature.svg',
leansixsigma: '/assets/logo-leansixsigma.svg',
audit: '/assets/logo-auditcompliance.svg',
dashboardai: '/assets/logo-dashboardai.svg',
cf: '/assets/logo-content-factory.svg',
crf: '/assets/logo-creative-factory.svg',
iaarabe: '/assets/logo-wevia-official.svg',
wedroid: '/assets/logo-wevia-official.svg',
boardflow: '/assets/logo-dashboard.svg',
projectflow: '/assets/logo-dashboard.svg',
weviadesk: '/assets/logo-wevia-official.svg',
wv: '/assets/logo-dashboard.svg',
wevadsia: '/assets/logo-dashboard.svg',
da: '/assets/logo-deliverads.svg',
mailstream: '/assets/logo-mailstream.svg',
mw: '/assets/logo-mailwarm.svg',
mailforge: '/assets/logo-mailforge.svg',
oa: '/assets/logo-outreachai.svg',
smsforge: '/assets/logo-mailforge.svg',
adscontrol: '/assets/logo-adscontrol.svg',
reputationai: '/assets/logo-dashboard.svg',
newsletter: '/assets/logo-newsletter.svg',
aisdr: '/assets/logo-outreachai.svg',
aff: '/assets/logo-affiliates.svg',
campaignstudio: '/assets/logo-content-factory.svg',
linkedinmgr: '/assets/logo-outreachai.svg',
wevadsperf: '/assets/logo-deliverads.svg',
mr: '/assets/logo-medreach.svg',
medreachapi: '/assets/logo-medreach.svg',
medreachcampaign: '/assets/logo-medreach.svg',
medreachdash: '/assets/logo-medreach.svg',
healthcarecrm: '/assets/logo-medreach.svg',
wevialife: '/assets/logo-wevialife.svg',
et: '/assets/logo-ethica.svg',
dataharvest: '/assets/logo-dataharvest.svg',
scout: '/assets/logo-scout.svg',
mind: '/assets/logo-weval-mind.svg',
researchflow: '/assets/logo-weval-mind.svg',
techradar: '/assets/logo-weval-mind.svg',
yt: '/assets/logo-youtube-factory.svg',
arsenal: '/assets/logo-arsenal.svg',
sentinel: '/assets/logo-sentinel.svg',
ds: '/assets/logo-deliverscore.svg',
blacklistguard: '/assets/logo-blacklistguard.svg',
emailverify: '/assets/logo-emailverify.svg',
inboxtest: '/assets/logo-inboxtest.svg',
ispmonitor: '/assets/logo-ispmonitor.svg',
networkguard: '/assets/logo-sentinel.svg',
stackscan: '/assets/logo-sentinel.svg',
trustcenter: '/assets/logo-sentinel.svg',
consentmgr: '/assets/logo-sentinel.svg',
cloudbridge: '/assets/logo-cloudbridge.svg',
gpu: '/assets/logo-gpu-inference.svg',
fb: '/assets/logo-formbuilder.svg',
storeai: '/assets/logo-storeforge.svg',
sf: '/assets/logo-storeforge.svg',
wl: '/assets/logo-wevia-whitelabel.svg',
we: '/assets/logo-wevia-enterprise.svg',
weviaem: '/assets/logo-wevia-enterprise.svg',
emailplatform: '/assets/logo-mailstream.svg',
emailwl: '/assets/logo-wevia-whitelabel.svg',
lf: '/assets/logo-leadforge.svg',
roicalc: '/assets/logo-dashboardai.svg',
solutionfinder: '/assets/logo-weval-mind.svg',
partnerprogram: '/assets/logo-affiliates.svg',
};
// Merge ICONS_AUTO into ICONS (ICONS takes priority)
Object.keys(ICONS_AUTO).forEach(function(k){ if(!ICONS[k]) ICONS[k] = ICONS_AUTO[k]; });
// Recent products
var recents=JSON.parse(localStorage.getItem('wv_recent')||'[]');
var favs=JSON.parse(localStorage.getItem('wv_favs')||'[]');
@@ -588,23 +678,78 @@ function getSuiteColor(suite){
return map[suite] || 'accent';
}
function getFallbackLogoSVG(name, color){
var palette = {'purple':'#8b5cf6','green':'#22c55e','orange':'#f59e0b','red':'#ef4444','accent':'#3b82f6','dim':'#64748b'};
var c = palette[color] || palette.accent;
// Extract 2-letter abbrev (caps of first 2 words, or first 2 chars)
var words = String(name).split(/[\s-]+/).filter(Boolean);
var initials = words.length >= 2
? (words[0][0] + words[1][0]).toUpperCase()
: name.substring(0, 2).toUpperCase();
// Build SVG data URL (WEVIA-style: gradient + rounded)
// V134 · Ultra premium WEVIA-inspired SVG · contextual glyph per category + dual gradient + glow
var palette = {
'purple':{a:'#a78bfa',b:'#7c3aed',glow:'#c4b5fd'},
'green':{a:'#4ade80',b:'#16a34a',glow:'#86efac'},
'orange':{a:'#fbbf24',b:'#d97706',glow:'#fcd34d'},
'red':{a:'#f87171',b:'#dc2626',glow:'#fca5a5'},
'accent':{a:'#60a5fa',b:'#2563eb',glow:'#93c5fd'},
'dim':{a:'#94a3b8',b:'#475569',glow:'#cbd5e1'}
};
var p = palette[color] || palette.accent;
var nameLC = String(name).toLowerCase();
// V134 Contextual glyph selector (SVG path d attribute) based on name keywords
var glyph = '';
if(/mail|email|inbox|newsletter|outreach|smsforge|campaign/i.test(nameLC)){
// Envelope glyph
glyph = '<path d="M30 45 L60 65 L90 45 L90 80 L30 80 Z M30 45 L60 65 L90 45" fill="none" stroke="#fff" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round"/>';
} else if(/ai|copy|canvas|paper|content|creative|blueprint|proposal|translate|contract|bizplan|esign|audit|meeting/i.test(nameLC)){
// Document + spark glyph (AI)
glyph = '<path d="M42 30 L75 30 L82 37 L82 88 L42 88 Z M75 30 L75 37 L82 37" fill="none" stroke="#fff" stroke-width="3" stroke-linejoin="round"/><circle cx="58" cy="55" r="3" fill="#fff"/><circle cx="68" cy="65" r="2.5" fill="#fff"/><circle cx="58" cy="75" r="2" fill="#fff"/>';
} else if(/dash|board|analyt|chart|metric|insight|data|research|project|solution/i.test(nameLC)){
// Bar chart glyph
glyph = '<rect x="32" y="70" width="10" height="18" rx="2" fill="#fff"/><rect x="50" y="55" width="10" height="33" rx="2" fill="#fff"/><rect x="68" y="42" width="10" height="46" rx="2" fill="#fff"/><rect x="86" y="58" width="10" height="30" rx="2" fill="#fff" opacity="0.7"/>';
} else if(/cloud|bridge|stack|guard|sentinel|trust|blacklist|network|ispmonitor|consent|verify/i.test(nameLC)){
// Shield glyph
glyph = '<path d="M60 28 L82 36 L82 56 Q82 76 60 88 Q38 76 38 56 L38 36 Z" fill="none" stroke="#fff" stroke-width="3.5" stroke-linejoin="round"/><path d="M50 58 L57 65 L72 50" fill="none" stroke="#fff" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>';
} else if(/med|pharma|health|life|ethica/i.test(nameLC)){
// Medical cross glyph
glyph = '<circle cx="60" cy="60" r="28" fill="none" stroke="#fff" stroke-width="3"/><rect x="55" y="44" width="10" height="32" rx="2" fill="#fff"/><rect x="44" y="55" width="32" height="10" rx="2" fill="#fff"/>';
} else if(/crm|consult|service|academy|roi|agency/i.test(nameLC)){
// People/connection glyph
glyph = '<circle cx="48" cy="45" r="9" fill="#fff"/><circle cx="72" cy="45" r="9" fill="#fff"/><path d="M32 82 Q32 62 48 62 Q60 62 60 72 Q60 62 72 62 Q88 62 88 82" fill="#fff"/>';
} else if(/devforge|code|stackscan|gpu|storeforge|store|platform|desk|em|whitelabel|wl|enterprise/i.test(nameLC)){
// Code/terminal glyph
glyph = '<rect x="30" y="35" width="60" height="50" rx="4" fill="none" stroke="#fff" stroke-width="3"/><path d="M42 52 L50 60 L42 68 M55 70 L68 70" fill="none" stroke="#fff" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>';
} else if(/scout|radar|techrad|ads|deliverads|deliverscore|reputation|sdr|ai.sdr/i.test(nameLC)){
// Target glyph
glyph = '<circle cx="60" cy="60" r="28" fill="none" stroke="#fff" stroke-width="3"/><circle cx="60" cy="60" r="18" fill="none" stroke="#fff" stroke-width="2.5"/><circle cx="60" cy="60" r="6" fill="#fff"/>';
} else if(/youtube|video|factory/i.test(nameLC)){
// Play triangle
glyph = '<rect x="32" y="38" width="56" height="44" rx="6" fill="none" stroke="#fff" stroke-width="3"/><path d="M52 50 L52 72 L72 61 Z" fill="#fff"/>';
} else if(/form|builder|survey/i.test(nameLC)){
// Form fields
glyph = '<rect x="36" y="38" width="48" height="6" rx="2" fill="#fff"/><rect x="36" y="50" width="48" height="16" rx="3" fill="none" stroke="#fff" stroke-width="2.5"/><rect x="36" y="72" width="30" height="12" rx="3" fill="#fff"/>';
} else if(/lead|forge|arsenal|prospect|affili|partner/i.test(nameLC)){
// Funnel
glyph = '<path d="M30 34 L90 34 L72 58 L72 80 L48 80 L48 58 Z" fill="none" stroke="#fff" stroke-width="3.5" stroke-linejoin="round"/>';
} else if(/linkedin|linkedinmgr/i.test(nameLC)){
// LinkedIn style LI
glyph = '<rect x="30" y="30" width="60" height="60" rx="10" fill="none" stroke="#fff" stroke-width="3"/><rect x="40" y="46" width="7" height="34" fill="#fff"/><circle cx="43.5" cy="40" r="4" fill="#fff"/><path d="M56 46 L56 80 M56 55 Q56 46 66 46 Q76 46 76 58 L76 80" fill="none" stroke="#fff" stroke-width="5" stroke-linecap="round"/>';
} else if(/arabe|arab|translate/i.test(nameLC)){
// Arabic-inspired ornamental circle
glyph = '<circle cx="60" cy="60" r="26" fill="none" stroke="#fff" stroke-width="3"/><path d="M46 56 Q55 44 60 56 Q65 68 74 56" fill="none" stroke="#fff" stroke-width="2.5" stroke-linecap="round"/><path d="M46 66 Q55 54 60 66 Q65 78 74 66" fill="none" stroke="#fff" stroke-width="2.5" stroke-linecap="round"/>';
} else {
// Default: WEVIA-inspired brain-lobe shape
glyph = '<path d="M46 40 Q36 42 34 52 Q26 58 32 68 Q34 80 48 80 Q50 86 60 84 Q70 86 72 80 Q86 80 88 68 Q94 58 86 52 Q84 42 74 40 Q64 30 60 40 Q56 30 46 40" fill="none" stroke="#fff" stroke-width="3.2" stroke-linejoin="round" filter="url(#glowF)"/>';
}
var svg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 120">' +
'<defs><linearGradient id="g" x1="0" y1="0" x2="1" y2="1">' +
'<stop offset="0%" stop-color="' + c + '" stop-opacity="0.95"/>' +
'<stop offset="100%" stop-color="' + c + '" stop-opacity="0.7"/>' +
'</linearGradient></defs>' +
'<rect width="120" height="120" rx="22" fill="url(#g)"/>' +
'<circle cx="60" cy="60" r="42" fill="rgba(255,255,255,0.08)"/>' +
'<text x="60" y="60" text-anchor="middle" dominant-baseline="central" fill="#fff" font-family="DM Sans,sans-serif" font-weight="800" font-size="36">' + initials + '</text>' +
'</svg>';
'<defs>' +
'<linearGradient id="gmain" x1="0" y1="0" x2="1" y2="1">' +
'<stop offset="0%" stop-color="' + p.a + '"/>' +
'<stop offset="100%" stop-color="' + p.b + '"/>' +
'</linearGradient>' +
'<radialGradient id="gshine" cx="30%" cy="25%" r="60%">' +
'<stop offset="0%" stop-color="#fff" stop-opacity="0.35"/>' +
'<stop offset="100%" stop-color="#fff" stop-opacity="0"/>' +
'</radialGradient>' +
'<filter id="glowF"><feGaussianBlur stdDeviation="1.2" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter>' +
'</defs>' +
'<rect width="120" height="120" rx="26" fill="url(#gmain)"/>' +
'<rect width="120" height="120" rx="26" fill="url(#gshine)"/>' +
glyph +
'</svg>';
return 'data:image/svg+xml;utf8,' + encodeURIComponent(svg);
}
function switchView(v){
@@ -638,7 +783,8 @@ function renderSuites(){
groups[suite].push(k);
});
// Sort suites by size DESC (biggest first)
var sortedSuites = Object.keys(groups).sort(function(a,b){ return groups[b].length - groups[a].length; });
var sidebarOrder = ['Conseil & Services','IA & Productivite','Marketing Digital','Santé & Pharma','Data & Intelligence','Cloud & Sécurité','Enterprise'];
var sortedSuites = sidebarOrder.filter(function(s){ return groups[s]; }).concat(Object.keys(groups).filter(function(s){ return sidebarOrder.indexOf(s) === -1; }));
var html = '';
sortedSuites.forEach(function(suite, idx){
var modules = groups[suite];