secutorpro commited on
Commit
2599308
·
verified ·
1 Parent(s): 138c40b

import React, { useState, useEffect, useRef } from 'react';

Browse files

import { Wifi, Battery, Volume2, Mic, Users, MapPin, Clock, AlertTriangle, CheckCircle, Radio, Search, Video, Phone, Camera, Monitor, RefreshCw, Settings } from 'lucide-react';

const App = () => {
const [activeChannel, setActiveChannel] = useState('Channel 1');
const [isTransmitting, setIsTransmitting] = useState(false);
const [batteryLevel, setBatteryLevel] = useState(85);
const [signalStrength, setSignalStrength] = useState(4);
const [currentTime, setCurrentTime] = useState(new Date());
const [searchTerm, setSearchTerm] = useState('');
const [selectedUser, setSelectedUser] = useState(null);
const [videoCallActive, setVideoCallActive] = useState(false);
const [callDuration, setCallDuration] = useState(0);
const [mapLoaded, setMapLoaded] = useState(false);
const [crmData, setCrmData] = useState([]);
const [crmSyncStatus, setCrmSyncStatus] = useState('connected');
const [syncProgress, setSyncProgress] = useState(100);
const [apiEndpoint, setApiEndpoint] = useState('https://api.company-crm.com/v1');
const [apiKey, setApiKey] = useState('sk_live_xxxxxxxxxxxxxxxx');
const [showSettings, setShowSettings] = useState(false);
const syncIntervalRef = useRef(null);

// Mock data for channels
const channels = [
{ id: 'Channel 1', name: 'Operations', users: 12, active: true },
{ id: 'Channel 2', name: 'Logistics', users: 8, active: false },
{ id: 'Channel 3', name: 'Medical', users: 5, active: false },
{ id: 'Channel 4', name: 'Security', users: 15, active: true },
{ id: 'Channel 5', name: 'Command', users: 3, active: false },
];

// Mock data for recent communications
const recentCommunications = [
{ id: 1, user: 'Team Alpha', message: 'Moving to sector 7', time: '14:32', channel: 'Channel 1', lat: 40.7128, lng: -74.0060 },
{ id: 2, user: 'Medical Team', message: 'Patient status stable', time: '14:28', channel: 'Channel 3', lat: 40.7589, lng: -73.9851 },
{ id: 3, user: 'Logistics', message: 'Supplies delivered', time: '14:25', channel: 'Channel 2', lat: 40.7505, lng: -73.9934 },
{ id: 4, user: 'Security Lead', message: 'Perimeter secure', time: '14:20', channel: 'Channel 4', lat: 40.7282, lng: -74.0776 },
];

// Mock data for team members with locations
const teamMembers = [
{ id: 1, name: 'John Smith', status: 'online', location: 'Sector 7', battery: 92, lat: 40.7128, lng: -74.0060, lastSeen: '2 min ago', videoCapable: true, crmId: 'CRM001' },
{ id: 2, name: 'Maria Garcia', status: 'online', location: 'Base Camp', battery: 78, lat: 40.7589, lng: -73.9851, lastSeen: '5 min ago', videoCapable: true, crmId: 'CRM002' },
{ id: 3, name: 'Robert Johnson', status: 'offline', location: 'Sector 3', battery: 45, lat: 40.7505, lng: -73.9934, lastSeen: '15 min ago', videoCapable: false, crmId: 'CRM003' },
{ id: 4, name: 'Sarah Wilson', status: 'online', location: 'Medical Bay', battery: 88, lat: 40.7282, lng: -74.0776, lastSeen: '1 min ago', videoCapable: true, crmId: 'CRM004' },
{ id: 5, name: 'David Brown', status: 'online', location: 'Perimeter', battery: 67, lat: 40.7831, lng: -73.9712, lastSeen: '3 min ago', videoCapable: true, crmId: 'CRM005' },
];

// CRM API Simulation
const crmApi = {
// Simulate fetching data from CRM
fetchTeamData: async () => {
return new Promise((resolve) => {
setTimeout(() => {
resolve({
success: true,
data: [
{ id: 'CRM001', name: 'John Smith', role: 'Field Operator', department: 'Operations', contact: '+1-555-0101', email: '[email protected]' },
{ id: 'CRM002', name: 'Maria Garcia', role: 'Logistics Coordinator', department: 'Logistics', contact: '+1-555-0102', email: '[email protected]' },
{ id: 'CRM003', name: 'Robert Johnson', role: 'Maintenance Technician', department: 'Support', contact: '+1-555-0103', email: '[email protected]' },
{ id: 'CRM004', name: 'Sarah Wilson', role: 'Medical Officer', department: 'Medical', contact: '+1-555-0104', email: '[email protected]' },
{ id: 'CRM005', name: 'David Brown', role: 'Security Lead', department: 'Security', contact: '+1-555-0105', email: '[email protected]' }
]
});
}, 1500);
});
},

// Simulate syncing data to CRM
syncCommunication: async (data) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve({
success: true,
messageId: `MSG${Date.now()}`,
timestamp: new Date().toISOString()
});
}, 1000);
});
},

