Spaces:
Running
Running
themes and fixes
Browse files- frontend/settings.html +14 -2
- frontend/vehicles.html +116 -104
frontend/settings.html
CHANGED
|
@@ -306,6 +306,12 @@
|
|
| 306 |
<option value="default" selected>Default</option>
|
| 307 |
<option value="vibrant">Vibrant</option>
|
| 308 |
<option value="corporate">Corporate</option>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 309 |
</select>
|
| 310 |
</div>
|
| 311 |
|
|
@@ -339,8 +345,14 @@
|
|
| 339 |
// =========== Palette definitions ===========
|
| 340 |
const PALETTES = {
|
| 341 |
default: { congestion: '#f97316', dominance: '#14b8a6', flow: '#3b82f6', label: 'Default' },
|
| 342 |
-
vibrant: { congestion: '#
|
| 343 |
-
corporate: { congestion: '#1e40af', dominance: '#0d9488', flow: '#475569', label: 'Corporate' }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 344 |
};
|
| 345 |
|
| 346 |
// =========== Load run data from initial.html ===========
|
|
|
|
| 306 |
<option value="default" selected>Default</option>
|
| 307 |
<option value="vibrant">Vibrant</option>
|
| 308 |
<option value="corporate">Corporate</option>
|
| 309 |
+
<option value="neon">Neon Night</option>
|
| 310 |
+
<option value="earth">Earth Tones</option>
|
| 311 |
+
<option value="ocean">Ocean Breeze</option>
|
| 312 |
+
<option value="sunset">Sunset Glow</option>
|
| 313 |
+
<option value="midnight">Midnight Deep</option>
|
| 314 |
+
<option value="gold">Monochrome Gold</option>
|
| 315 |
</select>
|
| 316 |
</div>
|
| 317 |
|
|
|
|
| 345 |
// =========== Palette definitions ===========
|
| 346 |
const PALETTES = {
|
| 347 |
default: { congestion: '#f97316', dominance: '#14b8a6', flow: '#3b82f6', label: 'Default' },
|
| 348 |
+
vibrant: { congestion: '#ff2d55', dominance: '#a855f7', flow: '#22d3ee', label: 'Vibrant' },
|
| 349 |
+
corporate: { congestion: '#1e40af', dominance: '#0d9488', flow: '#475569', label: 'Corporate' },
|
| 350 |
+
neon: { congestion: '#f0abfc', dominance: '#22d3ee', flow: '#a855f7', label: 'Neon Night' },
|
| 351 |
+
earth: { congestion: '#84cc16', dominance: '#22c55e', flow: '#f59e0b', label: 'Earth Tones' },
|
| 352 |
+
ocean: { congestion: '#06b6d4', dominance: '#3b82f6', flow: '#14b8a6', label: 'Ocean Breeze' },
|
| 353 |
+
sunset: { congestion: '#f59e0b', dominance: '#f43f5e', flow: '#fb923c', label: 'Sunset Glow' },
|
| 354 |
+
midnight: { congestion: '#38bdf8', dominance: '#1d4ed8', flow: '#f8fafc', label: 'Midnight Deep' },
|
| 355 |
+
gold: { congestion: '#fbbf24', dominance: '#a8a29e', flow: '#f5f5f4', label: 'Monochrome Gold' }
|
| 356 |
};
|
| 357 |
|
| 358 |
// =========== Load run data from initial.html ===========
|
frontend/vehicles.html
CHANGED
|
@@ -15,55 +15,15 @@
|
|
| 15 |
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 16 |
<style>
|
| 17 |
:root {
|
| 18 |
-
--bg-primary: #000000;
|
| 19 |
-
--bg-secondary: #000000;
|
| 20 |
-
--text-primary: #f0ece6;
|
| 21 |
-
--text-secondary: #a89f97;
|
| 22 |
-
--border-color: #2a2a2a;
|
| 23 |
-
--sidebar-bg: #000000;
|
| 24 |
-
--card-bg: #0a0a0a;
|
| 25 |
-
--input-bg: #111111;
|
| 26 |
--cocoa: #8b5e3c;
|
| 27 |
--cocoa-l: #c89a6c;
|
| 28 |
--cocoa-xl: #d4b08a;
|
| 29 |
-
--chart-grid: #2a2a2a;
|
| 30 |
-
}
|
| 31 |
-
|
| 32 |
-
:root[data-theme="neon"] {
|
| 33 |
-
--bg-primary: #090014;
|
| 34 |
-
--bg-secondary: #090014;
|
| 35 |
-
--text-primary: #ffffff;
|
| 36 |
-
--text-secondary: #b399ff;
|
| 37 |
-
--border-color: #3b0086;
|
| 38 |
-
--sidebar-bg: #090014;
|
| 39 |
-
--card-bg: #12002b;
|
| 40 |
-
--input-bg: #1a0040;
|
| 41 |
-
--cocoa: #ff00ff;
|
| 42 |
-
--cocoa-l: #00ffff;
|
| 43 |
-
--cocoa-xl: #00ffff;
|
| 44 |
-
--chart-grid: #2a005e;
|
| 45 |
-
}
|
| 46 |
-
|
| 47 |
-
:root[data-theme="glass"] {
|
| 48 |
-
--bg-primary: #f8fafc;
|
| 49 |
-
--bg-secondary: #f8fafc;
|
| 50 |
-
--text-primary: #0f172a;
|
| 51 |
-
--text-secondary: #475569;
|
| 52 |
-
--border-color: #cbd5e1;
|
| 53 |
-
--sidebar-bg: #f8fafc;
|
| 54 |
-
--card-bg: #ffffff;
|
| 55 |
-
--input-bg: #f1f5f9;
|
| 56 |
-
--cocoa: #2563eb;
|
| 57 |
-
--cocoa-l: #3b82f6;
|
| 58 |
-
--cocoa-xl: #1d4ed8;
|
| 59 |
-
--chart-grid: #e2e8f0;
|
| 60 |
}
|
| 61 |
|
| 62 |
body {
|
| 63 |
font-family: 'Montserrat', sans-serif;
|
| 64 |
-
background-color:
|
| 65 |
-
color:
|
| 66 |
-
transition: background-color 0.3s ease;
|
| 67 |
}
|
| 68 |
|
| 69 |
.mono-font {
|
|
@@ -142,18 +102,13 @@
|
|
| 142 |
}
|
| 143 |
|
| 144 |
.nav-item-inactive:hover {
|
| 145 |
-
color:
|
| 146 |
background-color: #050505 !important;
|
| 147 |
}
|
| 148 |
|
| 149 |
/* Card Overrides */
|
| 150 |
.bg-white {
|
| 151 |
-
background-color:
|
| 152 |
-
}
|
| 153 |
-
|
| 154 |
-
/* Card Overrides */
|
| 155 |
-
.bg-white {
|
| 156 |
-
background-color: var(--card-bg) !important;
|
| 157 |
}
|
| 158 |
|
| 159 |
.border-slate-200,
|
|
@@ -161,21 +116,21 @@
|
|
| 161 |
.border-slate-50,
|
| 162 |
.border-neutral-800,
|
| 163 |
.border-neutral-900 {
|
| 164 |
-
border-color:
|
| 165 |
}
|
| 166 |
|
| 167 |
.bg-slate-50\/50,
|
| 168 |
.bg-slate-50,
|
| 169 |
.bg-slate-900,
|
| 170 |
.bg-neutral-900 {
|
| 171 |
-
background-color:
|
| 172 |
}
|
| 173 |
|
| 174 |
.text-slate-900,
|
| 175 |
.text-slate-800,
|
| 176 |
.text-slate-700,
|
| 177 |
.text-neutral-900 {
|
| 178 |
-
color:
|
| 179 |
}
|
| 180 |
|
| 181 |
.text-slate-600,
|
|
@@ -183,7 +138,7 @@
|
|
| 183 |
.text-slate-400,
|
| 184 |
.text-neutral-500,
|
| 185 |
.text-neutral-400 {
|
| 186 |
-
color:
|
| 187 |
}
|
| 188 |
|
| 189 |
.shadow-sm {
|
|
@@ -373,17 +328,17 @@
|
|
| 373 |
class="flex items-center px-4 py-2.5 rounded-lg transition cursor-pointer nav-item-inactive">
|
| 374 |
<i class="fa-solid fa-circle-info w-6"></i> <span class="font-medium">About</span>
|
| 375 |
</a>
|
| 376 |
-
<a onclick="switchTab('
|
| 377 |
class="flex items-center px-4 py-2.5 rounded-lg transition cursor-pointer nav-item-inactive">
|
| 378 |
-
<i class="fa-solid fa-desktop w-6"></i> <span class="font-medium">
|
| 379 |
</a>
|
| 380 |
<a onclick="switchTab('run-details')" id="nav-run-details"
|
| 381 |
class="flex items-center px-4 py-2.5 rounded-lg transition cursor-pointer nav-item-inactive">
|
| 382 |
<i class="fa-solid fa-microchip w-6"></i> <span class="font-medium">Run</span>
|
| 383 |
</a>
|
| 384 |
-
<a onclick="switchTab('
|
| 385 |
class="flex items-center px-4 py-2.5 rounded-lg transition cursor-pointer nav-item-inactive">
|
| 386 |
-
<i class="fa-solid fa-file-lines w-6"></i> <span class="font-medium">
|
| 387 |
</a>
|
| 388 |
<a onclick="switchTab('settings')" id="nav-settings"
|
| 389 |
class="flex items-center px-4 py-2.5 rounded-lg transition cursor-pointer nav-item-inactive">
|
|
@@ -406,13 +361,6 @@
|
|
| 406 |
|
| 407 |
<main class="flex-1 flex flex-col h-full min-w-0 p-4 gap-4">
|
| 408 |
|
| 409 |
-
<!-- TAB: About -->
|
| 410 |
-
<div id="tab-about" class="hidden flex-1 min-h-0 overflow-y-auto">
|
| 411 |
-
<div class="rounded-xl border p-8 max-w-[1400px] w-full" style="background:#0a0a0a;border-color:#2a2a2a">
|
| 412 |
-
<h2 class="text-2xl font-bold mb-6" style="color:#f0ece6">UrbanFlow</h2>
|
| 413 |
-
|
| 414 |
-
<div class="mb-10 py-6" style="border-top:1px solid #1a1a1a;border-bottom:1px solid #1a1a1a">
|
| 415 |
-
<p class="max-w-3xl mx-auto text-center text-sm font-semibold leading-relaxed tracking-wide italic px-8"
|
| 416 |
style="color:#a89f97">
|
| 417 |
“Traffic data has always existed on Indian roads — in the movement of every vehicle,
|
| 418 |
every crossing, every congested junction.
|
|
@@ -666,8 +614,8 @@
|
|
| 666 |
|
| 667 |
|
| 668 |
|
| 669 |
-
<!-- TAB:
|
| 670 |
-
<div id="tab-
|
| 671 |
<div id="reports-pending" class="flex flex-col items-center justify-center h-full">
|
| 672 |
<i class="fa-solid fa-hourglass-half text-4xl text-slate-300 mb-4"></i>
|
| 673 |
<p class="text-sm font-medium text-slate-400">Reports will be available after processing completes.</p>
|
|
@@ -678,24 +626,6 @@
|
|
| 678 |
<!-- TAB: Settings -->
|
| 679 |
<div id="tab-settings" class="hidden flex-1 min-h-0 overflow-y-auto">
|
| 680 |
<div class="grid grid-cols-3 gap-6 w-full">
|
| 681 |
-
<!-- Output Format & Themes -->
|
| 682 |
-
<div class="col-span-1 flex flex-col gap-6">
|
| 683 |
-
<!-- Themes Card -->
|
| 684 |
-
<div class="bg-white rounded-xl border border-slate-200 shadow-sm overflow-hidden">
|
| 685 |
-
<div class="px-6 py-4 border-b border-slate-100 bg-slate-50/50">
|
| 686 |
-
<h3 class="font-bold text-slate-800 text-sm">Dashboard Theme</h3>
|
| 687 |
-
<p class="text-[10px] text-slate-400 mt-0.1 uppercase tracking-widest font-medium">Select aesthetic</p>
|
| 688 |
-
</div>
|
| 689 |
-
<div class="p-6">
|
| 690 |
-
<select id="theme-selector" class="custom-select w-full" onchange="setTheme(this.value)">
|
| 691 |
-
<option value="cocoa" selected>Cocoa & Slate (Classic)</option>
|
| 692 |
-
<option value="neon">Neon Cyberpunk</option>
|
| 693 |
-
<option value="glass">Arctic Glass (Light)</option>
|
| 694 |
-
</select>
|
| 695 |
-
</div>
|
| 696 |
-
</div>
|
| 697 |
-
</div>
|
| 698 |
-
|
| 699 |
<!-- Processing Parameters -->
|
| 700 |
<div class="col-span-2 bg-white rounded-xl border border-slate-200 shadow-sm overflow-hidden">
|
| 701 |
<div class="px-6 py-4 border-b border-slate-100 bg-slate-50/50">
|
|
@@ -789,7 +719,45 @@
|
|
| 789 |
</div>
|
| 790 |
</div>
|
| 791 |
|
| 792 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 793 |
|
| 794 |
<!-- Start Button -->
|
| 795 |
<div class="col-span-3 pb-4" id="settings-start-wrap">
|
|
@@ -815,16 +783,6 @@
|
|
| 815 |
</main>
|
| 816 |
|
| 817 |
<script>
|
| 818 |
-
// =========== Theme Management ===========
|
| 819 |
-
function setTheme(theme) {
|
| 820 |
-
document.documentElement.setAttribute('data-theme', theme);
|
| 821 |
-
if (window.pieChart) window.pieChart.update();
|
| 822 |
-
if (window.domChart) window.domChart.update();
|
| 823 |
-
if (window.flowChart) window.flowChart.update();
|
| 824 |
-
if (window.congChart) window.congChart.update();
|
| 825 |
-
if (window.confChart) window.confChart.update();
|
| 826 |
-
}
|
| 827 |
-
|
| 828 |
// =========== Rolling Counter ===========
|
| 829 |
function animateValue(obj, start, end, duration) {
|
| 830 |
let startTimestamp = null;
|
|
@@ -988,8 +946,14 @@
|
|
| 988 |
// =========== Palettes ===========
|
| 989 |
const PALETTES = {
|
| 990 |
default: { congestion: '#f97316', congestionBg: 'rgba(249,115,22,0.08)', dominance: '#14b8a6', flow: '#3b82f6', doughIn: '#3b82f6', doughOut: '#f97316' },
|
| 991 |
-
vibrant: { congestion: '#
|
| 992 |
-
corporate: { congestion: '#1e40af', congestionBg: 'rgba(30,64,175,0.08)', dominance: '#0d9488', flow: '#475569', doughIn: '#475569', doughOut: '#1e40af' }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 993 |
};
|
| 994 |
|
| 995 |
// Read settings from sessionStorage (set by settings.html)
|
|
@@ -1029,10 +993,22 @@
|
|
| 1029 |
plugins: { legend: { display: false } },
|
| 1030 |
scales: {
|
| 1031 |
x: { grid: { display: false }, ticks: { maxTicksLimit: 10, font: { size: 10 }, color: '#666666' }, title: { display: true, text: 'Frame Index', font: { size: 10, weight: '700' }, color: '#888888' } },
|
| 1032 |
-
y: { grid: { color: '#
|
| 1033 |
},
|
| 1034 |
animation: { duration: 0 }
|
| 1035 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1036 |
});
|
| 1037 |
|
| 1038 |
const doughChart = new Chart(document.getElementById('doughnutChart').getContext('2d'), {
|
|
@@ -1053,7 +1029,19 @@
|
|
| 1053 |
legend: { display: true, position: 'bottom', labels: { padding: 12, usePointStyle: true, pointStyle: 'circle', font: { size: 10, weight: '600' } } }
|
| 1054 |
},
|
| 1055 |
animation: { duration: 0 }
|
| 1056 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1057 |
});
|
| 1058 |
|
| 1059 |
const domChart = new Chart(document.getElementById('dominanceChart').getContext('2d'), {
|
|
@@ -1064,10 +1052,22 @@
|
|
| 1064 |
plugins: { legend: { display: false } },
|
| 1065 |
scales: {
|
| 1066 |
x: { grid: { display: false }, ticks: { font: { size: 10, weight: '500' }, color: '#666666' } },
|
| 1067 |
-
y: { grid: { color: '#
|
| 1068 |
},
|
| 1069 |
animation: { duration: 0 }
|
| 1070 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1071 |
});
|
| 1072 |
|
| 1073 |
const flowChart = new Chart(document.getElementById('flowChart').getContext('2d'), {
|
|
@@ -1078,10 +1078,22 @@
|
|
| 1078 |
plugins: { legend: { display: false } },
|
| 1079 |
scales: {
|
| 1080 |
x: { grid: { display: false }, ticks: { maxTicksLimit: 10, font: { size: 10 }, color: '#666666' }, title: { display: true, text: 'Time (seconds)', font: { size: 10, weight: '700' }, color: '#888888' } },
|
| 1081 |
-
y: { grid: { color: '#
|
| 1082 |
},
|
| 1083 |
animation: { duration: 0 }
|
| 1084 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1085 |
});
|
| 1086 |
|
| 1087 |
// =========== Update functions ===========
|
|
|
|
| 15 |
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 16 |
<style>
|
| 17 |
:root {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 18 |
--cocoa: #8b5e3c;
|
| 19 |
--cocoa-l: #c89a6c;
|
| 20 |
--cocoa-xl: #d4b08a;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
}
|
| 22 |
|
| 23 |
body {
|
| 24 |
font-family: 'Montserrat', sans-serif;
|
| 25 |
+
background-color: #000000;
|
| 26 |
+
color: #f0ece6;
|
|
|
|
| 27 |
}
|
| 28 |
|
| 29 |
.mono-font {
|
|
|
|
| 102 |
}
|
| 103 |
|
| 104 |
.nav-item-inactive:hover {
|
| 105 |
+
color: #f0ece6 !important;
|
| 106 |
background-color: #050505 !important;
|
| 107 |
}
|
| 108 |
|
| 109 |
/* Card Overrides */
|
| 110 |
.bg-white {
|
| 111 |
+
background-color: #0a0a0a !important;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 112 |
}
|
| 113 |
|
| 114 |
.border-slate-200,
|
|
|
|
| 116 |
.border-slate-50,
|
| 117 |
.border-neutral-800,
|
| 118 |
.border-neutral-900 {
|
| 119 |
+
border-color: #2a2a2a !important;
|
| 120 |
}
|
| 121 |
|
| 122 |
.bg-slate-50\/50,
|
| 123 |
.bg-slate-50,
|
| 124 |
.bg-slate-900,
|
| 125 |
.bg-neutral-900 {
|
| 126 |
+
background-color: #0c0c0c !important;
|
| 127 |
}
|
| 128 |
|
| 129 |
.text-slate-900,
|
| 130 |
.text-slate-800,
|
| 131 |
.text-slate-700,
|
| 132 |
.text-neutral-900 {
|
| 133 |
+
color: #ffffff !important;
|
| 134 |
}
|
| 135 |
|
| 136 |
.text-slate-600,
|
|
|
|
| 138 |
.text-slate-400,
|
| 139 |
.text-neutral-500,
|
| 140 |
.text-neutral-400 {
|
| 141 |
+
color: #888888 !important;
|
| 142 |
}
|
| 143 |
|
| 144 |
.shadow-sm {
|
|
|
|
| 328 |
class="flex items-center px-4 py-2.5 rounded-lg transition cursor-pointer nav-item-inactive">
|
| 329 |
<i class="fa-solid fa-circle-info w-6"></i> <span class="font-medium">About</span>
|
| 330 |
</a>
|
| 331 |
+
<a onclick="switchTab('overview')" id="nav-overview"
|
| 332 |
class="flex items-center px-4 py-2.5 rounded-lg transition cursor-pointer nav-item-inactive">
|
| 333 |
+
<i class="fa-solid fa-desktop w-6"></i> <span class="font-medium">Overview</span>
|
| 334 |
</a>
|
| 335 |
<a onclick="switchTab('run-details')" id="nav-run-details"
|
| 336 |
class="flex items-center px-4 py-2.5 rounded-lg transition cursor-pointer nav-item-inactive">
|
| 337 |
<i class="fa-solid fa-microchip w-6"></i> <span class="font-medium">Run</span>
|
| 338 |
</a>
|
| 339 |
+
<a onclick="switchTab('reports')" id="nav-reports"
|
| 340 |
class="flex items-center px-4 py-2.5 rounded-lg transition cursor-pointer nav-item-inactive">
|
| 341 |
+
<i class="fa-solid fa-file-lines w-6"></i> <span class="font-medium">Reports</span>
|
| 342 |
</a>
|
| 343 |
<a onclick="switchTab('settings')" id="nav-settings"
|
| 344 |
class="flex items-center px-4 py-2.5 rounded-lg transition cursor-pointer nav-item-inactive">
|
|
|
|
| 361 |
|
| 362 |
<main class="flex-1 flex flex-col h-full min-w-0 p-4 gap-4">
|
| 363 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 364 |
style="color:#a89f97">
|
| 365 |
“Traffic data has always existed on Indian roads — in the movement of every vehicle,
|
| 366 |
every crossing, every congested junction.
|
|
|
|
| 614 |
|
| 615 |
|
| 616 |
|
| 617 |
+
<!-- TAB: Reports -->
|
| 618 |
+
<div id="tab-reports" class="hidden flex-1 min-h-0 overflow-y-auto">
|
| 619 |
<div id="reports-pending" class="flex flex-col items-center justify-center h-full">
|
| 620 |
<i class="fa-solid fa-hourglass-half text-4xl text-slate-300 mb-4"></i>
|
| 621 |
<p class="text-sm font-medium text-slate-400">Reports will be available after processing completes.</p>
|
|
|
|
| 626 |
<!-- TAB: Settings -->
|
| 627 |
<div id="tab-settings" class="hidden flex-1 min-h-0 overflow-y-auto">
|
| 628 |
<div class="grid grid-cols-3 gap-6 w-full">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 629 |
<!-- Processing Parameters -->
|
| 630 |
<div class="col-span-2 bg-white rounded-xl border border-slate-200 shadow-sm overflow-hidden">
|
| 631 |
<div class="px-6 py-4 border-b border-slate-100 bg-slate-50/50">
|
|
|
|
| 719 |
</div>
|
| 720 |
</div>
|
| 721 |
|
| 722 |
+
<!-- Display Preferences -->
|
| 723 |
+
<div
|
| 724 |
+
class="col-span-1 bg-white rounded-xl border border-slate-200 shadow-sm overflow-hidden flex flex-col">
|
| 725 |
+
<div class="px-5 py-3 border-b border-slate-100 bg-slate-50/50">
|
| 726 |
+
<h3 class="font-bold text-slate-800 text-sm">Display Preferences</h3>
|
| 727 |
+
</div>
|
| 728 |
+
<div class="px-5 py-4 flex-1 flex flex-col">
|
| 729 |
+
<div class="s-row">
|
| 730 |
+
<div>
|
| 731 |
+
<div class="text-xs font-semibold text-slate-700">Chart Color Palette</div>
|
| 732 |
+
<div class="text-[10px] text-slate-400">Color scheme for all charts</div>
|
| 733 |
+
</div>
|
| 734 |
+
<select class="custom-select" id="live-palette-select" onchange="applyPalette(this.value)">
|
| 735 |
+
<option value="default" selected>Default</option>
|
| 736 |
+
<option value="vibrant">Vibrant</option>
|
| 737 |
+
<option value="corporate">Corporate</option>
|
| 738 |
+
<option value="neon">Neon Night</option>
|
| 739 |
+
<option value="earth">Earth Tones</option>
|
| 740 |
+
<option value="ocean">Ocean Breeze</option>
|
| 741 |
+
<option value="sunset">Sunset Glow</option>
|
| 742 |
+
<option value="midnight">Midnight Deep</option>
|
| 743 |
+
<option value="gold">Monochrome Gold</option>
|
| 744 |
+
</select>
|
| 745 |
+
</div>
|
| 746 |
+
<div class="s-row hidden">
|
| 747 |
+
<div>
|
| 748 |
+
<div class="text-xs font-semibold text-slate-700">Interface Mode</div>
|
| 749 |
+
<div class="text-[10px] text-slate-400">Locked to Professional Dark</div>
|
| 750 |
+
</div>
|
| 751 |
+
<div class="text-xs font-bold text-white px-3 py-1 bg-slate-800 rounded-full">Dark Mode Only
|
| 752 |
+
</div>
|
| 753 |
+
</div>
|
| 754 |
+
<div class="mt-3">
|
| 755 |
+
<div class="text-[10px] font-bold text-slate-400 uppercase tracking-widest mb-2">Palette
|
| 756 |
+
Preview</div>
|
| 757 |
+
<div class="flex gap-1.5" id="live-palette-preview"></div>
|
| 758 |
+
</div>
|
| 759 |
+
</div>
|
| 760 |
+
</div>
|
| 761 |
|
| 762 |
<!-- Start Button -->
|
| 763 |
<div class="col-span-3 pb-4" id="settings-start-wrap">
|
|
|
|
| 783 |
</main>
|
| 784 |
|
| 785 |
<script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 786 |
// =========== Rolling Counter ===========
|
| 787 |
function animateValue(obj, start, end, duration) {
|
| 788 |
let startTimestamp = null;
|
|
|
|
| 946 |
// =========== Palettes ===========
|
| 947 |
const PALETTES = {
|
| 948 |
default: { congestion: '#f97316', congestionBg: 'rgba(249,115,22,0.08)', dominance: '#14b8a6', flow: '#3b82f6', doughIn: '#3b82f6', doughOut: '#f97316' },
|
| 949 |
+
vibrant: { congestion: '#ff2d55', congestionBg: 'rgba(255,45,85,0.08)', dominance: '#a855f7', flow: '#22d3ee', doughIn: '#22d3ee', doughOut: '#ff2d55' },
|
| 950 |
+
corporate: { congestion: '#1e40af', congestionBg: 'rgba(30,64,175,0.08)', dominance: '#0d9488', flow: '#475569', doughIn: '#475569', doughOut: '#1e40af' },
|
| 951 |
+
neon: { congestion: '#f0abfc', congestionBg: 'rgba(240,171,252,0.08)', dominance: '#22d3ee', flow: '#a855f7', doughIn: '#a855f7', doughOut: '#f0abfc' },
|
| 952 |
+
earth: { congestion: '#84cc16', congestionBg: 'rgba(132,204,22,0.08)', dominance: '#22c55e', flow: '#f59e0b', doughIn: '#f59e0b', doughOut: '#84cc16' },
|
| 953 |
+
ocean: { congestion: '#06b6d4', congestionBg: 'rgba(6,182,212,0.08)', dominance: '#3b82f6', flow: '#14b8a6', doughIn: '#14b8a6', doughOut: '#06b6d4' },
|
| 954 |
+
sunset: { congestion: '#f59e0b', congestionBg: 'rgba(245,158,11,0.08)', dominance: '#f43f5e', flow: '#fb923c', doughIn: '#fb923c', doughOut: '#f59e0b' },
|
| 955 |
+
midnight: { congestion: '#38bdf8', congestionBg: 'rgba(56,189,248,0.08)', dominance: '#1d4ed8', flow: '#f8fafc', doughIn: '#f8fafc', doughOut: '#38bdf8' },
|
| 956 |
+
gold: { congestion: '#fbbf24', congestionBg: 'rgba(251,191,36,0.08)', dominance: '#a8a29e', flow: '#f5f5f4', doughIn: '#f5f5f4', doughOut: '#fbbf24' }
|
| 957 |
};
|
| 958 |
|
| 959 |
// Read settings from sessionStorage (set by settings.html)
|
|
|
|
| 993 |
plugins: { legend: { display: false } },
|
| 994 |
scales: {
|
| 995 |
x: { grid: { display: false }, ticks: { maxTicksLimit: 10, font: { size: 10 }, color: '#666666' }, title: { display: true, text: 'Frame Index', font: { size: 10, weight: '700' }, color: '#888888' } },
|
| 996 |
+
y: { grid: { color: '#1a1a1a' }, beginAtZero: true, ticks: { font: { size: 10 }, color: '#666666' }, title: { display: true, text: 'Active Vehicles', font: { size: 10, weight: '700' }, color: '#888888' } }
|
| 997 |
},
|
| 998 |
animation: { duration: 0 }
|
| 999 |
+
},
|
| 1000 |
+
plugins: [{
|
| 1001 |
+
id: 'glow',
|
| 1002 |
+
beforeDatasetsDraw: (chart) => {
|
| 1003 |
+
const ctx = chart.ctx;
|
| 1004 |
+
ctx.save();
|
| 1005 |
+
ctx.shadowBlur = 12;
|
| 1006 |
+
ctx.shadowColor = activePalette.congestion;
|
| 1007 |
+
},
|
| 1008 |
+
afterDatasetsDraw: (chart) => {
|
| 1009 |
+
chart.ctx.restore();
|
| 1010 |
+
}
|
| 1011 |
+
}]
|
| 1012 |
});
|
| 1013 |
|
| 1014 |
const doughChart = new Chart(document.getElementById('doughnutChart').getContext('2d'), {
|
|
|
|
| 1029 |
legend: { display: true, position: 'bottom', labels: { padding: 12, usePointStyle: true, pointStyle: 'circle', font: { size: 10, weight: '600' } } }
|
| 1030 |
},
|
| 1031 |
animation: { duration: 0 }
|
| 1032 |
+
},
|
| 1033 |
+
plugins: [{
|
| 1034 |
+
id: 'glow',
|
| 1035 |
+
beforeDatasetsDraw: (chart) => {
|
| 1036 |
+
const ctx = chart.ctx;
|
| 1037 |
+
ctx.save();
|
| 1038 |
+
ctx.shadowBlur = 12;
|
| 1039 |
+
ctx.shadowColor = activePalette.doughOut;
|
| 1040 |
+
},
|
| 1041 |
+
afterDatasetsDraw: (chart) => {
|
| 1042 |
+
chart.ctx.restore();
|
| 1043 |
+
}
|
| 1044 |
+
}]
|
| 1045 |
});
|
| 1046 |
|
| 1047 |
const domChart = new Chart(document.getElementById('dominanceChart').getContext('2d'), {
|
|
|
|
| 1052 |
plugins: { legend: { display: false } },
|
| 1053 |
scales: {
|
| 1054 |
x: { grid: { display: false }, ticks: { font: { size: 10, weight: '500' }, color: '#666666' } },
|
| 1055 |
+
y: { grid: { color: '#1a1a1a' }, beginAtZero: true, ticks: { font: { size: 10 }, color: '#666666' }, title: { display: true, text: 'Total Vehicle Count', font: { size: 10, weight: '700' }, color: '#888888' } }
|
| 1056 |
},
|
| 1057 |
animation: { duration: 0 }
|
| 1058 |
+
},
|
| 1059 |
+
plugins: [{
|
| 1060 |
+
id: 'glow',
|
| 1061 |
+
beforeDatasetsDraw: (chart) => {
|
| 1062 |
+
const ctx = chart.ctx;
|
| 1063 |
+
ctx.save();
|
| 1064 |
+
ctx.shadowBlur = 12;
|
| 1065 |
+
ctx.shadowColor = activePalette.dominance;
|
| 1066 |
+
},
|
| 1067 |
+
afterDatasetsDraw: (chart) => {
|
| 1068 |
+
chart.ctx.restore();
|
| 1069 |
+
}
|
| 1070 |
+
}]
|
| 1071 |
});
|
| 1072 |
|
| 1073 |
const flowChart = new Chart(document.getElementById('flowChart').getContext('2d'), {
|
|
|
|
| 1078 |
plugins: { legend: { display: false } },
|
| 1079 |
scales: {
|
| 1080 |
x: { grid: { display: false }, ticks: { maxTicksLimit: 10, font: { size: 10 }, color: '#666666' }, title: { display: true, text: 'Time (seconds)', font: { size: 10, weight: '700' }, color: '#888888' } },
|
| 1081 |
+
y: { grid: { color: '#1a1a1a' }, beginAtZero: true, ticks: { font: { size: 10 }, color: '#666666' }, title: { display: true, text: 'Vehicles Crossed', font: { size: 10, weight: '700' }, color: '#888888' } }
|
| 1082 |
},
|
| 1083 |
animation: { duration: 0 }
|
| 1084 |
+
},
|
| 1085 |
+
plugins: [{
|
| 1086 |
+
id: 'glow',
|
| 1087 |
+
beforeDatasetsDraw: (chart) => {
|
| 1088 |
+
const ctx = chart.ctx;
|
| 1089 |
+
ctx.save();
|
| 1090 |
+
ctx.shadowBlur = 12;
|
| 1091 |
+
ctx.shadowColor = activePalette.flow;
|
| 1092 |
+
},
|
| 1093 |
+
afterDatasetsDraw: (chart) => {
|
| 1094 |
+
chart.ctx.restore();
|
| 1095 |
+
}
|
| 1096 |
+
}]
|
| 1097 |
});
|
| 1098 |
|
| 1099 |
// =========== Update functions ===========
|