// 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`; } getScoreIcon(score) { if (score >= 75) return '🚨'; // Critique if (score >= 50) return '⚠️'; // Élevé if (score >= 30) return '⚡'; // Modéré if (score >= 15) return '👀'; // Faible return '✅'; // Très faible } generateExecutiveSummary() { const score = this.analysisResults.globalScore; const techniqueCount = this.analysisResults.detectedTechniques.length; const topTechniques = this.analysisResults.detectedTechniques.slice(0, 3); let summary = ""; // Évaluation générale selon le score if (score >= 75) { summary = `🚨 Manipulation intensive détectée : Ce contenu présente un niveau critique de techniques manipulatoires (${techniqueCount} technique${techniqueCount > 1 ? 's' : ''}). `; } else if (score >= 50) { summary = `⚠️ Manipulation significative : Ce contenu utilise plusieurs techniques suspectes (${techniqueCount} technique${techniqueCount > 1 ? 's' : ''}). `; } else if (score >= 30) { summary = `⚡ Éléments manipulatoires présents : Quelques techniques détectées nécessitent votre attention (${techniqueCount} technique${techniqueCount > 1 ? 's' : ''}). `; } else { summary = `👀 Faible niveau de manipulation : Peu d'éléments manipulatoires détectés (${techniqueCount} technique${techniqueCount > 1 ? 's' : ''}). `; } // Analyse des phases dominantes if (this.analysisResults.phaseScores && Object.keys(this.analysisResults.phaseScores).length > 0) { const sortedPhases = Object.entries(this.analysisResults.phaseScores) .sort(([,a], [,b]) => b - a) .slice(0, 2); if (sortedPhases.length > 0) { const dominantPhase = sortedPhases[0][0]; summary += `La manipulation se concentre principalement sur la phase "${dominantPhase}" (${this.getPhaseExplanation(dominantPhase)}). `; } } // Technique principale if (topTechniques.length > 0) { const mainTechnique = topTechniques[0]; summary += `La technique dominante est ${mainTechnique.nom} avec ${mainTechnique.confidence}% de confiance. `; // Conseil spécifique selon la technique summary += this.getTechniqueAdvice(mainTechnique.index); } return summary; } getPhaseEmoji(phase) { const emojis = { 'Detect': '👁️', 'Informer': '📢', 'Mémoriser': '🧠', 'Act': '⚡' }; return emojis[phase] || '📍'; } getPhaseColor(phase) { const colors = { 'Detect': '#e3f2fd', // Bleu clair 'Informer': '#f3e5f5', // Violet clair 'Mémoriser': '#e8f5e8', // Vert clair 'Act': '#fff3e0' // Orange clair }; return colors[phase] || '#f5f5f5'; } getPhaseDescription(phase) { const descriptions = { 'Detect': 'Capter l\'attention', 'Informer': 'Influencer ou orienter la compréhension', 'Mémoriser': 'Ancrer l\'information', 'Act': 'Provoquer l\'action' }; return descriptions[phase] || phase; } getPhaseExplanation(phase) { const explanations = { 'Detect': 'techniques pour attirer et capter votre attention', 'Informer': 'méthodes pour orienter votre interprétation des faits', 'Mémoriser': 'stratégies pour ancrer certaines idées dans votre mémoire', 'Act': 'pressions pour vous pousser à agir rapidement' }; return explanations[phase] || 'manipulation cognitive'; } getTechniqueAdvice(techniqueIndex) { const advices = { 'TE0500': 'Méfiez-vous des titres sensationnalistes et vérifiez les sources.', 'TE0132': 'Prenez du recul face aux messages alarmistes excessifs.', 'TE0501': 'Résistez à la pression de l\'urgence et prenez le temps de réfléchir.', 'TE0422': 'Vérifiez les qualifications réelles des "experts" cités.', 'TE0251': 'Questionnez les affirmations sur ce que "tout le monde" pense.', 'TE0221': 'Attention aux généralisations excessives sur des groupes.', 'TE0212': 'Ne tirez pas de conclusions générales à partir d\'anecdotes.', 'TE0321': 'Cherchez des sources contradictoires pour éviter le biais de confirmation.' }; return advices[techniqueIndex] || 'Restez critique et vérifiez les informations.'; } 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 = `
M82 Project

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
${this.analysisResults.globalScore > 15 ? `

${this.getScoreIcon(this.analysisResults.globalScore)} Résumé de l'analyse

${this.generateExecutiveSummary()}

` : ''}

📄 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.phaseScores && Object.keys(this.analysisResults.phaseScores).length > 0 ? `

📊 Répartition par phase DIMA

${Object.entries(this.analysisResults.phaseScores).map(([phase, score]) => { const maxScore = Math.max(...Object.values(this.analysisResults.phaseScores)); const percentage = maxScore > 0 ? (score / maxScore) * 100 : 0; return `
${this.getPhaseEmoji(phase)} ${phase}
${score.toFixed(1)} pts
${this.getPhaseDescription(phase)}
`; }).join('')}
💡 La matrice DIMA analyse comment l'information traverse les 4 phases cognitives
` : ''} ${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;