|
<!DOCTYPE html> |
|
<html lang="en"> |
|
<head> |
|
<meta charset="UTF-8"> |
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
<title>LogisticsPro - Transportation Management System</title> |
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
|
<style> |
|
:root { |
|
--primary-color: #3a86ff; |
|
--secondary-color: #8338ec; |
|
--accent-color: #ff006e; |
|
--danger-color: #ef233c; |
|
--success-color: #06d6a0; |
|
--warning-color: #ffbe0b; |
|
--dark-color: #1a1a2e; |
|
--light-color: #f8f9fa; |
|
--gray-color: #6c757d; |
|
--border-radius: 8px; |
|
--box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); |
|
} |
|
|
|
* { |
|
margin: 0; |
|
padding: 0; |
|
box-sizing: border-box; |
|
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; |
|
} |
|
|
|
body { |
|
background-color: #f5f7fa; |
|
color: var(--dark-color); |
|
} |
|
|
|
.app-container { |
|
display: grid; |
|
grid-template-columns: 250px 1fr; |
|
min-height: 100vh; |
|
} |
|
|
|
|
|
.sidebar { |
|
background-color: var(--dark-color); |
|
color: white; |
|
padding: 20px 0; |
|
height: 100vh; |
|
position: sticky; |
|
top: 0; |
|
} |
|
|
|
.logo { |
|
display: flex; |
|
align-items: center; |
|
justify-content: center; |
|
margin-bottom: 30px; |
|
padding: 0 20px; |
|
} |
|
|
|
.logo i { |
|
font-size: 30px; |
|
margin-right: 10px; |
|
color: var(--primary-color); |
|
} |
|
|
|
.logo h1 { |
|
font-size: 20px; |
|
} |
|
|
|
.menu-item { |
|
display: flex; |
|
align-items: center; |
|
padding: 15px 25px; |
|
cursor: pointer; |
|
transition: all 0.3s; |
|
border-left: 3px solid transparent; |
|
} |
|
|
|
.menu-item i { |
|
font-size: 18px; |
|
margin-right: 15px; |
|
width: 20px; |
|
text-align: center; |
|
} |
|
|
|
.menu-item:hover { |
|
background-color: rgba(255, 255, 255, 0.1); |
|
} |
|
|
|
.menu-item.active { |
|
background-color: rgba(58, 134, 255, 0.2); |
|
border-left-color: var(--primary-color); |
|
} |
|
|
|
|
|
.main-content { |
|
padding: 20px 30px; |
|
} |
|
|
|
|
|
.header { |
|
display: flex; |
|
justify-content: space-between; |
|
align-items: center; |
|
margin-bottom: 30px; |
|
padding-bottom: 15px; |
|
border-bottom: 1px solid #e9ecef; |
|
} |
|
|
|
.header h2 { |
|
font-size: 24px; |
|
font-weight: 600; |
|
} |
|
|
|
.user-info { |
|
display: flex; |
|
align-items: center; |
|
} |
|
|
|
.user-avatar { |
|
width: 40px; |
|
height: 40px; |
|
border-radius: 50%; |
|
background-color: var(--primary-color); |
|
color: white; |
|
display: flex; |
|
align-items: center; |
|
justify-content: center; |
|
margin-right: 15px; |
|
font-weight: bold; |
|
} |
|
|
|
.notification-badge { |
|
position: relative; |
|
margin-right: 25px; |
|
cursor: pointer; |
|
} |
|
|
|
.notification-badge i { |
|
font-size: 20px; |
|
color: var(--gray-color); |
|
} |
|
|
|
.badge { |
|
position: absolute; |
|
top: -5px; |
|
right: -10px; |
|
background-color: var(--danger-color); |
|
color: white; |
|
border-radius: 50%; |
|
width: 16px; |
|
height: 16px; |
|
display: flex; |
|
align-items: center; |
|
justify-content: center; |
|
font-size: 10px; |
|
} |
|
|
|
|
|
.dashboard-widgets { |
|
display: grid; |
|
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); |
|
gap: 20px; |
|
margin-bottom: 30px; |
|
} |
|
|
|
.widget { |
|
background-color: white; |
|
border-radius: var(--border-radius); |
|
padding: 20px; |
|
box-shadow: var(--box-shadow); |
|
display: flex; |
|
align-items: center; |
|
} |
|
|
|
.widget-icon { |
|
width: 60px; |
|
height: 60px; |
|
border-radius: 50%; |
|
display: flex; |
|
align-items: center; |
|
justify-content: center; |
|
margin-right: 15px; |
|
font-size: 25px; |
|
} |
|
|
|
.widget-content { |
|
flex: 1; |
|
} |
|
|
|
.widget-title { |
|
font-size: 14px; |
|
color: var(--gray-color); |
|
margin-bottom: 5px; |
|
} |
|
|
|
.widget-value { |
|
font-size: 22px; |
|
font-weight: 600; |
|
margin-bottom: 5px; |
|
} |
|
|
|
.widget-change { |
|
font-size: 12px; |
|
display: flex; |
|
align-items: center; |
|
} |
|
|
|
.up { |
|
color: var(--success-color); |
|
} |
|
|
|
.down { |
|
color: var(--danger-color); |
|
} |
|
|
|
|
|
.shipments-section { |
|
background-color: white; |
|
border-radius: var(--border-radius); |
|
padding: 25px; |
|
box-shadow: var(--box-shadow); |
|
margin-bottom: 30px; |
|
} |
|
|
|
.section-header { |
|
display: flex; |
|
justify-content: space-between; |
|
align-items: center; |
|
margin-bottom: 20px; |
|
} |
|
|
|
.section-title { |
|
font-size: 18px; |
|
font-weight: 600; |
|
} |
|
|
|
.btn { |
|
padding: 8px 16px; |
|
border-radius: var(--border-radius); |
|
border: none; |
|
cursor: pointer; |
|
font-weight: 500; |
|
transition: all 0.3s; |
|
display: inline-flex; |
|
align-items: center; |
|
} |
|
|
|
.btn i { |
|
margin-right: 8px; |
|
} |
|
|
|
.btn-primary { |
|
background-color: var(--primary-color); |
|
color: white; |
|
} |
|
|
|
.btn-primary:hover { |
|
background-color: #2a75e6; |
|
} |
|
|
|
table { |
|
width: 100%; |
|
border-collapse: collapse; |
|
} |
|
|
|
th, td { |
|
padding: 12px 15px; |
|
text-align: left; |
|
border-bottom: 1px solid #e9ecef; |
|
} |
|
|
|
th { |
|
font-weight: 600; |
|
color: var(--gray-color); |
|
background-color: #f8f9fa; |
|
} |
|
|
|
.status { |
|
padding: 5px 10px; |
|
border-radius: 20px; |
|
font-size: 12px; |
|
font-weight: 500; |
|
} |
|
|
|
.status-pending { |
|
background-color: #fff3cd; |
|
color: #856404; |
|
} |
|
|
|
.status-in-transit { |
|
background-color: #cce5ff; |
|
color: #004085; |
|
} |
|
|
|
.status-delivered { |
|
background-color: #d4edda; |
|
color: #155724; |
|
} |
|
|
|
.status-cancelled { |
|
background-color: #f8d7da; |
|
color: #721c24; |
|
} |
|
|
|
.action-btn { |
|
background: none; |
|
border: none; |
|
cursor: pointer; |
|
color: var(--primary-color); |
|
margin-right: 10px; |
|
font-size: 16px; |
|
} |
|
|
|
|
|
.map-section { |
|
background-color: white; |
|
border-radius: var(--border-radius); |
|
padding: 25px; |
|
box-shadow: var(--box-shadow); |
|
margin-bottom: 30px; |
|
} |
|
|
|
.map-container { |
|
height: 350px; |
|
background-color: #e9ecef; |
|
border-radius: var(--border-radius); |
|
display: flex; |
|
align-items: center; |
|
justify-content: center; |
|
margin-top: 15px; |
|
position: relative; |
|
overflow: hidden; |
|
} |
|
|
|
.map-placeholder { |
|
text-align: center; |
|
color: var(--gray-color); |
|
} |
|
|
|
.map-placeholder i { |
|
font-size: 50px; |
|
margin-bottom: 15px; |
|
color: var(--primary-color); |
|
} |
|
|
|
|
|
.tracking-container { |
|
display: flex; |
|
flex-direction: column; |
|
} |
|
|
|
.tracking-header { |
|
display: flex; |
|
align-items: center; |
|
margin-bottom: 20px; |
|
} |
|
|
|
.tracking-input { |
|
flex: 1; |
|
padding: 10px 15px; |
|
border: 1px solid #ced4da; |
|
border-radius: var(--border-radius); |
|
margin-right: 10px; |
|
font-size: 14px; |
|
} |
|
|
|
|
|
@media (max-width: 992px) { |
|
.app-container { |
|
grid-template-columns: 1fr; |
|
} |
|
|
|
.sidebar { |
|
height: auto; |
|
position: relative; |
|
} |
|
} |
|
|
|
|
|
@keyframes fadeIn { |
|
from { opacity: 0; transform: translateY(20px); } |
|
to { opacity: 1; transform: translateY(0); } |
|
} |
|
|
|
.fade-in { |
|
animation: fadeIn 0.5s ease-out forwards; |
|
} |
|
</style> |
|
</head> |
|
<body> |
|
<div class="app-container"> |
|
|
|
<div class="sidebar"> |
|
<div class="logo"> |
|
<i class="fas fa-truck-moving"></i> |
|
<h1>LogisticsPro</h1> |
|
</div> |
|
|
|
<div class="menu-item active"> |
|
<i class="fas fa-tachometer-alt"></i> |
|
<span>Dashboard</span> |
|
</div> |
|
|
|
<div class="menu-item"> |
|
<i class="fas fa-shipping-fast"></i> |
|
<span>Shipments</span> |
|
</div> |
|
|
|
<div class="menu-item"> |
|
<i class="fas fa-warehouse"></i> |
|
<span>Warehouses</span> |
|
</div> |
|
|
|
<div class="menu-item"> |
|
<i class="fas fa-users"></i> |
|
<span>Drivers</span> |
|
</div> |
|
|
|
<div class="menu-item"> |
|
<i class="fas fa-route"></i> |
|
<span>Routes</span> |
|
</div> |
|
|
|
<div class="menu-item"> |
|
<i class="fas fa-map-marked-alt"></i> |
|
<span>Tracking</span> |
|
</div> |
|
|
|
<div class="menu-item"> |
|
<i class="fas fa-file-invoice-dollar"></i> |
|
<span>Invoices</span> |
|
</div> |
|
|
|
<div class="menu-item"> |
|
<i class="fas fa-cog"></i> |
|
<span>Settings</span> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="main-content"> |
|
<div class="header"> |
|
<h2>Transportation Dashboard</h2> |
|
|
|
<div class="user-info"> |
|
<div class="notification-badge"> |
|
<i class="fas fa-bell"></i> |
|
<div class="badge">3</div> |
|
</div> |
|
|
|
<div class="user-avatar">JD</div> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="dashboard-widgets"> |
|
<div class="widget fade-in" style="animation-delay: 0.1s;"> |
|
<div class="widget-icon" style="background-color: #e3f2fd; color: var(--primary-color);"> |
|
<i class="fas fa-boxes"></i> |
|
</div> |
|
<div class="widget-content"> |
|
<div class="widget-title">Total Shipments</div> |
|
<div class="widget-value">1,284</div> |
|
<div class="widget-change up"> |
|
<i class="fas fa-arrow-up"></i> 12% from last month |
|
</div> |
|
</div> |
|
</div> |
|
|
|
<div class="widget fade-in" style="animation-delay: 0.2s;"> |
|
<div class="widget-icon" style="background-color: #fff8e1; color: var(--warning-color);"> |
|
<i class="fas fa-truck"></i> |
|
</div> |
|
<div class="widget-content"> |
|
<div class="widget-title">In Transit</div> |
|
<div class="widget-value">327</div> |
|
<div class="widget-change down"> |
|
<i class="fas fa-arrow-down"></i> 5% from last month |
|
</div> |
|
</div> |
|
</div> |
|
|
|
<div class="widget fade-in" style="animation-delay: 0.3s;"> |
|
<div class="widget-icon" style="background-color: #e8f5e9; color: var(--success-color);"> |
|
<i class="fas fa-check-circle"></i> |
|
</div> |
|
<div class="widget-content"> |
|
<div class="widget-title">Delivered</div> |
|
<div class="widget-value">872</div> |
|
<div class="widget-change up"> |
|
<i class="fas fa-arrow-up"></i> 18% from last month |
|
</div> |
|
</div> |
|
</div> |
|
|
|
<div class="widget fade-in" style="animation-delay: 0.4s;"> |
|
<div class="widget-icon" style="background-color: #ffebee; color: var(--danger-color);"> |
|
<i class="fas fa-exclamation-triangle"></i> |
|
</div> |
|
<div class="widget-content"> |
|
<div class="widget-title">Delayed</div> |
|
<div class="widget-value">85</div> |
|
<div class="widget-change down"> |
|
<i class="fas fa-arrow-down"></i> 7% from last month |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="shipments-section fade-in" style="animation-delay: 0.5s;"> |
|
<div class="section-header"> |
|
<div class="section-title">Recent Shipments</div> |
|
<button class="btn btn-primary"> |
|
<i class="fas fa-plus"></i> Add New |
|
</button> |
|
</div> |
|
|
|
<div class="table-responsive"> |
|
<table> |
|
<thead> |
|
<tr> |
|
<th>Tracking ID</th> |
|
<th>Origin</th> |
|
<th>Destination</th> |
|
<th>Carrier</th> |
|
<th>Status</th> |
|
<th>Est. Delivery</th> |
|
<th>Actions</th> |
|
</tr> |
|
</thead> |
|
<tbody> |
|
<tr> |
|
<td>#SH-8472</td> |
|
<td>New York, USA</td> |
|
<td>London, UK</td> |
|
<td>FedEx</td> |
|
<td><span class="status status-in-transit">In Transit</span></td> |
|
<td>Jun 15, 2023</td> |
|
<td> |
|
<button class="action-btn" title="Track"> |
|
<i class="fas fa-map-marker-alt"></i> |
|
</button> |
|
<button class="action-btn" title="Edit"> |
|
<i class="fas fa-edit"></i> |
|
</button> |
|
<button class="action-btn" title="Delete"> |
|
<i class="fas fa-trash"></i> |
|
</button> |
|
</td> |
|
</tr> |
|
<tr> |
|
<td>#SH-9265</td> |
|
<td>Shanghai, China</td> |
|
<td>Los Angeles, USA</td> |
|
<td>Maersk</td> |
|
<td><span class="status status-pending">Pending</span></td> |
|
<td>Jun 18, 2023</td> |
|
<td> |
|
<button class="action-btn" title="Track"> |
|
<i class="fas fa-map-marker-alt"></i> |
|
</button> |
|
<button class="action-btn" title="Edit"> |
|
<i class="fas fa-edit"></i> |
|
</button> |
|
<button class="action-btn" title="Delete"> |
|
<i class="fas fa-trash"></i> |
|
</button> |
|
</td> |
|
</tr> |
|
<tr> |
|
<td>#SH-7318</td> |
|
<td>Berlin, Germany</td> |
|
<td>Paris, France</td> |
|
<td>DHL</td> |
|
<td><span class="status status-delivered">Delivered</span></td> |
|
<td>Jun 10, 2023</td> |
|
<td> |
|
<button class="action-btn" title="Track"> |
|
<i class="fas fa-map-marker-alt"></i> |
|
</button> |
|
<button class="action-btn" title="Edit"> |
|
<i class="fas fa-edit"></i> |
|
</button> |
|
<button class="action-btn" title="Delete"> |
|
<i class="fas fa-trash"></i> |
|
</button> |
|
</td> |
|
</tr> |
|
<tr> |
|
<td>#SH-4592</td> |
|
<td>Sydney, Australia</td> |
|
<td>Tokyo, Japan</td> |
|
<td>AAPL Logistics</td> |
|
<td><span class="status status-cancelled">Cancelled</span></td> |
|
<td>Jun 05, 2023</td> |
|
<td> |
|
<button class="action-btn" title="Track"> |
|
<i class="fas fa-map-marker-alt"></i> |
|
</button> |
|
<button class="action-btn" title="Edit"> |
|
<i class="fas fa-edit"></i> |
|
</button> |
|
<button class="action-btn" title="Delete"> |
|
<i class="fas fa-trash"></i> |
|
</button> |
|
</td> |
|
</tr> |
|
<tr> |
|
<td>#SH-3847</td> |
|
<td>Mumbai, India</td> |
|
<td>Dubai, UAE</td> |
|
<td>Amazon Logistics</td> |
|
<td><span class="status status-in-transit">In Transit</span></td> |
|
<td>Jun 20, 2023</td> |
|
<td> |
|
<button class="action-btn" title="Track"> |
|
<i class="fas fa-map-marker-alt"></i> |
|
</button> |
|
<button class="action-btn" title="Edit"> |
|
<i class="fas fa-edit"></i> |
|
</button> |
|
<button class="action-btn" title="Delete"> |
|
<i class="fas fa-trash"></i> |
|
</button> |
|
</td> |
|
</tr> |
|
</tbody> |
|
</table> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="map-section fade-in" style="animation-delay: 0.6s;"> |
|
<div class="section-header"> |
|
<div class="section-title">Live Tracking</div> |
|
</div> |
|
|
|
<div class="tracking-container"> |
|
<div class="tracking-header"> |
|
<input type="text" class="tracking-input" placeholder="Enter tracking number"> |
|
<button class="btn btn-primary"> |
|
<i class="fas fa-search"></i> Track |
|
</button> |
|
</div> |
|
|
|
<div class="map-container"> |
|
<div class="map-placeholder"> |
|
<i class="fas fa-map-marked-alt"></i> |
|
<p>Live shipment tracking map will be displayed here</p> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
<script> |
|
document.addEventListener('DOMContentLoaded', function() { |
|
|
|
const menuItems = document.querySelectorAll('.menu-item'); |
|
menuItems.forEach(item => { |
|
item.addEventListener('click', function() { |
|
document.querySelector('.menu-item.active').classList.remove('active'); |
|
this.classList.add('active'); |
|
}); |
|
}); |
|
|
|
|
|
function updateWidgets() { |
|
const widgets = document.querySelectorAll('.widget-value'); |
|
|
|
|
|
setInterval(() => { |
|
widgets[0].textContent = (1284 + Math.floor(Math.random() * 20)).toLocaleString(); |
|
widgets[1].textContent = (327 + Math.floor(Math.random() * 15) - 5); |
|
widgets[2].textContent = (872 + Math.floor(Math.random() * 30)); |
|
widgets[3].textContent = (85 + Math.floor(Math.random() * 10) - 3); |
|
}, 5000); |
|
} |
|
|
|
updateWidgets(); |
|
|
|
|
|
const trackButton = document.querySelector('.map-section .btn-primary'); |
|
trackButton.addEventListener('click', function() { |
|
const trackingInput = document.querySelector('.tracking-input'); |
|
if (trackingInput.value.trim() === '') { |
|
alert('Please enter a tracking number'); |
|
return; |
|
} |
|
|
|
|
|
alert(`Tracking information for ${trackingInput.value} would be displayed here`); |
|
trackingInput.value = ''; |
|
}); |
|
|
|
|
|
const actionButtons = document.querySelectorAll('.action-btn'); |
|
actionButtons.forEach(button => { |
|
button.addEventListener('click', function() { |
|
const shipmentId = this.closest('tr').querySelector('td').textContent; |
|
const action = this.title; |
|
|
|
|
|
|
|
const actions = { |
|
'Track': `Would show tracking info for ${shipmentId}`, |
|
'Edit': `Would open edit form for ${shipmentId}`, |
|
'Delete': `Would delete shipment ${shipmentId} after confirmation` |
|
}; |
|
|
|
alert(actions[action]); |
|
}); |
|
}); |
|
|
|
|
|
const fadeElements = document.querySelectorAll('.fade-in'); |
|
|
|
function checkScroll() { |
|
fadeElements.forEach(element => { |
|
const elementTop = element.getBoundingClientRect().top; |
|
const windowHeight = window.innerHeight; |
|
|
|
if (elementTop < windowHeight - 100) { |
|
element.style.opacity = 1; |
|
} |
|
}); |
|
} |
|
|
|
window.addEventListener('scroll', checkScroll); |
|
checkScroll(); |
|
}); |
|
</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 <a href="https://enzostvs-deepsite.hf.space" style="color: #fff;" target="_blank" >DeepSite</a> <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;"></p></body> |
|
</html> |