// UI Manager Module
// Responsible for creating and managing the user interface elements
class UIManager {
constructor(settings) {
this.settings = settings || {
debugMode: false,
};
this.buttonCreated = false;
this.analysisResults = null;
this.pageType = 'general';
}
log(message, data = null) {
if (this.settings.debugMode) {
console.log(`UIManager: ${message}`, data || "");
}
}
setPageType(pageType) {
this.pageType = pageType;
}
createButton(analysisResults = null) {
if (analysisResults) {
this.analysisResults = analysisResults;
}
if (!this.analysisResults) {
console.error('DIMA: Aucun résultat d\'analyse disponible pour créer le bouton');
return;
}
try {
// Supprimer bouton existant
document.getElementById('dima-btn')?.remove();
if (this.buttonCreated) return;
const button = document.createElement('div');
button.id = 'dima-btn';
button.innerHTML = `
🧠
${this.analysisResults.globalScore}
${this.analysisResults.riskLevel}
`;
button.style.cssText = `
position: fixed !important;
top: 20px !important;
right: 20px !important;
z-index: 999999 !important;
background: linear-gradient(135deg, ${this.analysisResults.riskColor}, ${this.adjustColor(this.analysisResults.riskColor, -20)}) !important;
color: white !important;
padding: 12px 16px !important;
border-radius: 25px !important;
cursor: pointer !important;
font-family: 'Segoe UI', Arial, sans-serif !important;
font-size: 14px !important;
box-shadow: 0 4px 15px rgba(0,0,0,0.2), 0 2px 5px rgba(0,0,0,0.1) !important;
border: 2px solid rgba(255,255,255,0.2) !important;
user-select: none !important;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
backdrop-filter: blur(10px) !important;
`;
button.title = this.generateTooltip();
// Événements
button.addEventListener('click', () => this.showModal());
button.addEventListener('mouseenter', () => {
button.style.transform = 'scale(1.05) translateY(-2px)';
button.style.boxShadow = '0 6px 20px rgba(0,0,0,0.3), 0 4px 8px rgba(0,0,0,0.2)';
});
button.addEventListener('mouseleave', () => {
button.style.transform = 'scale(1) translateY(0)';
button.style.boxShadow = '0 4px 15px rgba(0,0,0,0.2), 0 2px 5px rgba(0,0,0,0.1)';
});
document.body?.appendChild(button);
this.buttonCreated = true;
this.log('Bouton créé avec succès');
} catch (error) {
console.error('DIMA: Erreur création bouton:', error);
}
}
adjustColor(color, amount) {
const num = parseInt(color.replace("#", ""), 16);
const amt = Math.round(2.55 * amount);
const R = (num >> 16) + amt;
const G = (num >> 8 & 0x00FF) + amt;
const B = (num & 0x0000FF) + amt;
return "#" + (0x1000000 + (R < 255 ? R < 1 ? 0 : R : 255) * 0x10000 +
(G < 255 ? G < 1 ? 0 : G : 255) * 0x100 +
(B < 255 ? B < 1 ? 0 : B : 255)).toString(16).slice(1);
}
generateTooltip() {
const techniques = this.analysisResults.detectedTechniques.slice(0, 3);
return `DIMA Score: ${this.analysisResults.globalScore} (${this.analysisResults.riskLevel})
${this.analysisResults.detectedTechniques.length} techniques détectées
${techniques.map(t => `• ${t.nom}`).join('\n')}
Contenu: ${this.analysisResults.contentLength} caractères`;
}
showModal() {
try {
this.log('Affichage du modal');
document.getElementById('dima-modal')?.remove();
const modal = document.createElement('div');
modal.id = 'dima-modal';
modal.style.cssText = `
position: fixed !important;
top: 0 !important;
left: 0 !important;
width: 100% !important;
height: 100% !important;
background: rgba(0,0,0,0.75) !important;
backdrop-filter: blur(5px) !important;
z-index: 9999999 !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
font-family: 'Segoe UI', Arial, sans-serif !important;
animation: fadeIn 0.3s ease-out !important;
`;
// Récupérer l'URL du logo
const logoUrl = chrome.runtime.getURL('M82-logo-16.png');
modal.innerHTML = `
Analyse DIMA
Détection de techniques de manipulation cognitive par
M82 Project
${this.analysisResults.globalScore}
Score Global
${this.analysisResults.detectedTechniques.length}
Techniques
${this.analysisResults.riskLevel}
Niveau Risque
${this.analysisResults.contentLength}
Caractères
📄 Page analysée
${this.analysisResults.title}
${this.analysisResults.url}
Analysé le ${new Date(this.analysisResults.timestamp).toLocaleString('fr-FR')} •
${this.analysisResults.analyzedText} caractères traités • Type: ${this.pageType}
${this.analysisResults.detectedTechniques.length === 0 ? `
✅
Aucune manipulation détectée
Le contenu analysé semble exempt de techniques de manipulation cognitive manifestes
` : `
⚠️ Techniques de manipulation détectées
${this.analysisResults.detectedTechniques.slice(0, 8).map(technique => `
${technique.phase === 'Detect' ? '👁️' : technique.phase === 'Informer' ? '📢' : technique.phase === 'Mémoriser' ? '🧠' : '⚡'} ${technique.index}: ${technique.nom}
${technique.tactic ? `
↳ Tactique: ${technique.tactic}
` : ''}
${technique.description ? `
${technique.description}
` : ''}
${technique.confidence}%
${technique.phase}
Score pondéré: ${technique.weightedScore?.toFixed(1) || technique.score}
${technique.matchedKeywords?.length > 0 ? `
🔍 Mots-clés détectés:
${technique.matchedKeywords.slice(0, 4).map(keyword =>
`
${keyword.keyword} ${(keyword.count > 1) ? `(×${keyword.count})` : ''}
`
).join('')}
${technique.matchedKeywords.length > 4 ?
`+${technique.matchedKeywords.length - 4} autres...`
: ''
}
` : ''}
`).join('')}
`}
`;
modal.addEventListener('click', (e) => {
if (e.target === modal) modal.remove();
});
document.body.appendChild(modal);
this.log('Modal affiché');
} catch (error) {
console.error('DIMA: Erreur modal:', error);
}
}
}
// Make UIManager available globally for Chrome extension
window.UIManager = UIManager;