secutorpro commited on
Commit
99d9682
·
verified ·
1 Parent(s): 17f6526

corrige moi tout ça svp je veux un travaille de pro de colegue à colègue

Browse files
Files changed (3) hide show
  1. chat.html +66 -87
  2. components/navbar.js +6 -2
  3. style.css +368 -11
chat.html CHANGED
@@ -8,39 +8,11 @@
8
  <script src="https://unpkg.com/feather-icons"></script>
9
  <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
10
  <script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.net.min.js"></script>
11
- <style>
12
- @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
13
- body {
14
- font-family: 'Inter', sans-serif;
15
- }
16
- .scrollbar-hide::-webkit-scrollbar {
17
- display: none;
18
- }
19
- .message-user {
20
- background: linear-gradient(135deg, #3b82f6, #60a5fa);
21
- border-radius: 12px 12px 0 12px;
22
- align-self: flex-end;
23
- }
24
- .message-ai {
25
- background: rgba(55, 65, 81, 0.8);
26
- border-radius: 12px 12px 12px 0;
27
- align-self: flex-start;
28
- }
29
- .typing-indicator span {
30
- animation: typing 1.4s infinite ease-in-out;
31
- }
32
- .typing-indicator span:nth-child(1) { animation-delay: 0s; }
33
- .typing-indicator span:nth-child(2) { animation-delay: 0.2s; }
34
- .typing-indicator span:nth-child(3) { animation-delay: 0.4s; }
35
- @keyframes typing {
36
- 0%, 60%, 100% { transform: translateY(0); }
37
- 30% { transform: translateY(-5px); }
38
- }
39
- </style>
40
  </head>
41
  <body class="bg-gray-900 text-gray-100">
42
  <div id="vanta-bg" class="fixed inset-0 z-0"></div>
43
- <div class="relative z-10 min-h-screen p-4 md:p-6">
44
  <!-- Header -->
45
  <header class="bg-gray-800/80 backdrop-blur-md rounded-xl p-4 mb-6 border border-gray-700/50 shadow-lg">
46
  <div class="flex flex-col md:flex-row justify-between items-start md:items-center gap-4">
@@ -70,7 +42,7 @@
70
  <!-- Chat Header -->
71
  <div class="mb-4 pb-4 border-b border-gray-700">
72
  <h2 class="text-xl font-semibold flex items-center">
73
- <i data-feather="message-circle" class="w-5 h-5 mr-2 text-purple-400"></i>
74
  Dolphin-Mistral AI Assistant
75
  </h2>
76
  <p class="text-sm text-gray-400 mt-1">Ask anything related to operations, logistics, or emergency procedures</p>
@@ -79,10 +51,10 @@
79
  <!-- Messages Container -->
80
  <div id="chat-messages" class="flex-1 overflow-y-auto scrollbar-hide space-y-4 mb-4">
81
  <!-- Initial Message -->
82
- <div class="message-ai p-4 max-w-[80%]">
83
  <div class="flex items-start space-x-3">
84
  <div class="bg-purple-500 rounded-full p-2">
85
- <i data-feather="bot" class="w-4 h-4"></i>
86
  </div>
87
  <div>
88
  <p class="font-medium">AI Assistant</p>
@@ -96,7 +68,7 @@
96
  <div id="typing-indicator" class="message-ai p-4 max-w-[60%] hidden">
97
  <div class="flex items-start space-x-3">
98
  <div class="bg-purple-500 rounded-full p-2">
99
- <i data-feather="bot" class="w-4 h-4"></i>
100
  </div>
101
  <div class="typing-indicator flex space-x-1 pt-2">
102
  <span class="w-2 h-2 bg-gray-300 rounded-full"></span>
@@ -113,12 +85,12 @@
113
  type="text"
114
  id="user-input"
115
  placeholder="Type your message here..."
116
- class="flex-1 bg-gray-700/50 rounded-lg px-4 py-3 focus:outline-none focus:ring-2 focus:ring-purple-500"
117
  autocomplete="off"
118
  >
119
  <button
120
  type="submit"
121
- class="bg-purple-600 hover:bg-purple-700 p-3 rounded-lg transition-colors"
122
  >
123
  <i data-feather="send" class="w-5 h-5"></i>
124
  </button>
@@ -128,8 +100,7 @@
128
  </div>
129
  </div>
130
  </div>
131
-
132
- <script>
133
  // Initialize Vanta.js background
134
  VANTA.NET({
135
  el: "#vanta-bg",
@@ -185,20 +156,20 @@
185
  messageDiv.innerHTML = `
186
  <div class="flex items-start space-x-3">
187
  <div class="bg-purple-500 rounded-full p-2">
188
- <i data-feather="bot" class="w-4 h-4"></i>
189
  </div>
190
  <div>
191
  <p class="font-medium">AI Assistant</p>
192
- <p>${content}</p>
193
  </div>
194
  </div>
195
  `;
196
  }
197
-
198
  chatMessages.appendChild(messageDiv);
199
  feather.replace();
200
  chatMessages.scrollTop = chatMessages.scrollHeight;
201
  }
 
202
  // Connection status simulation
203
  let isConnected = true;
204
 
@@ -227,9 +198,8 @@
227
  }