// Simulate updating user status
updateUserStatus: async (userId, status) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve({
success: true,
updated: true
});
}, 800);
});
}
};

// Initialize CRM data
useEffect(() => {
const initializeCrmData = async () => {
try {
setCrmSyncStatus('syncing');
setSyncProgress(0);

// Simulate progress
const progressInterval = setInterval(() => {
setSyncProgress(prev => Math.min(prev + 10, 90));
}, 150);

const response = await crmApi.fetchTeamData();
clearInterval(progressInterval);
setSyncProgress(100);

if (response.success) {
setCrmData(response.data);
setCrmSyncStatus('connected');
} else {
setCrmSyncStatus('error');
}
} catch (error) {
setCrmSyncStatus('error');
}
};

initializeCrmData();
}, []);

// Auto-sync every 30 seconds
useEffect(() => {
syncIntervalRef.current = setInterval(async () => {
if (crmSyncStatus === 'connected') {
setCrmSyncStatus('syncing');
setSyncProgress(0);

const progressInterval = setInterval(() => {
setSyncProgress(prev => Math.min(prev + 5, 95));
}, 200);

try {
await crmApi.fetchTeamData();
clearInterval(progressInterval);
setSyncProgress(100);
setTimeout(() => setCrmSyncStatus('connected'), 500);
} catch (error) {
clearInterval(progressInterval);
setCrmSyncStatus('error');
}
}
}, 30000);

return () => clearInterval(syncIntervalRef.current);
}, [crmSyncStatus]);

// Update time every second
useEffect(() => {
const timer = setInterval(() => {
setCurrentTime(new Date());
}, 1000);
return () => clearInterval(timer);
}, []);

// Simulate battery drain
useEffect(() => {
const batteryDrain = setInterval(() => {
setBatteryLevel(prev => Math.max(0, prev - 0.1));
}, 30000);
return () => clearInterval(batteryDrain);
}, []);

// Call duration timer
useEffect(() => {
let callTimer;
if (videoCallActive) {
callTimer = setInterval(() => {
setCallDuration(prev => prev + 1);
}, 1000);
}
return () => {
if (callTimer) clearInterval(callTimer);
};
}, [videoCallActive]);

const handleTransmit = () => {
setIsTransmitting(true);
// Simulate sending communication to CRM
crmApi.syncCommunication({
message: 'Test transmission',
timestamp: new Date().toISOString(),
channelId: activeChannel,
userId: selectedUser?.crmId || 'SYSTEM'
});
setTimeout(() => setIsTransmitting(false), 2000);
};

const startVideoCall = (user) => {
setSelectedUser(user);
setVideoCallActive(true);
setCallDuration(0);
};

const endVideoCall = () => {
setVideoCallActive(false);
setCallDuration(0);
};

const manualSync = async () => {
setCrmSyncStatus('syncing');
setSyncProgress(0);

const progressInterval = setInterval(() => {
setSyncProgress(prev => Math.min(prev + 15, 90));
}, 100);

try {
const response = await crmApi.fetchTeamData();
clearInterval(progressInterval);
setSyncProgress(100);

if (response.success) {
setCrmData(response.data);
setCrmSyncStatus('connected');
setTimeout(() => setSyncProgress(100), 1000);
} else {
setCrmSyncStatus('error');
}
} catch (error) {
clearInterval(progressInterval);
setCrmSyncStatus('error');
}
};

