aknouce94 commited on
Commit
c605052
·
verified ·
1 Parent(s): af1d91e

// HTS Investigation Suite - Frontend React Production

Browse files

// HIGH TECH SECURITY - Interface client fonctionnelle

import React, { useState, useEffect, useCallback } from 'react';
import axios from 'axios';
import {
Shield, Brain, AlertTriangle, Upload, Download, Play, Pause,
TrendingUp, Users, Database, Globe, Lock, Settings, FileText,
Network, Target, Zap, Clock, CheckCircle, XCircle, Eye, Search
} from 'lucide-react';

// Configuration API
const API_BASE_URL = process.env.REACT_APP_API_URL || 'http://localhost:8000';
const api = axios.create({
baseURL: API_BASE_URL,
timeout: 30000,
headers: {
'Content-Type': 'application/json',
}
});

// Service API complet
class HTSApiService {
// Health check
static async healthCheck() {
const response = await api.get('/health');
return response.data;
}

// Créer investigation
static async createInvestigation(data) {
const response = await api.post('/api/investigations', data);
return response.data;
}

// Analyse DarkBERT
static async analyzeWithDarkBERT(investigationId, documents, modelName = 'bert') {
const response = await api.post('/api/analysis/darkbert', {
investigation_id: investigationId,
documents: documents,
model_name: modelName
});
return response.data;
}

// Récupérer alertes
static async getAlerts(investigationId) {
const response = await api.get(`/api/investigations/${investigationId}/alerts`);
return response.data;
}

// Stats globales
static async getGlobalStats() {
const response = await api.get('/api/stats/global');
return response.data;
}

// Info système
static async getSystemInfo() {
const response = await api.get('/');
return response.data;
}
}

// Hook personnalisé pour WebSocket temps réel
const useRealTimeUpdates = () => {
const [updates, setUpdates] = useState([]);
const [isConnected, setIsConnected] = useState(false);

useEffect(() => {
// Simulation WebSocket (à remplacer par vraie connexion)
const interval = setInterval(() => {
const mockUpdate = {
id: Date.now(),
type: ['analysis_completed', 'threat_detected', 'system_alert'][Math.floor(Math.random() * 3)],
message: `Mise à jour système ${new Date().toLocaleTimeString()}`,
timestamp: new Date()
};
setUpdates(prev => [mockUpdate, ...prev.slice(0, 9)]);
}, 5000);

setIsConnected(true);
return () => {
clearInterval(interval);
setIsConnected(false);
};
}, []);

return { updates, isConnected };
};

