anonymous111110987654321's picture
Add 3 files
4ef1c2d verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Customs Brokerage Analytics Dashboard</title>
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdn.plot.ly/plotly-2.24.1.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@mdi/font@7.1.96/css/materialdesignicons.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
<script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
<script>
tailwind.config = {
theme: {
extend: {
colors: {
primary: '#1a56db',
secondary: '#7e3af2',
success: '#0e9f6e',
warning: '#f05f14',
danger: '#e02424',
background: {
light: '#f9fafb',
dark: '#1f2a37'
},
card: {
light: '#ffffff',
dark: '#374151'
},
text: {
light: '#111827',
dark: '#e5e7eb'
}
}
}
},
darkMode: 'class'
}
</script>
<style>
.scrollbar-hidden::-webkit-scrollbar {
display: none;
}
.chart-container {
background: rgba(255, 255, 255, 0.03);
border-radius: 0.75rem;
backdrop-filter: blur(16px);
}
.bg-gradient-primary {
background: linear-gradient(135deg, #1a56db 0%, #7e3af2 100%);
}
.outlier-row:nth-child(even) {
background-color: rgba(244, 63, 94, 0.1);
}
.dark .outlier-row:nth-child(even) {
background-color: rgba(244, 63, 94, 0.2);
}
.entry-timeline {
position: relative;
}
.entry-timeline::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 4px;
height: 100%;
background: linear-gradient(to bottom, #7e3af2, #1a56db);
border-radius: 4px;
}
.fade-in {
animation: fadeIn 0.3s ease-in-out;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
.heatmap-day {
border-radius: 4px;
transition: all 0.2s;
}
.heatmap-day:hover {
transform: scale(1.05);
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
</style>
</head>
<body class="bg-gray-50 dark:bg-gray-900 text-gray-900 dark:text-gray-100 transition-colors duration-200 min-h-screen">
<!-- Header -->
<header class="sticky top-0 z-50 bg-white dark:bg-gray-800 shadow-md">
<div class="container mx-auto px-4 py-3 flex justify-between items-center">
<div class="flex items-center space-x-3">
<div class="bg-gradient-primary p-2 rounded-lg">
<span class="mdi mdi-ship-wheel text-white text-2xl"></span>
</div>
<h1 class="text-xl font-bold">Customs Brokerage Analytics</h1>
</div>
<div class="flex items-center space-x-4">
<div id="theme-toggle" class="p-2 rounded-full bg-gray-100 dark:bg-gray-700 cursor-pointer">
<span class="mdi mdi-weather-sunny text-yellow-500 block dark:hidden"></span>
<span class="mdi mdi-weather-night text-indigo-400 hidden dark:block"></span>
</div>
<div class="relative group">
<div class="bg-gray-200 border-2 border-dashed rounded-xl w-10 h-10 flex items-center justify-center text-gray-600">
<span class="mdi mdi-account text-xl"></span>
</div>
<div class="absolute right-0 w-48 mt-2 rounded-md shadow-lg bg-white dark:bg-gray-700 ring-1 ring-black ring-opacity-5 hidden group-hover:block z-50">
<div class="py-1 px-4 text-sm">
<p class="font-semibold">Analytics User</p>
<p class="text-gray-500">customs@brokerage.com</p>
</div>
</div>
</div>
</div>
</div>
</header>
<main class="container mx-auto px-4 py-8">
<!-- Filters Section -->
<section class="mb-8 bg-card-light dark:bg-card rounded-xl shadow-md p-4">
<div class="flex flex-wrap gap-4 items-end">
<div class="flex-1 min-w-[200px]">
<label class="block text-sm font-medium mb-1">Port of Entry</label>
<select class="w-full px-3 py-2 bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg text-sm focus:ring-primary focus:border-primary">
<option>All Ports</option>
<option>New York (NYC)</option>
<option>Los Angeles (LAX)</option>
<option>Chicago (ORD)</option>
<option>Miami (MIA)</option>
<option>Seattle (SEA)</option>
</select>
</div>
<div class="flex-1 min-w-[200px]">
<label class="block text-sm font-medium mb-1">Date Range</label>
<input id="date-range" class="w-full px-3 py-2 bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg text-sm" placeholder="Select date range">
</div>
<div class="flex-1 min-w-[200px]">
<label class="block text-sm font-medium mb-1">Mode of Transport</label>
<select class="w-full px-3 py-2 bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg text-sm focus:ring-primary focus:border-primary">
<option>All Modes</option>
<option>Ocean Freight</option>
<option>Air Freight</option>
<option>Truck</option>
<option>Rail</option>
</select>
</div>
<div>
<button class="px-4 py-2 bg-primary text-white rounded-lg font-medium hover:bg-blue-800 transition">
Apply Filters
</button>
</div>
<div>
<button class="px-4 py-2 bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-300 rounded-lg font-medium hover:bg-gray-200 dark:hover:bg-gray-600 transition">
Reset
</button>
</div>
</div>
</section>
<!-- KPI Section -->
<section class="mb-8">
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
<div class="bg-gradient-primary rounded-xl p-5 text-white">
<div class="flex justify-between items-start">
<div>
<p class="opacity-80">Total Duty</p>
<h2 class="text-2xl font-bold mt-1">$2.34M</h2>
</div>
<span class="mdi mdi-cash text-3xl opacity-60"></span>
</div>
<p class="mt-2 text-sm opacity-90">↑ 12.4% from last month</p>
</div>
<div class="bg-green-500 rounded-xl p-5 text-white">
<div class="flex justify-between items-start">
<div>
<p class="opacity-80">Avg Release Time</p>
<h2 class="text-2xl font-bold mt-1">38.2 hrs</h2>
</div>
<span class="mdi mdi-clock-outline text-3xl opacity-60"></span>
</div>
<p class="mt-2 text-sm opacity-90">↓ 2.3 days from Q2</p>
</div>
<div class="bg-yellow-500 rounded-xl p-5 text-white">
<div class="flex justify-between items-start">
<div>
<p class="opacity-80">Late Filings</p>
<h2 class="text-2xl font-bold mt-1">4.1%</h2>
</div>
<span class="mdi mdi-alert-circle-outline text-3xl opacity-60"></span>
</div>
<p class="mt-2 text-sm opacity-90">↑ 0.7% from Q2</p>
</div>
<div class="bg-purple-500 rounded-xl p-5 text-white">
<div class="flex justify-between items-start">
<div>
<p class="opacity-80">USMCA Savings</p>
<h2 class="text-2xl font-bold mt-1">$312K</h2>
</div>
<span class="mdi mdi-hand-coin text-3xl opacity-60"></span>
</div>
<p class="mt-2 text-sm opacity-90">↑ 21.7% YoY</p>
</div>
</div>
</section>
<!-- Charts Section -->
<section class="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8">
<!-- Pareto Chart -->
<div class="bg-card-light dark:bg-card rounded-xl shadow-md p-6 fade-in">
<div class="flex justify-between items-center mb-4">
<h3 class="text-lg font-semibold">Top HTS Codes by Duty Value</h3>
<div class="flex space-x-2">
<button class="p-2 rounded-lg bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600">
<span class="mdi mdi-filter"></span>
</button>
<button class="p-2 rounded-lg bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600">
<span class="mdi mdi-download"></span>
</button>
</div>
</div>
<div id="pareto-chart" class="h-80"></div>
</div>
<!-- Trend Lines -->
<div class="bg-card-light dark:bg-card rounded-xl shadow-md p-6 fade-in">
<div class="flex justify-between items-center mb-4">
<h3 class="text-lg font-semibold">Monthly Duty vs. Freight Spend</h3>
<div class="flex space-x-3 items-center">
<span class="text-sm">Show: </span>
<div class="flex space-x-1 bg-gray-100 dark:bg-gray-700 p-1 rounded-lg">
<button class="px-3 py-1 rounded-md bg-white dark:bg-gray-600 text-primary font-medium">Duty</button>
<button class="px-3 py-1 rounded-md text-gray-500 hover:text-gray-800 dark:hover:text-gray-200">Freight</button>
</div>
</div>
</div>
<div id="trend-chart" class="h-80"></div>
</div>
<!-- Heatmap -->
<div class="bg-card-light dark:bg-card rounded-xl shadow-md p-6 fade-in">
<div class="flex justify-between items-center mb-4">
<h3 class="text-lg font-semibold">Broker Workload Distribution</h3>
<div class="flex space-x-2 items-center">
<span class="text-sm">Broker:</span>
<select class="px-3 py-1 bg-gray-100 dark:bg-gray-700 rounded-lg text-sm">
<option>All Brokers</option>
<option>John D.</option>
<option>Sarah M.</option>
<option>Michael T.</option>
</select>
</div>
</div>
<div id="heatmap" class="h-80">
<div class="flex flex-col h-full">
<div class="flex mb-4">
<div class="w-32"></div>
<div class="flex-1 grid grid-cols-7 gap-1 text-center">
<span class="text-xs opacity-70">Mon</span>
<span class="text-xs opacity-70">Tue</span>
<span class="text-xs opacity-70">Wed</span>
<span class="text-xs opacity-70">Thu</span>
<span class="text-xs opacity-70">Fri</span>
<span class="text-xs opacity-70">Sat</span>
<span class="text-xs opacity-70">Sun</span>
</div>
</div>
<div class="flex-1 overflow-auto">
<div class="flex mb-1">
<div class="w-32 py-1 text-xs font-medium">Broker 1</div>
<div class="flex-1 grid grid-cols-7 gap-1">
<div class="heatmap-day bg-green-100 dark:bg-green-900 p-1" title="15 entries - Apr 1"><span class="text-xs">15</span></div>
<div class="heatmap-day bg-green-300 dark:bg-green-700 p-1" title="25 entries - Apr 2"><span class="text-xs">25</span></div>
<div class="heatmap-day bg-green-500 dark:bg-green-500 p-1" title="45 entries - Apr 3"><span class="text-xs">45</span></div>
<div class="heatmap-day bg-green-300 dark:bg-green-700 p-1" title="27 entries - Apr 4"><span class="text-xs">27</span></div>
<div class="heatmap-day bg-green-100 dark:bg-green-900 p-1" title="18 entries - Apr 5"><span class="text-xs">18</span></div>
<div class="heatmap-day bg-gray-100 dark:bg-gray-800 p-1"></div>
<div class="heatmap-day bg-gray-100 dark:bg-gray-800 p-1"></div>
</div>
</div>
<div class="flex mb-1">
<div class="w-32 py-1 text-xs font-medium">Broker 2</div>
<div class="flex-1 grid grid-cols-7 gap-1">
<div class="heatmap-day bg-green-100 dark:bg-green-900 p-1" title="22 entries - Apr 1"><span class="text-xs">22</span></div>
<div class="heatmap-day bg-green-500 dark:bg-green-500 p-1" title="38 entries - Apr 2"><span class="text-xs">38</span></div>
<div class="heatmap-day bg-green-300 dark:bg-green-700 p-1" title="29 entries - Apr 3"><span class="text-xs">29</span></div>
<div class="heatmap-day bg-green-500 dark:bg-green-500 p-1" title="41 entries - Apr 4"><span class="text-xs">41</span></div>
<div class="heatmap-day bg-green-300 dark:bg-green-700 p-1" title="32 entries - Apr 5"><span class="text-xs">32</span></div>
<div class="heatmap-day bg-gray-100 dark:bg-gray-800 p-1"></div>
<div class="heatmap-day bg-gray-100 dark:bg-gray-800 p-1"></div>
</div>
</div>
<div class="flex mb-1">
<div class="w-32 py-1 text-xs font-medium">Broker 3</div>
<div class="flex-1 grid grid-cols-7 gap-1">
<div class="heatmap-day bg-green-300 dark:bg-green-700 p-1" title="28 entries - Apr 1"><span class="text-xs">28</span></div>
<div class="heatmap-day bg-green-100 dark:bg-green-900 p-1" title="17 entries - Apr 2"><span class="text-xs">17</span></div>
<div class="heatmap-day bg-green-300 dark:bg-green-700 p-1" title="27 entries - Apr 3"><span class="text-xs">27</span></div>
<div class="heatmap-day bg-green-100 dark:bg-green-900 p-1" title="19 entries - Apr 4"><span class="text-xs">19</span></div>
<div class="heatmap-day bg-green-500 dark:bg-green-500 p-1" title="39 entries - Apr 5"><span class="text-xs">39</span></div>
<div class="heatmap-day bg-gray-100 dark:bg-gray-800 p-1"></div>
<div class="heatmap-day bg-gray-100 dark:bg-gray-800 p-1"></div>
</div>
</div>
<div class="flex mb-1">
<div class="w-32 py-1 text-xs font-medium">Broker 4</div>
<div class="flex-1 grid grid-cols-7 gap-1">
<div class="heatmap-day bg-green-500 dark:bg-green-500 p-1" title="40 entries - Apr 1"><span class="text-xs">40</span></div>
<div class="heatmap-day bg-green-100 dark:bg-green-900 p-1" title="14 entries - Apr 2"><span class="text-xs">14</span></div>
<div class="heatmap-day bg-green-300 dark:bg-green-700 p-1" title="33 entries - Apr 3"><span class="text-xs">33</span></div>
<div class="heatmap-day bg-green-300 dark:bg-green-700 p-1" title="31 entries - Apr 4"><span class="text-xs">31</span></div>
<div class="heatmap-day bg-green-100 dark:bg-green-900 p-1" title="18 entries - Apr 5"><span class="text-xs">18</span></div>
<div class="heatmap-day bg-gray-100 dark:bg-gray-800 p-1"></div>
<div class="heatmap-day bg-gray-100 dark:bg-gray-800 p-1"></div>
</div>
</div>
</div>
<div class="mt-3 flex items-center justify-center">
<div class="flex items-center text-xs">
<span class="mr-2">Entries per day:</span>
<div class="h-4 w-4 bg-green-100 dark:bg-green-900 mr-1"></div>
<span>0-20</span>
<div class="h-4 w-4 bg-green-300 dark:bg-green-700 mx-1"></div>
<span>21-30</span>
<div class="h-4 w-4 bg-green-500 dark:bg-green-500 ml-1"></div>
<span>31+</span>
</div>
</div>
</div>
</div>
</div>
<!-- Cycle Time Funnel -->
<div class="bg-card-light dark:bg-card rounded-xl shadow-md p-6 fade-in">
<div class="flex justify-between items-center mb-4">
<h3 class="text-lg font-semibold">Entry Cycle Time Analysis</h3>
<div class="flex items-center">
<span class="text-xs mr-2">Avg:</span>
<span class="font-semibold text-primary">42 hrs</span>
</div>
</div>
<div class="h-80 flex items-center justify-center">
<div id="funnel-chart" class="w-full h-full"></div>
</div>
</div>
<!-- Geo Map -->
<div class="bg-card-light dark:bg-card rounded-xl shadow-md p-6 fade-in">
<div class="flex justify-between items-center mb-4">
<h3 class="text-lg font-semibold">Port Dwell Time Analysis</h3>
<div class="flex items-center">
<span class="text-xs mr-2">Data: </span>
<div class="flex bg-gray-100 dark:bg-gray-700 p-1 rounded-lg">
<button class="px-2 py-1 rounded-md bg-white dark:bg-gray-600 text-primary font-medium text-xs">Days</button>
<button class="px-2 py-1 rounded-md text-xs text-gray-500 hover:text-gray-800 dark:hover:text-gray-200">Hours</button>
</div>
</div>
</div>
<div id="geo-chart" class="h-80"></div>
</div>
<!-- What If Panel -->
<div class="bg-card-light dark:bg-card rounded-xl shadow-md p-6 fade-in">
<div class="flex justify-between items-center mb-4">
<h3 class="text-lg font-semibold">Mode Shift Impact Simulation</h3>
<div class="flex items-center">
<button class="px-3 py-1 bg-primary text-white text-sm rounded-lg">Apply</button>
</div>
</div>
<div class="h-80">
<div class="mb-6">
<div class="flex justify-between text-sm mb-2">
<span>Shift Volume from Ocean to Air</span>
<span class="font-medium">15%</span>
</div>
<input type="range" min="0" max="30" value="15" class="w-full h-2 bg-gray-200 dark:bg-gray-700 rounded-lg appearance-none cursor-pointer">
</div>
<div class="grid grid-cols-2 gap-6 mt-8">
<div class="bg-gray-50 dark:bg-gray-800 rounded-lg p-4">
<div class="text-center mb-3">
<span class="mdi mdi-ship text-3xl text-blue-500"></span>
<h4 class="font-semibold mt-1">Ocean Impact</h4>
</div>
<div class="space-y-2">
<div class="flex justify-between text-sm">
<span>Duty Cost:</span>
<span class="font-medium text-red-500">+ $47,800</span>
</div>
<div class="flex justify-between text-sm">
<span>Brokerage Fee:</span>
<span class="font-medium text-red-500">+ $12,300</span>
</div>
<div class="flex justify-between text-sm">
<span>MPF:</span>
<span class="font-medium text-red-500">+ $8,200</span>
</div>
</div>
</div>
<div class="bg-gray-50 dark:bg-gray-800 rounded-lg p-4">
<div class="text-center mb-3">
<span class="mdi mdi-airplane text-3xl text-purple-500"></span>
<h4 class="font-semibold mt-1">Air Impact</h4>
</div>
<div class="space-y-2">
<div class="flex justify-between text-sm">
<span>Release Time:</span>
<span class="font-medium text-green-500">-16 hours</span>
</div>
<div class="flex justify-between text-sm">
<span>Storage Costs:</span>
<span class="font-medium text-green-500">- $28,900</span>
</div>
<div class="flex justify-between text-sm">
<span>Demurrage:</span>
<span class="font-medium text-green-500">- $5,700</span>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Outlier Table -->
<section class="mb-8">
<div class="bg-card-light dark:bg-card rounded-xl shadow-md p-6 fade-in">
<div class="flex justify-between items-center mb-4">
<h3 class="text-lg font-semibold">Compliance Outliers & Exceptions</h3>
<div class="flex space-x-2">
<button class="px-3 py-1 text-sm border border-primary text-primary rounded-lg">Filter by Status</button>
<button class="px-3 py-1 text-sm bg-primary text-white rounded-lg">
<span class="mdi mdi-plus mr-1"></span> New
</button>
</div>
</div>
<div class="overflow-x-auto">
<table class="w-full text-sm">
<thead class="border-b border-gray-200 dark:border-gray-700">
<tr>
<th class="py-3 px-4 text-left font-medium">Entry No.</th>
<th class="py-3 px-4 text-left font-medium">Issue Type</th>
<th class="py-3 px-4 text-left font-medium">HTS Code</th>
<th class="py-3 px-4 text-left font-medium">Declared Value</th>
<th class="py-3 px-4 text-left font-medium">Duty Paid</th>
<th class="py-3 px-4 text-left font-medium">Country</th>
<th class="py-3 px-4 text-left font-medium">Status</th>
<th class="py-3 px-4 text-left font-medium">Actions</th>
</tr>
</thead>
<tbody>
<tr class="outlier-row hover:bg-gray-50 dark:hover:bg-gray-800">
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">
<div>IT-2024-007156</div>
<div class="text-xs opacity-60">04/05/2024</div>
</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">
<span class="px-2 py-1 rounded-full bg-red-100 dark:bg-red-900 text-red-700 dark:text-red-300 text-xs">Missing Value</span>
</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">8471.70.51</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">$0.00</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">$0.00</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">CN</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">
<span class="px-2 py-1 rounded-full bg-yellow-100 dark:bg-yellow-900 text-yellow-700 dark:text-yellow-300 text-xs">Review Needed</span>
</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">
<button class="text-primary hover:text-blue-700 mr-2">
<span class="mdi mdi-pencil"></span>
</button>
<button class="text-green-500 hover:text-green-700">
<span class="mdi mdi-check"></span>
</button>
</td>
</tr>
<tr class="outlier-row hover:bg-gray-50 dark:hover:bg-gray-800">
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">
<div>IT-2024-008932</div>
<div class="text-xs opacity-60">04/03/2024</div>
</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">
<span class="px-2 py-1 rounded-full bg-red-100 dark:bg-red-900 text-red-700 dark:text-red-300 text-xs">Late Filing</span>
</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">6204.62.20</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">$21,450.00</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">$4,290.00</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">MX</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">
<span class="px-2 py-1 rounded-full bg-blue-100 dark:bg-blue-900 text-blue-700 dark:text-blue-300 text-xs">In Progress</span>
</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">
<button class="text-primary hover:text-blue-700 mr-2">
<span class="mdi mdi-pencil"></span>
</button>
<button class="text-green-500 hover:text-green-700">
<span class="mdi mdi-check"></span>
</button>
</td>
</tr>
<tr class="outlier-row hover:bg-gray-50 dark:hover:bg-gray-800">
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">
<div>IT-2024-009451</div>
<div class="text-xs opacity-60">04/06/2024</div>
</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">
<span class="px-2 py-1 rounded-full bg-red-100 dark:bg-red-900 text-red-700 dark:text-red-300 text-xs">Duplicate Entry</span>
</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">6402.19.05</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">$15,200.00</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">$1,520.00</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">VN</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">
<span class="px-2 py-1 rounded-full bg-yellow-100 dark:bg-yellow-900 text-yellow-700 dark:text-yellow-300 text-xs">Review Needed</span>
</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">
<button class="text-primary hover:text-blue-700 mr-2">
<span class="mdi mdi-pencil"></span>
</button>
<button class="text-green-500 hover:text-green-700">
<span class="mdi mdi-check"></span>
</button>
</td>
</tr>
<tr class="outlier-row hover:bg-gray-50 dark:hover:bg-gray-800">
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">
<div>IT-2024-010823</div>
<div class="text-xs opacity-60">04/02/2024</div>
</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">
<span class="px-2 py-1 rounded-full bg-red-100 dark:bg-red-900 text-red-700 dark:text-red-300 text-xs">USMCA Claim Issue</span>
</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">8708.29.50</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">$82,300.00</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">$8,230.00</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">CA</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">
<span class="px-2 py-1 rounded-full bg-green-100 dark:bg-green-900 text-green-700 dark:text-green-300 text-xs">Resolved</span>
</td>
<td class="py-3 px-4 border-b border-gray-100 dark:border-gray-800">
<button class="text-gray-500 hover:text-gray-700 mr-2" title="Edit">
<span class="mdi mdi-eye"></span>
</button>
<button class="text-red-500 hover:text-red-700" title="Delete">
<span class="mdi mdi-delete"></span>
</button>
</td>
</tr>
</tbody>
</table>
</div>
<div class="mt-4 flex justify-between items-center">
<div class="text-sm opacity-70">
Showing 4 of 37 outliers
</div>
<div class="flex space-x-2">
<button class="px-3 py-1 border border-gray-300 dark:border-gray-600 rounded-lg">Previous</button>
<button class="px-3 py-1 bg-primary text-white rounded-lg">Next</button>
</div>
</div>
</div>
</section>
<!-- Download Center -->
<section class="bg-card-light dark:bg-card rounded-xl shadow-md p-6 fade-in">
<h3 class="text-lg font-semibold mb-4">Download Center</h3>
<div class="grid grid-cols-1 md:grid-cols-4 gap-4">
<div class="border border-gray-200 dark:border-gray-700 rounded-lg p-4 hover:shadow-md transition">
<div class="flex justify-between items-start mb-3">
<span class="mdi mdi-file-document-outline text-3xl text-primary"></span>
<span class="px-2 py-1 bg-gray-100 dark:bg-gray-800 text-xs rounded">CSV</span>
</div>
<h4 class="font-medium mb-1">Transaction Report</h4>
<p class="text-sm opacity-70 mb-3">All entries for current period</p>
<button class="w-full py-2 bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 rounded-lg text-sm">
Download (124K rows)
</button>
</div>
<div class="border border-gray-200 dark:border-gray-700 rounded-lg p-4 hover:shadow-md transition">
<div class="flex justify-between items-start mb-3">
<span class="mdi mdi-finance text-3xl text-green-500"></span>
<span class="px-2 py-1 bg-gray-100 dark:bg-gray-800 text-xs rounded">CSV</span>
</div>
<h4 class="font-medium mb-1">Duty Analysis</h4>
<p class="text-sm opacity-70 mb-3">By HTS, value and duty rate</p>
<button class="w-full py-2 bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 rounded-lg text-sm">
Download (22K rows)
</button>
</div>
<div class="border border-gray-200 dark:border-gray-700 rounded-lg p-4 hover:shadow-md transition">
<div class="flex justify-between items-start mb-3">
<span class="mdi mdi-timetable text-3xl text-purple-500"></span>
<span class="px-2 py-1 bg-gray-100 dark:bg-gray-800 text-xs rounded">CSV</span>
</div>
<h4 class="font-medium mb-1">Cycle Time Report</h4>
<p class="text-sm opacity-70 mb-3">Entry milestone times</p>
<button class="w-full py-2 bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 rounded-lg text-sm">
Download (18K rows)
</button>
</div>
<div class="border border-gray-200 dark:border-gray-700 rounded-lg p-4 hover:shadow-md transition">
<div class="flex justify-between items-start mb-3">
<span class="mdi mdi-chart-box-outline text-3xl text-orange-500"></span>
<span class="px-2 py-1 bg-gray-100 dark:bg-gray-800 text-xs rounded">PNG</span>
</div>
<h4 class="font-medium mb-1">Dashboard Export</h4>
<p class="text-sm opacity-70 mb-3">Full dashboard as image</p>
<button class="w-full py-2 bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 rounded-lg text-sm">
Download Image
</button>
</div>
</div>
</section>
</main>
<footer class="mt-12 py-6 bg-gray-50 dark:bg-gray-800">
<div class="container mx-auto px-4 text-center text-sm opacity-80">
<p>Customs Brokerage Analytics Dashboard v1.0 - Synthesized data from 50,000 customs entry records</p>
<p class="mt-2">© 2024 Global Trade Analytics. All rights reserved.</p>
</div>
</footer>
<script>
// Initialize date range picker
flatpickr("#date-range", {
mode: "range",
dateFormat: "M j, Y",
defaultDate: ["2024-03-01", "2024-04-15"]
});
// Theme toggle
document.getElementById('theme-toggle').addEventListener('click', function() {
document.documentElement.classList.toggle('dark');
localStorage.setItem('theme', document.documentElement.classList.contains('dark') ? 'dark' : 'light');
});
// Load saved theme preference
if (localStorage.getItem('theme') === 'dark') {
document.documentElement.classList.add('dark');
}
// Initialize charts with sample data
document.addEventListener('DOMContentLoaded', function() {
// Pareto Chart
Plotly.newPlot('pareto-chart', [{
x: ['8471.70.51', '6204.62.20', '6402.19.05', '8708.29.50', '3926.90.85', '8517.62.00', '6307.90.98', '2936.90.50', '9403.70.80', '3402.20.90'],
y: [342800, 312400, 284500, 265300, 243100, 221700, 204800, 192400, 187500, 173200],
type: 'bar',
marker: {
color: '#1a56db'
},
name: 'Duty Paid'
}], {
title: false,
margin: {t: 10, l: 50, r: 20, b: 90},
xaxis: {
tickangle: -45
},
yaxis: {
title: 'USD'
},
plot_bgcolor: 'transparent',
paper_bgcolor: 'transparent',
font: {
family: 'inherit',
color: 'inherit'
}
});
// Trend Chart
const months = ['Oct', 'Nov', 'Dec', 'Jan', 'Feb', 'Mar'];
Plotly.newPlot('trend-chart', [{
x: months,
y: [1.12, 1.28, 1.65, 1.92, 2.12, 2.34],
type: 'scatter',
mode: 'lines+markers',
marker: {
color: '#1a56db',
size: 8
},
line: {
color: '#1a56db',
width: 3
},
name: 'Duty Paid (Millions)'
}, {
x: months,
y: [0.84, 0.89, 0.94, 0.92, 0.96, 1.02],
type: 'scatter',
mode: 'lines+markers',
marker: {
color: '#7e3af2',
size: 8
},
line: {
color: '#7e3af2',
width: 3
},
yaxis: 'y2',
name: 'Freight Spend (Millions)'
}], {
title: false,
margin: {t: 10, l: 50, r: 50, b: 50},
plot_bgcolor: 'transparent',
paper_bgcolor: 'transparent',
font: {
family: 'inherit',
color: 'inherit'
},
yaxis: {
title: 'Duty Paid',
showgrid: true,
gridcolor: 'rgba(0,0,0,0.1)'
},
yaxis2: {
title: 'Freight Spend',
overlaying: 'y',
side: 'right',
showgrid: false
},
legend: {
x: 0.5,
y: 1.2,
xanchor: 'center',
orientation: 'h'
}
});
// Funnel Chart
const funnelStages = ['Arrival', 'ISF Filed', 'Entry Filed', 'CBP Release', 'Delivery'];
const funnelValues = [50000, 49200, 48600, 48150, 47800];
const avgTimes = ['-', '12h', '18h', '8h', '4h'];
let funnelData = [];
for (let i = 0; i < funnelStages.length; i++) {
funnelData.push({
type: 'funnel',
name: funnelStages[i],
y: [funnelStages[i] + ' ' + avgTimes[i]],
x: [funnelValues[i]],
textinfo: "value+percent initial",
marker: {
color: ['#7e3af2', '#1a56db', '#0e9f6e', '#f05f14', '#e02424'][i]
},
hoverinfo: 'name+text'
});
}
Plotly.newPlot('funnel-chart', funnelData, {
title: false,
margin: {t: 30, l: 0, r: 0, b: 30},
funnelmode: 'stack',
showlegend: false,
plot_bgcolor: 'transparent',
paper_bgcolor: 'transparent',
font: {
family: 'inherit',
color: 'inherit'
}
});
// Geo Chart
const ports = [
{name: 'New York', lat: 40.7, lon: -74, value: 4.2},
{name: 'Los Angeles', lat: 34.05, lon: -118.25, value: 5.7},
{name: 'Chicago', lat: 41.88, lon: -87.63, value: 2.8},
{name: 'Houston', lat: 29.76, lon: -95.37, value: 3.4},
{name: 'Miami', lat: 25.76, lon: -80.19, value: 4.5},
{name: 'Seattle', lat: 47.61, lon: -122.33, value: 3.9},
{name: 'Montreal', lat: 45.50, lon: -73.56, value: 3.1},
{name: 'Vancouver', lat: 49.25, lon: -123.12, value: 3.3},
{name: 'Toronto', lat: 43.65, lon: -79.38, value: 2.6}
];
const portData = ports.map(p => ({
type: 'scattergeo',
mode: 'markers',
lat: [p.lat],
lon: [p.lon],
text: [`${p.name}: ${p.value} days`],
marker: {
size: p.value * 6,
color: p.value > 4.5 ? '#f05f14' : (p.value > 3.5 ? '#1a56db' : '#0e9f6e'),
opacity: 0.8,
line: {
width: 1,
color: '#ffffff'
}
},
name: p.name
}));
const geoLayout = {
geo: {
scope: 'north america',
showcountries: true,
countrycolor: '#cccccc',
showland: true,
landcolor: 'rgba(200, 200, 200, 0.2)',
showocean: true,
oceancolor: 'rgba(64, 164, 223, 0.1)',
projection: {
type: 'natural earth'
},
center: {
lat: 45,
lon: -95
}
},
margin: {t: 10, l: 0, r: 0, b: 0},
showlegend: false,
paper_bgcolor: 'transparent'
};
Plotly.newPlot('geo-chart', portData, geoLayout);
});
</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=anonymous111110987654321/customs-brokerage-analytics" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
</html>