const getSignalBars = (strength) => {
return Array.from({ length: 5 }, (_, i) => (
<div
key={i}
className={`w-1 h-${i + 1} mx-0.5 ${
i < strength ? 'bg-green-500' : 'bg-gray-300'
}`}
/>
));
};

const formatCallDuration = (seconds) => {
const mins = Math.floor(seconds / 60);
const secs = seconds % 60;
return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
};

// Filter team members based on search term
const filteredTeamMembers = teamMembers.filter(member =>
member.name.toLowerCase().includes(searchTerm.toLowerCase()) ||
member.location.toLowerCase().includes(searchTerm.toLowerCase())
);

// Get CRM data for a user
const getUserCrmData = (userId) => {
return crmData.find(user => user.id === userId);
};

// Google Maps component simulation
const GoogleMapComponent = () => {
const [mapCenter, setMapCenter] = useState({ lat: 40.7128, lng: -74.0060 });

useEffect(() => {
// Simulate map loading
const timer = setTimeout(() => {
setMapLoaded(true);
}, 1000);
return () => clearTimeout(timer);
}, []);

const handleMarkerClick = (member) => {
setSelectedUser(member);
setMapCenter({ lat: member.lat, lng: member.lng });
};

if (!mapLoaded) {
return (
<div className="w-full h-96 bg-gray-700 rounded-lg flex items-center justify-center">
<div className="text-center">
<div className="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-500 mx-auto mb-4"></div>
<p>Loading Google Maps...</p>
</div>
</div>
);
}

return (
<div className="relati

Files changed (2) hide show
  1. README.md +7 -4
  2. index.html +449 -18
README.md CHANGED
@@ -1,10 +1,13 @@
1
  ---
2
- title: Comsync Pro Team Connect Hub
3
- emoji: 🐠
4
- colorFrom: purple
5
  colorTo: yellow
 
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: ComSync Pro - Team Connect Hub 📻
3
+ colorFrom: yellow
 
4
  colorTo: yellow
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,450 @@
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>ComSync Pro - Team Communication Dashboard</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
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
+ .gradient-map {
17
+ background: linear-gradient(135deg, #e0f7fa 0%, #b2ebf2 50%, #80deea 100%);
18
+ }
19
+ .signal-bar {
20
+ width: 4px;
21
+ margin: 0 1px;
22
+ }
23
+ .animate-pulse {
24
+ animation: pulse 1.5s cubic-bezier(0.4, 0, 0.6, 1) infinite;
25
+ }
26
+ @keyframes pulse {
27
+ 0%, 100% { opacity: 1; }
28
+ 50% { opacity: 0.5; }
29
+ }
30
+ .scrollbar-hide::-webkit-scrollbar {
31
+ display: none;
32
+ }
33
+ </style>
34
+ </head>
35
+ <body class="bg-gray-900 text-gray-100">
36
+ <div id="vanta-bg" class="fixed inset-0 z-0"></div>
37
+ <div class="relative z-10 min-h-screen p-4 md:p-6">
38
+ <!-- Header -->
39
+ <header class="bg-gray-800/80 backdrop-blur-md rounded-xl p-4 mb-6 border border-gray-700/50 shadow-lg">
40
+ <div class="flex flex-col md:flex-row justify-between items-start md:items-center gap-4">
41
+ <div class="flex items-center space-x-3">
42
+ <i data-feather="radio" class="w-8 h-8 text-blue-400"></i>
43
+ <h1 class="text-2xl font-bold bg-gradient-to-r from-blue-400 to-green-400 bg-clip-text text-transparent">ComSync Pro</h1>
44
+ </div>
45
+ <div class="flex flex-wrap items-center gap-4">
46
+ <div class="status-pill flex items-center px-3 py-1 rounded-full text-sm bg-green-900/30 text-green-400">
47
+ <i data-feather="check-circle" class="w-4 h-4 mr-1"></i>
48
+ CRM: Connected
49
+ </div>
50
+ <div class="flex items-center space-x-1">
51
+ <i data-feather="wifi" class="w-5 h-5 text-green-400"></i>
52
+ <div class="flex h-4">
53
+ <div class="signal-bar h-1 bg-green-500"></div>
54
+ <div class="signal-bar h-2 bg-green-500"></div>
55
+ <div class="signal-bar h-3 bg-green-500"></div>
56
+ <div class="signal-bar h-4 bg-green-500"></div>
57
+ <div class="signal-bar h-4 bg-gray-600"></div>
58
+ </div>
59
+ </div>
60
+ <div class="flex items-center space-x-1">
61
+ <i data-feather="battery" class="w-5 h-5 text-green-400"></i>
62
+ <span class="text-sm">85%</span>
63
+ </div>
64
+ <div class="flex items-center space-x-1">
65
+ <i data-feather="clock" class="w-5 h-5"></i>
66
+ <span class="text-sm" id="current-time">14:45:32</span>
67
+ </div>
68
+ <button class="p-2 bg-gray-700/50 hover:bg-gray-600/50 rounded-lg transition-all">
69
+ <i data-feather="settings" class="w-5 h-5"></i>
70
+ </button>
71
+ </div>
72
+ </div>
73
+ </header>
74
+
75
+ <!-- Main Content -->
76
+ <div class="grid grid-cols-1 lg:grid-cols-4 gap-6">
77
+ <!-- Left Sidebar - Channels & Team -->
78
+ <div class="lg:col-span-1 space-y-6">
79
+ <!-- Channels Panel -->
80
+ <div class="bg-gray-800/80 backdrop-blur-md rounded-xl p-5 border border-gray-700/50 shadow-lg">
81
+ <div class="flex items-center justify-between mb-4">
82
+ <h2 class="text-lg font-semibold flex items-center">
83
+ <i data-feather="volume-2" class="w-5 h-5 mr-2 text-blue-400"></i>
84
+ Channels
85
+ </h2>
86
+ <span class="text-xs bg-blue-900/30 text-blue-400 px-2 py-1 rounded-full">12 Active</span>
87
+ </div>
88
+ <div class="space-y-2">
89
+ <div class="channel-card bg-blue-600/20 border-l-4 border-blue-400 p-3 rounded-lg cursor-pointer transition-all hover:bg-blue-600/30">
90
+ <div class="flex justify-between items-center">
91
+ <div>
92
+ <h3 class="font-medium">Channel 1</h3>
93
+ <p class="text-sm text-blue-200">Operations</p>
94
+ </div>
95
+ <div class="flex items-center space-x-1">
96
+ <i data-feather="users" class="w-4 h-4"></i>
97
+ <span class="text-xs">12</span>
98
+ </div>
99
+ </div>
100
+ </div>
101
+ <div class="channel-card bg-gray-700/50 hover:bg-gray-600/50 p-3 rounded-lg cursor-pointer transition-all">
102
+ <div class="flex justify-between items-center">
103
+ <div>
104
+ <h3 class="font-medium">Channel 2</h3>
105
+ <p class="text-sm text-gray-300">Logistics</p>
106
+ </div>
107
+ <div class="flex items-center space-x-1">
108
+ <i data-feather="users" class="w-4 h-4"></i>
109
+ <span class="text-xs">8</span>
110
+ </div>
111
+ </div>
112
+ </div>
113
+ <div class="channel-card bg-gray-700/50 hover:bg-gray-600/50 p-3 rounded-lg cursor-pointer transition-all">
114
+ <div class="flex justify-between items-center">
115
+ <div>
116
+ <h3 class="font-medium">Channel 3</h3>
117
+ <p class="text-sm text-gray-300">Medical</p>
118
+ </div>
119
+ <div class="flex items-center space-x-1">
120
+ <i data-feather="users" class="w-4 h-4"></i>
121
+ <span class="text-xs">5</span>
122
+ </div>
123
+ </div>
124
+ </div>
125
+ <div class="channel-card bg-gray-700/50 hover:bg-gray-600/50 p-3 rounded-lg cursor-pointer transition-all">
126
+ <div class="flex justify-between items-center">
127
+ <div>
128
+ <h3 class="font-medium">Channel 4</h3>
129
+ <p class="text-sm text-gray-300">Security</p>
130
+ </div>
131
+ <div class="flex items-center space-x-1">
132
+ <i data-feather="users" class="w-4 h-4"></i>
133
+ <span class="text-xs">15</span>
134
+ </div>
135
+ </div>
136
+ </div>
137
+ </div>
138
+ </div>
139
+
140
+ <!-- Team Status Panel -->
141
+ <div class="bg-gray-800/80 backdrop-blur-md rounded-xl p-5 border border-gray-700/50 shadow-lg">
142
+ <div class="flex items-center justify-between mb-4">
143
+ <h2 class="text-lg font-semibold flex items-center">
144
+ <i data-feather="users" class="w-5 h-5 mr-2 text-green-400"></i>
145
+ Team Status
146
+ </h2>
147
+ <span class="text-xs bg-green-900/30 text-green-400 px-2 py-1 rounded-full">4 Online</span>
148
+ </div>
149
+
150
+ <!-- Search -->
151
+ <div class="relative mb-4">
152
+ <i data-feather="search" class="absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-gray-400"></i>
153
+ <input type="text" placeholder="Search team..." class="w-full pl-10 pr-4 py-2 bg-gray-700/50 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 text-sm">
154
+ </div>
155
+
156
+ <!-- Team List -->
157
+ <div class="space-y-3 max-h-[420px] overflow-y-auto scrollbar-hide">
158
+ <div class="team-member bg-blue-900/20 p-3 rounded-lg flex items-center justify-between">
159
+ <div class="flex items-center space-x-3">
160
+ <div class="w-2 h-2 rounded-full bg-green-500 animate-pulse"></div>
161
+ <div>
162
+ <p class="font-medium text-sm">John Smith</p>
163
+ <div class="flex items-center text-xs text-gray-400">
164
+ <i data-feather="map-pin" class="w-3 h-3 mr-1"></i>
165
+ <span>Sector 7</span>
166
+ </div>
167
+ <div class="text-xs text-gray-500">Field Operator • Operations</div>
168
+ </div>
169
+ </div>
170
+ <div class="flex items-center space-x-2">
171
+ <button class="p-1.5 bg-blue-600 rounded hover:bg-blue-700 transition-colors">
172
+ <i data-feather="video" class="w-3 h-3"></i>
173
+ </button>
174
+ <div class="flex items-center">
175
+ <i data-feather="battery" class="w-3 h-3 mr-1"></i>
176
+ <span class="text-xs">92%</span>
177
+ </div>
178
+ </div>
179
+ </div>
180
+
181
+ <div class="team-member bg-gray-700/50 hover:bg-gray-600/50 p-3 rounded-lg flex items-center justify-between cursor-pointer transition-all">
182
+ <div class="flex items-center space-x-3">
183
+ <div class="w-2 h-2 rounded-full bg-green-500"></div>
184
+ <div>
185
+ <p class="font-medium text-sm">Maria Garcia</p>
186
+ <div class="flex items-center text-xs text-gray-400">
187
+ <i data-feather="map-pin" class="w-3 h-3 mr-1"></i>
188
+ <span>Base Camp</span>
189
+ </div>
190
+ <div class="text-xs text-gray-500">Logistics Coordinator • Logistics</div>
191
+ </div>
192
+ </div>
193
+ <div class="flex items-center space-x-2">
194
+ <button class="p-1.5 bg-blue-600 rounded hover:bg-blue-700 transition-colors">
195
+ <i data-feather="video" class="w-3 h-3"></i>
196
+ </button>
197
+ <div class="flex items-center">
198
+ <i data-feather="battery" class="w-3 h-3 mr-1"></i>
199
+ <span class="text-xs">78%</span>
200
+ </div>
201
+ </div>
202
+ </div>
203
+
204
+ <div class="team-member bg-gray-700/50 hover:bg-gray-600/50 p-3 rounded-lg flex items-center justify-between cursor-pointer transition-all">
205
+ <div class="flex items-center space-x-3">
206
+ <div class="w-2 h-2 rounded-full bg-red-500"></div>
207
+ <div>
208
+ <p class="font-medium text-sm">Robert Johnson</p>
209
+ <div class="flex items-center text-xs text-gray-400">
210
+ <i data-feather="map-pin" class="w-3 h-3 mr-1"></i>
211
+ <span>Sector 3</span>
212
+ </div>
213
+ <div class="text-xs text-gray-500">Maintenance Tech • Support</div>
214
+ </div>
215
+ </div>
216
+ <div class="flex items-center space-x-2">
217
+ <div class="flex items-center">
218
+ <i data-feather="battery" class="w-3 h-3 mr-1"></i>
219
+ <span class="text-xs">45%</span>
220
+ </div>
221
+ </div>
222
+ </div>
223
+ </div>
224
+ </div>
225
+ </div>
226
+
227
+ <!-- Main Content Area -->
228
+ <div class="lg:col-span-3 space-y-6">
229
+ <!-- Map Section -->
230
+ <div class="bg-gray-800/80 backdrop-blur-md rounded-xl p-5 border border-gray-700/50 shadow-lg">
231
+ <div class="flex flex-col md:flex-row justify-between items-start md:items-center mb-4 gap-3">
232
+ <h2 class="text-lg font-semibold flex items-center">
233
+ <i data-feather="map-pin" class="w-5 h-5 mr-2 text-green-400"></i>
234
+ Live Location Tracking
235
+ </h2>
236
+ <div class="flex items-center space-x-3">
237
+ <div class="text-sm bg-blue-900/30 px-3 py-1 rounded-full flex items-center">
238
+ <i data-feather="monitor" class="w-4 h-4 mr-1"></i>
239
+ Selected: John Smith
240
+ </div>
241
+ <button class="p-2 bg-gray-700/50 hover:bg-gray-600/50 rounded-lg transition-all">
242
+ <i data-feather="refresh-cw" class="w-4 h-4"></i>
243
+ </button>
244
+ </div>
245
+ </div>
246
+
247
+ <!-- Map Container -->
248
+ <div class="relative w-full h-96 bg-gradient-to-br from-blue-50 to-green-50 rounded-lg overflow-hidden border-2 border-gray-600/30">
249
+ <!-- Map placeholder with interactive elements -->
250
+ <div class="absolute inset-0 grid grid-cols-20 grid-rows-20 opacity-10">
251
+ <!-- Grid lines -->
252
+ <template x-for="i in 20">
253
+ <div class="border-t border-gray-400 col-span-full" :style="`grid-row: ${i}`"></div>
254
+ <div class="border-l border-gray-400 row-span-full" :style="`grid-column: ${i}`"></div>
255
+ </template>
256
+ </div>
257
+
258
+ <!-- Roads -->
259
+ <div class="absolute top-1/4 left-0 right-0 h-2 bg-gray-600/30"></div>
260
+ <div class="absolute top-1/2 left-0 right-0 h-2 bg-gray-600/30"></div>
261
+ <div class="absolute left-1/4 top-0 bottom-0 w-2 bg-gray-600/30"></div>
262
+ <div class="absolute left-1/2 top-0 bottom-0 w-2 bg-gray-600/30"></div>
263
+
264
+ <!-- Team Markers -->
265
+ <div class="absolute w-6 h-6 rounded-full bg-green-500 ring-2 ring-green-300 cursor-pointer" style="top: 30%; left: 20%;" onclick="selectMember('John Smith')">
266
+ <div class="absolute -top-7 left-1/2 transform -translate-x-1/2 bg-black/75 text-white text-xs px-2 py-1 rounded whitespace-nowrap opacity-0 hover:opacity-100 transition-opacity">
267
+ John Smith
268
+ </div>
269
+ </div>
270
+ <div class="absolute w-6 h-6 rounded-full bg-green-500 ring-2 ring-green-300 cursor-pointer" style="top: 45%; left: 35%;" onclick="selectMember('Maria Garcia')">
271
+ <div class="absolute -top-7 left-1/2 transform -translate-x-1/2 bg-black/75 text-white text-xs px-2 py-1 rounded whitespace-nowrap opacity-0 hover:opacity-100 transition-opacity">
272
+ Maria Garcia
273
+ </div>
274
+ </div>
275
+ <div class="absolute w-6 h-6 rounded-full bg-red-500 ring-2 ring-red-300 cursor-pointer" style="top: 60%; left: 25%;" onclick="selectMember('Robert Johnson')">
276
+ <div class="absolute -top-7 left-1/2 transform -translate-x-1/2 bg-black/75 text-white text-xs px-2 py-1 rounded whitespace-nowrap opacity-0 hover:opacity-100 transition-opacity">
277
+ Robert Johnson
278
+ </div>
279
+ </div>
280
+
281
+ <!-- Map Controls -->
282
+ <div class="absolute top-4 right-4 bg-white/90 rounded-lg p-2 shadow-lg">
283
+ <div class="flex flex-col space-y-2">
284
+ <button class="w-8 h-8 bg-gray-200 rounded flex items-center justify-center hover:bg-gray-300">
285
+ <i data-feather="plus" class="w-4 h-4 text-gray-700"></i>
286
+ </button>
287
+ <button class="w-8 h-8 bg-gray-200 rounded flex items-center justify-center hover:bg-gray-300">
288
+ <i data-feather="minus" class="w-4 h-4 text-gray-700"></i>
289
+ </button>
290
+ </div>
291
+ </div>
292
+ </div>
293
+
294
+ <!-- Selected Member Details -->
295
+ <div class="mt-4 p-4 bg-gray-700/50 rounded-lg">
296
+ <div class="flex flex-col md:flex-row justify-between items-start md:items-center gap-4">
297
+ <div>
298
+ <h3 class="font-semibold text-lg">John Smith</h3>
299
+ <div class="flex items-center text-sm text-gray-300 mt-1">
300
+ <i data-feather="map-pin" class="w-4 h-4 mr-1"></i>
301
+ <span>40.7128° N, 74.0060° W</span>
302
+ </div>
303
+ <div class="text-sm text-gray-400 mt-1">
304
+ Last seen: 2 minutes ago
305
+ </div>
306
+ <div class="text-sm text-gray-300 mt-1">
307
+ Role: Field Operator • Dept: Operations
308
+ </div>
309
+ </div>
310
+ <div class="flex flex-col items-end gap-2">
311
+ <div class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-green-900/30 text-green-400">
312
+ Online
313
+ </div>
314
+ <div class="flex space-x-3">
315
+ <button class="flex items-center px-3 py-1.5 rounded text-sm bg-blue-600 hover:bg-blue-700">
316
+ <i data-feather="video" class="w-4 h-4 mr-1"></i>
317
+ Video Call
318
+ </button>
319
+ <div class="text-sm flex items-center">
320
+ <i data-feather="battery" class="w-4 h-4 mr-1"></i>
321
+ 92%
322
+ </div>
323
+ </div>
324
+ </div>
325
+ </div>
326
+ </div>
327
+ </div>
328
+
329
+ <!-- Communication Panel -->
330
+ <div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
331
+ <!-- Transmit Panel -->
332
+ <div class="bg-gray-800/80 backdrop-blur-md rounded-xl p-5 border border-gray-700/50 shadow-lg">
333
+ <div class="flex justify-between items-center mb-4">
334
+ <h2 class="text-lg font-semibold">Channel 1 - Operations</h2>
335
+ <div class="flex items-center space-x-2">
336
+ <div class="w-2 h-2 rounded-full bg-green-500"></div>
337
+ <span class="text-xs">READY</span>
338
+ </div>
339
+ </div>
340
+
341
+ <!-- Transmit Button -->
342
+ <div class="flex justify-center my-6">
343
+ <button class="w-24 h-24 rounded-full bg-blue-600 hover:bg-blue-500 hover:scale-105 transition-all flex items-center justify-center shadow-lg">
344
+ <i data-feather="mic" class="w-10 h-10 text-white"></i>
345
+ </button>
346
+ </div>
347
+
348
+ <p class="text-center text-gray-400 text-sm">Press and hold to transmit</p>
349
+ </div>
350
+
351
+ <!-- Recent Comms -->
352
+ <div class="bg-gray-800/80 backdrop-blur-md rounded-xl p-5 border border-gray-700/50 shadow-lg">
353
+ <h2 class="text-lg font-semibold mb-4">Recent Communications</h2>
354
+ <div class="space-y-3 max-h-72 overflow-y-auto scrollbar-hide">
355
+ <div class="bg-gray-700/50 p-3 rounded-lg">
356
+ <div class="flex justify-between items-start mb-2">
357
+ <div class="flex items-center space-x-2">
358
+ <span class="font-medium text-blue-400">Team Alpha</span>
359
+ <span class="text-xs bg-gray-600/50 px-2 py-1 rounded">Channel 1</span>
360
+ </div>
361
+ <span class="text-xs text-gray-400">14:32</span>
362
+ </div>
363
+ <p class="text-gray-200 mb-2">Moving to sector 7</p>
364
+ <div class="flex items-center text-xs text-gray-400">
365
+ <i data-feather="map-pin" class="w-3 h-3 mr-1"></i>
366
+ <span>Location recorded</span>
367
+ </div>
368
+ </div>
369
+
370
+ <div class="bg-gray-700/50 p-3 rounded-lg">
371
+ <div class="flex justify-between items-start mb-2">
372
+ <div class="flex items-center space-x-2">
373
+ <span class="font-medium text-blue-400">Medical Team</span>
374
+ <span class="text-xs bg-gray-600/50 px-2 py-1 rounded">Channel 3</span>
375
+ </div>
376
+ <span class="text-xs text-gray-400">14:28</span>
377
+ </div>
378
+ <p class="text-gray-200 mb-2">Patient status stable</p>
379
+ <div class="flex items-center text-xs text-gray-400">
380
+ <i data-feather="map-pin" class="w-3 h-3 mr-1"></i>
381
+ <span>Location recorded</span>
382
+ </div>
383
+ </div>
384
+ </div>
385
+ </div>
386
+ </div>
387
+
388
+ <!-- Status Grid -->
389
+ <div class="grid grid-cols-2 md:grid-cols-4 gap-4">
390
+ <div class="bg-green-900/30 p-4 rounded-lg text-center border border-green-900/30">
391
+ <i data-feather="check-circle" class="w-6 h-6 text-green-400 mx-auto mb-2"></i>
392
+ <p class="text-sm">Network</p>
393
+ <p class="text-lg font-semibold text-green-400">Online</p>
394
+ </div>
395
+ <div class="bg-green-900/30 p-4 rounded-lg text-center border border-green-900/30">
396
+ <i data-feather="check-circle" class="w-6 h-6 text-green-400 mx-auto mb-2"></i>
397
+ <p class="text-sm">GPS</p>
398
+ <p class="text-lg font-semibold text-green-400">Active</p>
399
+ </div>
400
+ <div class="bg-yellow-900/30 p-4 rounded-lg text-center border border-yellow-900/30">
401
+ <i data-feather="alert-triangle" class="w-6 h-6 text-yellow-400 mx-auto mb-2"></i>
402
+ <p class="text-sm">Signal</p>
403
+ <p class="text-lg font-semibold text-yellow-400">Good</p>
404
+ </div>
405
+ <div class="bg-green-900/30 p-4 rounded-lg text-center border border-green-900/30">
406
+ <i data-feather="check-circle" class="w-6 h-6 text-green-400 mx-auto mb-2"></i>
407
+ <p class="text-sm">Battery</p>
408
+ <p class="text-lg font-semibold text-green-400">85%</p>
409
+ </div>
410
+ </div>
411
+ </div>
412
+ </div>
413
+ </div>
414
+
415
+ <script>
416
+ // Initialize Vanta.js background
417
+ VANTA.NET({
418
+ el: "#vanta-bg",
419
+ mouseControls: true,
420
+ touchControls: true,
421
+ gyroControls: false,
422
+ minHeight: 200.00,
423
+ minWidth: 200.00,
424
+ scale: 1.00,
425
+ scaleMobile: 1.00,
426
+ color: 0x3a82ff,
427
+ backgroundColor: 0x111827,
428
+ points: 10.00,
429
+ maxDistance: 22.00,
430
+ spacing: 18.00
431
+ });
432
+
433
+ // Update current time
434
+ function updateTime() {
435
+ const now = new Date();
436
+ document.getElementById('current-time').textContent = now.toLocaleTimeString();
437
+ }
438
+ setInterval(updateTime, 1000);
439
+ updateTime();
440
+
441
+ // Initialize Feather Icons
442
+ feather.replace();
443
+
444
+ // Simple function to simulate member selection
445
+ function selectMember(name) {
446
+ alert(`Selected team member: ${name}`);
447
+ }
448
+ </script>
449
+ </body>
450
  </html>