228
  }, 15000);
229
 
230
- // Simulate AI response streaming
231
  async function simulateAIResponse(userMessage) {
232
- // Check connection first
233
  if (!isConnected) {
234
  addMessage('ai', 'Unable to process request: No connection to Mission Control. Please check your communication systems.');
235
  return;
@@ -246,10 +216,11 @@
246
  // Hide typing indicator
247
  typingIndicator.classList.add('hidden');
248
 
249
- // Simulated responses based on user input with more variety
250
  let response = "";
251
  const lowerMsg = userMessage.toLowerCase();
252
 
 
253
  if (lowerMsg.includes("hello") || lowerMsg.includes("hi") || lowerMsg.includes("hey")) {
254
  const greetings = [
255
  "Greetings, operative. How can I assist with your mission today?",
@@ -257,34 +228,48 @@
257
  "Hi there! I'm monitoring all channels. What's your request?"
258
  ];
259
  response = greetings[Math.floor(Math.random() * greetings.length)];
260
- } else if (lowerMsg.includes("emergency") || lowerMsg.includes("help") || lowerMsg.includes("mayday")) {
261
- response = "CRITICAL ALERT: Emergency protocols activated. Contacting Mission Control immediately on Channel 1. Please state your emergency clearly.";
262
- } else if (lowerMsg.includes("procedure") || lowerMsg.includes("protocol") || lowerMsg.includes("sop")) {
263
- response = "Accessing Standard Operating Procedures database... Please specify which protocol you require:\n- Emergency Evacuation\n- Medical Response\n- Security Breach\n- Equipment Failure";
264
- } else if (lowerMsg.includes("location") || lowerMsg.includes("position") || lowerMsg.includes("where")) {
265
- response = "Integrating GPS tracking systems...\nLatest known positions:\n- John Smith: Sector 7 (40.74844°N, -73.98566°W)\n- Maria Garcia: Base Camp (40.74890°N, -73.98750°W)\n- Robert Johnson: Sector 3 (40.74780°N, -73.98620°W)";
266
- } else if (lowerMsg.includes("weather") || lowerMsg.includes("climate") || lowerMsg.includes("conditions")) {
267
- response = "Accessing meteorological data...\nCurrent Conditions:\n- Visibility: Excellent (10km+)\n- Temperature: 22°C (72°F)\n- Wind: 5 km/h NE\n- Atmospheric Pressure: Stable\n- Precipitation: None forecasted";
268
- } else if (lowerMsg.includes("status") || lowerMsg.includes("update") || lowerMsg.includes("report")) {
269
- response = "System Status Report:\n- Network: Online\n- GPS: Active\n- Signal Strength: Good\n- Battery: 85%\n- Team Members: 3 Online\nAll systems functioning within normal parameters.";
270
- } else if (lowerMsg.includes("channel") || lowerMsg.includes("frequency") || lowerMsg.includes("communication")) {
271
- response = "Communication Channels Status:\n- Channel 1 (Operations): Active\n- Channel 2 (Logistics): Active\n- Channel 3 (Medical): Active\n- Channel 4 (Security): Active\nAll channels monitored and operational.";
272
- } else {
 
 
 
 
 
 
 
 
 
 
 
 
 
273
  const responses = [
274
- "Acknowledged. Processing your request...",
275
- "Understood. I've logged this information in the system.",
276
- "Confirmed. All team members notified.",
277
- "Analyzing your query... Operational parameters remain stable.",
278
- "Request received. Cross-referencing with mission protocols...",
279
- "Data processed. No anomalies detected in current operations.",
280
- "Command understood. Executing requested action sequence."
281
  ];
282
  response = responses[Math.floor(Math.random() * responses.length)];
283
  }
284
 
285
  addMessage('ai', response);
286
  }
287
- // Handle form submission
 
288
  chatForm.addEventListener('submit', async (e) => {
289
  e.preventDefault();
290
 
@@ -298,48 +283,42 @@
298
  // Get AI response
299
  await simulateAIResponse(message);
300
  });
301
- // Allow sending with Enter key
 
302
  userInput.addEventListener('keypress', (e) => {
303
  if (e.key === 'Enter' && !e.shiftKey) {
304
  e.preventDefault();
305
  chatForm.dispatchEvent(new Event('submit'));
306
  }
307
  });
308
- // Add click handler for settings button
 
309
  document.querySelector('.settings-btn').addEventListener('click', function() {
310
- alert('AI Assistant settings would open here in a full implementation.');
311
- });
312
-
313
- // Handle browser back/forward buttons
314
- window.addEventListener('popstate', function(event) {
315
- // Go back to previous page
316
- window.history.back();
317
  });
318
-
319
- // Add history entry for proper back navigation
320
- history.pushState(null, null, location.href);
321
- // Simulate periodic status updates
322
  setInterval(() => {
323
  if (isConnected && Math.random() > 0.7) {
324
  const statuses = [
325
- "Mission Control reports all systems nominal.",
326
- "Weather conditions remain stable across all sectors.",
327
- "All team members accounted for and reporting normal status.",
328
- "Communications network integrity at 98.7% efficiency.",
329
- "Power levels maintaining optimal charge across all units."
 
 
330
  ];
331
  const randomStatus = statuses[Math.floor(Math.random() * statuses.length)];
332
  addMessage('ai', `[SYSTEM UPDATE] ${randomStatus}`);
333
  }
334
  }, 30000);
335
-
336
- // Handle browser back/forward buttons
337
  window.addEventListener('popstate', function(event) {
338
- // Reload the page to ensure proper state restoration
339
  location.reload();
340
  });
341
 
342
- // Add history entry for proper back navigation
343
  history.pushState(null, null, location.href);
344
  </script>
345
  </body>
 
8
  <script src="https://unpkg.com/feather-icons"></script>
9
  <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
10
  <script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.net.min.js"></script>
11
+ <link rel="stylesheet" href="style.css">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  </head>
13
  <body class="bg-gray-900 text-gray-100">
14
  <div id="vanta-bg" class="fixed inset-0 z-0"></div>
15
+ <div class="relative z-10 min-h-screen p-4 md:p-6">
16
  <!-- Header -->
17
  <header class="bg-gray-800/80 backdrop-blur-md rounded-xl p-4 mb-6 border border-gray-700/50 shadow-lg">
18
  <div class="flex flex-col md:flex-row justify-between items-start md:items-center gap-4">
 
42
  <!-- Chat Header -->
43
  <div class="mb-4 pb-4 border-b border-gray-700">
44
  <h2 class="text-xl font-semibold flex items-center">
45
+ <i data-feather="cpu" class="w-5 h-5 mr-2 text-purple-400"></i>
46
  Dolphin-Mistral AI Assistant
47
  </h2>
48
  <p class="text-sm text-gray-400 mt-1">Ask anything related to operations, logistics, or emergency procedures</p>
 
51
  <!-- Messages Container -->
52
  <div id="chat-messages" class="flex-1 overflow-y-auto scrollbar-hide space-y-4 mb-4">
53
  <!-- Initial Message -->
54
+ <div class="message-ai p-4 max-w-[80%] animate-slide-in">
55
  <div class="flex items-start space-x-3">
56
  <div class="bg-purple-500 rounded-full p-2">
57
+ <i data-feather="cpu" class="w-4 h-4"></i>
58
  </div>
59
  <div>
60
  <p class="font-medium">AI Assistant</p>
 
68
  <div id="typing-indicator" class="message-ai p-4 max-w-[60%] hidden">
69
  <div class="flex items-start space-x-3">
70
  <div class="bg-purple-500 rounded-full p-2">
71
+ <i data-feather="cpu" class="w-4 h-4"></i>
72
  </div>
73
  <div class="typing-indicator flex space-x-1 pt-2">
74
  <span class="w-2 h-2 bg-gray-300 rounded-full"></span>
 
85
  type="text"
86
  id="user-input"
87
  placeholder="Type your message here..."
88
+ class="form-input flex-1"
89
  autocomplete="off"
90
  >
91
  <button
92
  type="submit"
93
+ class="btn-primary p-3"
94
  >
95
  <i data-feather="send" class="w-5 h-5"></i>
96
  </button>
 
100
  </div>
101
  </div>
102
  </div>
103
+ <script>
 
104
  // Initialize Vanta.js background
105
  VANTA.NET({
106
  el: "#vanta-bg",
 
156
  messageDiv.innerHTML = `
157
  <div class="flex items-start space-x-3">
158
  <div class="bg-purple-500 rounded-full p-2">
159
+ <i data-feather="cpu" class="w-4 h-4"></i>
160
  </div>
161
  <div>
162
  <p class="font-medium">AI Assistant</p>
163
+ <p>${content.replace(/\n/g, '<br>')}</p>
164
  </div>
165
  </div>
166
  `;
167
  }
 
168
  chatMessages.appendChild(messageDiv);
169
  feather.replace();
170
  chatMessages.scrollTop = chatMessages.scrollHeight;
171
  }
172
+
173
  // Connection status simulation
174
  let isConnected = true;
175
 
 
198
  }
