|
<!DOCTYPE html> |
|
<html lang="en"> |
|
<head> |
|
<meta charset="UTF-8"> |
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
<title>AFRO-TRACK | Resilient Shipment Tracking</title> |
|
<script src="https://cdn.tailwindcss.com"></script> |
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
|
<script src="https://api.mapbox.com/mapbox-gl-js/v2.9.1/mapbox-gl.js"></script> |
|
<link href="https://api.mapbox.com/mapbox-gl-js/v2.9.1/mapbox-gl.css" rel="stylesheet" /> |
|
<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_GOOGLE_API_KEY&libraries=visualization"></script> |
|
<script> |
|
tailwind.config = { |
|
theme: { |
|
extend: { |
|
colors: { |
|
primary: '#2C5282', |
|
secondary: '#38B2AC', |
|
danger: '#E53E3E', |
|
warning: '#DD6B20', |
|
success: '#38A169', |
|
dark: '#1A202C', |
|
} |
|
} |
|
} |
|
} |
|
</script> |
|
<style> |
|
.map-container { |
|
height: 500px; |
|
border-radius: 0.75rem; |
|
overflow: hidden; |
|
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); |
|
} |
|
|
|
.offline-indicator { |
|
animation: pulse 2s infinite; |
|
} |
|
|
|
@keyframes pulse { |
|
0% { opacity: 0.5; } |
|
50% { opacity: 1; } |
|
100% { opacity: 0.5; } |
|
} |
|
|
|
.qr-container { |
|
background: white; |
|
padding: 1rem; |
|
border-radius: 0.5rem; |
|
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); |
|
} |
|
|
|
.shipment-card { |
|
transition: all 0.3s ease; |
|
border-left: 4px solid; |
|
} |
|
|
|
.shipment-card:hover { |
|
transform: translateY(-2px); |
|
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); |
|
} |
|
|
|
.status-badge { |
|
padding: 0.25rem 0.75rem; |
|
border-radius: 9999px; |
|
font-size: 0.75rem; |
|
font-weight: 600; |
|
text-transform: uppercase; |
|
} |
|
|
|
.stealth-mode { |
|
background-color: #1A202C; |
|
color: #CBD5E0; |
|
} |
|
|
|
.stealth-mode .stealth-hidden { |
|
filter: blur(5px); |
|
user-select: none; |
|
} |
|
|
|
.stealth-mode .stealth-hidden:hover { |
|
filter: blur(0); |
|
} |
|
|
|
.marker { |
|
width: 20px; |
|
height: 20px; |
|
border-radius: 50%; |
|
border: 2px solid white; |
|
} |
|
|
|
.marker.in_transit { |
|
background-color: #38B2AC; |
|
} |
|
|
|
.marker.delivered { |
|
background-color: #38A169; |
|
} |
|
|
|
.marker.decoy { |
|
background-color: #DD6B20; |
|
} |
|
|
|
.weather-info { |
|
font-size: 12px; |
|
} |
|
|
|
#map, #google-map { |
|
position: absolute; |
|
top: 0; |
|
bottom: 0; |
|
width: 100%; |
|
} |
|
</style> |
|
</head> |
|
<body class="bg-gray-100"> |
|
|
|
<nav class="bg-primary text-white shadow-lg"> |
|
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> |
|
<div class="flex justify-between h-16"> |
|
<div class="flex items-center"> |
|
<div class="flex-shrink-0 flex items-center"> |
|
<i class="fas fa-map-marked-alt text-2xl mr-2"></i> |
|
<span class="text-xl font-bold">AFRO-TRACK</span> |
|
</div> |
|
<div class="hidden md:ml-6 md:flex md:items-center md:space-x-4"> |
|
<a href="#" class="px-3 py-2 rounded-md text-sm font-medium bg-primary-dark">Dashboard</a> |
|
<a href="#" class="px-3 py-2 rounded-md text-sm font-medium hover:bg-primary-dark">Shipments</a> |
|
<a href="#" class="px-3 py-2 rounded-md text-sm font-medium hover:bg-primary-dark">Scan</a> |
|
<a href="#" class="px-3 py-2 rounded-md text-sm font-medium hover:bg-primary-dark">Reports</a> |
|
<a href="#" class="px-3 py-2 rounded-md text-sm font-medium hover:bg-primary-dark">Settings</a> |
|
</div> |
|
</div> |
|
<div class="flex items-center"> |
|
<div class="mr-4 flex items-center"> |
|
<div class="mr-3 text-sm"> |
|
<span class="font-medium">Admin User</span> |
|
<div class="text-xs opacity-75">Administrator</div> |
|
</div> |
|
<div class="relative"> |
|
<img class="h-8 w-8 rounded-full" src="https://ui-avatars.com/api/?name=Admin+User&background=0D8ABC&color=fff" alt="User"> |
|
<span class="absolute bottom-0 right-0 block h-2 w-2 rounded-full bg-success ring-2 ring-white"></span> |
|
</div> |
|
</div> |
|
<button class="bg-secondary hover:bg-secondary-dark text-white px-4 py-2 rounded-md text-sm font-medium flex items-center"> |
|
<i class="fas fa-sync-alt mr-2"></i> Sync Data |
|
</button> |
|
</div> |
|
</div> |
|
</div> |
|
</nav> |
|
|
|
|
|
<div class="offline-indicator bg-warning text-white py-2 text-center"> |
|
<i class="fas fa-exclamation-triangle mr-2"></i> Offline Mode: Data will sync when connection is restored |
|
</div> |
|
|
|
|
|
<div class="stealth-mode"> |
|
<div class="max-w-7xl mx-auto py-6 sm:px-6 lg:px-8"> |
|
<div class="flex justify-between items-center mb-6"> |
|
<h2 class="text-2xl font-bold text-gray-800">Dashboard</h2> |
|
<div class="flex space-x-3"> |
|
<button id="stealth-toggle" class="bg-dark hover:bg-gray-800 text-white px-4 py-2 rounded-md text-sm font-medium flex items-center"> |
|
<i class="fas fa-user-secret mr-2"></i> Stealth Mode: ON |
|
</button> |
|
<button class="bg-success hover:bg-green-600 text-white px-4 py-2 rounded-md text-sm font-medium flex items-center"> |
|
<i class="fas fa-plus mr-2"></i> New Shipment |
|
</button> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="grid grid-cols-1 md:grid-cols-4 gap-4 mb-6"> |
|
<div class="bg-white rounded-lg shadow p-4"> |
|
<div class="flex justify-between items-center"> |
|
<div> |
|
<p class="text-sm text-gray-500">Total Shipments</p> |
|
<p class="text-2xl font-bold">142</p> |
|
</div> |
|
<div class="bg-blue-100 p-3 rounded-full"> |
|
<i class="fas fa-boxes text-primary text-xl"></i> |
|
</div> |
|
</div> |
|
</div> |
|
<div class="bg-white rounded-lg shadow p-4"> |
|
<div class="flex justify-between items-center"> |
|
<div> |
|
<p class="text-sm text-gray-500">In Transit</p> |
|
<p class="text-2xl font-bold">24</p> |
|
</div> |
|
<div class="bg-yellow-100 p-3 rounded-full"> |
|
<i class="fas fa-truck text-warning text-xl"></i> |
|
</div> |
|
</div> |
|
</div> |
|
<div class="bg-white rounded-lg shadow p-4"> |
|
<div class="flex justify-between items-center"> |
|
<div> |
|
<p class="text-sm text-gray-500">Delivered</p> |
|
<p class="text-2xl font-bold">98</p> |
|
</div> |
|
<div class="bg-green-100 p-3 rounded-full"> |
|
<i class="fas fa-check-circle text-success text-xl"></i> |
|
</div> |
|
</div> |
|
</div> |
|
<div class="bg-white rounded-lg shadow p-4"> |
|
<div class="flex justify-between items-center"> |
|
<div> |
|
<p class="text-sm text-gray-500">Bandit Encounters</p> |
|
<p class="text-2xl font-bold">3</p> |
|
</div> |
|
<div class="bg-red-100 p-3 rounded-full"> |
|
<i class="fas fa-shield-alt text-danger text-xl"></i> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="bg-white rounded-lg shadow mb-6"> |
|
<div class="p-4 border-b"> |
|
<h3 class="text-lg font-medium text-gray-800">Real-time Shipment Tracking</h3> |
|
</div> |
|
<div class="map-container relative"> |
|
<div id="map" class="w-full h-full"></div> |
|
<div id="google-map" class="w-full h-full hidden"></div> |
|
<div class="absolute top-4 left-4 z-10 bg-white p-2 rounded shadow"> |
|
<button id="toggle-map" class="px-3 py-1 bg-primary text-white rounded text-sm"> |
|
Switch to Google Maps |
|
</button> |
|
</div> |
|
|
|
|
|
<div class="absolute top-4 right-4 bg-white rounded-lg shadow-md p-2"> |
|
<div class="flex space-x-2"> |
|
<button class="p-2 rounded hover:bg-gray-100"> |
|
<i class="fas fa-plus text-gray-600"></i> |
|
</button> |
|
<button class="p-2 rounded hover:bg-gray-100"> |
|
<i class="fas fa-minus text-gray-600"></i> |
|
</button> |
|
<button class="p-2 rounded hover:bg-gray-100"> |
|
<i class="fas fa-crosshairs text-gray-600"></i> |
|
</button> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="absolute bottom-4 left-4 bg-white rounded-lg shadow-md p-4"> |
|
<h4 class="font-medium mb-2">Shipment Status</h4> |
|
<div class="flex flex-col space-y-2"> |
|
<div class="flex items-center"> |
|
<div class="w-3 h-3 rounded-full bg-success mr-2"></div> |
|
<span class="text-sm">Delivered</span> |
|
</div> |
|
<div class="flex items-center"> |
|
<div class="w-3 h-3 rounded-full bg-secondary mr-2"></div> |
|
<span class="text-sm">In Transit</span> |
|
</div> |
|
<div class="flex items-center"> |
|
<div class="w-3 h-3 rounded-full bg-warning mr-2"></div> |
|
<span class="text-sm">Delayed</span> |
|
</div> |
|
<div class="flex items-center"> |
|
<div class="w-3 h-3 rounded-full bg-danger mr-2"></div> |
|
<span class="text-sm">Bandit Threat</span> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6"> |
|
<div class="bg-white rounded-lg shadow"> |
|
<div class="p-4 border-b"> |
|
<h3 class="text-lg font-medium text-gray-800">Recent Shipments</h3> |
|
</div> |
|
<div class="divide-y"> |
|
|
|
<div class="shipment-card border-secondary p-4"> |
|
<div class="flex justify-between"> |
|
<div> |
|
<h4 class="font-bold text-gray-800 stealth-hidden">Medicines for Kampala Hospital</h4> |
|
<div class="flex items-center mt-1"> |
|
<span class="text-xs text-gray-500">ID: SH-4892-23</span> |
|
<span class="status-badge bg-secondary text-white ml-2">In Transit</span> |
|
</div> |
|
</div> |
|
<div class="text-right"> |
|
<div class="text-sm font-medium">Kampala, UG</div> |
|
<div class="text-xs text-gray-500">ETA: 2 days</div> |
|
</div> |
|
</div> |
|
<div class="mt-3 flex justify-between items-center"> |
|
<div class="flex items-center"> |
|
<div class="bg-gray-200 border-2 border-dashed rounded-xl w-16 h-16"></div> |
|
<div class="ml-3"> |
|
<p class="text-sm font-medium">RFID: 7A:89:B2:4F</p> |
|
<button class="mt-1 text-xs text-primary hover:underline"> |
|
<i class="fas fa-qrcode mr-1"></i> Show QR Code |
|
</button> |
|
</div> |
|
</div> |
|
<div class="flex space-x-2"> |
|
<button class="p-2 rounded-full hover:bg-gray-100"> |
|
<i class="fas fa-shield-alt text-danger"></i> |
|
</button> |
|
<button class="p-2 rounded-full hover:bg-gray-100"> |
|
<i class="fas fa-ellipsis-v text-gray-500"></i> |
|
</button> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="shipment-card border-warning p-4"> |
|
<div class="flex justify-between"> |
|
<div> |
|
<h4 class="font-bold text-gray-800">Agricultural Supplies</h4> |
|
<div class="flex items-center mt-1"> |
|
<span class="text-xs text-gray-500">ID: SH-6754-23</span> |
|
<span class="status-badge bg-warning text-white ml-2">Decoy</span> |
|
</div> |
|
</div> |
|
<div class="text-right"> |
|
<div class="text-sm font-medium">Nairobi, KE</div> |
|
<div class="text-xs text-gray-500">ETA: 3 days</div> |
|
</div> |
|
</div> |
|
<div class="mt-3 flex justify-between items-center"> |
|
<div class="flex items-center"> |
|
<div class="bg-gray-200 border-2 border-dashed rounded-xl w-16 h-16"></div> |
|
<div class="ml-3"> |
|
<p class="text-sm font-medium">RFID: 3C:76:A1:9D</p> |
|
<button class="mt-1 text-xs text-primary hover:underline"> |
|
<i class="fas fa-qrcode mr-1"></i> Show QR Code |
|
</button> |
|
</div> |
|
</div> |
|
<div class="flex space-x-2"> |
|
<button class="p-2 rounded-full hover:bg-gray-100"> |
|
<i class="fas fa-user-secret text-secondary"></i> |
|
</button> |
|
<button class="p-2 rounded-full hover:bg-gray-100"> |
|
<i class="fas fa-ellipsis-v text-gray-500"></i> |
|
</button> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="shipment-card border-success p-4"> |
|
<div class="flex justify-between"> |
|
<div> |
|
<h4 class="font-bold text-gray-800 stealth-hidden">Vaccines for Rural Clinics</h4> |
|
<div class="flex items-center mt-1"> |
|
<span class="text-xs text-gray-500">ID: SH-3421-23</span> |
|
<span class="status-badge bg-success text-white ml-2">Delivered</span> |
|
</div> |
|
</div> |
|
<div class="text-right"> |
|
<div class="text-sm font-medium">Lagos, NG</div> |
|
<div class="text-xs text-gray-500">Delivered: 2 days ago</div> |
|
</div> |
|
</div> |
|
<div class="mt-3 flex justify-between items-center"> |
|
<div class="flex items-center"> |
|
<div class="bg-gray-200 border-2 border-dashed rounded-xl w-16 h-16"></div> |
|
<div class="ml-3"> |
|
<p class="text-sm font-medium">RFID: 5B:23:9F:8A</p> |
|
<button class="mt-1 text-xs text-primary hover:underline"> |
|
<i class="fas fa-qrcode mr-1"></i> Show QR Code |
|
</button> |
|
</div> |
|
</div> |
|
<div class="flex space-x-2"> |
|
<button class="p-2 rounded-full hover:bg-gray-100"> |
|
<i class="fas fa-file-medical text-primary"></i> |
|
</button> |
|
<button class="p-2 rounded-full hover:bg-gray-100"> |
|
<i class="fas fa-ellipsis-v text-gray-500"></i> |
|
</button> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="bg-white rounded-lg shadow"> |
|
<div class="p-4 border-b"> |
|
<h3 class="text-lg font-medium text-gray-800">RFID/QR Scanning</h3> |
|
</div> |
|
<div class="p-4"> |
|
<div class="text-center mb-6"> |
|
<div class="qr-container inline-block mb-4"> |
|
<div class="bg-gray-200 border-2 border-dashed rounded-xl w-48 h-48"></div> |
|
</div> |
|
<p class="text-sm text-gray-600">Scan QR code using NFC-enabled device</p> |
|
</div> |
|
|
|
<div class="space-y-4"> |
|
<div> |
|
<label class="block text-sm font-medium text-gray-700 mb-1">Scan Result</label> |
|
<div class="flex"> |
|
<input type="text" class="flex-1 border border-gray-300 rounded-l-md px-3 py-2" placeholder="Scan a shipment..." value="SH-4892-23 | Medicines for Kampala Hospital"> |
|
<button class="bg-primary hover:bg-primary-dark text-white px-4 py-2 rounded-r-md"> |
|
<i class="fas fa-search"></i> |
|
</button> |
|
</div> |
|
</div> |
|
|
|
<div class="grid grid-cols-2 gap-4"> |
|
<button class="bg-secondary hover:bg-secondary-dark text-white py-2 rounded-md font-medium flex items-center justify-center"> |
|
<i class="fas fa-camera mr-2"></i> Scan QR Code |
|
</button> |
|
<button class="bg-primary hover:bg-primary-dark text-white py-2 rounded-md font-medium flex items-center justify-center"> |
|
<i class="fas fa-wifi mr-2"></i> Simulate RFID |
|
</button> |
|
</div> |
|
|
|
<div class="mt-6"> |
|
<h4 class="font-medium text-gray-800 mb-2">Offline Scans (Pending Sync)</h4> |
|
<div class="bg-gray-50 rounded-lg p-3"> |
|
<div class="flex justify-between items-center text-sm py-2"> |
|
<div> |
|
<span class="font-medium">SH-6754-23</span> |
|
<span class="text-gray-500 ml-2">Scanned 15 min ago</span> |
|
</div> |
|
<span class="bg-yellow-100 text-yellow-800 px-2 py-1 rounded text-xs">Pending</span> |
|
</div> |
|
<div class="flex justify-between items-center text-sm py-2"> |
|
<div> |
|
<span class="font-medium">SH-3421-23</span> |
|
<span class="text-gray-500 ml-2">Scanned 2 hrs ago</span> |
|
</div> |
|
<span class="bg-yellow-100 text-yellow-800 px-2 py-1 rounded text-xs">Pending</span> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="mt-6 bg-white rounded-lg shadow"> |
|
<div class="p-4 border-b"> |
|
<h3 class="text-lg font-medium text-gray-800">Bandit-Proof Protocols</h3> |
|
</div> |
|
<div class="grid grid-cols-1 md:grid-cols-3 gap-4 p-4"> |
|
<div class="border rounded-lg p-4 hover:shadow-md transition-shadow"> |
|
<div class="flex items-center mb-3"> |
|
<div class="bg-purple-100 p-2 rounded-full mr-3"> |
|
<i class="fas fa-user-secret text-purple-600"></i> |
|
</div> |
|
<h4 class="font-bold text-gray-800">Stealth Mode</h4> |
|
</div> |
|
<p class="text-sm text-gray-600">Hide sensitive shipment details to protect against unauthorized access during transit.</p> |
|
<div class="mt-4"> |
|
<label class="inline-flex items-center"> |
|
<input type="checkbox" class="rounded border-gray-300 text-primary focus:ring-primary" checked> |
|
<span class="ml-2 text-sm">Enable Stealth Mode</span> |
|
</label> |
|
</div> |
|
</div> |
|
|
|
<div class="border rounded-lg p-4 hover:shadow-md transition-shadow"> |
|
<div class="flex items-center mb-3"> |
|
<div class="bg-yellow-100 p-2 rounded-full mr-3"> |
|
<i class="fas fa-chess-knight text-yellow-600"></i> |
|
</div> |
|
<h4 class="font-bold text-gray-800">Decoy Shipments</h4> |
|
</div> |
|
<p class="text-sm text-gray-600">Create false shipments to misdirect potential threats and protect valuable cargo.</p> |
|
<button class="mt-4 bg-warning hover:bg-orange-600 text-white px-3 py-1 rounded text-sm"> |
|
Create Decoy Shipment |
|
</button> |
|
</div> |
|
|
|
<div class="border rounded-lg p-4 hover:shadow-md transition-shadow"> |
|
<div class="flex items-center mb-3"> |
|
<div class="bg-red-100 p-2 rounded-full mr-3"> |
|
<i class="fas fa-shield-alt text-red-600"></i> |
|
</div> |
|
<h4 class="font-bold text-gray-800">Emergency Protocols</h4> |
|
</div> |
|
<p class="text-sm text-gray-600">Immediate response system to secure shipments during bandit encounters.</p> |
|
<button class="mt-4 bg-danger hover:bg-red-700 text-white px-3 py-1 rounded text-sm"> |
|
Activate Emergency Protocol |
|
</button> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
|
|
<footer class="bg-dark text-gray-400 py-6 mt-8"> |
|
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> |
|
<div class="flex flex-col md:flex-row justify-between items-center"> |
|
<div class="mb-4 md:mb-0"> |
|
<div class="flex items-center"> |
|
<i class="fas fa-map-marked-alt text-xl mr-2 text-secondary"></i> |
|
<span class="text-lg font-bold text-white">AFRO-TRACK</span> |
|
</div> |
|
<p class="text-sm mt-1">Resilient Shipment Tracking for Africa</p> |
|
</div> |
|
<div class="flex space-x-6"> |
|
<a href="#" class="hover:text-white"> |
|
<i class="fab fa-github"></i> |
|
</a> |
|
<a href="#" class="hover:text-white"> |
|
<i class="fab fa-twitter"></i> |
|
</a> |
|
<a href="#" class="hover:text-white"> |
|
<i class="fab fa-linkedin"></i> |
|
</a> |
|
</div> |
|
</div> |
|
<div class="mt-6 pt-6 border-t border-gray-700 text-center text-sm"> |
|
<p>© 2023 AFRO-TRACK. Designed for resilience in Africa's toughest conditions.</p> |
|
</div> |
|
</div> |
|
</footer> |
|
|
|
<script> |
|
|
|
mapboxgl.accessToken = 'pk.eyJ1IjoiYWthbmltbzEiLCJhIjoiY2x4czNxbjU2MWM2eTJqc2gwNGIwaWhkMSJ9.jSwZdyaPa1dOHepNU5P71g'; |
|
const mapboxMap = new mapboxgl.Map({ |
|
container: 'map', |
|
style: 'mapbox://styles/mapbox/streets-v11', |
|
center: [36.8219, -1.2921], |
|
zoom: 6 |
|
}); |
|
|
|
|
|
const googleMap = new google.maps.Map(document.getElementById('google-map'), { |
|
center: {lat: -1.2921, lng: 36.8219}, |
|
zoom: 6, |
|
mapTypeId: 'roadmap' |
|
}); |
|
|
|
|
|
function addWeatherLayer() { |
|
fetch(`https://api.openweathermap.org/data/2.5/weather?lat=-1.2921&lon=36.8219&appid=32b25b6e6eb45b6df18d92b934c332a7`) |
|
.then(response => response.json()) |
|
.then(data => { |
|
const weatherInfo = document.createElement('div'); |
|
weatherInfo.className = 'weather-info bg-white p-2 rounded shadow'; |
|
weatherInfo.innerHTML = ` |
|
<div class="flex items-center"> |
|
<img src="https://openweathermap.org/img/wn/${data.weather[0].icon}.png" alt="${data.weather[0].description}"> |
|
<div class="ml-2"> |
|
<p class="font-bold">${Math.round(data.main.temp - 273.15)}°C</p> |
|
<p class="text-xs">${data.weather[0].main}</p> |
|
</div> |
|
</div> |
|
`; |
|
new mapboxgl.Marker(weatherInfo) |
|
.setLngLat([36.8219, -1.2921]) |
|
.addTo(mapboxMap); |
|
}); |
|
} |
|
|
|
|
|
document.getElementById('toggle-map').addEventListener('click', function() { |
|
const mapboxEl = document.getElementById('map'); |
|
const googleEl = document.getElementById('google-map'); |
|
const button = document.getElementById('toggle-map'); |
|
|
|
if (mapboxEl.classList.contains('hidden')) { |
|
mapboxEl.classList.remove('hidden'); |
|
googleEl.classList.add('hidden'); |
|
button.textContent = 'Switch to Google Maps'; |
|
} else { |
|
mapboxEl.classList.add('hidden'); |
|
googleEl.classList.remove('hidden'); |
|
button.textContent = 'Switch to Mapbox'; |
|
} |
|
}); |
|
|
|
|
|
function addShipmentMarkers() { |
|
|
|
const shipments = [ |
|
{ |
|
id: 'SH-4892-23', |
|
name: 'Medicines for Kampala', |
|
coords: [32.5825, 0.3136], |
|
status: 'in_transit' |
|
}, |
|
{ |
|
id: 'SH-6754-23', |
|
name: 'Agricultural Supplies', |
|
coords: [36.8219, -1.2921], |
|
status: 'decoy' |
|
}, |
|
{ |
|
id: 'SH-3421-23', |
|
name: 'Vaccines for Rural Clinics', |
|
coords: [3.3792, 6.5244], |
|
status: 'delivered' |
|
} |
|
]; |
|
|
|
|
|
shipments.forEach(shipment => { |
|
const el = document.createElement('div'); |
|
el.className = `marker ${shipment.status}`; |
|
|
|
new mapboxgl.Marker(el) |
|
.setLngLat(shipment.coords) |
|
.setPopup(new mapboxgl.Popup().setHTML(` |
|
<h3 class="font-bold">${shipment.name}</h3> |
|
<p class="text-sm">ID: ${shipment.id}</p> |
|
<p class="text-xs ${shipment.status === 'decoy' ? 'text-warning' : 'text-success'}"> |
|
${shipment.status.replace('_', ' ')} |
|
</p> |
|
`)) |
|
.addTo(mapboxMap); |
|
}); |
|
|
|
|
|
shipments.forEach(shipment => { |
|
new google.maps.Marker({ |
|
position: {lat: shipment.coords[1], lng: shipment.coords[0]}, |
|
map: googleMap, |
|
title: shipment.name, |
|
icon: { |
|
url: `https://maps.google.com/mapfiles/ms/icons/${ |
|
shipment.status === 'in_transit' ? 'blue' : |
|
shipment.status === 'delivered' ? 'green' : 'orange' |
|
}-dot.png` |
|
} |
|
}); |
|
}); |
|
} |
|
|
|
|
|
window.addEventListener('load', () => { |
|
addWeatherLayer(); |
|
addShipmentMarkers(); |
|
}); |
|
|
|
|
|
document.getElementById('stealth-toggle').addEventListener('click', function() { |
|
document.body.classList.toggle('stealth-mode'); |
|
const stealthButton = document.getElementById('stealth-toggle'); |
|
if (document.body.classList.contains('stealth-mode')) { |
|
stealthButton.innerHTML = '<i class="fas fa-user-secret mr-2"></i> Stealth Mode: ON'; |
|
} else { |
|
stealthButton.innerHTML = '<i class="fas fa-user mr-2"></i> Stealth Mode: OFF'; |
|
} |
|
}); |
|
|
|
|
|
setInterval(() => { |
|
const indicator = document.querySelector('.offline-indicator'); |
|
indicator.classList.toggle('bg-warning'); |
|
indicator.classList.toggle('bg-gray-500'); |
|
|
|
if (indicator.classList.contains('bg-gray-500')) { |
|
indicator.innerHTML = '<i class="fas fa-wifi mr-2"></i> Online: All systems operational'; |
|
} else { |
|
indicator.innerHTML = '<i class="fas fa-exclamation-triangle mr-2"></i> Offline Mode: Data will sync when connection is restored'; |
|
} |
|
}, 5000); |
|
</script> |
|
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=MoShow/afro" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> |
|
</html> |