Subh775 commited on
Commit
7649f8a
·
1 Parent(s): b96bb3a

themes and fixes

Browse files
Files changed (2) hide show
  1. frontend/settings.html +14 -2
  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: '#e11d48', dominance: '#8b5cf6', flow: '#06b6d4', label: 'Vibrant' },
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: var(--bg-primary);
65
- color: var(--text-primary);
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: var(--text-primary) !important;
146
  background-color: #050505 !important;
147
  }
148
 
149
  /* Card Overrides */
150
  .bg-white {
151
- background-color: var(--card-bg) !important;
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: var(--border-color) !important;
165
  }
166
 
167
  .bg-slate-50\/50,
168
  .bg-slate-50,
169
  .bg-slate-900,
170
  .bg-neutral-900 {
171
- background-color: var(--input-bg) !important;
172
  }
173
 
174
  .text-slate-900,
175
  .text-slate-800,
176
  .text-slate-700,
177
  .text-neutral-900 {
178
- color: var(--text-primary) !important;
179
  }
180
 
181
  .text-slate-600,
@@ -183,7 +138,7 @@
183
  .text-slate-400,
184
  .text-neutral-500,
185
  .text-neutral-400 {
186
- color: var(--text-secondary) !important;
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('stats')" id="nav-stats"
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">Stats</span>
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('intelligence')" id="nav-intelligence"
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">Intelligence</span>
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
  &ldquo;Traffic data has always existed on Indian roads &mdash; in the movement of every vehicle,
418
  every crossing, every congested junction.
@@ -666,8 +614,8 @@
666
 
667
 
668
 
669
- <!-- TAB: Intelligence -->
670
- <div id="tab-intelligence" class="hidden flex-1 min-h-0 overflow-y-auto">
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: '#e11d48', congestionBg: 'rgba(225,29,72,0.08)', dominance: '#8b5cf6', flow: '#06b6d4', doughIn: '#06b6d4', doughOut: '#e11d48' },
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: '#333333' }, beginAtZero: true, ticks: { font: { size: 10 }, color: '#666666' }, title: { display: true, text: 'Active Vehicles', font: { size: 10, weight: '700' }, color: '#888888' } }
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: '#333333' }, beginAtZero: true, ticks: { font: { size: 10 }, color: '#666666' }, title: { display: true, text: 'Total Vehicle Count', font: { size: 10, weight: '700' }, color: '#888888' } }
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: '#333333' }, 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
  });
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
  &ldquo;Traffic data has always existed on Indian roads &mdash; 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 ===========