199
  }, 15000);
200
 
201
+ // Enhanced AI Response System
202
  async function simulateAIResponse(userMessage) {
 
203
  if (!isConnected) {
204
  addMessage('ai', 'Unable to process request: No connection to Mission Control. Please check your communication systems.');
205
  return;
 
216
  // Hide typing indicator
217
  typingIndicator.classList.add('hidden');
218
 
219
+ // Enhanced response system with context awareness
220
  let response = "";
221
  const lowerMsg = userMessage.toLowerCase();
222
 
223
+ // Context-aware responses
224
  if (lowerMsg.includes("hello") || lowerMsg.includes("hi") || lowerMsg.includes("hey")) {
225
  const greetings = [
226
  "Greetings, operative. How can I assist with your mission today?",
 
228
  "Hi there! I'm monitoring all channels. What's your request?"
229
  ];
230
  response = greetings[Math.floor(Math.random() * greetings.length)];
231
+ }
232
+ else if (lowerMsg.includes("emergency") || lowerMsg.includes("help") || lowerMsg.includes("mayday")) {
233
+ response = "🚨 CRITICAL ALERT: Emergency protocols activated. Contacting Mission Control immediately on Channel 1. Please state your emergency clearly.";
234
+ }
235
+ else if (lowerMsg.includes("procedure") || lowerMsg.includes("protocol") || lowerMsg.includes("sop")) {
236
+ response = "📋 Accessing Standard Operating Procedures database...\n\nPlease specify which protocol you require:\n Emergency Evacuation\n• Medical Response\n• Security Breach\n Equipment Failure\n• Communication Protocol";
237
+ }
238
+ else if (lowerMsg.includes("location") || lowerMsg.includes("position") || lowerMsg.includes("where")) {
239
+ response = "🗺️ Integrating GPS tracking systems...\n\nLatest known positions:\n• John Smith: Sector 7 (40.74844°N, -73.98566°W)\n• Maria Garcia: Base Camp (40.74890°N, -73.98750°W)\n• Robert Johnson: Sector 3 (40.74780°N, -73.98620°W)\n\nLast update: 2 minutes ago";
240
+ }
241
+ else if (lowerMsg.includes("weather") || lowerMsg.includes("climate") || lowerMsg.includes("conditions")) {
242
+ response = "🌤️ Accessing meteorological data...\n\nCurrent Conditions:\n Visibility: Excellent (10km+)\n Temperature: 22°C (72°F)\n Wind: 5 km/h NE\n Atmospheric Pressure: Stable\n• Precipitation: None forecasted\n• UV Index: Moderate";
243
+ }
244
+ else if (lowerMsg.includes("status") || lowerMsg.includes("update") || lowerMsg.includes("report")) {
245
+ response = "📊 System Status Report:\n\n• Network: Online ✅\n• GPS: Active ✅\n• Signal Strength: Good 📶\n• Battery: 85% 🔋\n• Team Members: 3 Online 👥\n• FM Channels: All Operational 📻\n\nAll systems functioning within normal parameters.";
246
+ }
247
+ else if (lowerMsg.includes("channel") || lowerMsg.includes("frequency") || lowerMsg.includes("communication")) {
248
+ response = "📡 Communication Channels Status:\n\n• Channel 1 (Operations): Active 🔊\n• Channel 2 (Logistics): Active 🔊\n• Channel 3 (Medical): Active 🔊\n• Channel 4 (Security): Active 🔊\n• FM SOS: Standby 📻\n\nAll channels monitored and operational.";
249
+ }
250
+ else if (lowerMsg.includes("team") || lowerMsg.includes("personnel") || lowerMsg.includes("member")) {
251
+ response = "👥 Team Status Overview:\n\n• John Smith: Online (Sector 7) ✅\n• Maria Garcia: Online (Base Camp) ✅\n• Robert Johnson: Offline (Sector 3) ❌\n• Ahmed Benjelloun: On Duty (Security) 🛡️\n\nAll personnel accounted for.";
252
+ }
253
+ else if (lowerMsg.includes("security") || lowerMsg.includes("threat") || lowerMsg.includes("breach")) {
254
+ response = "🛡️ Security Status: All systems secure. No active threats detected. Monitoring perimeter continuously.";
255
+ }
256
+ else {
257
  const responses = [
258
+ "Acknowledged. Processing your request...",
259
+ "📝 Understood. I've logged this information in the system.",
260
+ "🔔 Confirmed. All team members notified.",
261
+ "🔍 Analyzing your query... Operational parameters remain stable.",
262
+ "📋 Request received. Cross-referencing with mission protocols...",
263
+ "⚙️ Data processed. No anomalies detected in current operations.",
264
+ "🎯 Command understood. Executing requested action sequence."
265
  ];
266
  response = responses[Math.floor(Math.random() * responses.length)];
267
  }
268
 
269
  addMessage('ai', response);
270
  }
271
+
272
+ // Enhanced form submission
273
  chatForm.addEventListener('submit', async (e) => {
274
  e.preventDefault();
275
 
 
283
  // Get AI response
284
  await simulateAIResponse(message);
285
  });
286
+
287
+ // Enhanced keyboard handling
288
  userInput.addEventListener('keypress', (e) => {
289
  if (e.key === 'Enter' && !e.shiftKey) {
290
  e.preventDefault();
291
  chatForm.dispatchEvent(new Event('submit'));
292
  }
293
  });
294
+
295
+ // Settings handler
296
  document.querySelector('.settings-btn').addEventListener('click', function() {
297
+ alert('🤖 AI Assistant Settings:\n\n• Response Speed: Normal\n• Context Awareness: Enabled\n• Mission Integration: Active\n• Emergency Detection: Enabled\n\nSettings would open in a full implementation.');
 
 
 
 
 
 
298
  });
299
+
300
+ // Periodic system updates
 
 
301
  setInterval(() => {
302
  if (isConnected && Math.random() > 0.7) {
303
  const statuses = [
304
+ "📡 Mission Control reports all systems nominal.",
305
+ "🌤️ Weather conditions remain stable across all sectors.",
306
+ "👥 All team members accounted for and reporting normal status.",
307
+ "🔌 Communications network integrity at 98.7% efficiency.",
308
+ "🔋 Power levels maintaining optimal charge across all units.",
309
+ "🛡️ Security perimeter secure, no anomalies detected.",
310
+ "📻 FM channels operating at optimal frequency."
311
  ];
312
  const randomStatus = statuses[Math.floor(Math.random() * statuses.length)];
313
  addMessage('ai', `[SYSTEM UPDATE] ${randomStatus}`);
314
  }
315
  }, 30000);
316
+
317
+ // Navigation history
318
  window.addEventListener('popstate', function(event) {
 
319
  location.reload();
320
  });
321
 
 
322
  history.pushState(null, null, location.href);
323
  </script>
324
  </body>
components/navbar.js CHANGED
@@ -126,7 +126,7 @@ class CustomNavbar extends HTMLElement {
126
  <span>ComSync Pro</span>
127
  </a>
128
  <div class="nav-links">
129
- <a href="/" class="nav-link">
130
  <i data-feather="map"></i>
131
  <span>Dashboard</span>
132
  </a>
@@ -146,10 +146,14 @@ class CustomNavbar extends HTMLElement {
146
  <i data-feather="radio"></i>
147
  <span>FM Dashboard</span>
148
  </a>
 
 
 
 
149
  </div>
150
  </div>
151
  </nav>
152
- `;
153
 
154
  // Add click handlers for navigation links
155
  const handleNavClick = (e) => {
 
126
  <span>ComSync Pro</span>
127
  </a>
128
  <div class="nav-links">
129
+ <a href="/" class="nav-link active">
130
  <i data-feather="map"></i>
131
  <span>Dashboard</span>
132
  </a>
 
146
  <i data-feather="radio"></i>
147
  <span>FM Dashboard</span>
148
  </a>
149
+ <a href="/security-dashboard.html" class="nav-link">
150
+ <i data-feather="shield"></i>
151
+ <span>Security</span>
152
+ </a>
153
  </div>
154
  </div>
155
  </nav>
156
+ `;
157
 
158
  // Add click handlers for navigation links
159
  const handleNavClick = (e) => {
style.css CHANGED
@@ -1,26 +1,383 @@
1
 
2
- /* Additional styles for the chat page */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  .message-user {
4
- background: linear-gradient(135deg, #3b82f6, #60a5fa);
5
- border-radius: 12px 12px 0 12px;
6
- align-self: flex-end;
 
7
  }
8
 
9
  .message-ai {
10
- background: rgba(55, 65, 81, 0.8);
11
- border-radius: 12px 12px 12px 0;
12
- align-self: flex-start;
 
13
  }
14
 
15
  .typing-indicator span {
16
- animation: typing 1.4s infinite ease-in-out;
17
  }
18
 
19
  .typing-indicator span:nth-child(1) { animation-delay: 0s; }
20
  .typing-indicator span:nth-child(2) { animation-delay: 0.2s; }
21
  .typing-indicator span:nth-child(3) { animation-delay: 0.4s; }
22
 
23
- @keyframes typing {
24
- 0%, 60%, 100% { transform: translateY(0); }
25
- 30% { transform: translateY(-5px); }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  }
 
1
 
2
+ /* ==========================================================================
3
+ ComSync Pro - Professional Styles
4
+ ========================================================================== */
5
+
6
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
7
+
8
+ /* Root Variables */
9
+ :root {
10
+ --primary-blue: #3b82f6;
11
+ --primary-purple: #8b5cf6;
12
+ --primary-green: #10b981;
13
+ --primary-red: #ef4444;
14
+ --primary-yellow: #f59e0b;
15
+ --gray-50: #f9fafb;
16
+ --gray-100: #f3f4f6;
17
+ --gray-200: #e5e7eb;
18
+ --gray-300: #d1d5db;
19
+ --gray-400: #9ca3af;
20
+ --gray-500: #6b7280;
21
+ --gray-600: #4b5563;
22
+ --gray-700: #374151;
23
+ --gray-800: #1f2937;
24
+ --gray-900: #111827;
25
+ }
26
+
27
+ /* Base Styles */
28
+ * {
29
+ box-sizing: border-box;
30
+ }
31
+
32
+ body {
33
+ font-family: 'Inter', sans-serif;
34
+ background: var(--gray-900);
35
+ color: var(--gray-100);
36
+ line-height: 1.6;
37
+ }
38
+
39
+ /* Animations */
40
+ @keyframes pulse {
41
+ 0%, 100% { opacity: 1; }
42
+ 50% { opacity: 0.5; }
43
+ }
44
+
45
+ @keyframes typing {
46
+ 0%, 60%, 100% { transform: translateY(0); }
47
+ 30% { transform: translateY(-5px); }
48
+ }
49
+
50
+ @keyframes slideIn {
51
+ from { opacity: 0; transform: translateY(20px); }
52
+ to { opacity: 1; transform: translateY(0); }
53
+ }
54
+
55
+ @keyframes fadeIn {
56
+ from { opacity: 0; }
57
+ to { opacity: 1; }
58
+ }
59
+
60
+ @keyframes bounce {
61
+ 0%, 20%, 53%, 80%, 100% { transform: translateY(0); }
62
+ 40%, 43% { transform: translateY(-10px); }
63
+ 70% { transform: translateY(-5px); }
64
+ 90% { transform: translateY(-2px); }
65
+ }
66
+
67
+ /* Utility Classes */
68
+ .animate-pulse { animation: pulse 1.5s cubic-bezier(0.4, 0, 0.6, 1) infinite; }
69
+ .animate-typing { animation: typing 1.4s infinite ease-in-out; }
70
+ .animate-slide-in { animation: slideIn 0.3s ease-out; }
71
+ .animate-fade-in { animation: fadeIn 0.5s ease-out; }
72
+ .animate-bounce { animation: bounce 1s; }
73
+
74
+ .scrollbar-hide::-webkit-scrollbar { display: none; }
75
+ .scrollbar-hide { -ms-overflow-style: none; scrollbar-width: none; }
76
+
77
+ /* Gradient Text */
78
+ .gradient-text-blue {
79
+ background: linear-gradient(135deg, var(--primary-blue), var(--primary-purple));
80
+ -webkit-background-clip: text;
81
+ -webkit-text-fill-color: transparent;
82
+ background-clip: text;
83
+ }
84
+
85
+ .gradient-text-purple {
86
+ background: linear-gradient(135deg, var(--primary-purple), var(--primary-blue));
87
+ -webkit-background-clip: text;
88
+ -webkit-text-fill-color: transparent;
89
+ background-clip: text;
90
+ }
91
+
92
+ /* Signal Bars */
93
+ .signal-bar {
94
+ width: 4px;
95
+ margin: 0 1px;
96
+ transition: all 0.3s ease;
97
+ }
98
+
99
+ /* Glass Effect */
100
+ .glass-effect {
101
+ background: rgba(31, 41, 55, 0.8);
102
+ backdrop-filter: blur(10px);
103
+ border: 1px solid rgba(75, 85, 99, 0.5);
104
+ }
105
+
106
+ /* Status Indicators */
107
+ .status-online { color: var(--primary-green); }
108
+ .status-offline { color: var(--primary-red); }
109
+ .status-warning { color: var(--primary-yellow); }
110
+ .status-info { color: var(--primary-blue); }
111
+
112
+ /* Button Styles */
113
+ .btn-primary {
114
+ background: var(--primary-blue);
115
+ color: white;
116
+ padding: 0.75rem 1.5rem;
117
+ border-radius: 0.5rem;
118
+ font-weight: 500;
119
+ transition: all 0.2s;
120
+ border: none;
121
+ cursor: pointer;
122
+ }
123
+
124
+ .btn-primary:hover {
125
+ background: #2563eb;
126
+ transform: translateY(-1px);
127
+ box-shadow: 0 4px 12px rgba(59, 130, 246, 0.4);
128
+ }
129
+
130
+ .btn-secondary {
131
+ background: var(--gray-700);
132
+ color: var(--gray-100);
133
+ padding: 0.75rem 1.5rem;
134
+ border-radius: 0.5rem;
135
+ font-weight: 500;
136
+ transition: all 0.2s;
137
+ border: 1px solid var(--gray-600);
138
+ cursor: pointer;
139
+ }
140
+
141
+ .btn-secondary:hover {
142
+ background: var(--gray-600);
143
+ transform: translateY(-1px);
144
+ }
145
+
146
+ .btn-danger {
147
+ background: var(--primary-red);
148
+ color: white;
149
+ padding: 0.75rem 1.5rem;
150
+ border-radius: 0.5rem;
151
+ font-weight: 500;
152
+ transition: all 0.2s;
153
+ border: none;
154
+ cursor: pointer;
155
+ }
156
+
157
+ .btn-danger:hover {
158
+ background: #dc2626;
159
+ transform: translateY(-1px);
160
+ }
161
+
162
+ /* Card Styles */
163
+ .card {
164
+ background: var(--glass-effect);
165
+ backdrop-filter: blur(10px);
166
+ border-radius: 0.75rem;
167
+ border: 1px solid rgba(75, 85, 99, 0.5);
168
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
169
+ transition: all 0.3s ease;
170
+ }
171
+
172
+ .card:hover {
173
+ transform: translateY(-2px);
174
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.2);
175
+ }
176
+
177
+ /* Form Styles */
178
+ .form-input {
179
+ width: 100%;
180
+ background: rgba(55, 65, 81, 0.5);
181
+ border: 1px solid var(--gray-600);
182
+ border-radius: 0.5rem;
183
+ padding: 0.75rem 1rem;
184
+ color: var(--gray-100);
185
+ transition: all 0.2s;
186
+ }
187
+
188
+ .form-input:focus {
189
+ outline: none;
190
+ border-color: var(--primary-blue);
191
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
192
+ }
193
+
194
+ .form-input::placeholder {
195
+ color: var(--gray-400);
196
+ }
197
+
198
+ /* Navigation */
199
+ .nav-link {
200
+ color: var(--gray-400);
201
+ text-decoration: none;
202
+ font-weight: 500;
203
+ transition: all 0.2s;
204
+ display: flex;
205
+ align-items: center;
206
+ gap: 0.5rem;
207
+ padding: 0.5rem 1rem;
208
+ border-radius: 0.5rem;
209
+ }
210
+
211
+ .nav-link:hover {
212
+ color: var(--gray-100);
213
+ background: rgba(55, 65, 81, 0.5);
214
+ }
215
+
216
+ .nav-link.active {
217
+ color: var(--primary-blue);
218
+ background: rgba(59, 130, 246, 0.1);
219
+ }
220
+
221
+ .nav-link.active i {
222
+ color: var(--primary-blue);
223
+ }
224
+
225
+ /* Chat Styles */
226
  .message-user {
227
+ background: linear-gradient(135deg, var(--primary-blue), var(--primary-purple));
228
+ border-radius: 12px 12px 0 12px;
229
+ align-self: flex-end;
230
+ animation: slideIn 0.3s ease-out;
231
  }
232
 
233
  .message-ai {
234
+ background: rgba(55, 65, 81, 0.8);
235
+ border-radius: 12px 12px 12px 0;
236
+ align-self: flex-start;
237
+ animation: slideIn 0.3s ease-out;
238
  }
239
 
240
  .typing-indicator span {
241
+ animation: typing 1.4s infinite ease-in-out;
242
  }
243
 
244
  .typing-indicator span:nth-child(1) { animation-delay: 0s; }
245
  .typing-indicator span:nth-child(2) { animation-delay: 0.2s; }
246
  .typing-indicator span:nth-child(3) { animation-delay: 0.4s; }
247
 
248
+ /* Loading States */
249
+ .loading-spinner {
250
+ border: 2px solid var(--gray-600);
251
+ border-top: 2px solid var(--primary-blue);
252
+ border-radius: 50%;
253
+ width: 20px;
254
+ height: 20px;
255
+ animation: spin 1s linear infinite;
256
+ }
257
+
258
+ @keyframes spin {
259
+ 0% { transform: rotate(0deg); }
260
+ 100% { transform: rotate(360deg); }
261
+ }
262
+
263
+ /* Responsive Design */
264
+ @media (max-width: 768px) {
265
+ .grid-responsive {
266
+ grid-template-columns: 1fr;
267
+ }
268
+
269
+ .nav-container {
270
+ flex-direction: column;
271
+ gap: 1rem;
272
+ }
273
+
274
+ .nav-links {
275
+ flex-wrap: wrap;
276
+ justify-content: center;
277
+ }
278
+
279
+ .card {
280
+ margin-bottom: 1rem;
281
+ }
282
+ }
283
+
284
+ /* Security Styles */
285
+ .security-level-critical { color: var(--primary-red); }
286
+ .security-level-high { color: var(--primary-yellow); }
287
+ .security-level-medium { color: var(--primary-blue); }
288
+ .security-level-low { color: var(--primary-green); }
289
+ .security-level-info { color: var(--gray-500); }
290
+
291
+ /* FM Status Styles */
292
+ .fm-available { color: var(--primary-green); }
293
+ .fm-listening { color: var(--primary-yellow); }
294
+ .fm-unavailable { color: var(--primary-red); }
295
+
296
+ /* Bluetooth Status Styles */
297
+ .bluetooth-connected { color: var(--primary-green); }
298
+ .bluetooth-connecting { color: var(--primary-yellow); }
299
+ .bluetooth-disconnected { color: var(--primary-red); }
300
+ .bluetooth-available { color: var(--primary-blue); }
301
+
302
+ /* Walkie Talkie Styles */
303
+ .walkie-card {
304
+ transition: all 0.3s ease;
305
+ }
306
+
307
+ .walkie-card:hover {
308
+ transform: translateY(-2px);
309
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.3);
310
+ }
311
+
312
+ .bluetooth-wave {
313
+ position: relative;
314
+ overflow: hidden;
315
+ }
316
+
317
+ .bluetooth-wave::before {
318
+ content: '';
319
+ position: absolute;
320
+ top: 50%;
321
+ left: 50%;
322
+ width: 100%;
323
+ height: 100%;
324
+ background: radial-gradient(circle, rgba(59, 130, 246, 0.3) 0%, transparent 70%);
325
+ border-radius: 50%;
326
+ transform: translate(-50%, -50%);
327
+ animation: bluetoothPulse 2s infinite;
328
+ }
329
+
330
+ @keyframes bluetoothPulse {
331
+ 0% {
332
+ width: 0%;
333
+ height: 0%;
334
+ opacity: 1;
335
+ }
336
+ 100% {
337
+ width: 100%;
338
+ height: 100%;
339
+ opacity: 0;
340
+ }
341
+ }
342
+
343
+ /* AI Insight Cards */
344
+ .ai-insight-card {
345
+ background: rgba(139, 92, 246, 0.1);
346
+ border: 1px solid rgba(139, 92, 246, 0.3);
347
+ }
348
+
349
+ .prediction-badge {
350
+ background: rgba(16, 185, 129, 0.1);
351
+ border: 1px solid rgba(16, 185, 129, 0.3);
352
+ }
353
+
354
+ .anomaly-badge {
355
+ background: rgba(239, 68, 68, 0.1);
356
+ border: 1px solid rgba(239, 68, 68, 0.3);
357
+ }
358
+
359
+ /* Map Gradient */
360
+ .gradient-map {
361
+ background: linear-gradient(135deg, #e0f7fa 0%, #b2ebf2 50%, #80deea 100%);
362
+ }
363
+
364
+ /* Professional Shadows */
365
+ .shadow-professional {
366
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1), 0 4px 6px rgba(0, 0, 0, 0.05);
367
+ }
368
+
369
+ .shadow-professional-hover:hover {
370
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15), 0 8px 16px rgba(0, 0, 0, 0.1);
371
+ }
372
+
373
+ /* Print Styles */
374
+ @media print {
375
+ .no-print {
376
+ display: none !important;
377
+ }
378
+
379
+ body {
380
+ background: white !important;
381
+ color: black !important;
382
+ }
383
  }