// Composant principal
const HTSInvestigationApp = () => {
const [systemHealth, setSystemHealth] = useState(null);
const [globalStats, setGlobalStats] = useState(null);
const [activeModule, setActiveModule] = useState('dashboard');
const [loading, setLoading] = useState(false);
const [investigations, setInvestigations] = useState([]);
const [currentAnalysis, setCurrentAnalysis] = useState(null);
const { updates, isConnected } = useRealTimeUpdates();

// Chargement initial
useEffect(() => {
loadSystemData();
const interval = setInterval(loadSystemData, 30000); // Refresh toutes les 30s
return () => clearInterval(interval);
}, []);

const loadSystemData = async () => {
try {
const [health, stats] = await Promise.all([
HTSApiService.healthCheck(),
HTSApiService.getGlobalStats()
]);
setSystemHealth(health);
setGlobalStats(stats);
} catch (error) {
console.error('Erreur chargement données:', error);
}
};

// Création d'investigation
const createNewInvestigation = async (clientType, title, description) => {
setLoading(true);
try {
const investigation = await HTSApiService.createInvestigation({
client_type: clientType,
title: title,
description: description,
created_by: 'admin_user'
});

setInvestigations(prev => [investigation, ...prev]);
return investigation;
} catch (error) {
console.error('Erreur création investigation:', error);
throw error;
} finally {
setLoading(false);
}
};

// Analyse DarkBERT
const runDarkBERTAnalysis = async (investigationId, documents, modelName = 'bert') => {
setLoading(true);
try {
const result = await HTSApiService.analyzeWithDarkBERT(investigationId, documents, modelName);
setCurrentAnalysis(result);
return result;
} catch (error) {
console.error('Erreur analyse DarkBERT:', error);
throw error;
} finally {
setLoading(false);
}
};

// Composant Dashboard
const Dashboard = () => (
<div className="space-y-6">
{/* Status système */}
<div className="bg-white rounded-xl p-6 shadow-lg">
<div className="flex items-center justify-between mb-4">
<h2 className="text-2xl font-bold text-gray-900">HIGH TECH SECURITY - Status Système</h2>
<div className="flex items-center gap-2">
<div className={`w-3 h-3 rounded-full ${isConnected ? 'bg-green-500' : 'bg-red-500'}`}></div>
<span className="text-sm text-gray-600">
{isConnected ? 'Temps réel actif' : 'Déconnecté'}
</span>
</div>
</div>

{systemHealth && (
<div className="grid grid-cols-2 lg:grid-cols-4 gap-4">
<div className="bg-green-50 p-4 rounded-lg">
<div className="flex items-center gap-2 mb-2">
<Database className="w-5 h-5 text-green-600" />
<span className="font-medium text-green-900">Base de données</span>
</div>
<span className="text-green-700 text-sm">{systemHealth.database}</span>
</div>

<div className="bg-blue-50 p-4 rounded-lg">
<div className="flex items-center gap-2 mb-2">
<Zap className="w-5 h-5 text-blue-600" />
<span className="font-medium text-blue-900">Redis Cache</span>
</div>
<span className="text-blue-700 text-sm">{systemHealth.redis}</span>
</div>

<div className="bg-purple-50 p-4 rounded-lg">
<div className="flex items-center gap-2 mb-2">
<Brain className="w-5 h-5 text-purple-600" />
<span className="font-medium text-purple-900">Modèles IA</span>
</div>
<span className="text-purple-700 text-sm">{systemHealth.models_loaded} chargés</span>
</div>

<div className="bg-orange-50 p-4 rounded-lg">
<div className="flex items-center gap-2 mb-2">
<Shield className="w-5 h-5 text-orange-600" />
<span className="font-medium text-orange-900">Sécurité</span>
</div>
<span className="text-orange-700 text-sm">Maximale</span>
</div>
</div>
)}
</div>

{/* Statistiques globales */}
{globalStats && (
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
<StatCard
icon={FileText}
title="Investigations"
value={globalStats.total_investigations}
subtitle={`${globalStats.active_investigations} actives`}
color="blue"
/>
<StatCard
icon={Brain}
title="Analyses IA"
value={globalStats.total_analyses}
subtitle="DarkBERT Engine"
color="purple"
/>
<StatCard
icon={AlertTriangle}
title="Alertes"
value={globalStats.total_alerts}
subtitle="Système sécurisé"
color="red"
/>
<StatCard
icon={TrendingUp}
title="Performance"
value="99.7%"
subtitle="Uptime système"
color="green"
/>
</div>
)}

{/* Mises à jour temps réel */}
<div className="bg-white rounded-xl p-6 shadow-lg">
<h3 className="text-lg font-semibold text-gray-900 mb-4">Activité Temps Réel</h3>
<div className="space-y-2 max-h-64 overflow-y-auto">
{updates.map(update => (
<div key={update.id} className="flex items-center gap-3 p-3 bg-gray-50 rounded-lg">
<div className={`w-2 h-2 rounded-full ${
update.type === 'threat_detected' ? 'bg-red-500' :
update.type === 'analysis_completed' ? 'bg-green-500' : 'bg-blue-500'
}`}></div>
<span className="text-sm text-gray-700">{update.message}</span>
<span className="text-xs text-gray-500 ml-auto">
{update.timestamp.toLocaleTimeString()}
</span>
</div>
))}
</div>
</div>
</div>
);

// Composant Analyse DarkBERT
const DarkBERTAnalysis = () => {
const [documents, setDocuments] = useState('');
const [selectedModel, setSelectedModel] = useState('bert');
const [investigationTitle, setInvestigationTitle] = useState('');
const [clientType, setClientType] = useState('police');
const [analysisResult, setAnalysisResult] = useState(null);

const handleAnalysis = async () => {
if (!documents.trim() || !investigationTitle.trim()) {
alert('Veuillez remplir tous les champs');
return;
}

try {
// Créer investigation
const investigation = await createNewInvestigation(
clientType,
investigationTitle,
'Analyse DarkBERT automatique'
);

// Lancer analyse
const docList = documents.split('\n').filter(doc => doc.trim().length > 10);
const result = await runDarkBERTAnalysis(investigation.id, docList, selectedModel);
setAnalysisResult(result);

} catch (error) {
alert('Erreur lors de l\'analyse: ' + error.message);
}
};

return (
<div className="space-y-6">
<div className="bg-white rounded-xl p-6 shadow-lg">
<h2 className="text-2xl font-bold text-gray-900 mb-6">Analyse D

Files changed (2) hide show
  1. README.md +8 -5
  2. index.html +289 -18
README.md CHANGED
@@ -1,10 +1,13 @@
1
  ---
2
- title: Cybersleuth Prodigy
3
- emoji: 🐨
4
- colorFrom: pink
5
- colorTo: gray
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
1
  ---
2
+ title: CyberSleuth Prodigy 🔍
3
+ colorFrom: green
4
+ colorTo: blue
5
+ emoji: 🐳
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite-v3
10
  ---
11
 
12
+ # Welcome to your new DeepSite project!
13
+ This project was created with [DeepSite](https://deepsite.hf.co).
index.html CHANGED
@@ -1,19 +1,290 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  </html>
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>CyberSleuth Prodigy | Security Dashboard</title>
7
+ <link rel="icon" type="image/x-icon" href="/static/favicon.ico">
8
+ <script src="https://cdn.tailwindcss.com"></script>
9
+ <script src="https://unpkg.com/feather-icons"></script>
10
+ <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
11
+ <script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.globe.min.js"></script>
12
+ <style>
13
+ @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&family=Rubik:wght@300;400;500;600;700&display=swap');
14
+ body {
15
+ font-family: 'Rubik', sans-serif;
16
+ }
17
+ .code-font {
18
+ font-family: 'JetBrains Mono', monospace;
19
+ }
20
+ .vanta-canvas {
21
+ position: absolute;
22
+ top: 0;
23
+ left: 0;
24
+ width: 100%;
25
+ height: 100%;
26
+ z-index: 0;
27
+ opacity: 0.15;
28
+ }
29
+ .glass-card {
30
+ backdrop-filter: blur(16px) saturate(180%);
31
+ -webkit-backdrop-filter: blur(16px) saturate(180%);
32
+ background-color: rgba(255, 255, 255, 0.85);
33
+ }
34
+ .threat-critical {
35
+ background: linear-gradient(90deg, rgba(239,68,68,0.1) 0%, rgba(239,68,68,0.3) 100%);
36
+ }
37
+ .threat-high {
38
+ background: linear-gradient(90deg, rgba(249,115,22,0.1) 0%, rgba(249,115,22,0.3) 100%);
39
+ }
40
+ .threat-medium {
41
+ background: linear-gradient(90deg, rgba(234,179,8,0.1) 0%, rgba(234,179,8,0.3) 100%);
42
+ }
43
+ .animate-pulse-slow {
44
+ animation: pulse 3s cubic-bezier(0.4, 0, 0.6, 1) infinite;
45
+ }
46
+ @keyframes pulse {
47
+ 0%, 100% { opacity: 1; }
48
+ 50% { opacity: 0.5; }
49
+ }
50
+ </style>
51
+ </head>
52
+ <body class="bg-gray-50">
53
+ <div id="vanta-bg" class="vanta-canvas"></div>
54
+
55
+ <!-- Header -->
56
+ <header class="relative z-10 bg-white shadow-lg border-b border-gray-200">
57
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4">
58
+ <div class="flex items-center justify-between">
59
+ <div class="flex items-center space-x-4">
60
+ <div class="bg-blue-600 p-2 rounded-lg">
61
+ <i data-feather="shield" class="text-white w-6 h-6"></i>
62
+ </div>
63
+ <div>
64
+ <h1 class="text-2xl font-bold text-gray-900">CyberSleuth Prodigy</h1>
65
+ <p class="text-sm text-gray-600">HTS Investigation Suite v2.1</p>
66
+ </div>
67
+ </div>
68
+
69
+ <div class="hidden md:flex items-center space-x-6">
70
+ <div class="text-right">
71
+ <div class="text-sm text-gray-600">203-205 The Vale, London W3 7QS</div>
72
+ <div class="text-xs text-gray-500">UK: +44 7591 665201 | Company: 7849187</div>
73
+ </div>
74
+ <div class="flex items-center space-x-2 bg-green-50 px-3 py-2 rounded-lg">
75
+ <i data-feather="lock" class="w-4 h-4 text-green-600"></i>
76
+ <span class="text-sm font-medium text-green-700">Secured Connection</span>
77
+ </div>
78
+ </div>
79
+ </div>
80
+ </div>
81
+ </header>
82
+
83
+ <!-- Navigation -->
84
+ <nav class="relative z-10 bg-gray-800 text-white">
85
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
86
+ <div class="flex space-x-1 overflow-x-auto py-2 hide-scrollbar">
87
+ <a href="#" class="flex items-center space-x-2 px-4 py-3 border-b-2 border-blue-400 text-blue-400 transition-colors">
88
+ <i data-feather="activity" class="w-4 h-4"></i>
89
+ <span>Dashboard</span>
90
+ </a>
91
+ <a href="#" class="flex items-center space-x-2 px-4 py-3 border-b-2 border-transparent hover:border-gray-600 transition-colors">
92
+ <i data-feather="cpu" class="w-4 h-4"></i>
93
+ <span>DarkBERT AI</span>
94
+ </a>
95
+ <a href="#" class="flex items-center space-x-2 px-4 py-3 border-b-2 border-transparent hover:border-gray-600 transition-colors">
96
+ <i data-feather="search" class="w-4 h-4"></i>
97
+ <span>Investigations</span>
98
+ </a>
99
+ <a href="#" class="flex items-center space-x-2 px-4 py-3 border-b-2 border-transparent hover:border-gray-600 transition-colors">
100
+ <i data-feather="eye" class="w-4 h-4"></i>
101
+ <span>Monitoring</span>
102
+ </a>
103
+ <a href="#" class="flex items-center space-x-2 px-4 py-3 border-b-2 border-transparent hover:border-gray-600 transition-colors">
104
+ <i data-feather="settings" class="w-4 h-4"></i>
105
+ <span>Configuration</span>
106
+ </a>
107
+ </div>
108
+ </div>
109
+ </nav>
110
+
111
+ <!-- Main Content -->
112
+ <main class="relative z-10 max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
113
+ <!-- System Status -->
114
+ <div class="glass-card rounded-xl shadow-lg p-6 mb-8">
115
+ <div class="flex items-center justify-between mb-6">
116
+ <h2 class="text-2xl font-bold text-gray-900">System Status</h2>
117
+ <div class="flex items-center space-x-2">
118
+ <div class="w-2 h-2 rounded-full bg-green-500 animate-pulse-slow"></div>
119
+ <span class="text-sm text-gray-600">Real-time active</span>
120
+ </div>
121
+ </div>
122
+
123
+ <div class="grid grid-cols-2 md:grid-cols-4 gap-4">
124
+ <!-- Database Status -->
125
+ <div class="bg-blue-50 p-4 rounded-lg border border-blue-200">
126
+ <div class="flex items-center space-x-2 mb-2">
127
+ <i data-feather="database" class="w-5 h-5 text-blue-600"></i>
128
+ <span class="font-medium text-blue-900">Database</span>
129
+ </div>
130
+ <span class="text-blue-700 text-sm">Operational</span>
131
+ </div>
132
+
133
+ <!-- AI Models -->
134
+ <div class="bg-purple-50 p-4 rounded-lg border border-purple-200">
135
+ <div class="flex items-center space-x-2 mb-2">
136
+ <i data-feather="cpu" class="w-5 h-5 text-purple-600"></i>
137
+ <span class="font-medium text-purple-900">AI Models</span>
138
+ </div>
139
+ <span class="text-purple-700 text-sm">3 loaded</span>
140
+ </div>
141
+
142
+ <!-- Security -->
143
+ <div class="bg-green-50 p-4 rounded-lg border border-green-200">
144
+ <div class="flex items-center space-x-2 mb-2">
145
+ <i data-feather="shield" class="w-5 h-5 text-green-600"></i>
146
+ <span class="font-medium text-green-900">Security</span>
147
+ </div>
148
+ <span class="text-green-700 text-sm">Maximum</span>
149
+ </div>
150
+
151
+ <!-- Cache -->
152
+ <div class="bg-orange-50 p-4 rounded-lg border border-orange-200">
153
+ <div class="flex items-center space-x-2 mb-2">
154
+ <i data-feather="zap" class="w-5 h-5 text-orange-600"></i>
155
+ <span class="font-medium text-orange-900">Redis Cache</span>
156
+ </div>
157
+ <span class="text-orange-700 text-sm">Operational</span>
158
+ </div>
159
+ </div>
160
+ </div>
161
+
162
+ <!-- Global Stats -->
163
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
164
+ <!-- Investigations Card -->
165
+ <div class="bg-white rounded-xl shadow-lg p-6 border border-gray-200">
166
+ <div class="flex items-center justify-between mb-4">
167
+ <i data-feather="file-text" class="w-8 h-8 text-blue-600"></i>
168
+ <span class="text-2xl font-bold text-blue-600">42</span>
169
+ </div>
170
+ <h3 class="font-semibold text-gray-900">Investigations</h3>
171
+ <p class="text-sm text-gray-600">8 active</p>
172
+ </div>
173
+
174
+ <!-- AI Analysis Card -->
175
+ <div class="bg-white rounded-xl shadow-lg p-6 border border-gray-200">
176
+ <div class="flex items-center justify-between mb-4">
177
+ <i data-feather="cpu" class="w-8 h-8 text-purple-600"></i>
178
+ <span class="text-2xl font-bold text-purple-600">128</span>
179
+ </div>
180
+ <h3 class="font-semibold text-gray-900">AI Analyses</h3>
181
+ <p class="text-sm text-gray-600">DarkBERT Engine</p>
182
+ </div>
183
+
184
+ <!-- Alerts Card -->
185
+ <div class="bg-white rounded-xl shadow-lg p-6 border border-gray-200">
186
+ <div class="flex items-center justify-between mb-4">
187
+ <i data-feather="alert-triangle" class="w-8 h-8 text-red-600"></i>
188
+ <span class="text-2xl font-bold text-red-600">19</span>
189
+ </div>
190
+ <h3 class="font-semibold text-gray-900">Alerts</h3>
191
+ <p class="text-sm text-gray-600">System secured</p>
192
+ </div>
193
+
194
+ <!-- Performance Card -->
195
+ <div class="bg-white rounded-xl shadow-lg p-6 border border-gray-200">
196
+ <div class="flex items-center justify-between mb-4">
197
+ <i data-feather="trending-up" class="w-8 h-8 text-green-600"></i>
198
+ <span class="text-2xl font-bold text-green-600">99.7%</span>
199
+ </div>
200
+ <h3 class="font-semibold text-gray-900">Performance</h3>
201
+ <p class="text-sm text-gray-600">Uptime</p>
202
+ </div>
203
+ </div>
204
+
205
+ <!-- Real-time Activity -->
206
+ <div class="glass-card rounded-xl shadow-lg p-6 mb-8">
207
+ <h3 class="text-lg font-semibold text-gray-900 mb-4">Real-time Activity</h3>
208
+ <div class="space-y-2 max-h-64 overflow-y-auto">
209
+ <!-- Sample Activity Items -->
210
+ <div class="flex items-center gap-3 p-3 bg-gray-50 rounded-lg">
211
+ <div class="w-2 h-2 rounded-full bg-green-500"></div>
212
+ <span class="text-sm text-gray-700">Analysis #DN42 completed successfully</span>
213
+ <span class="text-xs text-gray-500 ml-auto">10:42:35</span>
214
+ </div>
215
+ <div class="flex items-center gap-3 p-3 bg-gray-50 rounded-lg">
216
+ <div class="w-2 h-2 rounded-full bg-red-500"></div>
217
+ <span class="text-sm text-gray-700">Threat detected in cluster #12</span>
218
+ <span class="text-xs text-gray-500 ml-auto">10:38:21</span>
219
+ </div>
220
+ <div class="flex items-center gap-3 p-3 bg-gray-50 rounded-lg">
221
+ <div class="w-2 h-2 rounded-full bg-blue-500"></div>
222
+ <span class="text-sm text-gray-700">New investigation created: Operation Midnight</span>
223
+ <span class="text-xs text-gray-500 ml-auto">10:35:07</span>
224
+ </div>
225
+ <div class="flex items-center gap-3 p-3 bg-gray-50 rounded-lg">
226
+ <div class="w-2 h-2 rounded-full bg-green-500"></div>
227
+ <span class="text-sm text-gray-700">System backup completed</span>
228
+ <span class="text-xs text-gray-500 ml-auto">10:30:45</span>
229
+ </div>
230
+ </div>
231
+ </div>
232
+
233
+ <!-- Quick Actions -->
234
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-6">
235
+ <div class="bg-white rounded-xl shadow-lg p-6 border border-gray-200">
236
+ <h3 class="text-lg font-semibold text-gray-900 mb-4">Start New Analysis</h3>
237
+ <p class="text-sm text-gray-600 mb-4">Initiate DarkBERT analysis with documents or text input</p>
238
+ <button class="w-full bg-blue-600 hover:bg-blue-700 text-white font-medium py-2 px-4 rounded-lg flex items-center justify-center space-x-2">
239
+ <i data-feather="cpu" class="w-4 h-4"></i>
240
+ <span>Launch DarkBERT</span>
241
+ </button>
242
+ </div>
243
+
244
+ <div class="bg-white rounded-xl shadow-lg p-6 border border-gray-200">
245
+ <h3 class="text-lg font-semibold text-gray-900 mb-4">Recent Investigations</h3>
246
+ <div class="space-y-2">
247
+ <a href="#" class="block p-2 hover:bg-gray-50 rounded-lg text-sm">Operation Midnight</a>
248
+ <a href="#" class="block p-2 hover:bg-gray-50 rounded-lg text-sm">Sigma Protocol</a>
249
+ <a href="#" class="block p-2 hover:bg-gray-50 rounded-lg text-sm">Phoenix Network</a>
250
+ </div>
251
+ </div>
252
+
253
+ <div class="bg-white rounded-xl shadow-lg p-6 border border-gray-200">
254
+ <h3 class="text-lg font-semibold text-gray-900 mb-4">System Alerts</h3>
255
+ <div class="space-y-3">
256
+ <div class="p-2 rounded-lg threat-critical">
257
+ <div class="flex justify-between items-center">
258
+ <span class="text-sm font-medium">Critical threat detected</span>
259
+ <span class="text-xs">10:38</span>
260
+ </div>
261
+ </div>
262
+ <div class="p-2 rounded-lg threat-high">
263
+ <div class="flex justify-between items-center">
264
+ <span class="text-sm font-medium">3 new vulnerabilities</span>
265
+ <span class="text-xs">09:22</span>
266
+ </div>
267
+ </div>
268
+ </div>
269
+ </div>
270
+ </div>
271
+ </main>
272
+
273
+ <script>
274
+ feather.replace();
275
+ VANTA.GLOBE({
276
+ el: "#vanta-bg",
277
+ mouseControls: true,
278
+ touchControls: true,
279
+ gyroControls: false,
280
+ minHeight: 200.00,
281
+ minWidth: 200.00,
282
+ scale: 1.00,
283
+ scaleMobile: 1.00,
284
+ color: 0x3b82f6,
285
+ backgroundColor: 0xf8fafc,
286
+ size: 0.8
287
+ });
288
+ </script>
289
+ </body>
290
  </html>