// 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 = `
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

📄 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;