Spaces:
Running
Running
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
<title>AutoParts Forecast Pro</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"> | |
<style> | |
.gradient-bg { | |
background: linear-gradient(135deg, #1e3a8a 0%, #0ea5e9 100%); | |
} | |
.chart-container { | |
height: 400px; | |
position: relative; | |
} | |
.highlight-cell { | |
animation: pulse 2s infinite; | |
} | |
@keyframes pulse { | |
0% { background-color: rgba(239, 68, 68, 0.1); } | |
50% { background-color: rgba(239, 68, 68, 0.3); } | |
100% { background-color: rgba(239, 68, 68, 0.1); } | |
} | |
.file-upload { | |
border: 2px dashed #cbd5e0; | |
transition: all 0.3s ease; | |
} | |
.file-upload:hover { | |
border-color: #3b82f6; | |
background-color: #f8fafc; | |
} | |
.tag-input { | |
display: flex; | |
flex-wrap: wrap; | |
align-items: center; | |
gap: 0.5rem; | |
padding: 0.5rem; | |
border: 1px solid #d1d5db; | |
border-radius: 0.375rem; | |
min-height: 2.5rem; | |
} | |
.tag { | |
background-color: #e0e7ff; | |
color: #4f46e5; | |
padding: 0.25rem 0.5rem; | |
border-radius: 9999px; | |
display: flex; | |
align-items: center; | |
font-size: 0.875rem; | |
} | |
.tag-remove { | |
margin-left: 0.25rem; | |
cursor: pointer; | |
} | |
</style> | |
</head> | |
<body class="bg-gray-50 font-sans"> | |
<div class="min-h-screen flex flex-col"> | |
<!-- Header --> | |
<header class="gradient-bg text-white shadow-lg"> | |
<div class="container mx-auto px-4 py-6"> | |
<div class="flex justify-between items-center"> | |
<div class="flex items-center space-x-3"> | |
<i class="fas fa-car-side text-3xl"></i> | |
<h1 class="text-2xl font-bold">AutoParts Forecast Pro</h1> | |
</div> | |
<nav> | |
<ul class="flex space-x-6"> | |
<li><a href="#" class="hover:text-blue-200 transition"><i class="fas fa-home mr-1"></i> Home</a></li> | |
<li><a href="#" class="hover:text-blue-200 transition"><i class="fas fa-chart-line mr-1"></i> Analytics</a></li> | |
<li><a href="#" class="hover:text-blue-200 transition"><i class="fas fa-cog mr-1"></i> Settings</a></li> | |
</ul> | |
</nav> | |
</div> | |
</div> | |
</header> | |
<!-- Main Content --> | |
<main class="flex-grow container mx-auto px-4 py-8"> | |
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8"> | |
<!-- Left Sidebar - Data Input --> | |
<div class="lg:col-span-1 space-y-6"> | |
<div class="bg-white rounded-xl shadow-md p-6"> | |
<h2 class="text-xl font-semibold text-gray-800 mb-4 flex items-center"> | |
<i class="fas fa-database mr-2 text-blue-500"></i> Data Input | |
</h2> | |
<!-- File Upload --> | |
<div class="file-upload rounded-lg p-4 mb-6 text-center cursor-pointer"> | |
<input type="file" id="salesData" class="hidden" accept=".csv,.xlsx,.xls"> | |
<label for="salesData" class="cursor-pointer"> | |
<i class="fas fa-file-upload text-4xl text-blue-400 mb-2"></i> | |
<p class="font-medium text-gray-700">Upload Sales Data</p> | |
<p class="text-sm text-gray-500 mt-1">CSV or Excel format</p> | |
</label> | |
</div> | |
<div class="file-upload rounded-lg p-4 mb-6 text-center cursor-pointer"> | |
<input type="file" id="carParcData" class="hidden" accept=".csv,.xlsx,.xls"> | |
<label for="carParcData" class="cursor-pointer"> | |
<i class="fas fa-car text-4xl text-blue-400 mb-2"></i> | |
<p class="font-medium text-gray-700">Upload Car Parc Data</p> | |
<p class="text-sm text-gray-500 mt-1">Vehicle population statistics</p> | |
</label> | |
</div> | |
<!-- Parameters --> | |
<div class="space-y-4"> | |
<h3 class="font-medium text-gray-700 flex items-center"> | |
<i class="fas fa-sliders-h mr-2 text-blue-500"></i> Forecast Parameters | |
</h3> | |
<div> | |
<label for="forecastPeriod" class="block text-sm font-medium text-gray-700 mb-1">Forecast Period (months)</label> | |
<select id="forecastPeriod" class="w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500"> | |
<option>6</option> | |
<option selected>12</option> | |
<option>18</option> | |
<option>24</option> | |
</select> | |
</div> | |
<div> | |
<label for="category" class="block text-sm font-medium text-gray-700 mb-1">Product Categories</label> | |
<div class="tag-input" id="categoryContainer"> | |
<input type="text" id="categoryInput" class="flex-grow outline-none bg-transparent" placeholder="Add a category..."> | |
</div> | |
<p class="text-xs text-gray-500 mt-1">Press Enter to add a category</p> | |
</div> | |
<div> | |
<label for="region" class="block text-sm font-medium text-gray-700 mb-1">Region</label> | |
<select id="region" class="w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500"> | |
<option>Global</option> | |
<option>North America</option> | |
<option>Europe</option> | |
<option>Asia Pacific</option> | |
<option>Latin America</option> | |
<option>Middle East & Africa</option> | |
<option>North America - USA</option> | |
<option>North America - Canada</option> | |
<option>Europe - Western</option> | |
<option>Europe - Eastern</option> | |
<option>Asia - China</option> | |
<option>Asia - Japan</option> | |
<option>Asia - India</option> | |
</select> | |
</div> | |
<button id="generateForecast" class="w-full bg-blue-600 hover:bg-blue-700 text-white font-medium py-2 px-4 rounded-md transition flex items-center justify-center"> | |
<i class="fas fa-bolt mr-2"></i> Generate Forecast | |
</button> | |
</div> | |
</div> | |
<!-- Data Preview --> | |
<div class="bg-white rounded-xl shadow-md p-6"> | |
<h2 class="text-xl font-semibold text-gray-800 mb-4 flex items-center"> | |
<i class="fas fa-table mr-2 text-blue-500"></i> Data Preview | |
</h2> | |
<div class="overflow-x-auto"> | |
<table class="min-w-full divide-y divide-gray-200"> | |
<thead class="bg-gray-50"> | |
<tr> | |
<th class="px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase">Month</th> | |
<th class="px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase">Sales</th> | |
</tr> | |
</thead> | |
<tbody id="dataPreview" class="bg-white divide-y divide-gray-200"> | |
<tr><td colspan="2" class="px-4 py-4 text-sm text-gray-500 text-center">Upload data to preview</td></tr> | |
</tbody> | |
</table> | |
</div> | |
</div> | |
</div> | |
<!-- Main Content - Results --> | |
<div class="lg:col-span-2 space-y-6"> | |
<!-- Forecast Summary --> | |
<div class="bg-white rounded-xl shadow-md p-6"> | |
<div class="flex justify-between items-center mb-6"> | |
<h2 class="text-xl font-semibold text-gray-800 flex items-center"> | |
<i class="fas fa-chart-bar mr-2 text-blue-500"></i> Forecast Summary | |
</h2> | |
<div class="flex space-x-2"> | |
<button class="bg-gray-100 hover:bg-gray-200 text-gray-700 px-3 py-1 rounded-md text-sm flex items-center"> | |
<i class="fas fa-download mr-1"></i> Export | |
</button> | |
<button class="bg-gray-100 hover:bg-gray-200 text-gray-700 px-3 py-1 rounded-md text-sm flex items-center"> | |
<i class="fas fa-print mr-1"></i> Print | |
</button> | |
</div> | |
</div> | |
<!-- Key Metrics --> | |
<div class="grid grid-cols-1 md:grid-cols-3 gap-4 mb-6"> | |
<div class="bg-blue-50 p-4 rounded-lg border border-blue-100"> | |
<p class="text-sm text-blue-600 font-medium">Projected Growth</p> | |
<p class="text-2xl font-bold text-blue-800">+12.5%</p> | |
<p class="text-xs text-blue-500">vs previous period</p> | |
</div> | |
<div class="bg-green-50 p-4 rounded-lg border border-green-100"> | |
<p class="text-sm text-green-600 font-medium">Market Coverage</p> | |
<p class="text-2xl font-bold text-green-800">78%</p> | |
<p class="text-xs text-green-500">of vehicle parc</p> | |
</div> | |
<div class="bg-purple-50 p-4 rounded-lg border border-purple-100"> | |
<p class="text-sm text-purple-600 font-medium">Potential Revenue</p> | |
<p class="text-2xl font-bold text-purple-800">$2.4M</p> | |
<p class="text-xs text-purple-500">next 12 months</p> | |
</div> | |
</div> | |
<!-- Chart --> | |
<div class="chart-container mb-6"> | |
<canvas id="forecastChart"></canvas> | |
</div> | |
<!-- Coverage Gaps --> | |
<div> | |
<h3 class="font-medium text-gray-700 mb-3 flex items-center"> | |
<i class="fas fa-exclamation-triangle mr-2 text-yellow-500"></i> Coverage Gaps | |
</h3> | |
<div class="overflow-x-auto"> | |
<table class="min-w-full divide-y divide-gray-200"> | |
<thead class="bg-gray-50"> | |
<tr> | |
<th class="px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase">Vehicle Make</th> | |
<th class="px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase">Model</th> | |
<th class="px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase">Year Range</th> | |
<th class="px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase">Parc Size</th> | |
<th class="px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase">Current Coverage</th> | |
<th class="px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase">Potential</th> | |
</tr> | |
</thead> | |
<tbody id="coverageGaps" class="bg-white divide-y divide-gray-200"> | |
<tr class="highlight-cell"> | |
<td class="px-4 py-3 text-sm font-medium text-gray-900">Honda</td> | |
<td class="px-4 py-3 text-sm text-gray-500">Accord</td> | |
<td class="px-4 py-3 text-sm text-gray-500">2018-2022</td> | |
<td class="px-4 py-3 text-sm text-gray-500">1,240,000</td> | |
<td class="px-4 py-3 text-sm text-red-500 font-medium">32%</td> | |
<td class="px-4 py-3 text-sm text-green-600 font-medium">$420K</td> | |
</tr> | |
<tr> | |
<td class="px-4 py-3 text-sm font-medium text-gray-900">Toyota</td> | |
<td class="px-4 py-3 text-sm text-gray-500">Camry</td> | |
<td class="px-4 py-3 text-sm text-gray-500">2017-2021</td> | |
<td class="px-4 py-3 text-sm text-gray-500">1,150,000</td> | |
<td class="px-4 py-3 text-sm text-yellow-500 font-medium">58%</td> | |
<td class="px-4 py-3 text-sm text-green-600 font-medium">$310K</td> | |
</tr> | |
<tr class="highlight-cell"> | |
<td class="px-4 py-3 text-sm font-medium text-gray-900">Volkswagen</td> | |
<td class="px-4 py-3 text-sm text-gray-500">Golf</td> | |
<td class="px-4 py-3 text-sm text-gray-500">2015-2020</td> | |
<td class="px-4 py-3 text-sm text-gray-500">2,850,000</td> | |
<td class="px-4 py-3 text-sm text-red-500 font-medium">28%</td> | |
<td class="px-4 py-3 text-sm text-green-600 font-medium">$780K</td> | |
</tr> | |
</tbody> | |
</table> | |
</div> | |
</div> | |
</div> | |
<!-- Recommendations --> | |
<div class="bg-white rounded-xl shadow-md p-6"> | |
<h2 class="text-xl font-semibold text-gray-800 mb-4 flex items-center"> | |
<i class="fas fa-lightbulb mr-2 text-yellow-500"></i> Strategic Recommendations | |
</h2> | |
<div class="space-y-4"> | |
<div class="flex items-start"> | |
<div class="flex-shrink-0 bg-yellow-100 p-2 rounded-full mr-3"> | |
<i class="fas fa-box-open text-yellow-600"></i> | |
</div> | |
<div> | |
<h4 class="font-medium text-gray-800">Expand Product Line</h4> | |
<p class="text-sm text-gray-600">Develop parts for Honda Accord 2018-2022 models to capture estimated $420K in potential revenue from this segment.</p> | |
</div> | |
</div> | |
<div class="flex items-start"> | |
<div class="flex-shrink-0 bg-blue-100 p-2 rounded-full mr-3"> | |
<i class="fas fa-percentage text-blue-600"></i> | |
</div> | |
<div> | |
<h4 class="font-medium text-gray-800">Promotional Campaign</h4> | |
<p class="text-sm text-gray-600">Target Volkswagen Golf owners with special bundle offers to increase market penetration from current 28% to at least 45%.</p> | |
</div> | |
</div> | |
<div class="flex items-start"> | |
<div class="flex-shrink-0 bg-green-100 p-2 rounded-full mr-3"> | |
<i class="fas fa-store text-green-600"></i> | |
</div> | |
<div> | |
<h4 class="font-medium text-gray-800">Distribution Strategy</h4> | |
<p class="text-sm text-gray-600">Prioritize partnerships with retailers in regions with high concentrations of under-served vehicle models.</p> | |
</div> | |
</div> | |
</div> | |
</div> | |
</div> | |
</div> | |
</main> | |
<!-- Footer --> | |
<footer class="bg-gray-800 text-white py-6"> | |
<div class="container mx-auto px-4"> | |
<div class="flex flex-col md:flex-row justify-between items-center"> | |
<div class="mb-4 md:mb-0"> | |
<p class="text-sm">© 2023 AutoParts Forecast Pro. All rights reserved.</p> | |
</div> | |
<div class="flex space-x-4"> | |
<a href="#" class="text-gray-300 hover:text-white transition"> | |
<i class="fab fa-facebook-f"></i> | |
</a> | |
<a href="#" class="text-gray-300 hover:text-white transition"> | |
<i class="fab fa-twitter"></i> | |
</a> | |
<a href="#" class="text-gray-300 hover:text-white transition"> | |
<i class="fab fa-linkedin-in"></i> | |
</a> | |
</div> | |
</div> | |
</div> | |
</footer> | |
</div> | |
<!-- Chart.js --> | |
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script> | |
<script> | |
document.addEventListener('DOMContentLoaded', function() { | |
// Initialize chart | |
const ctx = document.getElementById('forecastChart').getContext('2d'); | |
const forecastChart = new Chart(ctx, { | |
type: 'line', | |
data: { | |
labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], | |
datasets: [ | |
{ | |
label: 'Historical Sales', | |
data: [120, 135, 142, 148, 155, 162, 158, 165, 172, 180, 188, 195], | |
borderColor: '#9CA3AF', | |
backgroundColor: 'transparent', | |
borderWidth: 2, | |
borderDash: [5, 5], | |
tension: 0.1 | |
}, | |
{ | |
label: 'Forecasted Sales', | |
data: [195, 205, 215, 225, 235, 245, 255, 265, 275, 285, 295, 305], | |
borderColor: '#3B82F6', | |
backgroundColor: 'transparent', | |
borderWidth: 3, | |
tension: 0.1 | |
} | |
] | |
}, | |
options: { | |
responsive: true, | |
maintainAspectRatio: false, | |
plugins: { | |
legend: { | |
position: 'top', | |
}, | |
tooltip: { | |
mode: 'index', | |
intersect: false, | |
} | |
}, | |
scales: { | |
y: { | |
beginAtZero: false, | |
title: { | |
display: true, | |
text: 'Sales Volume' | |
} | |
} | |
} | |
} | |
}); | |
// Tag input functionality for categories | |
const categoryContainer = document.getElementById('categoryContainer'); | |
const categoryInput = document.getElementById('categoryInput'); | |
const categories = new Set(); | |
categoryInput.addEventListener('keydown', function(e) { | |
if (e.key === 'Enter' && this.value.trim() !== '') { | |
const category = this.value.trim(); | |
if (!categories.has(category)) { | |
categories.add(category); | |
addCategoryTag(category); | |
this.value = ''; | |
} | |
} | |
}); | |
function addCategoryTag(category) { | |
const tag = document.createElement('div'); | |
tag.className = 'tag'; | |
tag.innerHTML = ` | |
${category} | |
<span class="tag-remove" data-category="${category}"> | |
<i class="fas fa-times"></i> | |
</span> | |
`; | |
categoryContainer.insertBefore(tag, categoryInput); | |
// Add remove functionality | |
tag.querySelector('.tag-remove').addEventListener('click', function() { | |
categories.delete(this.dataset.category); | |
tag.remove(); | |
}); | |
} | |
// File upload preview | |
document.getElementById('salesData').addEventListener('change', function(e) { | |
const file = e.target.files[0]; | |
if (file) { | |
// Simulate data processing | |
setTimeout(() => { | |
const previewBody = document.getElementById('dataPreview'); | |
previewBody.innerHTML = ` | |
<tr> | |
<td class="px-4 py-2 text-sm font-medium text-gray-900">Jan 2023</td> | |
<td class="px-4 py-2 text-sm text-gray-500">120</td> | |
</tr> | |
<tr> | |
<td class="px-4 py-2 text-sm font-medium text-gray-900">Feb 2023</td> | |
<td class="px-4 py-2 text-sm text-gray-500">135</td> | |
</tr> | |
<tr> | |
<td class="px-4 py-2 text-sm font-medium text-gray-900">Mar 2023</td> | |
<td class="px-4 py-2 text-sm text-gray-500">142</td> | |
</tr> | |
<tr> | |
<td class="px-4 py-2 text-sm font-medium text-gray-900">Apr 2023</td> | |
<td class="px-4 py-2 text-sm text-gray-500">148</td> | |
</tr> | |
<tr> | |
<td class="px-4 py-2 text-sm font-medium text-gray-900">May 2023</td> | |
<td class="px-4 py-2 text-sm text-gray-500">155</td> | |
</tr> | |
`; | |
}, 1000); | |
} | |
}); | |
// Generate forecast button | |
document.getElementById('generateForecast').addEventListener('click', function() { | |
// Show loading state | |
this.innerHTML = '<i class="fas fa-spinner fa-spin mr-2"></i> Processing...'; | |
this.disabled = true; | |
// Simulate forecast generation | |
setTimeout(() => { | |
// Update chart with new data | |
forecastChart.data.datasets[1].data = [210, 225, 240, 255, 270, 285, 300, 315, 330, 345, 360, 375]; | |
forecastChart.update(); | |
// Reset button | |
this.innerHTML = '<i class="fas fa-check mr-2"></i> Forecast Generated'; | |
setTimeout(() => { | |
this.innerHTML = '<i class="fas fa-bolt mr-2"></i> Generate Forecast'; | |
this.disabled = false; | |
}, 2000); | |
// Show success message | |
const toast = document.createElement('div'); | |
toast.className = 'fixed bottom-4 right-4 bg-green-500 text-white px-4 py-2 rounded-md shadow-lg flex items-center'; | |
toast.innerHTML = '<i class="fas fa-check-circle mr-2"></i> Forecast successfully generated!'; | |
document.body.appendChild(toast); | |
setTimeout(() => toast.remove(), 3000); | |
}, 2000); | |
}); | |
}); | |
</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=jisaacso219/auto-forecast-rev1" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> | |
</html> |