lattmamb commited on
Commit
b33d337
·
verified ·
1 Parent(s): f7847d9

Upload 32 files

Browse files
.gitattributes CHANGED
@@ -33,3 +33,6 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ 4A717E73-3287-4051-AE08-44EB1DD21F7F.png filter=lfs diff=lfs merge=lfs -text
37
+ 6120F952-C801-4C53-AFE0-BB9363A1F539.png filter=lfs diff=lfs merge=lfs -text
38
+ DA9BA4EE-1541-40D5-BD7B-F3D9227808D1.png filter=lfs diff=lfs merge=lfs -text
4A717E73-3287-4051-AE08-44EB1DD21F7F.png ADDED

Git LFS Details

  • SHA256: 0b40b8ad0e7aeff3b18f2287528d0d7f94862f811d140c6485c87ce36c0e701e
  • Pointer size: 132 Bytes
  • Size of remote file: 2 MB
6120F952-C801-4C53-AFE0-BB9363A1F539.png ADDED

Git LFS Details

  • SHA256: b4f1b146067e0ff16ada7df4e6dff628c61bed67df3afaa143ab1cb0c09e71eb
  • Pointer size: 132 Bytes
  • Size of remote file: 1.82 MB
ChainlinkDemo.css ADDED
@@ -0,0 +1,2026 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* ChainLink Tokenization Demo Styles */
2
+ .chainlink-demo {
3
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
4
+ max-width: 1200px;
5
+ margin: 0 auto;
6
+ background-color: #0B0B0F;
7
+ color: #ffffff;
8
+ min-height: 100vh;
9
+ position: relative;
10
+ }
11
+
12
+ /* Loading Screen */
13
+ .chainlink-demo.loading {
14
+ display: flex;
15
+ flex-direction: column;
16
+ justify-content: center;
17
+ align-items: center;
18
+ height: 100vh;
19
+ }
20
+
21
+ .loading-logo {
22
+ width: 150px;
23
+ height: 150px;
24
+ margin-bottom: 20px;
25
+ position: relative;
26
+ }
27
+
28
+ .loading-logo img {
29
+ width: 100%;
30
+ height: 100%;
31
+ object-fit: contain;
32
+ }
33
+
34
+ .loading-pulse {
35
+ position: absolute;
36
+ top: 0;
37
+ left: 0;
38
+ right: 0;
39
+ bottom: 0;
40
+ border-radius: 50%;
41
+ border: 2px solid #00E0FF;
42
+ animation: pulse 1.5s infinite ease-in-out;
43
+ }
44
+
45
+ @keyframes pulse {
46
+ 0% {
47
+ transform: scale(0.95);
48
+ opacity: 1;
49
+ }
50
+ 70% {
51
+ transform: scale(1.2);
52
+ opacity: 0;
53
+ }
54
+ 100% {
55
+ transform: scale(0.95);
56
+ opacity: 0;
57
+ }
58
+ }
59
+
60
+ /* Header */
61
+ .demo-header {
62
+ display: flex;
63
+ justify-content: space-between;
64
+ align-items: center;
65
+ padding: 20px;
66
+ background-color: rgba(20, 20, 30, 0.8);
67
+ backdrop-filter: blur(10px);
68
+ position: sticky;
69
+ top: 0;
70
+ z-index: 100;
71
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
72
+ }
73
+
74
+ .demo-title {
75
+ display: flex;
76
+ flex-direction: column;
77
+ }
78
+
79
+ .demo-title h1 {
80
+ margin: 0;
81
+ font-size: 28px;
82
+ font-weight: 700;
83
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
84
+ -webkit-background-clip: text;
85
+ background-clip: text;
86
+ -webkit-text-fill-color: transparent;
87
+ letter-spacing: 1px;
88
+ }
89
+
90
+ .demo-subtitle {
91
+ font-size: 14px;
92
+ opacity: 0.7;
93
+ }
94
+
95
+ .token-stats {
96
+ display: flex;
97
+ gap: 20px;
98
+ }
99
+
100
+ .token-price, .token-market-cap {
101
+ display: flex;
102
+ align-items: center;
103
+ gap: 8px;
104
+ background-color: rgba(255, 255, 255, 0.05);
105
+ padding: 8px 12px;
106
+ border-radius: 8px;
107
+ border: 1px solid rgba(0, 224, 255, 0.2);
108
+ }
109
+
110
+ .price-label, .cap-label {
111
+ font-size: 14px;
112
+ opacity: 0.7;
113
+ }
114
+
115
+ .price-value, .cap-value {
116
+ font-size: 16px;
117
+ font-weight: 600;
118
+ color: #00E0FF;
119
+ }
120
+
121
+ .price-change {
122
+ font-size: 14px;
123
+ font-weight: 600;
124
+ padding: 2px 6px;
125
+ border-radius: 4px;
126
+ }
127
+
128
+ .price-change.positive {
129
+ background-color: rgba(53, 242, 219, 0.2);
130
+ color: #35F2DB;
131
+ }
132
+
133
+ .price-change.negative {
134
+ background-color: rgba(255, 85, 85, 0.2);
135
+ color: #FF5555;
136
+ }
137
+
138
+ /* Navigation */
139
+ .demo-navigation {
140
+ display: flex;
141
+ gap: 2px;
142
+ background-color: rgba(20, 20, 30, 0.5);
143
+ padding: 0 20px;
144
+ overflow-x: auto;
145
+ scrollbar-width: none;
146
+ }
147
+
148
+ .demo-navigation::-webkit-scrollbar {
149
+ display: none;
150
+ }
151
+
152
+ .nav-button {
153
+ padding: 16px 20px;
154
+ background: transparent;
155
+ border: none;
156
+ color: white;
157
+ font-size: 16px;
158
+ cursor: pointer;
159
+ position: relative;
160
+ white-space: nowrap;
161
+ }
162
+
163
+ .nav-button.active {
164
+ color: #00E0FF;
165
+ }
166
+
167
+ .nav-button.active::after {
168
+ content: '';
169
+ position: absolute;
170
+ bottom: 0;
171
+ left: 0;
172
+ right: 0;
173
+ height: 3px;
174
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
175
+ border-radius: 3px 3px 0 0;
176
+ }
177
+
178
+ /* Main Content */
179
+ .demo-content {
180
+ padding: 20px;
181
+ min-height: calc(100vh - 200px);
182
+ }
183
+
184
+ /* Overview Tab */
185
+ .overview-tab {
186
+ display: flex;
187
+ flex-direction: column;
188
+ gap: 30px;
189
+ }
190
+
191
+ .network-stats {
192
+ display: grid;
193
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
194
+ gap: 20px;
195
+ }
196
+
197
+ .stats-card {
198
+ background: rgba(255, 255, 255, 0.05);
199
+ border-radius: 16px;
200
+ padding: 20px;
201
+ border: 1px solid rgba(0, 224, 255, 0.1);
202
+ }
203
+
204
+ .stats-card h3 {
205
+ margin: 0 0 20px 0;
206
+ font-size: 20px;
207
+ font-weight: 600;
208
+ }
209
+
210
+ .token-supply-chart {
211
+ display: flex;
212
+ flex-direction: column;
213
+ align-items: center;
214
+ gap: 20px;
215
+ }
216
+
217
+ .supply-chart-container {
218
+ width: 200px;
219
+ height: 200px;
220
+ }
221
+
222
+ .supply-chart {
223
+ width: 100%;
224
+ height: 100%;
225
+ border-radius: 50%;
226
+ position: relative;
227
+ overflow: hidden;
228
+ }
229
+
230
+ .supply-segment {
231
+ position: absolute;
232
+ top: 0;
233
+ left: 0;
234
+ width: 100%;
235
+ height: 100%;
236
+ transform-origin: center;
237
+ }
238
+
239
+ .supply-segment.circulating {
240
+ background-color: #00E0FF;
241
+ }
242
+
243
+ .supply-segment.reserved {
244
+ background-color: rgba(255, 255, 255, 0.2);
245
+ }
246
+
247
+ .supply-inner {
248
+ position: absolute;
249
+ top: 25%;
250
+ left: 25%;
251
+ width: 50%;
252
+ height: 50%;
253
+ background-color: #0B0B0F;
254
+ border-radius: 50%;
255
+ display: flex;
256
+ flex-direction: column;
257
+ justify-content: center;
258
+ align-items: center;
259
+ }
260
+
261
+ .supply-value {
262
+ font-size: 18px;
263
+ font-weight: 700;
264
+ color: #00E0FF;
265
+ }
266
+
267
+ .supply-label {
268
+ font-size: 12px;
269
+ opacity: 0.7;
270
+ }
271
+
272
+ .supply-legend {
273
+ display: flex;
274
+ flex-direction: column;
275
+ gap: 10px;
276
+ width: 100%;
277
+ }
278
+
279
+ .legend-item {
280
+ display: flex;
281
+ align-items: center;
282
+ gap: 10px;
283
+ }
284
+
285
+ .legend-color {
286
+ width: 16px;
287
+ height: 16px;
288
+ border-radius: 4px;
289
+ }
290
+
291
+ .legend-color.circulating {
292
+ background-color: #00E0FF;
293
+ }
294
+
295
+ .legend-color.reserved {
296
+ background-color: rgba(255, 255, 255, 0.2);
297
+ }
298
+
299
+ .legend-label {
300
+ font-size: 14px;
301
+ opacity: 0.7;
302
+ }
303
+
304
+ .legend-value {
305
+ margin-left: auto;
306
+ font-size: 14px;
307
+ font-weight: 600;
308
+ }
309
+
310
+ .metrics-grid {
311
+ display: grid;
312
+ grid-template-columns: repeat(2, 1fr);
313
+ gap: 20px;
314
+ }
315
+
316
+ .metric-item {
317
+ display: flex;
318
+ flex-direction: column;
319
+ align-items: center;
320
+ text-align: center;
321
+ padding: 15px;
322
+ background: rgba(255, 255, 255, 0.05);
323
+ border-radius: 12px;
324
+ border: 1px solid rgba(255, 255, 255, 0.1);
325
+ }
326
+
327
+ .metric-icon {
328
+ font-size: 24px;
329
+ margin-bottom: 10px;
330
+ }
331
+
332
+ .metric-value {
333
+ font-size: 20px;
334
+ font-weight: 700;
335
+ margin-bottom: 5px;
336
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
337
+ -webkit-background-clip: text;
338
+ background-clip: text;
339
+ -webkit-text-fill-color: transparent;
340
+ }
341
+
342
+ .metric-label {
343
+ font-size: 14px;
344
+ opacity: 0.7;
345
+ }
346
+
347
+ .token-distribution {
348
+ background: rgba(255, 255, 255, 0.05);
349
+ border-radius: 16px;
350
+ padding: 20px;
351
+ border: 1px solid rgba(0, 224, 255, 0.1);
352
+ }
353
+
354
+ .token-distribution h3 {
355
+ margin: 0 0 20px 0;
356
+ font-size: 20px;
357
+ font-weight: 600;
358
+ }
359
+
360
+ .distribution-chart {
361
+ display: flex;
362
+ gap: 30px;
363
+ flex-wrap: wrap;
364
+ }
365
+
366
+ .pie-chart-container {
367
+ width: 200px;
368
+ height: 200px;
369
+ flex-shrink: 0;
370
+ }
371
+
372
+ .pie-chart {
373
+ width: 100%;
374
+ height: 100%;
375
+ border-radius: 50%;
376
+ position: relative;
377
+ overflow: hidden;
378
+ }
379
+
380
+ .pie-segment {
381
+ position: absolute;
382
+ top: 0;
383
+ left: 0;
384
+ width: 100%;
385
+ height: 100%;
386
+ transform-origin: center;
387
+ }
388
+
389
+ .pie-inner {
390
+ position: absolute;
391
+ top: 25%;
392
+ left: 25%;
393
+ width: 50%;
394
+ height: 50%;
395
+ background-color: #0B0B0F;
396
+ border-radius: 50%;
397
+ display: flex;
398
+ justify-content: center;
399
+ align-items: center;
400
+ }
401
+
402
+ .pie-icon {
403
+ font-size: 24px;
404
+ }
405
+
406
+ .distribution-legend {
407
+ flex: 1;
408
+ display: grid;
409
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
410
+ gap: 10px;
411
+ }
412
+
413
+ .token-utility {
414
+ background: rgba(255, 255, 255, 0.05);
415
+ border-radius: 16px;
416
+ padding: 20px;
417
+ border: 1px solid rgba(0, 224, 255, 0.1);
418
+ }
419
+
420
+ .token-utility h3 {
421
+ margin: 0 0 20px 0;
422
+ font-size: 20px;
423
+ font-weight: 600;
424
+ }
425
+
426
+ .utility-grid {
427
+ display: grid;
428
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
429
+ gap: 20px;
430
+ }
431
+
432
+ .utility-card {
433
+ background-color: rgba(255, 255, 255, 0.05);
434
+ border-radius: 12px;
435
+ padding: 15px;
436
+ border: 1px solid rgba(255, 255, 255, 0.1);
437
+ }
438
+
439
+ .utility-header {
440
+ display: flex;
441
+ align-items: center;
442
+ gap: 10px;
443
+ margin-bottom: 10px;
444
+ }
445
+
446
+ .utility-icon {
447
+ font-size: 20px;
448
+ color: #00E0FF;
449
+ }
450
+
451
+ .utility-card h4 {
452
+ margin: 0;
453
+ font-size: 16px;
454
+ font-weight: 600;
455
+ }
456
+
457
+ .utility-card p {
458
+ margin: 0;
459
+ font-size: 14px;
460
+ opacity: 0.8;
461
+ line-height: 1.5;
462
+ }
463
+
464
+ .value-drivers {
465
+ background: rgba(255, 255, 255, 0.05);
466
+ border-radius: 16px;
467
+ padding: 20px;
468
+ border: 1px solid rgba(0, 224, 255, 0.1);
469
+ }
470
+
471
+ .value-drivers h3 {
472
+ margin: 0 0 20px 0;
473
+ font-size: 20px;
474
+ font-weight: 600;
475
+ }
476
+
477
+ .drivers-table {
478
+ width: 100%;
479
+ overflow-x: auto;
480
+ }
481
+
482
+ .table-header {
483
+ display: flex;
484
+ background-color: rgba(0, 0, 0, 0.2);
485
+ padding: 10px;
486
+ border-radius: 8px 8px 0 0;
487
+ font-weight: 600;
488
+ font-size: 14px;
489
+ }
490
+
491
+ .table-row {
492
+ display: flex;
493
+ padding: 10px;
494
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
495
+ }
496
+
497
+ .table-row:last-child {
498
+ border-bottom: none;
499
+ }
500
+
501
+ .table-row:nth-child(even) {
502
+ background-color: rgba(255, 255, 255, 0.02);
503
+ }
504
+
505
+ .driver-column {
506
+ width: 25%;
507
+ padding: 0 10px;
508
+ }
509
+
510
+ .impact-column {
511
+ width: 15%;
512
+ padding: 0 10px;
513
+ font-weight: 600;
514
+ }
515
+
516
+ .impact-high {
517
+ color: #35F2DB;
518
+ }
519
+
520
+ .impact-medium {
521
+ color: #FFC107;
522
+ }
523
+
524
+ .impact-low {
525
+ color: #FF5555;
526
+ }
527
+
528
+ .description-column {
529
+ flex: 1;
530
+ padding: 0 10px;
531
+ font-size: 14px;
532
+ opacity: 0.8;
533
+ }
534
+
535
+ /* Wallet Tab */
536
+ .wallet-tab {
537
+ display: flex;
538
+ flex-direction: column;
539
+ gap: 30px;
540
+ }
541
+
542
+ .wallet-overview {
543
+ display: grid;
544
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
545
+ gap: 20px;
546
+ }
547
+
548
+ .wallet-card {
549
+ background: rgba(255, 255, 255, 0.05);
550
+ border-radius: 16px;
551
+ padding: 20px;
552
+ border: 1px solid rgba(0, 224, 255, 0.1);
553
+ }
554
+
555
+ .wallet-card.balance {
556
+ display: flex;
557
+ flex-direction: column;
558
+ align-items: center;
559
+ text-align: center;
560
+ }
561
+
562
+ .wallet-icon {
563
+ font-size: 36px;
564
+ margin-bottom: 15px;
565
+ }
566
+
567
+ .wallet-balance {
568
+ font-size: 48px;
569
+ font-weight: 700;
570
+ margin-bottom: 5px;
571
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
572
+ -webkit-background-clip: text;
573
+ background-clip: text;
574
+ -webkit-text-fill-color: transparent;
575
+ }
576
+
577
+ .wallet-label {
578
+ font-size: 16px;
579
+ opacity: 0.7;
580
+ margin-bottom: 10px;
581
+ }
582
+
583
+ .wallet-value {
584
+ font-size: 18px;
585
+ font-weight: 600;
586
+ color: #00E0FF;
587
+ }
588
+
589
+ .staking-header {
590
+ display: flex;
591
+ justify-content: space-between;
592
+ align-items: center;
593
+ margin-bottom: 20px;
594
+ }
595
+
596
+ .staking-header h3 {
597
+ margin: 0;
598
+ font-size: 20px;
599
+ font-weight: 600;
600
+ }
601
+
602
+ .staking-apy {
603
+ background-color: rgba(53, 242, 219, 0.2);
604
+ color: #35F2DB;
605
+ padding: 4px 8px;
606
+ border-radius: 4px;
607
+ font-size: 14px;
608
+ font-weight: 600;
609
+ }
610
+
611
+ .staking-metrics {
612
+ display: grid;
613
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
614
+ gap: 15px;
615
+ margin-bottom: 20px;
616
+ }
617
+
618
+ .staking-metric {
619
+ text-align: center;
620
+ }
621
+
622
+ .metric-label {
623
+ font-size: 14px;
624
+ opacity: 0.7;
625
+ margin-bottom: 5px;
626
+ }
627
+
628
+ .metric-value {
629
+ font-size: 18px;
630
+ font-weight: 600;
631
+ margin-bottom: 2px;
632
+ }
633
+
634
+ .metric-value-usd {
635
+ font-size: 14px;
636
+ color: #00E0FF;
637
+ }
638
+
639
+ .staking-button {
640
+ width: 100%;
641
+ background-color: rgba(0, 224, 255, 0.1);
642
+ border: 1px solid rgba(0, 224, 255, 0.2);
643
+ border-radius: 8px;
644
+ padding: 10px;
645
+ color: #00E0FF;
646
+ font-size: 14px;
647
+ cursor: pointer;
648
+ transition: all 0.2s ease;
649
+ }
650
+
651
+ .staking-button:hover {
652
+ background-color: rgba(0, 224, 255, 0.2);
653
+ }
654
+
655
+ .wallet-card.actions h3 {
656
+ margin: 0 0 15px 0;
657
+ font-size: 20px;
658
+ font-weight: 600;
659
+ }
660
+
661
+ .action-buttons {
662
+ display: grid;
663
+ grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
664
+ gap: 10px;
665
+ margin-bottom: 20px;
666
+ }
667
+
668
+ .action-button {
669
+ background-color: rgba(255, 255, 255, 0.05);
670
+ border: 1px solid rgba(255, 255, 255, 0.1);
671
+ border-radius: 8px;
672
+ padding: 10px;
673
+ color: white;
674
+ font-size: 14px;
675
+ cursor: pointer;
676
+ transition: all 0.2s ease;
677
+ }
678
+
679
+ .action-button:hover {
680
+ background-color: rgba(0, 224, 255, 0.1);
681
+ }
682
+
683
+ .action-button.active {
684
+ background-color: rgba(0, 224, 255, 0.2);
685
+ border-color: #00E0FF;
686
+ color: #00E0FF;
687
+ }
688
+
689
+ .token-action-form {
690
+ background-color: rgba(255, 255, 255, 0.05);
691
+ border-radius: 12px;
692
+ padding: 15px;
693
+ border: 1px solid rgba(0, 224, 255, 0.2);
694
+ animation: fadeIn 0.3s ease;
695
+ }
696
+
697
+ @keyframes fadeIn {
698
+ from {
699
+ opacity: 0;
700
+ transform: translateY(10px);
701
+ }
702
+ to {
703
+ opacity: 1;
704
+ transform: translateY(0);
705
+ }
706
+ }
707
+
708
+ .form-header h4 {
709
+ margin: 0 0 15px 0;
710
+ font-size: 16px;
711
+ font-weight: 600;
712
+ color: #00E0FF;
713
+ }
714
+
715
+ .form-content {
716
+ display: flex;
717
+ flex-direction: column;
718
+ gap: 15px;
719
+ }
720
+
721
+ .amount-selector {
722
+ display: flex;
723
+ flex-direction: column;
724
+ gap: 8px;
725
+ }
726
+
727
+ .amount-selector label {
728
+ font-size: 14px;
729
+ opacity: 0.7;
730
+ }
731
+
732
+ .amount-controls {
733
+ display: flex;
734
+ align-items: center;
735
+ }
736
+
737
+ .amount-button {
738
+ width: 30px;
739
+ height: 30px;
740
+ background-color: rgba(255, 255, 255, 0.1);
741
+ border: 1px solid rgba(255, 255, 255, 0.2);
742
+ border-radius: 4px;
743
+ color: white;
744
+ font-size: 16px;
745
+ display: flex;
746
+ justify-content: center;
747
+ align-items: center;
748
+ cursor: pointer;
749
+ }
750
+
751
+ .amount-button:hover:not(:disabled) {
752
+ background-color: rgba(0, 224, 255, 0.1);
753
+ }
754
+
755
+ .amount-button:disabled {
756
+ opacity: 0.5;
757
+ cursor: not-allowed;
758
+ }
759
+
760
+ .amount-controls input {
761
+ width: 60px;
762
+ height: 30px;
763
+ background-color: rgba(255, 255, 255, 0.05);
764
+ border: 1px solid rgba(255, 255, 255, 0.1);
765
+ border-radius: 4px;
766
+ color: white;
767
+ font-size: 14px;
768
+ text-align: center;
769
+ margin: 0 10px;
770
+ }
771
+
772
+ .conversion-preview {
773
+ background-color: rgba(0, 0, 0, 0.2);
774
+ border-radius: 8px;
775
+ padding: 10px;
776
+ }
777
+
778
+ .conversion-detail {
779
+ display: flex;
780
+ justify-content: space-between;
781
+ margin-bottom: 8px;
782
+ }
783
+
784
+ .conversion-detail:last-child {
785
+ margin-bottom: 0;
786
+ padding-top: 8px;
787
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
788
+ }
789
+
790
+ .detail-label {
791
+ font-size: 14px;
792
+ opacity: 0.7;
793
+ }
794
+
795
+ .detail-value {
796
+ font-size: 14px;
797
+ font-weight: 600;
798
+ }
799
+
800
+ .confirm-action-button {
801
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
802
+ border: none;
803
+ border-radius: 8px;
804
+ padding: 10px;
805
+ color: #0B0B0F;
806
+ font-size: 14px;
807
+ font-weight: 600;
808
+ cursor: pointer;
809
+ transition: all 0.2s ease;
810
+ }
811
+
812
+ .confirm-action-button:hover {
813
+ transform: translateY(-2px);
814
+ box-shadow: 0 5px 15px rgba(0, 224, 255, 0.3);
815
+ }
816
+
817
+ .transaction-history {
818
+ background: rgba(255, 255, 255, 0.05);
819
+ border-radius: 16px;
820
+ padding: 20px;
821
+ border: 1px solid rgba(0, 224, 255, 0.1);
822
+ }
823
+
824
+ .transaction-history h3 {
825
+ margin: 0 0 20px 0;
826
+ font-size: 20px;
827
+ font-weight: 600;
828
+ }
829
+
830
+ .history-tabs {
831
+ display: flex;
832
+ gap: 10px;
833
+ margin-bottom: 20px;
834
+ overflow-x: auto;
835
+ scrollbar-width: none;
836
+ }
837
+
838
+ .history-tabs::-webkit-scrollbar {
839
+ display: none;
840
+ }
841
+
842
+ .history-tab {
843
+ background-color: rgba(255, 255, 255, 0.05);
844
+ border: 1px solid rgba(255, 255, 255, 0.1);
845
+ border-radius: 8px;
846
+ padding: 8px 15px;
847
+ color: white;
848
+ font-size: 14px;
849
+ cursor: pointer;
850
+ transition: all 0.2s ease;
851
+ white-space: nowrap;
852
+ }
853
+
854
+ .history-tab:hover {
855
+ background-color: rgba(0, 224, 255, 0.1);
856
+ }
857
+
858
+ .history-tab.active {
859
+ background-color: rgba(0, 224, 255, 0.2);
860
+ border-color: #00E0FF;
861
+ color: #00E0FF;
862
+ }
863
+
864
+ .history-table {
865
+ width: 100%;
866
+ overflow-x: auto;
867
+ }
868
+
869
+ .date-column {
870
+ width: 120px;
871
+ padding: 0 10px;
872
+ }
873
+
874
+ .type-column {
875
+ flex: 1;
876
+ padding: 0 10px;
877
+ }
878
+
879
+ .amount-column {
880
+ width: 120px;
881
+ padding: 0 10px;
882
+ text-align: right;
883
+ }
884
+
885
+ .status-column {
886
+ width: 100px;
887
+ padding: 0 10px;
888
+ text-align: right;
889
+ }
890
+
891
+ .table-row.acquisition .amount-column {
892
+ color: #35F2DB;
893
+ }
894
+
895
+ .table-row.usage .amount-column {
896
+ color: #FF5555;
897
+ }
898
+
899
+ /* Ownership Tab */
900
+ .ownership-tab {
901
+ display: flex;
902
+ flex-direction: column;
903
+ gap: 30px;
904
+ }
905
+
906
+ .ownership-overview {
907
+ display: grid;
908
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
909
+ gap: 20px;
910
+ }
911
+
912
+ .ownership-card {
913
+ background: rgba(255, 255, 255, 0.05);
914
+ border-radius: 16px;
915
+ padding: 20px;
916
+ border: 1px solid rgba(0, 224, 255, 0.1);
917
+ }
918
+
919
+ .ownership-card h3 {
920
+ margin: 0 0 20px 0;
921
+ font-size: 20px;
922
+ font-weight: 600;
923
+ }
924
+
925
+ .ownership-percentage {
926
+ text-align: center;
927
+ margin-bottom: 20px;
928
+ }
929
+
930
+ .percentage-value {
931
+ font-size: 36px;
932
+ font-weight: 700;
933
+ margin-bottom: 5px;
934
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
935
+ -webkit-background-clip: text;
936
+ background-clip: text;
937
+ -webkit-text-fill-color: transparent;
938
+ }
939
+
940
+ .percentage-label {
941
+ font-size: 16px;
942
+ opacity: 0.7;
943
+ }
944
+
945
+ .ownership-details {
946
+ background-color: rgba(0, 0, 0, 0.2);
947
+ border-radius: 8px;
948
+ padding: 15px;
949
+ }
950
+
951
+ .detail-item {
952
+ display: flex;
953
+ justify-content: space-between;
954
+ margin-bottom: 10px;
955
+ }
956
+
957
+ .detail-item:last-child {
958
+ margin-bottom: 0;
959
+ }
960
+
961
+ .detail-label {
962
+ font-size: 14px;
963
+ opacity: 0.7;
964
+ }
965
+
966
+ .detail-value {
967
+ font-size: 14px;
968
+ font-weight: 600;
969
+ }
970
+
971
+ .returns-chart {
972
+ height: 200px;
973
+ margin-bottom: 15px;
974
+ display: flex;
975
+ justify-content: center;
976
+ align-items: flex-end;
977
+ }
978
+
979
+ .chart-bars {
980
+ width: 100%;
981
+ height: 100%;
982
+ display: flex;
983
+ justify-content: space-around;
984
+ align-items: flex-end;
985
+ }
986
+
987
+ .chart-bar-container {
988
+ display: flex;
989
+ flex-direction: column;
990
+ align-items: center;
991
+ height: 100%;
992
+ width: 60px;
993
+ }
994
+
995
+ .bar-label {
996
+ margin-bottom: 10px;
997
+ font-size: 12px;
998
+ opacity: 0.7;
999
+ }
1000
+
1001
+ .bar-wrapper {
1002
+ width: 40px;
1003
+ height: 80%;
1004
+ display: flex;
1005
+ align-items: flex-end;
1006
+ }
1007
+
1008
+ .bar {
1009
+ width: 100%;
1010
+ background: linear-gradient(180deg, #00E0FF, #35F2DB);
1011
+ border-radius: 4px 4px 0 0;
1012
+ transition: height 0.5s ease;
1013
+ }
1014
+
1015
+ .bar-value {
1016
+ margin-top: 10px;
1017
+ font-size: 12px;
1018
+ font-weight: 600;
1019
+ color: #00E0FF;
1020
+ }
1021
+
1022
+ .returns-note {
1023
+ font-size: 14px;
1024
+ opacity: 0.7;
1025
+ text-align: center;
1026
+ }
1027
+
1028
+ .asset-holdings {
1029
+ background: rgba(255, 255, 255, 0.05);
1030
+ border-radius: 16px;
1031
+ padding: 20px;
1032
+ border: 1px solid rgba(0, 224, 255, 0.1);
1033
+ }
1034
+
1035
+ .asset-holdings h3 {
1036
+ margin: 0 0 20px 0;
1037
+ font-size: 20px;
1038
+ font-weight: 600;
1039
+ }
1040
+
1041
+ .holdings-grid {
1042
+ display: grid;
1043
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
1044
+ gap: 20px;
1045
+ }
1046
+
1047
+ .holding-card {
1048
+ background-color: rgba(255, 255, 255, 0.05);
1049
+ border-radius: 12px;
1050
+ padding: 15px;
1051
+ border: 1px solid rgba(255, 255, 255, 0.1);
1052
+ }
1053
+
1054
+ .holding-card.operational {
1055
+ border-color: rgba(53, 242, 219, 0.3);
1056
+ }
1057
+
1058
+ .holding-card.construction {
1059
+ border-color: rgba(255, 193, 7, 0.3);
1060
+ }
1061
+
1062
+ .holding-card.planning {
1063
+ border-color: rgba(0, 224, 255, 0.3);
1064
+ }
1065
+
1066
+ .holding-header {
1067
+ display: flex;
1068
+ justify-content: space-between;
1069
+ align-items: center;
1070
+ margin-bottom: 15px;
1071
+ }
1072
+
1073
+ .holding-header h4 {
1074
+ margin: 0;
1075
+ font-size: 16px;
1076
+ font-weight: 600;
1077
+ }
1078
+
1079
+ .holding-status {
1080
+ padding: 4px 8px;
1081
+ border-radius: 4px;
1082
+ font-size: 12px;
1083
+ font-weight: 600;
1084
+ }
1085
+
1086
+ .holding-status.operational {
1087
+ background-color: rgba(53, 242, 219, 0.2);
1088
+ color: #35F2DB;
1089
+ }
1090
+
1091
+ .holding-status.construction {
1092
+ background-color: rgba(255, 193, 7, 0.2);
1093
+ color: #FFC107;
1094
+ }
1095
+
1096
+ .holding-status.planning {
1097
+ background-color: rgba(0, 224, 255, 0.2);
1098
+ color: #00E0FF;
1099
+ }
1100
+
1101
+ .holding-details {
1102
+ margin-bottom: 15px;
1103
+ }
1104
+
1105
+ .holding-item {
1106
+ display: flex;
1107
+ justify-content: space-between;
1108
+ margin-bottom: 8px;
1109
+ }
1110
+
1111
+ .holding-item:last-child {
1112
+ margin-bottom: 0;
1113
+ }
1114
+
1115
+ .item-label {
1116
+ font-size: 14px;
1117
+ opacity: 0.7;
1118
+ }
1119
+
1120
+ .item-value {
1121
+ font-size: 14px;
1122
+ font-weight: 600;
1123
+ }
1124
+
1125
+ .holding-actions {
1126
+ text-align: center;
1127
+ }
1128
+
1129
+ .view-details-button {
1130
+ width: 100%;
1131
+ background-color: rgba(255, 255, 255, 0.05);
1132
+ border: 1px solid rgba(255, 255, 255, 0.1);
1133
+ border-radius: 8px;
1134
+ padding: 8px;
1135
+ color: white;
1136
+ font-size: 14px;
1137
+ cursor: pointer;
1138
+ transition: all 0.2s ease;
1139
+ }
1140
+
1141
+ .view-details-button:hover {
1142
+ background-color: rgba(0, 224, 255, 0.1);
1143
+ }
1144
+
1145
+ .network-growth {
1146
+ background: rgba(255, 255, 255, 0.05);
1147
+ border-radius: 16px;
1148
+ padding: 20px;
1149
+ border: 1px solid rgba(0, 224, 255, 0.1);
1150
+ }
1151
+
1152
+ .network-growth h3 {
1153
+ margin: 0 0 20px 0;
1154
+ font-size: 20px;
1155
+ font-weight: 600;
1156
+ }
1157
+
1158
+ .opportunities-grid {
1159
+ display: grid;
1160
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
1161
+ gap: 20px;
1162
+ }
1163
+
1164
+ .opportunity-card {
1165
+ background-color: rgba(255, 255, 255, 0.05);
1166
+ border-radius: 12px;
1167
+ padding: 20px;
1168
+ border: 1px solid rgba(255, 255, 255, 0.1);
1169
+ display: flex;
1170
+ flex-direction: column;
1171
+ }
1172
+
1173
+ .opportunity-icon {
1174
+ font-size: 28px;
1175
+ margin-bottom: 10px;
1176
+ }
1177
+
1178
+ .opportunity-card h4 {
1179
+ margin: 0 0 10px 0;
1180
+ font-size: 18px;
1181
+ font-weight: 600;
1182
+ }
1183
+
1184
+ .opportunity-card p {
1185
+ margin: 0 0 15px 0;
1186
+ font-size: 14px;
1187
+ opacity: 0.8;
1188
+ line-height: 1.5;
1189
+ flex-grow: 1;
1190
+ }
1191
+
1192
+ .opportunity-metrics {
1193
+ display: flex;
1194
+ justify-content: space-between;
1195
+ margin-bottom: 15px;
1196
+ }
1197
+
1198
+ .metric {
1199
+ text-align: center;
1200
+ }
1201
+
1202
+ .metric-label {
1203
+ font-size: 12px;
1204
+ opacity: 0.7;
1205
+ margin-bottom: 5px;
1206
+ }
1207
+
1208
+ .metric-value {
1209
+ font-size: 16px;
1210
+ font-weight: 600;
1211
+ color: #00E0FF;
1212
+ }
1213
+
1214
+ .opportunity-button {
1215
+ background-color: rgba(0, 224, 255, 0.1);
1216
+ border: 1px solid rgba(0, 224, 255, 0.2);
1217
+ border-radius: 8px;
1218
+ padding: 8px;
1219
+ color: #00E0FF;
1220
+ font-size: 14px;
1221
+ cursor: pointer;
1222
+ transition: all 0.2s ease;
1223
+ }
1224
+
1225
+ .opportunity-button:hover {
1226
+ background-color: rgba(0, 224, 255, 0.2);
1227
+ }
1228
+
1229
+ /* Market Tab */
1230
+ .market-tab {
1231
+ display: flex;
1232
+ flex-direction: column;
1233
+ gap: 30px;
1234
+ }
1235
+
1236
+ .market-overview {
1237
+ display: grid;
1238
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
1239
+ gap: 20px;
1240
+ }
1241
+
1242
+ .market-card {
1243
+ background: rgba(255, 255, 255, 0.05);
1244
+ border-radius: 16px;
1245
+ padding: 20px;
1246
+ border: 1px solid rgba(0, 224, 255, 0.1);
1247
+ }
1248
+
1249
+ .market-card h3 {
1250
+ margin: 0 0 20px 0;
1251
+ font-size: 20px;
1252
+ font-weight: 600;
1253
+ }
1254
+
1255
+ .current-price {
1256
+ display: flex;
1257
+ align-items: center;
1258
+ gap: 10px;
1259
+ margin-bottom: 20px;
1260
+ }
1261
+
1262
+ .price-value {
1263
+ font-size: 36px;
1264
+ font-weight: 700;
1265
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
1266
+ -webkit-background-clip: text;
1267
+ background-clip: text;
1268
+ -webkit-text-fill-color: transparent;
1269
+ }
1270
+
1271
+ .price-change {
1272
+ padding: 4px 8px;
1273
+ border-radius: 4px;
1274
+ font-size: 14px;
1275
+ font-weight: 600;
1276
+ }
1277
+
1278
+ .price-chart {
1279
+ height: 200px;
1280
+ position: relative;
1281
+ padding-bottom: 30px;
1282
+ }
1283
+
1284
+ .chart-lines {
1285
+ width: 100%;
1286
+ height: 100%;
1287
+ position: relative;
1288
+ }
1289
+
1290
+ .chart-point {
1291
+ position: absolute;
1292
+ width: 10px;
1293
+ height: 10px;
1294
+ }
1295
+
1296
+ .point-dot {
1297
+ width: 10px;
1298
+ height: 10px;
1299
+ border-radius: 50%;
1300
+ background-color: #00E0FF;
1301
+ position: absolute;
1302
+ top: 0;
1303
+ left: 0;
1304
+ }
1305
+
1306
+ .point-line {
1307
+ height: 2px;
1308
+ background-color: #00E0FF;
1309
+ position: absolute;
1310
+ top: 5px;
1311
+ left: 0;
1312
+ }
1313
+
1314
+ .chart-labels {
1315
+ display: flex;
1316
+ justify-content: space-between;
1317
+ position: absolute;
1318
+ bottom: 0;
1319
+ left: 0;
1320
+ right: 0;
1321
+ }
1322
+
1323
+ .chart-label {
1324
+ position: absolute;
1325
+ font-size: 12px;
1326
+ opacity: 0.7;
1327
+ transform: translateX(-50%);
1328
+ }
1329
+
1330
+ .volume-chart {
1331
+ height: 200px;
1332
+ display: flex;
1333
+ justify-content: space-around;
1334
+ align-items: flex-end;
1335
+ }
1336
+
1337
+ .volume-bar-container {
1338
+ display: flex;
1339
+ flex-direction: column;
1340
+ align-items: center;
1341
+ width: 60px;
1342
+ }
1343
+
1344
+ .bar-wrapper {
1345
+ width: 40px;
1346
+ height: 150px;
1347
+ display: flex;
1348
+ align-items: flex-end;
1349
+ }
1350
+
1351
+ .volume-bar {
1352
+ width: 100%;
1353
+ background: linear-gradient(180deg, #FFC107, #FF9800);
1354
+ border-radius: 4px 4px 0 0;
1355
+ transition: height 0.5s ease;
1356
+ }
1357
+
1358
+ .price-projections {
1359
+ background: rgba(255, 255, 255, 0.05);
1360
+ border-radius: 16px;
1361
+ padding: 20px;
1362
+ border: 1px solid rgba(0, 224, 255, 0.1);
1363
+ }
1364
+
1365
+ .price-projections h3 {
1366
+ margin: 0 0 20px 0;
1367
+ font-size: 20px;
1368
+ font-weight: 600;
1369
+ }
1370
+
1371
+ .projections-chart {
1372
+ height: 250px;
1373
+ margin-bottom: 20px;
1374
+ }
1375
+
1376
+ .projection-bar-container {
1377
+ display: flex;
1378
+ flex-direction: column;
1379
+ align-items: center;
1380
+ width: 80px;
1381
+ }
1382
+
1383
+ .projection-range {
1384
+ width: 20px;
1385
+ background-color: rgba(0, 224, 255, 0.2);
1386
+ border-radius: 10px;
1387
+ position: absolute;
1388
+ }
1389
+
1390
+ .projection-line {
1391
+ width: 40px;
1392
+ height: 2px;
1393
+ background-color: #00E0FF;
1394
+ position: absolute;
1395
+ }
1396
+
1397
+ .range-values {
1398
+ display: flex;
1399
+ flex-direction: column;
1400
+ align-items: center;
1401
+ margin-top: 10px;
1402
+ }
1403
+
1404
+ .high-value, .low-value {
1405
+ font-size: 12px;
1406
+ font-weight: 600;
1407
+ }
1408
+
1409
+ .high-value {
1410
+ color: #35F2DB;
1411
+ }
1412
+
1413
+ .low-value {
1414
+ color: #00E0FF;
1415
+ margin-top: 5px;
1416
+ }
1417
+
1418
+ .projections-note {
1419
+ font-size: 14px;
1420
+ opacity: 0.7;
1421
+ text-align: center;
1422
+ line-height: 1.5;
1423
+ }
1424
+
1425
+ .market-insights {
1426
+ background: rgba(255, 255, 255, 0.05);
1427
+ border-radius: 16px;
1428
+ padding: 20px;
1429
+ border: 1px solid rgba(0, 224, 255, 0.1);
1430
+ }
1431
+
1432
+ .market-insights h3 {
1433
+ margin: 0 0 20px 0;
1434
+ font-size: 20px;
1435
+ font-weight: 600;
1436
+ }
1437
+
1438
+ .insights-grid {
1439
+ display: grid;
1440
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
1441
+ gap: 20px;
1442
+ }
1443
+
1444
+ .insight-card {
1445
+ background-color: rgba(255, 255, 255, 0.05);
1446
+ border-radius: 12px;
1447
+ padding: 15px;
1448
+ border: 1px solid rgba(255, 255, 255, 0.1);
1449
+ }
1450
+
1451
+ .insight-header {
1452
+ display: flex;
1453
+ align-items: center;
1454
+ gap: 10px;
1455
+ margin-bottom: 15px;
1456
+ }
1457
+
1458
+ .insight-icon {
1459
+ font-size: 24px;
1460
+ }
1461
+
1462
+ .insight-header h4 {
1463
+ margin: 0;
1464
+ font-size: 16px;
1465
+ font-weight: 600;
1466
+ }
1467
+
1468
+ .insight-list {
1469
+ margin: 0;
1470
+ padding-left: 20px;
1471
+ }
1472
+
1473
+ .insight-list li {
1474
+ margin-bottom: 8px;
1475
+ font-size: 14px;
1476
+ opacity: 0.8;
1477
+ line-height: 1.5;
1478
+ }
1479
+
1480
+ /* Token Flow Tab */
1481
+ .token-flow-tab {
1482
+ display: flex;
1483
+ flex-direction: column;
1484
+ gap: 30px;
1485
+ }
1486
+
1487
+ .flow-visualization {
1488
+ background: rgba(255, 255, 255, 0.05);
1489
+ border-radius: 16px;
1490
+ padding: 20px;
1491
+ border: 1px solid rgba(0, 224, 255, 0.1);
1492
+ }
1493
+
1494
+ .flow-visualization h3 {
1495
+ margin: 0 0 20px 0;
1496
+ font-size: 20px;
1497
+ font-weight: 600;
1498
+ }
1499
+
1500
+ .flow-container {
1501
+ height: 400px;
1502
+ position: relative;
1503
+ margin-bottom: 20px;
1504
+ }
1505
+
1506
+ .flow-diagram {
1507
+ width: 100%;
1508
+ height: 100%;
1509
+ position: relative;
1510
+ }
1511
+
1512
+ .flow-node {
1513
+ position: absolute;
1514
+ width: 120px;
1515
+ height: 120px;
1516
+ border-radius: 50%;
1517
+ background-color: rgba(255, 255, 255, 0.05);
1518
+ border: 1px solid rgba(255, 255, 255, 0.1);
1519
+ display: flex;
1520
+ flex-direction: column;
1521
+ justify-content: center;
1522
+ align-items: center;
1523
+ text-align: center;
1524
+ padding: 10px;
1525
+ }
1526
+
1527
+ .flow-node.subscribers {
1528
+ top: 50px;
1529
+ left: 50px;
1530
+ }
1531
+
1532
+ .flow-node.network {
1533
+ top: 50px;
1534
+ right: 50px;
1535
+ }
1536
+
1537
+ .flow-node.infrastructure {
1538
+ bottom: 50px;
1539
+ right: 50px;
1540
+ }
1541
+
1542
+ .flow-node.revenue {
1543
+ bottom: 50px;
1544
+ left: 50px;
1545
+ }
1546
+
1547
+ .node-icon {
1548
+ font-size: 24px;
1549
+ margin-bottom: 5px;
1550
+ }
1551
+
1552
+ .node-label {
1553
+ font-size: 14px;
1554
+ font-weight: 600;
1555
+ margin-bottom: 5px;
1556
+ }
1557
+
1558
+ .node-value {
1559
+ font-size: 12px;
1560
+ opacity: 0.7;
1561
+ }
1562
+
1563
+ .flow-path {
1564
+ position: absolute;
1565
+ height: 2px;
1566
+ background-color: rgba(255, 255, 255, 0.2);
1567
+ transform-origin: left center;
1568
+ }
1569
+
1570
+ .flow-path.subscription {
1571
+ top: 110px;
1572
+ left: 170px;
1573
+ width: calc(100% - 340px);
1574
+ }
1575
+
1576
+ .flow-path.redemption {
1577
+ top: 170px;
1578
+ left: 170px;
1579
+ width: calc(100% - 340px);
1580
+ transform: rotate(90deg);
1581
+ }
1582
+
1583
+ .flow-path.investment {
1584
+ bottom: 110px;
1585
+ left: 170px;
1586
+ width: calc(100% - 340px);
1587
+ }
1588
+
1589
+ .flow-path.returns {
1590
+ bottom: 170px;
1591
+ left: 170px;
1592
+ width: calc(100% - 340px);
1593
+ transform: rotate(90deg);
1594
+ }
1595
+
1596
+ .path-label {
1597
+ position: absolute;
1598
+ top: -20px;
1599
+ left: 50%;
1600
+ transform: translateX(-50%);
1601
+ font-size: 12px;
1602
+ opacity: 0.7;
1603
+ white-space: nowrap;
1604
+ }
1605
+
1606
+ .token-particle {
1607
+ position: absolute;
1608
+ width: 8px;
1609
+ height: 8px;
1610
+ border-radius: 50%;
1611
+ background-color: #00E0FF;
1612
+ top: -3px;
1613
+ }
1614
+
1615
+ .flow-diagram.animate .token-particle {
1616
+ animation: moveParticle 5s infinite linear;
1617
+ }
1618
+
1619
+ @keyframes moveParticle {
1620
+ 0% {
1621
+ left: 0;
1622
+ opacity: 0;
1623
+ }
1624
+ 10% {
1625
+ opacity: 1;
1626
+ }
1627
+ 90% {
1628
+ opacity: 1;
1629
+ }
1630
+ 100% {
1631
+ left: 100%;
1632
+ opacity: 0;
1633
+ }
1634
+ }
1635
+
1636
+ .flow-diagram.animate .flow-path.subscription .token-particle:nth-child(1) {
1637
+ animation-delay: 0s;
1638
+ }
1639
+
1640
+ .flow-diagram.animate .flow-path.subscription .token-particle:nth-child(2) {
1641
+ animation-delay: 1.5s;
1642
+ }
1643
+
1644
+ .flow-diagram.animate .flow-path.subscription .token-particle:nth-child(3) {
1645
+ animation-delay: 3s;
1646
+ }
1647
+
1648
+ .flow-diagram.animate .flow-path.redemption .token-particle:nth-child(1) {
1649
+ animation-delay: 0.5s;
1650
+ }
1651
+
1652
+ .flow-diagram.animate .flow-path.redemption .token-particle:nth-child(2) {
1653
+ animation-delay: 2.5s;
1654
+ }
1655
+
1656
+ .flow-diagram.animate .flow-path.investment .token-particle:nth-child(1) {
1657
+ animation-delay: 1s;
1658
+ }
1659
+
1660
+ .flow-diagram.animate .flow-path.investment .token-particle:nth-child(2) {
1661
+ animation-delay: 2s;
1662
+ }
1663
+
1664
+ .flow-diagram.animate .flow-path.investment .token-particle:nth-child(3) {
1665
+ animation-delay: 3.5s;
1666
+ }
1667
+
1668
+ .flow-diagram.animate .flow-path.returns .token-particle:nth-child(1) {
1669
+ animation-delay: 1.5s;
1670
+ }
1671
+
1672
+ .flow-diagram.animate .flow-path.returns .token-particle:nth-child(2) {
1673
+ animation-delay: 3.5s;
1674
+ }
1675
+
1676
+ .flow-controls {
1677
+ text-align: center;
1678
+ }
1679
+
1680
+ .animate-flow-button {
1681
+ background-color: rgba(0, 224, 255, 0.1);
1682
+ border: 1px solid rgba(0, 224, 255, 0.2);
1683
+ border-radius: 8px;
1684
+ padding: 10px 20px;
1685
+ color: #00E0FF;
1686
+ font-size: 14px;
1687
+ cursor: pointer;
1688
+ transition: all 0.2s ease;
1689
+ }
1690
+
1691
+ .animate-flow-button:hover {
1692
+ background-color: rgba(0, 224, 255, 0.2);
1693
+ }
1694
+
1695
+ .flow-explanation {
1696
+ background: rgba(255, 255, 255, 0.05);
1697
+ border-radius: 16px;
1698
+ padding: 20px;
1699
+ border: 1px solid rgba(0, 224, 255, 0.1);
1700
+ }
1701
+
1702
+ .flow-explanation h3 {
1703
+ margin: 0 0 20px 0;
1704
+ font-size: 20px;
1705
+ font-weight: 600;
1706
+ }
1707
+
1708
+ .explanation-steps {
1709
+ display: flex;
1710
+ flex-direction: column;
1711
+ gap: 20px;
1712
+ }
1713
+
1714
+ .step {
1715
+ display: flex;
1716
+ gap: 15px;
1717
+ }
1718
+
1719
+ .step-number {
1720
+ width: 30px;
1721
+ height: 30px;
1722
+ background-color: rgba(0, 224, 255, 0.2);
1723
+ border-radius: 50%;
1724
+ display: flex;
1725
+ justify-content: center;
1726
+ align-items: center;
1727
+ font-size: 16px;
1728
+ font-weight: 600;
1729
+ color: #00E0FF;
1730
+ flex-shrink: 0;
1731
+ }
1732
+
1733
+ .step-content {
1734
+ flex: 1;
1735
+ }
1736
+
1737
+ .step-content h4 {
1738
+ margin: 0 0 10px 0;
1739
+ font-size: 16px;
1740
+ font-weight: 600;
1741
+ }
1742
+
1743
+ .step-content p {
1744
+ margin: 0;
1745
+ font-size: 14px;
1746
+ opacity: 0.8;
1747
+ line-height: 1.5;
1748
+ }
1749
+
1750
+ .token-benefits {
1751
+ background: rgba(255, 255, 255, 0.05);
1752
+ border-radius: 16px;
1753
+ padding: 20px;
1754
+ border: 1px solid rgba(0, 224, 255, 0.1);
1755
+ }
1756
+
1757
+ .token-benefits h3 {
1758
+ margin: 0 0 20px 0;
1759
+ font-size: 20px;
1760
+ font-weight: 600;
1761
+ }
1762
+
1763
+ .benefits-grid {
1764
+ display: grid;
1765
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
1766
+ gap: 20px;
1767
+ }
1768
+
1769
+ .benefit-card {
1770
+ background-color: rgba(255, 255, 255, 0.05);
1771
+ border-radius: 12px;
1772
+ padding: 20px;
1773
+ border: 1px solid rgba(255, 255, 255, 0.1);
1774
+ }
1775
+
1776
+ .benefit-icon {
1777
+ font-size: 28px;
1778
+ margin-bottom: 10px;
1779
+ }
1780
+
1781
+ .benefit-card h4 {
1782
+ margin: 0 0 10px 0;
1783
+ font-size: 18px;
1784
+ font-weight: 600;
1785
+ }
1786
+
1787
+ .benefit-card p {
1788
+ margin: 0;
1789
+ font-size: 14px;
1790
+ opacity: 0.8;
1791
+ line-height: 1.5;
1792
+ }
1793
+
1794
+ /* Token Confirmation Modal */
1795
+ .token-confirmation-modal {
1796
+ position: fixed;
1797
+ top: 0;
1798
+ left: 0;
1799
+ right: 0;
1800
+ bottom: 0;
1801
+ background-color: rgba(0, 0, 0, 0.8);
1802
+ display: flex;
1803
+ justify-content: center;
1804
+ align-items: center;
1805
+ z-index: 1000;
1806
+ backdrop-filter: blur(5px);
1807
+ }
1808
+
1809
+ .modal-content {
1810
+ background-color: #0B0B0F;
1811
+ border-radius: 16px;
1812
+ padding: 30px;
1813
+ border: 1px solid rgba(0, 224, 255, 0.3);
1814
+ width: 90%;
1815
+ max-width: 400px;
1816
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
1817
+ animation: modalFadeIn 0.3s ease;
1818
+ }
1819
+
1820
+ @keyframes modalFadeIn {
1821
+ from {
1822
+ opacity: 0;
1823
+ transform: translateY(20px);
1824
+ }
1825
+ to {
1826
+ opacity: 1;
1827
+ transform: translateY(0);
1828
+ }
1829
+ }
1830
+
1831
+ .modal-content h3 {
1832
+ margin: 0 0 20px 0;
1833
+ font-size: 24px;
1834
+ font-weight: 600;
1835
+ text-align: center;
1836
+ }
1837
+
1838
+ .confirmation-details {
1839
+ margin-bottom: 20px;
1840
+ }
1841
+
1842
+ .confirmation-item {
1843
+ display: flex;
1844
+ justify-content: space-between;
1845
+ padding: 10px 0;
1846
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
1847
+ }
1848
+
1849
+ .confirmation-actions {
1850
+ display: flex;
1851
+ justify-content: space-between;
1852
+ gap: 15px;
1853
+ }
1854
+
1855
+ .cancel-button, .confirm-button {
1856
+ flex: 1;
1857
+ padding: 12px;
1858
+ border-radius: 8px;
1859
+ font-size: 16px;
1860
+ font-weight: 600;
1861
+ cursor: pointer;
1862
+ transition: all 0.2s ease;
1863
+ }
1864
+
1865
+ .cancel-button {
1866
+ background-color: rgba(255, 255, 255, 0.1);
1867
+ border: 1px solid rgba(255, 255, 255, 0.2);
1868
+ color: white;
1869
+ }
1870
+
1871
+ .confirm-button {
1872
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
1873
+ border: none;
1874
+ color: #0B0B0F;
1875
+ }
1876
+
1877
+ .cancel-button:hover, .confirm-button:hover {
1878
+ transform: translateY(-2px);
1879
+ }
1880
+
1881
+ /* Footer */
1882
+ .demo-footer {
1883
+ display: flex;
1884
+ justify-content: space-between;
1885
+ align-items: center;
1886
+ padding: 20px;
1887
+ background-color: rgba(20, 20, 30, 0.8);
1888
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
1889
+ margin-top: 30px;
1890
+ }
1891
+
1892
+ .footer-info {
1893
+ display: flex;
1894
+ flex-direction: column;
1895
+ gap: 5px;
1896
+ }
1897
+
1898
+ .footer-info span {
1899
+ font-size: 12px;
1900
+ opacity: 0.7;
1901
+ }
1902
+
1903
+ .footer-links {
1904
+ display: flex;
1905
+ gap: 20px;
1906
+ }
1907
+
1908
+ .footer-link {
1909
+ font-size: 12px;
1910
+ opacity: 0.7;
1911
+ text-decoration: none;
1912
+ color: white;
1913
+ transition: all 0.2s ease;
1914
+ }
1915
+
1916
+ .footer-link:hover {
1917
+ opacity: 1;
1918
+ color: #00E0FF;
1919
+ }
1920
+
1921
+ /* Responsive Adjustments */
1922
+ @media (max-width: 768px) {
1923
+ .demo-header {
1924
+ flex-direction: column;
1925
+ align-items: flex-start;
1926
+ gap: 15px;
1927
+ }
1928
+
1929
+ .token-stats {
1930
+ width: 100%;
1931
+ justify-content: space-between;
1932
+ }
1933
+
1934
+ .metrics-grid {
1935
+ grid-template-columns: 1fr;
1936
+ }
1937
+
1938
+ .distribution-chart {
1939
+ flex-direction: column;
1940
+ align-items: center;
1941
+ }
1942
+
1943
+ .utility-grid, .insights-grid, .benefits-grid {
1944
+ grid-template-columns: 1fr;
1945
+ }
1946
+
1947
+ .wallet-overview, .ownership-overview, .market-overview {
1948
+ grid-template-columns: 1fr;
1949
+ }
1950
+
1951
+ .action-buttons {
1952
+ grid-template-columns: 1fr;
1953
+ }
1954
+
1955
+ .holdings-grid, .opportunities-grid {
1956
+ grid-template-columns: 1fr;
1957
+ }
1958
+
1959
+ .flow-node {
1960
+ width: 80px;
1961
+ height: 80px;
1962
+ }
1963
+
1964
+ .flow-node.subscribers {
1965
+ top: 30px;
1966
+ left: 30px;
1967
+ }
1968
+
1969
+ .flow-node.network {
1970
+ top: 30px;
1971
+ right: 30px;
1972
+ }
1973
+
1974
+ .flow-node.infrastructure {
1975
+ bottom: 30px;
1976
+ right: 30px;
1977
+ }
1978
+
1979
+ .flow-node.revenue {
1980
+ bottom: 30px;
1981
+ left: 30px;
1982
+ }
1983
+
1984
+ .flow-path.subscription {
1985
+ top: 70px;
1986
+ left: 110px;
1987
+ width: calc(100% - 220px);
1988
+ }
1989
+
1990
+ .flow-path.redemption {
1991
+ top: 110px;
1992
+ left: 110px;
1993
+ width: calc(100% - 220px);
1994
+ }
1995
+
1996
+ .flow-path.investment {
1997
+ bottom: 70px;
1998
+ left: 110px;
1999
+ width: calc(100% - 220px);
2000
+ }
2001
+
2002
+ .flow-path.returns {
2003
+ bottom: 110px;
2004
+ left: 110px;
2005
+ width: calc(100% - 220px);
2006
+ }
2007
+
2008
+ .step {
2009
+ flex-direction: column;
2010
+ gap: 10px;
2011
+ }
2012
+
2013
+ .confirmation-actions {
2014
+ flex-direction: column;
2015
+ }
2016
+
2017
+ .demo-footer {
2018
+ flex-direction: column;
2019
+ gap: 15px;
2020
+ }
2021
+
2022
+ .footer-links {
2023
+ width: 100%;
2024
+ justify-content: space-between;
2025
+ }
2026
+ }
ChainlinkDemo.jsx ADDED
@@ -0,0 +1,1082 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useState, useEffect } from 'react';
2
+ import './ChainlinkDemo.css';
3
+
4
+ // Mock data for demonstration purposes
5
+ const mockTokenData = {
6
+ networkStats: {
7
+ totalTokens: 1000000,
8
+ circulatingSupply: 350000,
9
+ reservedPool: 650000,
10
+ tokenPrice: 2.75,
11
+ marketCap: 962500,
12
+ stakeholders: 1250,
13
+ chargingHubs: 36,
14
+ totalTransactions: 15782
15
+ },
16
+ userWallet: {
17
+ balance: 45,
18
+ stakingRewards: 3.2,
19
+ acquisitionHistory: [
20
+ { date: "Apr 1, 2025", amount: 15, source: "Monthly Subscription", price: 2.65 },
21
+ { date: "Mar 1, 2025", amount: 15, source: "Monthly Subscription", price: 2.58 },
22
+ { date: "Feb 1, 2025", amount: 15, source: "Monthly Subscription", price: 2.42 }
23
+ ],
24
+ transactionHistory: [
25
+ { date: "Mar 15, 2025", type: "Staking", amount: 20, status: "Active" },
26
+ { date: "Mar 10, 2025", type: "Charging Credit", amount: 5, status: "Completed" },
27
+ { date: "Feb 22, 2025", type: "Governance Vote", amount: 0, status: "Completed" }
28
+ ]
29
+ },
30
+ assetOwnership: {
31
+ totalOwnership: 0.0045, // percentage of network
32
+ hubs: [
33
+ { id: 101, name: "Springfield Downtown", ownership: 0.0012, status: "Operational", monthlyRevenue: 0.32 },
34
+ { id: 102, name: "Champaign-Urbana Hub", ownership: 0.0018, status: "Construction", monthlyRevenue: 0 },
35
+ { id: 103, name: "Bloomington-Normal", ownership: 0.0015, status: "Planning", monthlyRevenue: 0 }
36
+ ],
37
+ projectedReturns: [
38
+ { year: 2025, quarter: 2, returns: 0.45 },
39
+ { year: 2025, quarter: 3, returns: 0.68 },
40
+ { year: 2025, quarter: 4, returns: 0.92 },
41
+ { year: 2026, quarter: 1, returns: 1.25 }
42
+ ]
43
+ },
44
+ tokenomics: {
45
+ distribution: [
46
+ { category: "Subscriber Rewards", percentage: 35, color: "#00E0FF" },
47
+ { category: "Infrastructure Development", percentage: 25, color: "#35F2DB" },
48
+ { category: "Operations", percentage: 15, color: "#FFC107" },
49
+ { category: "Community Governance", percentage: 10, color: "#FF5555" },
50
+ { category: "Partnerships", percentage: 10, color: "#9C27B0" },
51
+ { category: "Reserve", percentage: 5, color: "#607D8B" }
52
+ ],
53
+ utilityFunctions: [
54
+ { function: "Charging Credits", description: "Redeem tokens for charging credits at The Link hubs" },
55
+ { function: "Subscription Discounts", description: "Apply tokens toward Unity Fleet subscription fees" },
56
+ { function: "Governance Rights", description: "Vote on network expansion and feature development" },
57
+ { function: "Revenue Sharing", description: "Earn a portion of network revenue based on token holdings" },
58
+ { function: "Asset Ownership", description: "Tokens represent fractional ownership in physical infrastructure" }
59
+ ],
60
+ valueDrivers: [
61
+ { driver: "Network Expansion", impact: "High", description: "Each new charging hub increases token utility and demand" },
62
+ { driver: "EV Adoption Rate", impact: "High", description: "Accelerating EV adoption drives charging demand and token usage" },
63
+ { driver: "Subscription Growth", impact: "Medium", description: "New subscribers receive tokens, increasing distribution and usage" },
64
+ { driver: "Energy Efficiency", impact: "Medium", description: "Optimized energy usage improves hub profitability and token value" },
65
+ { driver: "Governance Decisions", impact: "Low", description: "Community governance ensures alignment with token holder interests" }
66
+ ]
67
+ },
68
+ marketData: {
69
+ priceHistory: [
70
+ { month: "Jan", price: 2.25 },
71
+ { month: "Feb", price: 2.42 },
72
+ { month: "Mar", price: 2.58 },
73
+ { month: "Apr", price: 2.75 }
74
+ ],
75
+ volumeHistory: [
76
+ { month: "Jan", volume: 15000 },
77
+ { month: "Feb", volume: 22500 },
78
+ { month: "Mar", volume: 28000 },
79
+ { month: "Apr", volume: 35000 }
80
+ ],
81
+ projections: [
82
+ { quarter: "Q2 2025", lowEstimate: 2.85, highEstimate: 3.25 },
83
+ { quarter: "Q3 2025", lowEstimate: 3.10, highEstimate: 3.75 },
84
+ { quarter: "Q4 2025", lowEstimate: 3.50, highEstimate: 4.50 },
85
+ { quarter: "Q1 2026", lowEstimate: 4.00, highEstimate: 5.25 }
86
+ ]
87
+ }
88
+ };
89
+
90
+ function ChainlinkDemo() {
91
+ const [activeTab, setActiveTab] = useState('overview');
92
+ const [loading, setLoading] = useState(true);
93
+ const [selectedAsset, setSelectedAsset] = useState(null);
94
+ const [tokenAction, setTokenAction] = useState(null);
95
+ const [tokenAmount, setTokenAmount] = useState(1);
96
+ const [showConfirmation, setShowConfirmation] = useState(false);
97
+ const [animateTokenFlow, setAnimateTokenFlow] = useState(false);
98
+
99
+ useEffect(() => {
100
+ // Simulate loading
101
+ const timer = setTimeout(() => {
102
+ setLoading(false);
103
+ }, 1500);
104
+
105
+ return () => clearTimeout(timer);
106
+ }, []);
107
+
108
+ const handleAssetSelect = (asset) => {
109
+ setSelectedAsset(asset);
110
+ };
111
+
112
+ const handleTokenActionSelect = (action) => {
113
+ setTokenAction(action);
114
+ setShowConfirmation(false);
115
+ };
116
+
117
+ const handleTokenAmountChange = (amount) => {
118
+ setTokenAmount(Math.max(1, Math.min(mockTokenData.userWallet.balance, amount)));
119
+ };
120
+
121
+ const handleActionConfirm = () => {
122
+ setShowConfirmation(true);
123
+ };
124
+
125
+ const handleTokenFlowDemo = () => {
126
+ setAnimateTokenFlow(true);
127
+ setTimeout(() => {
128
+ setAnimateTokenFlow(false);
129
+ }, 5000);
130
+ };
131
+
132
+ // Helper function to render the network overview
133
+ const renderOverview = () => {
134
+ const { networkStats, tokenomics } = mockTokenData;
135
+
136
+ return (
137
+ <div className="overview-tab">
138
+ <div className="network-stats">
139
+ <div className="stats-card token-supply">
140
+ <h3>Token Supply & Distribution</h3>
141
+ <div className="token-supply-chart">
142
+ <div className="supply-chart-container">
143
+ <div className="supply-chart">
144
+ <div
145
+ className="supply-segment circulating"
146
+ style={{
147
+ transform: `rotate(0deg) skew(${90 - (networkStats.circulatingSupply / networkStats.totalTokens) * 360}deg)`
148
+ }}
149
+ ></div>
150
+ <div
151
+ className="supply-segment reserved"
152
+ style={{
153
+ transform: `rotate(${(networkStats.circulatingSupply / networkStats.totalTokens) * 360}deg) skew(${90 - (networkStats.reservedPool / networkStats.totalTokens) * 360}deg)`
154
+ }}
155
+ ></div>
156
+ <div className="supply-inner">
157
+ <div className="supply-value">{networkStats.totalTokens.toLocaleString()}</div>
158
+ <div className="supply-label">Total Tokens</div>
159
+ </div>
160
+ </div>
161
+ </div>
162
+ <div className="supply-legend">
163
+ <div className="legend-item">
164
+ <div className="legend-color circulating"></div>
165
+ <div className="legend-label">Circulating Supply</div>
166
+ <div className="legend-value">{networkStats.circulatingSupply.toLocaleString()} tokens</div>
167
+ </div>
168
+ <div className="legend-item">
169
+ <div className="legend-color reserved"></div>
170
+ <div className="legend-label">Reserved Pool</div>
171
+ <div className="legend-value">{networkStats.reservedPool.toLocaleString()} tokens</div>
172
+ </div>
173
+ </div>
174
+ </div>
175
+ </div>
176
+
177
+ <div className="stats-card network-metrics">
178
+ <h3>Network Metrics</h3>
179
+ <div className="metrics-grid">
180
+ <div className="metric-item">
181
+ <div className="metric-icon">💰</div>
182
+ <div className="metric-value">${networkStats.tokenPrice.toFixed(2)}</div>
183
+ <div className="metric-label">Token Price</div>
184
+ </div>
185
+ <div className="metric-item">
186
+ <div className="metric-icon">📊</div>
187
+ <div className="metric-value">${networkStats.marketCap.toLocaleString()}</div>
188
+ <div className="metric-label">Market Cap</div>
189
+ </div>
190
+ <div className="metric-item">
191
+ <div className="metric-icon">👥</div>
192
+ <div className="metric-value">{networkStats.stakeholders.toLocaleString()}</div>
193
+ <div className="metric-label">Stakeholders</div>
194
+ </div>
195
+ <div className="metric-item">
196
+ <div className="metric-icon">🔌</div>
197
+ <div className="metric-value">{networkStats.chargingHubs}</div>
198
+ <div className="metric-label">Charging Hubs</div>
199
+ </div>
200
+ </div>
201
+ </div>
202
+ </div>
203
+
204
+ <div className="token-distribution">
205
+ <h3>Token Distribution</h3>
206
+ <div className="distribution-chart">
207
+ <div className="pie-chart-container">
208
+ <div className="pie-chart">
209
+ {tokenomics.distribution.map((segment, index) => {
210
+ const previousSegments = tokenomics.distribution
211
+ .slice(0, index)
212
+ .reduce((sum, item) => sum + item.percentage, 0);
213
+
214
+ return (
215
+ <div
216
+ key={index}
217
+ className="pie-segment"
218
+ style={{
219
+ transform: `rotate(${previousSegments * 3.6}deg) skew(${90 - segment.percentage * 3.6}deg)`,
220
+ background: segment.color
221
+ }}
222
+ ></div>
223
+ );
224
+ })}
225
+ <div className="pie-inner">
226
+ <div className="pie-icon">⬡</div>
227
+ </div>
228
+ </div>
229
+ </div>
230
+ <div className="distribution-legend">
231
+ {tokenomics.distribution.map((segment, index) => (
232
+ <div key={index} className="legend-item">
233
+ <div className="legend-color" style={{ backgroundColor: segment.color }}></div>
234
+ <div className="legend-label">{segment.category}</div>
235
+ <div className="legend-value">{segment.percentage}%</div>
236
+ </div>
237
+ ))}
238
+ </div>
239
+ </div>
240
+ </div>
241
+
242
+ <div className="token-utility">
243
+ <h3>Token Utility Functions</h3>
244
+ <div className="utility-grid">
245
+ {tokenomics.utilityFunctions.map((utility, index) => (
246
+ <div key={index} className="utility-card">
247
+ <div className="utility-header">
248
+ <div className="utility-icon">⬡</div>
249
+ <h4>{utility.function}</h4>
250
+ </div>
251
+ <p>{utility.description}</p>
252
+ </div>
253
+ ))}
254
+ </div>
255
+ </div>
256
+
257
+ <div className="value-drivers">
258
+ <h3>Value Drivers</h3>
259
+ <div className="drivers-table">
260
+ <div className="table-header">
261
+ <div className="driver-column">Driver</div>
262
+ <div className="impact-column">Impact</div>
263
+ <div className="description-column">Description</div>
264
+ </div>
265
+ {tokenomics.valueDrivers.map((driver, index) => (
266
+ <div key={index} className="table-row">
267
+ <div className="driver-column">{driver.driver}</div>
268
+ <div className={`impact-column impact-${driver.impact.toLowerCase()}`}>{driver.impact}</div>
269
+ <div className="description-column">{driver.description}</div>
270
+ </div>
271
+ ))}
272
+ </div>
273
+ </div>
274
+ </div>
275
+ );
276
+ };
277
+
278
+ // Helper function to render the wallet tab
279
+ const renderWallet = () => {
280
+ const { userWallet } = mockTokenData;
281
+
282
+ return (
283
+ <div className="wallet-tab">
284
+ <div className="wallet-overview">
285
+ <div className="wallet-card balance">
286
+ <div className="wallet-icon">⬡</div>
287
+ <div className="wallet-balance">{userWallet.balance}</div>
288
+ <div className="wallet-label">Available Tokens</div>
289
+ <div className="wallet-value">${(userWallet.balance * mockTokenData.networkStats.tokenPrice).toFixed(2)}</div>
290
+ </div>
291
+
292
+ <div className="wallet-card staking">
293
+ <div className="staking-header">
294
+ <h3>Staking Rewards</h3>
295
+ <div className="staking-apy">8.5% APY</div>
296
+ </div>
297
+ <div className="staking-metrics">
298
+ <div className="staking-metric">
299
+ <div className="metric-label">Monthly Rewards</div>
300
+ <div className="metric-value">{userWallet.stakingRewards} tokens</div>
301
+ <div className="metric-value-usd">${(userWallet.stakingRewards * mockTokenData.networkStats.tokenPrice).toFixed(2)}</div>
302
+ </div>
303
+ <div className="staking-metric">
304
+ <div className="metric-label">Staked Amount</div>
305
+ <div className="metric-value">20 tokens</div>
306
+ <div className="metric-value-usd">${(20 * mockTokenData.networkStats.tokenPrice).toFixed(2)}</div>
307
+ </div>
308
+ </div>
309
+ <button className="staking-button">Manage Staking</button>
310
+ </div>
311
+
312
+ <div className="wallet-card actions">
313
+ <h3>Token Actions</h3>
314
+ <div className="action-buttons">
315
+ <button
316
+ className={`action-button ${tokenAction === 'redeem' ? 'active' : ''}`}
317
+ onClick={() => handleTokenActionSelect('redeem')}
318
+ >
319
+ Redeem for Credits
320
+ </button>
321
+ <button
322
+ className={`action-button ${tokenAction === 'stake' ? 'active' : ''}`}
323
+ onClick={() => handleTokenActionSelect('stake')}
324
+ >
325
+ Stake Tokens
326
+ </button>
327
+ <button
328
+ className={`action-button ${tokenAction === 'vote' ? 'active' : ''}`}
329
+ onClick={() => handleTokenActionSelect('vote')}
330
+ >
331
+ Governance Vote
332
+ </button>
333
+ </div>
334
+
335
+ {tokenAction && (
336
+ <div className="token-action-form">
337
+ <div className="form-header">
338
+ <h4>
339
+ {tokenAction === 'redeem' ? 'Redeem Tokens for Credits' :
340
+ tokenAction === 'stake' ? 'Stake Tokens for Rewards' :
341
+ 'Use Tokens for Governance Vote'}
342
+ </h4>
343
+ </div>
344
+
345
+ <div className="form-content">
346
+ <div className="amount-selector">
347
+ <label>Token Amount</label>
348
+ <div className="amount-controls">
349
+ <button
350
+ className="amount-button decrease"
351
+ onClick={() => handleTokenAmountChange(tokenAmount - 1)}
352
+ disabled={tokenAmount <= 1}
353
+ >
354
+ -
355
+ </button>
356
+ <input
357
+ type="number"
358
+ value={tokenAmount}
359
+ onChange={(e) => handleTokenAmountChange(parseInt(e.target.value) || 1)}
360
+ min="1"
361
+ max={userWallet.balance}
362
+ />
363
+ <button
364
+ className="amount-button increase"
365
+ onClick={() => handleTokenAmountChange(tokenAmount + 1)}
366
+ disabled={tokenAmount >= userWallet.balance}
367
+ >
368
+ +
369
+ </button>
370
+ </div>
371
+ </div>
372
+
373
+ <div className="conversion-preview">
374
+ {tokenAction === 'redeem' && (
375
+ <div className="conversion-detail">
376
+ <span className="detail-label">Charging Credits:</span>
377
+ <span className="detail-value">{tokenAmount * 10} credits</span>
378
+ </div>
379
+ )}
380
+ {tokenAction === 'stake' && (
381
+ <div className="conversion-detail">
382
+ <span className="detail-label">Monthly Rewards:</span>
383
+ <span className="detail-value">{(tokenAmount * 0.085 / 12).toFixed(2)} tokens</span>
384
+ </div>
385
+ )}
386
+ {tokenAction === 'vote' && (
387
+ <div className="conversion-detail">
388
+ <span className="detail-label">Voting Power:</span>
389
+ <span className="detail-value">{tokenAmount} votes</span>
390
+ </div>
391
+ )}
392
+ <div className="conversion-detail">
393
+ <span className="detail-label">Token Value:</span>
394
+ <span className="detail-value">${(tokenAmount * mockTokenData.networkStats.tokenPrice).toFixed(2)}</span>
395
+ </div>
396
+ </div>
397
+
398
+ <button
399
+ className="confirm-action-button"
400
+ onClick={handleActionConfirm}
401
+ >
402
+ Confirm {tokenAction === 'redeem' ? 'Redemption' : tokenAction === 'stake' ? 'Staking' : 'Vote'}
403
+ </button>
404
+ </div>
405
+ </div>
406
+ )}
407
+ </div>
408
+ </div>
409
+
410
+ <div className="transaction-history">
411
+ <h3>Transaction History</h3>
412
+ <div className="history-tabs">
413
+ <button
414
+ className={`history-tab ${!selectedAsset ? 'active' : ''}`}
415
+ onClick={() => setSelectedAsset(null)}
416
+ >
417
+ All Transactions
418
+ </button>
419
+ <button
420
+ className={`history-tab ${selectedAsset === 'acquisition' ? 'active' : ''}`}
421
+ onClick={() => handleAssetSelect('acquisition')}
422
+ >
423
+ Token Acquisition
424
+ </button>
425
+ <button
426
+ className={`history-tab ${selectedAsset === 'usage' ? 'active' : ''}`}
427
+ onClick={() => handleAssetSelect('usage')}
428
+ >
429
+ Token Usage
430
+ </button>
431
+ </div>
432
+
433
+ <div className="history-table">
434
+ <div className="table-header">
435
+ <div className="date-column">Date</div>
436
+ <div className="type-column">Type</div>
437
+ <div className="amount-column">Amount</div>
438
+ <div className="status-column">Status</div>
439
+ </div>
440
+
441
+ {!selectedAsset && (
442
+ <>
443
+ {userWallet.acquisitionHistory.map((transaction, index) => (
444
+ <div key={`acq-${index}`} className="table-row acquisition">
445
+ <div className="date-column">{transaction.date}</div>
446
+ <div className="type-column">{transaction.source}</div>
447
+ <div className="amount-column">+{transaction.amount} tokens</div>
448
+ <div className="status-column">Completed</div>
449
+ </div>
450
+ ))}
451
+ {userWallet.transactionHistory.map((transaction, index) => (
452
+ <div key={`tx-${index}`} className="table-row usage">
453
+ <div className="date-column">{transaction.date}</div>
454
+ <div className="type-column">{transaction.type}</div>
455
+ <div className="amount-column">{transaction.amount > 0 ? `-${transaction.amount} tokens` : 'N/A'}</div>
456
+ <div className="status-column">{transaction.status}</div>
457
+ </div>
458
+ ))}
459
+ </>
460
+ )}
461
+
462
+ {selectedAsset === 'acquisition' && (
463
+ <>
464
+ {userWallet.acquisitionHistory.map((transaction, index) => (
465
+ <div key={index} className="table-row acquisition">
466
+ <div className="date-column">{transaction.date}</div>
467
+ <div className="type-column">{transaction.source}</div>
468
+ <div className="amount-column">+{transaction.amount} tokens</div>
469
+ <div className="status-column">Completed</div>
470
+ </div>
471
+ ))}
472
+ </>
473
+ )}
474
+
475
+ {selectedAsset === 'usage' && (
476
+ <>
477
+ {userWallet.transactionHistory.map((transaction, index) => (
478
+ <div key={index} className="table-row usage">
479
+ <div className="date-column">{transaction.date}</div>
480
+ <div className="type-column">{transaction.type}</div>
481
+ <div className="amount-column">{transaction.amount > 0 ? `-${transaction.amount} tokens` : 'N/A'}</div>
482
+ <div className="status-column">{transaction.status}</div>
483
+ </div>
484
+ ))}
485
+ </>
486
+ )}
487
+ </div>
488
+ </div>
489
+ </div>
490
+ );
491
+ };
492
+
493
+ // Helper function to render the asset ownership tab
494
+ const renderAssetOwnership = () => {
495
+ const { assetOwnership } = mockTokenData;
496
+
497
+ return (
498
+ <div className="ownership-tab">
499
+ <div className="ownership-overview">
500
+ <div className="ownership-card summary">
501
+ <h3>Your Network Ownership</h3>
502
+ <div className="ownership-percentage">
503
+ <div className="percentage-value">{(assetOwnership.totalOwnership * 100).toFixed(4)}%</div>
504
+ <div className="percentage-label">of The Link Network</div>
505
+ </div>
506
+ <div className="ownership-details">
507
+ <div className="detail-item">
508
+ <div className="detail-label">Token Holdings</div>
509
+ <div className="detail-value">{mockTokenData.userWallet.balance} tokens</div>
510
+ </div>
511
+ <div className="detail-item">
512
+ <div className="detail-label">Network Value</div>
513
+ <div className="detail-value">${(mockTokenData.networkStats.marketCap).toLocaleString()}</div>
514
+ </div>
515
+ <div className="detail-item">
516
+ <div className="detail-label">Your Share Value</div>
517
+ <div className="detail-value">
518
+ ${(mockTokenData.networkStats.marketCap * assetOwnership.totalOwnership).toFixed(2)}
519
+ </div>
520
+ </div>
521
+ </div>
522
+ </div>
523
+
524
+ <div className="ownership-card projections">
525
+ <h3>Projected Returns</h3>
526
+ <div className="returns-chart">
527
+ <div className="chart-bars">
528
+ {assetOwnership.projectedReturns.map((quarter, index) => (
529
+ <div key={index} className="chart-bar-container">
530
+ <div className="bar-label">{`Q${quarter.quarter} ${quarter.year}`}</div>
531
+ <div className="bar-wrapper">
532
+ <div
533
+ className="bar"
534
+ style={{ height: `${quarter.returns * 50}%` }}
535
+ ></div>
536
+ </div>
537
+ <div className="bar-value">${quarter.returns.toFixed(2)}</div>
538
+ </div>
539
+ ))}
540
+ </div>
541
+ </div>
542
+ <div className="returns-note">
543
+ Projected returns based on current token holdings and network growth forecasts.
544
+ </div>
545
+ </div>
546
+ </div>
547
+
548
+ <div className="asset-holdings">
549
+ <h3>Your Infrastructure Holdings</h3>
550
+ <div className="holdings-grid">
551
+ {assetOwnership.hubs.map((hub, index) => (
552
+ <div key={index} className={`holding-card ${hub.status.toLowerCase()}`}>
553
+ <div className="holding-header">
554
+ <h4>{hub.name}</h4>
555
+ <div className={`holding-status ${hub.status.toLowerCase()}`}>
556
+ {hub.status}
557
+ </div>
558
+ </div>
559
+ <div className="holding-details">
560
+ <div className="holding-item">
561
+ <div className="item-label">Ownership Stake</div>
562
+ <div className="item-value">{(hub.ownership * 100).toFixed(4)}%</div>
563
+ </div>
564
+ <div className="holding-item">
565
+ <div className="item-label">Monthly Revenue</div>
566
+ <div className="item-value">
567
+ {hub.monthlyRevenue > 0 ? `$${hub.monthlyRevenue.toFixed(2)}` : 'Pending'}
568
+ </div>
569
+ </div>
570
+ <div className="holding-item">
571
+ <div className="item-label">Token Allocation</div>
572
+ <div className="item-value">
573
+ {Math.round(mockTokenData.userWallet.balance * (hub.ownership / assetOwnership.totalOwnership))} tokens
574
+ </div>
575
+ </div>
576
+ </div>
577
+ <div className="holding-actions">
578
+ <button className="view-details-button">View Details</button>
579
+ </div>
580
+ </div>
581
+ ))}
582
+ </div>
583
+ </div>
584
+
585
+ <div className="network-growth">
586
+ <h3>Network Growth Opportunities</h3>
587
+ <div className="opportunities-grid">
588
+ <div className="opportunity-card">
589
+ <div className="opportunity-icon">🏙️</div>
590
+ <h4>Urban Hub Expansion</h4>
591
+ <p>New charging hubs planned for Chicago metro area in Q3 2025.</p>
592
+ <div className="opportunity-metrics">
593
+ <div className="metric">
594
+ <div className="metric-label">Projected ROI</div>
595
+ <div className="metric-value">12.5%</div>
596
+ </div>
597
+ <div className="metric">
598
+ <div className="metric-label">Min. Investment</div>
599
+ <div className="metric-value">50 tokens</div>
600
+ </div>
601
+ </div>
602
+ <button className="opportunity-button">Express Interest</button>
603
+ </div>
604
+
605
+ <div className="opportunity-card">
606
+ <div className="opportunity-icon">🛣️</div>
607
+ <h4>I-55 Corridor</h4>
608
+ <p>Strategic corridor deployment connecting Chicago to St. Louis.</p>
609
+ <div className="opportunity-metrics">
610
+ <div className="metric">
611
+ <div className="metric-label">Projected ROI</div>
612
+ <div className="metric-value">9.8%</div>
613
+ </div>
614
+ <div className="metric">
615
+ <div className="metric-label">Min. Investment</div>
616
+ <div className="metric-value">25 tokens</div>
617
+ </div>
618
+ </div>
619
+ <button className="opportunity-button">Express Interest</button>
620
+ </div>
621
+
622
+ <div className="opportunity-card">
623
+ <div className="opportunity-icon">🔋</div>
624
+ <h4>Battery Storage Upgrade</h4>
625
+ <p>Technology upgrade for existing hubs to increase capacity.</p>
626
+ <div className="opportunity-metrics">
627
+ <div className="metric">
628
+ <div className="metric-label">Projected ROI</div>
629
+ <div className="metric-value">7.2%</div>
630
+ </div>
631
+ <div className="metric">
632
+ <div className="metric-label">Min. Investment</div>
633
+ <div className="metric-value">10 tokens</div>
634
+ </div>
635
+ </div>
636
+ <button className="opportunity-button">Express Interest</button>
637
+ </div>
638
+ </div>
639
+ </div>
640
+ </div>
641
+ );
642
+ };
643
+
644
+ // Helper function to render the market data tab
645
+ const renderMarketData = () => {
646
+ const { marketData } = mockTokenData;
647
+
648
+ return (
649
+ <div className="market-tab">
650
+ <div className="market-overview">
651
+ <div className="market-card price">
652
+ <h3>Token Price</h3>
653
+ <div className="current-price">
654
+ <div className="price-value">${mockTokenData.networkStats.tokenPrice.toFixed(2)}</div>
655
+ <div className="price-change positive">+6.6% (30d)</div>
656
+ </div>
657
+ <div className="price-chart">
658
+ <div className="chart-lines">
659
+ {marketData.priceHistory.map((month, index) => (
660
+ <div key={index} className="chart-point" style={{ left: `${index * 33}%`, bottom: `${(month.price / 3) * 100}%` }}>
661
+ <div className="point-dot"></div>
662
+ {index > 0 && (
663
+ <div
664
+ className="point-line"
665
+ style={{
666
+ width: `33%`,
667
+ transform: `rotate(${Math.atan2(
668
+ (month.price - marketData.priceHistory[index - 1].price) / 3,
669
+ 0.33
670
+ ) * (180 / Math.PI)}deg)`,
671
+ transformOrigin: 'left center'
672
+ }}
673
+ ></div>
674
+ )}
675
+ </div>
676
+ ))}
677
+ </div>
678
+ <div className="chart-labels">
679
+ {marketData.priceHistory.map((month, index) => (
680
+ <div key={index} className="chart-label" style={{ left: `${index * 33}%` }}>
681
+ {month.month}
682
+ </div>
683
+ ))}
684
+ </div>
685
+ </div>
686
+ </div>
687
+
688
+ <div className="market-card volume">
689
+ <h3>Trading Volume</h3>
690
+ <div className="volume-chart">
691
+ {marketData.volumeHistory.map((month, index) => (
692
+ <div key={index} className="volume-bar-container">
693
+ <div className="bar-label">{month.month}</div>
694
+ <div className="bar-wrapper">
695
+ <div
696
+ className="volume-bar"
697
+ style={{ height: `${(month.volume / 40000) * 100}%` }}
698
+ ></div>
699
+ </div>
700
+ <div className="bar-value">{month.volume.toLocaleString()}</div>
701
+ </div>
702
+ ))}
703
+ </div>
704
+ </div>
705
+ </div>
706
+
707
+ <div className="price-projections">
708
+ <h3>Price Projections</h3>
709
+ <div className="projections-chart">
710
+ <div className="chart-bars">
711
+ {marketData.projections.map((quarter, index) => (
712
+ <div key={index} className="projection-bar-container">
713
+ <div className="bar-label">{quarter.quarter}</div>
714
+ <div className="bar-wrapper">
715
+ <div
716
+ className="projection-range"
717
+ style={{
718
+ height: `${(quarter.highEstimate / 6) * 100}%`,
719
+ bottom: `${(quarter.lowEstimate / 6) * 100}%`
720
+ }}
721
+ ></div>
722
+ <div
723
+ className="projection-line"
724
+ style={{
725
+ bottom: `${((quarter.highEstimate + quarter.lowEstimate) / 2 / 6) * 100}%`
726
+ }}
727
+ ></div>
728
+ </div>
729
+ <div className="range-values">
730
+ <div className="high-value">${quarter.highEstimate.toFixed(2)}</div>
731
+ <div className="low-value">${quarter.lowEstimate.toFixed(2)}</div>
732
+ </div>
733
+ </div>
734
+ ))}
735
+ </div>
736
+ </div>
737
+ <div className="projections-note">
738
+ Projections based on network growth, EV adoption rates, and infrastructure expansion plans.
739
+ Actual results may vary.
740
+ </div>
741
+ </div>
742
+
743
+ <div className="market-insights">
744
+ <h3>Market Insights</h3>
745
+ <div className="insights-grid">
746
+ <div className="insight-card">
747
+ <div className="insight-header">
748
+ <div className="insight-icon">📈</div>
749
+ <h4>Growth Drivers</h4>
750
+ </div>
751
+ <ul className="insight-list">
752
+ <li>Illinois EV adoption projected to reach 7.8% by end of 2025</li>
753
+ <li>State incentives for charging infrastructure increasing by 25%</li>
754
+ <li>Phase 2 expansion adding 8 new charging hubs in Q3 2025</li>
755
+ <li>Corporate fleet partnerships expected to drive token demand</li>
756
+ </ul>
757
+ </div>
758
+
759
+ <div className="insight-card">
760
+ <div className="insight-header">
761
+ <div className="insight-icon">⚖️</div>
762
+ <h4>Risk Factors</h4>
763
+ </div>
764
+ <ul className="insight-list">
765
+ <li>Regulatory changes in tokenized asset classification</li>
766
+ <li>Competition from other charging networks</li>
767
+ <li>Supply chain constraints for charging equipment</li>
768
+ <li>Potential delays in infrastructure deployment timeline</li>
769
+ </ul>
770
+ </div>
771
+
772
+ <div className="insight-card">
773
+ <div className="insight-header">
774
+ <div className="insight-icon">🔮</div>
775
+ <h4>Future Developments</h4>
776
+ </div>
777
+ <ul className="insight-list">
778
+ <li>Token governance system launching in Q3 2025</li>
779
+ <li>Secondary market for token trading in development</li>
780
+ <li>Enhanced staking rewards program planned for Q4 2025</li>
781
+ <li>Cross-network partnerships with other mobility tokens</li>
782
+ </ul>
783
+ </div>
784
+ </div>
785
+ </div>
786
+ </div>
787
+ );
788
+ };
789
+
790
+ // Helper function to render the token flow visualization
791
+ const renderTokenFlow = () => {
792
+ return (
793
+ <div className="token-flow-tab">
794
+ <div className="flow-visualization">
795
+ <h3>Token Flow Visualization</h3>
796
+ <div className="flow-container">
797
+ <div className={`flow-diagram ${animateTokenFlow ? 'animate' : ''}`}>
798
+ <div className="flow-node subscribers">
799
+ <div className="node-icon">👤</div>
800
+ <div className="node-label">Subscribers</div>
801
+ <div className="node-value">1,250 users</div>
802
+ </div>
803
+
804
+ <div className="flow-node network">
805
+ <div className="node-icon">⬡</div>
806
+ <div className="node-label">Token Network</div>
807
+ <div className="node-value">1M tokens</div>
808
+ </div>
809
+
810
+ <div className="flow-node infrastructure">
811
+ <div className="node-icon">🔌</div>
812
+ <div className="node-label">Charging Hubs</div>
813
+ <div className="node-value">36 locations</div>
814
+ </div>
815
+
816
+ <div className="flow-node revenue">
817
+ <div className="node-icon">💰</div>
818
+ <div className="node-label">Revenue Pool</div>
819
+ <div className="node-value">$125K monthly</div>
820
+ </div>
821
+
822
+ <div className="flow-path subscription">
823
+ <div className="path-label">Monthly Subscription</div>
824
+ <div className="token-particle"></div>
825
+ <div className="token-particle"></div>
826
+ <div className="token-particle"></div>
827
+ </div>
828
+
829
+ <div className="flow-path redemption">
830
+ <div className="path-label">Token Redemption</div>
831
+ <div className="token-particle"></div>
832
+ <div className="token-particle"></div>
833
+ </div>
834
+
835
+ <div className="flow-path investment">
836
+ <div className="path-label">Infrastructure Investment</div>
837
+ <div className="token-particle"></div>
838
+ <div className="token-particle"></div>
839
+ <div className="token-particle"></div>
840
+ </div>
841
+
842
+ <div className="flow-path returns">
843
+ <div className="path-label">Revenue Distribution</div>
844
+ <div className="token-particle"></div>
845
+ <div className="token-particle"></div>
846
+ </div>
847
+ </div>
848
+ </div>
849
+ <div className="flow-controls">
850
+ <button className="animate-flow-button" onClick={handleTokenFlowDemo}>
851
+ Animate Token Flow
852
+ </button>
853
+ </div>
854
+ </div>
855
+
856
+ <div className="flow-explanation">
857
+ <h3>How ChainLink Tokens Work</h3>
858
+ <div className="explanation-steps">
859
+ <div className="step">
860
+ <div className="step-number">1</div>
861
+ <div className="step-content">
862
+ <h4>Token Distribution</h4>
863
+ <p>
864
+ Unity Fleet subscribers earn ChainLink tokens monthly as part of their subscription.
865
+ These tokens represent fractional ownership in The Link charging infrastructure.
866
+ </p>
867
+ </div>
868
+ </div>
869
+
870
+ <div className="step">
871
+ <div className="step-number">2</div>
872
+ <div className="step-content">
873
+ <h4>Token Utility</h4>
874
+ <p>
875
+ Tokens can be redeemed for charging credits, applied to subscription discounts,
876
+ or held as an investment in the growing charging network.
877
+ </p>
878
+ </div>
879
+ </div>
880
+
881
+ <div className="step">
882
+ <div className="step-number">3</div>
883
+ <div className="step-content">
884
+ <h4>Infrastructure Expansion</h4>
885
+ <p>
886
+ Token value is backed by physical charging infrastructure. As the network grows,
887
+ token holders benefit from increased utility and potential value appreciation.
888
+ </p>
889
+ </div>
890
+ </div>
891
+
892
+ <div className="step">
893
+ <div className="step-number">4</div>
894
+ <div className="step-content">
895
+ <h4>Revenue Sharing</h4>
896
+ <p>
897
+ Charging revenue is distributed to token holders proportional to their ownership stake,
898
+ creating a sustainable economic model that aligns all stakeholders.
899
+ </p>
900
+ </div>
901
+ </div>
902
+ </div>
903
+ </div>
904
+
905
+ <div className="token-benefits">
906
+ <h3>Benefits of Tokenization</h3>
907
+ <div className="benefits-grid">
908
+ <div className="benefit-card">
909
+ <div className="benefit-icon">🔄</div>
910
+ <h4>Circular Economy</h4>
911
+ <p>
912
+ Creates a closed-loop system where subscribers become stakeholders,
913
+ aligning incentives across the ecosystem.
914
+ </p>
915
+ </div>
916
+
917
+ <div className="benefit-card">
918
+ <div className="benefit-icon">📊</div>
919
+ <h4>Transparent Ownership</h4>
920
+ <p>
921
+ Blockchain-based tokens provide clear, verifiable ownership records
922
+ and automated distribution of benefits.
923
+ </p>
924
+ </div>
925
+
926
+ <div className="benefit-card">
927
+ <div className="benefit-icon">🌱</div>
928
+ <h4>Sustainable Funding</h4>
929
+ <p>
930
+ Tokenization creates a sustainable funding model for infrastructure
931
+ development without relying solely on external investment.
932
+ </p>
933
+ </div>
934
+
935
+ <div className="benefit-card">
936
+ <div className="benefit-icon">🔐</div>
937
+ <h4>Community Governance</h4>
938
+ <p>
939
+ Token holders can participate in network decisions, ensuring
940
+ the system evolves to meet community needs.
941
+ </p>
942
+ </div>
943
+ </div>
944
+ </div>
945
+ </div>
946
+ );
947
+ };
948
+
949
+ if (loading) {
950
+ return (
951
+ <div className="chainlink-demo loading">
952
+ <div className="loading-logo">
953
+ <img src="/images/unity_fleet_logo.png" alt="Unity Fleet" />
954
+ <div className="loading-pulse"></div>
955
+ </div>
956
+ <p>Loading ChainLink Tokenization Demo...</p>
957
+ </div>
958
+ );
959
+ }
960
+
961
+ return (
962
+ <div className="chainlink-demo">
963
+ <header className="demo-header">
964
+ <div className="demo-title">
965
+ <h1>ChainLink Tokenization</h1>
966
+ <span className="demo-subtitle">Unity Fleet Ownership Model</span>
967
+ </div>
968
+
969
+ <div className="token-stats">
970
+ <div className="token-price">
971
+ <span className="price-label">Token Price:</span>
972
+ <span className="price-value">${mockTokenData.networkStats.tokenPrice.toFixed(2)}</span>
973
+ <span className="price-change positive">+6.6%</span>
974
+ </div>
975
+ <div className="token-market-cap">
976
+ <span className="cap-label">Market Cap:</span>
977
+ <span className="cap-value">${mockTokenData.networkStats.marketCap.toLocaleString()}</span>
978
+ </div>
979
+ </div>
980
+ </header>
981
+
982
+ <div className="demo-navigation">
983
+ <button
984
+ className={`nav-button ${activeTab === 'overview' ? 'active' : ''}`}
985
+ onClick={() => setActiveTab('overview')}
986
+ >
987
+ Network Overview
988
+ </button>
989
+ <button
990
+ className={`nav-button ${activeTab === 'wallet' ? 'active' : ''}`}
991
+ onClick={() => setActiveTab('wallet')}
992
+ >
993
+ Token Wallet
994
+ </button>
995
+ <button
996
+ className={`nav-button ${activeTab === 'ownership' ? 'active' : ''}`}
997
+ onClick={() => setActiveTab('ownership')}
998
+ >
999
+ Asset Ownership
1000
+ </button>
1001
+ <button
1002
+ className={`nav-button ${activeTab === 'market' ? 'active' : ''}`}
1003
+ onClick={() => setActiveTab('market')}
1004
+ >
1005
+ Market Data
1006
+ </button>
1007
+ <button
1008
+ className={`nav-button ${activeTab === 'flow' ? 'active' : ''}`}
1009
+ onClick={() => setActiveTab('flow')}
1010
+ >
1011
+ Token Flow
1012
+ </button>
1013
+ </div>
1014
+
1015
+ <main className="demo-content">
1016
+ {activeTab === 'overview' && renderOverview()}
1017
+ {activeTab === 'wallet' && renderWallet()}
1018
+ {activeTab === 'ownership' && renderAssetOwnership()}
1019
+ {activeTab === 'market' && renderMarketData()}
1020
+ {activeTab === 'flow' && renderTokenFlow()}
1021
+ </main>
1022
+
1023
+ {showConfirmation && (
1024
+ <div className="token-confirmation-modal">
1025
+ <div className="modal-content">
1026
+ <h3>Confirm Token Action</h3>
1027
+
1028
+ <div className="confirmation-details">
1029
+ <div className="confirmation-item">
1030
+ <span className="item-label">Action:</span>
1031
+ <span className="item-value">
1032
+ {tokenAction === 'redeem' ? 'Redeem Tokens for Credits' :
1033
+ tokenAction === 'stake' ? 'Stake Tokens for Rewards' :
1034
+ 'Use Tokens for Governance Vote'}
1035
+ </span>
1036
+ </div>
1037
+ <div className="confirmation-item">
1038
+ <span className="item-label">Amount:</span>
1039
+ <span className="item-value">{tokenAmount} tokens</span>
1040
+ </div>
1041
+ <div className="confirmation-item">
1042
+ <span className="item-label">Value:</span>
1043
+ <span className="item-value">${(tokenAmount * mockTokenData.networkStats.tokenPrice).toFixed(2)}</span>
1044
+ </div>
1045
+ {tokenAction === 'redeem' && (
1046
+ <div className="confirmation-item">
1047
+ <span className="item-label">Credits:</span>
1048
+ <span className="item-value">{tokenAmount * 10} charging credits</span>
1049
+ </div>
1050
+ )}
1051
+ {tokenAction === 'stake' && (
1052
+ <div className="confirmation-item">
1053
+ <span className="item-label">Monthly Reward:</span>
1054
+ <span className="item-value">{(tokenAmount * 0.085 / 12).toFixed(2)} tokens</span>
1055
+ </div>
1056
+ )}
1057
+ </div>
1058
+
1059
+ <div className="confirmation-actions">
1060
+ <button className="cancel-button" onClick={() => setShowConfirmation(false)}>Cancel</button>
1061
+ <button className="confirm-button">Confirm</button>
1062
+ </div>
1063
+ </div>
1064
+ </div>
1065
+ )}
1066
+
1067
+ <footer className="demo-footer">
1068
+ <div className="footer-info">
1069
+ <span>ChainLink Tokenization Demo</span>
1070
+ <span>Powered by Atlas Intelligence</span>
1071
+ </div>
1072
+ <div className="footer-links">
1073
+ <a href="#" className="footer-link">Token Whitepaper</a>
1074
+ <a href="#" className="footer-link">Legal Disclosure</a>
1075
+ <a href="#" className="footer-link">FAQ</a>
1076
+ </div>
1077
+ </footer>
1078
+ </div>
1079
+ );
1080
+ }
1081
+
1082
+ export default ChainlinkDemo;
ChargingHub.css ADDED
@@ -0,0 +1,568 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Charging Hub Styles */
2
+ .charging-hub {
3
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
4
+ max-width: 1200px;
5
+ margin: 0 auto;
6
+ background-color: #0B0B0F;
7
+ color: #ffffff;
8
+ min-height: 100vh;
9
+ position: relative;
10
+ }
11
+
12
+ /* Loading Screen */
13
+ .charging-hub.loading {
14
+ display: flex;
15
+ flex-direction: column;
16
+ justify-content: center;
17
+ align-items: center;
18
+ height: 100vh;
19
+ }
20
+
21
+ .loading-logo {
22
+ width: 150px;
23
+ height: 150px;
24
+ margin-bottom: 20px;
25
+ position: relative;
26
+ }
27
+
28
+ .loading-logo img {
29
+ width: 100%;
30
+ height: 100%;
31
+ object-fit: contain;
32
+ }
33
+
34
+ .loading-pulse {
35
+ position: absolute;
36
+ top: 0;
37
+ left: 0;
38
+ right: 0;
39
+ bottom: 0;
40
+ border-radius: 50%;
41
+ border: 2px solid #00E0FF;
42
+ animation: pulse 1.5s infinite ease-in-out;
43
+ }
44
+
45
+ @keyframes pulse {
46
+ 0% {
47
+ transform: scale(0.95);
48
+ opacity: 1;
49
+ }
50
+ 70% {
51
+ transform: scale(1.2);
52
+ opacity: 0;
53
+ }
54
+ 100% {
55
+ transform: scale(0.95);
56
+ opacity: 0;
57
+ }
58
+ }
59
+
60
+ /* Header */
61
+ .hub-header {
62
+ display: flex;
63
+ justify-content: space-between;
64
+ align-items: center;
65
+ padding: 20px;
66
+ background-color: rgba(20, 20, 30, 0.8);
67
+ backdrop-filter: blur(10px);
68
+ position: sticky;
69
+ top: 0;
70
+ z-index: 100;
71
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
72
+ }
73
+
74
+ .hub-title {
75
+ display: flex;
76
+ flex-direction: column;
77
+ }
78
+
79
+ .hub-title h1 {
80
+ margin: 0;
81
+ font-size: 28px;
82
+ font-weight: 700;
83
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
84
+ -webkit-background-clip: text;
85
+ background-clip: text;
86
+ -webkit-text-fill-color: transparent;
87
+ letter-spacing: 1px;
88
+ }
89
+
90
+ .hub-subtitle {
91
+ font-size: 14px;
92
+ opacity: 0.7;
93
+ }
94
+
95
+ .hub-status {
96
+ display: flex;
97
+ gap: 20px;
98
+ }
99
+
100
+ .status-item {
101
+ display: flex;
102
+ align-items: center;
103
+ gap: 8px;
104
+ }
105
+
106
+ .status-label {
107
+ font-size: 14px;
108
+ opacity: 0.7;
109
+ }
110
+
111
+ .status-value {
112
+ font-size: 14px;
113
+ font-weight: 600;
114
+ }
115
+
116
+ .status-value.operational {
117
+ color: #35F2DB;
118
+ }
119
+
120
+ .hub-actions {
121
+ display: flex;
122
+ align-items: center;
123
+ gap: 12px;
124
+ }
125
+
126
+ .action-button {
127
+ display: flex;
128
+ align-items: center;
129
+ gap: 6px;
130
+ background-color: rgba(255, 255, 255, 0.05);
131
+ border: 1px solid rgba(0, 224, 255, 0.2);
132
+ border-radius: 8px;
133
+ padding: 8px 12px;
134
+ color: white;
135
+ font-size: 14px;
136
+ cursor: pointer;
137
+ transition: all 0.2s ease;
138
+ }
139
+
140
+ .action-button:hover {
141
+ background-color: rgba(0, 224, 255, 0.1);
142
+ }
143
+
144
+ .action-button .icon {
145
+ font-size: 16px;
146
+ }
147
+
148
+ .user-profile {
149
+ width: 36px;
150
+ height: 36px;
151
+ border-radius: 50%;
152
+ overflow: hidden;
153
+ border: 2px solid #00E0FF;
154
+ }
155
+
156
+ .user-profile img {
157
+ width: 100%;
158
+ height: 100%;
159
+ object-fit: cover;
160
+ }
161
+
162
+ /* Navigation */
163
+ .hub-navigation {
164
+ display: flex;
165
+ gap: 2px;
166
+ background-color: rgba(20, 20, 30, 0.5);
167
+ padding: 0 20px;
168
+ overflow-x: auto;
169
+ scrollbar-width: none;
170
+ }
171
+
172
+ .hub-navigation::-webkit-scrollbar {
173
+ display: none;
174
+ }
175
+
176
+ .nav-button {
177
+ padding: 16px 20px;
178
+ background: transparent;
179
+ border: none;
180
+ color: white;
181
+ font-size: 16px;
182
+ cursor: pointer;
183
+ position: relative;
184
+ white-space: nowrap;
185
+ }
186
+
187
+ .nav-button.active {
188
+ color: #00E0FF;
189
+ }
190
+
191
+ .nav-button.active::after {
192
+ content: '';
193
+ position: absolute;
194
+ bottom: 0;
195
+ left: 0;
196
+ right: 0;
197
+ height: 3px;
198
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
199
+ border-radius: 3px 3px 0 0;
200
+ }
201
+
202
+ /* Main Content */
203
+ .hub-content {
204
+ padding: 20px;
205
+ min-height: calc(100vh - 200px);
206
+ }
207
+
208
+ /* Dashboard View */
209
+ .dashboard-view {
210
+ display: grid;
211
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
212
+ gap: 20px;
213
+ }
214
+
215
+ .hub-overview {
216
+ display: grid;
217
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
218
+ gap: 20px;
219
+ }
220
+
221
+ .overview-card {
222
+ background: rgba(255, 255, 255, 0.05);
223
+ border-radius: 16px;
224
+ padding: 20px;
225
+ border: 1px solid rgba(0, 224, 255, 0.1);
226
+ }
227
+
228
+ .overview-card h3 {
229
+ margin-top: 0;
230
+ margin-bottom: 16px;
231
+ font-size: 18px;
232
+ font-weight: 600;
233
+ }
234
+
235
+ .location-details {
236
+ margin-bottom: 16px;
237
+ }
238
+
239
+ .location-name {
240
+ font-size: 16px;
241
+ font-weight: 600;
242
+ margin-bottom: 4px;
243
+ }
244
+
245
+ .location-address {
246
+ font-size: 14px;
247
+ opacity: 0.7;
248
+ }
249
+
250
+ .location-map {
251
+ height: 150px;
252
+ border-radius: 8px;
253
+ overflow: hidden;
254
+ }
255
+
256
+ .location-map img {
257
+ width: 100%;
258
+ height: 100%;
259
+ object-fit: cover;
260
+ }
261
+
262
+ .occupancy-gauge {
263
+ display: flex;
264
+ flex-direction: column;
265
+ align-items: center;
266
+ margin-bottom: 16px;
267
+ }
268
+
269
+ /* Status Badges */
270
+ .status-badge {
271
+ display: inline-block;
272
+ padding: 4px 8px;
273
+ border-radius: 4px;
274
+ font-size: 12px;
275
+ font-weight: 600;
276
+ text-transform: uppercase;
277
+ }
278
+
279
+ .status-badge.available {
280
+ background-color: rgba(53, 242, 219, 0.2);
281
+ color: #35F2DB;
282
+ }
283
+
284
+ .status-badge.charging {
285
+ background-color: rgba(0, 224, 255, 0.2);
286
+ color: #00E0FF;
287
+ }
288
+
289
+ .status-badge.reserved {
290
+ background-color: rgba(255, 193, 7, 0.2);
291
+ color: #FFC107;
292
+ }
293
+
294
+ .status-badge.maintenance {
295
+ background-color: rgba(255, 85, 85, 0.2);
296
+ color: #FF5555;
297
+ }
298
+
299
+ /* Progress Bar */
300
+ .progress-container {
301
+ width: 100%;
302
+ height: 8px;
303
+ background-color: rgba(255, 255, 255, 0.1);
304
+ border-radius: 4px;
305
+ margin-top: 8px;
306
+ position: relative;
307
+ overflow: hidden;
308
+ }
309
+
310
+ .progress-bar {
311
+ height: 100%;
312
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
313
+ border-radius: 4px;
314
+ position: relative;
315
+ }
316
+
317
+ .progress-glow {
318
+ position: absolute;
319
+ top: 0;
320
+ right: 0;
321
+ bottom: 0;
322
+ width: 20px;
323
+ background: linear-gradient(90deg, rgba(0, 224, 255, 0), #00E0FF);
324
+ animation: glow 1.5s infinite;
325
+ }
326
+
327
+ @keyframes glow {
328
+ 0% {
329
+ opacity: 0.3;
330
+ }
331
+ 50% {
332
+ opacity: 1;
333
+ }
334
+ 100% {
335
+ opacity: 0.3;
336
+ }
337
+ }
338
+
339
+ .progress-text {
340
+ position: absolute;
341
+ right: 8px;
342
+ top: -18px;
343
+ font-size: 12px;
344
+ color: #00E0FF;
345
+ }
346
+
347
+ /* Charging Ports View */
348
+ .charging-ports-view {
349
+ display: grid;
350
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
351
+ gap: 20px;
352
+ }
353
+
354
+ .port-card {
355
+ background: rgba(255, 255, 255, 0.05);
356
+ border-radius: 16px;
357
+ padding: 16px;
358
+ border: 1px solid rgba(0, 224, 255, 0.1);
359
+ transition: transform 0.2s ease;
360
+ }
361
+
362
+ .port-card:hover {
363
+ transform: translateY(-4px);
364
+ }
365
+
366
+ .port-header {
367
+ display: flex;
368
+ justify-content: space-between;
369
+ align-items: center;
370
+ margin-bottom: 12px;
371
+ }
372
+
373
+ .port-number {
374
+ font-size: 18px;
375
+ font-weight: 600;
376
+ }
377
+
378
+ .port-details {
379
+ margin-bottom: 12px;
380
+ }
381
+
382
+ .port-detail {
383
+ display: flex;
384
+ justify-content: space-between;
385
+ margin-bottom: 4px;
386
+ font-size: 14px;
387
+ }
388
+
389
+ .detail-label {
390
+ opacity: 0.7;
391
+ }
392
+
393
+ .port-actions {
394
+ display: flex;
395
+ justify-content: flex-end;
396
+ gap: 8px;
397
+ }
398
+
399
+ .port-action {
400
+ background-color: rgba(0, 224, 255, 0.2);
401
+ border: none;
402
+ border-radius: 4px;
403
+ color: #00E0FF;
404
+ padding: 6px 10px;
405
+ font-size: 12px;
406
+ cursor: pointer;
407
+ transition: all 0.2s ease;
408
+ }
409
+
410
+ .port-action:hover {
411
+ background-color: rgba(0, 224, 255, 0.3);
412
+ }
413
+
414
+ /* Energy Management View */
415
+ .energy-management-view {
416
+ display: grid;
417
+ grid-template-columns: 1fr;
418
+ gap: 20px;
419
+ }
420
+
421
+ .energy-chart {
422
+ background: rgba(255, 255, 255, 0.05);
423
+ border-radius: 16px;
424
+ padding: 20px;
425
+ border: 1px solid rgba(0, 224, 255, 0.1);
426
+ height: 300px;
427
+ }
428
+
429
+ .energy-stats {
430
+ display: grid;
431
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
432
+ gap: 20px;
433
+ }
434
+
435
+ .energy-stat-card {
436
+ background: rgba(255, 255, 255, 0.05);
437
+ border-radius: 16px;
438
+ padding: 20px;
439
+ border: 1px solid rgba(0, 224, 255, 0.1);
440
+ display: flex;
441
+ flex-direction: column;
442
+ align-items: center;
443
+ text-align: center;
444
+ }
445
+
446
+ .stat-value {
447
+ font-size: 32px;
448
+ font-weight: 700;
449
+ margin: 10px 0;
450
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
451
+ -webkit-background-clip: text;
452
+ background-clip: text;
453
+ -webkit-text-fill-color: transparent;
454
+ }
455
+
456
+ .stat-label {
457
+ font-size: 14px;
458
+ opacity: 0.7;
459
+ }
460
+
461
+ /* Visitor Analytics View */
462
+ .visitor-analytics-view {
463
+ display: grid;
464
+ grid-template-columns: 1fr;
465
+ gap: 20px;
466
+ }
467
+
468
+ .visitor-stats {
469
+ display: grid;
470
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
471
+ gap: 20px;
472
+ }
473
+
474
+ .amenity-usage {
475
+ background: rgba(255, 255, 255, 0.05);
476
+ border-radius: 16px;
477
+ padding: 20px;
478
+ border: 1px solid rgba(0, 224, 255, 0.1);
479
+ }
480
+
481
+ .amenity-bar {
482
+ height: 24px;
483
+ background-color: rgba(255, 255, 255, 0.1);
484
+ border-radius: 12px;
485
+ margin-bottom: 12px;
486
+ overflow: hidden;
487
+ position: relative;
488
+ }
489
+
490
+ .amenity-fill {
491
+ height: 100%;
492
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
493
+ border-radius: 12px;
494
+ }
495
+
496
+ .amenity-label {
497
+ display: flex;
498
+ justify-content: space-between;
499
+ font-size: 14px;
500
+ }
501
+
502
+ /* Reservations View */
503
+ .reservations-view {
504
+ display: grid;
505
+ grid-template-columns: 1fr;
506
+ gap: 20px;
507
+ }
508
+
509
+ .reservation-list {
510
+ background: rgba(255, 255, 255, 0.05);
511
+ border-radius: 16px;
512
+ padding: 20px;
513
+ border: 1px solid rgba(0, 224, 255, 0.1);
514
+ }
515
+
516
+ .reservation-item {
517
+ display: flex;
518
+ align-items: center;
519
+ padding: 12px 0;
520
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
521
+ }
522
+
523
+ .reservation-item:last-child {
524
+ border-bottom: none;
525
+ }
526
+
527
+ .reservation-status {
528
+ margin-left: auto;
529
+ padding: 4px 8px;
530
+ border-radius: 4px;
531
+ font-size: 12px;
532
+ font-weight: 600;
533
+ }
534
+
535
+ .reservation-status.confirmed {
536
+ background-color: rgba(53, 242, 219, 0.2);
537
+ color: #35F2DB;
538
+ }
539
+
540
+ .reservation-status.pending {
541
+ background-color: rgba(255, 193, 7, 0.2);
542
+ color: #FFC107;
543
+ }
544
+
545
+ /* Responsive Adjustments */
546
+ @media (max-width: 768px) {
547
+ .hub-header {
548
+ flex-direction: column;
549
+ align-items: flex-start;
550
+ gap: 10px;
551
+ }
552
+
553
+ .hub-status {
554
+ flex-direction: column;
555
+ gap: 5px;
556
+ }
557
+
558
+ .hub-actions {
559
+ width: 100%;
560
+ justify-content: space-between;
561
+ margin-top: 10px;
562
+ }
563
+
564
+ .dashboard-view,
565
+ .hub-overview {
566
+ grid-template-columns: 1fr;
567
+ }
568
+ }
ChargingHub.jsx ADDED
@@ -0,0 +1,712 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useState, useEffect } from 'react';
2
+ import './ChargingHub.css';
3
+
4
+ // Mock data for demonstration purposes
5
+ const mockChargingPorts = [
6
+ { id: 1, number: 1, status: 'available', type: 'DC Fast', power: '250kW', lastUsed: null },
7
+ { id: 2, number: 2, status: 'charging', type: 'DC Fast', power: '250kW', vehicle: 'Tesla Model 3', startTime: '14:30', endTime: '15:15', progress: 68 },
8
+ { id: 3, number: 3, status: 'reserved', type: 'DC Fast', power: '250kW', reservedFor: '17:00', duration: '45 min' },
9
+ { id: 4, number: 4, status: 'maintenance', type: 'DC Fast', power: '250kW', maintenanceNote: 'Scheduled maintenance', estimatedCompletion: '18:00' },
10
+ { id: 5, number: 5, status: 'available', type: 'DC Fast', power: '250kW', lastUsed: '13:45' },
11
+ { id: 6, number: 6, status: 'charging', type: 'DC Fast', power: '250kW', vehicle: 'Tesla Model Y', startTime: '15:10', endTime: '15:55', progress: 42 },
12
+ { id: 7, number: 7, status: 'available', type: 'DC Fast', power: '250kW', lastUsed: '12:30' },
13
+ { id: 8, number: 8, status: 'charging', type: 'DC Fast', power: '250kW', vehicle: 'GMC Hummer EV', startTime: '15:25', endTime: '16:10', progress: 25 },
14
+ ];
15
+
16
+ const mockEnergyData = {
17
+ currentDemand: 625,
18
+ peakDemand: 1200,
19
+ solarGeneration: 85,
20
+ batteryStorage: 72,
21
+ gridConsumption: 540,
22
+ dailyUsage: [
23
+ { hour: '00:00', demand: 120 },
24
+ { hour: '01:00', demand: 90 },
25
+ { hour: '02:00', demand: 75 },
26
+ { hour: '03:00', demand: 60 },
27
+ { hour: '04:00', demand: 45 },
28
+ { hour: '05:00', demand: 60 },
29
+ { hour: '06:00', demand: 150 },
30
+ { hour: '07:00', demand: 300 },
31
+ { hour: '08:00', demand: 450 },
32
+ { hour: '09:00', demand: 600 },
33
+ { hour: '10:00', demand: 750 },
34
+ { hour: '11:00', demand: 900 },
35
+ { hour: '12:00', demand: 1050 },
36
+ { hour: '13:00', demand: 1150 },
37
+ { hour: '14:00', demand: 1200 },
38
+ { hour: '15:00', demand: 1100 },
39
+ { hour: '16:00', demand: 950 },
40
+ { hour: '17:00', demand: 800 },
41
+ { hour: '18:00', demand: 700 },
42
+ { hour: '19:00', demand: 600 },
43
+ { hour: '20:00', demand: 500 },
44
+ { hour: '21:00', demand: 400 },
45
+ { hour: '22:00', demand: 300 },
46
+ { hour: '23:00', demand: 200 },
47
+ ],
48
+ };
49
+
50
+ const mockVisitors = {
51
+ current: 24,
52
+ capacity: 50,
53
+ averageDuration: 38,
54
+ peakHours: '12:00 - 14:00',
55
+ amenityUsage: {
56
+ lounge: 65,
57
+ cafe: 48,
58
+ retail: 32,
59
+ workspace: 25,
60
+ },
61
+ };
62
+
63
+ const mockReservations = [
64
+ { id: 101, name: 'John Smith', vehicle: 'Tesla Model 3', time: '17:00', duration: '45 min', port: 3, status: 'confirmed' },
65
+ { id: 102, name: 'Sarah Johnson', vehicle: 'Tesla Model Y', time: '17:30', duration: '30 min', port: 1, status: 'confirmed' },
66
+ { id: 103, name: 'Michael Brown', vehicle: 'Ford F-150 Lightning', time: '18:15', duration: '60 min', port: 5, status: 'pending' },
67
+ { id: 104, name: 'Emily Davis', vehicle: 'Rivian R1T', time: '19:00', duration: '45 min', port: 7, status: 'confirmed' },
68
+ ];
69
+
70
+ function ChargingHub() {
71
+ const [activeTab, setActiveTab] = useState('dashboard');
72
+ const [loading, setLoading] = useState(true);
73
+ const [currentTime, setCurrentTime] = useState('');
74
+ const [hubStatus, setHubStatus] = useState({
75
+ name: 'The Link - Downtown',
76
+ location: 'Springfield, IL',
77
+ status: 'operational',
78
+ occupancy: '48%',
79
+ availablePorts: 3,
80
+ totalPorts: 8,
81
+ energyEfficiency: '92%',
82
+ });
83
+
84
+ useEffect(() => {
85
+ // Simulate loading
86
+ const timer = setTimeout(() => {
87
+ setLoading(false);
88
+ }, 1500);
89
+
90
+ // Update current time
91
+ const updateTime = () => {
92
+ const now = new Date();
93
+ const hours = now.getHours().toString().padStart(2, '0');
94
+ const minutes = now.getMinutes().toString().padStart(2, '0');
95
+ setCurrentTime(`${hours}:${minutes}`);
96
+ };
97
+
98
+ updateTime();
99
+ const timeInterval = setInterval(updateTime, 60000);
100
+
101
+ return () => {
102
+ clearTimeout(timer);
103
+ clearInterval(timeInterval);
104
+ };
105
+ }, []);
106
+
107
+ // Function to render status badge with appropriate color
108
+ const renderStatusBadge = (status) => {
109
+ let className = 'status-badge';
110
+
111
+ switch(status) {
112
+ case 'available':
113
+ className += ' available';
114
+ break;
115
+ case 'charging':
116
+ className += ' charging';
117
+ break;
118
+ case 'reserved':
119
+ className += ' reserved';
120
+ break;
121
+ case 'maintenance':
122
+ className += ' maintenance';
123
+ break;
124
+ default:
125
+ break;
126
+ }
127
+
128
+ return <span className={className}>{status}</span>;
129
+ };
130
+
131
+ // Function to render progress bar for charging ports
132
+ const renderProgressBar = (progress) => {
133
+ return (
134
+ <div className="progress-container">
135
+ <div className="progress-bar" style={{ width: `${progress}%` }}>
136
+ <div className="progress-glow"></div>
137
+ </div>
138
+ <span className="progress-text">{progress}%</span>
139
+ </div>
140
+ );
141
+ };
142
+
143
+ if (loading) {
144
+ return (
145
+ <div className="charging-hub loading">
146
+ <div className="loading-logo">
147
+ <img src="/images/the_link_logo.png" alt="The Link" />
148
+ <div className="loading-pulse"></div>
149
+ </div>
150
+ <p>Initializing Hub Dashboard...</p>
151
+ </div>
152
+ );
153
+ }
154
+
155
+ return (
156
+ <div className="charging-hub">
157
+ <header className="hub-header">
158
+ <div className="hub-title">
159
+ <h1>THE LINK</h1>
160
+ <span className="hub-subtitle">Charging Hub Dashboard</span>
161
+ </div>
162
+ <div className="hub-status">
163
+ <div className="status-item">
164
+ <span className="status-label">Hub Status:</span>
165
+ <span className={`status-value ${hubStatus.status}`}>{hubStatus.status}</span>
166
+ </div>
167
+ <div className="status-item">
168
+ <span className="status-label">Current Time:</span>
169
+ <span className="status-value">{currentTime}</span>
170
+ </div>
171
+ </div>
172
+ <div className="hub-actions">
173
+ <button className="action-button">
174
+ <span className="icon">⚙️</span>
175
+ <span>Settings</span>
176
+ </button>
177
+ <button className="action-button">
178
+ <span className="icon">🔔</span>
179
+ <span>Alerts</span>
180
+ </button>
181
+ <div className="user-profile">
182
+ <img src="/images/admin_avatar.png" alt="Admin" />
183
+ </div>
184
+ </div>
185
+ </header>
186
+
187
+ <div className="hub-navigation">
188
+ <button
189
+ className={`nav-button ${activeTab === 'dashboard' ? 'active' : ''}`}
190
+ onClick={() => setActiveTab('dashboard')}
191
+ >
192
+ Dashboard
193
+ </button>
194
+ <button
195
+ className={`nav-button ${activeTab === 'charging' ? 'active' : ''}`}
196
+ onClick={() => setActiveTab('charging')}
197
+ >
198
+ Charging Ports
199
+ </button>
200
+ <button
201
+ className={`nav-button ${activeTab === 'energy' ? 'active' : ''}`}
202
+ onClick={() => setActiveTab('energy')}
203
+ >
204
+ Energy Management
205
+ </button>
206
+ <button
207
+ className={`nav-button ${activeTab === 'visitors' ? 'active' : ''}`}
208
+ onClick={() => setActiveTab('visitors')}
209
+ >
210
+ Visitor Analytics
211
+ </button>
212
+ <button
213
+ className={`nav-button ${activeTab === 'reservations' ? 'active' : ''}`}
214
+ onClick={() => setActiveTab('reservations')}
215
+ >
216
+ Reservations
217
+ </button>
218
+ </div>
219
+
220
+ <main className="hub-content">
221
+ {activeTab === 'dashboard' && (
222
+ <div className="dashboard-view">
223
+ <div className="hub-overview">
224
+ <div className="overview-card location">
225
+ <h3>Hub Location</h3>
226
+ <div className="location-details">
227
+ <div className="location-name">{hubStatus.name}</div>
228
+ <div className="location-address">{hubStatus.location}</div>
229
+ </div>
230
+ <div className="location-map">
231
+ <img src="/images/hub_location_map.png" alt="Hub Location" />
232
+ </div>
233
+ </div>
234
+
235
+ <div className="overview-card occupancy">
236
+ <h3>Current Occupancy</h3>
237
+ <div className="occupancy-gauge">
238
+ <svg viewBox="0 0 120 120" className="gauge">
239
+ <circle cx="60" cy="60" r="50" className="gauge-background" />
240
+ <circle
241
+ cx="60"
242
+ cy="60"
243
+ r="50"
244
+ className="gauge-progress"
245
+ style={{
246
+ strokeDasharray: `${parseInt(hubStatus.occupancy) * 3.14}px, 314px`
247
+ }}
248
+ />
249
+ <text x="60" y="65" textAnchor="middle" className="gauge-text">
250
+ {hubStatus.occupancy}
251
+ </text>
252
+ </svg>
253
+ </div>
254
+ <div className="occupancy-details">
255
+ <div className="detail-item">
256
+ <span className="detail-label">Available Ports:</span>
257
+ <span className="detail-value">{hubStatus.availablePorts}/{hubStatus.totalPorts}</span>
258
+ </div>
259
+ </div>
260
+ </div>
261
+
262
+ <div className="overview-card energy">
263
+ <h3>Energy Overview</h3>
264
+ <div className="energy-metrics">
265
+ <div className="metric">
266
+ <div className="metric-value">{mockEnergyData.currentDemand} kW</div>
267
+ <div className="metric-label">Current Demand</div>
268
+ </div>
269
+ <div className="metric">
270
+ <div className="metric-value">{mockEnergyData.solarGeneration}%</div>
271
+ <div className="metric-label">Solar Generation</div>
272
+ </div>
273
+ <div className="metric">
274
+ <div className="metric-value">{mockEnergyData.batteryStorage}%</div>
275
+ <div className="metric-label">Battery Storage</div>
276
+ </div>
277
+ </div>
278
+ <div className="energy-chart">
279
+ <div className="chart-container">
280
+ {/* Simplified chart representation */}
281
+ <div className="chart-bars">
282
+ {mockEnergyData.dailyUsage.slice(-8).map((hour, index) => (
283
+ <div
284
+ key={index}
285
+ className="chart-bar"
286
+ style={{ height: `${(hour.demand / mockEnergyData.peakDemand) * 100}%` }}
287
+ >
288
+ <div className="bar-glow"></div>
289
+ </div>
290
+ ))}
291
+ </div>
292
+ </div>
293
+ </div>
294
+ </div>
295
+
296
+ <div className="overview-card visitors">
297
+ <h3>Visitor Analytics</h3>
298
+ <div className="visitor-count">
299
+ <div className="count-value">{mockVisitors.current}</div>
300
+ <div className="count-label">Current Visitors</div>
301
+ </div>
302
+ <div className="visitor-details">
303
+ <div className="detail-item">
304
+ <span className="detail-label">Capacity:</span>
305
+ <span className="detail-value">{mockVisitors.capacity}</span>
306
+ </div>
307
+ <div className="detail-item">
308
+ <span className="detail-label">Avg. Duration:</span>
309
+ <span className="detail-value">{mockVisitors.averageDuration} min</span>
310
+ </div>
311
+ <div className="detail-item">
312
+ <span className="detail-label">Peak Hours:</span>
313
+ <span className="detail-value">{mockVisitors.peakHours}</span>
314
+ </div>
315
+ </div>
316
+ </div>
317
+ </div>
318
+
319
+ <div className="quick-status">
320
+ <h3>Charging Port Status</h3>
321
+ <div className="port-status-grid">
322
+ {mockChargingPorts.map(port => (
323
+ <div key={port.id} className={`port-status-card ${port.status}`}>
324
+ <div className="port-number">{port.number}</div>
325
+ <div className="port-status">{renderStatusBadge(port.status)}</div>
326
+ {port.status === 'charging' && (
327
+ <div className="port-progress">{renderProgressBar(port.progress)}</div>
328
+ )}
329
+ </div>
330
+ ))}
331
+ </div>
332
+ </div>
333
+
334
+ <div className="upcoming-reservations">
335
+ <h3>Upcoming Reservations</h3>
336
+ <div className="reservation-list">
337
+ {mockReservations.map(reservation => (
338
+ <div key={reservation.id} className="reservation-card">
339
+ <div className="reservation-time">{reservation.time}</div>
340
+ <div className="reservation-details">
341
+ <div className="reservation-name">{reservation.name}</div>
342
+ <div className="reservation-vehicle">{reservation.vehicle}</div>
343
+ </div>
344
+ <div className="reservation-port">Port {reservation.port}</div>
345
+ <div className="reservation-duration">{reservation.duration}</div>
346
+ <div className={`reservation-status ${reservation.status}`}>
347
+ {reservation.status}
348
+ </div>
349
+ </div>
350
+ ))}
351
+ </div>
352
+ </div>
353
+ </div>
354
+ )}
355
+
356
+ {activeTab === 'charging' && (
357
+ <div className="charging-view">
358
+ <div className="section-header">
359
+ <h2>Charging Port Management</h2>
360
+ <div className="header-actions">
361
+ <button className="action-button">
362
+ <span className="icon">+</span>
363
+ <span>Add Port</span>
364
+ </button>
365
+ <div className="filter-dropdown">
366
+ <select>
367
+ <option value="all">All Statuses</option>
368
+ <option value="available">Available</option>
369
+ <option value="charging">Charging</option>
370
+ <option value="reserved">Reserved</option>
371
+ <option value="maintenance">Maintenance</option>
372
+ </select>
373
+ </div>
374
+ </div>
375
+ </div>
376
+
377
+ <div className="charging-ports-grid">
378
+ {mockChargingPorts.map(port => (
379
+ <div key={port.id} className={`port-card ${port.status}`}>
380
+ <div className="port-header">
381
+ <div className="port-number">Port {port.number}</div>
382
+ <div className="port-status">{renderStatusBadge(port.status)}</div>
383
+ </div>
384
+
385
+ <div className="port-details">
386
+ <div className="detail-item">
387
+ <span className="detail-label">Type:</span>
388
+ <span className="detail-value">{port.type}</span>
389
+ </div>
390
+ <div className="detail-item">
391
+ <span className="detail-label">Power:</span>
392
+ <span className="detail-value">{port.power}</span>
393
+ </div>
394
+
395
+ {port.status === 'available' && (
396
+ <div className="detail-item">
397
+ <span className="detail-label">Last Used:</span>
398
+ <span className="detail-value">{port.lastUsed || 'N/A'}</span>
399
+ </div>
400
+ )}
401
+
402
+ {port.status === 'charging' && (
403
+ <>
404
+ <div className="detail-item">
405
+ <span className="detail-label">Vehicle:</span>
406
+ <span className="detail-value">{port.vehicle}</span>
407
+ </div>
408
+ <div className="detail-item">
409
+ <span className="detail-label">Started:</span>
410
+ <span className="detail-value">{port.startTime}</span>
411
+ </div>
412
+ <div className="detail-item">
413
+ <span className="detail-label">Est. Completion:</span>
414
+ <span className="detail-value">{port.endTime}</span>
415
+ </div>
416
+ <div className="detail-item full-width">
417
+ <div className="progress-label">Charging Progress</div>
418
+ {renderProgressBar(port.progress)}
419
+ </div>
420
+ </>
421
+ )}
422
+
423
+ {port.status === 'reserved' && (
424
+ <>
425
+ <div className="detail-item">
426
+ <span className="detail-label">Reserved For:</span>
427
+ <span className="detail-value">{port.reservedFor}</span>
428
+ </div>
429
+ <div className="detail-item">
430
+ <span className="detail-label">Duration:</span>
431
+ <span className="detail-value">{port.duration}</span>
432
+ </div>
433
+ </>
434
+ )}
435
+
436
+ {port.status === 'maintenance' && (
437
+ <>
438
+ <div className="detail-item">
439
+ <span className="detail-label">Note:</span>
440
+ <span className="detail-value">{port.maintenanceNote}</span>
441
+ </div>
442
+ <div className="detail-item">
443
+ <span className="detail-label">Est. Completion:</span>
444
+ <span className="detail-value">{port.estimatedCompletion}</span>
445
+ </div>
446
+ </>
447
+ )}
448
+ </div>
449
+
450
+ <div className="port-actions">
451
+ {port.status === 'available' && (
452
+ <>
453
+ <button className="port-action reserve">Reserve</button>
454
+ <button className="port-action maintenance">Set Maintenance</button>
455
+ </>
456
+ )}
457
+
458
+ {port.status === 'charging' && (
459
+ <>
460
+ <button className="port-action stop">Stop Charging</button>
461
+ <button className="port-action details">View Details</button>
462
+ </>
463
+ )}
464
+
465
+ {port.status === 'reserved' && (
466
+ <>
467
+ <button className="port-action cancel">Cancel Reservation</button>
468
+ <button className="port-action edit">Edit Reservation</button>
469
+ </>
470
+ )}
471
+
472
+ {port.status === 'maintenance' && (
473
+ <>
474
+ <button className="port-action complete">Complete Maintenance</button>
475
+ <button className="port-action update">Update Status</button>
476
+ </>
477
+ )}
478
+ </div>
479
+ </div>
480
+ ))}
481
+ </div>
482
+ </div>
483
+ )}
484
+
485
+ {activeTab === 'energy' && (
486
+ <div className="energy-view">
487
+ <div className="section-header">
488
+ <h2>Energy Management System</h2>
489
+ <div className="header-actions">
490
+ <button className="action-button">
491
+ <span className="icon">📊</span>
492
+ <span>Export Data</span>
493
+ </button>
494
+ <div className="time-range-selector">
495
+ <select>
496
+ <option value="day">Today</option>
497
+ <option value="week">This Week</option>
498
+ <option value="month">This Month</option>
499
+ <option value="custom">Custom Range</option>
500
+ </select>
501
+ </div>
502
+ </div>
503
+ </div>
504
+
505
+ <div className="energy-overview">
506
+ <div className="energy-card current-demand">
507
+ <h3>Current Demand</h3>
508
+ <div className="energy-value">{mockEnergyData.currentDemand} kW</div>
509
+ <div className="energy-chart">
510
+ <div className="chart-container">
511
+ {/* Simplified chart representation */}
512
+ <div className="chart-line">
513
+ <svg viewBox="0 0 100 30">
514
+ <path
515
+ d="M0,25 L10,20 L20,22 L30,15 L40,18 L50,10 L60,12 L70,8 L80,15 L90,5 L100,10"
516
+ className="chart-path"
517
+ />
518
+ </svg>
519
+ </div>
520
+ </div>
521
+ </div>
522
+ <div className="energy-details">
523
+ <div className="detail-item">
524
+ <span className="detail-label">Peak Today:</span>
525
+ <span className="detail-value">{mockEnergyData.peakDemand} kW</span>
526
+ </div>
527
+ <div className="detail-item">
528
+ <span className="detail-label">Average:</span>
529
+ <span className="detail-value">780 kW</span>
530
+ </div>
531
+ </div>
532
+ </div>
533
+
534
+ <div className="energy-card energy-sources">
535
+ <h3>Energy Sources</h3>
536
+ <div className="sources-chart">
537
+ <div className="donut-chart">
538
+ <svg viewBox="0 0 100 100">
539
+ <circle cx="50" cy="50" r="40" className="donut-ring" />
540
+ <circle
541
+ cx="50"
542
+ cy="50"
543
+ r="40"
544
+ className="donut-segment grid"
545
+ style={{
546
+ strokeDasharray: `${mockEnergyData.gridConsumption / 10} 251.2`
547
+ }}
548
+ />
549
+ <circle
550
+ cx="50"
551
+ cy="50"
552
+ r="40"
553
+ className="donut-segment solar"
554
+ style={{
555
+ strokeDasharray: `${mockEnergyData.solarGeneration / 10} 251.2`,
556
+ strokeDashoffset: `-${mockEnergyData.gridConsumption / 10}`
557
+ }}
558
+ />
559
+ <circle
560
+ cx="50"
561
+ cy="50"
562
+ r="40"
563
+ className="donut-segment battery"
564
+ style={{
565
+ strokeDasharray: `${mockEnergyData.batteryStorage / 10} 251.2`,
566
+ strokeDashoffset: `-${(mockEnergyData.gridConsumption + mockEnergyData.solarGeneration) / 10}`
567
+ }}
568
+ />
569
+ </svg>
570
+ </div>
571
+ </div>
572
+ <div className="sources-legend">
573
+ <div className="legend-item grid">
574
+ <span className="legend-color"></span>
575
+ <span className="legend-label">Grid</span>
576
+ <span className="legend-value">{mockEnergyData.gridConsumption} kW</span>
577
+ </div>
578
+ <div className="legend-item solar">
579
+ <span className="legend-color"></span>
580
+ <span className="legend-label">Solar</span>
581
+ <span className="legend-value">{mockEnergyData.solarGeneration}%</span>
582
+ </div>
583
+ <div className="legend-item battery">
584
+ <span className="legend-color"></span>
585
+ <span className="legend-label">Battery</span>
586
+ <span className="legend-value">{mockEnergyData.batteryStorage}%</span>
587
+ </div>
588
+ </div>
589
+ </div>
590
+
591
+ <div className="energy-card efficiency">
592
+ <h3>System Efficiency</h3>
593
+ <div className="efficiency-gauge">
594
+ <svg viewBox="0 0 120 120" className="gauge">
595
+ <circle cx="60" cy="60" r="50" className="gauge-background" />
596
+ <circle
597
+ cx="60"
598
+ cy="60"
599
+ r="50"
600
+ className="gauge-progress efficiency"
601
+ style={{
602
+ strokeDasharray: `${parseInt(hubStatus.energyEfficiency) * 3.14}px, 314px`
603
+ }}
604
+ />
605
+ <text x="60" y="65" textAnchor="middle" className="gauge-text">
606
+ {hubStatus.energyEfficiency}
607
+ </text>
608
+ </svg>
609
+ </div>
610
+ <div className="efficiency-details">
611
+ <div className="detail-item">
612
+ <span className="detail-label">Power Factor:</span>
613
+ <span className="detail-value">0.98</span>
614
+ </div>
615
+ <div className="detail-item">
616
+ <span className="detail-label">Conversion Loss:</span>
617
+ <span className="detail-value">8%</span>
618
+ </div>
619
+ </div>
620
+ </div>
621
+ </div>
622
+
623
+ <div className="energy-daily-chart">
624
+ <h3>24-Hour Energy Demand</h3>
625
+ <div className="chart-container">
626
+ <div className="chart-y-axis">
627
+ <div className="axis-label">1200 kW</div>
628
+ <div className="axis-label">900 kW</div>
629
+ <div className="axis-label">600 kW</div>
630
+ <div className="axis-label">300 kW</div>
631
+ <div className="axis-label">0 kW</div>
632
+ </div>
633
+ <div className="chart-content">
634
+ <div className="chart-bars">
635
+ {mockEnergyData.dailyUsage.map((hour, index) => (
636
+ <div key={index} className="chart-bar-container">
637
+ <div
638
+ className="chart-bar"
639
+ style={{ height: `${(hour.demand / mockEnergyData.peakDemand) * 100}%` }}
640
+ >
641
+ <div className="bar-glow"></div>
642
+ </div>
643
+ <div className="bar-label">{hour.hour}</div>
644
+ </div>
645
+ ))}
646
+ </div>
647
+ </div>
648
+ </div>
649
+ </div>
650
+
651
+ <div className="energy-controls">
652
+ <h3>Energy Management Controls</h3>
653
+ <div className="controls-grid">
654
+ <div className="control-card">
655
+ <h4>Load Balancing</h4>
656
+ <div className="control-status">
657
+ <span className="status-indicator active"></span>
658
+ <span className="status-text">Active</span>
659
+ </div>
660
+ <div className="control-actions">
661
+ <button className="control-action">Configure</button>
662
+ <button className="control-action">Disable</button>
663
+ </div>
664
+ </div>
665
+
666
+ <div className="control-card">
667
+ <h4>Peak Shaving</h4>
668
+ <div className="control-status">
669
+ <span className="status-indicator active"></span>
670
+ <span className="status-text">Active</span>
671
+ </div>
672
+ <div className="control-actions">
673
+ <button className="control-action">Configure</button>
674
+ <button className="control-action">Disable</button>
675
+ </div>
676
+ </div>
677
+
678
+ <div className="control-card">
679
+ <h4>Battery Storage</h4>
680
+ <div className="control-status">
681
+ <span className="status-indicator active"></span>
682
+ <span className="status-text">Discharging</span>
683
+ </div>
684
+ <div className="control-actions">
685
+ <button className="control-action">Switch to Charging</button>
686
+ <button className="control-action">Set to Auto</button>
687
+ </div>
688
+ </div>
689
+
690
+ <div className="control-card">
691
+ <h4>Grid Connection</h4>
692
+ <div className="control-status">
693
+ <span className="status-indicator active"></span>
694
+ <span className="status-text">Connected</span>
695
+ </div>
696
+ <div className="control-actions">
697
+ <button className="control-action">Emergency Disconnect</button>
698
+ <button className="control-action">Test Backup</button>
699
+ </div>
700
+ </div>
701
+ </div>
702
+ </div>
703
+ </div>
704
+ )}
705
+
706
+ {/* Additional tabs would be implemented here */}
707
+ </main>
708
+ </div>
709
+ );
710
+ }
711
+
712
+ export default ChargingHub;
DA9BA4EE-1541-40D5-BD7B-F3D9227808D1.png ADDED

Git LFS Details

  • SHA256: dcd0227ca0b89bf8333e8eea338bd154d0217882736e307b57eaffc1475ada57
  • Pointer size: 132 Bytes
  • Size of remote file: 2.18 MB
DeploymentMap.css ADDED
@@ -0,0 +1,918 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Deployment Map Styles */
2
+ .deployment-map {
3
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
4
+ max-width: 1200px;
5
+ margin: 0 auto;
6
+ background-color: #0B0B0F;
7
+ color: #ffffff;
8
+ min-height: 100vh;
9
+ position: relative;
10
+ }
11
+
12
+ /* Loading Screen */
13
+ .deployment-map.loading {
14
+ display: flex;
15
+ flex-direction: column;
16
+ justify-content: center;
17
+ align-items: center;
18
+ height: 100vh;
19
+ }
20
+
21
+ .loading-logo {
22
+ width: 150px;
23
+ height: 150px;
24
+ margin-bottom: 20px;
25
+ position: relative;
26
+ }
27
+
28
+ .loading-logo img {
29
+ width: 100%;
30
+ height: 100%;
31
+ object-fit: contain;
32
+ }
33
+
34
+ .loading-pulse {
35
+ position: absolute;
36
+ top: 0;
37
+ left: 0;
38
+ right: 0;
39
+ bottom: 0;
40
+ border-radius: 50%;
41
+ border: 2px solid #00E0FF;
42
+ animation: pulse 1.5s infinite ease-in-out;
43
+ }
44
+
45
+ @keyframes pulse {
46
+ 0% {
47
+ transform: scale(0.95);
48
+ opacity: 1;
49
+ }
50
+ 70% {
51
+ transform: scale(1.2);
52
+ opacity: 0;
53
+ }
54
+ 100% {
55
+ transform: scale(0.95);
56
+ opacity: 0;
57
+ }
58
+ }
59
+
60
+ /* Header */
61
+ .map-header {
62
+ display: flex;
63
+ justify-content: space-between;
64
+ align-items: center;
65
+ padding: 20px;
66
+ background-color: rgba(20, 20, 30, 0.8);
67
+ backdrop-filter: blur(10px);
68
+ position: sticky;
69
+ top: 0;
70
+ z-index: 100;
71
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
72
+ }
73
+
74
+ .map-title {
75
+ display: flex;
76
+ flex-direction: column;
77
+ }
78
+
79
+ .map-title h1 {
80
+ margin: 0;
81
+ font-size: 28px;
82
+ font-weight: 700;
83
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
84
+ -webkit-background-clip: text;
85
+ background-clip: text;
86
+ -webkit-text-fill-color: transparent;
87
+ letter-spacing: 1px;
88
+ }
89
+
90
+ .map-subtitle {
91
+ font-size: 14px;
92
+ opacity: 0.7;
93
+ }
94
+
95
+ /* Navigation */
96
+ .map-navigation {
97
+ display: flex;
98
+ gap: 2px;
99
+ background-color: rgba(20, 20, 30, 0.5);
100
+ padding: 0 20px;
101
+ overflow-x: auto;
102
+ scrollbar-width: none;
103
+ }
104
+
105
+ .map-navigation::-webkit-scrollbar {
106
+ display: none;
107
+ }
108
+
109
+ .nav-button {
110
+ padding: 16px 20px;
111
+ background: transparent;
112
+ border: none;
113
+ color: white;
114
+ font-size: 16px;
115
+ cursor: pointer;
116
+ position: relative;
117
+ white-space: nowrap;
118
+ }
119
+
120
+ .nav-button.active {
121
+ color: #00E0FF;
122
+ }
123
+
124
+ .nav-button.active::after {
125
+ content: '';
126
+ position: absolute;
127
+ bottom: 0;
128
+ left: 0;
129
+ right: 0;
130
+ height: 3px;
131
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
132
+ border-radius: 3px 3px 0 0;
133
+ }
134
+
135
+ /* Main Content */
136
+ .map-content {
137
+ padding: 20px;
138
+ min-height: calc(100vh - 200px);
139
+ }
140
+
141
+ /* Map Container */
142
+ .map-container {
143
+ position: relative;
144
+ background: rgba(255, 255, 255, 0.05);
145
+ border-radius: 16px;
146
+ padding: 20px;
147
+ border: 1px solid rgba(0, 224, 255, 0.1);
148
+ margin-bottom: 20px;
149
+ }
150
+
151
+ .illinois-map {
152
+ position: relative;
153
+ width: 100%;
154
+ height: 600px;
155
+ overflow: hidden;
156
+ border-radius: 8px;
157
+ background-color: rgba(0, 0, 0, 0.2);
158
+ }
159
+
160
+ .map-image {
161
+ width: 100%;
162
+ height: 100%;
163
+ object-fit: contain;
164
+ }
165
+
166
+ .map-marker {
167
+ position: absolute;
168
+ width: 16px;
169
+ height: 16px;
170
+ border-radius: 50%;
171
+ transform: translate(-50%, -50%);
172
+ cursor: pointer;
173
+ z-index: 10;
174
+ }
175
+
176
+ .map-marker::before {
177
+ content: '';
178
+ position: absolute;
179
+ top: 0;
180
+ left: 0;
181
+ right: 0;
182
+ bottom: 0;
183
+ border-radius: 50%;
184
+ background-color: currentColor;
185
+ }
186
+
187
+ .map-marker.planned {
188
+ color: #00E0FF;
189
+ }
190
+
191
+ .map-marker.future {
192
+ color: #FFC107;
193
+ }
194
+
195
+ .map-marker.urban {
196
+ border: 2px solid rgba(255, 255, 255, 0.7);
197
+ }
198
+
199
+ .map-marker.corridor {
200
+ border: 2px solid rgba(255, 255, 255, 0.4);
201
+ }
202
+
203
+ .map-marker.selected {
204
+ width: 20px;
205
+ height: 20px;
206
+ z-index: 20;
207
+ box-shadow: 0 0 0 4px rgba(0, 224, 255, 0.3);
208
+ }
209
+
210
+ .marker-pulse {
211
+ position: absolute;
212
+ top: -4px;
213
+ left: -4px;
214
+ right: -4px;
215
+ bottom: -4px;
216
+ border-radius: 50%;
217
+ background-color: currentColor;
218
+ opacity: 0.3;
219
+ animation: markerPulse 2s infinite;
220
+ }
221
+
222
+ @keyframes markerPulse {
223
+ 0% {
224
+ transform: scale(1);
225
+ opacity: 0.3;
226
+ }
227
+ 70% {
228
+ transform: scale(1.5);
229
+ opacity: 0;
230
+ }
231
+ 100% {
232
+ transform: scale(1);
233
+ opacity: 0;
234
+ }
235
+ }
236
+
237
+ .marker-label {
238
+ position: absolute;
239
+ top: -30px;
240
+ left: 50%;
241
+ transform: translateX(-50%);
242
+ background-color: rgba(0, 0, 0, 0.7);
243
+ color: white;
244
+ padding: 4px 8px;
245
+ border-radius: 4px;
246
+ font-size: 12px;
247
+ white-space: nowrap;
248
+ pointer-events: none;
249
+ }
250
+
251
+ .location-detail-popup {
252
+ position: absolute;
253
+ transform: translate(-50%, -120%);
254
+ background-color: rgba(20, 20, 30, 0.9);
255
+ backdrop-filter: blur(10px);
256
+ border-radius: 8px;
257
+ padding: 15px;
258
+ border: 1px solid rgba(0, 224, 255, 0.3);
259
+ min-width: 200px;
260
+ z-index: 30;
261
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5);
262
+ }
263
+
264
+ .location-detail-popup h4 {
265
+ margin: 0 0 10px 0;
266
+ font-size: 16px;
267
+ font-weight: 600;
268
+ color: #00E0FF;
269
+ }
270
+
271
+ .detail-item {
272
+ display: flex;
273
+ justify-content: space-between;
274
+ margin-bottom: 8px;
275
+ }
276
+
277
+ .detail-label {
278
+ font-size: 12px;
279
+ opacity: 0.7;
280
+ }
281
+
282
+ .detail-value {
283
+ font-size: 12px;
284
+ font-weight: 600;
285
+ }
286
+
287
+ .detail-value.planned {
288
+ color: #00E0FF;
289
+ }
290
+
291
+ .detail-value.future {
292
+ color: #FFC107;
293
+ }
294
+
295
+ .close-popup {
296
+ position: absolute;
297
+ top: 8px;
298
+ right: 8px;
299
+ background: none;
300
+ border: none;
301
+ color: white;
302
+ font-size: 16px;
303
+ cursor: pointer;
304
+ opacity: 0.7;
305
+ }
306
+
307
+ .close-popup:hover {
308
+ opacity: 1;
309
+ }
310
+
311
+ /* Map Controls */
312
+ .map-controls {
313
+ display: flex;
314
+ justify-content: space-between;
315
+ margin-top: 20px;
316
+ flex-wrap: wrap;
317
+ gap: 10px;
318
+ }
319
+
320
+ .zoom-controls, .view-controls {
321
+ display: flex;
322
+ gap: 5px;
323
+ }
324
+
325
+ .zoom-button, .view-button {
326
+ background-color: rgba(255, 255, 255, 0.05);
327
+ border: 1px solid rgba(255, 255, 255, 0.1);
328
+ border-radius: 4px;
329
+ padding: 8px 12px;
330
+ color: white;
331
+ font-size: 14px;
332
+ cursor: pointer;
333
+ transition: all 0.2s ease;
334
+ }
335
+
336
+ .zoom-button:hover, .view-button:hover {
337
+ background-color: rgba(0, 224, 255, 0.1);
338
+ }
339
+
340
+ .zoom-button.active, .view-button.active {
341
+ background-color: rgba(0, 224, 255, 0.2);
342
+ border-color: #00E0FF;
343
+ color: #00E0FF;
344
+ }
345
+
346
+ /* Map Legend */
347
+ .map-legend {
348
+ background-color: rgba(20, 20, 30, 0.7);
349
+ backdrop-filter: blur(10px);
350
+ border-radius: 8px;
351
+ padding: 15px;
352
+ border: 1px solid rgba(255, 255, 255, 0.1);
353
+ position: absolute;
354
+ bottom: 20px;
355
+ right: 20px;
356
+ z-index: 20;
357
+ }
358
+
359
+ .map-legend h4 {
360
+ margin: 0 0 10px 0;
361
+ font-size: 14px;
362
+ font-weight: 600;
363
+ }
364
+
365
+ .legend-items {
366
+ display: grid;
367
+ grid-template-columns: repeat(2, 1fr);
368
+ gap: 8px;
369
+ }
370
+
371
+ .legend-item {
372
+ display: flex;
373
+ align-items: center;
374
+ gap: 8px;
375
+ font-size: 12px;
376
+ }
377
+
378
+ .legend-marker {
379
+ width: 12px;
380
+ height: 12px;
381
+ border-radius: 50%;
382
+ position: relative;
383
+ }
384
+
385
+ .legend-marker.planned {
386
+ background-color: #00E0FF;
387
+ }
388
+
389
+ .legend-marker.future {
390
+ background-color: #FFC107;
391
+ }
392
+
393
+ .legend-marker.urban {
394
+ background-color: rgba(255, 255, 255, 0.7);
395
+ border: 2px solid rgba(255, 255, 255, 0.7);
396
+ }
397
+
398
+ .legend-marker.corridor {
399
+ background-color: rgba(255, 255, 255, 0.4);
400
+ border: 2px solid rgba(255, 255, 255, 0.4);
401
+ }
402
+
403
+ /* Deployment Phases */
404
+ .deployment-phases {
405
+ background: rgba(255, 255, 255, 0.05);
406
+ border-radius: 16px;
407
+ padding: 20px;
408
+ border: 1px solid rgba(0, 224, 255, 0.1);
409
+ }
410
+
411
+ .phase-tabs {
412
+ display: flex;
413
+ gap: 5px;
414
+ margin-bottom: 20px;
415
+ overflow-x: auto;
416
+ scrollbar-width: none;
417
+ }
418
+
419
+ .phase-tabs::-webkit-scrollbar {
420
+ display: none;
421
+ }
422
+
423
+ .phase-tab {
424
+ background-color: rgba(255, 255, 255, 0.05);
425
+ border: 1px solid rgba(255, 255, 255, 0.1);
426
+ border-radius: 8px;
427
+ padding: 10px 15px;
428
+ color: white;
429
+ font-size: 14px;
430
+ cursor: pointer;
431
+ transition: all 0.2s ease;
432
+ white-space: nowrap;
433
+ }
434
+
435
+ .phase-tab:hover {
436
+ background-color: rgba(0, 224, 255, 0.1);
437
+ }
438
+
439
+ .phase-tab.active {
440
+ background-color: rgba(0, 224, 255, 0.2);
441
+ border-color: #00E0FF;
442
+ color: #00E0FF;
443
+ }
444
+
445
+ .phase-tab.planning {
446
+ border-color: rgba(0, 224, 255, 0.3);
447
+ }
448
+
449
+ .phase-tab.future {
450
+ border-color: rgba(255, 193, 7, 0.3);
451
+ }
452
+
453
+ .phase-details {
454
+ animation: fadeIn 0.3s ease;
455
+ }
456
+
457
+ @keyframes fadeIn {
458
+ from {
459
+ opacity: 0;
460
+ transform: translateY(10px);
461
+ }
462
+ to {
463
+ opacity: 1;
464
+ transform: translateY(0);
465
+ }
466
+ }
467
+
468
+ .phase-header {
469
+ display: flex;
470
+ align-items: center;
471
+ gap: 15px;
472
+ margin-bottom: 20px;
473
+ flex-wrap: wrap;
474
+ }
475
+
476
+ .phase-header h3 {
477
+ margin: 0;
478
+ font-size: 24px;
479
+ font-weight: 600;
480
+ }
481
+
482
+ .phase-timeline {
483
+ background-color: rgba(255, 255, 255, 0.1);
484
+ padding: 6px 12px;
485
+ border-radius: 20px;
486
+ font-size: 14px;
487
+ }
488
+
489
+ .phase-status {
490
+ padding: 6px 12px;
491
+ border-radius: 20px;
492
+ font-size: 14px;
493
+ font-weight: 600;
494
+ }
495
+
496
+ .phase-status.planning {
497
+ background-color: rgba(0, 224, 255, 0.2);
498
+ color: #00E0FF;
499
+ }
500
+
501
+ .phase-status.future {
502
+ background-color: rgba(255, 193, 7, 0.2);
503
+ color: #FFC107;
504
+ }
505
+
506
+ .phase-metrics {
507
+ display: grid;
508
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
509
+ gap: 15px;
510
+ margin-bottom: 30px;
511
+ }
512
+
513
+ .metric-card {
514
+ background-color: rgba(255, 255, 255, 0.05);
515
+ border-radius: 12px;
516
+ padding: 15px;
517
+ text-align: center;
518
+ border: 1px solid rgba(255, 255, 255, 0.1);
519
+ }
520
+
521
+ .metric-value {
522
+ font-size: 28px;
523
+ font-weight: 700;
524
+ margin-bottom: 5px;
525
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
526
+ -webkit-background-clip: text;
527
+ background-clip: text;
528
+ -webkit-text-fill-color: transparent;
529
+ }
530
+
531
+ .metric-label {
532
+ font-size: 14px;
533
+ opacity: 0.7;
534
+ }
535
+
536
+ .location-list {
537
+ margin-top: 20px;
538
+ }
539
+
540
+ .location-list h4 {
541
+ margin: 0 0 15px 0;
542
+ font-size: 18px;
543
+ font-weight: 600;
544
+ }
545
+
546
+ .location-grid {
547
+ display: grid;
548
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
549
+ gap: 15px;
550
+ }
551
+
552
+ .location-card {
553
+ background-color: rgba(255, 255, 255, 0.05);
554
+ border-radius: 10px;
555
+ padding: 15px;
556
+ border: 1px solid rgba(255, 255, 255, 0.1);
557
+ cursor: pointer;
558
+ transition: all 0.2s ease;
559
+ }
560
+
561
+ .location-card:hover {
562
+ background-color: rgba(0, 224, 255, 0.1);
563
+ transform: translateY(-3px);
564
+ }
565
+
566
+ .location-card.selected {
567
+ border-color: #00E0FF;
568
+ background-color: rgba(0, 224, 255, 0.1);
569
+ }
570
+
571
+ .location-name {
572
+ font-size: 16px;
573
+ font-weight: 600;
574
+ margin-bottom: 5px;
575
+ }
576
+
577
+ .location-type {
578
+ font-size: 12px;
579
+ opacity: 0.7;
580
+ margin-bottom: 8px;
581
+ }
582
+
583
+ .location-capacity {
584
+ font-size: 14px;
585
+ color: #00E0FF;
586
+ }
587
+
588
+ /* Demographics Tab */
589
+ .demographics-tab {
590
+ display: flex;
591
+ flex-direction: column;
592
+ gap: 30px;
593
+ }
594
+
595
+ .demographics-section {
596
+ background: rgba(255, 255, 255, 0.05);
597
+ border-radius: 16px;
598
+ padding: 20px;
599
+ border: 1px solid rgba(0, 224, 255, 0.1);
600
+ }
601
+
602
+ .demographics-section h3 {
603
+ margin: 0 0 20px 0;
604
+ font-size: 20px;
605
+ font-weight: 600;
606
+ }
607
+
608
+ .county-chart {
609
+ width: 100%;
610
+ overflow-x: auto;
611
+ }
612
+
613
+ .chart-header {
614
+ display: flex;
615
+ background-color: rgba(0, 0, 0, 0.2);
616
+ padding: 10px;
617
+ border-radius: 8px 8px 0 0;
618
+ font-weight: 600;
619
+ font-size: 14px;
620
+ }
621
+
622
+ .chart-row {
623
+ display: flex;
624
+ padding: 10px;
625
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
626
+ }
627
+
628
+ .chart-row:last-child {
629
+ border-bottom: none;
630
+ }
631
+
632
+ .chart-row:nth-child(even) {
633
+ background-color: rgba(255, 255, 255, 0.02);
634
+ }
635
+
636
+ .chart-column {
637
+ padding: 0 10px;
638
+ font-size: 14px;
639
+ }
640
+
641
+ .chart-column.county {
642
+ width: 120px;
643
+ flex-shrink: 0;
644
+ }
645
+
646
+ .chart-column.population {
647
+ width: 120px;
648
+ flex-shrink: 0;
649
+ text-align: right;
650
+ }
651
+
652
+ .chart-column.adoption {
653
+ flex: 1;
654
+ min-width: 200px;
655
+ }
656
+
657
+ .chart-column.stations {
658
+ width: 80px;
659
+ flex-shrink: 0;
660
+ text-align: center;
661
+ }
662
+
663
+ .adoption-bar-container {
664
+ height: 20px;
665
+ background-color: rgba(255, 255, 255, 0.1);
666
+ border-radius: 10px;
667
+ position: relative;
668
+ overflow: hidden;
669
+ }
670
+
671
+ .adoption-bar {
672
+ height: 100%;
673
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
674
+ border-radius: 10px;
675
+ }
676
+
677
+ .adoption-value {
678
+ position: absolute;
679
+ right: 10px;
680
+ top: 50%;
681
+ transform: translateY(-50%);
682
+ font-size: 12px;
683
+ font-weight: 600;
684
+ }
685
+
686
+ .projection-chart {
687
+ height: 300px;
688
+ position: relative;
689
+ padding: 20px 0 40px 0;
690
+ }
691
+
692
+ .projection-bars {
693
+ display: flex;
694
+ justify-content: space-around;
695
+ align-items: flex-end;
696
+ height: 100%;
697
+ }
698
+
699
+ .projection-bar-container {
700
+ display: flex;
701
+ flex-direction: column;
702
+ align-items: center;
703
+ height: 100%;
704
+ width: 60px;
705
+ }
706
+
707
+ .projection-year {
708
+ margin-bottom: 10px;
709
+ font-size: 14px;
710
+ }
711
+
712
+ .projection-bar-wrapper {
713
+ width: 40px;
714
+ height: 80%;
715
+ display: flex;
716
+ align-items: flex-end;
717
+ }
718
+
719
+ .projection-bar {
720
+ width: 100%;
721
+ background: linear-gradient(180deg, #00E0FF, #35F2DB);
722
+ border-radius: 4px 4px 0 0;
723
+ transition: height 0.5s ease;
724
+ }
725
+
726
+ .projection-value {
727
+ margin-top: 10px;
728
+ font-size: 14px;
729
+ font-weight: 600;
730
+ color: #00E0FF;
731
+ }
732
+
733
+ .projection-axis {
734
+ position: absolute;
735
+ bottom: 0;
736
+ left: 0;
737
+ right: 0;
738
+ text-align: center;
739
+ }
740
+
741
+ .axis-label {
742
+ font-size: 14px;
743
+ opacity: 0.7;
744
+ }
745
+
746
+ .projection-notes {
747
+ margin-top: 20px;
748
+ font-size: 14px;
749
+ opacity: 0.8;
750
+ line-height: 1.5;
751
+ }
752
+
753
+ /* Impact Metrics Tab */
754
+ .impact-metrics-tab {
755
+ display: flex;
756
+ flex-direction: column;
757
+ gap: 30px;
758
+ }
759
+
760
+ .impact-section {
761
+ background: rgba(255, 255, 255, 0.05);
762
+ border-radius: 16px;
763
+ padding: 20px;
764
+ border: 1px solid rgba(0, 224, 255, 0.1);
765
+ }
766
+
767
+ .impact-section.economic {
768
+ border-color: rgba(0, 224, 255, 0.2);
769
+ }
770
+
771
+ .impact-section.environmental {
772
+ border-color: rgba(53, 242, 219, 0.2);
773
+ }
774
+
775
+ .impact-section.social {
776
+ border-color: rgba(255, 193, 7, 0.2);
777
+ }
778
+
779
+ .impact-section h3 {
780
+ margin: 0 0 20px 0;
781
+ font-size: 20px;
782
+ font-weight: 600;
783
+ }
784
+
785
+ .impact-metrics {
786
+ display: grid;
787
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
788
+ gap: 20px;
789
+ }
790
+
791
+ .impact-metric {
792
+ background-color: rgba(255, 255, 255, 0.05);
793
+ border-radius: 12px;
794
+ padding: 20px;
795
+ text-align: center;
796
+ display: flex;
797
+ flex-direction: column;
798
+ align-items: center;
799
+ }
800
+
801
+ .impact-icon {
802
+ font-size: 28px;
803
+ margin-bottom: 10px;
804
+ }
805
+
806
+ .impact-value {
807
+ font-size: 28px;
808
+ font-weight: 700;
809
+ margin-bottom: 5px;
810
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
811
+ -webkit-background-clip: text;
812
+ background-clip: text;
813
+ -webkit-text-fill-color: transparent;
814
+ }
815
+
816
+ .impact-label {
817
+ font-size: 14px;
818
+ font-weight: 600;
819
+ margin-bottom: 10px;
820
+ }
821
+
822
+ .impact-description {
823
+ font-size: 12px;
824
+ opacity: 0.7;
825
+ line-height: 1.5;
826
+ }
827
+
828
+ /* Footer */
829
+ .map-footer {
830
+ display: flex;
831
+ justify-content: space-between;
832
+ align-items: center;
833
+ padding: 20px;
834
+ background-color: rgba(20, 20, 30, 0.8);
835
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
836
+ margin-top: 30px;
837
+ }
838
+
839
+ .footer-info {
840
+ display: flex;
841
+ flex-direction: column;
842
+ gap: 5px;
843
+ }
844
+
845
+ .footer-info span {
846
+ font-size: 12px;
847
+ opacity: 0.7;
848
+ }
849
+
850
+ .footer-actions {
851
+ display: flex;
852
+ gap: 10px;
853
+ }
854
+
855
+ .footer-button {
856
+ background-color: rgba(255, 255, 255, 0.05);
857
+ border: 1px solid rgba(0, 224, 255, 0.2);
858
+ border-radius: 6px;
859
+ padding: 8px 12px;
860
+ color: white;
861
+ font-size: 12px;
862
+ cursor: pointer;
863
+ transition: all 0.2s ease;
864
+ }
865
+
866
+ .footer-button:hover {
867
+ background-color: rgba(0, 224, 255, 0.1);
868
+ }
869
+
870
+ /* Responsive Adjustments */
871
+ @media (max-width: 768px) {
872
+ .map-header {
873
+ flex-direction: column;
874
+ align-items: flex-start;
875
+ gap: 10px;
876
+ }
877
+
878
+ .illinois-map {
879
+ height: 400px;
880
+ }
881
+
882
+ .map-controls {
883
+ flex-direction: column;
884
+ gap: 10px;
885
+ }
886
+
887
+ .zoom-controls, .view-controls {
888
+ width: 100%;
889
+ justify-content: space-between;
890
+ }
891
+
892
+ .map-legend {
893
+ position: relative;
894
+ bottom: auto;
895
+ right: auto;
896
+ margin-top: 20px;
897
+ }
898
+
899
+ .phase-header {
900
+ flex-direction: column;
901
+ align-items: flex-start;
902
+ gap: 10px;
903
+ }
904
+
905
+ .impact-metrics {
906
+ grid-template-columns: 1fr;
907
+ }
908
+
909
+ .map-footer {
910
+ flex-direction: column;
911
+ gap: 15px;
912
+ }
913
+
914
+ .footer-actions {
915
+ width: 100%;
916
+ justify-content: space-between;
917
+ }
918
+ }
DeploymentMap.jsx ADDED
@@ -0,0 +1,561 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useState, useEffect } from 'react';
2
+ import './DeploymentMap.css';
3
+
4
+ // Mock data for demonstration purposes
5
+ const mockDeploymentData = {
6
+ phases: [
7
+ {
8
+ id: 1,
9
+ name: "Phase 1",
10
+ timeline: "Q3 2025 - Q1 2026",
11
+ status: "planning",
12
+ locations: [
13
+ { id: 101, name: "Springfield Downtown", lat: 39.801, lng: -89.644, status: "planned", type: "urban", capacity: 12 },
14
+ { id: 102, name: "Champaign-Urbana Hub", lat: 40.116, lng: -88.243, status: "planned", type: "urban", capacity: 8 },
15
+ { id: 103, name: "Bloomington-Normal", lat: 40.484, lng: -88.993, status: "planned", type: "urban", capacity: 8 },
16
+ { id: 104, name: "Peoria Central", lat: 40.694, lng: -89.589, status: "planned", type: "urban", capacity: 8 }
17
+ ]
18
+ },
19
+ {
20
+ id: 2,
21
+ name: "Phase 2",
22
+ timeline: "Q2 2026 - Q4 2026",
23
+ status: "future",
24
+ locations: [
25
+ { id: 201, name: "Rockford Hub", lat: 42.271, lng: -89.093, status: "future", type: "urban", capacity: 8 },
26
+ { id: 202, name: "Quad Cities", lat: 41.512, lng: -90.578, status: "future", type: "urban", capacity: 8 },
27
+ { id: 203, name: "Carbondale", lat: 37.727, lng: -89.216, status: "future", type: "urban", capacity: 6 },
28
+ { id: 204, name: "Quincy", lat: 39.936, lng: -91.410, status: "future", type: "urban", capacity: 6 },
29
+ { id: 205, name: "I-55 Corridor North", lat: 41.097, lng: -88.841, status: "future", type: "corridor", capacity: 4 },
30
+ { id: 206, name: "I-55 Corridor South", lat: 39.144, lng: -89.479, status: "future", type: "corridor", capacity: 4 }
31
+ ]
32
+ },
33
+ {
34
+ id: 3,
35
+ name: "Phase 3",
36
+ timeline: "Q1 2027 - Q3 2027",
37
+ status: "future",
38
+ locations: [
39
+ { id: 301, name: "Decatur", lat: 39.840, lng: -88.954, status: "future", type: "urban", capacity: 6 },
40
+ { id: 302, name: "Danville", lat: 40.124, lng: -87.630, status: "future", type: "urban", capacity: 6 },
41
+ { id: 303, name: "Galesburg", lat: 40.947, lng: -90.371, status: "future", type: "urban", capacity: 4 },
42
+ { id: 304, name: "Mt. Vernon", lat: 38.317, lng: -88.903, status: "future", type: "urban", capacity: 4 },
43
+ { id: 305, name: "I-57 Corridor North", lat: 41.201, lng: -87.866, status: "future", type: "corridor", capacity: 4 },
44
+ { id: 306, name: "I-57 Corridor South", lat: 38.729, lng: -88.978, status: "future", type: "corridor", capacity: 4 },
45
+ { id: 307, name: "I-70 Corridor", lat: 39.123, lng: -88.542, status: "future", type: "corridor", capacity: 4 },
46
+ { id: 308, name: "I-74 Corridor", lat: 40.681, lng: -89.893, status: "future", type: "corridor", capacity: 4 }
47
+ ]
48
+ }
49
+ ],
50
+ demographics: {
51
+ population: [
52
+ { county: "Cook", population: 5150233, evAdoption: 2.8, chargingStations: 487 },
53
+ { county: "DuPage", population: 922921, evAdoption: 3.2, chargingStations: 112 },
54
+ { county: "Lake", population: 696535, evAdoption: 2.9, chargingStations: 78 },
55
+ { county: "Will", population: 677560, evAdoption: 2.1, chargingStations: 54 },
56
+ { county: "Kane", population: 532403, evAdoption: 2.3, chargingStations: 42 },
57
+ { county: "McHenry", population: 307774, evAdoption: 1.9, chargingStations: 28 },
58
+ { county: "Winnebago", population: 285350, evAdoption: 1.2, chargingStations: 18 },
59
+ { county: "Madison", population: 264461, evAdoption: 0.9, chargingStations: 14 },
60
+ { county: "St. Clair", population: 259686, evAdoption: 0.7, chargingStations: 12 },
61
+ { county: "Champaign", population: 205865, evAdoption: 1.8, chargingStations: 22 }
62
+ ],
63
+ evProjections: [
64
+ { year: 2025, percentage: 3.5 },
65
+ { year: 2026, percentage: 5.2 },
66
+ { year: 2027, percentage: 7.8 },
67
+ { year: 2028, percentage: 11.5 },
68
+ { year: 2029, percentage: 16.3 },
69
+ { year: 2030, percentage: 22.0 }
70
+ ]
71
+ },
72
+ impactMetrics: {
73
+ economic: {
74
+ jobsCreated: 450,
75
+ localBusinessImpact: 28,
76
+ taxRevenue: 3.2
77
+ },
78
+ environmental: {
79
+ co2Reduction: 12500,
80
+ gasDisplaced: 1.4,
81
+ renewableIntegration: 65
82
+ },
83
+ social: {
84
+ underservedCommunities: 14,
85
+ accessibilityScore: 72,
86
+ publicTransportIntegration: 8
87
+ }
88
+ }
89
+ };
90
+
91
+ function DeploymentMap() {
92
+ const [activeTab, setActiveTab] = useState('map');
93
+ const [loading, setLoading] = useState(true);
94
+ const [selectedPhase, setSelectedPhase] = useState(1);
95
+ const [mapView, setMapView] = useState('phases');
96
+ const [selectedLocation, setSelectedLocation] = useState(null);
97
+ const [mapZoom, setMapZoom] = useState(1);
98
+
99
+ useEffect(() => {
100
+ // Simulate loading
101
+ const timer = setTimeout(() => {
102
+ setLoading(false);
103
+ }, 1500);
104
+
105
+ return () => clearTimeout(timer);
106
+ }, []);
107
+
108
+ const handlePhaseChange = (phaseId) => {
109
+ setSelectedPhase(phaseId);
110
+ setSelectedLocation(null);
111
+ };
112
+
113
+ const handleMapViewChange = (view) => {
114
+ setMapView(view);
115
+ setSelectedLocation(null);
116
+ };
117
+
118
+ const handleLocationSelect = (location) => {
119
+ setSelectedLocation(location);
120
+ setMapZoom(2);
121
+ };
122
+
123
+ const handleZoomChange = (zoom) => {
124
+ setMapZoom(zoom);
125
+ if (zoom === 1) {
126
+ setSelectedLocation(null);
127
+ }
128
+ };
129
+
130
+ // Helper function to render the Illinois map with deployment locations
131
+ const renderMap = () => {
132
+ const currentPhase = mockDeploymentData.phases.find(phase => phase.id === selectedPhase);
133
+ const allLocations = mockDeploymentData.phases.flatMap(phase => phase.locations);
134
+ const displayLocations = mapView === 'phases' ? currentPhase.locations : allLocations;
135
+
136
+ return (
137
+ <div className="map-container">
138
+ <div className="illinois-map">
139
+ <img src="/images/illinois_map.png" alt="Illinois Map" className="map-image" />
140
+
141
+ {displayLocations.map(location => (
142
+ <div
143
+ key={location.id}
144
+ className={`map-marker ${location.status} ${location.type} ${selectedLocation && selectedLocation.id === location.id ? 'selected' : ''}`}
145
+ style={{
146
+ top: `${(1 - (location.lat - 37) / 6) * 100}%`,
147
+ left: `${((location.lng + 91.5) / 4) * 100}%`
148
+ }}
149
+ onClick={() => handleLocationSelect(location)}
150
+ >
151
+ <div className="marker-pulse"></div>
152
+ {mapZoom > 1 && (
153
+ <div className="marker-label">{location.name}</div>
154
+ )}
155
+ </div>
156
+ ))}
157
+
158
+ {selectedLocation && (
159
+ <div
160
+ className="location-detail-popup"
161
+ style={{
162
+ top: `${(1 - (selectedLocation.lat - 37) / 6) * 100}%`,
163
+ left: `${((selectedLocation.lng + 91.5) / 4) * 100}%`
164
+ }}
165
+ >
166
+ <h4>{selectedLocation.name}</h4>
167
+ <div className="detail-item">
168
+ <span className="detail-label">Status:</span>
169
+ <span className={`detail-value ${selectedLocation.status}`}>
170
+ {selectedLocation.status.charAt(0).toUpperCase() + selectedLocation.status.slice(1)}
171
+ </span>
172
+ </div>
173
+ <div className="detail-item">
174
+ <span className="detail-label">Type:</span>
175
+ <span className="detail-value">
176
+ {selectedLocation.type === 'urban' ? 'Urban Hub' : 'Corridor Station'}
177
+ </span>
178
+ </div>
179
+ <div className="detail-item">
180
+ <span className="detail-label">Capacity:</span>
181
+ <span className="detail-value">{selectedLocation.capacity} Chargers</span>
182
+ </div>
183
+ <div className="detail-item">
184
+ <span className="detail-label">Phase:</span>
185
+ <span className="detail-value">
186
+ {mockDeploymentData.phases.find(phase =>
187
+ phase.locations.some(loc => loc.id === selectedLocation.id)
188
+ ).name}
189
+ </span>
190
+ </div>
191
+ <button className="close-popup" onClick={() => setSelectedLocation(null)}>×</button>
192
+ </div>
193
+ )}
194
+ </div>
195
+
196
+ <div className="map-controls">
197
+ <div className="zoom-controls">
198
+ <button
199
+ className={`zoom-button ${mapZoom === 1 ? 'active' : ''}`}
200
+ onClick={() => handleZoomChange(1)}
201
+ >
202
+ State View
203
+ </button>
204
+ <button
205
+ className={`zoom-button ${mapZoom === 2 ? 'active' : ''}`}
206
+ onClick={() => handleZoomChange(2)}
207
+ >
208
+ Detailed View
209
+ </button>
210
+ </div>
211
+
212
+ <div className="view-controls">
213
+ <button
214
+ className={`view-button ${mapView === 'phases' ? 'active' : ''}`}
215
+ onClick={() => handleMapViewChange('phases')}
216
+ >
217
+ Phase View
218
+ </button>
219
+ <button
220
+ className={`view-button ${mapView === 'all' ? 'active' : ''}`}
221
+ onClick={() => handleMapViewChange('all')}
222
+ >
223
+ All Locations
224
+ </button>
225
+ </div>
226
+ </div>
227
+
228
+ <div className="map-legend">
229
+ <h4>Map Legend</h4>
230
+ <div className="legend-items">
231
+ <div className="legend-item">
232
+ <div className="legend-marker planned"></div>
233
+ <span>Planned (Phase 1)</span>
234
+ </div>
235
+ <div className="legend-item">
236
+ <div className="legend-marker future"></div>
237
+ <span>Future Phases</span>
238
+ </div>
239
+ <div className="legend-item">
240
+ <div className="legend-marker urban"></div>
241
+ <span>Urban Hub</span>
242
+ </div>
243
+ <div className="legend-item">
244
+ <div className="legend-marker corridor"></div>
245
+ <span>Corridor Station</span>
246
+ </div>
247
+ </div>
248
+ </div>
249
+ </div>
250
+ );
251
+ };
252
+
253
+ // Helper function to render the deployment phases
254
+ const renderPhases = () => {
255
+ return (
256
+ <div className="deployment-phases">
257
+ <div className="phase-tabs">
258
+ {mockDeploymentData.phases.map(phase => (
259
+ <button
260
+ key={phase.id}
261
+ className={`phase-tab ${selectedPhase === phase.id ? 'active' : ''} ${phase.status}`}
262
+ onClick={() => handlePhaseChange(phase.id)}
263
+ >
264
+ {phase.name}
265
+ </button>
266
+ ))}
267
+ </div>
268
+
269
+ {mockDeploymentData.phases.map(phase => (
270
+ phase.id === selectedPhase && (
271
+ <div key={phase.id} className="phase-details">
272
+ <div className="phase-header">
273
+ <h3>{phase.name}</h3>
274
+ <div className="phase-timeline">{phase.timeline}</div>
275
+ <div className={`phase-status ${phase.status}`}>
276
+ {phase.status.charAt(0).toUpperCase() + phase.status.slice(1)}
277
+ </div>
278
+ </div>
279
+
280
+ <div className="phase-metrics">
281
+ <div className="metric-card">
282
+ <div className="metric-value">{phase.locations.length}</div>
283
+ <div className="metric-label">Charging Locations</div>
284
+ </div>
285
+ <div className="metric-card">
286
+ <div className="metric-value">
287
+ {phase.locations.reduce((sum, location) => sum + location.capacity, 0)}
288
+ </div>
289
+ <div className="metric-label">Total Chargers</div>
290
+ </div>
291
+ <div className="metric-card">
292
+ <div className="metric-value">
293
+ {phase.locations.filter(location => location.type === 'urban').length}
294
+ </div>
295
+ <div className="metric-label">Urban Hubs</div>
296
+ </div>
297
+ <div className="metric-card">
298
+ <div className="metric-value">
299
+ {phase.locations.filter(location => location.type === 'corridor').length}
300
+ </div>
301
+ <div className="metric-label">Corridor Stations</div>
302
+ </div>
303
+ </div>
304
+
305
+ <div className="location-list">
306
+ <h4>Deployment Locations</h4>
307
+ <div className="location-grid">
308
+ {phase.locations.map(location => (
309
+ <div
310
+ key={location.id}
311
+ className={`location-card ${selectedLocation && selectedLocation.id === location.id ? 'selected' : ''}`}
312
+ onClick={() => handleLocationSelect(location)}
313
+ >
314
+ <div className="location-name">{location.name}</div>
315
+ <div className="location-type">
316
+ {location.type === 'urban' ? 'Urban Hub' : 'Corridor Station'}
317
+ </div>
318
+ <div className="location-capacity">{location.capacity} Chargers</div>
319
+ </div>
320
+ ))}
321
+ </div>
322
+ </div>
323
+ </div>
324
+ )
325
+ ))}
326
+ </div>
327
+ );
328
+ };
329
+
330
+ // Helper function to render the demographics tab
331
+ const renderDemographics = () => {
332
+ return (
333
+ <div className="demographics-tab">
334
+ <div className="demographics-section">
335
+ <h3>Population & EV Adoption by County</h3>
336
+ <div className="county-chart">
337
+ <div className="chart-header">
338
+ <div className="chart-column county">County</div>
339
+ <div className="chart-column population">Population</div>
340
+ <div className="chart-column adoption">EV Adoption %</div>
341
+ <div className="chart-column stations">Charging Stations</div>
342
+ </div>
343
+ {mockDeploymentData.demographics.population.map((county, index) => (
344
+ <div key={index} className="chart-row">
345
+ <div className="chart-column county">{county.county}</div>
346
+ <div className="chart-column population">{county.population.toLocaleString()}</div>
347
+ <div className="chart-column adoption">
348
+ <div className="adoption-bar-container">
349
+ <div
350
+ className="adoption-bar"
351
+ style={{ width: `${county.evAdoption * 10}%` }}
352
+ ></div>
353
+ <span className="adoption-value">{county.evAdoption}%</span>
354
+ </div>
355
+ </div>
356
+ <div className="chart-column stations">{county.chargingStations}</div>
357
+ </div>
358
+ ))}
359
+ </div>
360
+ </div>
361
+
362
+ <div className="demographics-section">
363
+ <h3>EV Adoption Projections</h3>
364
+ <div className="projection-chart">
365
+ <div className="projection-bars">
366
+ {mockDeploymentData.demographics.evProjections.map((projection, index) => (
367
+ <div key={index} className="projection-bar-container">
368
+ <div className="projection-year">{projection.year}</div>
369
+ <div className="projection-bar-wrapper">
370
+ <div
371
+ className="projection-bar"
372
+ style={{ height: `${projection.percentage * 3}%` }}
373
+ ></div>
374
+ </div>
375
+ <div className="projection-value">{projection.percentage}%</div>
376
+ </div>
377
+ ))}
378
+ </div>
379
+ <div className="projection-axis">
380
+ <div className="axis-label">Projected EV Adoption Rate (%)</div>
381
+ </div>
382
+ </div>
383
+
384
+ <div className="projection-notes">
385
+ <p>Projections based on current adoption trends, state incentives, and manufacturer production forecasts.</p>
386
+ <p>The Link deployment strategy is designed to stay ahead of projected adoption curves to ensure adequate charging infrastructure.</p>
387
+ </div>
388
+ </div>
389
+ </div>
390
+ );
391
+ };
392
+
393
+ // Helper function to render the impact metrics tab
394
+ const renderImpactMetrics = () => {
395
+ const { economic, environmental, social } = mockDeploymentData.impactMetrics;
396
+
397
+ return (
398
+ <div className="impact-metrics-tab">
399
+ <div className="impact-section economic">
400
+ <h3>Economic Impact</h3>
401
+ <div className="impact-metrics">
402
+ <div className="impact-metric">
403
+ <div className="impact-icon">💼</div>
404
+ <div className="impact-value">{economic.jobsCreated}</div>
405
+ <div className="impact-label">Jobs Created</div>
406
+ <div className="impact-description">
407
+ Direct and indirect employment opportunities across all deployment phases
408
+ </div>
409
+ </div>
410
+ <div className="impact-metric">
411
+ <div className="impact-icon">🏪</div>
412
+ <div className="impact-value">{economic.localBusinessImpact}%</div>
413
+ <div className="impact-label">Local Business Growth</div>
414
+ <div className="impact-description">
415
+ Projected increase in revenue for businesses near charging hubs
416
+ </div>
417
+ </div>
418
+ <div className="impact-metric">
419
+ <div className="impact-icon">💰</div>
420
+ <div className="impact-value">${economic.taxRevenue}M</div>
421
+ <div className="impact-label">Annual Tax Revenue</div>
422
+ <div className="impact-description">
423
+ Estimated additional tax revenue for state and local governments
424
+ </div>
425
+ </div>
426
+ </div>
427
+ </div>
428
+
429
+ <div className="impact-section environmental">
430
+ <h3>Environmental Impact</h3>
431
+ <div className="impact-metrics">
432
+ <div className="impact-metric">
433
+ <div className="impact-icon">🌱</div>
434
+ <div className="impact-value">{environmental.co2Reduction}</div>
435
+ <div className="impact-label">Tons CO₂ Reduced</div>
436
+ <div className="impact-description">
437
+ Annual carbon emissions reduction from EV adoption enabled by The Link
438
+ </div>
439
+ </div>
440
+ <div className="impact-metric">
441
+ <div className="impact-icon">⛽</div>
442
+ <div className="impact-value">{environmental.gasDisplaced}M</div>
443
+ <div className="impact-label">Gallons Gas Displaced</div>
444
+ <div className="impact-description">
445
+ Annual reduction in gasoline consumption
446
+ </div>
447
+ </div>
448
+ <div className="impact-metric">
449
+ <div className="impact-icon">☀️</div>
450
+ <div className="impact-value">{environmental.renewableIntegration}%</div>
451
+ <div className="impact-label">Renewable Energy</div>
452
+ <div className="impact-description">
453
+ Percentage of charging energy from renewable sources
454
+ </div>
455
+ </div>
456
+ </div>
457
+ </div>
458
+
459
+ <div className="impact-section social">
460
+ <h3>Social Impact</h3>
461
+ <div className="impact-metrics">
462
+ <div className="impact-metric">
463
+ <div className="impact-icon">🏘️</div>
464
+ <div className="impact-value">{social.underservedCommunities}</div>
465
+ <div className="impact-label">Underserved Communities</div>
466
+ <div className="impact-description">
467
+ Number of underserved communities with improved EV access
468
+ </div>
469
+ </div>
470
+ <div className="impact-metric">
471
+ <div className="impact-icon">♿</div>
472
+ <div className="impact-value">{social.accessibilityScore}/100</div>
473
+ <div className="impact-label">Accessibility Score</div>
474
+ <div className="impact-description">
475
+ Rating of charging infrastructure accessibility for all users
476
+ </div>
477
+ </div>
478
+ <div className="impact-metric">
479
+ <div className="impact-icon">🚌</div>
480
+ <div className="impact-value">{social.publicTransportIntegration}</div>
481
+ <div className="impact-label">Transit Connections</div>
482
+ <div className="impact-description">
483
+ Number of charging hubs with public transportation connections
484
+ </div>
485
+ </div>
486
+ </div>
487
+ </div>
488
+ </div>
489
+ );
490
+ };
491
+
492
+ if (loading) {
493
+ return (
494
+ <div className="deployment-map loading">
495
+ <div className="loading-logo">
496
+ <img src="/images/unity_fleet_logo.png" alt="Unity Fleet" />
497
+ <div className="loading-pulse"></div>
498
+ </div>
499
+ <p>Loading Deployment Map...</p>
500
+ </div>
501
+ );
502
+ }
503
+
504
+ return (
505
+ <div className="deployment-map">
506
+ <header className="map-header">
507
+ <div className="map-title">
508
+ <h1>Deployment Map</h1>
509
+ <span className="map-subtitle">The Link Charging Network</span>
510
+ </div>
511
+ </header>
512
+
513
+ <div className="map-navigation">
514
+ <button
515
+ className={`nav-button ${activeTab === 'map' ? 'active' : ''}`}
516
+ onClick={() => setActiveTab('map')}
517
+ >
518
+ Interactive Map
519
+ </button>
520
+ <button
521
+ className={`nav-button ${activeTab === 'phases' ? 'active' : ''}`}
522
+ onClick={() => setActiveTab('phases')}
523
+ >
524
+ Deployment Phases
525
+ </button>
526
+ <button
527
+ className={`nav-button ${activeTab === 'demographics' ? 'active' : ''}`}
528
+ onClick={() => setActiveTab('demographics')}
529
+ >
530
+ Demographics
531
+ </button>
532
+ <button
533
+ className={`nav-button ${activeTab === 'impact' ? 'active' : ''}`}
534
+ onClick={() => setActiveTab('impact')}
535
+ >
536
+ Impact Metrics
537
+ </button>
538
+ </div>
539
+
540
+ <main className="map-content">
541
+ {activeTab === 'map' && renderMap()}
542
+ {activeTab === 'phases' && renderPhases()}
543
+ {activeTab === 'demographics' && renderDemographics()}
544
+ {activeTab === 'impact' && renderImpactMetrics()}
545
+ </main>
546
+
547
+ <footer className="map-footer">
548
+ <div className="footer-info">
549
+ <span>Unity Fleet Deployment Strategy</span>
550
+ <span>Powered by Atlas Intelligence</span>
551
+ </div>
552
+ <div className="footer-actions">
553
+ <button className="footer-button">Download Map Data</button>
554
+ <button className="footer-button">Share Deployment Plan</button>
555
+ </div>
556
+ </footer>
557
+ </div>
558
+ );
559
+ }
560
+
561
+ export default DeploymentMap;
EnergySimulation.css ADDED
@@ -0,0 +1,1377 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Energy Simulation Styles */
2
+ .energy-simulation {
3
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
4
+ max-width: 1200px;
5
+ margin: 0 auto;
6
+ background-color: #0B0B0F;
7
+ color: #ffffff;
8
+ min-height: 100vh;
9
+ position: relative;
10
+ }
11
+
12
+ /* Loading Screen */
13
+ .energy-simulation.loading {
14
+ display: flex;
15
+ flex-direction: column;
16
+ justify-content: center;
17
+ align-items: center;
18
+ height: 100vh;
19
+ }
20
+
21
+ .loading-logo {
22
+ width: 150px;
23
+ height: 150px;
24
+ margin-bottom: 20px;
25
+ position: relative;
26
+ }
27
+
28
+ .loading-logo img {
29
+ width: 100%;
30
+ height: 100%;
31
+ object-fit: contain;
32
+ }
33
+
34
+ .loading-pulse {
35
+ position: absolute;
36
+ top: 0;
37
+ left: 0;
38
+ right: 0;
39
+ bottom: 0;
40
+ border-radius: 50%;
41
+ border: 2px solid #00E0FF;
42
+ animation: pulse 1.5s infinite ease-in-out;
43
+ }
44
+
45
+ @keyframes pulse {
46
+ 0% {
47
+ transform: scale(0.95);
48
+ opacity: 1;
49
+ }
50
+ 70% {
51
+ transform: scale(1.2);
52
+ opacity: 0;
53
+ }
54
+ 100% {
55
+ transform: scale(0.95);
56
+ opacity: 0;
57
+ }
58
+ }
59
+
60
+ /* Header */
61
+ .simulation-header {
62
+ display: flex;
63
+ justify-content: space-between;
64
+ align-items: center;
65
+ padding: 20px;
66
+ background-color: rgba(20, 20, 30, 0.8);
67
+ backdrop-filter: blur(10px);
68
+ position: sticky;
69
+ top: 0;
70
+ z-index: 100;
71
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
72
+ flex-wrap: wrap;
73
+ }
74
+
75
+ .simulation-title {
76
+ display: flex;
77
+ flex-direction: column;
78
+ }
79
+
80
+ .simulation-title h1 {
81
+ margin: 0;
82
+ font-size: 28px;
83
+ font-weight: 700;
84
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
85
+ -webkit-background-clip: text;
86
+ background-clip: text;
87
+ -webkit-text-fill-color: transparent;
88
+ letter-spacing: 1px;
89
+ }
90
+
91
+ .simulation-subtitle {
92
+ font-size: 14px;
93
+ opacity: 0.7;
94
+ }
95
+
96
+ .simulation-controls {
97
+ display: flex;
98
+ align-items: center;
99
+ gap: 20px;
100
+ flex-wrap: wrap;
101
+ }
102
+
103
+ .time-display {
104
+ display: flex;
105
+ align-items: center;
106
+ gap: 8px;
107
+ background-color: rgba(255, 255, 255, 0.05);
108
+ padding: 8px 12px;
109
+ border-radius: 8px;
110
+ border: 1px solid rgba(0, 224, 255, 0.2);
111
+ }
112
+
113
+ .time-label {
114
+ font-size: 14px;
115
+ opacity: 0.7;
116
+ }
117
+
118
+ .time-value {
119
+ font-size: 16px;
120
+ font-weight: 600;
121
+ color: #00E0FF;
122
+ }
123
+
124
+ .control-buttons {
125
+ display: flex;
126
+ gap: 10px;
127
+ }
128
+
129
+ .control-button {
130
+ background-color: rgba(255, 255, 255, 0.05);
131
+ border: 1px solid rgba(0, 224, 255, 0.2);
132
+ border-radius: 8px;
133
+ padding: 8px 12px;
134
+ color: white;
135
+ font-size: 14px;
136
+ cursor: pointer;
137
+ transition: all 0.2s ease;
138
+ }
139
+
140
+ .control-button:hover {
141
+ background-color: rgba(0, 224, 255, 0.1);
142
+ }
143
+
144
+ .control-button.active {
145
+ background-color: rgba(0, 224, 255, 0.2);
146
+ border-color: #00E0FF;
147
+ color: #00E0FF;
148
+ }
149
+
150
+ .speed-control {
151
+ display: flex;
152
+ align-items: center;
153
+ gap: 8px;
154
+ }
155
+
156
+ .speed-label {
157
+ font-size: 14px;
158
+ opacity: 0.7;
159
+ }
160
+
161
+ .speed-buttons {
162
+ display: flex;
163
+ gap: 2px;
164
+ }
165
+
166
+ .speed-button {
167
+ background-color: rgba(255, 255, 255, 0.05);
168
+ border: 1px solid rgba(255, 255, 255, 0.1);
169
+ border-radius: 4px;
170
+ padding: 4px 8px;
171
+ color: white;
172
+ font-size: 12px;
173
+ cursor: pointer;
174
+ transition: all 0.2s ease;
175
+ }
176
+
177
+ .speed-button:hover {
178
+ background-color: rgba(0, 224, 255, 0.1);
179
+ }
180
+
181
+ .speed-button.active {
182
+ background-color: rgba(0, 224, 255, 0.2);
183
+ border-color: #00E0FF;
184
+ color: #00E0FF;
185
+ }
186
+
187
+ /* Navigation */
188
+ .simulation-navigation {
189
+ display: flex;
190
+ gap: 2px;
191
+ background-color: rgba(20, 20, 30, 0.5);
192
+ padding: 0 20px;
193
+ overflow-x: auto;
194
+ scrollbar-width: none;
195
+ }
196
+
197
+ .simulation-navigation::-webkit-scrollbar {
198
+ display: none;
199
+ }
200
+
201
+ .nav-button {
202
+ padding: 16px 20px;
203
+ background: transparent;
204
+ border: none;
205
+ color: white;
206
+ font-size: 16px;
207
+ cursor: pointer;
208
+ position: relative;
209
+ white-space: nowrap;
210
+ }
211
+
212
+ .nav-button.active {
213
+ color: #00E0FF;
214
+ }
215
+
216
+ .nav-button.active::after {
217
+ content: '';
218
+ position: absolute;
219
+ bottom: 0;
220
+ left: 0;
221
+ right: 0;
222
+ height: 3px;
223
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
224
+ border-radius: 3px 3px 0 0;
225
+ }
226
+
227
+ /* Main Content */
228
+ .simulation-content {
229
+ padding: 20px;
230
+ min-height: calc(100vh - 200px);
231
+ }
232
+
233
+ /* Overview Tab */
234
+ .overview-tab {
235
+ display: flex;
236
+ flex-direction: column;
237
+ gap: 30px;
238
+ }
239
+
240
+ .energy-summary {
241
+ display: grid;
242
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
243
+ gap: 20px;
244
+ }
245
+
246
+ .summary-card {
247
+ background: rgba(255, 255, 255, 0.05);
248
+ border-radius: 16px;
249
+ padding: 20px;
250
+ border: 1px solid rgba(0, 224, 255, 0.1);
251
+ }
252
+
253
+ .summary-card h3 {
254
+ margin-top: 0;
255
+ margin-bottom: 16px;
256
+ font-size: 18px;
257
+ font-weight: 600;
258
+ }
259
+
260
+ .balance-metrics {
261
+ display: grid;
262
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
263
+ gap: 16px;
264
+ }
265
+
266
+ .metric {
267
+ display: flex;
268
+ flex-direction: column;
269
+ gap: 4px;
270
+ }
271
+
272
+ .metric-label {
273
+ font-size: 14px;
274
+ opacity: 0.7;
275
+ }
276
+
277
+ .metric-value {
278
+ font-size: 18px;
279
+ font-weight: 600;
280
+ }
281
+
282
+ .metric-value.positive {
283
+ color: #35F2DB;
284
+ }
285
+
286
+ .metric-value.negative {
287
+ color: #FF5555;
288
+ }
289
+
290
+ /* Energy Flow Diagram */
291
+ .energy-flow-diagram {
292
+ background: rgba(255, 255, 255, 0.05);
293
+ border-radius: 16px;
294
+ padding: 30px;
295
+ border: 1px solid rgba(0, 224, 255, 0.1);
296
+ display: flex;
297
+ flex-direction: column;
298
+ gap: 30px;
299
+ position: relative;
300
+ }
301
+
302
+ .energy-sources {
303
+ display: flex;
304
+ justify-content: space-between;
305
+ gap: 20px;
306
+ }
307
+
308
+ .energy-source {
309
+ flex: 1;
310
+ display: flex;
311
+ flex-direction: column;
312
+ align-items: center;
313
+ text-align: center;
314
+ padding: 15px;
315
+ background: rgba(255, 255, 255, 0.05);
316
+ border-radius: 12px;
317
+ border: 1px solid rgba(255, 255, 255, 0.1);
318
+ }
319
+
320
+ .energy-source.solar {
321
+ border-color: rgba(255, 215, 0, 0.3);
322
+ }
323
+
324
+ .energy-source.grid {
325
+ border-color: rgba(255, 85, 85, 0.3);
326
+ }
327
+
328
+ .source-icon {
329
+ font-size: 24px;
330
+ margin-bottom: 10px;
331
+ }
332
+
333
+ .source-label {
334
+ font-size: 14px;
335
+ opacity: 0.7;
336
+ margin-bottom: 5px;
337
+ }
338
+
339
+ .source-value {
340
+ font-size: 18px;
341
+ font-weight: 600;
342
+ }
343
+
344
+ .energy-flows {
345
+ display: flex;
346
+ justify-content: space-between;
347
+ gap: 20px;
348
+ position: relative;
349
+ height: 40px;
350
+ }
351
+
352
+ .flow {
353
+ height: 10px;
354
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
355
+ border-radius: 5px;
356
+ position: relative;
357
+ animation: flowPulse 2s infinite;
358
+ }
359
+
360
+ @keyframes flowPulse {
361
+ 0% {
362
+ opacity: 0.7;
363
+ }
364
+ 50% {
365
+ opacity: 1;
366
+ }
367
+ 100% {
368
+ opacity: 0.7;
369
+ }
370
+ }
371
+
372
+ .solar-flow {
373
+ background: linear-gradient(90deg, #FFD700, #FFA500);
374
+ }
375
+
376
+ .grid-flow {
377
+ background: linear-gradient(90deg, #FF5555, #FF8888);
378
+ }
379
+
380
+ .battery-flow {
381
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
382
+ }
383
+
384
+ .energy-storage {
385
+ align-self: center;
386
+ display: flex;
387
+ flex-direction: column;
388
+ align-items: center;
389
+ text-align: center;
390
+ padding: 20px;
391
+ background: rgba(255, 255, 255, 0.05);
392
+ border-radius: 12px;
393
+ border: 1px solid rgba(0, 224, 255, 0.3);
394
+ width: 200px;
395
+ }
396
+
397
+ .storage-icon {
398
+ font-size: 24px;
399
+ margin-bottom: 10px;
400
+ }
401
+
402
+ .storage-label {
403
+ font-size: 14px;
404
+ opacity: 0.7;
405
+ margin-bottom: 5px;
406
+ }
407
+
408
+ .storage-value {
409
+ font-size: 24px;
410
+ font-weight: 600;
411
+ color: #00E0FF;
412
+ margin-bottom: 5px;
413
+ }
414
+
415
+ .storage-capacity {
416
+ font-size: 12px;
417
+ opacity: 0.7;
418
+ }
419
+
420
+ .energy-demand {
421
+ align-self: center;
422
+ display: flex;
423
+ flex-direction: column;
424
+ align-items: center;
425
+ text-align: center;
426
+ padding: 20px;
427
+ background: rgba(255, 255, 255, 0.05);
428
+ border-radius: 12px;
429
+ border: 1px solid rgba(53, 242, 219, 0.3);
430
+ width: 200px;
431
+ }
432
+
433
+ .demand-icon {
434
+ font-size: 24px;
435
+ margin-bottom: 10px;
436
+ }
437
+
438
+ .demand-label {
439
+ font-size: 14px;
440
+ opacity: 0.7;
441
+ margin-bottom: 5px;
442
+ }
443
+
444
+ .demand-value {
445
+ font-size: 24px;
446
+ font-weight: 600;
447
+ color: #35F2DB;
448
+ margin-bottom: 5px;
449
+ }
450
+
451
+ .demand-details {
452
+ font-size: 12px;
453
+ opacity: 0.7;
454
+ }
455
+
456
+ /* Optimization Summary */
457
+ .optimization-summary {
458
+ background: rgba(255, 255, 255, 0.05);
459
+ border-radius: 16px;
460
+ padding: 20px;
461
+ border: 1px solid rgba(0, 224, 255, 0.1);
462
+ }
463
+
464
+ .optimization-summary h3 {
465
+ margin-top: 0;
466
+ margin-bottom: 16px;
467
+ font-size: 18px;
468
+ font-weight: 600;
469
+ }
470
+
471
+ .optimization-metrics {
472
+ display: grid;
473
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
474
+ gap: 20px;
475
+ }
476
+
477
+ .metric-bar-container {
478
+ height: 8px;
479
+ background-color: rgba(255, 255, 255, 0.1);
480
+ border-radius: 4px;
481
+ overflow: hidden;
482
+ margin-top: 8px;
483
+ }
484
+
485
+ .metric-bar {
486
+ height: 100%;
487
+ border-radius: 4px;
488
+ transition: width 0.5s ease;
489
+ }
490
+
491
+ /* Gauge Component */
492
+ .gauge-container {
493
+ display: flex;
494
+ flex-direction: column;
495
+ align-items: center;
496
+ margin-bottom: 10px;
497
+ }
498
+
499
+ .gauge {
500
+ width: 150px;
501
+ height: 150px;
502
+ position: relative;
503
+ }
504
+
505
+ .gauge-body {
506
+ width: 100%;
507
+ height: 100%;
508
+ border-radius: 50%;
509
+ position: relative;
510
+ overflow: hidden;
511
+ background-color: rgba(255, 255, 255, 0.05);
512
+ border: 1px solid rgba(255, 255, 255, 0.1);
513
+ }
514
+
515
+ .gauge-fill {
516
+ position: absolute;
517
+ top: 0;
518
+ left: 0;
519
+ width: 100%;
520
+ height: 100%;
521
+ transform-origin: center bottom;
522
+ transition: transform 1s ease;
523
+ }
524
+
525
+ .gauge-cover {
526
+ position: absolute;
527
+ top: 15%;
528
+ left: 15%;
529
+ width: 70%;
530
+ height: 70%;
531
+ background-color: #0B0B0F;
532
+ border-radius: 50%;
533
+ display: flex;
534
+ flex-direction: column;
535
+ justify-content: center;
536
+ align-items: center;
537
+ }
538
+
539
+ .gauge-value {
540
+ font-size: 24px;
541
+ font-weight: 600;
542
+ }
543
+
544
+ .gauge-label {
545
+ font-size: 12px;
546
+ opacity: 0.7;
547
+ }
548
+
549
+ .gauge-max {
550
+ font-size: 12px;
551
+ opacity: 0.7;
552
+ margin-top: 5px;
553
+ }
554
+
555
+ /* Bar Chart Component */
556
+ .bar-chart {
557
+ display: flex;
558
+ flex-direction: column;
559
+ gap: 8px;
560
+ }
561
+
562
+ .bar-container {
563
+ display: flex;
564
+ align-items: center;
565
+ gap: 10px;
566
+ }
567
+
568
+ .bar-label {
569
+ width: 60px;
570
+ font-size: 12px;
571
+ text-align: right;
572
+ }
573
+
574
+ .bar-wrapper {
575
+ flex: 1;
576
+ height: 20px;
577
+ background-color: rgba(255, 255, 255, 0.05);
578
+ border-radius: 4px;
579
+ overflow: hidden;
580
+ position: relative;
581
+ }
582
+
583
+ .bar {
584
+ height: 100%;
585
+ transition: width 0.5s ease;
586
+ }
587
+
588
+ .bar-value {
589
+ position: absolute;
590
+ right: 8px;
591
+ top: 50%;
592
+ transform: translateY(-50%);
593
+ font-size: 12px;
594
+ font-weight: 600;
595
+ }
596
+
597
+ /* Solar Tab */
598
+ .solar-tab {
599
+ display: flex;
600
+ flex-direction: column;
601
+ gap: 30px;
602
+ }
603
+
604
+ .solar-metrics {
605
+ display: grid;
606
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
607
+ gap: 20px;
608
+ }
609
+
610
+ .metric-card {
611
+ background: rgba(255, 255, 255, 0.05);
612
+ border-radius: 16px;
613
+ padding: 20px;
614
+ border: 1px solid rgba(0, 224, 255, 0.1);
615
+ display: flex;
616
+ flex-direction: column;
617
+ align-items: center;
618
+ }
619
+
620
+ .metric-card h3 {
621
+ margin: 10px 0 0 0;
622
+ font-size: 18px;
623
+ font-weight: 600;
624
+ text-align: center;
625
+ }
626
+
627
+ .daily-production {
628
+ width: 100%;
629
+ }
630
+
631
+ .daily-production h3 {
632
+ margin-top: 0;
633
+ margin-bottom: 16px;
634
+ font-size: 18px;
635
+ font-weight: 600;
636
+ text-align: left;
637
+ }
638
+
639
+ .solar-details {
640
+ display: grid;
641
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
642
+ gap: 20px;
643
+ }
644
+
645
+ .detail-card {
646
+ background: rgba(255, 255, 255, 0.05);
647
+ border-radius: 16px;
648
+ padding: 20px;
649
+ border: 1px solid rgba(0, 224, 255, 0.1);
650
+ }
651
+
652
+ .detail-card h3 {
653
+ margin-top: 0;
654
+ margin-bottom: 16px;
655
+ font-size: 18px;
656
+ font-weight: 600;
657
+ }
658
+
659
+ .detail-grid {
660
+ display: grid;
661
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
662
+ gap: 16px;
663
+ }
664
+
665
+ .detail-item {
666
+ display: flex;
667
+ flex-direction: column;
668
+ gap: 4px;
669
+ }
670
+
671
+ .detail-label {
672
+ font-size: 14px;
673
+ opacity: 0.7;
674
+ }
675
+
676
+ .detail-value {
677
+ font-size: 16px;
678
+ font-weight: 600;
679
+ }
680
+
681
+ .weather-forecast {
682
+ display: flex;
683
+ justify-content: space-between;
684
+ gap: 10px;
685
+ }
686
+
687
+ .weather-item {
688
+ flex: 1;
689
+ display: flex;
690
+ flex-direction: column;
691
+ align-items: center;
692
+ text-align: center;
693
+ padding: 10px;
694
+ background: rgba(255, 255, 255, 0.05);
695
+ border-radius: 8px;
696
+ }
697
+
698
+ .weather-icon {
699
+ font-size: 24px;
700
+ margin-bottom: 5px;
701
+ }
702
+
703
+ .weather-day {
704
+ font-size: 12px;
705
+ opacity: 0.7;
706
+ margin-bottom: 5px;
707
+ }
708
+
709
+ .weather-impact {
710
+ font-size: 14px;
711
+ font-weight: 600;
712
+ }
713
+
714
+ .weather-impact.positive {
715
+ color: #35F2DB;
716
+ }
717
+
718
+ .weather-impact.neutral {
719
+ color: #FFC107;
720
+ }
721
+
722
+ .weather-impact.negative {
723
+ color: #FF5555;
724
+ }
725
+
726
+ /* Battery Tab */
727
+ .battery-tab {
728
+ display: flex;
729
+ flex-direction: column;
730
+ gap: 30px;
731
+ }
732
+
733
+ .battery-metrics {
734
+ display: grid;
735
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
736
+ gap: 20px;
737
+ }
738
+
739
+ .battery-status {
740
+ width: 100%;
741
+ }
742
+
743
+ .battery-status h3 {
744
+ margin-top: 0;
745
+ margin-bottom: 16px;
746
+ font-size: 18px;
747
+ font-weight: 600;
748
+ }
749
+
750
+ .status-grid {
751
+ display: grid;
752
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
753
+ gap: 16px;
754
+ }
755
+
756
+ .status-item {
757
+ display: flex;
758
+ flex-direction: column;
759
+ gap: 4px;
760
+ }
761
+
762
+ .status-label {
763
+ font-size: 14px;
764
+ opacity: 0.7;
765
+ }
766
+
767
+ .status-value {
768
+ font-size: 16px;
769
+ font-weight: 600;
770
+ }
771
+
772
+ .status-value.positive {
773
+ color: #35F2DB;
774
+ }
775
+
776
+ .status-value.negative {
777
+ color: #FF5555;
778
+ }
779
+
780
+ .status-value.status-active {
781
+ color: #35F2DB;
782
+ }
783
+
784
+ .status-value.status-stable {
785
+ color: #35F2DB;
786
+ }
787
+
788
+ .battery-history {
789
+ background: rgba(255, 255, 255, 0.05);
790
+ border-radius: 16px;
791
+ padding: 20px;
792
+ border: 1px solid rgba(0, 224, 255, 0.1);
793
+ }
794
+
795
+ .battery-history h3 {
796
+ margin-top: 0;
797
+ margin-bottom: 16px;
798
+ font-size: 18px;
799
+ font-weight: 600;
800
+ }
801
+
802
+ .battery-controls {
803
+ background: rgba(255, 255, 255, 0.05);
804
+ border-radius: 16px;
805
+ padding: 20px;
806
+ border: 1px solid rgba(0, 224, 255, 0.1);
807
+ }
808
+
809
+ .battery-controls h3 {
810
+ margin-top: 0;
811
+ margin-bottom: 16px;
812
+ font-size: 18px;
813
+ font-weight: 600;
814
+ }
815
+
816
+ .control-grid {
817
+ display: grid;
818
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
819
+ gap: 20px;
820
+ }
821
+
822
+ .control-item {
823
+ display: flex;
824
+ flex-direction: column;
825
+ gap: 10px;
826
+ }
827
+
828
+ .control-label {
829
+ font-size: 14px;
830
+ opacity: 0.7;
831
+ }
832
+
833
+ .control-slider-container {
834
+ display: flex;
835
+ align-items: center;
836
+ gap: 10px;
837
+ }
838
+
839
+ .control-slider {
840
+ flex: 1;
841
+ height: 4px;
842
+ -webkit-appearance: none;
843
+ appearance: none;
844
+ background: rgba(255, 255, 255, 0.1);
845
+ border-radius: 2px;
846
+ outline: none;
847
+ }
848
+
849
+ .control-slider::-webkit-slider-thumb {
850
+ -webkit-appearance: none;
851
+ appearance: none;
852
+ width: 16px;
853
+ height: 16px;
854
+ border-radius: 50%;
855
+ background: #00E0FF;
856
+ cursor: pointer;
857
+ }
858
+
859
+ .control-slider::-moz-range-thumb {
860
+ width: 16px;
861
+ height: 16px;
862
+ border-radius: 50%;
863
+ background: #00E0FF;
864
+ cursor: pointer;
865
+ }
866
+
867
+ .slider-value {
868
+ font-size: 14px;
869
+ font-weight: 600;
870
+ min-width: 50px;
871
+ }
872
+
873
+ .control-buttons {
874
+ display: flex;
875
+ gap: 5px;
876
+ }
877
+
878
+ .mode-button {
879
+ flex: 1;
880
+ background-color: rgba(255, 255, 255, 0.05);
881
+ border: 1px solid rgba(255, 255, 255, 0.1);
882
+ border-radius: 4px;
883
+ padding: 6px 10px;
884
+ color: white;
885
+ font-size: 12px;
886
+ cursor: pointer;
887
+ transition: all 0.2s ease;
888
+ }
889
+
890
+ .mode-button:hover {
891
+ background-color: rgba(0, 224, 255, 0.1);
892
+ }
893
+
894
+ .mode-button.active {
895
+ background-color: rgba(0, 224, 255, 0.2);
896
+ border-color: #00E0FF;
897
+ color: #00E0FF;
898
+ }
899
+
900
+ /* Toggle Switch */
901
+ .toggle-switch {
902
+ position: relative;
903
+ display: inline-block;
904
+ width: 50px;
905
+ height: 24px;
906
+ }
907
+
908
+ .toggle-input {
909
+ opacity: 0;
910
+ width: 0;
911
+ height: 0;
912
+ }
913
+
914
+ .toggle-label {
915
+ position: absolute;
916
+ cursor: pointer;
917
+ top: 0;
918
+ left: 0;
919
+ right: 0;
920
+ bottom: 0;
921
+ background-color: rgba(255, 255, 255, 0.1);
922
+ transition: .4s;
923
+ border-radius: 24px;
924
+ }
925
+
926
+ .toggle-label:before {
927
+ position: absolute;
928
+ content: "";
929
+ height: 16px;
930
+ width: 16px;
931
+ left: 4px;
932
+ bottom: 4px;
933
+ background-color: white;
934
+ transition: .4s;
935
+ border-radius: 50%;
936
+ }
937
+
938
+ .toggle-input:checked + .toggle-label {
939
+ background-color: rgba(0, 224, 255, 0.5);
940
+ }
941
+
942
+ .toggle-input:checked + .toggle-label:before {
943
+ transform: translateX(26px);
944
+ background-color: #00E0FF;
945
+ }
946
+
947
+ /* Grid Tab */
948
+ .grid-tab {
949
+ display: flex;
950
+ flex-direction: column;
951
+ gap: 30px;
952
+ }
953
+
954
+ .grid-metrics {
955
+ display: grid;
956
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
957
+ gap: 20px;
958
+ }
959
+
960
+ .grid-status {
961
+ width: 100%;
962
+ }
963
+
964
+ .grid-status h3 {
965
+ margin-top: 0;
966
+ margin-bottom: 16px;
967
+ font-size: 18px;
968
+ font-weight: 600;
969
+ }
970
+
971
+ .grid-history {
972
+ background: rgba(255, 255, 255, 0.05);
973
+ border-radius: 16px;
974
+ padding: 20px;
975
+ border: 1px solid rgba(0, 224, 255, 0.1);
976
+ }
977
+
978
+ .grid-history h3 {
979
+ margin-top: 0;
980
+ margin-bottom: 16px;
981
+ font-size: 18px;
982
+ font-weight: 600;
983
+ }
984
+
985
+ .grid-controls {
986
+ background: rgba(255, 255, 255, 0.05);
987
+ border-radius: 16px;
988
+ padding: 20px;
989
+ border: 1px solid rgba(0, 224, 255, 0.1);
990
+ }
991
+
992
+ .grid-controls h3 {
993
+ margin-top: 0;
994
+ margin-bottom: 16px;
995
+ font-size: 18px;
996
+ font-weight: 600;
997
+ }
998
+
999
+ /* Demand Tab */
1000
+ .demand-tab {
1001
+ display: flex;
1002
+ flex-direction: column;
1003
+ gap: 30px;
1004
+ }
1005
+
1006
+ .demand-metrics {
1007
+ display: grid;
1008
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
1009
+ gap: 20px;
1010
+ }
1011
+
1012
+ .charger-status {
1013
+ width: 100%;
1014
+ }
1015
+
1016
+ .charger-status h3 {
1017
+ margin-top: 0;
1018
+ margin-bottom: 16px;
1019
+ font-size: 18px;
1020
+ font-weight: 600;
1021
+ }
1022
+
1023
+ .charger-types {
1024
+ background: rgba(255, 255, 255, 0.05);
1025
+ border-radius: 16px;
1026
+ padding: 20px;
1027
+ border: 1px solid rgba(0, 224, 255, 0.1);
1028
+ }
1029
+
1030
+ .charger-types h3 {
1031
+ margin-top: 0;
1032
+ margin-bottom: 16px;
1033
+ font-size: 18px;
1034
+ font-weight: 600;
1035
+ }
1036
+
1037
+ .charger-type-grid {
1038
+ display: grid;
1039
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
1040
+ gap: 20px;
1041
+ }
1042
+
1043
+ .charger-type-card {
1044
+ background: rgba(255, 255, 255, 0.05);
1045
+ border-radius: 12px;
1046
+ padding: 15px;
1047
+ border: 1px solid rgba(255, 255, 255, 0.1);
1048
+ }
1049
+
1050
+ .type-header {
1051
+ display: flex;
1052
+ justify-content: space-between;
1053
+ align-items: center;
1054
+ margin-bottom: 10px;
1055
+ }
1056
+
1057
+ .type-header h4 {
1058
+ margin: 0;
1059
+ font-size: 16px;
1060
+ font-weight: 600;
1061
+ }
1062
+
1063
+ .type-power {
1064
+ font-size: 14px;
1065
+ opacity: 0.7;
1066
+ }
1067
+
1068
+ .type-count {
1069
+ display: flex;
1070
+ flex-direction: column;
1071
+ align-items: center;
1072
+ margin-bottom: 15px;
1073
+ }
1074
+
1075
+ .count-value {
1076
+ font-size: 24px;
1077
+ font-weight: 600;
1078
+ color: #35F2DB;
1079
+ }
1080
+
1081
+ .count-label {
1082
+ font-size: 12px;
1083
+ opacity: 0.7;
1084
+ }
1085
+
1086
+ .type-usage, .type-power-share {
1087
+ margin-bottom: 10px;
1088
+ }
1089
+
1090
+ .usage-bar-container, .power-bar-container {
1091
+ height: 8px;
1092
+ background-color: rgba(255, 255, 255, 0.1);
1093
+ border-radius: 4px;
1094
+ overflow: hidden;
1095
+ margin-bottom: 5px;
1096
+ }
1097
+
1098
+ .usage-bar, .power-bar {
1099
+ height: 100%;
1100
+ border-radius: 4px;
1101
+ transition: width 0.5s ease;
1102
+ }
1103
+
1104
+ .usage-label, .power-label {
1105
+ font-size: 12px;
1106
+ opacity: 0.7;
1107
+ }
1108
+
1109
+ .demand-forecast {
1110
+ background: rgba(255, 255, 255, 0.05);
1111
+ border-radius: 16px;
1112
+ padding: 20px;
1113
+ border: 1px solid rgba(0, 224, 255, 0.1);
1114
+ }
1115
+
1116
+ .demand-forecast h3 {
1117
+ margin-top: 0;
1118
+ margin-bottom: 16px;
1119
+ font-size: 18px;
1120
+ font-weight: 600;
1121
+ }
1122
+
1123
+ /* Optimization Tab */
1124
+ .optimization-tab {
1125
+ display: flex;
1126
+ flex-direction: column;
1127
+ gap: 30px;
1128
+ }
1129
+
1130
+ .optimization-modes {
1131
+ background: rgba(255, 255, 255, 0.05);
1132
+ border-radius: 16px;
1133
+ padding: 20px;
1134
+ border: 1px solid rgba(0, 224, 255, 0.1);
1135
+ }
1136
+
1137
+ .optimization-modes h3 {
1138
+ margin-top: 0;
1139
+ margin-bottom: 16px;
1140
+ font-size: 18px;
1141
+ font-weight: 600;
1142
+ }
1143
+
1144
+ .mode-cards {
1145
+ display: grid;
1146
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
1147
+ gap: 20px;
1148
+ }
1149
+
1150
+ .mode-card {
1151
+ background: rgba(255, 255, 255, 0.05);
1152
+ border-radius: 12px;
1153
+ padding: 20px;
1154
+ border: 1px solid rgba(255, 255, 255, 0.1);
1155
+ cursor: pointer;
1156
+ transition: all 0.3s ease;
1157
+ }
1158
+
1159
+ .mode-card:hover {
1160
+ transform: translateY(-5px);
1161
+ background: rgba(255, 255, 255, 0.08);
1162
+ }
1163
+
1164
+ .mode-card.active {
1165
+ border-color: #00E0FF;
1166
+ background: rgba(0, 224, 255, 0.1);
1167
+ }
1168
+
1169
+ .mode-icon {
1170
+ font-size: 24px;
1171
+ margin-bottom: 10px;
1172
+ }
1173
+
1174
+ .mode-card h4 {
1175
+ margin: 0 0 10px 0;
1176
+ font-size: 16px;
1177
+ font-weight: 600;
1178
+ }
1179
+
1180
+ .mode-card p {
1181
+ font-size: 14px;
1182
+ opacity: 0.7;
1183
+ margin-bottom: 15px;
1184
+ }
1185
+
1186
+ .mode-benefits {
1187
+ padding-left: 20px;
1188
+ margin: 0;
1189
+ }
1190
+
1191
+ .mode-benefits li {
1192
+ font-size: 12px;
1193
+ margin-bottom: 5px;
1194
+ }
1195
+
1196
+ .optimization-results {
1197
+ background: rgba(255, 255, 255, 0.05);
1198
+ border-radius: 16px;
1199
+ padding: 20px;
1200
+ border: 1px solid rgba(0, 224, 255, 0.1);
1201
+ }
1202
+
1203
+ .optimization-results h3 {
1204
+ margin-top: 0;
1205
+ margin-bottom: 16px;
1206
+ font-size: 18px;
1207
+ font-weight: 600;
1208
+ }
1209
+
1210
+ .results-grid {
1211
+ display: grid;
1212
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
1213
+ gap: 20px;
1214
+ }
1215
+
1216
+ .result-card {
1217
+ background: rgba(255, 255, 255, 0.05);
1218
+ border-radius: 12px;
1219
+ padding: 15px;
1220
+ border: 1px solid rgba(255, 255, 255, 0.1);
1221
+ }
1222
+
1223
+ .result-card h4 {
1224
+ margin: 0 0 15px 0;
1225
+ font-size: 16px;
1226
+ font-weight: 600;
1227
+ }
1228
+
1229
+ .result-comparison {
1230
+ display: flex;
1231
+ flex-direction: column;
1232
+ gap: 10px;
1233
+ }
1234
+
1235
+ .comparison-item {
1236
+ display: flex;
1237
+ justify-content: space-between;
1238
+ align-items: center;
1239
+ }
1240
+
1241
+ .comparison-label {
1242
+ font-size: 14px;
1243
+ opacity: 0.7;
1244
+ }
1245
+
1246
+ .comparison-value {
1247
+ font-size: 14px;
1248
+ font-weight: 600;
1249
+ }
1250
+
1251
+ .comparison-value.optimized {
1252
+ color: #00E0FF;
1253
+ }
1254
+
1255
+ .comparison-value.savings {
1256
+ color: #35F2DB;
1257
+ }
1258
+
1259
+ .optimization-actions {
1260
+ display: flex;
1261
+ justify-content: center;
1262
+ gap: 15px;
1263
+ flex-wrap: wrap;
1264
+ }
1265
+
1266
+ .action-button {
1267
+ background-color: rgba(0, 224, 255, 0.1);
1268
+ border: 1px solid rgba(0, 224, 255, 0.3);
1269
+ border-radius: 8px;
1270
+ padding: 10px 20px;
1271
+ color: white;
1272
+ font-size: 14px;
1273
+ cursor: pointer;
1274
+ transition: all 0.2s ease;
1275
+ }
1276
+
1277
+ .action-button:hover {
1278
+ background-color: rgba(0, 224, 255, 0.2);
1279
+ transform: translateY(-2px);
1280
+ }
1281
+
1282
+ .action-button.apply {
1283
+ background-color: rgba(0, 224, 255, 0.2);
1284
+ border-color: #00E0FF;
1285
+ color: #00E0FF;
1286
+ }
1287
+
1288
+ /* Footer */
1289
+ .simulation-footer {
1290
+ display: flex;
1291
+ justify-content: space-between;
1292
+ align-items: center;
1293
+ padding: 20px;
1294
+ background-color: rgba(20, 20, 30, 0.8);
1295
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
1296
+ margin-top: 30px;
1297
+ }
1298
+
1299
+ .footer-info {
1300
+ display: flex;
1301
+ flex-direction: column;
1302
+ gap: 5px;
1303
+ }
1304
+
1305
+ .footer-info span {
1306
+ font-size: 12px;
1307
+ opacity: 0.7;
1308
+ }
1309
+
1310
+ .footer-actions {
1311
+ display: flex;
1312
+ gap: 10px;
1313
+ }
1314
+
1315
+ .footer-button {
1316
+ background-color: rgba(255, 255, 255, 0.05);
1317
+ border: 1px solid rgba(0, 224, 255, 0.2);
1318
+ border-radius: 6px;
1319
+ padding: 8px 12px;
1320
+ color: white;
1321
+ font-size: 12px;
1322
+ cursor: pointer;
1323
+ transition: all 0.2s ease;
1324
+ }
1325
+
1326
+ .footer-button:hover {
1327
+ background-color: rgba(0, 224, 255, 0.1);
1328
+ }
1329
+
1330
+ /* Responsive Adjustments */
1331
+ @media (max-width: 768px) {
1332
+ .simulation-header {
1333
+ flex-direction: column;
1334
+ align-items: flex-start;
1335
+ gap: 15px;
1336
+ }
1337
+
1338
+ .simulation-controls {
1339
+ width: 100%;
1340
+ justify-content: space-between;
1341
+ }
1342
+
1343
+ .time-display {
1344
+ width: 100%;
1345
+ }
1346
+
1347
+ .control-buttons, .speed-control {
1348
+ width: 100%;
1349
+ justify-content: space-between;
1350
+ }
1351
+
1352
+ .mode-cards, .results-grid {
1353
+ grid-template-columns: 1fr;
1354
+ }
1355
+
1356
+ .solar-metrics, .battery-metrics, .grid-metrics, .demand-metrics {
1357
+ grid-template-columns: 1fr;
1358
+ }
1359
+
1360
+ .weather-forecast {
1361
+ flex-wrap: wrap;
1362
+ }
1363
+
1364
+ .weather-item {
1365
+ min-width: 80px;
1366
+ }
1367
+
1368
+ .simulation-footer {
1369
+ flex-direction: column;
1370
+ gap: 15px;
1371
+ }
1372
+
1373
+ .footer-actions {
1374
+ width: 100%;
1375
+ justify-content: space-between;
1376
+ }
1377
+ }
EnergySimulation.jsx ADDED
@@ -0,0 +1,1050 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useState, useEffect } from 'react';
2
+ import './EnergySimulation.css';
3
+
4
+ // Mock data for demonstration purposes
5
+ const mockEnergyData = {
6
+ solarGeneration: {
7
+ current: 85,
8
+ capacity: 150,
9
+ dailyForecast: [
10
+ { hour: '06:00', value: 0 },
11
+ { hour: '07:00', value: 15 },
12
+ { hour: '08:00', value: 45 },
13
+ { hour: '09:00', value: 75 },
14
+ { hour: '10:00', value: 95 },
15
+ { hour: '11:00', value: 120 },
16
+ { hour: '12:00', value: 140 },
17
+ { hour: '13:00', value: 150 },
18
+ { hour: '14:00', value: 145 },
19
+ { hour: '15:00', value: 130 },
20
+ { hour: '16:00', value: 100 },
21
+ { hour: '17:00', value: 70 },
22
+ { hour: '18:00', value: 40 },
23
+ { hour: '19:00', value: 10 },
24
+ { hour: '20:00', value: 0 },
25
+ ]
26
+ },
27
+ batteryStorage: {
28
+ current: 72,
29
+ capacity: 500,
30
+ chargingRate: 45,
31
+ dischargingRate: 60,
32
+ history: [
33
+ { time: '00:00', level: 65 },
34
+ { time: '01:00', level: 68 },
35
+ { time: '02:00', level: 70 },
36
+ { time: '03:00', level: 72 },
37
+ { time: '04:00', level: 74 },
38
+ { time: '05:00', level: 76 },
39
+ { time: '06:00', level: 78 },
40
+ { time: '07:00', level: 80 },
41
+ { time: '08:00', level: 82 },
42
+ { time: '09:00', level: 80 },
43
+ { time: '10:00', level: 78 },
44
+ { time: '11:00', level: 75 },
45
+ { time: '12:00', level: 72 },
46
+ ]
47
+ },
48
+ gridConsumption: {
49
+ current: 120,
50
+ peak: 250,
51
+ average: 180,
52
+ history: [
53
+ { time: '00:00', value: 100 },
54
+ { time: '01:00', value: 90 },
55
+ { time: '02:00', value: 85 },
56
+ { time: '03:00', value: 80 },
57
+ { time: '04:00', value: 90 },
58
+ { time: '05:00', value: 110 },
59
+ { time: '06:00', value: 130 },
60
+ { time: '07:00', value: 150 },
61
+ { time: '08:00', value: 180 },
62
+ { time: '09:00', value: 210 },
63
+ { time: '10:00', value: 230 },
64
+ { time: '11:00', value: 250 },
65
+ { time: '12:00', value: 240 },
66
+ ]
67
+ },
68
+ chargingDemand: {
69
+ current: 210,
70
+ activeChargers: 6,
71
+ totalChargers: 12,
72
+ byType: [
73
+ { type: 'Level 2', count: 2, power: 20 },
74
+ { type: 'DC Fast', count: 3, power: 150 },
75
+ { type: 'Ultra Fast', count: 1, power: 350 }
76
+ ],
77
+ forecast: [
78
+ { time: '13:00', value: 220 },
79
+ { time: '14:00', value: 240 },
80
+ { time: '15:00', value: 260 },
81
+ { time: '16:00', value: 280 },
82
+ { time: '17:00', value: 300 },
83
+ { time: '18:00', value: 280 },
84
+ { time: '19:00', value: 250 },
85
+ { time: '20:00', value: 220 },
86
+ { time: '21:00', value: 180 },
87
+ { time: '22:00', value: 150 },
88
+ { time: '23:00', value: 120 },
89
+ ]
90
+ }
91
+ };
92
+
93
+ function EnergySimulation() {
94
+ const [activeTab, setActiveTab] = useState('overview');
95
+ const [loading, setLoading] = useState(true);
96
+ const [simulationSpeed, setSimulationSpeed] = useState(1);
97
+ const [simulationRunning, setSimulationRunning] = useState(false);
98
+ const [simulationTime, setSimulationTime] = useState('12:00');
99
+ const [energyData, setEnergyData] = useState(mockEnergyData);
100
+ const [optimizationMode, setOptimizationMode] = useState('balanced');
101
+
102
+ useEffect(() => {
103
+ // Simulate loading
104
+ const timer = setTimeout(() => {
105
+ setLoading(false);
106
+ }, 1500);
107
+
108
+ return () => clearTimeout(timer);
109
+ }, []);
110
+
111
+ useEffect(() => {
112
+ let interval;
113
+
114
+ if (simulationRunning) {
115
+ interval = setInterval(() => {
116
+ // Update simulation time
117
+ setSimulationTime(prevTime => {
118
+ const [hours, minutes] = prevTime.split(':').map(Number);
119
+ let newMinutes = minutes + 15;
120
+ let newHours = hours;
121
+
122
+ if (newMinutes >= 60) {
123
+ newMinutes = 0;
124
+ newHours = (newHours + 1) % 24;
125
+ }
126
+
127
+ return `${newHours.toString().padStart(2, '0')}:${newMinutes.toString().padStart(2, '0')}`;
128
+ });
129
+
130
+ // Update energy data based on simulation
131
+ setEnergyData(prevData => {
132
+ // This would be a more complex algorithm in a real implementation
133
+ // For demo purposes, we're just making small random adjustments
134
+
135
+ const solarVariation = Math.random() * 10 - 5;
136
+ const batteryVariation = Math.random() * 3 - 1;
137
+ const gridVariation = Math.random() * 15 - 7;
138
+ const demandVariation = Math.random() * 20 - 10;
139
+
140
+ return {
141
+ solarGeneration: {
142
+ ...prevData.solarGeneration,
143
+ current: Math.max(0, Math.min(prevData.solarGeneration.capacity, prevData.solarGeneration.current + solarVariation))
144
+ },
145
+ batteryStorage: {
146
+ ...prevData.batteryStorage,
147
+ current: Math.max(0, Math.min(100, prevData.batteryStorage.current + batteryVariation))
148
+ },
149
+ gridConsumption: {
150
+ ...prevData.gridConsumption,
151
+ current: Math.max(0, prevData.gridConsumption.current + gridVariation)
152
+ },
153
+ chargingDemand: {
154
+ ...prevData.chargingDemand,
155
+ current: Math.max(0, prevData.chargingDemand.current + demandVariation)
156
+ }
157
+ };
158
+ });
159
+ }, 1000 / simulationSpeed);
160
+ }
161
+
162
+ return () => clearInterval(interval);
163
+ }, [simulationRunning, simulationSpeed]);
164
+
165
+ const toggleSimulation = () => {
166
+ setSimulationRunning(!simulationRunning);
167
+ };
168
+
169
+ const resetSimulation = () => {
170
+ setSimulationRunning(false);
171
+ setSimulationTime('12:00');
172
+ setEnergyData(mockEnergyData);
173
+ };
174
+
175
+ const handleOptimizationChange = (mode) => {
176
+ setOptimizationMode(mode);
177
+
178
+ // In a real implementation, this would adjust the simulation parameters
179
+ // For demo purposes, we'll just show different messages
180
+ let message;
181
+ switch(mode) {
182
+ case 'cost':
183
+ message = "Optimizing for lowest operational cost";
184
+ break;
185
+ case 'renewable':
186
+ message = "Maximizing renewable energy usage";
187
+ break;
188
+ case 'demand':
189
+ message = "Prioritizing charging demand fulfillment";
190
+ break;
191
+ default:
192
+ message = "Balanced optimization mode";
193
+ }
194
+
195
+ // This would show a notification in a real implementation
196
+ console.log(message);
197
+ };
198
+
199
+ // Helper function to render a gauge chart
200
+ const renderGauge = (value, max, label, color) => {
201
+ const percentage = (value / max) * 100;
202
+ const angle = (percentage / 100) * 180;
203
+
204
+ return (
205
+ <div className="gauge-container">
206
+ <div className="gauge">
207
+ <div className="gauge-body">
208
+ <div
209
+ className="gauge-fill"
210
+ style={{
211
+ transform: `rotate(${angle}deg)`,
212
+ background: `linear-gradient(90deg, ${color}, ${color}CC)`
213
+ }}
214
+ ></div>
215
+ <div className="gauge-cover">
216
+ <div className="gauge-value">{value}</div>
217
+ <div className="gauge-label">{label}</div>
218
+ </div>
219
+ </div>
220
+ </div>
221
+ <div className="gauge-max">{max} {label}</div>
222
+ </div>
223
+ );
224
+ };
225
+
226
+ // Helper function to render a simple bar chart
227
+ const renderBarChart = (data, valueKey, labelKey, color) => {
228
+ const maxValue = Math.max(...data.map(item => item[valueKey]));
229
+
230
+ return (
231
+ <div className="bar-chart">
232
+ {data.map((item, index) => (
233
+ <div key={index} className="bar-container">
234
+ <div className="bar-label">{item[labelKey]}</div>
235
+ <div className="bar-wrapper">
236
+ <div
237
+ className="bar"
238
+ style={{
239
+ width: `${(item[valueKey] / maxValue) * 100}%`,
240
+ background: `linear-gradient(90deg, ${color}, ${color}CC)`
241
+ }}
242
+ ></div>
243
+ <span className="bar-value">{item[valueKey]}</span>
244
+ </div>
245
+ </div>
246
+ ))}
247
+ </div>
248
+ );
249
+ };
250
+
251
+ // Helper function to render the energy flow diagram
252
+ const renderEnergyFlow = () => {
253
+ const { solarGeneration, batteryStorage, gridConsumption, chargingDemand } = energyData;
254
+
255
+ // Calculate flow widths based on energy values
256
+ const solarWidth = Math.min(100, (solarGeneration.current / 200) * 100);
257
+ const gridWidth = Math.min(100, (gridConsumption.current / 300) * 100);
258
+ const batteryWidth = Math.min(100, (batteryStorage.chargingRate / 100) * 100);
259
+ const demandWidth = Math.min(100, (chargingDemand.current / 400) * 100);
260
+
261
+ return (
262
+ <div className="energy-flow-diagram">
263
+ <div className="energy-sources">
264
+ <div className="energy-source solar">
265
+ <div className="source-icon">☀️</div>
266
+ <div className="source-label">Solar Array</div>
267
+ <div className="source-value">{solarGeneration.current} kW</div>
268
+ </div>
269
+ <div className="energy-source grid">
270
+ <div className="source-icon">⚡</div>
271
+ <div className="source-label">Grid Power</div>
272
+ <div className="source-value">{gridConsumption.current} kW</div>
273
+ </div>
274
+ </div>
275
+
276
+ <div className="energy-flows">
277
+ <div className="flow solar-flow" style={{ width: `${solarWidth}%` }}></div>
278
+ <div className="flow grid-flow" style={{ width: `${gridWidth}%` }}></div>
279
+ </div>
280
+
281
+ <div className="energy-storage">
282
+ <div className="storage-icon">🔋</div>
283
+ <div className="storage-label">Battery Storage</div>
284
+ <div className="storage-value">{batteryStorage.current}%</div>
285
+ <div className="storage-capacity">{batteryStorage.capacity} kWh</div>
286
+ </div>
287
+
288
+ <div className="energy-flows">
289
+ <div className="flow battery-flow" style={{ width: `${batteryWidth}%` }}></div>
290
+ </div>
291
+
292
+ <div className="energy-demand">
293
+ <div className="demand-icon">🚗</div>
294
+ <div className="demand-label">Charging Demand</div>
295
+ <div className="demand-value">{chargingDemand.current} kW</div>
296
+ <div className="demand-details">{chargingDemand.activeChargers}/{chargingDemand.totalChargers} Chargers Active</div>
297
+ </div>
298
+ </div>
299
+ );
300
+ };
301
+
302
+ if (loading) {
303
+ return (
304
+ <div className="energy-simulation loading">
305
+ <div className="loading-logo">
306
+ <img src="/images/unity_fleet_logo.png" alt="Unity Fleet" />
307
+ <div className="loading-pulse"></div>
308
+ </div>
309
+ <p>Initializing Energy Simulation...</p>
310
+ </div>
311
+ );
312
+ }
313
+
314
+ return (
315
+ <div className="energy-simulation">
316
+ <header className="simulation-header">
317
+ <div className="simulation-title">
318
+ <h1>Energy Simulation</h1>
319
+ <span className="simulation-subtitle">The Link Charging Network</span>
320
+ </div>
321
+
322
+ <div className="simulation-controls">
323
+ <div className="time-display">
324
+ <span className="time-label">Simulation Time:</span>
325
+ <span className="time-value">{simulationTime}</span>
326
+ </div>
327
+
328
+ <div className="control-buttons">
329
+ <button
330
+ className={`control-button ${simulationRunning ? 'active' : ''}`}
331
+ onClick={toggleSimulation}
332
+ >
333
+ {simulationRunning ? 'Pause' : 'Start'} Simulation
334
+ </button>
335
+
336
+ <button
337
+ className="control-button"
338
+ onClick={resetSimulation}
339
+ >
340
+ Reset
341
+ </button>
342
+ </div>
343
+
344
+ <div className="speed-control">
345
+ <span className="speed-label">Speed:</span>
346
+ <div className="speed-buttons">
347
+ <button
348
+ className={`speed-button ${simulationSpeed === 0.5 ? 'active' : ''}`}
349
+ onClick={() => setSimulationSpeed(0.5)}
350
+ >
351
+ 0.5x
352
+ </button>
353
+ <button
354
+ className={`speed-button ${simulationSpeed === 1 ? 'active' : ''}`}
355
+ onClick={() => setSimulationSpeed(1)}
356
+ >
357
+ 1x
358
+ </button>
359
+ <button
360
+ className={`speed-button ${simulationSpeed === 2 ? 'active' : ''}`}
361
+ onClick={() => setSimulationSpeed(2)}
362
+ >
363
+ 2x
364
+ </button>
365
+ <button
366
+ className={`speed-button ${simulationSpeed === 5 ? 'active' : ''}`}
367
+ onClick={() => setSimulationSpeed(5)}
368
+ >
369
+ 5x
370
+ </button>
371
+ </div>
372
+ </div>
373
+ </div>
374
+ </header>
375
+
376
+ <div className="simulation-navigation">
377
+ <button
378
+ className={`nav-button ${activeTab === 'overview' ? 'active' : ''}`}
379
+ onClick={() => setActiveTab('overview')}
380
+ >
381
+ Overview
382
+ </button>
383
+ <button
384
+ className={`nav-button ${activeTab === 'solar' ? 'active' : ''}`}
385
+ onClick={() => setActiveTab('solar')}
386
+ >
387
+ Solar Generation
388
+ </button>
389
+ <button
390
+ className={`nav-button ${activeTab === 'battery' ? 'active' : ''}`}
391
+ onClick={() => setActiveTab('battery')}
392
+ >
393
+ Battery Storage
394
+ </button>
395
+ <button
396
+ className={`nav-button ${activeTab === 'grid' ? 'active' : ''}`}
397
+ onClick={() => setActiveTab('grid')}
398
+ >
399
+ Grid Integration
400
+ </button>
401
+ <button
402
+ className={`nav-button ${activeTab === 'demand' ? 'active' : ''}`}
403
+ onClick={() => setActiveTab('demand')}
404
+ >
405
+ Charging Demand
406
+ </button>
407
+ <button
408
+ className={`nav-button ${activeTab === 'optimization' ? 'active' : ''}`}
409
+ onClick={() => setActiveTab('optimization')}
410
+ >
411
+ Optimization
412
+ </button>
413
+ </div>
414
+
415
+ <main className="simulation-content">
416
+ {activeTab === 'overview' && (
417
+ <div className="overview-tab">
418
+ <div className="energy-summary">
419
+ <div className="summary-card">
420
+ <h3>Current Energy Balance</h3>
421
+ <div className="balance-metrics">
422
+ <div className="metric">
423
+ <span className="metric-label">Total Input:</span>
424
+ <span className="metric-value">{energyData.solarGeneration.current + energyData.gridConsumption.current} kW</span>
425
+ </div>
426
+ <div className="metric">
427
+ <span className="metric-label">Total Demand:</span>
428
+ <span className="metric-value">{energyData.chargingDemand.current} kW</span>
429
+ </div>
430
+ <div className="metric">
431
+ <span className="metric-label">Battery Change:</span>
432
+ <span className={`metric-value ${energyData.batteryStorage.chargingRate > energyData.batteryStorage.dischargingRate ? 'positive' : 'negative'}`}>
433
+ {energyData.batteryStorage.chargingRate > energyData.batteryStorage.dischargingRate ? '+' : '-'}
434
+ {Math.abs(energyData.batteryStorage.chargingRate - energyData.batteryStorage.dischargingRate)} kW
435
+ </span>
436
+ </div>
437
+ <div className="metric">
438
+ <span className="metric-label">Renewable Ratio:</span>
439
+ <span className="metric-value">
440
+ {Math.round((energyData.solarGeneration.current / (energyData.solarGeneration.current + energyData.gridConsumption.current)) * 100)}%
441
+ </span>
442
+ </div>
443
+ </div>
444
+ </div>
445
+ </div>
446
+
447
+ {renderEnergyFlow()}
448
+
449
+ <div className="optimization-summary">
450
+ <h3>Optimization Mode: {optimizationMode.charAt(0).toUpperCase() + optimizationMode.slice(1)}</h3>
451
+ <div className="optimization-metrics">
452
+ <div className="metric">
453
+ <span className="metric-label">Cost Efficiency:</span>
454
+ <div className="metric-bar-container">
455
+ <div
456
+ className="metric-bar"
457
+ style={{
458
+ width: `${optimizationMode === 'cost' ? 90 : optimizationMode === 'balanced' ? 70 : 50}%`,
459
+ background: 'linear-gradient(90deg, #00E0FF, #35F2DB)'
460
+ }}
461
+ ></div>
462
+ </div>
463
+ </div>
464
+ <div className="metric">
465
+ <span className="metric-label">Renewable Usage:</span>
466
+ <div className="metric-bar-container">
467
+ <div
468
+ className="metric-bar"
469
+ style={{
470
+ width: `${optimizationMode === 'renewable' ? 90 : optimizationMode === 'balanced' ? 70 : 50}%`,
471
+ background: 'linear-gradient(90deg, #00E0FF, #35F2DB)'
472
+ }}
473
+ ></div>
474
+ </div>
475
+ </div>
476
+ <div className="metric">
477
+ <span className="metric-label">Charging Capacity:</span>
478
+ <div className="metric-bar-container">
479
+ <div
480
+ className="metric-bar"
481
+ style={{
482
+ width: `${optimizationMode === 'demand' ? 90 : optimizationMode === 'balanced' ? 70 : 50}%`,
483
+ background: 'linear-gradient(90deg, #00E0FF, #35F2DB)'
484
+ }}
485
+ ></div>
486
+ </div>
487
+ </div>
488
+ </div>
489
+ </div>
490
+ </div>
491
+ )}
492
+
493
+ {activeTab === 'solar' && (
494
+ <div className="solar-tab">
495
+ <div className="solar-metrics">
496
+ <div className="metric-card">
497
+ {renderGauge(
498
+ energyData.solarGeneration.current,
499
+ energyData.solarGeneration.capacity,
500
+ 'kW',
501
+ '#FFD700'
502
+ )}
503
+ <h3>Current Solar Generation</h3>
504
+ </div>
505
+
506
+ <div className="metric-card">
507
+ <div className="daily-production">
508
+ <h3>Daily Production Forecast</h3>
509
+ {renderBarChart(
510
+ energyData.solarGeneration.dailyForecast,
511
+ 'value',
512
+ 'hour',
513
+ '#FFD700'
514
+ )}
515
+ </div>
516
+ </div>
517
+ </div>
518
+
519
+ <div className="solar-details">
520
+ <div className="detail-card">
521
+ <h3>Solar Array Details</h3>
522
+ <div className="detail-grid">
523
+ <div className="detail-item">
524
+ <span className="detail-label">Array Capacity:</span>
525
+ <span className="detail-value">{energyData.solarGeneration.capacity} kW</span>
526
+ </div>
527
+ <div className="detail-item">
528
+ <span className="detail-label">Panel Type:</span>
529
+ <span className="detail-value">Monocrystalline</span>
530
+ </div>
531
+ <div className="detail-item">
532
+ <span className="detail-label">Panel Count:</span>
533
+ <span className="detail-value">375</span>
534
+ </div>
535
+ <div className="detail-item">
536
+ <span className="detail-label">Array Area:</span>
537
+ <span className="detail-value">750 m²</span>
538
+ </div>
539
+ <div className="detail-item">
540
+ <span className="detail-label">Efficiency:</span>
541
+ <span className="detail-value">22.5%</span>
542
+ </div>
543
+ <div className="detail-item">
544
+ <span className="detail-label">Installation Date:</span>
545
+ <span className="detail-value">March 2025</span>
546
+ </div>
547
+ </div>
548
+ </div>
549
+
550
+ <div className="detail-card">
551
+ <h3>Weather Impact</h3>
552
+ <div className="weather-forecast">
553
+ <div className="weather-item">
554
+ <div className="weather-icon">☀️</div>
555
+ <div className="weather-day">Today</div>
556
+ <div className="weather-impact positive">100%</div>
557
+ </div>
558
+ <div className="weather-item">
559
+ <div className="weather-icon">🌤️</div>
560
+ <div className="weather-day">Tomorrow</div>
561
+ <div className="weather-impact neutral">85%</div>
562
+ </div>
563
+ <div className="weather-item">
564
+ <div className="weather-icon">☁️</div>
565
+ <div className="weather-day">Wednesday</div>
566
+ <div className="weather-impact negative">60%</div>
567
+ </div>
568
+ <div className="weather-item">
569
+ <div className="weather-icon">🌧️</div>
570
+ <div className="weather-day">Thursday</div>
571
+ <div className="weather-impact negative">40%</div>
572
+ </div>
573
+ <div className="weather-item">
574
+ <div className="weather-icon">🌤️</div>
575
+ <div className="weather-day">Friday</div>
576
+ <div className="weather-impact neutral">75%</div>
577
+ </div>
578
+ </div>
579
+ </div>
580
+ </div>
581
+ </div>
582
+ )}
583
+
584
+ {activeTab === 'battery' && (
585
+ <div className="battery-tab">
586
+ <div className="battery-metrics">
587
+ <div className="metric-card">
588
+ {renderGauge(
589
+ energyData.batteryStorage.current,
590
+ 100,
591
+ '%',
592
+ '#00E0FF'
593
+ )}
594
+ <h3>Current Battery Level</h3>
595
+ </div>
596
+
597
+ <div className="metric-card">
598
+ <div className="battery-status">
599
+ <h3>Battery Status</h3>
600
+ <div className="status-grid">
601
+ <div className="status-item">
602
+ <span className="status-label">Capacity:</span>
603
+ <span className="status-value">{energyData.batteryStorage.capacity} kWh</span>
604
+ </div>
605
+ <div className="status-item">
606
+ <span className="status-label">Charging Rate:</span>
607
+ <span className="status-value">{energyData.batteryStorage.chargingRate} kW</span>
608
+ </div>
609
+ <div className="status-item">
610
+ <span className="status-label">Discharging Rate:</span>
611
+ <span className="status-value">{energyData.batteryStorage.dischargingRate} kW</span>
612
+ </div>
613
+ <div className="status-item">
614
+ <span className="status-label">Net Flow:</span>
615
+ <span className={`status-value ${energyData.batteryStorage.chargingRate > energyData.batteryStorage.dischargingRate ? 'positive' : 'negative'}`}>
616
+ {energyData.batteryStorage.chargingRate > energyData.batteryStorage.dischargingRate ? '+' : '-'}
617
+ {Math.abs(energyData.batteryStorage.chargingRate - energyData.batteryStorage.dischargingRate)} kW
618
+ </span>
619
+ </div>
620
+ <div className="status-item">
621
+ <span className="status-label">Estimated Runtime:</span>
622
+ <span className="status-value">
623
+ {Math.round((energyData.batteryStorage.current / 100) * energyData.batteryStorage.capacity / energyData.batteryStorage.dischargingRate)} hours
624
+ </span>
625
+ </div>
626
+ <div className="status-item">
627
+ <span className="status-label">Health:</span>
628
+ <span className="status-value">98%</span>
629
+ </div>
630
+ </div>
631
+ </div>
632
+ </div>
633
+ </div>
634
+
635
+ <div className="battery-history">
636
+ <h3>Battery Level History</h3>
637
+ {renderBarChart(
638
+ energyData.batteryStorage.history,
639
+ 'level',
640
+ 'time',
641
+ '#00E0FF'
642
+ )}
643
+ </div>
644
+
645
+ <div className="battery-controls">
646
+ <h3>Battery Management Controls</h3>
647
+ <div className="control-grid">
648
+ <div className="control-item">
649
+ <span className="control-label">Charge Limit:</span>
650
+ <div className="control-slider-container">
651
+ <input type="range" min="50" max="100" defaultValue="90" className="control-slider" />
652
+ <span className="slider-value">90%</span>
653
+ </div>
654
+ </div>
655
+ <div className="control-item">
656
+ <span className="control-label">Discharge Limit:</span>
657
+ <div className="control-slider-container">
658
+ <input type="range" min="10" max="50" defaultValue="20" className="control-slider" />
659
+ <span className="slider-value">20%</span>
660
+ </div>
661
+ </div>
662
+ <div className="control-item">
663
+ <span className="control-label">Priority Mode:</span>
664
+ <div className="control-buttons">
665
+ <button className="mode-button active">Auto</button>
666
+ <button className="mode-button">Charge</button>
667
+ <button className="mode-button">Discharge</button>
668
+ <button className="mode-button">Hold</button>
669
+ </div>
670
+ </div>
671
+ </div>
672
+ </div>
673
+ </div>
674
+ )}
675
+
676
+ {activeTab === 'grid' && (
677
+ <div className="grid-tab">
678
+ <div className="grid-metrics">
679
+ <div className="metric-card">
680
+ {renderGauge(
681
+ energyData.gridConsumption.current,
682
+ energyData.gridConsumption.peak,
683
+ 'kW',
684
+ '#FF5555'
685
+ )}
686
+ <h3>Current Grid Consumption</h3>
687
+ </div>
688
+
689
+ <div className="metric-card">
690
+ <div className="grid-status">
691
+ <h3>Grid Connection Status</h3>
692
+ <div className="status-grid">
693
+ <div className="status-item">
694
+ <span className="status-label">Connection:</span>
695
+ <span className="status-value status-active">Active</span>
696
+ </div>
697
+ <div className="status-item">
698
+ <span className="status-label">Peak Capacity:</span>
699
+ <span className="status-value">{energyData.gridConsumption.peak} kW</span>
700
+ </div>
701
+ <div className="status-item">
702
+ <span className="status-label">Average Load:</span>
703
+ <span className="status-value">{energyData.gridConsumption.average} kW</span>
704
+ </div>
705
+ <div className="status-item">
706
+ <span className="status-label">Current Rate:</span>
707
+ <span className="status-value">$0.12/kWh</span>
708
+ </div>
709
+ <div className="status-item">
710
+ <span className="status-label">Peak Hours:</span>
711
+ <span className="status-value">2:00 PM - 7:00 PM</span>
712
+ </div>
713
+ <div className="status-item">
714
+ <span className="status-label">Grid Stability:</span>
715
+ <span className="status-value status-stable">Stable</span>
716
+ </div>
717
+ </div>
718
+ </div>
719
+ </div>
720
+ </div>
721
+
722
+ <div className="grid-history">
723
+ <h3>Grid Consumption History</h3>
724
+ {renderBarChart(
725
+ energyData.gridConsumption.history,
726
+ 'value',
727
+ 'time',
728
+ '#FF5555'
729
+ )}
730
+ </div>
731
+
732
+ <div className="grid-controls">
733
+ <h3>Grid Integration Controls</h3>
734
+ <div className="control-grid">
735
+ <div className="control-item">
736
+ <span className="control-label">Peak Shaving:</span>
737
+ <div className="toggle-switch">
738
+ <input type="checkbox" id="peak-shaving" className="toggle-input" defaultChecked />
739
+ <label htmlFor="peak-shaving" className="toggle-label"></label>
740
+ </div>
741
+ </div>
742
+ <div className="control-item">
743
+ <span className="control-label">Load Balancing:</span>
744
+ <div className="toggle-switch">
745
+ <input type="checkbox" id="load-balancing" className="toggle-input" defaultChecked />
746
+ <label htmlFor="load-balancing" className="toggle-label"></label>
747
+ </div>
748
+ </div>
749
+ <div className="control-item">
750
+ <span className="control-label">Grid Export:</span>
751
+ <div className="toggle-switch">
752
+ <input type="checkbox" id="grid-export" className="toggle-input" />
753
+ <label htmlFor="grid-export" className="toggle-label"></label>
754
+ </div>
755
+ </div>
756
+ <div className="control-item">
757
+ <span className="control-label">Max Grid Draw:</span>
758
+ <div className="control-slider-container">
759
+ <input type="range" min="100" max="300" defaultValue="250" className="control-slider" />
760
+ <span className="slider-value">250 kW</span>
761
+ </div>
762
+ </div>
763
+ </div>
764
+ </div>
765
+ </div>
766
+ )}
767
+
768
+ {activeTab === 'demand' && (
769
+ <div className="demand-tab">
770
+ <div className="demand-metrics">
771
+ <div className="metric-card">
772
+ {renderGauge(
773
+ energyData.chargingDemand.current,
774
+ energyData.chargingDemand.byType.reduce((sum, item) => sum + item.count * item.power, 0),
775
+ 'kW',
776
+ '#35F2DB'
777
+ )}
778
+ <h3>Current Charging Demand</h3>
779
+ </div>
780
+
781
+ <div className="metric-card">
782
+ <div className="charger-status">
783
+ <h3>Charger Status</h3>
784
+ <div className="status-grid">
785
+ <div className="status-item">
786
+ <span className="status-label">Active Chargers:</span>
787
+ <span className="status-value">{energyData.chargingDemand.activeChargers}/{energyData.chargingDemand.totalChargers}</span>
788
+ </div>
789
+ <div className="status-item">
790
+ <span className="status-label">Utilization:</span>
791
+ <span className="status-value">{Math.round((energyData.chargingDemand.activeChargers / energyData.chargingDemand.totalChargers) * 100)}%</span>
792
+ </div>
793
+ <div className="status-item">
794
+ <span className="status-label">Average Session:</span>
795
+ <span className="status-value">42 minutes</span>
796
+ </div>
797
+ <div className="status-item">
798
+ <span className="status-label">Queue Length:</span>
799
+ <span className="status-value">3 vehicles</span>
800
+ </div>
801
+ <div className="status-item">
802
+ <span className="status-label">Wait Time:</span>
803
+ <span className="status-value">15 minutes</span>
804
+ </div>
805
+ </div>
806
+ </div>
807
+ </div>
808
+ </div>
809
+
810
+ <div className="charger-types">
811
+ <h3>Charger Types and Usage</h3>
812
+ <div className="charger-type-grid">
813
+ {energyData.chargingDemand.byType.map((type, index) => (
814
+ <div key={index} className="charger-type-card">
815
+ <div className="type-header">
816
+ <h4>{type.type}</h4>
817
+ <span className="type-power">{type.power} kW</span>
818
+ </div>
819
+ <div className="type-count">
820
+ <span className="count-value">{type.count}</span>
821
+ <span className="count-label">Chargers</span>
822
+ </div>
823
+ <div className="type-usage">
824
+ <div className="usage-bar-container">
825
+ <div
826
+ className="usage-bar"
827
+ style={{
828
+ width: `${(type.count / energyData.chargingDemand.totalChargers) * 100}%`,
829
+ background: `linear-gradient(90deg, #35F2DB, #35F2DBCC)`
830
+ }}
831
+ ></div>
832
+ </div>
833
+ <span className="usage-label">
834
+ {Math.round((type.count / energyData.chargingDemand.totalChargers) * 100)}% of Total
835
+ </span>
836
+ </div>
837
+ <div className="type-power-share">
838
+ <div className="power-bar-container">
839
+ <div
840
+ className="power-bar"
841
+ style={{
842
+ width: `${(type.count * type.power / energyData.chargingDemand.byType.reduce((sum, item) => sum + item.count * item.power, 0)) * 100}%`,
843
+ background: `linear-gradient(90deg, #00E0FF, #00E0FFCC)`
844
+ }}
845
+ ></div>
846
+ </div>
847
+ <span className="power-label">
848
+ {Math.round((type.count * type.power / energyData.chargingDemand.byType.reduce((sum, item) => sum + item.count * item.power, 0)) * 100)}% of Power
849
+ </span>
850
+ </div>
851
+ </div>
852
+ ))}
853
+ </div>
854
+ </div>
855
+
856
+ <div className="demand-forecast">
857
+ <h3>Demand Forecast</h3>
858
+ {renderBarChart(
859
+ energyData.chargingDemand.forecast,
860
+ 'value',
861
+ 'time',
862
+ '#35F2DB'
863
+ )}
864
+ </div>
865
+ </div>
866
+ )}
867
+
868
+ {activeTab === 'optimization' && (
869
+ <div className="optimization-tab">
870
+ <div className="optimization-modes">
871
+ <h3>Optimization Mode Selection</h3>
872
+ <div className="mode-cards">
873
+ <div
874
+ className={`mode-card ${optimizationMode === 'balanced' ? 'active' : ''}`}
875
+ onClick={() => handleOptimizationChange('balanced')}
876
+ >
877
+ <div className="mode-icon">⚖️</div>
878
+ <h4>Balanced</h4>
879
+ <p>Optimize for balanced performance across all metrics</p>
880
+ <ul className="mode-benefits">
881
+ <li>Moderate cost efficiency</li>
882
+ <li>Good renewable utilization</li>
883
+ <li>Reliable charging availability</li>
884
+ </ul>
885
+ </div>
886
+
887
+ <div
888
+ className={`mode-card ${optimizationMode === 'cost' ? 'active' : ''}`}
889
+ onClick={() => handleOptimizationChange('cost')}
890
+ >
891
+ <div className="mode-icon">💰</div>
892
+ <h4>Cost Optimization</h4>
893
+ <p>Minimize operational costs and maximize revenue</p>
894
+ <ul className="mode-benefits">
895
+ <li>Reduced grid consumption during peak hours</li>
896
+ <li>Strategic battery usage</li>
897
+ <li>Dynamic pricing implementation</li>
898
+ </ul>
899
+ </div>
900
+
901
+ <div
902
+ className={`mode-card ${optimizationMode === 'renewable' ? 'active' : ''}`}
903
+ onClick={() => handleOptimizationChange('renewable')}
904
+ >
905
+ <div className="mode-icon">🌱</div>
906
+ <h4>Renewable Maximization</h4>
907
+ <p>Prioritize usage of renewable energy sources</p>
908
+ <ul className="mode-benefits">
909
+ <li>Highest solar utilization</li>
910
+ <li>Reduced carbon footprint</li>
911
+ <li>Battery storage optimization</li>
912
+ </ul>
913
+ </div>
914
+
915
+ <div
916
+ className={`mode-card ${optimizationMode === 'demand' ? 'active' : ''}`}
917
+ onClick={() => handleOptimizationChange('demand')}
918
+ >
919
+ <div className="mode-icon">⚡</div>
920
+ <h4>Demand Response</h4>
921
+ <p>Focus on meeting charging demand and reducing wait times</p>
922
+ <ul className="mode-benefits">
923
+ <li>Maximum charger availability</li>
924
+ <li>Reduced wait times</li>
925
+ <li>Optimized charging speeds</li>
926
+ </ul>
927
+ </div>
928
+ </div>
929
+ </div>
930
+
931
+ <div className="optimization-results">
932
+ <h3>Projected Optimization Results</h3>
933
+ <div className="results-grid">
934
+ <div className="result-card">
935
+ <h4>Daily Operational Cost</h4>
936
+ <div className="result-comparison">
937
+ <div className="comparison-item">
938
+ <span className="comparison-label">Current:</span>
939
+ <span className="comparison-value">$480</span>
940
+ </div>
941
+ <div className="comparison-item">
942
+ <span className="comparison-label">Optimized:</span>
943
+ <span className="comparison-value optimized">
944
+ ${optimizationMode === 'cost' ? 380 : optimizationMode === 'balanced' ? 420 : optimizationMode === 'renewable' ? 450 : 460}
945
+ </span>
946
+ </div>
947
+ <div className="comparison-item">
948
+ <span className="comparison-label">Savings:</span>
949
+ <span className="comparison-value savings">
950
+ ${optimizationMode === 'cost' ? 100 : optimizationMode === 'balanced' ? 60 : optimizationMode === 'renewable' ? 30 : 20}
951
+ ({optimizationMode === 'cost' ? 21 : optimizationMode === 'balanced' ? 13 : optimizationMode === 'renewable' ? 6 : 4}%)
952
+ </span>
953
+ </div>
954
+ </div>
955
+ </div>
956
+
957
+ <div className="result-card">
958
+ <h4>Renewable Energy Usage</h4>
959
+ <div className="result-comparison">
960
+ <div className="comparison-item">
961
+ <span className="comparison-label">Current:</span>
962
+ <span className="comparison-value">42%</span>
963
+ </div>
964
+ <div className="comparison-item">
965
+ <span className="comparison-label">Optimized:</span>
966
+ <span className="comparison-value optimized">
967
+ {optimizationMode === 'renewable' ? 68 : optimizationMode === 'balanced' ? 55 : optimizationMode === 'cost' ? 48 : 45}%
968
+ </span>
969
+ </div>
970
+ <div className="comparison-item">
971
+ <span className="comparison-label">Improvement:</span>
972
+ <span className="comparison-value savings">
973
+ +{optimizationMode === 'renewable' ? 26 : optimizationMode === 'balanced' ? 13 : optimizationMode === 'cost' ? 6 : 3}%
974
+ </span>
975
+ </div>
976
+ </div>
977
+ </div>
978
+
979
+ <div className="result-card">
980
+ <h4>Average Wait Time</h4>
981
+ <div className="result-comparison">
982
+ <div className="comparison-item">
983
+ <span className="comparison-label">Current:</span>
984
+ <span className="comparison-value">15 min</span>
985
+ </div>
986
+ <div className="comparison-item">
987
+ <span className="comparison-label">Optimized:</span>
988
+ <span className="comparison-value optimized">
989
+ {optimizationMode === 'demand' ? 5 : optimizationMode === 'balanced' ? 8 : optimizationMode === 'cost' ? 12 : 10} min
990
+ </span>
991
+ </div>
992
+ <div className="comparison-item">
993
+ <span className="comparison-label">Reduction:</span>
994
+ <span className="comparison-value savings">
995
+ -{optimizationMode === 'demand' ? 10 : optimizationMode === 'balanced' ? 7 : optimizationMode === 'cost' ? 3 : 5} min
996
+ ({optimizationMode === 'demand' ? 67 : optimizationMode === 'balanced' ? 47 : optimizationMode === 'cost' ? 20 : 33}%)
997
+ </span>
998
+ </div>
999
+ </div>
1000
+ </div>
1001
+
1002
+ <div className="result-card">
1003
+ <h4>Carbon Footprint</h4>
1004
+ <div className="result-comparison">
1005
+ <div className="comparison-item">
1006
+ <span className="comparison-label">Current:</span>
1007
+ <span className="comparison-value">320 kg CO₂/day</span>
1008
+ </div>
1009
+ <div className="comparison-item">
1010
+ <span className="comparison-label">Optimized:</span>
1011
+ <span className="comparison-value optimized">
1012
+ {optimizationMode === 'renewable' ? 180 : optimizationMode === 'balanced' ? 240 : optimizationMode === 'cost' ? 280 : 300} kg CO₂/day
1013
+ </span>
1014
+ </div>
1015
+ <div className="comparison-item">
1016
+ <span className="comparison-label">Reduction:</span>
1017
+ <span className="comparison-value savings">
1018
+ -{optimizationMode === 'renewable' ? 140 : optimizationMode === 'balanced' ? 80 : optimizationMode === 'cost' ? 40 : 20} kg
1019
+ ({optimizationMode === 'renewable' ? 44 : optimizationMode === 'balanced' ? 25 : optimizationMode === 'cost' ? 13 : 6}%)
1020
+ </span>
1021
+ </div>
1022
+ </div>
1023
+ </div>
1024
+ </div>
1025
+ </div>
1026
+
1027
+ <div className="optimization-actions">
1028
+ <button className="action-button apply">Apply Optimization Settings</button>
1029
+ <button className="action-button schedule">Schedule Optimization</button>
1030
+ <button className="action-button report">Generate Efficiency Report</button>
1031
+ </div>
1032
+ </div>
1033
+ )}
1034
+ </main>
1035
+
1036
+ <footer className="simulation-footer">
1037
+ <div className="footer-info">
1038
+ <span>Unity Fleet Energy Simulation</span>
1039
+ <span>Powered by Atlas Intelligence</span>
1040
+ </div>
1041
+ <div className="footer-actions">
1042
+ <button className="footer-button">Export Data</button>
1043
+ <button className="footer-button">Save Scenario</button>
1044
+ </div>
1045
+ </footer>
1046
+ </div>
1047
+ );
1048
+ }
1049
+
1050
+ export default EnergySimulation;
MobileApp.css ADDED
@@ -0,0 +1,921 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Mobile App Styles */
2
+ .mobile-app {
3
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
4
+ max-width: 480px;
5
+ height: 100vh;
6
+ margin: 0 auto;
7
+ background-color: #0B0B0F;
8
+ color: #ffffff;
9
+ overflow-x: hidden;
10
+ position: relative;
11
+ }
12
+
13
+ /* Loading Screen */
14
+ .mobile-app.loading {
15
+ display: flex;
16
+ flex-direction: column;
17
+ justify-content: center;
18
+ align-items: center;
19
+ height: 100vh;
20
+ }
21
+
22
+ .loading-logo {
23
+ width: 120px;
24
+ height: 120px;
25
+ margin-bottom: 20px;
26
+ position: relative;
27
+ }
28
+
29
+ .loading-logo img {
30
+ width: 100%;
31
+ height: 100%;
32
+ object-fit: contain;
33
+ }
34
+
35
+ .loading-pulse {
36
+ position: absolute;
37
+ top: 0;
38
+ left: 0;
39
+ right: 0;
40
+ bottom: 0;
41
+ border-radius: 50%;
42
+ border: 2px solid #00E0FF;
43
+ animation: pulse 1.5s infinite ease-in-out;
44
+ }
45
+
46
+ @keyframes pulse {
47
+ 0% {
48
+ transform: scale(0.95);
49
+ opacity: 1;
50
+ }
51
+ 70% {
52
+ transform: scale(1.2);
53
+ opacity: 0;
54
+ }
55
+ 100% {
56
+ transform: scale(0.95);
57
+ opacity: 0;
58
+ }
59
+ }
60
+
61
+ /* Header */
62
+ .app-header {
63
+ display: flex;
64
+ justify-content: space-between;
65
+ align-items: center;
66
+ padding: 16px;
67
+ background-color: rgba(20, 20, 30, 0.8);
68
+ backdrop-filter: blur(10px);
69
+ position: sticky;
70
+ top: 0;
71
+ z-index: 100;
72
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
73
+ }
74
+
75
+ .app-header h1 {
76
+ margin: 0;
77
+ font-size: 24px;
78
+ font-weight: 700;
79
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
80
+ -webkit-background-clip: text;
81
+ background-clip: text;
82
+ -webkit-text-fill-color: transparent;
83
+ letter-spacing: 1px;
84
+ }
85
+
86
+ .user-profile {
87
+ width: 36px;
88
+ height: 36px;
89
+ border-radius: 50%;
90
+ overflow: hidden;
91
+ border: 2px solid #00E0FF;
92
+ }
93
+
94
+ .user-profile img {
95
+ width: 100%;
96
+ height: 100%;
97
+ object-fit: cover;
98
+ }
99
+
100
+ /* Main Content */
101
+ .app-content {
102
+ padding: 16px;
103
+ overflow-y: auto;
104
+ height: calc(100vh - 130px);
105
+ }
106
+
107
+ /* Home Screen */
108
+ .welcome-card {
109
+ background: linear-gradient(135deg, rgba(0, 224, 255, 0.1), rgba(53, 242, 219, 0.05));
110
+ border-radius: 16px;
111
+ padding: 20px;
112
+ margin-bottom: 24px;
113
+ border: 1px solid rgba(0, 224, 255, 0.2);
114
+ backdrop-filter: blur(10px);
115
+ }
116
+
117
+ .welcome-card h2 {
118
+ margin: 0 0 4px 0;
119
+ font-size: 20px;
120
+ font-weight: 600;
121
+ }
122
+
123
+ .welcome-card p {
124
+ margin: 0 0 16px 0;
125
+ opacity: 0.8;
126
+ font-size: 14px;
127
+ }
128
+
129
+ .credit-display {
130
+ display: flex;
131
+ flex-direction: column;
132
+ align-items: flex-start;
133
+ }
134
+
135
+ .credit-amount {
136
+ font-size: 32px;
137
+ font-weight: 700;
138
+ color: #00E0FF;
139
+ }
140
+
141
+ .credit-label {
142
+ font-size: 14px;
143
+ opacity: 0.7;
144
+ }
145
+
146
+ .quick-actions {
147
+ display: grid;
148
+ grid-template-columns: repeat(4, 1fr);
149
+ gap: 12px;
150
+ margin-bottom: 24px;
151
+ }
152
+
153
+ .action-button {
154
+ display: flex;
155
+ flex-direction: column;
156
+ align-items: center;
157
+ justify-content: center;
158
+ background-color: rgba(255, 255, 255, 0.05);
159
+ border: 1px solid rgba(0, 224, 255, 0.2);
160
+ border-radius: 12px;
161
+ padding: 12px 8px;
162
+ transition: all 0.2s ease;
163
+ }
164
+
165
+ .action-button:hover {
166
+ background-color: rgba(0, 224, 255, 0.1);
167
+ transform: translateY(-2px);
168
+ }
169
+
170
+ .action-button .icon {
171
+ font-size: 24px;
172
+ margin-bottom: 8px;
173
+ }
174
+
175
+ .action-button span {
176
+ font-size: 12px;
177
+ }
178
+
179
+ .upcoming-reservations, .nearby-hubs {
180
+ margin-bottom: 24px;
181
+ }
182
+
183
+ .upcoming-reservations h3, .nearby-hubs h3 {
184
+ font-size: 18px;
185
+ margin-bottom: 12px;
186
+ font-weight: 600;
187
+ }
188
+
189
+ .reservation-card {
190
+ display: flex;
191
+ align-items: center;
192
+ background-color: rgba(255, 255, 255, 0.05);
193
+ border-radius: 12px;
194
+ padding: 16px;
195
+ margin-bottom: 12px;
196
+ }
197
+
198
+ .reservation-vehicle {
199
+ font-weight: 600;
200
+ margin-right: 12px;
201
+ min-width: 100px;
202
+ }
203
+
204
+ .reservation-details {
205
+ flex: 1;
206
+ font-size: 14px;
207
+ opacity: 0.8;
208
+ }
209
+
210
+ .reservation-action {
211
+ background-color: rgba(0, 224, 255, 0.2);
212
+ border: none;
213
+ border-radius: 8px;
214
+ color: #00E0FF;
215
+ padding: 8px 12px;
216
+ font-size: 12px;
217
+ cursor: pointer;
218
+ transition: all 0.2s ease;
219
+ }
220
+
221
+ .reservation-action:hover {
222
+ background-color: rgba(0, 224, 255, 0.3);
223
+ }
224
+
225
+ .no-reservations {
226
+ text-align: center;
227
+ opacity: 0.6;
228
+ padding: 20px;
229
+ }
230
+
231
+ .hub-list {
232
+ display: flex;
233
+ flex-direction: column;
234
+ gap: 12px;
235
+ }
236
+
237
+ .hub-card {
238
+ display: flex;
239
+ justify-content: space-between;
240
+ align-items: center;
241
+ background-color: rgba(255, 255, 255, 0.05);
242
+ border-radius: 12px;
243
+ padding: 16px;
244
+ }
245
+
246
+ .hub-info h4 {
247
+ margin: 0 0 4px 0;
248
+ font-size: 16px;
249
+ }
250
+
251
+ .hub-info p {
252
+ margin: 0 0 8px 0;
253
+ font-size: 14px;
254
+ opacity: 0.7;
255
+ }
256
+
257
+ .availability {
258
+ font-size: 14px;
259
+ }
260
+
261
+ .available {
262
+ color: #35F2DB;
263
+ }
264
+
265
+ .unavailable {
266
+ color: #ff5555;
267
+ }
268
+
269
+ .hub-action {
270
+ background-color: rgba(0, 224, 255, 0.2);
271
+ border: none;
272
+ border-radius: 8px;
273
+ color: #00E0FF;
274
+ padding: 8px 12px;
275
+ font-size: 12px;
276
+ cursor: pointer;
277
+ transition: all 0.2s ease;
278
+ }
279
+
280
+ .hub-action:hover {
281
+ background-color: rgba(0, 224, 255, 0.3);
282
+ }
283
+
284
+ /* Vehicles Screen */
285
+ .vehicles-screen h2 {
286
+ margin-top: 0;
287
+ margin-bottom: 16px;
288
+ font-size: 24px;
289
+ }
290
+
291
+ .vehicle-filters {
292
+ display: flex;
293
+ gap: 8px;
294
+ margin-bottom: 20px;
295
+ overflow-x: auto;
296
+ padding-bottom: 8px;
297
+ }
298
+
299
+ .filter-button {
300
+ background-color: rgba(255, 255, 255, 0.05);
301
+ border: 1px solid rgba(255, 255, 255, 0.1);
302
+ border-radius: 20px;
303
+ color: white;
304
+ padding: 8px 16px;
305
+ font-size: 14px;
306
+ white-space: nowrap;
307
+ transition: all 0.2s ease;
308
+ }
309
+
310
+ .filter-button.active {
311
+ background-color: rgba(0, 224, 255, 0.2);
312
+ border-color: #00E0FF;
313
+ color: #00E0FF;
314
+ }
315
+
316
+ .vehicle-list {
317
+ display: grid;
318
+ grid-template-columns: 1fr;
319
+ gap: 16px;
320
+ }
321
+
322
+ .vehicle-card {
323
+ background-color: rgba(255, 255, 255, 0.05);
324
+ border-radius: 16px;
325
+ overflow: hidden;
326
+ transition: transform 0.3s ease;
327
+ }
328
+
329
+ .vehicle-card:hover {
330
+ transform: translateY(-4px);
331
+ }
332
+
333
+ .vehicle-card.unavailable {
334
+ opacity: 0.7;
335
+ }
336
+
337
+ .vehicle-image {
338
+ height: 160px;
339
+ position: relative;
340
+ overflow: hidden;
341
+ }
342
+
343
+ .vehicle-image img {
344
+ width: 100%;
345
+ height: 100%;
346
+ object-fit: cover;
347
+ }
348
+
349
+ .unavailable-overlay {
350
+ position: absolute;
351
+ top: 0;
352
+ left: 0;
353
+ right: 0;
354
+ bottom: 0;
355
+ background-color: rgba(0, 0, 0, 0.7);
356
+ display: flex;
357
+ justify-content: center;
358
+ align-items: center;
359
+ color: white;
360
+ font-weight: 600;
361
+ }
362
+
363
+ .vehicle-info {
364
+ padding: 16px;
365
+ }
366
+
367
+ .vehicle-info h3 {
368
+ margin: 0 0 4px 0;
369
+ font-size: 18px;
370
+ }
371
+
372
+ .vehicle-type, .vehicle-range {
373
+ margin: 0;
374
+ font-size: 14px;
375
+ opacity: 0.8;
376
+ }
377
+
378
+ .vehicle-reserve {
379
+ width: 100%;
380
+ padding: 12px;
381
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
382
+ border: none;
383
+ color: #0B0B0F;
384
+ font-weight: 600;
385
+ font-size: 16px;
386
+ cursor: pointer;
387
+ transition: all 0.2s ease;
388
+ }
389
+
390
+ .vehicle-reserve:hover:not(:disabled) {
391
+ background: linear-gradient(90deg, #35F2DB, #00E0FF);
392
+ }
393
+
394
+ .vehicle-reserve:disabled {
395
+ background: #333;
396
+ color: #777;
397
+ cursor: not-allowed;
398
+ }
399
+
400
+ /* Subscriptions Screen */
401
+ .subscriptions-screen h2 {
402
+ margin-top: 0;
403
+ margin-bottom: 8px;
404
+ font-size: 24px;
405
+ }
406
+
407
+ .current-plan {
408
+ margin-bottom: 24px;
409
+ font-size: 16px;
410
+ opacity: 0.8;
411
+ }
412
+
413
+ .subscription-list {
414
+ display: grid;
415
+ grid-template-columns: 1fr;
416
+ gap: 20px;
417
+ }
418
+
419
+ .subscription-card {
420
+ background-color: rgba(255, 255, 255, 0.05);
421
+ border-radius: 16px;
422
+ padding: 20px;
423
+ border: 1px solid rgba(255, 255, 255, 0.1);
424
+ transition: all 0.3s ease;
425
+ }
426
+
427
+ .subscription-card:hover {
428
+ transform: translateY(-4px);
429
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
430
+ }
431
+
432
+ .subscription-card.current {
433
+ border: 1px solid #00E0FF;
434
+ background: linear-gradient(135deg, rgba(0, 224, 255, 0.1), rgba(53, 242, 219, 0.05));
435
+ }
436
+
437
+ .subscription-header {
438
+ display: flex;
439
+ justify-content: space-between;
440
+ align-items: center;
441
+ margin-bottom: 12px;
442
+ }
443
+
444
+ .subscription-header h3 {
445
+ margin: 0;
446
+ font-size: 20px;
447
+ }
448
+
449
+ .subscription-price {
450
+ font-size: 24px;
451
+ font-weight: 700;
452
+ color: #00E0FF;
453
+ }
454
+
455
+ .subscription-price span {
456
+ font-size: 14px;
457
+ opacity: 0.7;
458
+ font-weight: 400;
459
+ }
460
+
461
+ .subscription-desc {
462
+ margin-bottom: 16px;
463
+ font-size: 14px;
464
+ opacity: 0.8;
465
+ }
466
+
467
+ .subscription-features {
468
+ padding-left: 20px;
469
+ margin-bottom: 20px;
470
+ }
471
+
472
+ .subscription-features li {
473
+ margin-bottom: 8px;
474
+ font-size: 14px;
475
+ }
476
+
477
+ .subscription-action {
478
+ width: 100%;
479
+ padding: 12px;
480
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
481
+ border: none;
482
+ border-radius: 8px;
483
+ color: #0B0B0F;
484
+ font-weight: 600;
485
+ font-size: 16px;
486
+ cursor: pointer;
487
+ transition: all 0.2s ease;
488
+ }
489
+
490
+ .subscription-action:hover:not(.current) {
491
+ background: linear-gradient(90deg, #35F2DB, #00E0FF);
492
+ }
493
+
494
+ .subscription-action.current {
495
+ background: rgba(0, 224, 255, 0.2);
496
+ color: #00E0FF;
497
+ cursor: default;
498
+ }
499
+
500
+ /* Charging Screen */
501
+ .charging-screen h2 {
502
+ margin-top: 0;
503
+ margin-bottom: 16px;
504
+ font-size: 24px;
505
+ }
506
+
507
+ .map-container {
508
+ height: 200px;
509
+ border-radius: 16px;
510
+ overflow: hidden;
511
+ position: relative;
512
+ margin-bottom: 24px;
513
+ }
514
+
515
+ .charging-map {
516
+ width: 100%;
517
+ height: 100%;
518
+ object-fit: cover;
519
+ }
520
+
521
+ .map-markers {
522
+ position: absolute;
523
+ top: 0;
524
+ left: 0;
525
+ right: 0;
526
+ bottom: 0;
527
+ }
528
+
529
+ .map-marker {
530
+ position: absolute;
531
+ width: 20px;
532
+ height: 20px;
533
+ background-color: #00E0FF;
534
+ border-radius: 50%;
535
+ transform: translate(-50%, -50%);
536
+ }
537
+
538
+ .map-marker[data-available="0"] {
539
+ background-color: #ff5555;
540
+ }
541
+
542
+ .marker-pulse {
543
+ position: absolute;
544
+ top: 0;
545
+ left: 0;
546
+ right: 0;
547
+ bottom: 0;
548
+ border-radius: 50%;
549
+ background-color: rgba(0, 224, 255, 0.4);
550
+ animation: markerPulse 1.5s infinite;
551
+ }
552
+
553
+ @keyframes markerPulse {
554
+ 0% {
555
+ transform: scale(1);
556
+ opacity: 0.4;
557
+ }
558
+ 70% {
559
+ transform: scale(2);
560
+ opacity: 0;
561
+ }
562
+ 100% {
563
+ transform: scale(1);
564
+ opacity: 0;
565
+ }
566
+ }
567
+
568
+ .marker-label {
569
+ position: absolute;
570
+ bottom: -20px;
571
+ left: 50%;
572
+ transform: translateX(-50%);
573
+ white-space: nowrap;
574
+ font-size: 10px;
575
+ background-color: rgba(0, 0, 0, 0.7);
576
+ padding: 2px 6px;
577
+ border-radius: 4px;
578
+ }
579
+
580
+ .charging-list h3 {
581
+ margin-top: 0;
582
+ margin-bottom: 16px;
583
+ font-size: 18px;
584
+ }
585
+
586
+ .charging-location-card {
587
+ display: flex;
588
+ justify-content: space-between;
589
+ background-color: rgba(255, 255, 255, 0.05);
590
+ border-radius: 12px;
591
+ padding: 16px;
592
+ margin-bottom: 12px;
593
+ }
594
+
595
+ .location-info {
596
+ flex: 1;
597
+ }
598
+
599
+ .location-info h4 {
600
+ margin: 0 0 4px 0;
601
+ font-size: 16px;
602
+ }
603
+
604
+ .location-info p {
605
+ margin: 0 0 8px 0;
606
+ font-size: 14px;
607
+ opacity: 0.7;
608
+ }
609
+
610
+ .amenities {
611
+ display: flex;
612
+ flex-wrap: wrap;
613
+ gap: 6px;
614
+ }
615
+
616
+ .amenity-tag {
617
+ background-color: rgba(0, 224, 255, 0.1);
618
+ border-radius: 4px;
619
+ padding: 2px 6px;
620
+ font-size: 12px;
621
+ color: #00E0FF;
622
+ }
623
+
624
+ .location-status {
625
+ display: flex;
626
+ flex-direction: column;
627
+ justify-content: space-between;
628
+ align-items: flex-end;
629
+ }
630
+
631
+ .availability-indicator {
632
+ font-size: 14px;
633
+ margin-bottom: 8px;
634
+ }
635
+
636
+ .availability-indicator.available {
637
+ color: #35F2DB;
638
+ }
639
+
640
+ .availability-indicator.full {
641
+ color: #ff5555;
642
+ }
643
+
644
+ .location-action {
645
+ background-color: rgba(0, 224, 255, 0.2);
646
+ border: none;
647
+ border-radius: 8px;
648
+ color: #00E0FF;
649
+ padding: 6px 12px;
650
+ font-size: 12px;
651
+ cursor: pointer;
652
+ transition: all 0.2s ease;
653
+ }
654
+
655
+ .location-action:hover {
656
+ background-color: rgba(0, 224, 255, 0.3);
657
+ }
658
+
659
+ /* ChainLink Screen */
660
+ .chainlink-screen h2 {
661
+ margin-top: 0;
662
+ margin-bottom: 16px;
663
+ font-size: 24px;
664
+ }
665
+
666
+ .token-balance {
667
+ background: linear-gradient(135deg, rgba(0, 224, 255, 0.1), rgba(53, 242, 219, 0.05));
668
+ border-radius: 16px;
669
+ padding: 20px;
670
+ display: flex;
671
+ flex-direction: column;
672
+ align-items: center;
673
+ margin-bottom: 16px;
674
+ border: 1px solid rgba(0, 224, 255, 0.2);
675
+ }
676
+
677
+ .token-icon {
678
+ font-size: 32px;
679
+ margin-bottom: 8px;
680
+ color: #00E0FF;
681
+ }
682
+
683
+ .token-amount {
684
+ font-size: 36px;
685
+ font-weight: 700;
686
+ margin-bottom: 4px;
687
+ }
688
+
689
+ .token-label {
690
+ font-size: 14px;
691
+ opacity: 0.8;
692
+ }
693
+
694
+ .token-value {
695
+ background-color: rgba(255, 255, 255, 0.05);
696
+ border-radius: 16px;
697
+ padding: 16px;
698
+ display: flex;
699
+ flex-direction: column;
700
+ align-items: center;
701
+ margin-bottom: 24px;
702
+ }
703
+
704
+ .value-label {
705
+ font-size: 14px;
706
+ opacity: 0.8;
707
+ margin-bottom: 4px;
708
+ }
709
+
710
+ .value-amount {
711
+ font-size: 24px;
712
+ font-weight: 700;
713
+ margin-bottom: 4px;
714
+ }
715
+
716
+ .value-change {
717
+ font-size: 14px;
718
+ }
719
+
720
+ .value-change.positive {
721
+ color: #35F2DB;
722
+ }
723
+
724
+ .value-change.negative {
725
+ color: #ff5555;
726
+ }
727
+
728
+ .token-categories h3 {
729
+ margin-top: 0;
730
+ margin-bottom: 16px;
731
+ font-size: 18px;
732
+ }
733
+
734
+ .category-cards {
735
+ display: grid;
736
+ grid-template-columns: repeat(3, 1fr);
737
+ gap: 12px;
738
+ margin-bottom: 24px;
739
+ }
740
+
741
+ .category-card {
742
+ background-color: rgba(255, 255, 255, 0.05);
743
+ border-radius: 12px;
744
+ padding: 12px;
745
+ display: flex;
746
+ flex-direction: column;
747
+ align-items: center;
748
+ text-align: center;
749
+ }
750
+
751
+ .category-icon {
752
+ width: 40px;
753
+ height: 40px;
754
+ border-radius: 50%;
755
+ display: flex;
756
+ justify-content: center;
757
+ align-items: center;
758
+ margin-bottom: 8px;
759
+ font-size: 20px;
760
+ }
761
+
762
+ .category-name {
763
+ font-size: 12px;
764
+ margin-bottom: 4px;
765
+ line-height: 1.2;
766
+ }
767
+
768
+ .category-amount {
769
+ font-size: 14px;
770
+ font-weight: 600;
771
+ color: #00E0FF;
772
+ }
773
+
774
+ .token-actions {
775
+ display: grid;
776
+ grid-template-columns: repeat(3, 1fr);
777
+ gap: 12px;
778
+ margin-bottom: 24px;
779
+ }
780
+
781
+ .token-action-button {
782
+ background-color: rgba(0, 224, 255, 0.1);
783
+ border: 1px solid rgba(0, 224, 255, 0.2);
784
+ border-radius: 8px;
785
+ color: #00E0FF;
786
+ padding: 10px;
787
+ font-size: 12px;
788
+ cursor: pointer;
789
+ transition: all 0.2s ease;
790
+ }
791
+
792
+ .token-action-button:hover {
793
+ background-color: rgba(0, 224, 255, 0.2);
794
+ }
795
+
796
+ .token-history h3 {
797
+ margin-top: 0;
798
+ margin-bottom: 16px;
799
+ font-size: 18px;
800
+ }
801
+
802
+ .transaction-list {
803
+ display: flex;
804
+ flex-direction: column;
805
+ gap: 12px;
806
+ }
807
+
808
+ .transaction-item {
809
+ display: flex;
810
+ align-items: center;
811
+ background-color: rgba(255, 255, 255, 0.05);
812
+ border-radius: 12px;
813
+ padding: 12px;
814
+ }
815
+
816
+ .transaction-icon {
817
+ width: 32px;
818
+ height: 32px;
819
+ border-radius: 50%;
820
+ display: flex;
821
+ justify-content: center;
822
+ align-items: center;
823
+ margin-right: 12px;
824
+ font-size: 16px;
825
+ font-weight: 700;
826
+ }
827
+
828
+ .transaction-icon.purchase {
829
+ background-color: rgba(0, 224, 255, 0.2);
830
+ color: #00E0FF;
831
+ }
832
+
833
+ .transaction-icon.reward {
834
+ background-color: rgba(255, 215, 0, 0.2);
835
+ color: gold;
836
+ }
837
+
838
+ .transaction-icon.dividend {
839
+ background-color: rgba(50, 205, 50, 0.2);
840
+ color: limegreen;
841
+ }
842
+
843
+ .transaction-details {
844
+ flex: 1;
845
+ }
846
+
847
+ .transaction-title {
848
+ font-size: 14px;
849
+ margin-bottom: 2px;
850
+ }
851
+
852
+ .transaction-date {
853
+ font-size: 12px;
854
+ opacity: 0.7;
855
+ }
856
+
857
+ .transaction-amount {
858
+ font-weight: 600;
859
+ font-size: 14px;
860
+ }
861
+
862
+ /* Navigation Footer */
863
+ .app-navigation {
864
+ display: grid;
865
+ grid-template-columns: repeat(5, 1fr);
866
+ background-color: rgba(20, 20, 30, 0.8);
867
+ backdrop-filter: blur(10px);
868
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
869
+ position: fixed;
870
+ bottom: 0;
871
+ left: 0;
872
+ right: 0;
873
+ padding: 8px 0;
874
+ max-width: 480px;
875
+ margin: 0 auto;
876
+ }
877
+
878
+ .nav-button {
879
+ display: flex;
880
+ flex-direction: column;
881
+ align-items: center;
882
+ background: transparent;
883
+ border: none;
884
+ color: rgba(255, 255, 255, 0.6);
885
+ padding: 8px 0;
886
+ transition: all 0.2s ease;
887
+ }
888
+
889
+ .nav-button.active {
890
+ color: #00E0FF;
891
+ }
892
+
893
+ .nav-icon {
894
+ font-size: 20px;
895
+ margin-bottom: 4px;
896
+ }
897
+
898
+ .nav-label {
899
+ font-size: 10px;
900
+ }
901
+
902
+ /* Responsive Adjustments */
903
+ @media (min-width: 400px) {
904
+ .vehicle-list {
905
+ grid-template-columns: repeat(2, 1fr);
906
+ }
907
+ }
908
+
909
+ @media (max-width: 360px) {
910
+ .category-cards {
911
+ grid-template-columns: repeat(2, 1fr);
912
+ }
913
+
914
+ .token-actions {
915
+ grid-template-columns: repeat(2, 1fr);
916
+ }
917
+
918
+ .quick-actions {
919
+ grid-template-columns: repeat(2, 1fr);
920
+ }
921
+ }
MobileApp.jsx ADDED
@@ -0,0 +1,360 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useState, useEffect } from 'react';
2
+ import './MobileApp.css';
3
+
4
+ // Mock data for demonstration purposes
5
+ const mockVehicles = [
6
+ { id: 1, name: 'Tesla Model 3', type: 'sedan', range: '310 miles', available: true, image: '/images/tesla_model3.png' },
7
+ { id: 2, name: 'Tesla Model Y', type: 'suv', range: '330 miles', available: true, image: '/images/tesla_modely.png' },
8
+ { id: 3, name: 'Tesla Cybertruck', type: 'truck', range: '500 miles', available: false, image: '/images/cybertruck.png' },
9
+ { id: 4, name: 'GMC Hummer EV', type: 'truck', range: '350 miles', available: true, image: '/images/hummer_ev.png' },
10
+ ];
11
+
12
+ const mockSubscriptions = [
13
+ { id: 1, name: 'FlexRide', price: 500, description: 'Basic access to Unity Fleet vehicles', features: ['24/7 vehicle access', 'Basic charging', 'Standard support'] },
14
+ { id: 2, name: 'Take-Home', price: 1200, description: 'Dedicated vehicle for personal use', features: ['Dedicated vehicle', 'Home charging setup', 'Premium support', 'Insurance included'] },
15
+ { id: 3, name: 'All-Access', price: 2000, description: 'Complete mobility solution', features: ['Multiple vehicle types', 'Priority charging', 'Concierge service', 'VIP lounge access', 'Unlimited miles'] },
16
+ ];
17
+
18
+ const mockChargingLocations = [
19
+ { id: 1, name: 'The Link - Downtown', address: '123 Main St, Springfield, IL', available: 5, total: 8, amenities: ['Lounge', 'Coffee Bar', 'WiFi'] },
20
+ { id: 2, name: 'The Link - Westside', address: '456 Oak Ave, Springfield, IL', available: 2, total: 6, amenities: ['Lounge', 'Retail', 'WiFi'] },
21
+ { id: 3, name: 'The Link - University', address: '789 Campus Dr, Urbana, IL', available: 8, total: 12, amenities: ['Lounge', 'Restaurant', 'WiFi', 'Conference Room'] },
22
+ ];
23
+
24
+ function MobileApp() {
25
+ const [activeTab, setActiveTab] = useState('home');
26
+ const [loading, setLoading] = useState(true);
27
+ const [user, setUser] = useState({
28
+ name: 'Matthew Lamb',
29
+ subscription: 'All-Access',
30
+ credits: 2500,
31
+ reservations: [
32
+ { id: 101, vehicle: 'Tesla Model 3', date: '2025-04-08', time: '09:00 AM', location: 'The Link - Downtown' }
33
+ ]
34
+ });
35
+
36
+ useEffect(() => {
37
+ // Simulate loading
38
+ const timer = setTimeout(() => {
39
+ setLoading(false);
40
+ }, 1500);
41
+
42
+ return () => clearTimeout(timer);
43
+ }, []);
44
+
45
+ if (loading) {
46
+ return (
47
+ <div className="mobile-app loading">
48
+ <div className="loading-logo">
49
+ <img src="/images/unity_fleet_logo.png" alt="Unity Fleet" />
50
+ <div className="loading-pulse"></div>
51
+ </div>
52
+ <p>Connecting to The Link...</p>
53
+ </div>
54
+ );
55
+ }
56
+
57
+ return (
58
+ <div className="mobile-app">
59
+ <header className="app-header">
60
+ <h1>THE LINK</h1>
61
+ <div className="user-profile">
62
+ <img src="/images/profile_avatar.png" alt="Profile" />
63
+ </div>
64
+ </header>
65
+
66
+ <main className="app-content">
67
+ {activeTab === 'home' && (
68
+ <div className="home-screen">
69
+ <div className="welcome-card">
70
+ <h2>Welcome back, {user.name}</h2>
71
+ <p>{user.subscription} Member</p>
72
+ <div className="credit-display">
73
+ <span className="credit-amount">${user.credits}</span>
74
+ <span className="credit-label">Available Credits</span>
75
+ </div>
76
+ </div>
77
+
78
+ <div className="quick-actions">
79
+ <button className="action-button">
80
+ <span className="icon">🚗</span>
81
+ <span>Reserve</span>
82
+ </button>
83
+ <button className="action-button">
84
+ <span className="icon">⚡</span>
85
+ <span>Charge</span>
86
+ </button>
87
+ <button className="action-button">
88
+ <span className="icon">🔑</span>
89
+ <span>Unlock</span>
90
+ </button>
91
+ <button className="action-button">
92
+ <span className="icon">📍</span>
93
+ <span>Locate</span>
94
+ </button>
95
+ </div>
96
+
97
+ <div className="upcoming-reservations">
98
+ <h3>Upcoming Reservations</h3>
99
+ {user.reservations.length > 0 ? (
100
+ user.reservations.map(reservation => (
101
+ <div key={reservation.id} className="reservation-card">
102
+ <div className="reservation-vehicle">{reservation.vehicle}</div>
103
+ <div className="reservation-details">
104
+ <div>{reservation.date} at {reservation.time}</div>
105
+ <div>{reservation.location}</div>
106
+ </div>
107
+ <button className="reservation-action">Manage</button>
108
+ </div>
109
+ ))
110
+ ) : (
111
+ <p className="no-reservations">No upcoming reservations</p>
112
+ )}
113
+ </div>
114
+
115
+ <div className="nearby-hubs">
116
+ <h3>Nearby Charging Hubs</h3>
117
+ <div className="hub-list">
118
+ {mockChargingLocations.map(hub => (
119
+ <div key={hub.id} className="hub-card">
120
+ <div className="hub-info">
121
+ <h4>{hub.name}</h4>
122
+ <p>{hub.address}</p>
123
+ <div className="availability">
124
+ <span className={hub.available > 0 ? "available" : "unavailable"}>
125
+ {hub.available}/{hub.total} Available
126
+ </span>
127
+ </div>
128
+ </div>
129
+ <button className="hub-action">Navigate</button>
130
+ </div>
131
+ ))}
132
+ </div>
133
+ </div>
134
+ </div>
135
+ )}
136
+
137
+ {activeTab === 'vehicles' && (
138
+ <div className="vehicles-screen">
139
+ <h2>Available Vehicles</h2>
140
+ <div className="vehicle-filters">
141
+ <button className="filter-button active">All</button>
142
+ <button className="filter-button">Sedan</button>
143
+ <button className="filter-button">SUV</button>
144
+ <button className="filter-button">Truck</button>
145
+ </div>
146
+ <div className="vehicle-list">
147
+ {mockVehicles.map(vehicle => (
148
+ <div key={vehicle.id} className={`vehicle-card ${!vehicle.available ? 'unavailable' : ''}`}>
149
+ <div className="vehicle-image">
150
+ <img src={vehicle.image} alt={vehicle.name} />
151
+ {!vehicle.available && <div className="unavailable-overlay">Reserved</div>}
152
+ </div>
153
+ <div className="vehicle-info">
154
+ <h3>{vehicle.name}</h3>
155
+ <p className="vehicle-type">{vehicle.type}</p>
156
+ <p className="vehicle-range">Range: {vehicle.range}</p>
157
+ </div>
158
+ <button className="vehicle-reserve" disabled={!vehicle.available}>
159
+ {vehicle.available ? 'Reserve' : 'Unavailable'}
160
+ </button>
161
+ </div>
162
+ ))}
163
+ </div>
164
+ </div>
165
+ )}
166
+
167
+ {activeTab === 'subscriptions' && (
168
+ <div className="subscriptions-screen">
169
+ <h2>Subscription Plans</h2>
170
+ <p className="current-plan">Current Plan: <strong>{user.subscription}</strong></p>
171
+
172
+ <div className="subscription-list">
173
+ {mockSubscriptions.map(sub => (
174
+ <div key={sub.id} className={`subscription-card ${sub.name === user.subscription ? 'current' : ''}`}>
175
+ <div className="subscription-header">
176
+ <h3>{sub.name}</h3>
177
+ <div className="subscription-price">${sub.price}<span>/mo</span></div>
178
+ </div>
179
+ <p className="subscription-desc">{sub.description}</p>
180
+ <ul className="subscription-features">
181
+ {sub.features.map((feature, index) => (
182
+ <li key={index}>{feature}</li>
183
+ ))}
184
+ </ul>
185
+ <button className={`subscription-action ${sub.name === user.subscription ? 'current' : ''}`}>
186
+ {sub.name === user.subscription ? 'Current Plan' : 'Switch Plan'}
187
+ </button>
188
+ </div>
189
+ ))}
190
+ </div>
191
+ </div>
192
+ )}
193
+
194
+ {activeTab === 'charging' && (
195
+ <div className="charging-screen">
196
+ <h2>Charging Lounges</h2>
197
+
198
+ <div className="map-container">
199
+ <img src="/images/charging_map.png" alt="Charging Map" className="charging-map" />
200
+ <div className="map-markers">
201
+ {mockChargingLocations.map(location => (
202
+ <div
203
+ key={location.id}
204
+ className="map-marker"
205
+ style={{
206
+ top: `${20 + location.id * 15}%`,
207
+ left: `${20 + location.id * 20}%`
208
+ }}
209
+ data-available={location.available}
210
+ >
211
+ <div className="marker-pulse"></div>
212
+ <div className="marker-label">{location.name}</div>
213
+ </div>
214
+ ))}
215
+ </div>
216
+ </div>
217
+
218
+ <div className="charging-list">
219
+ <h3>Charging Locations</h3>
220
+ {mockChargingLocations.map(location => (
221
+ <div key={location.id} className="charging-location-card">
222
+ <div className="location-info">
223
+ <h4>{location.name}</h4>
224
+ <p>{location.address}</p>
225
+ <div className="amenities">
226
+ {location.amenities.map((amenity, index) => (
227
+ <span key={index} className="amenity-tag">{amenity}</span>
228
+ ))}
229
+ </div>
230
+ </div>
231
+ <div className="location-status">
232
+ <div className={`availability-indicator ${location.available > 0 ? 'available' : 'full'}`}>
233
+ {location.available > 0 ? `${location.available} Available` : 'Full'}
234
+ </div>
235
+ <button className="location-action">Details</button>
236
+ </div>
237
+ </div>
238
+ ))}
239
+ </div>
240
+ </div>
241
+ )}
242
+
243
+ {activeTab === 'chainlink' && (
244
+ <div className="chainlink-screen">
245
+ <h2>ChainLink Tokenization</h2>
246
+
247
+ <div className="token-balance">
248
+ <div className="token-icon">⬡</div>
249
+ <div className="token-amount">125.5</div>
250
+ <div className="token-label">LINK Tokens</div>
251
+ </div>
252
+
253
+ <div className="token-value">
254
+ <div className="value-label">Estimated Value</div>
255
+ <div className="value-amount">$12,550</div>
256
+ <div className="value-change positive">+5.2% this week</div>
257
+ </div>
258
+
259
+ <div className="token-categories">
260
+ <h3>Your Token Portfolio</h3>
261
+ <div className="category-cards">
262
+ <div className="category-card">
263
+ <div className="category-icon" style={{backgroundColor: '#00E0FF'}}>⚡</div>
264
+ <div className="category-name">Charging Infrastructure</div>
265
+ <div className="category-amount">75.0 LINK</div>
266
+ </div>
267
+ <div className="category-card">
268
+ <div className="category-icon" style={{backgroundColor: '#35F2DB'}}>🚗</div>
269
+ <div className="category-name">Fleet Vehicles</div>
270
+ <div className="category-amount">32.5 LINK</div>
271
+ </div>
272
+ <div className="category-card">
273
+ <div className="category-icon" style={{backgroundColor: '#4A7AFF'}}>🔋</div>
274
+ <div className="category-name">Energy Systems</div>
275
+ <div className="category-amount">18.0 LINK</div>
276
+ </div>
277
+ </div>
278
+ </div>
279
+
280
+ <div className="token-actions">
281
+ <button className="token-action-button">Buy Tokens</button>
282
+ <button className="token-action-button">Sell Tokens</button>
283
+ <button className="token-action-button">View Benefits</button>
284
+ </div>
285
+
286
+ <div className="token-history">
287
+ <h3>Recent Transactions</h3>
288
+ <div className="transaction-list">
289
+ <div className="transaction-item">
290
+ <div className="transaction-icon purchase">+</div>
291
+ <div className="transaction-details">
292
+ <div className="transaction-title">Purchased 10.0 LINK</div>
293
+ <div className="transaction-date">Apr 5, 2025</div>
294
+ </div>
295
+ <div className="transaction-amount">$1,000</div>
296
+ </div>
297
+ <div className="transaction-item">
298
+ <div className="transaction-icon reward">★</div>
299
+ <div className="transaction-details">
300
+ <div className="transaction-title">Loyalty Reward</div>
301
+ <div className="transaction-date">Apr 1, 2025</div>
302
+ </div>
303
+ <div className="transaction-amount">+2.5 LINK</div>
304
+ </div>
305
+ <div className="transaction-item">
306
+ <div className="transaction-icon dividend">$</div>
307
+ <div className="transaction-details">
308
+ <div className="transaction-title">Quarterly Dividend</div>
309
+ <div className="transaction-date">Mar 31, 2025</div>
310
+ </div>
311
+ <div className="transaction-amount">$325</div>
312
+ </div>
313
+ </div>
314
+ </div>
315
+ </div>
316
+ )}
317
+ </main>
318
+
319
+ <footer className="app-navigation">
320
+ <button
321
+ className={`nav-button ${activeTab === 'home' ? 'active' : ''}`}
322
+ onClick={() => setActiveTab('home')}
323
+ >
324
+ <span className="nav-icon">🏠</span>
325
+ <span className="nav-label">Home</span>
326
+ </button>
327
+ <button
328
+ className={`nav-button ${activeTab === 'vehicles' ? 'active' : ''}`}
329
+ onClick={() => setActiveTab('vehicles')}
330
+ >
331
+ <span className="nav-icon">🚗</span>
332
+ <span className="nav-label">Vehicles</span>
333
+ </button>
334
+ <button
335
+ className={`nav-button ${activeTab === 'subscriptions' ? 'active' : ''}`}
336
+ onClick={() => setActiveTab('subscriptions')}
337
+ >
338
+ <span className="nav-icon">📱</span>
339
+ <span className="nav-label">Plans</span>
340
+ </button>
341
+ <button
342
+ className={`nav-button ${activeTab === 'charging' ? 'active' : ''}`}
343
+ onClick={() => setActiveTab('charging')}
344
+ >
345
+ <span className="nav-icon">⚡</span>
346
+ <span className="nav-label">Charging</span>
347
+ </button>
348
+ <button
349
+ className={`nav-button ${activeTab === 'chainlink' ? 'active' : ''}`}
350
+ onClick={() => setActiveTab('chainlink')}
351
+ >
352
+ <span className="nav-icon">⬡</span>
353
+ <span className="nav-label">ChainLink</span>
354
+ </button>
355
+ </footer>
356
+ </div>
357
+ );
358
+ }
359
+
360
+ export default MobileApp;
SubscriptionPortal.css ADDED
@@ -0,0 +1,1498 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Subscription Portal Styles */
2
+ .subscription-portal {
3
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
4
+ max-width: 1200px;
5
+ margin: 0 auto;
6
+ background-color: #0B0B0F;
7
+ color: #ffffff;
8
+ min-height: 100vh;
9
+ position: relative;
10
+ }
11
+
12
+ /* Loading Screen */
13
+ .subscription-portal.loading {
14
+ display: flex;
15
+ flex-direction: column;
16
+ justify-content: center;
17
+ align-items: center;
18
+ height: 100vh;
19
+ }
20
+
21
+ .loading-logo {
22
+ width: 150px;
23
+ height: 150px;
24
+ margin-bottom: 20px;
25
+ position: relative;
26
+ }
27
+
28
+ .loading-logo img {
29
+ width: 100%;
30
+ height: 100%;
31
+ object-fit: contain;
32
+ }
33
+
34
+ .loading-pulse {
35
+ position: absolute;
36
+ top: 0;
37
+ left: 0;
38
+ right: 0;
39
+ bottom: 0;
40
+ border-radius: 50%;
41
+ border: 2px solid #00E0FF;
42
+ animation: pulse 1.5s infinite ease-in-out;
43
+ }
44
+
45
+ @keyframes pulse {
46
+ 0% {
47
+ transform: scale(0.95);
48
+ opacity: 1;
49
+ }
50
+ 70% {
51
+ transform: scale(1.2);
52
+ opacity: 0;
53
+ }
54
+ 100% {
55
+ transform: scale(0.95);
56
+ opacity: 0;
57
+ }
58
+ }
59
+
60
+ /* Header */
61
+ .portal-header {
62
+ display: flex;
63
+ justify-content: space-between;
64
+ align-items: center;
65
+ padding: 20px;
66
+ background-color: rgba(20, 20, 30, 0.8);
67
+ backdrop-filter: blur(10px);
68
+ position: sticky;
69
+ top: 0;
70
+ z-index: 100;
71
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
72
+ }
73
+
74
+ .portal-title {
75
+ display: flex;
76
+ flex-direction: column;
77
+ }
78
+
79
+ .portal-title h1 {
80
+ margin: 0;
81
+ font-size: 28px;
82
+ font-weight: 700;
83
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
84
+ -webkit-background-clip: text;
85
+ background-clip: text;
86
+ -webkit-text-fill-color: transparent;
87
+ letter-spacing: 1px;
88
+ }
89
+
90
+ .portal-subtitle {
91
+ font-size: 14px;
92
+ opacity: 0.7;
93
+ }
94
+
95
+ .user-profile {
96
+ display: flex;
97
+ align-items: center;
98
+ gap: 12px;
99
+ }
100
+
101
+ .profile-avatar {
102
+ width: 40px;
103
+ height: 40px;
104
+ border-radius: 50%;
105
+ overflow: hidden;
106
+ border: 2px solid #00E0FF;
107
+ }
108
+
109
+ .profile-avatar img {
110
+ width: 100%;
111
+ height: 100%;
112
+ object-fit: cover;
113
+ }
114
+
115
+ .profile-info {
116
+ display: flex;
117
+ flex-direction: column;
118
+ }
119
+
120
+ .profile-name {
121
+ font-size: 14px;
122
+ font-weight: 600;
123
+ }
124
+
125
+ .profile-plan {
126
+ font-size: 12px;
127
+ opacity: 0.7;
128
+ }
129
+
130
+ /* Navigation */
131
+ .portal-navigation {
132
+ display: flex;
133
+ gap: 2px;
134
+ background-color: rgba(20, 20, 30, 0.5);
135
+ padding: 0 20px;
136
+ overflow-x: auto;
137
+ scrollbar-width: none;
138
+ }
139
+
140
+ .portal-navigation::-webkit-scrollbar {
141
+ display: none;
142
+ }
143
+
144
+ .nav-button {
145
+ padding: 16px 20px;
146
+ background: transparent;
147
+ border: none;
148
+ color: white;
149
+ font-size: 16px;
150
+ cursor: pointer;
151
+ position: relative;
152
+ white-space: nowrap;
153
+ }
154
+
155
+ .nav-button.active {
156
+ color: #00E0FF;
157
+ }
158
+
159
+ .nav-button.active::after {
160
+ content: '';
161
+ position: absolute;
162
+ bottom: 0;
163
+ left: 0;
164
+ right: 0;
165
+ height: 3px;
166
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
167
+ border-radius: 3px 3px 0 0;
168
+ }
169
+
170
+ /* Main Content */
171
+ .portal-content {
172
+ padding: 20px;
173
+ min-height: calc(100vh - 200px);
174
+ }
175
+
176
+ /* Plans Tab */
177
+ .plans-tab {
178
+ display: flex;
179
+ flex-direction: column;
180
+ gap: 30px;
181
+ }
182
+
183
+ .current-plan-banner {
184
+ background: linear-gradient(135deg, rgba(0, 224, 255, 0.1), rgba(53, 242, 219, 0.05));
185
+ border-radius: 16px;
186
+ padding: 20px;
187
+ display: flex;
188
+ justify-content: space-between;
189
+ align-items: center;
190
+ border: 1px solid rgba(0, 224, 255, 0.2);
191
+ flex-wrap: wrap;
192
+ gap: 20px;
193
+ }
194
+
195
+ .banner-content h3 {
196
+ margin: 0 0 8px 0;
197
+ font-size: 20px;
198
+ font-weight: 600;
199
+ }
200
+
201
+ .banner-content p {
202
+ margin: 0;
203
+ opacity: 0.7;
204
+ font-size: 14px;
205
+ }
206
+
207
+ .banner-button {
208
+ background-color: rgba(0, 224, 255, 0.2);
209
+ border: 1px solid rgba(0, 224, 255, 0.3);
210
+ border-radius: 8px;
211
+ padding: 10px 20px;
212
+ color: #00E0FF;
213
+ font-size: 14px;
214
+ cursor: pointer;
215
+ transition: all 0.2s ease;
216
+ }
217
+
218
+ .banner-button:hover {
219
+ background-color: rgba(0, 224, 255, 0.3);
220
+ }
221
+
222
+ /* Billing Toggle */
223
+ .billing-toggle {
224
+ display: flex;
225
+ align-items: center;
226
+ justify-content: center;
227
+ gap: 15px;
228
+ margin-bottom: 20px;
229
+ }
230
+
231
+ .billing-option {
232
+ font-size: 16px;
233
+ opacity: 0.7;
234
+ position: relative;
235
+ }
236
+
237
+ .billing-option.active {
238
+ opacity: 1;
239
+ font-weight: 600;
240
+ color: #00E0FF;
241
+ }
242
+
243
+ .discount-badge {
244
+ position: absolute;
245
+ top: -15px;
246
+ right: -30px;
247
+ background-color: rgba(255, 193, 7, 0.2);
248
+ color: #FFC107;
249
+ font-size: 10px;
250
+ padding: 2px 6px;
251
+ border-radius: 10px;
252
+ font-weight: 600;
253
+ }
254
+
255
+ /* Toggle Switch */
256
+ .toggle-switch {
257
+ position: relative;
258
+ display: inline-block;
259
+ width: 50px;
260
+ height: 24px;
261
+ }
262
+
263
+ .toggle-switch input {
264
+ opacity: 0;
265
+ width: 0;
266
+ height: 0;
267
+ }
268
+
269
+ .toggle-slider {
270
+ position: absolute;
271
+ cursor: pointer;
272
+ top: 0;
273
+ left: 0;
274
+ right: 0;
275
+ bottom: 0;
276
+ background-color: rgba(255, 255, 255, 0.1);
277
+ transition: .4s;
278
+ border-radius: 24px;
279
+ }
280
+
281
+ .toggle-slider:before {
282
+ position: absolute;
283
+ content: "";
284
+ height: 16px;
285
+ width: 16px;
286
+ left: 4px;
287
+ bottom: 4px;
288
+ background-color: white;
289
+ transition: .4s;
290
+ border-radius: 50%;
291
+ }
292
+
293
+ input:checked + .toggle-slider {
294
+ background-color: rgba(0, 224, 255, 0.5);
295
+ }
296
+
297
+ input:checked + .toggle-slider:before {
298
+ transform: translateX(26px);
299
+ background-color: #00E0FF;
300
+ }
301
+
302
+ /* Subscription Tiers */
303
+ .subscription-tiers {
304
+ display: grid;
305
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
306
+ gap: 20px;
307
+ margin-bottom: 30px;
308
+ }
309
+
310
+ .tier-card {
311
+ background-color: rgba(255, 255, 255, 0.05);
312
+ border-radius: 16px;
313
+ overflow: hidden;
314
+ border: 1px solid rgba(255, 255, 255, 0.1);
315
+ transition: all 0.3s ease;
316
+ position: relative;
317
+ }
318
+
319
+ .tier-card:hover {
320
+ transform: translateY(-5px);
321
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
322
+ }
323
+
324
+ .tier-card.selected {
325
+ border-color: #00E0FF;
326
+ box-shadow: 0 0 15px rgba(0, 224, 255, 0.3);
327
+ }
328
+
329
+ .tier-card.popular {
330
+ border-color: #FFC107;
331
+ }
332
+
333
+ .popular-badge {
334
+ position: absolute;
335
+ top: 15px;
336
+ right: 15px;
337
+ background-color: rgba(255, 193, 7, 0.2);
338
+ color: #FFC107;
339
+ font-size: 12px;
340
+ padding: 4px 8px;
341
+ border-radius: 20px;
342
+ font-weight: 600;
343
+ }
344
+
345
+ .tier-header {
346
+ padding: 20px;
347
+ text-align: center;
348
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
349
+ }
350
+
351
+ .tier-name {
352
+ margin: 0 0 10px 0;
353
+ font-size: 24px;
354
+ font-weight: 700;
355
+ }
356
+
357
+ .tier-price {
358
+ display: flex;
359
+ justify-content: center;
360
+ align-items: baseline;
361
+ margin-bottom: 5px;
362
+ }
363
+
364
+ .price-amount {
365
+ font-size: 36px;
366
+ font-weight: 700;
367
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
368
+ -webkit-background-clip: text;
369
+ background-clip: text;
370
+ -webkit-text-fill-color: transparent;
371
+ }
372
+
373
+ .price-period {
374
+ font-size: 16px;
375
+ opacity: 0.7;
376
+ margin-left: 5px;
377
+ }
378
+
379
+ .annual-savings {
380
+ font-size: 14px;
381
+ color: #FFC107;
382
+ margin-top: 5px;
383
+ }
384
+
385
+ .tier-description {
386
+ padding: 20px;
387
+ text-align: center;
388
+ font-size: 14px;
389
+ opacity: 0.8;
390
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
391
+ }
392
+
393
+ .tier-features {
394
+ padding: 20px;
395
+ list-style-type: none;
396
+ margin: 0;
397
+ }
398
+
399
+ .tier-features li {
400
+ display: flex;
401
+ align-items: center;
402
+ margin-bottom: 12px;
403
+ font-size: 14px;
404
+ }
405
+
406
+ .tier-features li:last-child {
407
+ margin-bottom: 0;
408
+ }
409
+
410
+ .feature-icon {
411
+ margin-right: 10px;
412
+ font-size: 16px;
413
+ min-width: 20px;
414
+ text-align: center;
415
+ }
416
+
417
+ .tier-features li.included .feature-icon {
418
+ color: #35F2DB;
419
+ }
420
+
421
+ .tier-features li.excluded {
422
+ opacity: 0.5;
423
+ }
424
+
425
+ .feature-details {
426
+ font-size: 12px;
427
+ opacity: 0.7;
428
+ }
429
+
430
+ .tier-action {
431
+ padding: 20px;
432
+ text-align: center;
433
+ }
434
+
435
+ .select-plan-button, .current-plan-button {
436
+ width: 100%;
437
+ padding: 12px;
438
+ border-radius: 8px;
439
+ font-size: 16px;
440
+ font-weight: 600;
441
+ cursor: pointer;
442
+ transition: all 0.2s ease;
443
+ border: none;
444
+ }
445
+
446
+ .select-plan-button {
447
+ color: white;
448
+ }
449
+
450
+ .select-plan-button:hover {
451
+ transform: translateY(-2px);
452
+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
453
+ }
454
+
455
+ .current-plan-button {
456
+ background-color: rgba(255, 255, 255, 0.1);
457
+ color: white;
458
+ cursor: default;
459
+ }
460
+
461
+ /* Add-Ons Section */
462
+ .add-ons-section {
463
+ background: rgba(255, 255, 255, 0.05);
464
+ border-radius: 16px;
465
+ padding: 20px;
466
+ border: 1px solid rgba(0, 224, 255, 0.1);
467
+ margin-bottom: 30px;
468
+ }
469
+
470
+ .add-ons-section h3 {
471
+ margin: 0 0 20px 0;
472
+ font-size: 20px;
473
+ font-weight: 600;
474
+ }
475
+
476
+ .add-ons-grid {
477
+ display: grid;
478
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
479
+ gap: 15px;
480
+ }
481
+
482
+ .add-on-card {
483
+ background-color: rgba(255, 255, 255, 0.05);
484
+ border-radius: 12px;
485
+ padding: 15px;
486
+ border: 1px solid rgba(255, 255, 255, 0.1);
487
+ display: flex;
488
+ align-items: center;
489
+ gap: 15px;
490
+ cursor: pointer;
491
+ transition: all 0.2s ease;
492
+ }
493
+
494
+ .add-on-card:hover {
495
+ background-color: rgba(0, 224, 255, 0.05);
496
+ }
497
+
498
+ .add-on-card.selected {
499
+ border-color: #00E0FF;
500
+ background-color: rgba(0, 224, 255, 0.1);
501
+ }
502
+
503
+ .add-on-checkbox {
504
+ width: 20px;
505
+ height: 20px;
506
+ border-radius: 4px;
507
+ border: 2px solid rgba(255, 255, 255, 0.3);
508
+ display: flex;
509
+ justify-content: center;
510
+ align-items: center;
511
+ flex-shrink: 0;
512
+ }
513
+
514
+ .add-on-card.selected .add-on-checkbox {
515
+ border-color: #00E0FF;
516
+ background-color: rgba(0, 224, 255, 0.2);
517
+ }
518
+
519
+ .add-on-card.selected .checkbox-inner {
520
+ width: 10px;
521
+ height: 10px;
522
+ border-radius: 2px;
523
+ background-color: #00E0FF;
524
+ }
525
+
526
+ .add-on-details {
527
+ flex: 1;
528
+ }
529
+
530
+ .add-on-name {
531
+ margin: 0 0 5px 0;
532
+ font-size: 16px;
533
+ font-weight: 600;
534
+ }
535
+
536
+ .add-on-description {
537
+ margin: 0;
538
+ font-size: 12px;
539
+ opacity: 0.7;
540
+ }
541
+
542
+ .add-on-price {
543
+ font-size: 14px;
544
+ font-weight: 600;
545
+ color: #00E0FF;
546
+ }
547
+
548
+ /* Subscription Summary */
549
+ .subscription-summary {
550
+ background: rgba(255, 255, 255, 0.05);
551
+ border-radius: 16px;
552
+ padding: 20px;
553
+ border: 1px solid rgba(0, 224, 255, 0.1);
554
+ }
555
+
556
+ .subscription-summary h3 {
557
+ margin: 0 0 20px 0;
558
+ font-size: 20px;
559
+ font-weight: 600;
560
+ }
561
+
562
+ .summary-details {
563
+ margin-bottom: 20px;
564
+ }
565
+
566
+ .summary-item {
567
+ display: flex;
568
+ justify-content: space-between;
569
+ padding: 10px 0;
570
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
571
+ }
572
+
573
+ .summary-total {
574
+ display: flex;
575
+ justify-content: space-between;
576
+ padding: 15px 0;
577
+ font-weight: 600;
578
+ font-size: 18px;
579
+ margin-top: 10px;
580
+ }
581
+
582
+ .total-price {
583
+ color: #00E0FF;
584
+ }
585
+
586
+ .summary-action {
587
+ text-align: center;
588
+ margin-top: 20px;
589
+ }
590
+
591
+ .subscribe-button {
592
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
593
+ border: none;
594
+ border-radius: 8px;
595
+ padding: 12px 30px;
596
+ color: #0B0B0F;
597
+ font-size: 16px;
598
+ font-weight: 600;
599
+ cursor: pointer;
600
+ transition: all 0.2s ease;
601
+ }
602
+
603
+ .subscribe-button:hover {
604
+ transform: translateY(-2px);
605
+ box-shadow: 0 5px 15px rgba(0, 224, 255, 0.3);
606
+ }
607
+
608
+ .subscribe-button:disabled {
609
+ background: rgba(255, 255, 255, 0.1);
610
+ color: rgba(255, 255, 255, 0.5);
611
+ cursor: not-allowed;
612
+ transform: none;
613
+ box-shadow: none;
614
+ }
615
+
616
+ /* Confirmation Modal */
617
+ .confirmation-modal {
618
+ position: fixed;
619
+ top: 0;
620
+ left: 0;
621
+ right: 0;
622
+ bottom: 0;
623
+ background-color: rgba(0, 0, 0, 0.8);
624
+ display: flex;
625
+ justify-content: center;
626
+ align-items: center;
627
+ z-index: 1000;
628
+ backdrop-filter: blur(5px);
629
+ }
630
+
631
+ .modal-content {
632
+ background-color: #0B0B0F;
633
+ border-radius: 16px;
634
+ padding: 30px;
635
+ border: 1px solid rgba(0, 224, 255, 0.3);
636
+ width: 90%;
637
+ max-width: 500px;
638
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
639
+ animation: modalFadeIn 0.3s ease;
640
+ }
641
+
642
+ @keyframes modalFadeIn {
643
+ from {
644
+ opacity: 0;
645
+ transform: translateY(20px);
646
+ }
647
+ to {
648
+ opacity: 1;
649
+ transform: translateY(0);
650
+ }
651
+ }
652
+
653
+ .modal-content h3 {
654
+ margin: 0 0 20px 0;
655
+ font-size: 24px;
656
+ font-weight: 600;
657
+ text-align: center;
658
+ }
659
+
660
+ .confirmation-details {
661
+ margin-bottom: 20px;
662
+ }
663
+
664
+ .confirmation-item {
665
+ display: flex;
666
+ justify-content: space-between;
667
+ padding: 10px 0;
668
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
669
+ }
670
+
671
+ .confirmation-item.total {
672
+ font-weight: 600;
673
+ font-size: 18px;
674
+ margin-top: 10px;
675
+ }
676
+
677
+ .item-value {
678
+ font-weight: 600;
679
+ }
680
+
681
+ .payment-method {
682
+ background-color: rgba(255, 255, 255, 0.05);
683
+ border-radius: 8px;
684
+ padding: 15px;
685
+ display: flex;
686
+ align-items: center;
687
+ margin-bottom: 20px;
688
+ }
689
+
690
+ .payment-label {
691
+ opacity: 0.7;
692
+ margin-right: 10px;
693
+ }
694
+
695
+ .payment-value {
696
+ flex: 1;
697
+ font-weight: 600;
698
+ }
699
+
700
+ .change-payment {
701
+ background: none;
702
+ border: none;
703
+ color: #00E0FF;
704
+ cursor: pointer;
705
+ font-size: 14px;
706
+ }
707
+
708
+ .confirmation-actions {
709
+ display: flex;
710
+ justify-content: space-between;
711
+ gap: 15px;
712
+ }
713
+
714
+ .cancel-button, .confirm-button {
715
+ flex: 1;
716
+ padding: 12px;
717
+ border-radius: 8px;
718
+ font-size: 16px;
719
+ font-weight: 600;
720
+ cursor: pointer;
721
+ transition: all 0.2s ease;
722
+ }
723
+
724
+ .cancel-button {
725
+ background-color: rgba(255, 255, 255, 0.1);
726
+ border: 1px solid rgba(255, 255, 255, 0.2);
727
+ color: white;
728
+ }
729
+
730
+ .confirm-button {
731
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
732
+ border: none;
733
+ color: #0B0B0F;
734
+ }
735
+
736
+ .cancel-button:hover, .confirm-button:hover {
737
+ transform: translateY(-2px);
738
+ }
739
+
740
+ /* Account Tab */
741
+ .account-tab {
742
+ display: flex;
743
+ flex-direction: column;
744
+ gap: 30px;
745
+ }
746
+
747
+ .account-overview {
748
+ display: grid;
749
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
750
+ gap: 20px;
751
+ }
752
+
753
+ .account-card {
754
+ background: rgba(255, 255, 255, 0.05);
755
+ border-radius: 16px;
756
+ padding: 20px;
757
+ border: 1px solid rgba(0, 224, 255, 0.1);
758
+ }
759
+
760
+ .account-card h3 {
761
+ margin: 0 0 20px 0;
762
+ font-size: 20px;
763
+ font-weight: 600;
764
+ }
765
+
766
+ .profile-details {
767
+ margin-bottom: 20px;
768
+ }
769
+
770
+ .profile-item {
771
+ display: flex;
772
+ justify-content: space-between;
773
+ padding: 10px 0;
774
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
775
+ }
776
+
777
+ .item-label {
778
+ opacity: 0.7;
779
+ }
780
+
781
+ .item-value {
782
+ font-weight: 600;
783
+ }
784
+
785
+ .edit-profile-button {
786
+ width: 100%;
787
+ background-color: rgba(0, 224, 255, 0.1);
788
+ border: 1px solid rgba(0, 224, 255, 0.2);
789
+ border-radius: 8px;
790
+ padding: 10px;
791
+ color: #00E0FF;
792
+ font-size: 14px;
793
+ cursor: pointer;
794
+ transition: all 0.2s ease;
795
+ }
796
+
797
+ .edit-profile-button:hover {
798
+ background-color: rgba(0, 224, 255, 0.2);
799
+ }
800
+
801
+ .balance-items {
802
+ display: flex;
803
+ justify-content: space-around;
804
+ margin-bottom: 20px;
805
+ }
806
+
807
+ .balance-item {
808
+ text-align: center;
809
+ }
810
+
811
+ .balance-icon {
812
+ font-size: 24px;
813
+ margin-bottom: 10px;
814
+ }
815
+
816
+ .balance-amount {
817
+ font-size: 32px;
818
+ font-weight: 700;
819
+ margin-bottom: 5px;
820
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
821
+ -webkit-background-clip: text;
822
+ background-clip: text;
823
+ -webkit-text-fill-color: transparent;
824
+ }
825
+
826
+ .balance-label {
827
+ font-size: 14px;
828
+ opacity: 0.7;
829
+ }
830
+
831
+ .balance-actions {
832
+ display: flex;
833
+ gap: 10px;
834
+ }
835
+
836
+ .balance-action {
837
+ flex: 1;
838
+ background-color: rgba(0, 224, 255, 0.1);
839
+ border: 1px solid rgba(0, 224, 255, 0.2);
840
+ border-radius: 8px;
841
+ padding: 10px;
842
+ color: #00E0FF;
843
+ font-size: 14px;
844
+ cursor: pointer;
845
+ transition: all 0.2s ease;
846
+ }
847
+
848
+ .balance-action:hover {
849
+ background-color: rgba(0, 224, 255, 0.2);
850
+ }
851
+
852
+ .payment-details {
853
+ margin-bottom: 20px;
854
+ }
855
+
856
+ .payment-method-item {
857
+ display: flex;
858
+ align-items: center;
859
+ background-color: rgba(255, 255, 255, 0.05);
860
+ border-radius: 8px;
861
+ padding: 15px;
862
+ margin-bottom: 20px;
863
+ }
864
+
865
+ .card-icon {
866
+ font-size: 24px;
867
+ margin-right: 15px;
868
+ }
869
+
870
+ .card-details {
871
+ flex: 1;
872
+ }
873
+
874
+ .card-type {
875
+ font-weight: 600;
876
+ margin-bottom: 5px;
877
+ }
878
+
879
+ .billing-date {
880
+ font-size: 12px;
881
+ opacity: 0.7;
882
+ }
883
+
884
+ .edit-payment-button {
885
+ background: none;
886
+ border: none;
887
+ color: #00E0FF;
888
+ cursor: pointer;
889
+ font-size: 14px;
890
+ }
891
+
892
+ .payment-history h4 {
893
+ margin: 0 0 15px 0;
894
+ font-size: 16px;
895
+ font-weight: 600;
896
+ }
897
+
898
+ .payment-history-item {
899
+ display: flex;
900
+ justify-content: space-between;
901
+ padding: 10px 0;
902
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
903
+ font-size: 14px;
904
+ }
905
+
906
+ .payment-date {
907
+ width: 100px;
908
+ }
909
+
910
+ .payment-description {
911
+ flex: 1;
912
+ padding: 0 15px;
913
+ }
914
+
915
+ .payment-amount {
916
+ font-weight: 600;
917
+ }
918
+
919
+ .view-all-button {
920
+ width: 100%;
921
+ background-color: rgba(255, 255, 255, 0.05);
922
+ border: 1px solid rgba(255, 255, 255, 0.1);
923
+ border-radius: 8px;
924
+ padding: 10px;
925
+ color: white;
926
+ font-size: 14px;
927
+ cursor: pointer;
928
+ transition: all 0.2s ease;
929
+ margin-top: 15px;
930
+ }
931
+
932
+ .view-all-button:hover {
933
+ background-color: rgba(255, 255, 255, 0.1);
934
+ }
935
+
936
+ .preferences-list {
937
+ margin-bottom: 20px;
938
+ }
939
+
940
+ .preference-item {
941
+ display: flex;
942
+ justify-content: space-between;
943
+ align-items: center;
944
+ padding: 15px 0;
945
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
946
+ }
947
+
948
+ .preference-label {
949
+ font-size: 14px;
950
+ }
951
+
952
+ .save-preferences-button {
953
+ width: 100%;
954
+ background-color: rgba(0, 224, 255, 0.1);
955
+ border: 1px solid rgba(0, 224, 255, 0.2);
956
+ border-radius: 8px;
957
+ padding: 10px;
958
+ color: #00E0FF;
959
+ font-size: 14px;
960
+ cursor: pointer;
961
+ transition: all 0.2s ease;
962
+ }
963
+
964
+ .save-preferences-button:hover {
965
+ background-color: rgba(0, 224, 255, 0.2);
966
+ }
967
+
968
+ /* Usage Tab */
969
+ .usage-tab {
970
+ display: flex;
971
+ flex-direction: column;
972
+ gap: 30px;
973
+ }
974
+
975
+ .usage-overview {
976
+ display: grid;
977
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
978
+ gap: 20px;
979
+ }
980
+
981
+ .usage-card {
982
+ background: rgba(255, 255, 255, 0.05);
983
+ border-radius: 16px;
984
+ padding: 20px;
985
+ border: 1px solid rgba(0, 224, 255, 0.1);
986
+ }
987
+
988
+ .usage-card h3 {
989
+ margin: 0 0 20px 0;
990
+ font-size: 20px;
991
+ font-weight: 600;
992
+ }
993
+
994
+ .usage-chart {
995
+ height: 200px;
996
+ margin-bottom: 20px;
997
+ display: flex;
998
+ justify-content: center;
999
+ align-items: flex-end;
1000
+ }
1001
+
1002
+ .chart-placeholder {
1003
+ width: 100%;
1004
+ height: 100%;
1005
+ display: flex;
1006
+ justify-content: center;
1007
+ align-items: flex-end;
1008
+ }
1009
+
1010
+ .bar-chart {
1011
+ width: 100%;
1012
+ height: 100%;
1013
+ display: flex;
1014
+ justify-content: space-around;
1015
+ align-items: flex-end;
1016
+ }
1017
+
1018
+ .chart-bar {
1019
+ width: 40px;
1020
+ background: linear-gradient(180deg, #00E0FF, #35F2DB);
1021
+ border-radius: 4px 4px 0 0;
1022
+ position: relative;
1023
+ transition: height 0.5s ease;
1024
+ }
1025
+
1026
+ .chart-bar.current {
1027
+ background: linear-gradient(180deg, #FFC107, #FFD54F);
1028
+ }
1029
+
1030
+ .bar-label {
1031
+ position: absolute;
1032
+ bottom: -25px;
1033
+ left: 50%;
1034
+ transform: translateX(-50%);
1035
+ font-size: 12px;
1036
+ opacity: 0.7;
1037
+ }
1038
+
1039
+ .usage-summary {
1040
+ display: grid;
1041
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
1042
+ gap: 15px;
1043
+ }
1044
+
1045
+ .summary-item {
1046
+ text-align: center;
1047
+ }
1048
+
1049
+ .summary-label {
1050
+ font-size: 14px;
1051
+ opacity: 0.7;
1052
+ margin-bottom: 5px;
1053
+ }
1054
+
1055
+ .summary-value {
1056
+ font-size: 18px;
1057
+ font-weight: 600;
1058
+ }
1059
+
1060
+ .token-balance {
1061
+ display: flex;
1062
+ flex-direction: column;
1063
+ align-items: center;
1064
+ margin-bottom: 20px;
1065
+ }
1066
+
1067
+ .token-icon {
1068
+ font-size: 36px;
1069
+ margin-bottom: 10px;
1070
+ }
1071
+
1072
+ .token-amount {
1073
+ font-size: 48px;
1074
+ font-weight: 700;
1075
+ margin-bottom: 5px;
1076
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
1077
+ -webkit-background-clip: text;
1078
+ background-clip: text;
1079
+ -webkit-text-fill-color: transparent;
1080
+ }
1081
+
1082
+ .token-label {
1083
+ font-size: 16px;
1084
+ opacity: 0.7;
1085
+ }
1086
+
1087
+ .token-details {
1088
+ margin-bottom: 20px;
1089
+ }
1090
+
1091
+ .token-detail {
1092
+ display: flex;
1093
+ justify-content: space-between;
1094
+ padding: 10px 0;
1095
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
1096
+ }
1097
+
1098
+ .detail-label {
1099
+ opacity: 0.7;
1100
+ }
1101
+
1102
+ .detail-value {
1103
+ font-weight: 600;
1104
+ }
1105
+
1106
+ .token-actions {
1107
+ display: flex;
1108
+ gap: 10px;
1109
+ }
1110
+
1111
+ .token-action {
1112
+ flex: 1;
1113
+ background-color: rgba(0, 224, 255, 0.1);
1114
+ border: 1px solid rgba(0, 224, 255, 0.2);
1115
+ border-radius: 8px;
1116
+ padding: 10px;
1117
+ color: #00E0FF;
1118
+ font-size: 14px;
1119
+ cursor: pointer;
1120
+ transition: all 0.2s ease;
1121
+ }
1122
+
1123
+ .token-action:hover {
1124
+ background-color: rgba(0, 224, 255, 0.2);
1125
+ }
1126
+
1127
+ .usage-history-section {
1128
+ background: rgba(255, 255, 255, 0.05);
1129
+ border-radius: 16px;
1130
+ padding: 20px;
1131
+ border: 1px solid rgba(0, 224, 255, 0.1);
1132
+ }
1133
+
1134
+ .usage-history-section h3 {
1135
+ margin: 0 0 20px 0;
1136
+ font-size: 20px;
1137
+ font-weight: 600;
1138
+ }
1139
+
1140
+ .activity-list {
1141
+ margin-bottom: 20px;
1142
+ }
1143
+
1144
+ .activity-item {
1145
+ display: flex;
1146
+ padding: 15px 0;
1147
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
1148
+ }
1149
+
1150
+ .activity-date {
1151
+ width: 120px;
1152
+ font-size: 14px;
1153
+ opacity: 0.7;
1154
+ }
1155
+
1156
+ .activity-details {
1157
+ flex: 1;
1158
+ }
1159
+
1160
+ .activity-type {
1161
+ font-weight: 600;
1162
+ margin-bottom: 5px;
1163
+ }
1164
+
1165
+ .activity-vehicle, .activity-location {
1166
+ font-size: 14px;
1167
+ opacity: 0.7;
1168
+ }
1169
+
1170
+ .activity-cost {
1171
+ text-align: right;
1172
+ min-width: 100px;
1173
+ }
1174
+
1175
+ .credit-cost {
1176
+ color: #FF5555;
1177
+ font-weight: 600;
1178
+ }
1179
+
1180
+ .token-cost {
1181
+ color: #FFC107;
1182
+ font-weight: 600;
1183
+ }
1184
+
1185
+ .view-all-activity {
1186
+ width: 100%;
1187
+ background-color: rgba(255, 255, 255, 0.05);
1188
+ border: 1px solid rgba(255, 255, 255, 0.1);
1189
+ border-radius: 8px;
1190
+ padding: 10px;
1191
+ color: white;
1192
+ font-size: 14px;
1193
+ cursor: pointer;
1194
+ transition: all 0.2s ease;
1195
+ }
1196
+
1197
+ .view-all-activity:hover {
1198
+ background-color: rgba(255, 255, 255, 0.1);
1199
+ }
1200
+
1201
+ .usage-insights {
1202
+ background: rgba(255, 255, 255, 0.05);
1203
+ border-radius: 16px;
1204
+ padding: 20px;
1205
+ border: 1px solid rgba(0, 224, 255, 0.1);
1206
+ }
1207
+
1208
+ .usage-insights h3 {
1209
+ margin: 0 0 20px 0;
1210
+ font-size: 20px;
1211
+ font-weight: 600;
1212
+ }
1213
+
1214
+ .insights-grid {
1215
+ display: grid;
1216
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
1217
+ gap: 20px;
1218
+ }
1219
+
1220
+ .insight-card {
1221
+ background-color: rgba(255, 255, 255, 0.05);
1222
+ border-radius: 12px;
1223
+ padding: 20px;
1224
+ text-align: center;
1225
+ border: 1px solid rgba(255, 255, 255, 0.1);
1226
+ }
1227
+
1228
+ .insight-icon {
1229
+ font-size: 28px;
1230
+ margin-bottom: 10px;
1231
+ }
1232
+
1233
+ .insight-title {
1234
+ font-size: 14px;
1235
+ opacity: 0.7;
1236
+ margin-bottom: 10px;
1237
+ }
1238
+
1239
+ .insight-value {
1240
+ font-size: 24px;
1241
+ font-weight: 700;
1242
+ margin-bottom: 5px;
1243
+ background: linear-gradient(90deg, #00E0FF, #35F2DB);
1244
+ -webkit-background-clip: text;
1245
+ background-clip: text;
1246
+ -webkit-text-fill-color: transparent;
1247
+ }
1248
+
1249
+ .insight-detail {
1250
+ font-size: 12px;
1251
+ opacity: 0.7;
1252
+ }
1253
+
1254
+ /* Compare Tab */
1255
+ .compare-tab {
1256
+ display: flex;
1257
+ flex-direction: column;
1258
+ gap: 30px;
1259
+ }
1260
+
1261
+ .feature-comparison {
1262
+ background: rgba(255, 255, 255, 0.05);
1263
+ border-radius: 16px;
1264
+ padding: 20px;
1265
+ border: 1px solid rgba(0, 224, 255, 0.1);
1266
+ }
1267
+
1268
+ .feature-comparison h3 {
1269
+ margin: 0 0 20px 0;
1270
+ font-size: 20px;
1271
+ font-weight: 600;
1272
+ }
1273
+
1274
+ .comparison-table {
1275
+ width: 100%;
1276
+ overflow-x: auto;
1277
+ }
1278
+
1279
+ .comparison-header {
1280
+ display: flex;
1281
+ background-color: rgba(0, 0, 0, 0.2);
1282
+ padding: 15px;
1283
+ border-radius: 8px 8px 0 0;
1284
+ font-weight: 600;
1285
+ }
1286
+
1287
+ .comparison-row {
1288
+ display: flex;
1289
+ padding: 15px;
1290
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
1291
+ }
1292
+
1293
+ .comparison-row:nth-child(even) {
1294
+ background-color: rgba(255, 255, 255, 0.02);
1295
+ }
1296
+
1297
+ .feature-name {
1298
+ width: 200px;
1299
+ flex-shrink: 0;
1300
+ }
1301
+
1302
+ .tier-column {
1303
+ flex: 1;
1304
+ min-width: 120px;
1305
+ text-align: center;
1306
+ }
1307
+
1308
+ .feature-included {
1309
+ color: #35F2DB;
1310
+ }
1311
+
1312
+ .check-icon {
1313
+ margin-right: 5px;
1314
+ }
1315
+
1316
+ .feature-details {
1317
+ font-size: 12px;
1318
+ opacity: 0.7;
1319
+ display: block;
1320
+ }
1321
+
1322
+ .feature-excluded {
1323
+ opacity: 0.5;
1324
+ }
1325
+
1326
+ .plan-benefits {
1327
+ background: rgba(255, 255, 255, 0.05);
1328
+ border-radius: 16px;
1329
+ padding: 20px;
1330
+ border: 1px solid rgba(0, 224, 255, 0.1);
1331
+ }
1332
+
1333
+ .plan-benefits h3 {
1334
+ margin: 0 0 20px 0;
1335
+ font-size: 20px;
1336
+ font-weight: 600;
1337
+ }
1338
+
1339
+ .benefits-grid {
1340
+ display: grid;
1341
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
1342
+ gap: 20px;
1343
+ }
1344
+
1345
+ .benefit-card {
1346
+ background-color: rgba(255, 255, 255, 0.05);
1347
+ border-radius: 12px;
1348
+ padding: 20px;
1349
+ border: 1px solid rgba(255, 255, 255, 0.1);
1350
+ }
1351
+
1352
+ .benefit-icon {
1353
+ font-size: 28px;
1354
+ margin-bottom: 10px;
1355
+ }
1356
+
1357
+ .benefit-card h4 {
1358
+ margin: 0 0 10px 0;
1359
+ font-size: 18px;
1360
+ font-weight: 600;
1361
+ }
1362
+
1363
+ .benefit-card p {
1364
+ margin: 0;
1365
+ font-size: 14px;
1366
+ opacity: 0.8;
1367
+ line-height: 1.5;
1368
+ }
1369
+
1370
+ .faq-section {
1371
+ background: rgba(255, 255, 255, 0.05);
1372
+ border-radius: 16px;
1373
+ padding: 20px;
1374
+ border: 1px solid rgba(0, 224, 255, 0.1);
1375
+ }
1376
+
1377
+ .faq-section h3 {
1378
+ margin: 0 0 20px 0;
1379
+ font-size: 20px;
1380
+ font-weight: 600;
1381
+ }
1382
+
1383
+ .faq-item {
1384
+ margin-bottom: 15px;
1385
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
1386
+ padding-bottom: 15px;
1387
+ }
1388
+
1389
+ .faq-item:last-child {
1390
+ margin-bottom: 0;
1391
+ border-bottom: none;
1392
+ padding-bottom: 0;
1393
+ }
1394
+
1395
+ .faq-question {
1396
+ font-size: 16px;
1397
+ font-weight: 600;
1398
+ margin-bottom: 10px;
1399
+ color: #00E0FF;
1400
+ }
1401
+
1402
+ .faq-answer {
1403
+ font-size: 14px;
1404
+ opacity: 0.8;
1405
+ line-height: 1.5;
1406
+ }
1407
+
1408
+ /* Footer */
1409
+ .portal-footer {
1410
+ display: flex;
1411
+ justify-content: space-between;
1412
+ align-items: center;
1413
+ padding: 20px;
1414
+ background-color: rgba(20, 20, 30, 0.8);
1415
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
1416
+ margin-top: 30px;
1417
+ }
1418
+
1419
+ .footer-info {
1420
+ display: flex;
1421
+ flex-direction: column;
1422
+ gap: 5px;
1423
+ }
1424
+
1425
+ .footer-info span {
1426
+ font-size: 12px;
1427
+ opacity: 0.7;
1428
+ }
1429
+
1430
+ .footer-links {
1431
+ display: flex;
1432
+ gap: 20px;
1433
+ }
1434
+
1435
+ .footer-link {
1436
+ font-size: 12px;
1437
+ opacity: 0.7;
1438
+ text-decoration: none;
1439
+ color: white;
1440
+ transition: all 0.2s ease;
1441
+ }
1442
+
1443
+ .footer-link:hover {
1444
+ opacity: 1;
1445
+ color: #00E0FF;
1446
+ }
1447
+
1448
+ /* Responsive Adjustments */
1449
+ @media (max-width: 768px) {
1450
+ .portal-header {
1451
+ flex-direction: column;
1452
+ align-items: flex-start;
1453
+ gap: 15px;
1454
+ }
1455
+
1456
+ .current-plan-banner {
1457
+ flex-direction: column;
1458
+ align-items: flex-start;
1459
+ }
1460
+
1461
+ .subscription-tiers {
1462
+ grid-template-columns: 1fr;
1463
+ }
1464
+
1465
+ .add-ons-grid {
1466
+ grid-template-columns: 1fr;
1467
+ }
1468
+
1469
+ .confirmation-actions {
1470
+ flex-direction: column;
1471
+ }
1472
+
1473
+ .account-overview {
1474
+ grid-template-columns: 1fr;
1475
+ }
1476
+
1477
+ .usage-overview {
1478
+ grid-template-columns: 1fr;
1479
+ }
1480
+
1481
+ .insights-grid {
1482
+ grid-template-columns: 1fr;
1483
+ }
1484
+
1485
+ .benefits-grid {
1486
+ grid-template-columns: 1fr;
1487
+ }
1488
+
1489
+ .portal-footer {
1490
+ flex-direction: column;
1491
+ gap: 15px;
1492
+ }
1493
+
1494
+ .footer-links {
1495
+ width: 100%;
1496
+ justify-content: space-between;
1497
+ }
1498
+ }
SubscriptionPortal.jsx ADDED
@@ -0,0 +1,771 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useState, useEffect } from 'react';
2
+ import './SubscriptionPortal.css';
3
+
4
+ // Mock data for demonstration purposes
5
+ const mockSubscriptionData = {
6
+ tiers: [
7
+ {
8
+ id: 1,
9
+ name: "FlexRide",
10
+ price: 499,
11
+ description: "Basic access to Unity Fleet vehicles with pay-per-use model",
12
+ features: [
13
+ { name: "24/7 Vehicle Access", included: true },
14
+ { name: "Basic Charging Access", included: true },
15
+ { name: "Vehicle Variety", included: true, details: "Sedans & Compact SUVs" },
16
+ { name: "Monthly Credits", included: true, details: "500 credits" },
17
+ { name: "Reservation Priority", included: false },
18
+ { name: "Premium Charging", included: false },
19
+ { name: "Lounge Access", included: false },
20
+ { name: "Home Charging Setup", included: false },
21
+ { name: "Dedicated Vehicle", included: false },
22
+ { name: "ChainLink Tokens", included: true, details: "5 tokens/month" }
23
+ ],
24
+ popular: false,
25
+ color: "#00E0FF"
26
+ },
27
+ {
28
+ id: 2,
29
+ name: "Take-Home",
30
+ price: 1299,
31
+ description: "Dedicated vehicle for personal use with enhanced benefits",
32
+ features: [
33
+ { name: "24/7 Vehicle Access", included: true },
34
+ { name: "Basic Charging Access", included: true },
35
+ { name: "Vehicle Variety", included: true, details: "All Vehicle Types" },
36
+ { name: "Monthly Credits", included: true, details: "1500 credits" },
37
+ { name: "Reservation Priority", included: true },
38
+ { name: "Premium Charging", included: true },
39
+ { name: "Lounge Access", included: true, details: "Standard Access" },
40
+ { name: "Home Charging Setup", included: true },
41
+ { name: "Dedicated Vehicle", included: true },
42
+ { name: "ChainLink Tokens", included: true, details: "15 tokens/month" }
43
+ ],
44
+ popular: true,
45
+ color: "#35F2DB"
46
+ },
47
+ {
48
+ id: 3,
49
+ name: "All-Access",
50
+ price: 1999,
51
+ description: "Complete mobility solution with premium benefits and maximum flexibility",
52
+ features: [
53
+ { name: "24/7 Vehicle Access", included: true },
54
+ { name: "Basic Charging Access", included: true },
55
+ { name: "Vehicle Variety", included: true, details: "All Vehicle Types + Premium" },
56
+ { name: "Monthly Credits", included: true, details: "Unlimited" },
57
+ { name: "Reservation Priority", included: true },
58
+ { name: "Premium Charging", included: true },
59
+ { name: "Lounge Access", included: true, details: "VIP Access" },
60
+ { name: "Home Charging Setup", included: true },
61
+ { name: "Dedicated Vehicle", included: true, details: "Multiple Vehicles" },
62
+ { name: "ChainLink Tokens", included: true, details: "30 tokens/month" }
63
+ ],
64
+ popular: false,
65
+ color: "#FFC107"
66
+ }
67
+ ],
68
+ addOns: [
69
+ { id: 101, name: "Additional Driver", price: 99, description: "Add an additional authorized driver to your account" },
70
+ { id: 102, name: "Premium Insurance", price: 149, description: "Enhanced insurance coverage with lower deductible" },
71
+ { id: 103, name: "Charging Credit Pack", price: 199, description: "Additional 500 charging credits" },
72
+ { id: 104, name: "Road Trip Package", price: 249, description: "Extended range access and premium roadside assistance" },
73
+ { id: 105, name: "Token Booster", price: 299, description: "Additional 10 ChainLink tokens per month" }
74
+ ],
75
+ userProfile: {
76
+ name: "Matthew Lamb",
77
+ email: "[email protected]",
78
+ currentPlan: "Take-Home",
79
+ memberSince: "January 2025",
80
+ credits: 1250,
81
+ tokens: 45,
82
+ paymentMethod: "Visa ending in 4242",
83
+ nextBillingDate: "May 1, 2025"
84
+ },
85
+ usageHistory: [
86
+ { date: "April 5, 2025", activity: "Vehicle Reservation", vehicle: "Tesla Model 3", credits: 150, location: "Downtown Hub" },
87
+ { date: "April 3, 2025", activity: "Premium Charging", vehicle: "Tesla Model 3", credits: 75, location: "Westside Station" },
88
+ { date: "March 28, 2025", activity: "Lounge Access", vehicle: null, credits: 50, location: "University Hub" },
89
+ { date: "March 25, 2025", activity: "Vehicle Reservation", vehicle: "Tesla Model Y", credits: 200, location: "Downtown Hub" },
90
+ { date: "March 20, 2025", activity: "Token Redemption", vehicle: null, credits: 0, tokens: 10, location: null }
91
+ ]
92
+ };
93
+
94
+ function SubscriptionPortal() {
95
+ const [activeTab, setActiveTab] = useState('plans');
96
+ const [loading, setLoading] = useState(true);
97
+ const [selectedTier, setSelectedTier] = useState(null);
98
+ const [selectedAddOns, setSelectedAddOns] = useState([]);
99
+ const [billingCycle, setBillingCycle] = useState('monthly');
100
+ const [showConfirmation, setShowConfirmation] = useState(false);
101
+
102
+ useEffect(() => {
103
+ // Simulate loading
104
+ const timer = setTimeout(() => {
105
+ setLoading(false);
106
+ // Set the user's current plan as selected
107
+ const currentPlan = mockSubscriptionData.tiers.find(
108
+ tier => tier.name === mockSubscriptionData.userProfile.currentPlan
109
+ );
110
+ setSelectedTier(currentPlan);
111
+ }, 1500);
112
+
113
+ return () => clearTimeout(timer);
114
+ }, []);
115
+
116
+ const handleTierSelect = (tier) => {
117
+ setSelectedTier(tier);
118
+ setShowConfirmation(false);
119
+ };
120
+
121
+ const handleAddOnToggle = (addOn) => {
122
+ if (selectedAddOns.some(item => item.id === addOn.id)) {
123
+ setSelectedAddOns(selectedAddOns.filter(item => item.id !== addOn.id));
124
+ } else {
125
+ setSelectedAddOns([...selectedAddOns, addOn]);
126
+ }
127
+ setShowConfirmation(false);
128
+ };
129
+
130
+ const handleBillingCycleChange = (cycle) => {
131
+ setBillingCycle(cycle);
132
+ setShowConfirmation(false);
133
+ };
134
+
135
+ const calculateTotalPrice = () => {
136
+ if (!selectedTier) return 0;
137
+
138
+ let basePrice = selectedTier.price;
139
+ if (billingCycle === 'annual') {
140
+ basePrice = basePrice * 10; // 2 months free for annual billing
141
+ }
142
+
143
+ const addOnsTotal = selectedAddOns.reduce((sum, addOn) => {
144
+ let addOnPrice = addOn.price;
145
+ if (billingCycle === 'annual') {
146
+ addOnPrice = addOnPrice * 10; // 2 months free for annual billing
147
+ }
148
+ return sum + addOnPrice;
149
+ }, 0);
150
+
151
+ return basePrice + addOnsTotal;
152
+ };
153
+
154
+ const handleSubscribe = () => {
155
+ setShowConfirmation(true);
156
+ };
157
+
158
+ const renderFeatureComparison = () => {
159
+ // Get all unique features across all tiers
160
+ const allFeatures = Array.from(
161
+ new Set(
162
+ mockSubscriptionData.tiers.flatMap(tier =>
163
+ tier.features.map(feature => feature.name)
164
+ )
165
+ )
166
+ );
167
+
168
+ return (
169
+ <div className="feature-comparison">
170
+ <h3>Feature Comparison</h3>
171
+ <div className="comparison-table">
172
+ <div className="comparison-header">
173
+ <div className="feature-name">Feature</div>
174
+ {mockSubscriptionData.tiers.map(tier => (
175
+ <div key={tier.id} className="tier-column">
176
+ {tier.name}
177
+ </div>
178
+ ))}
179
+ </div>
180
+
181
+ {allFeatures.map((featureName, index) => (
182
+ <div key={index} className="comparison-row">
183
+ <div className="feature-name">{featureName}</div>
184
+ {mockSubscriptionData.tiers.map(tier => {
185
+ const feature = tier.features.find(f => f.name === featureName);
186
+ return (
187
+ <div key={tier.id} className="tier-column">
188
+ {feature && feature.included ? (
189
+ <div className="feature-included">
190
+ <span className="check-icon">✓</span>
191
+ {feature.details && <span className="feature-details">{feature.details}</span>}
192
+ </div>
193
+ ) : (
194
+ <div className="feature-excluded">—</div>
195
+ )}
196
+ </div>
197
+ );
198
+ })}
199
+ </div>
200
+ ))}
201
+ </div>
202
+ </div>
203
+ );
204
+ };
205
+
206
+ if (loading) {
207
+ return (
208
+ <div className="subscription-portal loading">
209
+ <div className="loading-logo">
210
+ <img src="/images/unity_fleet_logo.png" alt="Unity Fleet" />
211
+ <div className="loading-pulse"></div>
212
+ </div>
213
+ <p>Loading Subscription Portal...</p>
214
+ </div>
215
+ );
216
+ }
217
+
218
+ return (
219
+ <div className="subscription-portal">
220
+ <header className="portal-header">
221
+ <div className="portal-title">
222
+ <h1>Subscription Portal</h1>
223
+ <span className="portal-subtitle">Unity Fleet Membership</span>
224
+ </div>
225
+
226
+ <div className="user-profile">
227
+ <div className="profile-avatar">
228
+ <img src="/images/profile_avatar.png" alt="Profile" />
229
+ </div>
230
+ <div className="profile-info">
231
+ <div className="profile-name">{mockSubscriptionData.userProfile.name}</div>
232
+ <div className="profile-plan">{mockSubscriptionData.userProfile.currentPlan} Member</div>
233
+ </div>
234
+ </div>
235
+ </header>
236
+
237
+ <div className="portal-navigation">
238
+ <button
239
+ className={`nav-button ${activeTab === 'plans' ? 'active' : ''}`}
240
+ onClick={() => setActiveTab('plans')}
241
+ >
242
+ Subscription Plans
243
+ </button>
244
+ <button
245
+ className={`nav-button ${activeTab === 'account' ? 'active' : ''}`}
246
+ onClick={() => setActiveTab('account')}
247
+ >
248
+ My Account
249
+ </button>
250
+ <button
251
+ className={`nav-button ${activeTab === 'usage' ? 'active' : ''}`}
252
+ onClick={() => setActiveTab('usage')}
253
+ >
254
+ Usage History
255
+ </button>
256
+ <button
257
+ className={`nav-button ${activeTab === 'compare' ? 'active' : ''}`}
258
+ onClick={() => setActiveTab('compare')}
259
+ >
260
+ Plan Comparison
261
+ </button>
262
+ </div>
263
+
264
+ <main className="portal-content">
265
+ {activeTab === 'plans' && (
266
+ <div className="plans-tab">
267
+ <div className="current-plan-banner">
268
+ <div className="banner-content">
269
+ <h3>Your Current Plan: {mockSubscriptionData.userProfile.currentPlan}</h3>
270
+ <p>Member since {mockSubscriptionData.userProfile.memberSince} • Next billing date: {mockSubscriptionData.userProfile.nextBillingDate}</p>
271
+ </div>
272
+ <div className="banner-actions">
273
+ <button className="banner-button">Manage Payment</button>
274
+ </div>
275
+ </div>
276
+
277
+ <div className="billing-toggle">
278
+ <span className={`billing-option ${billingCycle === 'monthly' ? 'active' : ''}`}>Monthly</span>
279
+ <label className="toggle-switch">
280
+ <input
281
+ type="checkbox"
282
+ checked={billingCycle === 'annual'}
283
+ onChange={() => handleBillingCycleChange(billingCycle === 'monthly' ? 'annual' : 'monthly')}
284
+ />
285
+ <span className="toggle-slider"></span>
286
+ </label>
287
+ <span className={`billing-option ${billingCycle === 'annual' ? 'active' : ''}`}>
288
+ Annual
289
+ <span className="discount-badge">Save 16%</span>
290
+ </span>
291
+ </div>
292
+
293
+ <div className="subscription-tiers">
294
+ {mockSubscriptionData.tiers.map(tier => (
295
+ <div
296
+ key={tier.id}
297
+ className={`tier-card ${selectedTier && selectedTier.id === tier.id ? 'selected' : ''} ${tier.popular ? 'popular' : ''}`}
298
+ onClick={() => handleTierSelect(tier)}
299
+ >
300
+ {tier.popular && <div className="popular-badge">Most Popular</div>}
301
+ <div className="tier-header" style={{ background: `linear-gradient(135deg, ${tier.color}22, ${tier.color}11)` }}>
302
+ <h3 className="tier-name">{tier.name}</h3>
303
+ <div className="tier-price">
304
+ <span className="price-amount">${tier.price}</span>
305
+ <span className="price-period">/{billingCycle === 'monthly' ? 'mo' : 'yr'}</span>
306
+ </div>
307
+ {billingCycle === 'annual' && (
308
+ <div className="annual-savings">
309
+ Save ${tier.price * 2} with annual billing
310
+ </div>
311
+ )}
312
+ </div>
313
+
314
+ <div className="tier-description">{tier.description}</div>
315
+
316
+ <ul className="tier-features">
317
+ {tier.features.slice(0, 5).map((feature, index) => (
318
+ <li key={index} className={feature.included ? 'included' : 'excluded'}>
319
+ <span className="feature-icon">{feature.included ? '✓' : '—'}</span>
320
+ <span className="feature-text">
321
+ {feature.name}
322
+ {feature.included && feature.details && (
323
+ <span className="feature-details"> ({feature.details})</span>
324
+ )}
325
+ </span>
326
+ </li>
327
+ ))}
328
+ </ul>
329
+
330
+ <div className="tier-action">
331
+ {mockSubscriptionData.userProfile.currentPlan === tier.name ? (
332
+ <button className="current-plan-button">Current Plan</button>
333
+ ) : (
334
+ <button
335
+ className="select-plan-button"
336
+ style={{ background: `linear-gradient(90deg, ${tier.color}, ${tier.color}AA)` }}
337
+ >
338
+ Select Plan
339
+ </button>
340
+ )}
341
+ </div>
342
+ </div>
343
+ ))}
344
+ </div>
345
+
346
+ {selectedTier && (
347
+ <div className="add-ons-section">
348
+ <h3>Available Add-Ons</h3>
349
+ <div className="add-ons-grid">
350
+ {mockSubscriptionData.addOns.map(addOn => (
351
+ <div
352
+ key={addOn.id}
353
+ className={`add-on-card ${selectedAddOns.some(item => item.id === addOn.id) ? 'selected' : ''}`}
354
+ onClick={() => handleAddOnToggle(addOn)}
355
+ >
356
+ <div className="add-on-checkbox">
357
+ <div className="checkbox-inner"></div>
358
+ </div>
359
+ <div className="add-on-details">
360
+ <h4 className="add-on-name">{addOn.name}</h4>
361
+ <p className="add-on-description">{addOn.description}</p>
362
+ </div>
363
+ <div className="add-on-price">
364
+ ${addOn.price}/{billingCycle === 'monthly' ? 'mo' : 'yr'}
365
+ </div>
366
+ </div>
367
+ ))}
368
+ </div>
369
+ </div>
370
+ )}
371
+
372
+ {selectedTier && (
373
+ <div className="subscription-summary">
374
+ <h3>Subscription Summary</h3>
375
+ <div className="summary-details">
376
+ <div className="summary-item">
377
+ <span className="item-name">{selectedTier.name} Plan</span>
378
+ <span className="item-price">
379
+ ${billingCycle === 'monthly' ? selectedTier.price : selectedTier.price * 10}/
380
+ {billingCycle === 'monthly' ? 'mo' : 'yr'}
381
+ </span>
382
+ </div>
383
+
384
+ {selectedAddOns.map(addOn => (
385
+ <div key={addOn.id} className="summary-item">
386
+ <span className="item-name">{addOn.name}</span>
387
+ <span className="item-price">
388
+ ${billingCycle === 'monthly' ? addOn.price : addOn.price * 10}/
389
+ {billingCycle === 'monthly' ? 'mo' : 'yr'}
390
+ </span>
391
+ </div>
392
+ ))}
393
+
394
+ <div className="summary-total">
395
+ <span className="total-label">Total</span>
396
+ <span className="total-price">
397
+ ${calculateTotalPrice()}/{billingCycle === 'monthly' ? 'mo' : 'yr'}
398
+ </span>
399
+ </div>
400
+ </div>
401
+
402
+ <div className="summary-action">
403
+ <button
404
+ className="subscribe-button"
405
+ onClick={handleSubscribe}
406
+ disabled={selectedTier.name === mockSubscriptionData.userProfile.currentPlan && selectedAddOns.length === 0}
407
+ >
408
+ {selectedTier.name === mockSubscriptionData.userProfile.currentPlan ? 'Update Subscription' : 'Subscribe Now'}
409
+ </button>
410
+ </div>
411
+ </div>
412
+ )}
413
+
414
+ {showConfirmation && (
415
+ <div className="confirmation-modal">
416
+ <div className="modal-content">
417
+ <h3>Confirm Your Subscription</h3>
418
+
419
+ <div className="confirmation-details">
420
+ <div className="confirmation-item">
421
+ <span className="item-label">Selected Plan:</span>
422
+ <span className="item-value">{selectedTier.name}</span>
423
+ </div>
424
+ <div className="confirmation-item">
425
+ <span className="item-label">Billing Cycle:</span>
426
+ <span className="item-value">{billingCycle === 'monthly' ? 'Monthly' : 'Annual'}</span>
427
+ </div>
428
+ {selectedAddOns.length > 0 && (
429
+ <div className="confirmation-item">
430
+ <span className="item-label">Add-Ons:</span>
431
+ <span className="item-value">{selectedAddOns.map(addOn => addOn.name).join(', ')}</span>
432
+ </div>
433
+ )}
434
+ <div className="confirmation-item total">
435
+ <span className="item-label">Total Price:</span>
436
+ <span className="item-value">${calculateTotalPrice()}/{billingCycle === 'monthly' ? 'mo' : 'yr'}</span>
437
+ </div>
438
+ </div>
439
+
440
+ <div className="payment-method">
441
+ <span className="payment-label">Payment Method:</span>
442
+ <span className="payment-value">{mockSubscriptionData.userProfile.paymentMethod}</span>
443
+ <button className="change-payment">Change</button>
444
+ </div>
445
+
446
+ <div className="confirmation-actions">
447
+ <button className="cancel-button" onClick={() => setShowConfirmation(false)}>Cancel</button>
448
+ <button className="confirm-button">Confirm Subscription</button>
449
+ </div>
450
+ </div>
451
+ </div>
452
+ )}
453
+ </div>
454
+ )}
455
+
456
+ {activeTab === 'account' && (
457
+ <div className="account-tab">
458
+ <div className="account-overview">
459
+ <div className="account-card profile">
460
+ <h3>Profile Information</h3>
461
+ <div className="profile-details">
462
+ <div className="profile-item">
463
+ <span className="item-label">Name:</span>
464
+ <span className="item-value">{mockSubscriptionData.userProfile.name}</span>
465
+ </div>
466
+ <div className="profile-item">
467
+ <span className="item-label">Email:</span>
468
+ <span className="item-value">{mockSubscriptionData.userProfile.email}</span>
469
+ </div>
470
+ <div className="profile-item">
471
+ <span className="item-label">Member Since:</span>
472
+ <span className="item-value">{mockSubscriptionData.userProfile.memberSince}</span>
473
+ </div>
474
+ <div className="profile-item">
475
+ <span className="item-label">Current Plan:</span>
476
+ <span className="item-value">{mockSubscriptionData.userProfile.currentPlan}</span>
477
+ </div>
478
+ </div>
479
+ <button className="edit-profile-button">Edit Profile</button>
480
+ </div>
481
+
482
+ <div className="account-card balance">
483
+ <h3>Account Balance</h3>
484
+ <div className="balance-items">
485
+ <div className="balance-item credits">
486
+ <div className="balance-icon">🔋</div>
487
+ <div className="balance-amount">{mockSubscriptionData.userProfile.credits}</div>
488
+ <div className="balance-label">Available Credits</div>
489
+ </div>
490
+ <div className="balance-item tokens">
491
+ <div className="balance-icon">⬡</div>
492
+ <div className="balance-amount">{mockSubscriptionData.userProfile.tokens}</div>
493
+ <div className="balance-label">ChainLink Tokens</div>
494
+ </div>
495
+ </div>
496
+ <div className="balance-actions">
497
+ <button className="balance-action">Purchase Credits</button>
498
+ <button className="balance-action">Manage Tokens</button>
499
+ </div>
500
+ </div>
501
+ </div>
502
+
503
+ <div className="account-card payment">
504
+ <h3>Payment Information</h3>
505
+ <div className="payment-details">
506
+ <div className="payment-method-item">
507
+ <div className="card-icon">💳</div>
508
+ <div className="card-details">
509
+ <div className="card-type">{mockSubscriptionData.userProfile.paymentMethod}</div>
510
+ <div className="billing-date">Next billing: {mockSubscriptionData.userProfile.nextBillingDate}</div>
511
+ </div>
512
+ <button className="edit-payment-button">Edit</button>
513
+ </div>
514
+ </div>
515
+ <div className="payment-history">
516
+ <h4>Recent Payments</h4>
517
+ <div className="payment-history-item">
518
+ <div className="payment-date">April 1, 2025</div>
519
+ <div className="payment-description">Monthly Subscription - {mockSubscriptionData.userProfile.currentPlan}</div>
520
+ <div className="payment-amount">$1,299.00</div>
521
+ </div>
522
+ <div className="payment-history-item">
523
+ <div className="payment-date">March 1, 2025</div>
524
+ <div className="payment-description">Monthly Subscription - {mockSubscriptionData.userProfile.currentPlan}</div>
525
+ <div className="payment-amount">$1,299.00</div>
526
+ </div>
527
+ <div className="payment-history-item">
528
+ <div className="payment-date">February 1, 2025</div>
529
+ <div className="payment-description">Monthly Subscription - {mockSubscriptionData.userProfile.currentPlan}</div>
530
+ <div className="payment-amount">$1,299.00</div>
531
+ </div>
532
+ </div>
533
+ <button className="view-all-button">View All Payments</button>
534
+ </div>
535
+
536
+ <div className="account-card preferences">
537
+ <h3>Account Preferences</h3>
538
+ <div className="preferences-list">
539
+ <div className="preference-item">
540
+ <div className="preference-label">Email Notifications</div>
541
+ <label className="toggle-switch">
542
+ <input type="checkbox" defaultChecked />
543
+ <span className="toggle-slider"></span>
544
+ </label>
545
+ </div>
546
+ <div className="preference-item">
547
+ <div className="preference-label">SMS Alerts</div>
548
+ <label className="toggle-switch">
549
+ <input type="checkbox" defaultChecked />
550
+ <span className="toggle-slider"></span>
551
+ </label>
552
+ </div>
553
+ <div className="preference-item">
554
+ <div className="preference-label">Reservation Reminders</div>
555
+ <label className="toggle-switch">
556
+ <input type="checkbox" defaultChecked />
557
+ <span className="toggle-slider"></span>
558
+ </label>
559
+ </div>
560
+ <div className="preference-item">
561
+ <div className="preference-label">Special Offers</div>
562
+ <label className="toggle-switch">
563
+ <input type="checkbox" />
564
+ <span className="toggle-slider"></span>
565
+ </label>
566
+ </div>
567
+ </div>
568
+ <button className="save-preferences-button">Save Preferences</button>
569
+ </div>
570
+ </div>
571
+ )}
572
+
573
+ {activeTab === 'usage' && (
574
+ <div className="usage-tab">
575
+ <div className="usage-overview">
576
+ <div className="usage-card credits">
577
+ <h3>Credit Usage</h3>
578
+ <div className="usage-chart">
579
+ <div className="chart-placeholder">
580
+ <div className="bar-chart">
581
+ <div className="chart-bar" style={{ height: '60%' }}>
582
+ <div className="bar-label">Jan</div>
583
+ </div>
584
+ <div className="chart-bar" style={{ height: '75%' }}>
585
+ <div className="bar-label">Feb</div>
586
+ </div>
587
+ <div className="chart-bar" style={{ height: '45%' }}>
588
+ <div className="bar-label">Mar</div>
589
+ </div>
590
+ <div className="chart-bar current" style={{ height: '30%' }}>
591
+ <div className="bar-label">Apr</div>
592
+ </div>
593
+ </div>
594
+ </div>
595
+ </div>
596
+ <div className="usage-summary">
597
+ <div className="summary-item">
598
+ <div className="summary-label">Monthly Allocation</div>
599
+ <div className="summary-value">1,500 credits</div>
600
+ </div>
601
+ <div className="summary-item">
602
+ <div className="summary-label">Used This Month</div>
603
+ <div className="summary-value">250 credits</div>
604
+ </div>
605
+ <div className="summary-item">
606
+ <div className="summary-label">Remaining</div>
607
+ <div className="summary-value">1,250 credits</div>
608
+ </div>
609
+ </div>
610
+ </div>
611
+
612
+ <div className="usage-card tokens">
613
+ <h3>Token Balance</h3>
614
+ <div className="token-balance">
615
+ <div className="token-icon">⬡</div>
616
+ <div className="token-amount">{mockSubscriptionData.userProfile.tokens}</div>
617
+ <div className="token-label">ChainLink Tokens</div>
618
+ </div>
619
+ <div className="token-details">
620
+ <div className="token-detail">
621
+ <span className="detail-label">Monthly Accrual:</span>
622
+ <span className="detail-value">15 tokens</span>
623
+ </div>
624
+ <div className="token-detail">
625
+ <span className="detail-label">Next Distribution:</span>
626
+ <span className="detail-value">May 1, 2025</span>
627
+ </div>
628
+ <div className="token-detail">
629
+ <span className="detail-label">Lifetime Earned:</span>
630
+ <span className="detail-value">60 tokens</span>
631
+ </div>
632
+ </div>
633
+ <div className="token-actions">
634
+ <button className="token-action">View Token Details</button>
635
+ <button className="token-action">Redeem Tokens</button>
636
+ </div>
637
+ </div>
638
+ </div>
639
+
640
+ <div className="usage-history-section">
641
+ <h3>Recent Activity</h3>
642
+ <div className="activity-list">
643
+ {mockSubscriptionData.usageHistory.map((activity, index) => (
644
+ <div key={index} className="activity-item">
645
+ <div className="activity-date">{activity.date}</div>
646
+ <div className="activity-details">
647
+ <div className="activity-type">{activity.activity}</div>
648
+ {activity.vehicle && <div className="activity-vehicle">{activity.vehicle}</div>}
649
+ {activity.location && <div className="activity-location">{activity.location}</div>}
650
+ </div>
651
+ <div className="activity-cost">
652
+ {activity.credits > 0 && <div className="credit-cost">-{activity.credits} credits</div>}
653
+ {activity.tokens > 0 && <div className="token-cost">-{activity.tokens} tokens</div>}
654
+ </div>
655
+ </div>
656
+ ))}
657
+ </div>
658
+ <button className="view-all-activity">View All Activity</button>
659
+ </div>
660
+
661
+ <div className="usage-insights">
662
+ <h3>Usage Insights</h3>
663
+ <div className="insights-grid">
664
+ <div className="insight-card">
665
+ <div className="insight-icon">🚗</div>
666
+ <div className="insight-title">Most Used Vehicle</div>
667
+ <div className="insight-value">Tesla Model 3</div>
668
+ <div className="insight-detail">8 reservations this month</div>
669
+ </div>
670
+ <div className="insight-card">
671
+ <div className="insight-icon">⚡</div>
672
+ <div className="insight-title">Favorite Charging Location</div>
673
+ <div className="insight-value">Downtown Hub</div>
674
+ <div className="insight-detail">12 charging sessions</div>
675
+ </div>
676
+ <div className="insight-card">
677
+ <div className="insight-icon">📊</div>
678
+ <div className="insight-title">Average Trip Length</div>
679
+ <div className="insight-value">42 miles</div>
680
+ <div className="insight-detail">Based on last 20 trips</div>
681
+ </div>
682
+ <div className="insight-card">
683
+ <div className="insight-icon">💰</div>
684
+ <div className="insight-title">Estimated Savings</div>
685
+ <div className="insight-value">$345</div>
686
+ <div className="insight-detail">Compared to traditional ownership</div>
687
+ </div>
688
+ </div>
689
+ </div>
690
+ </div>
691
+ )}
692
+
693
+ {activeTab === 'compare' && (
694
+ <div className="compare-tab">
695
+ {renderFeatureComparison()}
696
+
697
+ <div className="plan-benefits">
698
+ <h3>Membership Benefits</h3>
699
+ <div className="benefits-grid">
700
+ <div className="benefit-card">
701
+ <div className="benefit-icon">🔄</div>
702
+ <h4>Flexibility</h4>
703
+ <p>Change or upgrade your plan at any time to match your evolving mobility needs.</p>
704
+ </div>
705
+ <div className="benefit-card">
706
+ <div className="benefit-icon">💰</div>
707
+ <h4>Cost Savings</h4>
708
+ <p>Save on insurance, maintenance, and depreciation costs compared to traditional ownership.</p>
709
+ </div>
710
+ <div className="benefit-card">
711
+ <div className="benefit-icon">⚡</div>
712
+ <h4>Charging Network</h4>
713
+ <p>Access to The Link's growing network of premium charging stations across Illinois.</p>
714
+ </div>
715
+ <div className="benefit-card">
716
+ <div className="benefit-icon">⬡</div>
717
+ <h4>Token Ownership</h4>
718
+ <p>Earn ChainLink tokens with every subscription payment, building equity in the network.</p>
719
+ </div>
720
+ </div>
721
+ </div>
722
+
723
+ <div className="faq-section">
724
+ <h3>Frequently Asked Questions</h3>
725
+ <div className="faq-list">
726
+ <div className="faq-item">
727
+ <div className="faq-question">How do subscription credits work?</div>
728
+ <div className="faq-answer">
729
+ <p>Subscription credits are allocated monthly based on your plan tier. These credits can be used for vehicle reservations, charging sessions, and lounge access. Unused credits roll over for up to 3 months.</p>
730
+ </div>
731
+ </div>
732
+ <div className="faq-item">
733
+ <div className="faq-question">Can I change my plan?</div>
734
+ <div className="faq-answer">
735
+ <p>Yes, you can upgrade or downgrade your plan at any time. Changes take effect at the start of your next billing cycle. Upgrades may be applied immediately upon request.</p>
736
+ </div>
737
+ </div>
738
+ <div className="faq-item">
739
+ <div className="faq-question">What are ChainLink tokens?</div>
740
+ <div className="faq-answer">
741
+ <p>ChainLink tokens represent fractional ownership in The Link charging infrastructure. Tokens are earned monthly with your subscription and can be redeemed for charging credits, subscription discounts, or held as an appreciating asset.</p>
742
+ </div>
743
+ </div>
744
+ <div className="faq-item">
745
+ <div className="faq-question">How does the home charging setup work?</div>
746
+ <div className="faq-answer">
747
+ <p>Take-Home and All-Access plans include installation of a Level 2 home charger at your residence. Our team will coordinate installation with a certified electrician. Installation costs are covered up to $1,000.</p>
748
+ </div>
749
+ </div>
750
+ </div>
751
+ </div>
752
+ </div>
753
+ )}
754
+ </main>
755
+
756
+ <footer className="portal-footer">
757
+ <div className="footer-info">
758
+ <span>Unity Fleet Subscription Portal</span>
759
+ <span>Powered by Atlas Intelligence</span>
760
+ </div>
761
+ <div className="footer-links">
762
+ <a href="#" className="footer-link">Terms & Conditions</a>
763
+ <a href="#" className="footer-link">Privacy Policy</a>
764
+ <a href="#" className="footer-link">Contact Support</a>
765
+ </div>
766
+ </footer>
767
+ </div>
768
+ );
769
+ }
770
+
771
+ export default SubscriptionPortal;
chainlink-tokenization.html ADDED
@@ -0,0 +1,1309 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Unity Fleet - ChainLink Tokenization</title>
7
+ <link rel="stylesheet" href="../styles.css">
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
9
+ <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Space+Grotesk:wght@300;400;500;600;700&display=swap" rel="stylesheet">
12
+ <style>
13
+ /* MVP Component specific styles */
14
+ .component-container {
15
+ max-width: 1200px;
16
+ margin: 0 auto;
17
+ padding: 2rem;
18
+ }
19
+
20
+ .component-header {
21
+ text-align: center;
22
+ margin-bottom: 3rem;
23
+ }
24
+
25
+ .component-header h1 {
26
+ font-size: 2.5rem;
27
+ margin-bottom: 1rem;
28
+ background: linear-gradient(90deg, var(--accent-color-1), var(--accent-color-2));
29
+ -webkit-background-clip: text;
30
+ background-clip: text;
31
+ -webkit-text-fill-color: transparent;
32
+ }
33
+
34
+ .component-header p {
35
+ font-size: 1.2rem;
36
+ max-width: 800px;
37
+ margin: 0 auto;
38
+ opacity: 0.8;
39
+ }
40
+
41
+ .component-content {
42
+ background: var(--glass-bg);
43
+ border: 1px solid var(--glass-border);
44
+ border-radius: 16px;
45
+ padding: 2rem;
46
+ margin-bottom: 3rem;
47
+ backdrop-filter: blur(10px);
48
+ }
49
+
50
+ .back-to-home {
51
+ display: inline-block;
52
+ margin-top: 2rem;
53
+ padding: 0.8rem 1.5rem;
54
+ background: transparent;
55
+ border: 1px solid var(--accent-color-1);
56
+ color: var(--accent-color-1);
57
+ border-radius: 4px;
58
+ font-family: var(--font-primary);
59
+ font-weight: 500;
60
+ text-transform: uppercase;
61
+ letter-spacing: 1px;
62
+ transition: all var(--transition-medium);
63
+ }
64
+
65
+ .back-to-home:hover {
66
+ background: rgba(0, 224, 255, 0.1);
67
+ transform: translateY(-3px);
68
+ }
69
+
70
+ /* ChainLink Tokenization specific styles */
71
+ .chainlink-demo-container {
72
+ display: flex;
73
+ flex-direction: column;
74
+ align-items: center;
75
+ padding: 1rem;
76
+ }
77
+
78
+ .tokenization-interface {
79
+ width: 100%;
80
+ max-width: 900px;
81
+ background-color: #0B0B0F;
82
+ border-radius: 16px;
83
+ overflow: hidden;
84
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.4);
85
+ border: 1px solid rgba(0, 224, 255, 0.3);
86
+ margin-bottom: 2rem;
87
+ }
88
+
89
+ .tokenization-header {
90
+ background: linear-gradient(90deg, rgba(0, 224, 255, 0.2), rgba(53, 242, 219, 0.2));
91
+ padding: 1.5rem;
92
+ display: flex;
93
+ justify-content: space-between;
94
+ align-items: center;
95
+ }
96
+
97
+ .tokenization-header h2 {
98
+ margin: 0;
99
+ font-size: 1.5rem;
100
+ }
101
+
102
+ .network-status {
103
+ display: flex;
104
+ align-items: center;
105
+ font-size: 0.9rem;
106
+ }
107
+
108
+ .status-indicator {
109
+ width: 10px;
110
+ height: 10px;
111
+ border-radius: 50%;
112
+ background: #4CAF50;
113
+ margin-right: 0.5rem;
114
+ }
115
+
116
+ .tokenization-nav {
117
+ display: flex;
118
+ background: rgba(0, 0, 0, 0.3);
119
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
120
+ }
121
+
122
+ .nav-tab {
123
+ padding: 1rem 1.5rem;
124
+ cursor: pointer;
125
+ transition: all 0.3s ease;
126
+ position: relative;
127
+ }
128
+
129
+ .nav-tab:hover {
130
+ background: rgba(0, 224, 255, 0.1);
131
+ }
132
+
133
+ .nav-tab.active {
134
+ color: var(--accent-color-1);
135
+ }
136
+
137
+ .nav-tab.active::after {
138
+ content: '';
139
+ position: absolute;
140
+ bottom: 0;
141
+ left: 0;
142
+ width: 100%;
143
+ height: 3px;
144
+ background: var(--accent-color-1);
145
+ }
146
+
147
+ .tokenization-body {
148
+ padding: 2rem;
149
+ }
150
+
151
+ .tab-content {
152
+ display: none;
153
+ }
154
+
155
+ .tab-content.active {
156
+ display: block;
157
+ }
158
+
159
+ /* Token Overview Tab */
160
+ .token-stats {
161
+ display: grid;
162
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
163
+ gap: 1.5rem;
164
+ margin-bottom: 2rem;
165
+ }
166
+
167
+ .token-stat {
168
+ background: rgba(255, 255, 255, 0.05);
169
+ border-radius: 12px;
170
+ padding: 1.5rem;
171
+ border: 1px solid rgba(255, 255, 255, 0.1);
172
+ text-align: center;
173
+ }
174
+
175
+ .stat-value {
176
+ font-size: 2rem;
177
+ font-weight: bold;
178
+ margin-bottom: 0.5rem;
179
+ background: linear-gradient(90deg, var(--accent-color-1), var(--accent-color-2));
180
+ -webkit-background-clip: text;
181
+ background-clip: text;
182
+ -webkit-text-fill-color: transparent;
183
+ }
184
+
185
+ .stat-label {
186
+ font-size: 0.9rem;
187
+ opacity: 0.8;
188
+ }
189
+
190
+ .token-distribution {
191
+ background: rgba(0, 0, 0, 0.3);
192
+ border-radius: 12px;
193
+ padding: 1.5rem;
194
+ margin-bottom: 2rem;
195
+ }
196
+
197
+ .distribution-title {
198
+ margin-top: 0;
199
+ margin-bottom: 1.5rem;
200
+ font-size: 1.2rem;
201
+ color: var(--accent-color-1);
202
+ }
203
+
204
+ .distribution-chart {
205
+ height: 300px;
206
+ position: relative;
207
+ display: flex;
208
+ align-items: center;
209
+ justify-content: center;
210
+ }
211
+
212
+ .donut-chart {
213
+ width: 250px;
214
+ height: 250px;
215
+ border-radius: 50%;
216
+ background: conic-gradient(
217
+ #4CAF50 0% 30%,
218
+ #2196F3 30% 55%,
219
+ #9C27B0 55% 70%,
220
+ #FF9800 70% 85%,
221
+ #F44336 85% 100%
222
+ );
223
+ position: relative;
224
+ }
225
+
226
+ .donut-hole {
227
+ position: absolute;
228
+ width: 150px;
229
+ height: 150px;
230
+ background: #0B0B0F;
231
+ border-radius: 50%;
232
+ top: 50%;
233
+ left: 50%;
234
+ transform: translate(-50%, -50%);
235
+ display: flex;
236
+ align-items: center;
237
+ justify-content: center;
238
+ flex-direction: column;
239
+ }
240
+
241
+ .total-tokens {
242
+ font-size: 1.5rem;
243
+ font-weight: bold;
244
+ margin-bottom: 0.3rem;
245
+ }
246
+
247
+ .total-label {
248
+ font-size: 0.8rem;
249
+ opacity: 0.7;
250
+ }
251
+
252
+ .distribution-legend {
253
+ display: flex;
254
+ flex-wrap: wrap;
255
+ justify-content: center;
256
+ gap: 1.5rem;
257
+ margin-top: 2rem;
258
+ }
259
+
260
+ .legend-item {
261
+ display: flex;
262
+ align-items: center;
263
+ }
264
+
265
+ .legend-color {
266
+ width: 16px;
267
+ height: 16px;
268
+ border-radius: 4px;
269
+ margin-right: 0.5rem;
270
+ }
271
+
272
+ .legend-color.infrastructure {
273
+ background: #4CAF50;
274
+ }
275
+
276
+ .legend-color.investors {
277
+ background: #2196F3;
278
+ }
279
+
280
+ .legend-color.community {
281
+ background: #9C27B0;
282
+ }
283
+
284
+ .legend-color.operations {
285
+ background: #FF9800;
286
+ }
287
+
288
+ .legend-color.reserve {
289
+ background: #F44336;
290
+ }
291
+
292
+ .legend-text {
293
+ font-size: 0.9rem;
294
+ }
295
+
296
+ .legend-value {
297
+ font-weight: bold;
298
+ margin-left: 0.3rem;
299
+ }
300
+
301
+ /* Asset Tokenization Tab */
302
+ .asset-categories {
303
+ display: grid;
304
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
305
+ gap: 1.5rem;
306
+ margin-bottom: 2rem;
307
+ }
308
+
309
+ .asset-category {
310
+ background: rgba(255, 255, 255, 0.05);
311
+ border-radius: 12px;
312
+ padding: 1.5rem;
313
+ border: 1px solid rgba(255, 255, 255, 0.1);
314
+ transition: all 0.3s ease;
315
+ }
316
+
317
+ .asset-category:hover {
318
+ transform: translateY(-5px);
319
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
320
+ border-color: var(--accent-color-1);
321
+ }
322
+
323
+ .category-header {
324
+ display: flex;
325
+ align-items: center;
326
+ margin-bottom: 1rem;
327
+ }
328
+
329
+ .category-icon {
330
+ width: 40px;
331
+ height: 40px;
332
+ border-radius: 8px;
333
+ background: rgba(0, 224, 255, 0.1);
334
+ display: flex;
335
+ align-items: center;
336
+ justify-content: center;
337
+ margin-right: 1rem;
338
+ color: var(--accent-color-1);
339
+ font-size: 1.2rem;
340
+ }
341
+
342
+ .category-name {
343
+ font-size: 1.2rem;
344
+ font-weight: bold;
345
+ }
346
+
347
+ .category-description {
348
+ margin-bottom: 1rem;
349
+ font-size: 0.9rem;
350
+ opacity: 0.8;
351
+ }
352
+
353
+ .category-stats {
354
+ display: flex;
355
+ justify-content: space-between;
356
+ font-size: 0.9rem;
357
+ }
358
+
359
+ .category-value {
360
+ font-weight: bold;
361
+ color: var(--accent-color-1);
362
+ }
363
+
364
+ .tokenized-assets {
365
+ background: rgba(0, 0, 0, 0.3);
366
+ border-radius: 12px;
367
+ padding: 1.5rem;
368
+ margin-bottom: 2rem;
369
+ }
370
+
371
+ .assets-title {
372
+ margin-top: 0;
373
+ margin-bottom: 1.5rem;
374
+ font-size: 1.2rem;
375
+ color: var(--accent-color-1);
376
+ display: flex;
377
+ justify-content: space-between;
378
+ align-items: center;
379
+ }
380
+
381
+ .filter-dropdown {
382
+ position: relative;
383
+ display: inline-block;
384
+ }
385
+
386
+ .filter-button {
387
+ padding: 0.5rem 1rem;
388
+ background: rgba(255, 255, 255, 0.1);
389
+ border: 1px solid rgba(255, 255, 255, 0.2);
390
+ border-radius: 4px;
391
+ color: white;
392
+ cursor: pointer;
393
+ display: flex;
394
+ align-items: center;
395
+ font-size: 0.9rem;
396
+ }
397
+
398
+ .filter-button i {
399
+ margin-left: 0.5rem;
400
+ }
401
+
402
+ .filter-dropdown-content {
403
+ display: none;
404
+ position: absolute;
405
+ right: 0;
406
+ background: #0B0B0F;
407
+ min-width: 160px;
408
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3);
409
+ z-index: 1;
410
+ border-radius: 4px;
411
+ border: 1px solid rgba(255, 255, 255, 0.1);
412
+ }
413
+
414
+ .filter-dropdown-content a {
415
+ color: white;
416
+ padding: 0.8rem 1rem;
417
+ text-decoration: none;
418
+ display: block;
419
+ font-size: 0.9rem;
420
+ transition: all 0.3s ease;
421
+ }
422
+
423
+ .filter-dropdown-content a:hover {
424
+ background: rgba(0, 224, 255, 0.1);
425
+ }
426
+
427
+ .filter-dropdown:hover .filter-dropdown-content {
428
+ display: block;
429
+ }
430
+
431
+ .assets-grid {
432
+ display: grid;
433
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
434
+ gap: 1.5rem;
435
+ }
436
+
437
+ .asset-card {
438
+ background: rgba(255, 255, 255, 0.05);
439
+ border-radius: 8px;
440
+ overflow: hidden;
441
+ transition: all 0.3s ease;
442
+ cursor: pointer;
443
+ }
444
+
445
+ .asset-card:hover {
446
+ transform: translateY(-5px);
447
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
448
+ }
449
+
450
+ .asset-image {
451
+ height: 120px;
452
+ background: linear-gradient(45deg, rgba(0, 224, 255, 0.2), rgba(53, 242, 219, 0.2));
453
+ display: flex;
454
+ align-items: center;
455
+ justify-content: center;
456
+ font-size: 2rem;
457
+ color: var(--accent-color-1);
458
+ }
459
+
460
+ .asset-details {
461
+ padding: 1rem;
462
+ }
463
+
464
+ .asset-name {
465
+ font-weight: bold;
466
+ margin-bottom: 0.5rem;
467
+ }
468
+
469
+ .asset-info {
470
+ font-size: 0.8rem;
471
+ opacity: 0.7;
472
+ margin-bottom: 0.5rem;
473
+ }
474
+
475
+ .asset-value {
476
+ font-size: 0.9rem;
477
+ font-weight: bold;
478
+ color: var(--accent-color-1);
479
+ }
480
+
481
+ /* Token Flow Tab */
482
+ .token-flow-visualization {
483
+ background: rgba(0, 0, 0, 0.3);
484
+ border-radius: 12px;
485
+ padding: 1.5rem;
486
+ margin-bottom: 2rem;
487
+ height: 400px;
488
+ position: relative;
489
+ overflow: hidden;
490
+ }
491
+
492
+ .flow-title {
493
+ margin-top: 0;
494
+ margin-bottom: 1.5rem;
495
+ font-size: 1.2rem;
496
+ color: var(--accent-color-1);
497
+ }
498
+
499
+ .flow-diagram {
500
+ position: relative;
501
+ width: 100%;
502
+ height: 100%;
503
+ }
504
+
505
+ .flow-node {
506
+ position: absolute;
507
+ width: 80px;
508
+ height: 80px;
509
+ border-radius: 50%;
510
+ background: rgba(255, 255, 255, 0.1);
511
+ border: 2px solid rgba(255, 255, 255, 0.2);
512
+ display: flex;
513
+ flex-direction: column;
514
+ align-items: center;
515
+ justify-content: center;
516
+ text-align: center;
517
+ transition: all 0.3s ease;
518
+ cursor: pointer;
519
+ }
520
+
521
+ .flow-node:hover {
522
+ transform: scale(1.1);
523
+ z-index: 10;
524
+ border-color: var(--accent-color-1);
525
+ }
526
+
527
+ .flow-node .icon {
528
+ font-size: 1.5rem;
529
+ margin-bottom: 0.3rem;
530
+ color: var(--accent-color-1);
531
+ }
532
+
533
+ .flow-node .label {
534
+ font-size: 0.8rem;
535
+ font-weight: bold;
536
+ }
537
+
538
+ .flow-node.investors {
539
+ top: 50px;
540
+ left: 50%;
541
+ transform: translateX(-50%);
542
+ }
543
+
544
+ .flow-node.token-pool {
545
+ top: 50%;
546
+ left: 50%;
547
+ transform: translate(-50%, -50%);
548
+ width: 100px;
549
+ height: 100px;
550
+ background: rgba(0, 224, 255, 0.1);
551
+ border-color: var(--accent-color-1);
552
+ }
553
+
554
+ .flow-node.infrastructure {
555
+ bottom: 50px;
556
+ left: 20%;
557
+ }
558
+
559
+ .flow-node.operations {
560
+ bottom: 50px;
561
+ right: 20%;
562
+ }
563
+
564
+ .flow-node.community {
565
+ top: 50%;
566
+ left: 20%;
567
+ transform: translateY(-50%);
568
+ }
569
+
570
+ .flow-node.reserve {
571
+ top: 50%;
572
+ right: 20%;
573
+ transform: translateY(-50%);
574
+ }
575
+
576
+ .flow-connection {
577
+ position: absolute;
578
+ height: 2px;
579
+ background: linear-gradient(90deg, rgba(0, 224, 255, 0.5), rgba(53, 242, 219, 0.5));
580
+ transform-origin: left center;
581
+ }
582
+
583
+ .flow-connection.investors-pool {
584
+ top: 90px;
585
+ left: 50%;
586
+ width: 100px;
587
+ transform: translateX(-50%) rotate(90deg);
588
+ }
589
+
590
+ .flow-connection.pool-infrastructure {
591
+ bottom: 150px;
592
+ left: 35%;
593
+ width: 150px;
594
+ transform: rotate(45deg);
595
+ }
596
+
597
+ .flow-connection.pool-operations {
598
+ bottom: 150px;
599
+ right: 35%;
600
+ width: 150px;
601
+ transform: rotate(-45deg);
602
+ }
603
+
604
+ .flow-connection.pool-community {
605
+ top: 50%;
606
+ left: 30%;
607
+ width: 150px;
608
+ }
609
+
610
+ .flow-connection.pool-reserve {
611
+ top: 50%;
612
+ right: 30%;
613
+ width: 150px;
614
+ transform: rotate(180deg);
615
+ }
616
+
617
+ .flow-particle {
618
+ position: absolute;
619
+ width: 6px;
620
+ height: 6px;
621
+ border-radius: 50%;
622
+ background: white;
623
+ animation: flowMove 3s linear infinite;
624
+ }
625
+
626
+ @keyframes flowMove {
627
+ 0% {
628
+ left: 0;
629
+ opacity: 0;
630
+ }
631
+ 10% {
632
+ opacity: 1;
633
+ }
634
+ 90% {
635
+ opacity: 1;
636
+ }
637
+ 100% {
638
+ left: calc(100% - 6px);
639
+ opacity: 0;
640
+ }
641
+ }
642
+
643
+ .token-transactions {
644
+ background: rgba(255, 255, 255, 0.05);
645
+ border-radius: 12px;
646
+ padding: 1.5rem;
647
+ border: 1px solid rgba(255, 255, 255, 0.1);
648
+ }
649
+
650
+ .transactions-title {
651
+ margin-top: 0;
652
+ margin-bottom: 1.5rem;
653
+ font-size: 1.2rem;
654
+ color: var(--accent-color-1);
655
+ }
656
+
657
+ .transaction-list {
658
+ list-style: none;
659
+ padding: 0;
660
+ margin: 0;
661
+ }
662
+
663
+ .transaction-item {
664
+ display: flex;
665
+ justify-content: space-between;
666
+ padding: 1rem 0;
667
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
668
+ }
669
+
670
+ .transaction-item:last-child {
671
+ border-bottom: none;
672
+ }
673
+
674
+ .transaction-details {
675
+ display: flex;
676
+ align-items: center;
677
+ }
678
+
679
+ .transaction-icon {
680
+ width: 40px;
681
+ height: 40px;
682
+ border-radius: 50%;
683
+ background: rgba(0, 224, 255, 0.1);
684
+ display: flex;
685
+ align-items: center;
686
+ justify-content: center;
687
+ margin-right: 1rem;
688
+ color: var(--accent-color-1);
689
+ }
690
+
691
+ .transaction-info h4 {
692
+ margin: 0;
693
+ margin-bottom: 0.3rem;
694
+ }
695
+
696
+ .transaction-info p {
697
+ margin: 0;
698
+ font-size: 0.8rem;
699
+ opacity: 0.7;
700
+ }
701
+
702
+ .transaction-amount {
703
+ font-weight: bold;
704
+ color: var(--accent-color-1);
705
+ }
706
+
707
+ .transaction-hash {
708
+ font-size: 0.8rem;
709
+ opacity: 0.7;
710
+ text-align: right;
711
+ margin-top: 0.3rem;
712
+ }
713
+
714
+ .tokenization-footer {
715
+ background: rgba(0, 0, 0, 0.3);
716
+ padding: 1rem;
717
+ display: flex;
718
+ justify-content: space-between;
719
+ align-items: center;
720
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
721
+ }
722
+
723
+ .tokenization-actions {
724
+ display: flex;
725
+ gap: 1rem;
726
+ }
727
+
728
+ .tokenization-actions button {
729
+ padding: 0.5rem 1rem;
730
+ border-radius: 4px;
731
+ background: transparent;
732
+ border: 1px solid var(--accent-color-1);
733
+ color: var(--accent-color-1);
734
+ cursor: pointer;
735
+ transition: all 0.3s ease;
736
+ }
737
+
738
+ .tokenization-actions button:hover {
739
+ background: rgba(0, 224, 255, 0.1);
740
+ }
741
+
742
+ .tokenization-actions button.primary {
743
+ background: linear-gradient(90deg, var(--accent-color-1), var(--accent-color-2));
744
+ color: #000;
745
+ border: none;
746
+ }
747
+
748
+ .tokenization-actions button.primary:hover {
749
+ transform: translateY(-3px);
750
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
751
+ }
752
+
753
+ .tokenization-info {
754
+ font-size: 0.9rem;
755
+ opacity: 0.7;
756
+ }
757
+ </style>
758
+ </head>
759
+ <body>
760
+ <div class="noise-overlay"></div>
761
+
762
+ <header>
763
+ <nav>
764
+ <div class="logo">UNITY FLEET</div>
765
+ <div class="nav-links">
766
+ <a href="../index.html#what-is-the-link">What is The Link</a>
767
+ <a href="../index.html#subscription-tiers">Subscription Tiers</a>
768
+ <a href="../index.html#impact-equity">Impact & Equity</a>
769
+ <a href="../index.html#tokenization">ChainLink Tokenization</a>
770
+ <a href="../index.html#rural-plan">Rural Revitalization</a>
771
+ <a href="../index.html#mvp-showcase">MVP Showcase</a>
772
+ </div>
773
+ <div class="mobile-nav-toggle">
774
+ <i class="fas fa-bars"></i>
775
+ </div>
776
+ </nav>
777
+ </header>
778
+
779
+ <main class="component-container">
780
+ <div class="component-header">
781
+ <h1>CHAINLINK TOKENIZATION</h1>
782
+ <p>Explore our innovative tokenization model that enables community ownership, transparent asset management, and sustainable funding for The Link charging infrastructure.</p>
783
+ </div>
784
+
785
+ <div class="component-content">
786
+ <div class="chainlink-demo-container">
787
+ <div class="tokenization-interface">
788
+ <div class="tokenization-header">
789
+ <h2>Unity Fleet Token Dashboard</h2>
790
+ <div class="network-status">
791
+ <div class="status-indicator"></div>
792
+ <span>Connected to ChainLink Network</span>
793
+ </div>
794
+ </div>
795
+
796
+ <div class="tokenization-nav">
797
+ <div class="nav-tab active" data-tab="overview">Token Overview</div>
798
+ <div class="nav-tab" data-tab="assets">Asset Tokenization</div>
799
+ <div class="nav-tab" data-tab="flow">Token Flow</div>
800
+ </div>
801
+
802
+ <div class="tokenization-body">
803
+ <!-- Token Overview Tab -->
804
+ <div class="tab-content active" id="overview-tab">
805
+ <div class="token-stats">
806
+ <div class="token-stat">
807
+ <div class="stat-value">10,000,000</div>
808
+ <div class="stat-label">Total Token Supply</div>
809
+ </div>
810
+ <div class="token-stat">
811
+ <div class="stat-value">4,250,000</div>
812
+ <div class="stat-label">Tokens in Circulation</div>
813
+ </div>
814
+ <div class="token-stat">
815
+ <div class="stat-value">$2.45</div>
816
+ <div class="stat-label">Current Token Value</div>
817
+ </div>
818
+ <div class="token-stat">
819
+ <div class="stat-value">1,250</div>
820
+ <div class="stat-label">Token Holders</div>
821
+ </div>
822
+ </div>
823
+
824
+ <div class="token-distribution">
825
+ <h3 class="distribution-title">Token Distribution</h3>
826
+ <div class="distribution-chart">
827
+ <div class="donut-chart">
828
+ <div class="donut-hole">
829
+ <div class="total-tokens">10M</div>
830
+ <div class="total-label">Total Tokens</div>
831
+ </div>
832
+ </div>
833
+ </div>
834
+ <div class="distribution-legend">
835
+ <div class="legend-item">
836
+ <div class="legend-color infrastructure"></div>
837
+ <div class="legend-text">Infrastructure <span class="legend-value">30%</span></div>
838
+ </div>
839
+ <div class="legend-item">
840
+ <div class="legend-color investors"></div>
841
+ <div class="legend-text">Investors <span class="legend-value">25%</span></div>
842
+ </div>
843
+ <div class="legend-item">
844
+ <div class="legend-color community"></div>
845
+ <div class="legend-text">Community <span class="legend-value">15%</span></div>
846
+ </div>
847
+ <div class="legend-item">
848
+ <div class="legend-color operations"></div>
849
+ <div class="legend-text">Operations <span class="legend-value">15%</span></div>
850
+ </div>
851
+ <div class="legend-item">
852
+ <div class="legend-color reserve"></div>
853
+ <div class="legend-text">Reserve <span class="legend-value">15%</span></div>
854
+ </div>
855
+ </div>
856
+ </div>
857
+ </div>
858
+
859
+ <!-- Asset Tokenization Tab -->
860
+ <div class="tab-content" id="assets-tab">
861
+ <div class="asset-categories">
862
+ <div class="asset-category">
863
+ <div class="category-header">
864
+ <div class="category-icon">
865
+ <i class="fas fa-charging-station"></i>
866
+ </div>
867
+ <div class="category-name">Charging Stations</div>
868
+ </div>
869
+ <div class="category-description">
870
+ Tokenized ownership of The Link charging infrastructure across Illinois.
871
+ </div>
872
+ <div class="category-stats">
873
+ <div>Total Assets: <span class="category-value">15</span></div>
874
+ <div>Total Value: <span class="category-value">$12.5M</span></div>
875
+ </div>
876
+ </div>
877
+
878
+ <div class="asset-category">
879
+ <div class="category-header">
880
+ <div class="category-icon">
881
+ <i class="fas fa-car"></i>
882
+ </div>
883
+ <div class="category-name">Vehicle Fleet</div>
884
+ </div>
885
+ <div class="category-description">
886
+ Tokenized ownership of the Unity Fleet electric vehicle inventory.
887
+ </div>
888
+ <div class="category-stats">
889
+ <div>Total Assets: <span class="category-value">42</span></div>
890
+ <div>Total Value: <span class="category-value">$3.8M</span></div>
891
+ </div>
892
+ </div>
893
+
894
+ <div class="asset-category">
895
+ <div class="category-header">
896
+ <div class="category-icon">
897
+ <i class="fas fa-solar-panel"></i>
898
+ </div>
899
+ <div class="category-name">Energy Infrastructure</div>
900
+ </div>
901
+ <div class="category-description">
902
+ Tokenized ownership of solar arrays and battery storage systems.
903
+ </div>
904
+ <div class="category-stats">
905
+ <div>Total Assets: <span class="category-value">8</span></div>
906
+ <div>Total Value: <span class="category-value">$5.2M</span></div>
907
+ </div>
908
+ </div>
909
+
910
+ <div class="asset-category">
911
+ <div class="category-header">
912
+ <div class="category-icon">
913
+ <i class="fas fa-building"></i>
914
+ </div>
915
+ <div class="category-name">Real Estate</div>
916
+ </div>
917
+ <div class="category-description">
918
+ Tokenized ownership of The Link hub properties and land.
919
+ </div>
920
+ <div class="category-stats">
921
+ <div>Total Assets: <span class="category-value">12</span></div>
922
+ <div>Total Value: <span class="category-value">$8.4M</span></div>
923
+ </div>
924
+ </div>
925
+ </div>
926
+
927
+ <div class="tokenized-assets">
928
+ <div class="assets-title">
929
+ Tokenized Assets
930
+ <div class="filter-dropdown">
931
+ <button class="filter-button">
932
+ Filter by Category <i class="fas fa-chevron-down"></i>
933
+ </button>
934
+ <div class="filter-dropdown-content">
935
+ <a href="#">All Categories</a>
936
+ <a href="#">Charging Stations</a>
937
+ <a href="#">Vehicle Fleet</a>
938
+ <a href="#">Energy Infrastructure</a>
939
+ <a href="#">Real Estate</a>
940
+ </div>
941
+ </div>
942
+ </div>
943
+
944
+ <div class="assets-grid">
945
+ <div class="asset-card">
946
+ <div class="asset-image">
947
+ <i class="fas fa-charging-station"></i>
948
+ </div>
949
+ <div class="asset-details">
950
+ <div class="asset-name">Chicago Downtown Hub</div>
951
+ <div class="asset-info">Charging Station • 8 Ports</div>
952
+ <div class="asset-value">1,200,000 Tokens</div>
953
+ </div>
954
+ </div>
955
+
956
+ <div class="asset-card">
957
+ <div class="asset-image">
958
+ <i class="fas fa-charging-station"></i>
959
+ </div>
960
+ <div class="asset-details">
961
+ <div class="asset-name">Springfield Central Hub</div>
962
+ <div class="asset-info">Charging Station • 6 Ports</div>
963
+ <div class="asset-value">850,000 Tokens</div>
964
+ </div>
965
+ </div>
966
+
967
+ <div class="asset-card">
968
+ <div class="asset-image">
969
+ <i class="fas fa-car"></i>
970
+ </div>
971
+ <div class="asset-details">
972
+ <div class="asset-name">Tesla Model 3 Fleet</div>
973
+ <div class="asset-info">Vehicle Fleet • 12 Vehicles</div>
974
+ <div class="asset-value">720,000 Tokens</div>
975
+ </div>
976
+ </div>
977
+
978
+ <div class="asset-card">
979
+ <div class="asset-image">
980
+ <i class="fas fa-solar-panel"></i>
981
+ </div>
982
+ <div class="asset-details">
983
+ <div class="asset-name">Champaign Solar Array</div>
984
+ <div class="asset-info">Energy • 500 kW Capacity</div>
985
+ <div class="asset-value">950,000 Tokens</div>
986
+ </div>
987
+ </div>
988
+
989
+ <div class="asset-card">
990
+ <div class="asset-image">
991
+ <i class="fas fa-car"></i>
992
+ </div>
993
+ <div class="asset-details">
994
+ <div class="asset-name">Rivian R1S Fleet</div>
995
+ <div class="asset-info">Vehicle Fleet • 8 Vehicles</div>
996
+ <div class="asset-value">680,000 Tokens</div>
997
+ </div>
998
+ </div>
999
+
1000
+ <div class="asset-card">
1001
+ <div class="asset-image">
1002
+ <i class="fas fa-building"></i>
1003
+ </div>
1004
+ <div class="asset-details">
1005
+ <div class="asset-name">Bloomington Property</div>
1006
+ <div class="asset-info">Real Estate • 2.5 Acres</div>
1007
+ <div class="asset-value">1,050,000 Tokens</div>
1008
+ </div>
1009
+ </div>
1010
+ </div>
1011
+ </div>
1012
+ </div>
1013
+
1014
+ <!-- Token Flow Tab -->
1015
+ <div class="tab-content" id="flow-tab">
1016
+ <div class="token-flow-visualization">
1017
+ <h3 class="flow-title">Token Flow Visualization</h3>
1018
+ <div class="flow-diagram">
1019
+ <div class="flow-node investors">
1020
+ <div class="icon"><i class="fas fa-users"></i></div>
1021
+ <div class="label">Investors</div>
1022
+ </div>
1023
+
1024
+ <div class="flow-node token-pool">
1025
+ <div class="icon"><i class="fas fa-coins"></i></div>
1026
+ <div class="label">Token Pool</div>
1027
+ </div>
1028
+
1029
+ <div class="flow-node infrastructure">
1030
+ <div class="icon"><i class="fas fa-charging-station"></i></div>
1031
+ <div class="label">Infrastructure</div>
1032
+ </div>
1033
+
1034
+ <div class="flow-node operations">
1035
+ <div class="icon"><i class="fas fa-cogs"></i></div>
1036
+ <div class="label">Operations</div>
1037
+ </div>
1038
+
1039
+ <div class="flow-node community">
1040
+ <div class="icon"><i class="fas fa-hands-helping"></i></div>
1041
+ <div class="label">Community</div>
1042
+ </div>
1043
+
1044
+ <div class="flow-node reserve">
1045
+ <div class="icon"><i class="fas fa-vault"></i></div>
1046
+ <div class="label">Reserve</div>
1047
+ </div>
1048
+
1049
+ <div class="flow-connection investors-pool">
1050
+ <div class="flow-particle" style="animation-delay: 0s;"></div>
1051
+ <div class="flow-particle" style="animation-delay: 1s;"></div>
1052
+ <div class="flow-particle" style="animation-delay: 2s;"></div>
1053
+ </div>
1054
+
1055
+ <div class="flow-connection pool-infrastructure">
1056
+ <div class="flow-particle" style="animation-delay: 0.2s;"></div>
1057
+ <div class="flow-particle" style="animation-delay: 1.2s;"></div>
1058
+ <div class="flow-particle" style="animation-delay: 2.2s;"></div>
1059
+ </div>
1060
+
1061
+ <div class="flow-connection pool-operations">
1062
+ <div class="flow-particle" style="animation-delay: 0.4s;"></div>
1063
+ <div class="flow-particle" style="animation-delay: 1.4s;"></div>
1064
+ <div class="flow-particle" style="animation-delay: 2.4s;"></div>
1065
+ </div>
1066
+
1067
+ <div class="flow-connection pool-community">
1068
+ <div class="flow-particle" style="animation-delay: 0.6s;"></div>
1069
+ <div class="flow-particle" style="animation-delay: 1.6s;"></div>
1070
+ <div class="flow-particle" style="animation-delay: 2.6s;"></div>
1071
+ </div>
1072
+
1073
+ <div class="flow-connection pool-reserve">
1074
+ <div class="flow-particle" style="animation-delay: 0.8s;"></div>
1075
+ <div class="flow-particle" style="animation-delay: 1.8s;"></div>
1076
+ <div class="flow-particle" style="animation-delay: 2.8s;"></div>
1077
+ </div>
1078
+ </div>
1079
+ </div>
1080
+
1081
+ <div class="token-transactions">
1082
+ <h3 class="transactions-title">Recent Transactions</h3>
1083
+ <ul class="transaction-list">
1084
+ <li class="transaction-item">
1085
+ <div class="transaction-details">
1086
+ <div class="transaction-icon">
1087
+ <i class="fas fa-exchange-alt"></i>
1088
+ </div>
1089
+ <div class="transaction-info">
1090
+ <h4>Token Allocation</h4>
1091
+ <p>Infrastructure Fund</p>
1092
+ </div>
1093
+ </div>
1094
+ <div>
1095
+ <div class="transaction-amount">250,000 Tokens</div>
1096
+ <div class="transaction-hash">0x7a2d...f83e</div>
1097
+ </div>
1098
+ </li>
1099
+
1100
+ <li class="transaction-item">
1101
+ <div class="transaction-details">
1102
+ <div class="transaction-icon">
1103
+ <i class="fas fa-user-plus"></i>
1104
+ </div>
1105
+ <div class="transaction-info">
1106
+ <h4>New Investor</h4>
1107
+ <p>Community Investment Group</p>
1108
+ </div>
1109
+ </div>
1110
+ <div>
1111
+ <div class="transaction-amount">125,000 Tokens</div>
1112
+ <div class="transaction-hash">0x3b8c...a21d</div>
1113
+ </div>
1114
+ </li>
1115
+
1116
+ <li class="transaction-item">
1117
+ <div class="transaction-details">
1118
+ <div class="transaction-icon">
1119
+ <i class="fas fa-plus-circle"></i>
1120
+ </div>
1121
+ <div class="transaction-info">
1122
+ <h4>Asset Addition</h4>
1123
+ <p>Peoria Charging Hub</p>
1124
+ </div>
1125
+ </div>
1126
+ <div>
1127
+ <div class="transaction-amount">750,000 Tokens</div>
1128
+ <div class="transaction-hash">0x9e4f...c72b</div>
1129
+ </div>
1130
+ </li>
1131
+
1132
+ <li class="transaction-item">
1133
+ <div class="transaction-details">
1134
+ <div class="transaction-icon">
1135
+ <i class="fas fa-hand-holding-usd"></i>
1136
+ </div>
1137
+ <div class="transaction-info">
1138
+ <h4>Dividend Distribution</h4>
1139
+ <p>Q2 2025 Earnings</p>
1140
+ </div>
1141
+ </div>
1142
+ <div>
1143
+ <div class="transaction-amount">180,000 Tokens</div>
1144
+ <div class="transaction-hash">0x5d1a...b94c</div>
1145
+ </div>
1146
+ </li>
1147
+ </ul>
1148
+ </div>
1149
+ </div>
1150
+ </div>
1151
+
1152
+ <div class="tokenization-footer">
1153
+ <div class="tokenization-actions">
1154
+ <button>View on ChainLink Explorer</button>
1155
+ <button class="primary">Connect Wallet</button>
1156
+ </div>
1157
+ <div class="tokenization-info">
1158
+ Last Block: #14,532,891 | Gas Price: 25 Gwei
1159
+ </div>
1160
+ </div>
1161
+ </div>
1162
+ </div>
1163
+ </div>
1164
+
1165
+ <div class="component-features">
1166
+ <h2>Key Features</h2>
1167
+ <ul class="features-list">
1168
+ <li>Transparent token distribution with real-time visualization of allocation across stakeholders</li>
1169
+ <li>Asset tokenization system for fractional ownership of charging infrastructure, vehicles, and energy systems</li>
1170
+ <li>Interactive token flow diagram showing movement between investors, infrastructure, operations, and community</li>
1171
+ <li>ChainLink integration for secure, transparent, and auditable token transactions</li>
1172
+ <li>Community ownership model enabling local investment in charging infrastructure</li>
1173
+ <li>Dividend distribution system for sharing revenue with token holders</li>
1174
+ <li>Asset management dashboard for tracking tokenized infrastructure components</li>
1175
+ </ul>
1176
+ </div>
1177
+
1178
+ <a href="../index.html#mvp-showcase" class="back-to-home">
1179
+ <i class="fas fa-arrow-left"></i> Back to MVP Showcase
1180
+ </a>
1181
+ </main>
1182
+
1183
+ <footer>
1184
+ <div class="container">
1185
+ <div class="footer-content">
1186
+ <div class="footer-logo">
1187
+ <div class="logo">UNITY FLEET</div>
1188
+ <p>Revolutionizing electric vehicle infrastructure across Illinois</p>
1189
+ </div>
1190
+
1191
+ <div class="footer-links">
1192
+ <div class="link-column">
1193
+ <h4>Navigation</h4>
1194
+ <a href="../index.html#what-is-the-link">What is The Link</a>
1195
+ <a href="../index.html#subscription-tiers">Subscription Tiers</a>
1196
+ <a href="../index.html#impact-equity">Impact & Equity</a>
1197
+ <a href="../index.html#tokenization">ChainLink Tokenization</a>
1198
+ <a href="../index.html#rural-plan">Rural Revitalization</a>
1199
+ <a href="../index.html#mvp-showcase">MVP Showcase</a>
1200
+ </div>
1201
+
1202
+ <div class="link-column">
1203
+ <h4>Contact</h4>
1204
+ <a href="mailto:[email protected]">[email protected]</a>
1205
+ <a href="tel:+12175551234">+1 (217) 555-1234</a>
1206
+ <p>2457 E Eldorado St<br>Decatur, IL 62521</p>
1207
+ </div>
1208
+
1209
+ <div class="link-column">
1210
+ <h4>Legal</h4>
1211
+ <a href="#">Privacy Policy</a>
1212
+ <a href="#">Terms of Service</a>
1213
+ <a href="#">Accessibility</a>
1214
+ </div>
1215
+ </div>
1216
+
1217
+ <div class="footer-social">
1218
+ <a href="#" class="social-icon"><i class="fab fa-twitter"></i></a>
1219
+ <a href="#" class="social-icon"><i class="fab fa-linkedin"></i></a>
1220
+ <a href="#" class="social-icon"><i class="fab fa-facebook"></i></a>
1221
+ <a href="#" class="social-icon"><i class="fab fa-instagram"></i></a>
1222
+ </div>
1223
+ </div>
1224
+
1225
+ <div class="footer-bottom">
1226
+ <p>&copy; 2025 Unity Fleet LLC. All rights reserved.</p>
1227
+ </div>
1228
+ </div>
1229
+ </footer>
1230
+
1231
+ <script>
1232
+ // Mobile navigation toggle
1233
+ document.querySelector('.mobile-nav-toggle').addEventListener('click', function() {
1234
+ document.querySelector('.nav-links').classList.toggle('active');
1235
+ this.innerHTML = document.querySelector('.nav-links').classList.contains('active')
1236
+ ? '<i class="fas fa-times"></i>'
1237
+ : '<i class="fas fa-bars"></i>';
1238
+ });
1239
+
1240
+ // Tokenization dashboard tab navigation
1241
+ document.addEventListener('DOMContentLoaded', function() {
1242
+ const navTabs = document.querySelectorAll('.nav-tab');
1243
+ const tabContents = document.querySelectorAll('.tab-content');
1244
+
1245
+ navTabs.forEach(tab => {
1246
+ tab.addEventListener('click', function() {
1247
+ // Remove active class from all tabs
1248
+ navTabs.forEach(t => t.classList.remove('active'));
1249
+
1250
+ // Add active class to clicked tab
1251
+ this.classList.add('active');
1252
+
1253
+ // Hide all tab contents
1254
+ tabContents.forEach(content => content.classList.remove('active'));
1255
+
1256
+ // Show selected tab content
1257
+ const tabId = this.getAttribute('data-tab') + '-tab';
1258
+ document.getElementById(tabId).classList.add('active');
1259
+ });
1260
+ });
1261
+
1262
+ // Flow node hover effects
1263
+ const flowNodes = document.querySelectorAll('.flow-node');
1264
+ flowNodes.forEach(node => {
1265
+ node.addEventListener('mouseenter', function() {
1266
+ this.style.transform = 'scale(1.1)';
1267
+ this.style.zIndex = '10';
1268
+ this.style.borderColor = 'var(--accent-color-1)';
1269
+ });
1270
+
1271
+ node.addEventListener('mouseleave', function() {
1272
+ if (!this.classList.contains('token-pool')) {
1273
+ this.style.transform = '';
1274
+ this.style.zIndex = '';
1275
+ this.style.borderColor = '';
1276
+ } else {
1277
+ this.style.transform = 'translate(-50%, -50%)';
1278
+ }
1279
+ });
1280
+ });
1281
+
1282
+ // Asset card hover effects
1283
+ const assetCards = document.querySelectorAll('.asset-card');
1284
+ assetCards.forEach(card => {
1285
+ card.addEventListener('click', function() {
1286
+ alert('Asset details would open in the production version.');
1287
+ });
1288
+ });
1289
+
1290
+ // Button actions
1291
+ document.querySelector('.tokenization-actions .primary').addEventListener('click', function() {
1292
+ alert('Wallet connection would be implemented in the production version.');
1293
+ });
1294
+
1295
+ document.querySelector('.tokenization-actions button:not(.primary)').addEventListener('click', function() {
1296
+ alert('ChainLink Explorer would open in the production version.');
1297
+ });
1298
+
1299
+ // Category hover effects
1300
+ const assetCategories = document.querySelectorAll('.asset-category');
1301
+ assetCategories.forEach(category => {
1302
+ category.addEventListener('click', function() {
1303
+ alert('Category details would open in the production version.');
1304
+ });
1305
+ });
1306
+ });
1307
+ </script>
1308
+ </body>
1309
+ </html>
charging-hub.html ADDED
@@ -0,0 +1,616 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Unity Fleet - Charging Hub Interface</title>
7
+ <link rel="stylesheet" href="../styles.css">
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
9
+ <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Space+Grotesk:wght@300;400;500;600;700&display=swap" rel="stylesheet">
12
+ <style>
13
+ /* MVP Component specific styles */
14
+ .component-container {
15
+ max-width: 1200px;
16
+ margin: 0 auto;
17
+ padding: 2rem;
18
+ }
19
+
20
+ .component-header {
21
+ text-align: center;
22
+ margin-bottom: 3rem;
23
+ }
24
+
25
+ .component-header h1 {
26
+ font-size: 2.5rem;
27
+ margin-bottom: 1rem;
28
+ background: linear-gradient(90deg, var(--accent-color-1), var(--accent-color-2));
29
+ -webkit-background-clip: text;
30
+ background-clip: text;
31
+ -webkit-text-fill-color: transparent;
32
+ }
33
+
34
+ .component-header p {
35
+ font-size: 1.2rem;
36
+ max-width: 800px;
37
+ margin: 0 auto;
38
+ opacity: 0.8;
39
+ }
40
+
41
+ .component-content {
42
+ background: var(--glass-bg);
43
+ border: 1px solid var(--glass-border);
44
+ border-radius: 16px;
45
+ padding: 2rem;
46
+ margin-bottom: 3rem;
47
+ backdrop-filter: blur(10px);
48
+ }
49
+
50
+ .back-to-home {
51
+ display: inline-block;
52
+ margin-top: 2rem;
53
+ padding: 0.8rem 1.5rem;
54
+ background: transparent;
55
+ border: 1px solid var(--accent-color-1);
56
+ color: var(--accent-color-1);
57
+ border-radius: 4px;
58
+ font-family: var(--font-primary);
59
+ font-weight: 500;
60
+ text-transform: uppercase;
61
+ letter-spacing: 1px;
62
+ transition: all var(--transition-medium);
63
+ }
64
+
65
+ .back-to-home:hover {
66
+ background: rgba(0, 224, 255, 0.1);
67
+ transform: translateY(-3px);
68
+ }
69
+
70
+ /* Charging Hub specific styles */
71
+ .charging-hub-container {
72
+ display: flex;
73
+ flex-direction: column;
74
+ align-items: center;
75
+ padding: 1rem;
76
+ }
77
+
78
+ .hub-interface {
79
+ width: 100%;
80
+ max-width: 800px;
81
+ background-color: #0B0B0F;
82
+ border-radius: 16px;
83
+ overflow: hidden;
84
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.4);
85
+ border: 1px solid rgba(0, 224, 255, 0.3);
86
+ margin-bottom: 2rem;
87
+ }
88
+
89
+ .hub-header {
90
+ background: linear-gradient(90deg, rgba(0, 224, 255, 0.2), rgba(53, 242, 219, 0.2));
91
+ padding: 1.5rem;
92
+ display: flex;
93
+ justify-content: space-between;
94
+ align-items: center;
95
+ }
96
+
97
+ .hub-header h2 {
98
+ margin: 0;
99
+ font-size: 1.5rem;
100
+ }
101
+
102
+ .hub-status {
103
+ display: flex;
104
+ align-items: center;
105
+ }
106
+
107
+ .status-indicator {
108
+ width: 12px;
109
+ height: 12px;
110
+ border-radius: 50%;
111
+ background-color: #4CAF50;
112
+ margin-right: 8px;
113
+ }
114
+
115
+ .hub-body {
116
+ padding: 2rem;
117
+ }
118
+
119
+ .hub-section {
120
+ margin-bottom: 2rem;
121
+ }
122
+
123
+ .hub-section h3 {
124
+ margin-top: 0;
125
+ margin-bottom: 1rem;
126
+ font-size: 1.2rem;
127
+ color: var(--accent-color-1);
128
+ }
129
+
130
+ .charging-stations {
131
+ display: grid;
132
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
133
+ gap: 1rem;
134
+ }
135
+
136
+ .station-card {
137
+ background: rgba(255, 255, 255, 0.05);
138
+ border-radius: 12px;
139
+ padding: 1rem;
140
+ border: 1px solid rgba(255, 255, 255, 0.1);
141
+ transition: all 0.3s ease;
142
+ }
143
+
144
+ .station-card:hover {
145
+ transform: translateY(-5px);
146
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
147
+ border-color: var(--accent-color-1);
148
+ }
149
+
150
+ .station-card.available {
151
+ border-left: 4px solid #4CAF50;
152
+ }
153
+
154
+ .station-card.in-use {
155
+ border-left: 4px solid #FFC107;
156
+ }
157
+
158
+ .station-card.unavailable {
159
+ border-left: 4px solid #F44336;
160
+ opacity: 0.7;
161
+ }
162
+
163
+ .station-header {
164
+ display: flex;
165
+ justify-content: space-between;
166
+ align-items: center;
167
+ margin-bottom: 0.5rem;
168
+ }
169
+
170
+ .station-header h4 {
171
+ margin: 0;
172
+ font-size: 1rem;
173
+ }
174
+
175
+ .station-type {
176
+ font-size: 0.8rem;
177
+ opacity: 0.7;
178
+ margin-bottom: 0.5rem;
179
+ }
180
+
181
+ .station-details {
182
+ font-size: 0.9rem;
183
+ }
184
+
185
+ .station-details p {
186
+ margin: 0.3rem 0;
187
+ }
188
+
189
+ .station-actions {
190
+ margin-top: 1rem;
191
+ display: flex;
192
+ justify-content: center;
193
+ }
194
+
195
+ .station-actions button {
196
+ padding: 0.5rem 1rem;
197
+ font-size: 0.8rem;
198
+ border-radius: 4px;
199
+ background: linear-gradient(90deg, var(--accent-color-1), var(--accent-color-2));
200
+ color: #000;
201
+ border: none;
202
+ cursor: pointer;
203
+ width: 100%;
204
+ }
205
+
206
+ .station-actions button:disabled {
207
+ background: rgba(255, 255, 255, 0.1);
208
+ color: rgba(255, 255, 255, 0.5);
209
+ cursor: not-allowed;
210
+ }
211
+
212
+ .hub-amenities {
213
+ display: grid;
214
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
215
+ gap: 1rem;
216
+ }
217
+
218
+ .amenity-card {
219
+ background: rgba(255, 255, 255, 0.05);
220
+ border-radius: 12px;
221
+ padding: 1rem;
222
+ border: 1px solid rgba(255, 255, 255, 0.1);
223
+ text-align: center;
224
+ transition: all 0.3s ease;
225
+ }
226
+
227
+ .amenity-card:hover {
228
+ transform: translateY(-5px);
229
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
230
+ }
231
+
232
+ .amenity-icon {
233
+ font-size: 2rem;
234
+ margin-bottom: 0.5rem;
235
+ color: var(--accent-color-1);
236
+ }
237
+
238
+ .amenity-name {
239
+ font-weight: bold;
240
+ margin-bottom: 0.5rem;
241
+ }
242
+
243
+ .amenity-description {
244
+ font-size: 0.9rem;
245
+ opacity: 0.8;
246
+ }
247
+
248
+ .hub-footer {
249
+ background: rgba(0, 0, 0, 0.3);
250
+ padding: 1rem;
251
+ display: flex;
252
+ justify-content: space-between;
253
+ align-items: center;
254
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
255
+ }
256
+
257
+ .hub-footer-links {
258
+ display: flex;
259
+ }
260
+
261
+ .hub-footer-links a {
262
+ margin-right: 1rem;
263
+ color: var(--accent-color-1);
264
+ font-size: 0.9rem;
265
+ }
266
+
267
+ .hub-footer-info {
268
+ font-size: 0.9rem;
269
+ opacity: 0.7;
270
+ }
271
+
272
+ /* Energy usage meter */
273
+ .energy-meter {
274
+ width: 100%;
275
+ height: 8px;
276
+ background: rgba(255, 255, 255, 0.1);
277
+ border-radius: 4px;
278
+ overflow: hidden;
279
+ margin-top: 0.5rem;
280
+ }
281
+
282
+ .energy-meter-fill {
283
+ height: 100%;
284
+ background: linear-gradient(90deg, #4CAF50, #FFC107, #F44336);
285
+ width: 0%;
286
+ transition: width 1s ease;
287
+ }
288
+ </style>
289
+ </head>
290
+ <body>
291
+ <div class="noise-overlay"></div>
292
+
293
+ <header>
294
+ <nav>
295
+ <div class="logo">UNITY FLEET</div>
296
+ <div class="nav-links">
297
+ <a href="../index.html#what-is-the-link">What is The Link</a>
298
+ <a href="../index.html#subscription-tiers">Subscription Tiers</a>
299
+ <a href="../index.html#impact-equity">Impact & Equity</a>
300
+ <a href="../index.html#tokenization">ChainLink Tokenization</a>
301
+ <a href="../index.html#rural-plan">Rural Revitalization</a>
302
+ <a href="../index.html#mvp-showcase">MVP Showcase</a>
303
+ </div>
304
+ <div class="mobile-nav-toggle">
305
+ <i class="fas fa-bars"></i>
306
+ </div>
307
+ </nav>
308
+ </header>
309
+
310
+ <main class="component-container">
311
+ <div class="component-header">
312
+ <h1>CHARGING HUB INTERFACE</h1>
313
+ <p>Experience The Link charging stations with our interactive hub interface, featuring real-time availability, energy monitoring, and premium amenities.</p>
314
+ </div>
315
+
316
+ <div class="component-content">
317
+ <div class="charging-hub-container">
318
+ <div class="hub-interface">
319
+ <div class="hub-header">
320
+ <h2>The Link - Downtown Springfield</h2>
321
+ <div class="hub-status">
322
+ <div class="status-indicator"></div>
323
+ <span>Online | 6/8 Stations Available</span>
324
+ </div>
325
+ </div>
326
+
327
+ <div class="hub-body">
328
+ <div class="hub-section">
329
+ <h3>Charging Stations</h3>
330
+ <div class="charging-stations">
331
+ <div class="station-card available">
332
+ <div class="station-header">
333
+ <h4>Station 1</h4>
334
+ <span>Available</span>
335
+ </div>
336
+ <div class="station-type">DC Fast Charger | 350kW</div>
337
+ <div class="station-details">
338
+ <p>Power Output: 350kW</p>
339
+ <p>Connector: CCS</p>
340
+ </div>
341
+ <div class="station-actions">
342
+ <button>Reserve</button>
343
+ </div>
344
+ </div>
345
+
346
+ <div class="station-card available">
347
+ <div class="station-header">
348
+ <h4>Station 2</h4>
349
+ <span>Available</span>
350
+ </div>
351
+ <div class="station-type">DC Fast Charger | 350kW</div>
352
+ <div class="station-details">
353
+ <p>Power Output: 350kW</p>
354
+ <p>Connector: CCS</p>
355
+ </div>
356
+ <div class="station-actions">
357
+ <button>Reserve</button>
358
+ </div>
359
+ </div>
360
+
361
+ <div class="station-card in-use">
362
+ <div class="station-header">
363
+ <h4>Station 3</h4>
364
+ <span>In Use</span>
365
+ </div>
366
+ <div class="station-type">DC Fast Charger | 350kW</div>
367
+ <div class="station-details">
368
+ <p>Current User: Tesla Model Y</p>
369
+ <p>Est. Completion: 15 min</p>
370
+ <div class="energy-meter">
371
+ <div class="energy-meter-fill" style="width: 75%;"></div>
372
+ </div>
373
+ </div>
374
+ <div class="station-actions">
375
+ <button disabled>In Use</button>
376
+ </div>
377
+ </div>
378
+
379
+ <div class="station-card available">
380
+ <div class="station-header">
381
+ <h4>Station 4</h4>
382
+ <span>Available</span>
383
+ </div>
384
+ <div class="station-type">DC Fast Charger | 350kW</div>
385
+ <div class="station-details">
386
+ <p>Power Output: 350kW</p>
387
+ <p>Connector: CCS</p>
388
+ </div>
389
+ <div class="station-actions">
390
+ <button>Reserve</button>
391
+ </div>
392
+ </div>
393
+
394
+ <div class="station-card available">
395
+ <div class="station-header">
396
+ <h4>Station 5</h4>
397
+ <span>Available</span>
398
+ </div>
399
+ <div class="station-type">Level 2 | 19.2kW</div>
400
+ <div class="station-details">
401
+ <p>Power Output: 19.2kW</p>
402
+ <p>Connector: J1772</p>
403
+ </div>
404
+ <div class="station-actions">
405
+ <button>Reserve</button>
406
+ </div>
407
+ </div>
408
+
409
+ <div class="station-card available">
410
+ <div class="station-header">
411
+ <h4>Station 6</h4>
412
+ <span>Available</span>
413
+ </div>
414
+ <div class="station-type">Level 2 | 19.2kW</div>
415
+ <div class="station-details">
416
+ <p>Power Output: 19.2kW</p>
417
+ <p>Connector: J1772</p>
418
+ </div>
419
+ <div class="station-actions">
420
+ <button>Reserve</button>
421
+ </div>
422
+ </div>
423
+
424
+ <div class="station-card in-use">
425
+ <div class="station-header">
426
+ <h4>Station 7</h4>
427
+ <span>In Use</span>
428
+ </div>
429
+ <div class="station-type">Level 2 | 19.2kW</div>
430
+ <div class="station-details">
431
+ <p>Current User: Rivian R1T</p>
432
+ <p>Est. Completion: 45 min</p>
433
+ <div class="energy-meter">
434
+ <div class="energy-meter-fill" style="width: 40%;"></div>
435
+ </div>
436
+ </div>
437
+ <div class="station-actions">
438
+ <button disabled>In Use</button>
439
+ </div>
440
+ </div>
441
+
442
+ <div class="station-card unavailable">
443
+ <div class="station-header">
444
+ <h4>Station 8</h4>
445
+ <span>Maintenance</span>
446
+ </div>
447
+ <div class="station-type">Level 2 | 19.2kW</div>
448
+ <div class="station-details">
449
+ <p>Status: Under Maintenance</p>
450
+ <p>Est. Return: 2 hours</p>
451
+ </div>
452
+ <div class="station-actions">
453
+ <button disabled>Unavailable</button>
454
+ </div>
455
+ </div>
456
+ </div>
457
+ </div>
458
+
459
+ <div class="hub-section">
460
+ <h3>Hub Amenities</h3>
461
+ <div class="hub-amenities">
462
+ <div class="amenity-card">
463
+ <div class="amenity-icon">
464
+ <i class="fas fa-coffee"></i>
465
+ </div>
466
+ <div class="amenity-name">Café Lounge</div>
467
+ <div class="amenity-description">Enjoy premium coffee and snacks while you wait</div>
468
+ </div>
469
+
470
+ <div class="amenity-card">
471
+ <div class="amenity-icon">
472
+ <i class="fas fa-wifi"></i>
473
+ </div>
474
+ <div class="amenity-name">High-Speed WiFi</div>
475
+ <div class="amenity-description">Free gigabit internet access for all users</div>
476
+ </div>
477
+
478
+ <div class="amenity-card">
479
+ <div class="amenity-icon">
480
+ <i class="fas fa-laptop"></i>
481
+ </div>
482
+ <div class="amenity-name">Work Pods</div>
483
+ <div class="amenity-description">Private workspaces with power and connectivity</div>
484
+ </div>
485
+
486
+ <div class="amenity-card">
487
+ <div class="amenity-icon">
488
+ <i class="fas fa-shopping-bag"></i>
489
+ </div>
490
+ <div class="amenity-name">Mini Market</div>
491
+ <div class="amenity-description">Convenience store with essentials and local products</div>
492
+ </div>
493
+ </div>
494
+ </div>
495
+ </div>
496
+
497
+ <div class="hub-footer">
498
+ <div class="hub-footer-links">
499
+ <a href="#">Hub Map</a>
500
+ <a href="#">Report Issue</a>
501
+ <a href="#">Contact Staff</a>
502
+ </div>
503
+ <div class="hub-footer-info">
504
+ Current Energy Source: 85% Solar | 15% Grid
505
+ </div>
506
+ </div>
507
+ </div>
508
+ </div>
509
+ </div>
510
+
511
+ <div class="component-features">
512
+ <h2>Key Features</h2>
513
+ <ul class="features-list">
514
+ <li>Real-time charging station status and availability monitoring</li>
515
+ <li>Reservation system for securing charging spots in advance</li>
516
+ <li>Energy usage tracking with visual indicators of charging progress</li>
517
+ <li>Integrated payment processing with subscription recognition</li>
518
+ <li>Interactive map of hub layout and amenities</li>
519
+ <li>Live energy source tracking showing renewable vs. grid power</li>
520
+ <li>Digital access to premium lounge services and work spaces</li>
521
+ </ul>
522
+ </div>
523
+
524
+ <a href="../index.html#mvp-showcase" class="back-to-home">
525
+ <i class="fas fa-arrow-left"></i> Back to MVP Showcase
526
+ </a>
527
+ </main>
528
+
529
+ <footer>
530
+ <div class="container">
531
+ <div class="footer-content">
532
+ <div class="footer-logo">
533
+ <div class="logo">UNITY FLEET</div>
534
+ <p>Revolutionizing electric vehicle infrastructure across Illinois</p>
535
+ </div>
536
+
537
+ <div class="footer-links">
538
+ <div class="link-column">
539
+ <h4>Navigation</h4>
540
+ <a href="../index.html#what-is-the-link">What is The Link</a>
541
+ <a href="../index.html#subscription-tiers">Subscription Tiers</a>
542
+ <a href="../index.html#impact-equity">Impact & Equity</a>
543
+ <a href="../index.html#tokenization">ChainLink Tokenization</a>
544
+ <a href="../index.html#rural-plan">Rural Revitalization</a>
545
+ <a href="../index.html#mvp-showcase">MVP Showcase</a>
546
+ </div>
547
+
548
+ <div class="link-column">
549
+ <h4>Contact</h4>
550
+ <a href="mailto:[email protected]">[email protected]</a>
551
+ <a href="tel:+12175551234">+1 (217) 555-1234</a>
552
+ <p>2457 E Eldorado St<br>Decatur, IL 62521</p>
553
+ </div>
554
+
555
+ <div class="link-column">
556
+ <h4>Legal</h4>
557
+ <a href="#">Privacy Policy</a>
558
+ <a href="#">Terms of Service</a>
559
+ <a href="#">Accessibility</a>
560
+ </div>
561
+ </div>
562
+
563
+ <div class="footer-social">
564
+ <a href="#" class="social-icon"><i class="fab fa-twitter"></i></a>
565
+ <a href="#" class="social-icon"><i class="fab fa-linkedin"></i></a>
566
+ <a href="#" class="social-icon"><i class="fab fa-facebook"></i></a>
567
+ <a href="#" class="social-icon"><i class="fab fa-instagram"></i></a>
568
+ </div>
569
+ </div>
570
+
571
+ <div class="footer-bottom">
572
+ <p>&copy; 2025 Unity Fleet LLC. All rights reserved.</p>
573
+ </div>
574
+ </div>
575
+ </footer>
576
+
577
+ <script>
578
+ // Mobile navigation toggle
579
+ document.querySelector('.mobile-nav-toggle').addEventListener('click', function() {
580
+ document.querySelector('.nav-links').classList.toggle('active');
581
+ this.innerHTML = document.querySelector('.nav-links').classList.contains('active')
582
+ ? '<i class="fas fa-times"></i>'
583
+ : '<i class="fas fa-bars"></i>';
584
+ });
585
+
586
+ // Charging station animation
587
+ document.addEventListener('DOMContentLoaded', function() {
588
+ // Animate energy meters
589
+ const energyMeters = document.querySelectorAll('.energy-meter-fill');
590
+ energyMeters.forEach(meter => {
591
+ const currentWidth = meter.style.width;
592
+ meter.style.width = '0%';
593
+ setTimeout(() => {
594
+ meter.style.width = currentWidth;
595
+ }, 500);
596
+ });
597
+
598
+ // Add hover effects to station cards
599
+ const stationCards = document.querySelectorAll('.station-card');
600
+ stationCards.forEach(card => {
601
+ card.addEventListener('mouseenter', function() {
602
+ if (!this.classList.contains('unavailable')) {
603
+ this.style.transform = 'translateY(-10px)';
604
+ this.style.boxShadow = '0 15px 30px rgba(0, 224, 255, 0.2)';
605
+ }
606
+ });
607
+
608
+ card.addEventListener('mouseleave', function() {
609
+ this.style.transform = '';
610
+ this.style.boxShadow = '';
611
+ });
612
+ });
613
+ });
614
+ </script>
615
+ </body>
616
+ </html>
deployment-map.html ADDED
@@ -0,0 +1,833 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Unity Fleet - Deployment Map</title>
7
+ <link rel="stylesheet" href="../styles.css">
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
9
+ <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Space+Grotesk:wght@300;400;500;600;700&display=swap" rel="stylesheet">
12
+ <style>
13
+ /* MVP Component specific styles */
14
+ .component-container {
15
+ max-width: 1200px;
16
+ margin: 0 auto;
17
+ padding: 2rem;
18
+ }
19
+
20
+ .component-header {
21
+ text-align: center;
22
+ margin-bottom: 3rem;
23
+ }
24
+
25
+ .component-header h1 {
26
+ font-size: 2.5rem;
27
+ margin-bottom: 1rem;
28
+ background: linear-gradient(90deg, var(--accent-color-1), var(--accent-color-2));
29
+ -webkit-background-clip: text;
30
+ background-clip: text;
31
+ -webkit-text-fill-color: transparent;
32
+ }
33
+
34
+ .component-header p {
35
+ font-size: 1.2rem;
36
+ max-width: 800px;
37
+ margin: 0 auto;
38
+ opacity: 0.8;
39
+ }
40
+
41
+ .component-content {
42
+ background: var(--glass-bg);
43
+ border: 1px solid var(--glass-border);
44
+ border-radius: 16px;
45
+ padding: 2rem;
46
+ margin-bottom: 3rem;
47
+ backdrop-filter: blur(10px);
48
+ }
49
+
50
+ .back-to-home {
51
+ display: inline-block;
52
+ margin-top: 2rem;
53
+ padding: 0.8rem 1.5rem;
54
+ background: transparent;
55
+ border: 1px solid var(--accent-color-1);
56
+ color: var(--accent-color-1);
57
+ border-radius: 4px;
58
+ font-family: var(--font-primary);
59
+ font-weight: 500;
60
+ text-transform: uppercase;
61
+ letter-spacing: 1px;
62
+ transition: all var(--transition-medium);
63
+ }
64
+
65
+ .back-to-home:hover {
66
+ background: rgba(0, 224, 255, 0.1);
67
+ transform: translateY(-3px);
68
+ }
69
+
70
+ /* Deployment Map specific styles */
71
+ .deployment-map-container {
72
+ display: flex;
73
+ flex-direction: column;
74
+ align-items: center;
75
+ padding: 1rem;
76
+ }
77
+
78
+ .map-interface {
79
+ width: 100%;
80
+ max-width: 900px;
81
+ background-color: #0B0B0F;
82
+ border-radius: 16px;
83
+ overflow: hidden;
84
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.4);
85
+ border: 1px solid rgba(0, 224, 255, 0.3);
86
+ margin-bottom: 2rem;
87
+ }
88
+
89
+ .map-header {
90
+ background: linear-gradient(90deg, rgba(0, 224, 255, 0.2), rgba(53, 242, 219, 0.2));
91
+ padding: 1.5rem;
92
+ display: flex;
93
+ justify-content: space-between;
94
+ align-items: center;
95
+ }
96
+
97
+ .map-header h2 {
98
+ margin: 0;
99
+ font-size: 1.5rem;
100
+ }
101
+
102
+ .map-controls {
103
+ display: flex;
104
+ gap: 1rem;
105
+ }
106
+
107
+ .map-control-btn {
108
+ padding: 0.5rem 1rem;
109
+ background: rgba(255, 255, 255, 0.1);
110
+ border: 1px solid rgba(255, 255, 255, 0.2);
111
+ border-radius: 4px;
112
+ color: white;
113
+ cursor: pointer;
114
+ transition: all 0.3s ease;
115
+ }
116
+
117
+ .map-control-btn:hover {
118
+ background: rgba(0, 224, 255, 0.2);
119
+ border-color: var(--accent-color-1);
120
+ }
121
+
122
+ .map-control-btn.active {
123
+ background: rgba(0, 224, 255, 0.3);
124
+ border-color: var(--accent-color-1);
125
+ color: var(--accent-color-1);
126
+ }
127
+
128
+ .map-body {
129
+ padding: 2rem;
130
+ }
131
+
132
+ .map-filters {
133
+ display: flex;
134
+ flex-wrap: wrap;
135
+ gap: 1rem;
136
+ margin-bottom: 2rem;
137
+ }
138
+
139
+ .filter-group {
140
+ background: rgba(255, 255, 255, 0.05);
141
+ border-radius: 12px;
142
+ padding: 1rem;
143
+ border: 1px solid rgba(255, 255, 255, 0.1);
144
+ min-width: 200px;
145
+ flex: 1;
146
+ }
147
+
148
+ .filter-group h3 {
149
+ margin-top: 0;
150
+ margin-bottom: 1rem;
151
+ font-size: 1.1rem;
152
+ color: var(--accent-color-1);
153
+ }
154
+
155
+ .filter-options {
156
+ display: flex;
157
+ flex-wrap: wrap;
158
+ gap: 0.5rem;
159
+ }
160
+
161
+ .filter-option {
162
+ padding: 0.5rem 1rem;
163
+ background: rgba(255, 255, 255, 0.05);
164
+ border: 1px solid rgba(255, 255, 255, 0.1);
165
+ border-radius: 20px;
166
+ font-size: 0.8rem;
167
+ cursor: pointer;
168
+ transition: all 0.3s ease;
169
+ }
170
+
171
+ .filter-option:hover {
172
+ background: rgba(0, 224, 255, 0.1);
173
+ border-color: var(--accent-color-1);
174
+ }
175
+
176
+ .filter-option.active {
177
+ background: rgba(0, 224, 255, 0.2);
178
+ border-color: var(--accent-color-1);
179
+ color: var(--accent-color-1);
180
+ }
181
+
182
+ .map-visualization {
183
+ background: rgba(0, 0, 0, 0.3);
184
+ border-radius: 12px;
185
+ padding: 1rem;
186
+ position: relative;
187
+ height: 500px;
188
+ overflow: hidden;
189
+ }
190
+
191
+ .illinois-map {
192
+ position: relative;
193
+ width: 100%;
194
+ height: 100%;
195
+ background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMDAgNTAwIj48cGF0aCBkPSJNNzUsMTAwIEwxMDAsMzAgTDIwMCw1MCBMMjUwLDEwMCBMMjcwLDIwMCBMMjUwLDMwMCBMMjAwLDQwMCBMMTUwLDQ1MCBMMTAwLDQwMCBMNTAsMzAwIEw1MCwyMDAgTDc1LDEwMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJyZ2JhKDAsIDIyNCwgMjU1LCAwLjMpIiBzdHJva2Utd2lkdGg9IjIiLz48L3N2Zz4=');
196
+ background-size: contain;
197
+ background-position: center;
198
+ background-repeat: no-repeat;
199
+ }
200
+
201
+ .map-location {
202
+ position: absolute;
203
+ width: 20px;
204
+ height: 20px;
205
+ border-radius: 50%;
206
+ background: var(--accent-color-1);
207
+ transform: translate(-50%, -50%);
208
+ cursor: pointer;
209
+ transition: all 0.3s ease;
210
+ box-shadow: 0 0 10px rgba(0, 224, 255, 0.5);
211
+ }
212
+
213
+ .map-location:hover {
214
+ transform: translate(-50%, -50%) scale(1.3);
215
+ z-index: 10;
216
+ }
217
+
218
+ .map-location::after {
219
+ content: '';
220
+ position: absolute;
221
+ top: 50%;
222
+ left: 50%;
223
+ width: 30px;
224
+ height: 30px;
225
+ border-radius: 50%;
226
+ background: rgba(0, 224, 255, 0.3);
227
+ transform: translate(-50%, -50%);
228
+ animation: pulse 2s infinite;
229
+ }
230
+
231
+ @keyframes pulse {
232
+ 0% {
233
+ transform: translate(-50%, -50%) scale(0.5);
234
+ opacity: 1;
235
+ }
236
+ 100% {
237
+ transform: translate(-50%, -50%) scale(2);
238
+ opacity: 0;
239
+ }
240
+ }
241
+
242
+ .map-location.phase-1 {
243
+ background: #4CAF50;
244
+ }
245
+
246
+ .map-location.phase-1::after {
247
+ background: rgba(76, 175, 80, 0.3);
248
+ }
249
+
250
+ .map-location.phase-2 {
251
+ background: #FFC107;
252
+ }
253
+
254
+ .map-location.phase-2::after {
255
+ background: rgba(255, 193, 7, 0.3);
256
+ }
257
+
258
+ .map-location.phase-3 {
259
+ background: #9C27B0;
260
+ }
261
+
262
+ .map-location.phase-3::after {
263
+ background: rgba(156, 39, 176, 0.3);
264
+ }
265
+
266
+ .location-tooltip {
267
+ position: absolute;
268
+ background: rgba(0, 0, 0, 0.8);
269
+ border: 1px solid var(--accent-color-1);
270
+ border-radius: 8px;
271
+ padding: 1rem;
272
+ width: 200px;
273
+ pointer-events: none;
274
+ opacity: 0;
275
+ transition: opacity 0.3s ease;
276
+ z-index: 20;
277
+ }
278
+
279
+ .location-tooltip h4 {
280
+ margin-top: 0;
281
+ margin-bottom: 0.5rem;
282
+ font-size: 1rem;
283
+ color: var(--accent-color-1);
284
+ }
285
+
286
+ .location-tooltip p {
287
+ margin: 0.3rem 0;
288
+ font-size: 0.8rem;
289
+ }
290
+
291
+ .map-legend {
292
+ display: flex;
293
+ justify-content: center;
294
+ gap: 2rem;
295
+ margin-top: 1rem;
296
+ }
297
+
298
+ .legend-item {
299
+ display: flex;
300
+ align-items: center;
301
+ font-size: 0.9rem;
302
+ }
303
+
304
+ .legend-color {
305
+ width: 16px;
306
+ height: 16px;
307
+ border-radius: 50%;
308
+ margin-right: 0.5rem;
309
+ }
310
+
311
+ .legend-color.phase-1 {
312
+ background: #4CAF50;
313
+ }
314
+
315
+ .legend-color.phase-2 {
316
+ background: #FFC107;
317
+ }
318
+
319
+ .legend-color.phase-3 {
320
+ background: #9C27B0;
321
+ }
322
+
323
+ .map-overlay {
324
+ position: absolute;
325
+ top: 0;
326
+ left: 0;
327
+ width: 100%;
328
+ height: 100%;
329
+ background-size: contain;
330
+ background-position: center;
331
+ background-repeat: no-repeat;
332
+ opacity: 0;
333
+ transition: opacity 0.5s ease;
334
+ pointer-events: none;
335
+ }
336
+
337
+ .map-overlay.demographics {
338
+ background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMDAgNTAwIj48cGF0aCBkPSJNNzUsMTAwIEwxMDAsMzAgTDIwMCw1MCBMMjUwLDEwMCBMMjcwLDIwMCBMMjUwLDMwMCBMMjAwLDQwMCBMMTUwLDQ1MCBMMTAwLDQwMCBMNTAsMzAwIEw1MCwyMDAgTDc1LDEwMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJyZ2JhKDAsIDIyNCwgMjU1LCAwLjMpIiBzdHJva2Utd2lkdGg9IjIiLz48Y2lyY2xlIGN4PSIxMDAiIGN5PSIxMDAiIHI9IjMwIiBmaWxsPSJyZ2JhKDc2LCAxNzUsIDgwLCAwLjMpIi8+PGNpcmNsZSBjeD0iMjAwIiBjeT0iMTUwIiByPSI1MCIgZmlsbD0icmdiYSg3NiwgMTc1LCA4MCwgMC41KSIvPjxjaXJjbGUgY3g9IjE1MCIgY3k9IjI1MCIgcj0iNzAiIGZpbGw9InJnYmEoNzYsIDE3NSwgODAsIDAuNykiLz48Y2lyY2xlIGN4PSIxMDAiIGN5PSIzNTAiIHI9IjQwIiBmaWxsPSJyZ2JhKDc2LCAxNzUsIDgwLCAwLjQpIi8+PC9zdmc+');
339
+ }
340
+
341
+ .map-overlay.ev-adoption {
342
+ background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMDAgNTAwIj48cGF0aCBkPSJNNzUsMTAwIEwxMDAsMzAgTDIwMCw1MCBMMjUwLDEwMCBMMjcwLDIwMCBMMjUwLDMwMCBMMjAwLDQwMCBMMTUwLDQ1MCBMMTAwLDQwMCBMNTAsMzAwIEw1MCwyMDAgTDc1LDEwMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJyZ2JhKDAsIDIyNCwgMjU1LCAwLjMpIiBzdHJva2Utd2lkdGg9IjIiLz48cGF0aCBkPSJNMTAwLDEwMCBMMjAwLDE1MCBMMTUwLDI1MCBMMTAwLDM1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJyZ2JhKDI1NSwgMTkzLCA3LCAwLjcpIiBzdHJva2Utd2lkdGg9IjIwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1kYXNoYXJyYXk9IjUsMTAiLz48L3N2Zz4=');
343
+ }
344
+
345
+ .map-stats {
346
+ display: grid;
347
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
348
+ gap: 1rem;
349
+ margin-top: 2rem;
350
+ }
351
+
352
+ .stat-card {
353
+ background: rgba(255, 255, 255, 0.05);
354
+ border-radius: 12px;
355
+ padding: 1rem;
356
+ border: 1px solid rgba(255, 255, 255, 0.1);
357
+ }
358
+
359
+ .stat-card h4 {
360
+ margin-top: 0;
361
+ margin-bottom: 0.5rem;
362
+ font-size: 1rem;
363
+ color: var(--accent-color-1);
364
+ }
365
+
366
+ .stat-value {
367
+ font-size: 1.5rem;
368
+ font-weight: bold;
369
+ margin-bottom: 0.5rem;
370
+ }
371
+
372
+ .stat-description {
373
+ font-size: 0.8rem;
374
+ opacity: 0.8;
375
+ }
376
+
377
+ .map-footer {
378
+ background: rgba(0, 0, 0, 0.3);
379
+ padding: 1rem;
380
+ display: flex;
381
+ justify-content: space-between;
382
+ align-items: center;
383
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
384
+ }
385
+
386
+ .map-actions {
387
+ display: flex;
388
+ gap: 1rem;
389
+ }
390
+
391
+ .map-actions button {
392
+ padding: 0.5rem 1rem;
393
+ border-radius: 4px;
394
+ background: transparent;
395
+ border: 1px solid var(--accent-color-1);
396
+ color: var(--accent-color-1);
397
+ cursor: pointer;
398
+ transition: all 0.3s ease;
399
+ }
400
+
401
+ .map-actions button:hover {
402
+ background: rgba(0, 224, 255, 0.1);
403
+ }
404
+
405
+ .map-actions button.primary {
406
+ background: linear-gradient(90deg, var(--accent-color-1), var(--accent-color-2));
407
+ color: #000;
408
+ border: none;
409
+ }
410
+
411
+ .map-actions button.primary:hover {
412
+ transform: translateY(-3px);
413
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
414
+ }
415
+
416
+ .map-info {
417
+ font-size: 0.9rem;
418
+ opacity: 0.7;
419
+ }
420
+ </style>
421
+ </head>
422
+ <body>
423
+ <div class="noise-overlay"></div>
424
+
425
+ <header>
426
+ <nav>
427
+ <div class="logo">UNITY FLEET</div>
428
+ <div class="nav-links">
429
+ <a href="../index.html#what-is-the-link">What is The Link</a>
430
+ <a href="../index.html#subscription-tiers">Subscription Tiers</a>
431
+ <a href="../index.html#impact-equity">Impact & Equity</a>
432
+ <a href="../index.html#tokenization">ChainLink Tokenization</a>
433
+ <a href="../index.html#rural-plan">Rural Revitalization</a>
434
+ <a href="../index.html#mvp-showcase">MVP Showcase</a>
435
+ </div>
436
+ <div class="mobile-nav-toggle">
437
+ <i class="fas fa-bars"></i>
438
+ </div>
439
+ </nav>
440
+ </header>
441
+
442
+ <main class="component-container">
443
+ <div class="component-header">
444
+ <h1>DEPLOYMENT MAP</h1>
445
+ <p>Explore our phased deployment plan across Illinois with demographic data overlays and EV adoption projections.</p>
446
+ </div>
447
+
448
+ <div class="component-content">
449
+ <div class="deployment-map-container">
450
+ <div class="map-interface">
451
+ <div class="map-header">
452
+ <h2>The Link Deployment Plan</h2>
453
+ <div class="map-controls">
454
+ <button class="map-control-btn active" data-overlay="none">Base Map</button>
455
+ <button class="map-control-btn" data-overlay="demographics">Demographics</button>
456
+ <button class="map-control-btn" data-overlay="ev-adoption">EV Adoption</button>
457
+ </div>
458
+ </div>
459
+
460
+ <div class="map-body">
461
+ <div class="map-filters">
462
+ <div class="filter-group">
463
+ <h3>Deployment Phase</h3>
464
+ <div class="filter-options">
465
+ <div class="filter-option active" data-phase="all">All Phases</div>
466
+ <div class="filter-option" data-phase="1">Phase 1 (2025-2026)</div>
467
+ <div class="filter-option" data-phase="2">Phase 2 (2026-2027)</div>
468
+ <div class="filter-option" data-phase="3">Phase 3 (2027-2028)</div>
469
+ </div>
470
+ </div>
471
+
472
+ <div class="filter-group">
473
+ <h3>Hub Type</h3>
474
+ <div class="filter-options">
475
+ <div class="filter-option active" data-type="all">All Types</div>
476
+ <div class="filter-option" data-type="urban">Urban Hubs</div>
477
+ <div class="filter-option" data-type="suburban">Suburban Hubs</div>
478
+ <div class="filter-option" data-type="rural">Rural Hubs</div>
479
+ <div class="filter-option" data-type="highway">Highway Corridors</div>
480
+ </div>
481
+ </div>
482
+ </div>
483
+
484
+ <div class="map-visualization">
485
+ <div class="illinois-map">
486
+ <!-- Chicago -->
487
+ <div class="map-location phase-1" style="top: 15%; left: 75%;" data-name="Chicago Downtown" data-phase="1" data-type="urban">
488
+ </div>
489
+
490
+ <!-- Springfield -->
491
+ <div class="map-location phase-1" style="top: 50%; left: 45%;" data-name="Springfield Central" data-phase="1" data-type="urban">
492
+ </div>
493
+
494
+ <!-- Champaign-Urbana -->
495
+ <div class="map-location phase-1" style="top: 40%; left: 70%;" data-name="Champaign-Urbana" data-phase="1" data-type="urban">
496
+ </div>
497
+
498
+ <!-- Bloomington-Normal -->
499
+ <div class="map-location phase-1" style="top: 35%; left: 55%;" data-name="Bloomington-Normal" data-phase="1" data-type="urban">
500
+ </div>
501
+
502
+ <!-- Peoria -->
503
+ <div class="map-location phase-1" style="top: 30%; left: 40%;" data-name="Peoria" data-phase="1" data-type="urban">
504
+ </div>
505
+
506
+ <!-- Rockford -->
507
+ <div class="map-location phase-2" style="top: 10%; left: 35%;" data-name="Rockford" data-phase="2" data-type="urban">
508
+ </div>
509
+
510
+ <!-- Naperville -->
511
+ <div class="map-location phase-2" style="top: 20%; left: 65%;" data-name="Naperville" data-phase="2" data-type="suburban">
512
+ </div>
513
+
514
+ <!-- Joliet -->
515
+ <div class="map-location phase-2" style="top: 25%; left: 60%;" data-name="Joliet" data-phase="2" data-type="suburban">
516
+ </div>
517
+
518
+ <!-- Decatur -->
519
+ <div class="map-location phase-2" style="top: 55%; left: 55%;" data-name="Decatur" data-phase="2" data-type="urban">
520
+ </div>
521
+
522
+ <!-- Quincy -->
523
+ <div class="map-location phase-2" style="top: 45%; left: 15%;" data-name="Quincy" data-phase="2" data-type="rural">
524
+ </div>
525
+
526
+ <!-- Carbondale -->
527
+ <div class="map-location phase-3" style="top: 80%; left: 40%;" data-name="Carbondale" data-phase="3" data-type="rural">
528
+ </div>
529
+
530
+ <!-- Effingham -->
531
+ <div class="map-location phase-3" style="top: 65%; left: 60%;" data-name="Effingham" data-phase="3" data-type="highway">
532
+ </div>
533
+
534
+ <!-- Galesburg -->
535
+ <div class="map-location phase-3" style="top: 25%; left: 25%;" data-name="Galesburg" data-phase="3" data-type="rural">
536
+ </div>
537
+
538
+ <!-- Mt. Vernon -->
539
+ <div class="map-location phase-3" style="top: 70%; left: 50%;" data-name="Mt. Vernon" data-phase="3" data-type="highway">
540
+ </div>
541
+
542
+ <!-- I-55 Corridor -->
543
+ <div class="map-location phase-2" style="top: 40%; left: 50%;" data-name="I-55 Corridor Hub" data-phase="2" data-type="highway">
544
+ </div>
545
+
546
+ <div class="location-tooltip"></div>
547
+
548
+ <div class="map-overlay demographics"></div>
549
+ <div class="map-overlay ev-adoption"></div>
550
+ </div>
551
+
552
+ <div class="map-legend">
553
+ <div class="legend-item">
554
+ <div class="legend-color phase-1"></div>
555
+ <span>Phase 1 (2025-2026)</span>
556
+ </div>
557
+ <div class="legend-item">
558
+ <div class="legend-color phase-2"></div>
559
+ <span>Phase 2 (2026-2027)</span>
560
+ </div>
561
+ <div class="legend-item">
562
+ <div class="legend-color phase-3"></div>
563
+ <span>Phase 3 (2027-2028)</span>
564
+ </div>
565
+ </div>
566
+ </div>
567
+
568
+ <div class="map-stats">
569
+ <div class="stat-card">
570
+ <h4>Total Planned Hubs</h4>
571
+ <div class="stat-value">15</div>
572
+ <div class="stat-description">Across urban, suburban, and rural areas</div>
573
+ </div>
574
+
575
+ <div class="stat-card">
576
+ <h4>Population Coverage</h4>
577
+ <div class="stat-value">85%</div>
578
+ <div class="stat-description">Of Illinois residents within 30 miles of a hub</div>
579
+ </div>
580
+
581
+ <div class="stat-card">
582
+ <h4>Total Charging Ports</h4>
583
+ <div class="stat-value">120</div>
584
+ <div class="stat-description">Including 80 DC fast chargers and 40 Level 2</div>
585
+ </div>
586
+
587
+ <div class="stat-card">
588
+ <h4>Projected Annual Usage</h4>
589
+ <div class="stat-value">1.2M</div>
590
+ <div class="stat-description">Charging sessions per year at full deployment</div>
591
+ </div>
592
+ </div>
593
+ </div>
594
+
595
+ <div class="map-footer">
596
+ <div class="map-actions">
597
+ <button id="reset-btn">Reset Filters</button>
598
+ <button id="download-btn" class="primary">Download Deployment Plan</button>
599
+ </div>
600
+ <div class="map-info">
601
+ Last Updated: June 1, 2025 | Data Source: Unity Fleet Planning Division
602
+ </div>
603
+ </div>
604
+ </div>
605
+ </div>
606
+ </div>
607
+
608
+ <div class="component-features">
609
+ <h2>Key Features</h2>
610
+ <ul class="features-list">
611
+ <li>Interactive map of Illinois showing all planned charging hub locations</li>
612
+ <li>Color-coded visualization of the three-phase deployment timeline</li>
613
+ <li>Demographic data overlay showing population density and income distribution</li>
614
+ <li>EV adoption projection layer highlighting areas of expected growth</li>
615
+ <li>Filtering options by deployment phase and hub type</li>
616
+ <li>Detailed information for each location including specifications and timeline</li>
617
+ <li>Coverage statistics showing population access and charging capacity</li>
618
+ </ul>
619
+ </div>
620
+
621
+ <a href="../index.html#mvp-showcase" class="back-to-home">
622
+ <i class="fas fa-arrow-left"></i> Back to MVP Showcase
623
+ </a>
624
+ </main>
625
+
626
+ <footer>
627
+ <div class="container">
628
+ <div class="footer-content">
629
+ <div class="footer-logo">
630
+ <div class="logo">UNITY FLEET</div>
631
+ <p>Revolutionizing electric vehicle infrastructure across Illinois</p>
632
+ </div>
633
+
634
+ <div class="footer-links">
635
+ <div class="link-column">
636
+ <h4>Navigation</h4>
637
+ <a href="../index.html#what-is-the-link">What is The Link</a>
638
+ <a href="../index.html#subscription-tiers">Subscription Tiers</a>
639
+ <a href="../index.html#impact-equity">Impact & Equity</a>
640
+ <a href="../index.html#tokenization">ChainLink Tokenization</a>
641
+ <a href="../index.html#rural-plan">Rural Revitalization</a>
642
+ <a href="../index.html#mvp-showcase">MVP Showcase</a>
643
+ </div>
644
+
645
+ <div class="link-column">
646
+ <h4>Contact</h4>
647
+ <a href="mailto:[email protected]">[email protected]</a>
648
+ <a href="tel:+12175551234">+1 (217) 555-1234</a>
649
+ <p>2457 E Eldorado St<br>Decatur, IL 62521</p>
650
+ </div>
651
+
652
+ <div class="link-column">
653
+ <h4>Legal</h4>
654
+ <a href="#">Privacy Policy</a>
655
+ <a href="#">Terms of Service</a>
656
+ <a href="#">Accessibility</a>
657
+ </div>
658
+ </div>
659
+
660
+ <div class="footer-social">
661
+ <a href="#" class="social-icon"><i class="fab fa-twitter"></i></a>
662
+ <a href="#" class="social-icon"><i class="fab fa-linkedin"></i></a>
663
+ <a href="#" class="social-icon"><i class="fab fa-facebook"></i></a>
664
+ <a href="#" class="social-icon"><i class="fab fa-instagram"></i></a>
665
+ </div>
666
+ </div>
667
+
668
+ <div class="footer-bottom">
669
+ <p>&copy; 2025 Unity Fleet LLC. All rights reserved.</p>
670
+ </div>
671
+ </div>
672
+ </footer>
673
+
674
+ <script>
675
+ // Mobile navigation toggle
676
+ document.querySelector('.mobile-nav-toggle').addEventListener('click', function() {
677
+ document.querySelector('.nav-links').classList.toggle('active');
678
+ this.innerHTML = document.querySelector('.nav-links').classList.contains('active')
679
+ ? '<i class="fas fa-times"></i>'
680
+ : '<i class="fas fa-bars"></i>';
681
+ });
682
+
683
+ // Deployment map interactivity
684
+ document.addEventListener('DOMContentLoaded', function() {
685
+ const mapLocations = document.querySelectorAll('.map-location');
686
+ const tooltip = document.querySelector('.location-tooltip');
687
+ const overlayButtons = document.querySelectorAll('.map-control-btn');
688
+ const overlays = document.querySelectorAll('.map-overlay');
689
+ const phaseFilters = document.querySelectorAll('.filter-option[data-phase]');
690
+ const typeFilters = document.querySelectorAll('.filter-option[data-type]');
691
+ const resetButton = document.getElementById('reset-btn');
692
+
693
+ // Location hover effects
694
+ mapLocations.forEach(location => {
695
+ location.addEventListener('mouseenter', function(e) {
696
+ const name = this.getAttribute('data-name');
697
+ const phase = this.getAttribute('data-phase');
698
+ const type = this.getAttribute('data-type');
699
+
700
+ let phaseText = '';
701
+ if (phase === '1') phaseText = 'Phase 1 (2025-2026)';
702
+ else if (phase === '2') phaseText = 'Phase 2 (2026-2027)';
703
+ else if (phase === '3') phaseText = 'Phase 3 (2027-2028)';
704
+
705
+ let typeText = '';
706
+ if (type === 'urban') typeText = 'Urban Hub';
707
+ else if (type === 'suburban') typeText = 'Suburban Hub';
708
+ else if (type === 'rural') typeText = 'Rural Hub';
709
+ else if (type === 'highway') typeText = 'Highway Corridor Hub';
710
+
711
+ tooltip.innerHTML = `
712
+ <h4>${name}</h4>
713
+ <p>${phaseText}</p>
714
+ <p>${typeText}</p>
715
+ <p>8 Charging Stations</p>
716
+ `;
717
+
718
+ const rect = this.getBoundingClientRect();
719
+ const mapRect = document.querySelector('.map-visualization').getBoundingClientRect();
720
+
721
+ tooltip.style.left = (e.clientX - mapRect.left + 20) + 'px';
722
+ tooltip.style.top = (e.clientY - mapRect.top - 20) + 'px';
723
+ tooltip.style.opacity = '1';
724
+ });
725
+
726
+ location.addEventListener('mousemove', function(e) {
727
+ const mapRect = document.querySelector('.map-visualization').getBoundingClientRect();
728
+ tooltip.style.left = (e.clientX - mapRect.left + 20) + 'px';
729
+ tooltip.style.top = (e.clientY - mapRect.top - 20) + 'px';
730
+ });
731
+
732
+ location.addEventListener('mouseleave', function() {
733
+ tooltip.style.opacity = '0';
734
+ });
735
+ });
736
+
737
+ // Map overlay controls
738
+ overlayButtons.forEach(button => {
739
+ button.addEventListener('click', function() {
740
+ // Remove active class from all buttons
741
+ overlayButtons.forEach(btn => btn.classList.remove('active'));
742
+
743
+ // Add active class to clicked button
744
+ this.classList.add('active');
745
+
746
+ // Hide all overlays
747
+ overlays.forEach(overlay => overlay.style.opacity = '0');
748
+
749
+ // Show selected overlay
750
+ const overlayType = this.getAttribute('data-overlay');
751
+ if (overlayType !== 'none') {
752
+ document.querySelector(`.map-overlay.${overlayType}`).style.opacity = '0.7';
753
+ }
754
+ });
755
+ });
756
+
757
+ // Phase filters
758
+ phaseFilters.forEach(filter => {
759
+ filter.addEventListener('click', function() {
760
+ // Remove active class from all phase filters
761
+ phaseFilters.forEach(f => f.classList.remove('active'));
762
+
763
+ // Add active class to clicked filter
764
+ this.classList.add('active');
765
+
766
+ // Filter locations
767
+ filterLocations();
768
+ });
769
+ });
770
+
771
+ // Type filters
772
+ typeFilters.forEach(filter => {
773
+ filter.addEventListener('click', function() {
774
+ // Remove active class from all type filters
775
+ typeFilters.forEach(f => f.classList.remove('active'));
776
+
777
+ // Add active class to clicked filter
778
+ this.classList.add('active');
779
+
780
+ // Filter locations
781
+ filterLocations();
782
+ });
783
+ });
784
+
785
+ // Reset filters
786
+ resetButton.addEventListener('click', function() {
787
+ // Reset phase filters
788
+ phaseFilters.forEach(f => f.classList.remove('active'));
789
+ document.querySelector('.filter-option[data-phase="all"]').classList.add('active');
790
+
791
+ // Reset type filters
792
+ typeFilters.forEach(f => f.classList.remove('active'));
793
+ document.querySelector('.filter-option[data-type="all"]').classList.add('active');
794
+
795
+ // Show all locations
796
+ mapLocations.forEach(location => {
797
+ location.style.display = 'block';
798
+ });
799
+
800
+ // Reset overlays
801
+ overlayButtons.forEach(btn => btn.classList.remove('active'));
802
+ document.querySelector('.map-control-btn[data-overlay="none"]').classList.add('active');
803
+ overlays.forEach(overlay => overlay.style.opacity = '0');
804
+ });
805
+
806
+ // Filter locations based on selected filters
807
+ function filterLocations() {
808
+ const selectedPhase = document.querySelector('.filter-option[data-phase].active').getAttribute('data-phase');
809
+ const selectedType = document.querySelector('.filter-option[data-type].active').getAttribute('data-type');
810
+
811
+ mapLocations.forEach(location => {
812
+ const locationPhase = location.getAttribute('data-phase');
813
+ const locationType = location.getAttribute('data-type');
814
+
815
+ const phaseMatch = selectedPhase === 'all' || locationPhase === selectedPhase;
816
+ const typeMatch = selectedType === 'all' || locationType === selectedType;
817
+
818
+ if (phaseMatch && typeMatch) {
819
+ location.style.display = 'block';
820
+ } else {
821
+ location.style.display = 'none';
822
+ }
823
+ });
824
+ }
825
+
826
+ // Download button action
827
+ document.getElementById('download-btn').addEventListener('click', function() {
828
+ alert('Deployment plan PDF would download here in the production version.');
829
+ });
830
+ });
831
+ </script>
832
+ </body>
833
+ </html>
energy-simulation.html ADDED
@@ -0,0 +1,915 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Unity Fleet - Energy Simulation</title>
7
+ <link rel="stylesheet" href="../styles.css">
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
9
+ <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Space+Grotesk:wght@300;400;500;600;700&display=swap" rel="stylesheet">
12
+ <style>
13
+ /* MVP Component specific styles */
14
+ .component-container {
15
+ max-width: 1200px;
16
+ margin: 0 auto;
17
+ padding: 2rem;
18
+ }
19
+
20
+ .component-header {
21
+ text-align: center;
22
+ margin-bottom: 3rem;
23
+ }
24
+
25
+ .component-header h1 {
26
+ font-size: 2.5rem;
27
+ margin-bottom: 1rem;
28
+ background: linear-gradient(90deg, var(--accent-color-1), var(--accent-color-2));
29
+ -webkit-background-clip: text;
30
+ background-clip: text;
31
+ -webkit-text-fill-color: transparent;
32
+ }
33
+
34
+ .component-header p {
35
+ font-size: 1.2rem;
36
+ max-width: 800px;
37
+ margin: 0 auto;
38
+ opacity: 0.8;
39
+ }
40
+
41
+ .component-content {
42
+ background: var(--glass-bg);
43
+ border: 1px solid var(--glass-border);
44
+ border-radius: 16px;
45
+ padding: 2rem;
46
+ margin-bottom: 3rem;
47
+ backdrop-filter: blur(10px);
48
+ }
49
+
50
+ .back-to-home {
51
+ display: inline-block;
52
+ margin-top: 2rem;
53
+ padding: 0.8rem 1.5rem;
54
+ background: transparent;
55
+ border: 1px solid var(--accent-color-1);
56
+ color: var(--accent-color-1);
57
+ border-radius: 4px;
58
+ font-family: var(--font-primary);
59
+ font-weight: 500;
60
+ text-transform: uppercase;
61
+ letter-spacing: 1px;
62
+ transition: all var(--transition-medium);
63
+ }
64
+
65
+ .back-to-home:hover {
66
+ background: rgba(0, 224, 255, 0.1);
67
+ transform: translateY(-3px);
68
+ }
69
+
70
+ /* Energy Simulation specific styles */
71
+ .energy-simulation-container {
72
+ display: flex;
73
+ flex-direction: column;
74
+ align-items: center;
75
+ padding: 1rem;
76
+ }
77
+
78
+ .simulation-interface {
79
+ width: 100%;
80
+ max-width: 900px;
81
+ background-color: #0B0B0F;
82
+ border-radius: 16px;
83
+ overflow: hidden;
84
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.4);
85
+ border: 1px solid rgba(0, 224, 255, 0.3);
86
+ margin-bottom: 2rem;
87
+ }
88
+
89
+ .simulation-header {
90
+ background: linear-gradient(90deg, rgba(0, 224, 255, 0.2), rgba(53, 242, 219, 0.2));
91
+ padding: 1.5rem;
92
+ display: flex;
93
+ justify-content: space-between;
94
+ align-items: center;
95
+ }
96
+
97
+ .simulation-header h2 {
98
+ margin: 0;
99
+ font-size: 1.5rem;
100
+ }
101
+
102
+ .simulation-time {
103
+ font-size: 1rem;
104
+ opacity: 0.8;
105
+ }
106
+
107
+ .simulation-body {
108
+ padding: 2rem;
109
+ }
110
+
111
+ .simulation-controls {
112
+ display: flex;
113
+ flex-wrap: wrap;
114
+ gap: 1rem;
115
+ margin-bottom: 2rem;
116
+ justify-content: center;
117
+ }
118
+
119
+ .control-group {
120
+ background: rgba(255, 255, 255, 0.05);
121
+ border-radius: 12px;
122
+ padding: 1rem;
123
+ border: 1px solid rgba(255, 255, 255, 0.1);
124
+ min-width: 200px;
125
+ }
126
+
127
+ .control-group h3 {
128
+ margin-top: 0;
129
+ margin-bottom: 1rem;
130
+ font-size: 1.1rem;
131
+ color: var(--accent-color-1);
132
+ }
133
+
134
+ .control-item {
135
+ margin-bottom: 1rem;
136
+ }
137
+
138
+ .control-item label {
139
+ display: block;
140
+ margin-bottom: 0.5rem;
141
+ font-size: 0.9rem;
142
+ opacity: 0.8;
143
+ }
144
+
145
+ .control-item input[type="range"] {
146
+ width: 100%;
147
+ background: rgba(255, 255, 255, 0.1);
148
+ height: 6px;
149
+ border-radius: 3px;
150
+ -webkit-appearance: none;
151
+ }
152
+
153
+ .control-item input[type="range"]::-webkit-slider-thumb {
154
+ -webkit-appearance: none;
155
+ width: 16px;
156
+ height: 16px;
157
+ border-radius: 50%;
158
+ background: var(--accent-color-1);
159
+ cursor: pointer;
160
+ }
161
+
162
+ .control-item .value-display {
163
+ display: flex;
164
+ justify-content: space-between;
165
+ font-size: 0.8rem;
166
+ margin-top: 0.5rem;
167
+ }
168
+
169
+ .control-item select {
170
+ width: 100%;
171
+ padding: 0.5rem;
172
+ background: rgba(255, 255, 255, 0.1);
173
+ border: 1px solid rgba(255, 255, 255, 0.2);
174
+ border-radius: 4px;
175
+ color: white;
176
+ }
177
+
178
+ .simulation-visualization {
179
+ background: rgba(0, 0, 0, 0.3);
180
+ border-radius: 12px;
181
+ padding: 2rem;
182
+ position: relative;
183
+ height: 400px;
184
+ overflow: hidden;
185
+ }
186
+
187
+ .energy-flow-diagram {
188
+ position: relative;
189
+ width: 100%;
190
+ height: 100%;
191
+ }
192
+
193
+ .energy-node {
194
+ position: absolute;
195
+ width: 80px;
196
+ height: 80px;
197
+ border-radius: 50%;
198
+ display: flex;
199
+ flex-direction: column;
200
+ align-items: center;
201
+ justify-content: center;
202
+ text-align: center;
203
+ font-size: 0.8rem;
204
+ background: rgba(255, 255, 255, 0.1);
205
+ border: 2px solid rgba(255, 255, 255, 0.2);
206
+ transition: all 0.3s ease;
207
+ }
208
+
209
+ .energy-node:hover {
210
+ transform: scale(1.1);
211
+ z-index: 10;
212
+ }
213
+
214
+ .energy-node .icon {
215
+ font-size: 1.5rem;
216
+ margin-bottom: 0.3rem;
217
+ }
218
+
219
+ .energy-node .label {
220
+ font-weight: bold;
221
+ }
222
+
223
+ .energy-node .value {
224
+ font-size: 0.7rem;
225
+ opacity: 0.8;
226
+ }
227
+
228
+ .solar-node {
229
+ top: 20px;
230
+ left: 50%;
231
+ transform: translateX(-50%);
232
+ background: rgba(255, 193, 7, 0.2);
233
+ border-color: #FFC107;
234
+ }
235
+
236
+ .solar-node .icon {
237
+ color: #FFC107;
238
+ }
239
+
240
+ .battery-node {
241
+ top: 50%;
242
+ left: 20%;
243
+ transform: translateY(-50%);
244
+ background: rgba(0, 224, 255, 0.2);
245
+ border-color: var(--accent-color-1);
246
+ }
247
+
248
+ .battery-node .icon {
249
+ color: var(--accent-color-1);
250
+ }
251
+
252
+ .grid-node {
253
+ top: 50%;
254
+ right: 20%;
255
+ transform: translateY(-50%);
256
+ background: rgba(156, 39, 176, 0.2);
257
+ border-color: #9C27B0;
258
+ }
259
+
260
+ .grid-node .icon {
261
+ color: #9C27B0;
262
+ }
263
+
264
+ .charging-node {
265
+ bottom: 20px;
266
+ left: 50%;
267
+ transform: translateX(-50%);
268
+ background: rgba(76, 175, 80, 0.2);
269
+ border-color: #4CAF50;
270
+ }
271
+
272
+ .charging-node .icon {
273
+ color: #4CAF50;
274
+ }
275
+
276
+ .energy-flow {
277
+ position: absolute;
278
+ background: linear-gradient(90deg, rgba(255, 255, 255, 0.5), rgba(255, 255, 255, 0.1));
279
+ height: 3px;
280
+ transform-origin: left center;
281
+ animation: flowPulse 2s infinite;
282
+ }
283
+
284
+ @keyframes flowPulse {
285
+ 0% {
286
+ opacity: 0.3;
287
+ }
288
+ 50% {
289
+ opacity: 1;
290
+ }
291
+ 100% {
292
+ opacity: 0.3;
293
+ }
294
+ }
295
+
296
+ .solar-to-battery {
297
+ top: 70px;
298
+ left: 50%;
299
+ width: 150px;
300
+ transform: rotate(135deg);
301
+ background: linear-gradient(90deg, rgba(255, 193, 7, 0.5), rgba(0, 224, 255, 0.5));
302
+ }
303
+
304
+ .solar-to-charging {
305
+ top: 100px;
306
+ left: 50%;
307
+ height: 200px;
308
+ width: 3px;
309
+ transform: none;
310
+ background: linear-gradient(180deg, rgba(255, 193, 7, 0.5), rgba(76, 175, 80, 0.5));
311
+ }
312
+
313
+ .battery-to-charging {
314
+ bottom: 150px;
315
+ left: 25%;
316
+ width: 150px;
317
+ transform: rotate(45deg);
318
+ background: linear-gradient(90deg, rgba(0, 224, 255, 0.5), rgba(76, 175, 80, 0.5));
319
+ }
320
+
321
+ .grid-to-charging {
322
+ bottom: 150px;
323
+ right: 25%;
324
+ width: 150px;
325
+ transform: rotate(-45deg);
326
+ background: linear-gradient(90deg, rgba(156, 39, 176, 0.5), rgba(76, 175, 80, 0.5));
327
+ }
328
+
329
+ .grid-to-battery {
330
+ top: 50%;
331
+ left: 30%;
332
+ width: 40%;
333
+ background: linear-gradient(90deg, rgba(0, 224, 255, 0.5), rgba(156, 39, 176, 0.5));
334
+ }
335
+
336
+ .flow-particle {
337
+ position: absolute;
338
+ width: 8px;
339
+ height: 8px;
340
+ border-radius: 50%;
341
+ background: white;
342
+ animation: flowMove 3s linear infinite;
343
+ }
344
+
345
+ @keyframes flowMove {
346
+ 0% {
347
+ left: 0;
348
+ opacity: 0;
349
+ }
350
+ 10% {
351
+ opacity: 1;
352
+ }
353
+ 90% {
354
+ opacity: 1;
355
+ }
356
+ 100% {
357
+ left: calc(100% - 8px);
358
+ opacity: 0;
359
+ }
360
+ }
361
+
362
+ .simulation-stats {
363
+ display: grid;
364
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
365
+ gap: 1rem;
366
+ margin-top: 2rem;
367
+ }
368
+
369
+ .stat-card {
370
+ background: rgba(255, 255, 255, 0.05);
371
+ border-radius: 12px;
372
+ padding: 1rem;
373
+ border: 1px solid rgba(255, 255, 255, 0.1);
374
+ }
375
+
376
+ .stat-card h4 {
377
+ margin-top: 0;
378
+ margin-bottom: 0.5rem;
379
+ font-size: 1rem;
380
+ color: var(--accent-color-1);
381
+ }
382
+
383
+ .stat-value {
384
+ font-size: 1.5rem;
385
+ font-weight: bold;
386
+ margin-bottom: 0.5rem;
387
+ }
388
+
389
+ .stat-change {
390
+ font-size: 0.8rem;
391
+ display: flex;
392
+ align-items: center;
393
+ }
394
+
395
+ .stat-change.positive {
396
+ color: #4CAF50;
397
+ }
398
+
399
+ .stat-change.negative {
400
+ color: #F44336;
401
+ }
402
+
403
+ .stat-change i {
404
+ margin-right: 0.3rem;
405
+ }
406
+
407
+ .simulation-footer {
408
+ background: rgba(0, 0, 0, 0.3);
409
+ padding: 1rem;
410
+ display: flex;
411
+ justify-content: space-between;
412
+ align-items: center;
413
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
414
+ }
415
+
416
+ .simulation-actions {
417
+ display: flex;
418
+ gap: 1rem;
419
+ }
420
+
421
+ .simulation-actions button {
422
+ padding: 0.5rem 1rem;
423
+ border-radius: 4px;
424
+ background: transparent;
425
+ border: 1px solid var(--accent-color-1);
426
+ color: var(--accent-color-1);
427
+ cursor: pointer;
428
+ transition: all 0.3s ease;
429
+ }
430
+
431
+ .simulation-actions button:hover {
432
+ background: rgba(0, 224, 255, 0.1);
433
+ }
434
+
435
+ .simulation-actions button.primary {
436
+ background: linear-gradient(90deg, var(--accent-color-1), var(--accent-color-2));
437
+ color: #000;
438
+ border: none;
439
+ }
440
+
441
+ .simulation-actions button.primary:hover {
442
+ transform: translateY(-3px);
443
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
444
+ }
445
+
446
+ .simulation-status {
447
+ font-size: 0.9rem;
448
+ opacity: 0.7;
449
+ }
450
+ </style>
451
+ </head>
452
+ <body>
453
+ <div class="noise-overlay"></div>
454
+
455
+ <header>
456
+ <nav>
457
+ <div class="logo">UNITY FLEET</div>
458
+ <div class="nav-links">
459
+ <a href="../index.html#what-is-the-link">What is The Link</a>
460
+ <a href="../index.html#subscription-tiers">Subscription Tiers</a>
461
+ <a href="../index.html#impact-equity">Impact & Equity</a>
462
+ <a href="../index.html#tokenization">ChainLink Tokenization</a>
463
+ <a href="../index.html#rural-plan">Rural Revitalization</a>
464
+ <a href="../index.html#mvp-showcase">MVP Showcase</a>
465
+ </div>
466
+ <div class="mobile-nav-toggle">
467
+ <i class="fas fa-bars"></i>
468
+ </div>
469
+ </nav>
470
+ </header>
471
+
472
+ <main class="component-container">
473
+ <div class="component-header">
474
+ <h1>ENERGY SIMULATION</h1>
475
+ <p>Visualize how our integrated solar and battery systems optimize energy flow, reduce emissions, and create a sustainable charging ecosystem.</p>
476
+ </div>
477
+
478
+ <div class="component-content">
479
+ <div class="energy-simulation-container">
480
+ <div class="simulation-interface">
481
+ <div class="simulation-header">
482
+ <h2>The Link Energy Simulation</h2>
483
+ <div class="simulation-time">
484
+ <span id="sim-time">12:30 PM</span> | <span id="sim-date">June 15, 2025</span>
485
+ </div>
486
+ </div>
487
+
488
+ <div class="simulation-body">
489
+ <div class="simulation-controls">
490
+ <div class="control-group">
491
+ <h3>Environmental Factors</h3>
492
+ <div class="control-item">
493
+ <label for="solar-intensity">Solar Intensity</label>
494
+ <input type="range" id="solar-intensity" min="0" max="100" value="75">
495
+ <div class="value-display">
496
+ <span>Low</span>
497
+ <span id="solar-value">75%</span>
498
+ <span>High</span>
499
+ </div>
500
+ </div>
501
+ <div class="control-item">
502
+ <label for="time-of-day">Time of Day</label>
503
+ <select id="time-of-day">
504
+ <option value="morning">Morning (8 AM)</option>
505
+ <option value="noon" selected>Noon (12 PM)</option>
506
+ <option value="afternoon">Afternoon (4 PM)</option>
507
+ <option value="evening">Evening (8 PM)</option>
508
+ <option value="night">Night (12 AM)</option>
509
+ </select>
510
+ </div>
511
+ </div>
512
+
513
+ <div class="control-group">
514
+ <h3>Charging Demand</h3>
515
+ <div class="control-item">
516
+ <label for="station-usage">Station Usage</label>
517
+ <input type="range" id="station-usage" min="0" max="100" value="60">
518
+ <div class="value-display">
519
+ <span>Low</span>
520
+ <span id="usage-value">60%</span>
521
+ <span>High</span>
522
+ </div>
523
+ </div>
524
+ <div class="control-item">
525
+ <label for="charging-speed">Charging Speed</label>
526
+ <select id="charging-speed">
527
+ <option value="slow">Level 2 (19.2 kW)</option>
528
+ <option value="medium" selected>DC Fast (150 kW)</option>
529
+ <option value="fast">Ultra Fast (350 kW)</option>
530
+ </select>
531
+ </div>
532
+ </div>
533
+
534
+ <div class="control-group">
535
+ <h3>Storage Settings</h3>
536
+ <div class="control-item">
537
+ <label for="battery-capacity">Battery Capacity</label>
538
+ <input type="range" id="battery-capacity" min="0" max="100" value="80">
539
+ <div class="value-display">
540
+ <span>0%</span>
541
+ <span id="battery-value">80%</span>
542
+ <span>100%</span>
543
+ </div>
544
+ </div>
545
+ <div class="control-item">
546
+ <label for="grid-reliance">Grid Reliance</label>
547
+ <input type="range" id="grid-reliance" min="0" max="100" value="25">
548
+ <div class="value-display">
549
+ <span>Low</span>
550
+ <span id="grid-value">25%</span>
551
+ <span>High</span>
552
+ </div>
553
+ </div>
554
+ </div>
555
+ </div>
556
+
557
+ <div class="simulation-visualization">
558
+ <div class="energy-flow-diagram">
559
+ <div class="energy-node solar-node">
560
+ <div class="icon"><i class="fas fa-solar-panel"></i></div>
561
+ <div class="label">Solar Array</div>
562
+ <div class="value">75 kW</div>
563
+ </div>
564
+
565
+ <div class="energy-node battery-node">
566
+ <div class="icon"><i class="fas fa-battery-three-quarters"></i></div>
567
+ <div class="label">Battery</div>
568
+ <div class="value">80% | 240 kWh</div>
569
+ </div>
570
+
571
+ <div class="energy-node grid-node">
572
+ <div class="icon"><i class="fas fa-plug"></i></div>
573
+ <div class="label">Grid</div>
574
+ <div class="value">25 kW</div>
575
+ </div>
576
+
577
+ <div class="energy-node charging-node">
578
+ <div class="icon"><i class="fas fa-charging-station"></i></div>
579
+ <div class="label">Charging</div>
580
+ <div class="value">90 kW</div>
581
+ </div>
582
+
583
+ <div class="energy-flow solar-to-battery">
584
+ <div class="flow-particle" style="animation-delay: 0s;"></div>
585
+ <div class="flow-particle" style="animation-delay: 1s;"></div>
586
+ <div class="flow-particle" style="animation-delay: 2s;"></div>
587
+ </div>
588
+
589
+ <div class="energy-flow solar-to-charging">
590
+ <div class="flow-particle" style="animation-delay: 0.5s;"></div>
591
+ <div class="flow-particle" style="animation-delay: 1.5s;"></div>
592
+ <div class="flow-particle" style="animation-delay: 2.5s;"></div>
593
+ </div>
594
+
595
+ <div class="energy-flow battery-to-charging">
596
+ <div class="flow-particle" style="animation-delay: 0.2s;"></div>
597
+ <div class="flow-particle" style="animation-delay: 1.2s;"></div>
598
+ <div class="flow-particle" style="animation-delay: 2.2s;"></div>
599
+ </div>
600
+
601
+ <div class="energy-flow grid-to-charging">
602
+ <div class="flow-particle" style="animation-delay: 0.7s;"></div>
603
+ <div class="flow-particle" style="animation-delay: 1.7s;"></div>
604
+ <div class="flow-particle" style="animation-delay: 2.7s;"></div>
605
+ </div>
606
+
607
+ <div class="energy-flow grid-to-battery">
608
+ <div class="flow-particle" style="animation-delay: 0.3s;"></div>
609
+ <div class="flow-particle" style="animation-delay: 1.3s;"></div>
610
+ <div class="flow-particle" style="animation-delay: 2.3s;"></div>
611
+ </div>
612
+ </div>
613
+ </div>
614
+
615
+ <div class="simulation-stats">
616
+ <div class="stat-card">
617
+ <h4>Renewable Usage</h4>
618
+ <div class="stat-value">75%</div>
619
+ <div class="stat-change positive">
620
+ <i class="fas fa-arrow-up"></i> 12% from grid-only
621
+ </div>
622
+ </div>
623
+
624
+ <div class="stat-card">
625
+ <h4>CO₂ Reduction</h4>
626
+ <div class="stat-value">68 kg</div>
627
+ <div class="stat-change positive">
628
+ <i class="fas fa-arrow-up"></i> 85% from ICE vehicles
629
+ </div>
630
+ </div>
631
+
632
+ <div class="stat-card">
633
+ <h4>Operating Cost</h4>
634
+ <div class="stat-value">$0.12/kWh</div>
635
+ <div class="stat-change negative">
636
+ <i class="fas fa-arrow-down"></i> 40% from grid-only
637
+ </div>
638
+ </div>
639
+
640
+ <div class="stat-card">
641
+ <h4>Grid Demand</h4>
642
+ <div class="stat-value">25 kW</div>
643
+ <div class="stat-change negative">
644
+ <i class="fas fa-arrow-down"></i> 75% from no solar
645
+ </div>
646
+ </div>
647
+ </div>
648
+ </div>
649
+
650
+ <div class="simulation-footer">
651
+ <div class="simulation-actions">
652
+ <button id="reset-btn">Reset Simulation</button>
653
+ <button id="optimize-btn" class="primary">Optimize Energy Flow</button>
654
+ </div>
655
+ <div class="simulation-status">
656
+ System Status: Optimal | Last Updated: <span id="update-time">Just now</span>
657
+ </div>
658
+ </div>
659
+ </div>
660
+ </div>
661
+ </div>
662
+
663
+ <div class="component-features">
664
+ <h2>Key Features</h2>
665
+ <ul class="features-list">
666
+ <li>Real-time visualization of energy flows between solar, battery, grid, and charging stations</li>
667
+ <li>Interactive controls to simulate different environmental conditions and usage scenarios</li>
668
+ <li>Automatic optimization algorithms to maximize renewable energy usage</li>
669
+ <li>Detailed statistics on CO₂ reduction, cost savings, and grid impact</li>
670
+ <li>Time-of-day simulation to model energy management across 24-hour cycles</li>
671
+ <li>Battery storage management with intelligent charge/discharge algorithms</li>
672
+ <li>Grid interaction modeling with peak shaving and demand response capabilities</li>
673
+ </ul>
674
+ </div>
675
+
676
+ <a href="../index.html#mvp-showcase" class="back-to-home">
677
+ <i class="fas fa-arrow-left"></i> Back to MVP Showcase
678
+ </a>
679
+ </main>
680
+
681
+ <footer>
682
+ <div class="container">
683
+ <div class="footer-content">
684
+ <div class="footer-logo">
685
+ <div class="logo">UNITY FLEET</div>
686
+ <p>Revolutionizing electric vehicle infrastructure across Illinois</p>
687
+ </div>
688
+
689
+ <div class="footer-links">
690
+ <div class="link-column">
691
+ <h4>Navigation</h4>
692
+ <a href="../index.html#what-is-the-link">What is The Link</a>
693
+ <a href="../index.html#subscription-tiers">Subscription Tiers</a>
694
+ <a href="../index.html#impact-equity">Impact & Equity</a>
695
+ <a href="../index.html#tokenization">ChainLink Tokenization</a>
696
+ <a href="../index.html#rural-plan">Rural Revitalization</a>
697
+ <a href="../index.html#mvp-showcase">MVP Showcase</a>
698
+ </div>
699
+
700
+ <div class="link-column">
701
+ <h4>Contact</h4>
702
+ <a href="mailto:[email protected]">[email protected]</a>
703
+ <a href="tel:+12175551234">+1 (217) 555-1234</a>
704
+ <p>2457 E Eldorado St<br>Decatur, IL 62521</p>
705
+ </div>
706
+
707
+ <div class="link-column">
708
+ <h4>Legal</h4>
709
+ <a href="#">Privacy Policy</a>
710
+ <a href="#">Terms of Service</a>
711
+ <a href="#">Accessibility</a>
712
+ </div>
713
+ </div>
714
+
715
+ <div class="footer-social">
716
+ <a href="#" class="social-icon"><i class="fab fa-twitter"></i></a>
717
+ <a href="#" class="social-icon"><i class="fab fa-linkedin"></i></a>
718
+ <a href="#" class="social-icon"><i class="fab fa-facebook"></i></a>
719
+ <a href="#" class="social-icon"><i class="fab fa-instagram"></i></a>
720
+ </div>
721
+ </div>
722
+
723
+ <div class="footer-bottom">
724
+ <p>&copy; 2025 Unity Fleet LLC. All rights reserved.</p>
725
+ </div>
726
+ </div>
727
+ </footer>
728
+
729
+ <script>
730
+ // Mobile navigation toggle
731
+ document.querySelector('.mobile-nav-toggle').addEventListener('click', function() {
732
+ document.querySelector('.nav-links').classList.toggle('active');
733
+ this.innerHTML = document.querySelector('.nav-links').classList.contains('active')
734
+ ? '<i class="fas fa-times"></i>'
735
+ : '<i class="fas fa-bars"></i>';
736
+ });
737
+
738
+ // Energy simulation interactivity
739
+ document.addEventListener('DOMContentLoaded', function() {
740
+ // Initialize sliders
741
+ const solarSlider = document.getElementById('solar-intensity');
742
+ const usageSlider = document.getElementById('station-usage');
743
+ const batterySlider = document.getElementById('battery-capacity');
744
+ const gridSlider = document.getElementById('grid-reliance');
745
+
746
+ const solarValue = document.getElementById('solar-value');
747
+ const usageValue = document.getElementById('usage-value');
748
+ const batteryValue = document.getElementById('battery-value');
749
+ const gridValue = document.getElementById('grid-value');
750
+
751
+ // Update values on slider change
752
+ solarSlider.addEventListener('input', function() {
753
+ solarValue.textContent = this.value + '%';
754
+ updateSimulation();
755
+ });
756
+
757
+ usageSlider.addEventListener('input', function() {
758
+ usageValue.textContent = this.value + '%';
759
+ updateSimulation();
760
+ });
761
+
762
+ batterySlider.addEventListener('input', function() {
763
+ batteryValue.textContent = this.value + '%';
764
+ updateSimulation();
765
+ });
766
+
767
+ gridSlider.addEventListener('input', function() {
768
+ gridValue.textContent = this.value + '%';
769
+ updateSimulation();
770
+ });
771
+
772
+ // Time of day and charging speed selectors
773
+ document.getElementById('time-of-day').addEventListener('change', updateSimulation);
774
+ document.getElementById('charging-speed').addEventListener('change', updateSimulation);
775
+
776
+ // Button actions
777
+ document.getElementById('reset-btn').addEventListener('click', resetSimulation);
778
+ document.getElementById('optimize-btn').addEventListener('click', optimizeSimulation);
779
+
780
+ // Update simulation based on current settings
781
+ function updateSimulation() {
782
+ const solarIntensity = parseInt(solarSlider.value);
783
+ const stationUsage = parseInt(usageSlider.value);
784
+ const batteryCapacity = parseInt(batterySlider.value);
785
+ const gridReliance = parseInt(gridSlider.value);
786
+ const timeOfDay = document.getElementById('time-of-day').value;
787
+ const chargingSpeed = document.getElementById('charging-speed').value;
788
+
789
+ // Update node values
790
+ document.querySelector('.solar-node .value').textContent = Math.round(solarIntensity * 1.2) + ' kW';
791
+ document.querySelector('.battery-node .value').textContent = batteryCapacity + '% | ' + Math.round(batteryCapacity * 3) + ' kWh';
792
+ document.querySelector('.grid-node .value').textContent = Math.round(gridReliance * 1.2) + ' kW';
793
+
794
+ let chargingDemand = 0;
795
+ if (chargingSpeed === 'slow') chargingDemand = stationUsage * 0.2;
796
+ else if (chargingSpeed === 'medium') chargingDemand = stationUsage * 0.6;
797
+ else chargingDemand = stationUsage * 1.5;
798
+
799
+ document.querySelector('.charging-node .value').textContent = Math.round(chargingDemand) + ' kW';
800
+
801
+ // Update stats
802
+ const renewablePercentage = Math.round(solarIntensity * (100 - gridReliance) / 100);
803
+ document.querySelector('.stat-card:nth-child(1) .stat-value').textContent = renewablePercentage + '%';
804
+
805
+ const co2Reduction = Math.round(renewablePercentage * 0.9);
806
+ document.querySelector('.stat-card:nth-child(2) .stat-value').textContent = co2Reduction + ' kg';
807
+
808
+ const operatingCost = (0.2 - (renewablePercentage * 0.001)).toFixed(2);
809
+ document.querySelector('.stat-card:nth-child(3) .stat-value').textContent = '$' + operatingCost + '/kWh';
810
+
811
+ document.querySelector('.stat-card:nth-child(4) .stat-value').textContent = Math.round(gridReliance * 1.2) + ' kW';
812
+
813
+ // Update time display based on selection
814
+ let timeDisplay = '';
815
+ switch(timeOfDay) {
816
+ case 'morning': timeDisplay = '8:00 AM'; break;
817
+ case 'noon': timeDisplay = '12:00 PM'; break;
818
+ case 'afternoon': timeDisplay = '4:00 PM'; break;
819
+ case 'evening': timeDisplay = '8:00 PM'; break;
820
+ case 'night': timeDisplay = '12:00 AM'; break;
821
+ }
822
+ document.getElementById('sim-time').textContent = timeDisplay;
823
+
824
+ // Update flow animation speeds based on energy levels
825
+ const flows = document.querySelectorAll('.energy-flow');
826
+ flows.forEach(flow => {
827
+ const particles = flow.querySelectorAll('.flow-particle');
828
+ particles.forEach(particle => {
829
+ let speed = '3s';
830
+ if (flow.classList.contains('solar-to-battery')) {
831
+ speed = (4 - (solarIntensity / 33)) + 's';
832
+ } else if (flow.classList.contains('solar-to-charging')) {
833
+ speed = (4 - (solarIntensity / 33)) + 's';
834
+ } else if (flow.classList.contains('battery-to-charging')) {
835
+ speed = (4 - (batteryCapacity / 33)) + 's';
836
+ } else if (flow.classList.contains('grid-to-charging')) {
837
+ speed = (4 - (gridReliance / 33)) + 's';
838
+ } else if (flow.classList.contains('grid-to-battery')) {
839
+ speed = (4 - (gridReliance / 33)) + 's';
840
+ }
841
+ particle.style.animationDuration = speed;
842
+ });
843
+ });
844
+
845
+ // Update last updated time
846
+ document.getElementById('update-time').textContent = 'Just now';
847
+ }
848
+
849
+ // Reset simulation to default values
850
+ function resetSimulation() {
851
+ solarSlider.value = 75;
852
+ usageSlider.value = 60;
853
+ batterySlider.value = 80;
854
+ gridSlider.value = 25;
855
+
856
+ solarValue.textContent = '75%';
857
+ usageValue.textContent = '60%';
858
+ batteryValue.textContent = '80%';
859
+ gridValue.textContent = '25%';
860
+
861
+ document.getElementById('time-of-day').value = 'noon';
862
+ document.getElementById('charging-speed').value = 'medium';
863
+
864
+ updateSimulation();
865
+ }
866
+
867
+ // Optimize energy flow based on current conditions
868
+ function optimizeSimulation() {
869
+ const timeOfDay = document.getElementById('time-of-day').value;
870
+ const stationUsage = parseInt(usageSlider.value);
871
+
872
+ // Optimization logic based on time of day
873
+ if (timeOfDay === 'morning' || timeOfDay === 'noon') {
874
+ // Maximize solar usage during daylight hours
875
+ solarSlider.value = 90;
876
+ solarValue.textContent = '90%';
877
+ gridSlider.value = 10;
878
+ gridValue.textContent = '10%';
879
+ } else if (timeOfDay === 'afternoon') {
880
+ // Balance solar and battery in afternoon
881
+ solarSlider.value = 70;
882
+ solarValue.textContent = '70%';
883
+ batterySlider.value = 90;
884
+ batteryValue.textContent = '90%';
885
+ gridSlider.value = 15;
886
+ gridValue.textContent = '15%';
887
+ } else {
888
+ // Rely on battery at night with minimal grid
889
+ batterySlider.value = 95;
890
+ batteryValue.textContent = '95%';
891
+ solarSlider.value = 0;
892
+ solarValue.textContent = '0%';
893
+ gridSlider.value = 30;
894
+ gridValue.textContent = '30%';
895
+ }
896
+
897
+ // Adjust based on station usage
898
+ if (stationUsage > 80) {
899
+ // High demand needs more grid support
900
+ gridSlider.value = parseInt(gridSlider.value) + 15;
901
+ gridValue.textContent = gridSlider.value + '%';
902
+ }
903
+
904
+ updateSimulation();
905
+
906
+ // Show optimization message
907
+ document.querySelector('.simulation-status').textContent = 'System Status: Optimized | Last Updated: Just now';
908
+ }
909
+
910
+ // Initialize simulation
911
+ updateSimulation();
912
+ });
913
+ </script>
914
+ </body>
915
+ </html>
index.html CHANGED
@@ -1,29 +1,544 @@
1
  <!DOCTYPE html>
2
  <html lang="en">
3
-
4
  <head>
5
- <meta charset="UTF-8" />
6
- <link rel="stylesheet" href="style.css" />
7
-
8
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
9
- <title>Transformers.js - Object Detection</title>
 
 
 
10
  </head>
11
-
12
  <body>
13
- <h1>Object Detection w/ 🤗 Transformers.js</h1>
14
- <label id="container" for="upload">
15
- <svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
16
- <path fill="#000"
17
- d="M3.5 24.3a3 3 0 0 1-1.9-.8c-.5-.5-.8-1.2-.8-1.9V2.9c0-.7.3-1.3.8-1.9.6-.5 1.2-.7 2-.7h18.6c.7 0 1.3.2 1.9.7.5.6.7 1.2.7 2v18.6c0 .7-.2 1.4-.7 1.9a3 3 0 0 1-2 .8H3.6Zm0-2.7h18.7V2.9H3.5v18.7Zm2.7-2.7h13.3c.3 0 .5 0 .6-.3v-.7l-3.7-5a.6.6 0 0 0-.6-.2c-.2 0-.4 0-.5.3l-3.5 4.6-2.4-3.3a.6.6 0 0 0-.6-.3c-.2 0-.4.1-.5.3l-2.7 3.6c-.1.2-.2.4 0 .7.1.2.3.3.6.3Z">
18
- </path>
19
- </svg>
20
- Click to upload image
21
- <label id="example">(or try example)</label>
22
- </label>
23
- <label id="status">Loading model...</label>
24
- <input id="upload" type="file" accept="image/*" />
25
-
26
- <script src="index.js" type="module"></script>
27
- </body>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
 
29
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <!DOCTYPE html>
2
  <html lang="en">
 
3
  <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Unity Fleet - The Link EV Charging Network</title>
7
+ <link rel="stylesheet" href="styles.css">
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
9
+ <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Space+Grotesk:wght@300;400;500;600;700&display=swap" rel="stylesheet">
12
  </head>
 
13
  <body>
14
+ <div class="noise-overlay"></div>
15
+
16
+ <header>
17
+ <nav>
18
+ <div class="logo">UNITY FLEET</div>
19
+ <div class="nav-links">
20
+ <a href="#what-is-the-link">What is The Link</a>
21
+ <a href="#subscription-tiers">Subscription Tiers</a>
22
+ <a href="#impact-equity">Impact & Equity</a>
23
+ <a href="#tokenization">ChainLink Tokenization</a>
24
+ <a href="#rural-plan">Rural Revitalization</a>
25
+ <a href="#mvp-showcase">MVP Showcase</a>
26
+ </div>
27
+ </nav>
28
+
29
+ <div class="hero">
30
+ <div class="hero-content">
31
+ <h1 class="glitch-text">UNITY FLEET</h1>
32
+ <h2>The Link EV Charging Network</h2>
33
+ <p>Revolutionizing electric vehicle infrastructure across Illinois</p>
34
+ <div class="cta-buttons">
35
+ <a href="#project-overview" class="btn primary-btn">Explore The Project</a>
36
+ <a href="#grant-proposal" class="btn secondary-btn">View Grant Proposal</a>
37
+ </div>
38
+ </div>
39
+ <div class="hero-image-container">
40
+ <div class="hero-image" style="background-image: url('DA9BA4EE-1541-40D5-BD7B-F3D9227808D1.png');"></div>
41
+ </div>
42
+ </div>
43
+ </header>
44
+
45
+ <section id="what-is-the-link" class="section-dark">
46
+ <div class="container">
47
+ <div class="section-header">
48
+ <h2>What is The Link?</h2>
49
+ <div class="section-line"></div>
50
+ </div>
51
+ <div class="content-grid">
52
+ <div class="text-content">
53
+ <p class="highlight-text">A revolutionary approach to EV charging infrastructure, reimagining charging stations as destination hubs that combine fast-charging capabilities with amenity-rich environments.</p>
54
+
55
+ <div class="feature-list">
56
+ <div class="feature-item">
57
+ <div class="feature-icon"><i class="fas fa-bolt"></i></div>
58
+ <div class="feature-text">
59
+ <h3>Advanced Charging</h3>
60
+ <p>Multiple DC Fast Charging ports with 150kW capability and future-ready design for heavy-duty vehicles</p>
61
+ </div>
62
+ </div>
63
+
64
+ <div class="feature-item">
65
+ <div class="feature-icon"><i class="fas fa-solar-panel"></i></div>
66
+ <div class="feature-text">
67
+ <h3>Solar Integration</h3>
68
+ <p>On-site solar generation with battery storage for truly emissions-free charging</p>
69
+ </div>
70
+ </div>
71
+
72
+ <div class="feature-item">
73
+ <div class="feature-icon"><i class="fas fa-coffee"></i></div>
74
+ <div class="feature-text">
75
+ <h3>Premium Amenities</h3>
76
+ <p>Elevated lounge areas with refreshments, Wi-Fi, and productivity spaces</p>
77
+ </div>
78
+ </div>
79
+
80
+ <div class="feature-item">
81
+ <div class="feature-icon"><i class="fas fa-mobile-alt"></i></div>
82
+ <div class="feature-text">
83
+ <h3>Smart Technology</h3>
84
+ <p>AI-powered management systems and seamless mobile app integration</p>
85
+ </div>
86
+ </div>
87
+ </div>
88
+ </div>
89
+ <div class="image-content">
90
+ <div class="image-card">
91
+ <img src="4A717E73-3287-4051-AE08-44EB1DD21F7F.png" alt="The Link Charging Hub">
92
+ <div class="image-overlay">
93
+ <span>The Link Charging Hub</span>
94
+ </div>
95
+ </div>
96
+ </div>
97
+ </div>
98
+ </div>
99
+ </section>
100
+
101
+ <section id="subscription-tiers" class="section-gradient">
102
+ <div class="container">
103
+ <div class="section-header">
104
+ <h2>Unity Fleet Subscription Tiers</h2>
105
+ <div class="section-line"></div>
106
+ </div>
107
+
108
+ <div class="subscription-cards">
109
+ <div class="subscription-card">
110
+ <div class="card-header">
111
+ <h3>FlexRide</h3>
112
+ <div class="price">Starting at $299/mo</div>
113
+ </div>
114
+ <div class="card-content">
115
+ <ul>
116
+ <li>Access to shared EVs on a regular basis</li>
117
+ <li>Balances affordability and convenience</li>
118
+ <li>Includes insurance and maintenance</li>
119
+ <li>Priority charging at The Link hubs</li>
120
+ <li>Flexible booking through mobile app</li>
121
+ </ul>
122
+ <div class="card-cta">
123
+ <a href="#" class="btn card-btn">Learn More</a>
124
+ </div>
125
+ </div>
126
+ </div>
127
+
128
+ <div class="subscription-card featured">
129
+ <div class="card-header">
130
+ <h3>Take-Home</h3>
131
+ <div class="price">Starting at $699/mo</div>
132
+ </div>
133
+ <div class="card-content">
134
+ <ul>
135
+ <li>Exclusive access to a dedicated EV</li>
136
+ <li>Multiple tiers with different mileage allowances</li>
137
+ <li>Comprehensive insurance coverage</li>
138
+ <li>All maintenance and charging included</li>
139
+ <li>Vehicle upgrades available</li>
140
+ </ul>
141
+ <div class="card-cta">
142
+ <a href="#" class="btn card-btn">Learn More</a>
143
+ </div>
144
+ </div>
145
+ </div>
146
+
147
+ <div class="subscription-card">
148
+ <div class="card-header">
149
+ <h3>All-Access</h3>
150
+ <div class="price">Starting at $499/mo</div>
151
+ </div>
152
+ <div class="card-content">
153
+ <ul>
154
+ <li>Unlimited rides within designated areas</li>
155
+ <li>Flat daily or monthly fee</li>
156
+ <li>Eliminates personal vehicle reliance</li>
157
+ <li>Includes all charging and maintenance</li>
158
+ <li>24/7 vehicle availability</li>
159
+ </ul>
160
+ <div class="card-cta">
161
+ <a href="#" class="btn card-btn">Learn More</a>
162
+ </div>
163
+ </div>
164
+ </div>
165
+ </div>
166
+ </div>
167
+ </section>
168
+
169
+ <section id="impact-equity" class="section-dark">
170
+ <div class="container">
171
+ <div class="section-header">
172
+ <h2>Impact & Equity</h2>
173
+ <div class="section-line"></div>
174
+ </div>
175
+
176
+ <div class="content-columns">
177
+ <div class="column">
178
+ <h3>Environmental Impact</h3>
179
+ <div class="impact-metric">
180
+ <div class="metric-number">3-4</div>
181
+ <div class="metric-text">Metric tons of CO2 reduced annually per EV</div>
182
+ </div>
183
+ <div class="impact-metric">
184
+ <div class="metric-number">30%</div>
185
+ <div class="metric-text">Energy from on-site solar generation</div>
186
+ </div>
187
+ <div class="impact-metric">
188
+ <div class="metric-number">1,500+</div>
189
+ <div class="metric-text">Metric tons of emissions avoided in Year 1</div>
190
+ </div>
191
+ </div>
192
+
193
+ <div class="column">
194
+ <h3>Community Access Program</h3>
195
+ <p>Unity Fleet is committed to ensuring that the benefits of transportation electrification are accessible to all Illinois residents, regardless of income, location, or ability.</p>
196
+ <ul class="equity-list">
197
+ <li>Discounted transportation options for low-income individuals</li>
198
+ <li>Partnerships with social service organizations</li>
199
+ <li>Targeted outreach to underserved communities</li>
200
+ <li>Simplified payment options that don't require credit cards or smartphones</li>
201
+ <li>ADA-compliant physical infrastructure exceeding minimum requirements</li>
202
+ </ul>
203
+ </div>
204
+
205
+ <div class="column">
206
+ <h3>Economic Development</h3>
207
+ <div class="impact-metric">
208
+ <div class="metric-number">25+</div>
209
+ <div class="metric-text">Direct jobs created in Year 1</div>
210
+ </div>
211
+ <div class="impact-metric">
212
+ <div class="metric-number">70%</div>
213
+ <div class="metric-text">Procurement from Illinois-based suppliers</div>
214
+ </div>
215
+ <div class="impact-metric">
216
+ <div class="metric-number">$7.5M</div>
217
+ <div class="metric-text">Projected revenue by Year 5</div>
218
+ </div>
219
+ </div>
220
+ </div>
221
+ </div>
222
+ </section>
223
 
224
+ <section id="tokenization" class="section-gradient">
225
+ <div class="container">
226
+ <div class="section-header">
227
+ <h2>ChainLink Tokenization</h2>
228
+ <div class="section-line"></div>
229
+ </div>
230
+
231
+ <div class="tokenization-content">
232
+ <div class="token-diagram">
233
+ <div class="token-circle">
234
+ <div class="token-inner">
235
+ <i class="fas fa-link"></i>
236
+ </div>
237
+ <div class="token-orbit">
238
+ <div class="orbit-item"><i class="fas fa-charging-station"></i></div>
239
+ <div class="orbit-item"><i class="fas fa-car"></i></div>
240
+ <div class="orbit-item"><i class="fas fa-solar-panel"></i></div>
241
+ <div class="orbit-item"><i class="fas fa-users"></i></div>
242
+ </div>
243
+ </div>
244
+ </div>
245
+
246
+ <div class="token-info">
247
+ <h3>Asset Ownership Structure</h3>
248
+ <p>The ChainLink tokenization model creates a revolutionary approach to infrastructure ownership and community investment.</p>
249
+
250
+ <div class="token-benefits">
251
+ <div class="benefit-item">
252
+ <div class="benefit-icon"><i class="fas fa-coins"></i></div>
253
+ <div class="benefit-text">Fractional ownership of charging infrastructure</div>
254
+ </div>
255
+ <div class="benefit-item">
256
+ <div class="benefit-icon"><i class="fas fa-chart-line"></i></div>
257
+ <div class="benefit-text">Community investment opportunities</div>
258
+ </div>
259
+ <div class="benefit-item">
260
+ <div class="benefit-icon"><i class="fas fa-handshake"></i></div>
261
+ <div class="benefit-text">Transparent revenue sharing</div>
262
+ </div>
263
+ <div class="benefit-item">
264
+ <div class="benefit-icon"><i class="fas fa-shield-alt"></i></div>
265
+ <div class="benefit-text">Secure blockchain verification</div>
266
+ </div>
267
+ </div>
268
+ </div>
269
+ </div>
270
+ </div>
271
+ </section>
272
+
273
+ <section id="rural-plan" class="section-dark">
274
+ <div class="container">
275
+ <div class="section-header">
276
+ <h2>Rural Revitalization Plan</h2>
277
+ <div class="section-line"></div>
278
+ </div>
279
+
280
+ <div class="rural-content">
281
+ <div class="rural-image">
282
+ <img src="6120F952-C801-4C53-AFE0-BB9363A1F539.png" alt="Charging Station">
283
+ </div>
284
+
285
+ <div class="rural-text">
286
+ <h3>Trillion-Dollar Vision for Illinois</h3>
287
+ <p>Unity Fleet's rural revitalization strategy extends beyond urban centers to transform transportation access across all of Illinois.</p>
288
+
289
+ <div class="timeline">
290
+ <div class="timeline-item">
291
+ <div class="timeline-marker">1</div>
292
+ <div class="timeline-content">
293
+ <h4>Strategic Hub Placement</h4>
294
+ <p>Establishing The Link charging hubs along key rural corridors</p>
295
+ </div>
296
+ </div>
297
+
298
+ <div class="timeline-item">
299
+ <div class="timeline-marker">2</div>
300
+ <div class="timeline-content">
301
+ <h4>Community Partnerships</h4>
302
+ <p>Collaborating with local businesses and municipalities</p>
303
+ </div>
304
+ </div>
305
+
306
+ <div class="timeline-item">
307
+ <div class="timeline-marker">3</div>
308
+ <div class="timeline-content">
309
+ <h4>Economic Stimulus</h4>
310
+ <p>Creating jobs and attracting visitors to rural communities</p>
311
+ </div>
312
+ </div>
313
+
314
+ <div class="timeline-item">
315
+ <div class="timeline-marker">4</div>
316
+ <div class="timeline-content">
317
+ <h4>Infrastructure Integration</h4>
318
+ <p>Connecting rural areas to the statewide clean transportation network</p>
319
+ </div>
320
+ </div>
321
+ </div>
322
+ </div>
323
+ </div>
324
+ </div>
325
+ </section>
326
+
327
+ <section id="grant-proposal" class="section-gradient">
328
+ <div class="container">
329
+ <div class="section-header">
330
+ <h2>Grant Proposal</h2>
331
+ <div class="section-line"></div>
332
+ </div>
333
+
334
+ <div class="proposal-content">
335
+ <div class="proposal-overview">
336
+ <h3>Illinois Department of Transportation Statewide Planning and Research Funds</h3>
337
+ <div class="proposal-details">
338
+ <div class="detail-item">
339
+ <div class="detail-label">Funding Request</div>
340
+ <div class="detail-value">$3,200,000</div>
341
+ </div>
342
+ <div class="detail-item">
343
+ <div class="detail-label">Matching Funds</div>
344
+ <div class="detail-value">$3,800,000</div>
345
+ </div>
346
+ <div class="detail-item">
347
+ <div class="detail-label">Total Project Budget</div>
348
+ <div class="detail-value">$7,000,000</div>
349
+ </div>
350
+ <div class="detail-item">
351
+ <div class="detail-label">Implementation Timeline</div>
352
+ <div class="detail-value">15 months</div>
353
+ </div>
354
+ </div>
355
+ </div>
356
+
357
+ <div class="proposal-sections">
358
+ <div class="accordion">
359
+ <div class="accordion-item">
360
+ <div class="accordion-header">Executive Summary</div>
361
+ <div class="accordion-content">
362
+ <p>Unity Fleet LLC is pleased to submit this proposal for the Illinois Department of Transportation's Statewide Planning and Research Funds grant to support the development of "The Link" - an innovative electric vehicle (EV) charging network that will transform transportation infrastructure across Illinois.</p>
363
+ <a href="#" class="read-more">Read Full Section</a>
364
+ </div>
365
+ </div>
366
+
367
+ <div class="accordion-item">
368
+ <div class="accordion-header">Project Description</div>
369
+ <div class="accordion-content">
370
+ <p>Unity Fleet LLC is a newly established Illinois-based company dedicated to revolutionizing electric vehicle (EV) infrastructure and transportation services. "The Link" represents a revolutionary approach to EV charging infrastructure, reimagining charging stations as destination hubs.</p>
371
+ <a href="#" class="read-more">Read Full Section</a>
372
+ </div>
373
+ </div>
374
+
375
+ <div class="accordion-item">
376
+ <div class="accordion-header">Alignment with Illinois Initiatives</div>
377
+ <div class="accordion-content">
378
+ <p>"The Link" EV charging network and Unity Fleet services directly support Illinois' Priority Climate Action Plan and the state's commitment to the Paris Agreement's greenhouse gas reduction targets.</p>
379
+ <a href="#" class="read-more">Read Full Section</a>
380
+ </div>
381
+ </div>
382
+
383
+ <div class="accordion-item">
384
+ <div class="accordion-header">Implementation Plan</div>
385
+ <div class="accordion-content">
386
+ <p>Unity Fleet will implement "The Link" EV charging network through a strategic, phased approach that ensures careful planning, quality execution, and continuous improvement based on operational feedback.</p>
387
+ <a href="#" class="read-more">Read Full Section</a>
388
+ </div>
389
+ </div>
390
+
391
+ <div class="accordion-item">
392
+ <div class="accordion-header">Budget and Financial Plan</div>
393
+ <div class="accordion-content">
394
+ <p>Unity Fleet requests $3,200,000 in funding from the Illinois Department of Transportation's Statewide Planning and Research Funds grant to support the implementation of "The Link" EV charging network.</p>
395
+ <a href="#" class="read-more">Read Full Section</a>
396
+ </div>
397
+ </div>
398
+
399
+ <div class="accordion-item">
400
+ <div class="accordion-header">Performance Metrics</div>
401
+ <div class="accordion-content">
402
+ <p>Unity Fleet will implement a comprehensive performance measurement framework to track the impact and effectiveness of "The Link" charging network and associated fleet services.</p>
403
+ <a href="#" class="read-more">Read Full Section</a>
404
+ </div>
405
+ </div>
406
+
407
+ <div class="accordion-item">
408
+ <div class="accordion-header">Partnerships and Stakeholder Engagement</div>
409
+ <div class="accordion-content">
410
+ <p>Unity Fleet has established strategic partnerships with key organizations to enhance the implementation and impact of "The Link" charging network.</p>
411
+ <a href="#" class="read-more">Read Full Section</a>
412
+ </div>
413
+ </div>
414
+ </div>
415
+
416
+ <div class="proposal-download">
417
+ <a href="unity_fleet_complete_proposal.md" download class="btn download-btn">
418
+ <i class="fas fa-download"></i> Download Full Proposal
419
+ </a>
420
+ </div>
421
+ </div>
422
+ </div>
423
+ </div>
424
+ </section>
425
+
426
+ <!-- MVP Showcase Section -->
427
+ <section id="mvp-showcase" class="section-dark">
428
+ <div class="container">
429
+ <div class="section-header">
430
+ <h2>MVP Showcase</h2>
431
+ <div class="section-line"></div>
432
+ </div>
433
+
434
+ <div class="showcase-intro">
435
+ <p class="highlight-text">Experience the future of electric vehicle infrastructure through our interactive demonstrations of The Link ecosystem components.</p>
436
+ </div>
437
+
438
+ <div class="showcase-grid">
439
+ <div class="showcase-card">
440
+ <div class="card-icon"><i class="fas fa-mobile-alt"></i></div>
441
+ <h3>Mobile Application</h3>
442
+ <p>Reserve vehicles, manage your subscription, and find charging stations with our intuitive mobile interface.</p>
443
+ <div class="card-actions">
444
+ <a href="mvp/mobile-app.html" class="btn secondary-btn">Explore Demo</a>
445
+ </div>
446
+ </div>
447
+
448
+ <div class="showcase-card">
449
+ <div class="card-icon"><i class="fas fa-charging-station"></i></div>
450
+ <h3>Charging Hub Interface</h3>
451
+ <p>Interact with The Link charging stations, monitor availability, and experience our premium amenities.</p>
452
+ <div class="card-actions">
453
+ <a href="mvp/charging-hub.html" class="btn secondary-btn">Explore Demo</a>
454
+ </div>
455
+ </div>
456
+
457
+ <div class="showcase-card">
458
+ <div class="card-icon"><i class="fas fa-solar-panel"></i></div>
459
+ <h3>Energy Simulation</h3>
460
+ <p>Visualize how our integrated solar and battery systems optimize energy flow and reduce emissions.</p>
461
+ <div class="card-actions">
462
+ <a href="mvp/energy-simulation.html" class="btn secondary-btn">Explore Demo</a>
463
+ </div>
464
+ </div>
465
+
466
+ <div class="showcase-card">
467
+ <div class="card-icon"><i class="fas fa-map-marked-alt"></i></div>
468
+ <h3>Deployment Map</h3>
469
+ <p>Explore our phased deployment plan across Illinois with demographic and EV adoption overlays.</p>
470
+ <div class="card-actions">
471
+ <a href="mvp/deployment-map.html" class="btn secondary-btn">Explore Demo</a>
472
+ </div>
473
+ </div>
474
+
475
+ <div class="showcase-card">
476
+ <div class="card-icon"><i class="fas fa-id-card"></i></div>
477
+ <h3>Subscription Portal</h3>
478
+ <p>Compare subscription tiers, manage your account, and track usage through our customer portal.</p>
479
+ <div class="card-actions">
480
+ <a href="mvp/subscription-portal.html" class="btn secondary-btn">Explore Demo</a>
481
+ </div>
482
+ </div>
483
+
484
+ <div class="showcase-card">
485
+ <div class="card-icon"><i class="fas fa-link"></i></div>
486
+ <h3>ChainLink Tokenization</h3>
487
+ <p>Discover how our tokenization model creates community ownership and sustainable funding.</p>
488
+ <div class="card-actions">
489
+ <a href="mvp/chainlink-demo.html" class="btn secondary-btn">Explore Demo</a>
490
+ </div>
491
+ </div>
492
+ </div>
493
+ </div>
494
+ </section>
495
+
496
+ <footer>
497
+ <div class="container">
498
+ <div class="footer-content">
499
+ <div class="footer-logo">
500
+ <div class="logo">UNITY FLEET</div>
501
+ <p>Revolutionizing electric vehicle infrastructure across Illinois</p>
502
+ </div>
503
+
504
+ <div class="footer-links">
505
+ <div class="link-column">
506
+ <h4>Navigation</h4>
507
+ <a href="#what-is-the-link">What is The Link</a>
508
+ <a href="#subscription-tiers">Subscription Tiers</a>
509
+ <a href="#impact-equity">Impact & Equity</a>
510
+ <a href="#tokenization">ChainLink Tokenization</a>
511
+ <a href="#rural-plan">Rural Revitalization</a>
512
+ <a href="#mvp-showcase">MVP Showcase</a>
513
+ </div>
514
+
515
+ <div class="link-column">
516
+ <h4>Contact</h4>
517
+ <a href="mailto:[email protected]">[email protected]</a>
518
+ <a href="tel:+12175551234">+1 (217) 555-1234</a>
519
+ <p>2457 E Eldorado St<br>Decatur, IL 62521</p>
520
+ </div>
521
+
522
+ <div class="link-column">
523
+ <h4>Legal</h4>
524
+ <a href="#">Privacy Policy</a>
525
+ <a href="#">Terms of Service</a>
526
+ <a href="#">Accessibility</a>
527
+ </div>
528
+ </div>
529
+ </div>
530
+
531
+ <div class="footer-bottom">
532
+ <p>&copy; 2025 Unity Fleet LLC. All rights reserved.</p>
533
+ <div class="social-links">
534
+ <a href="#"><i class="fab fa-twitter"></i></a>
535
+ <a href="#"><i class="fab fa-linkedin"></i></a>
536
+ <a href="#"><i class="fab fa-instagram"></i></a>
537
+ </div>
538
+ </div>
539
+ </div>
540
+ </footer>
541
+
542
+ <script src="scripts.js"></script>
543
+ </body>
544
+ </html>
key_components_for_demonstration.md ADDED
@@ -0,0 +1,161 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Unity Fleet MVP Key Components for Demonstration
2
+
3
+ Based on the requirements analysis, this document identifies the specific components that will be developed as MVPs and working models to showcase Unity Fleet's "The Link" ecosystem.
4
+
5
+ ## 1. Mobile Application Prototype
6
+
7
+ **Component Description**: A responsive web application that simulates the user experience for vehicle reservations and management.
8
+
9
+ **Key Features to Implement**:
10
+ - Vehicle browsing interface with filtering options
11
+ - Reservation calendar and booking flow
12
+ - User account dashboard
13
+ - Vehicle status tracking
14
+ - Payment simulation
15
+
16
+ **Technical Approach**:
17
+ - Develop as a responsive web application using React
18
+ - Use mock data to simulate vehicle availability and reservations
19
+ - Implement UI components that match Unity Fleet's visual identity
20
+ - Create a seamless user journey from account creation to reservation completion
21
+
22
+ **Demonstration Value**:
23
+ - Shows the user-facing aspect of the business model
24
+ - Demonstrates ease of access for potential customers
25
+ - Illustrates the subscription model in action
26
+ - Provides tangible example of service for grant reviewers
27
+
28
+ ## 2. Charging Hub Management Dashboard
29
+
30
+ **Component Description**: An administrative interface that demonstrates how charging infrastructure is monitored and managed.
31
+
32
+ **Key Features to Implement**:
33
+ - Real-time status monitoring of charging stations
34
+ - Energy usage analytics and visualizations
35
+ - Maintenance scheduling and alerts
36
+ - User access management
37
+ - Revenue tracking
38
+
39
+ **Technical Approach**:
40
+ - Develop as a web-based dashboard using React and data visualization libraries
41
+ - Create simulated data streams for charging activity
42
+ - Implement interactive maps showing charging hub locations
43
+ - Design responsive layouts for different device sizes
44
+
45
+ **Demonstration Value**:
46
+ - Illustrates the operational efficiency of the charging network
47
+ - Shows how data is leveraged for system optimization
48
+ - Demonstrates the integration of business and technical operations
49
+ - Highlights the scalability of the infrastructure model
50
+
51
+ ## 3. Energy Management Simulation
52
+
53
+ **Component Description**: A visual simulation showing how solar generation, battery storage, and grid interaction work together in the charging ecosystem.
54
+
55
+ **Key Features to Implement**:
56
+ - Solar energy generation visualization based on time of day and weather
57
+ - Battery charge/discharge cycles
58
+ - Grid interaction during peak/off-peak times
59
+ - Energy flow animations
60
+ - Cost and carbon savings calculations
61
+
62
+ **Technical Approach**:
63
+ - Develop using JavaScript with animation libraries
64
+ - Create data models that accurately represent energy flows
65
+ - Design intuitive visualizations that explain complex energy concepts
66
+ - Implement time controls to demonstrate system behavior under different conditions
67
+
68
+ **Demonstration Value**:
69
+ - Demonstrates the renewable energy integration central to the proposal
70
+ - Illustrates how the system reduces carbon emissions
71
+ - Shows the economic benefits of the energy approach
72
+ - Explains technical concepts in an accessible way
73
+
74
+ ## 4. Subscription Management Portal
75
+
76
+ **Component Description**: A demonstration of the subscription business model showing different tiers, pricing, and customer management.
77
+
78
+ **Key Features to Implement**:
79
+ - Subscription tier comparison interface
80
+ - Customer management dashboard
81
+ - Usage tracking and analytics
82
+ - Billing simulation
83
+ - Upgrade/downgrade pathways
84
+
85
+ **Technical Approach**:
86
+ - Develop as a web application with both customer and admin views
87
+ - Create sample customer profiles and subscription data
88
+ - Implement interactive elements to explore different subscription scenarios
89
+ - Design clear visualizations of subscription economics
90
+
91
+ **Demonstration Value**:
92
+ - Illustrates the financial sustainability of the business model
93
+ - Shows the customer value proposition at different price points
94
+ - Demonstrates how the system scales with customer growth
95
+ - Highlights the recurring revenue aspects of the model
96
+
97
+ ## 5. Interactive Deployment Map
98
+
99
+ **Component Description**: A geographic visualization showing the planned deployment of charging hubs across Illinois with associated data and timelines.
100
+
101
+ **Key Features to Implement**:
102
+ - Interactive map of Illinois with planned hub locations
103
+ - Phased deployment timeline visualization
104
+ - Population coverage analytics
105
+ - Infrastructure impact metrics
106
+ - EV adoption projections by region
107
+
108
+ **Technical Approach**:
109
+ - Develop using mapping libraries (Leaflet or Google Maps API)
110
+ - Implement data overlays for different metrics
111
+ - Create timeline controls to show deployment phases
112
+ - Design pop-up information panels for each location
113
+
114
+ **Demonstration Value**:
115
+ - Demonstrates the strategic geographic approach
116
+ - Shows how the network will grow over time
117
+ - Illustrates the statewide impact of the project
118
+ - Connects abstract concepts to specific locations
119
+
120
+ ## 6. ChainLink Tokenization Demonstration
121
+
122
+ **Component Description**: A simplified demonstration of how the tokenization concept works for asset ownership and value distribution.
123
+
124
+ **Key Features to Implement**:
125
+ - Token allocation visualization
126
+ - Asset ownership representation
127
+ - Value flow diagrams
128
+ - Simulated token transactions
129
+ - Stakeholder dashboard
130
+
131
+ **Technical Approach**:
132
+ - Develop as an interactive web application
133
+ - Create simplified blockchain visualization
134
+ - Implement animations showing token distribution and value flows
135
+ - Design intuitive explanations of complex tokenization concepts
136
+
137
+ **Demonstration Value**:
138
+ - Explains the innovative financial model
139
+ - Demonstrates how community ownership works
140
+ - Shows the long-term value creation mechanism
141
+ - Illustrates the unique aspects of Unity Fleet's approach
142
+
143
+ ## Development Priorities and Timeline
144
+
145
+ ### Phase 1 (Weeks 1-2)
146
+ - Mobile Application Prototype
147
+ - Interactive Deployment Map
148
+
149
+ ### Phase 2 (Weeks 3-4)
150
+ - Charging Hub Management Dashboard
151
+ - Subscription Management Portal
152
+
153
+ ### Phase 3 (Weeks 5-6)
154
+ - Energy Management Simulation
155
+ - ChainLink Tokenization Demonstration
156
+
157
+ ## Integration Strategy
158
+
159
+ These six components will be developed as standalone demonstrations but with consistent branding, data models, and user experience. They will be designed to work together as a cohesive presentation of the Unity Fleet ecosystem, with cross-references between components where appropriate.
160
+
161
+ The components will be developed with a focus on visual impact and clear communication of concepts, using simulated data that realistically represents the expected operation of the actual systems once deployed.
mobile-app.html ADDED
@@ -0,0 +1,440 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Unity Fleet - Mobile Application</title>
7
+ <link rel="stylesheet" href="../styles.css">
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
9
+ <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Space+Grotesk:wght@300;400;500;600;700&display=swap" rel="stylesheet">
12
+ <style>
13
+ /* MVP Component specific styles */
14
+ .component-container {
15
+ max-width: 1200px;
16
+ margin: 0 auto;
17
+ padding: 2rem;
18
+ }
19
+
20
+ .component-header {
21
+ text-align: center;
22
+ margin-bottom: 3rem;
23
+ }
24
+
25
+ .component-header h1 {
26
+ font-size: 2.5rem;
27
+ margin-bottom: 1rem;
28
+ background: linear-gradient(90deg, var(--accent-color-1), var(--accent-color-2));
29
+ -webkit-background-clip: text;
30
+ background-clip: text;
31
+ -webkit-text-fill-color: transparent;
32
+ }
33
+
34
+ .component-header p {
35
+ font-size: 1.2rem;
36
+ max-width: 800px;
37
+ margin: 0 auto;
38
+ opacity: 0.8;
39
+ }
40
+
41
+ .component-content {
42
+ background: var(--glass-bg);
43
+ border: 1px solid var(--glass-border);
44
+ border-radius: 16px;
45
+ padding: 2rem;
46
+ margin-bottom: 3rem;
47
+ backdrop-filter: blur(10px);
48
+ }
49
+
50
+ .back-to-home {
51
+ display: inline-block;
52
+ margin-top: 2rem;
53
+ padding: 0.8rem 1.5rem;
54
+ background: transparent;
55
+ border: 1px solid var(--accent-color-1);
56
+ color: var(--accent-color-1);
57
+ border-radius: 4px;
58
+ font-family: var(--font-primary);
59
+ font-weight: 500;
60
+ text-transform: uppercase;
61
+ letter-spacing: 1px;
62
+ transition: all var(--transition-medium);
63
+ }
64
+
65
+ .back-to-home:hover {
66
+ background: rgba(0, 224, 255, 0.1);
67
+ transform: translateY(-3px);
68
+ }
69
+
70
+ /* Responsive iframe container */
71
+ .iframe-container {
72
+ position: relative;
73
+ width: 100%;
74
+ height: 0;
75
+ padding-bottom: 56.25%; /* 16:9 aspect ratio */
76
+ overflow: hidden;
77
+ border-radius: 8px;
78
+ }
79
+
80
+ .iframe-container iframe {
81
+ position: absolute;
82
+ top: 0;
83
+ left: 0;
84
+ width: 100%;
85
+ height: 100%;
86
+ border: none;
87
+ }
88
+
89
+ /* Mobile App specific styles */
90
+ .mobile-app-container {
91
+ display: flex;
92
+ flex-direction: column;
93
+ align-items: center;
94
+ padding: 2rem;
95
+ }
96
+
97
+ .mobile-app-frame {
98
+ width: 375px;
99
+ height: 667px;
100
+ background-color: #000;
101
+ border-radius: 30px;
102
+ overflow: hidden;
103
+ position: relative;
104
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.4);
105
+ border: 10px solid #222;
106
+ margin-bottom: 2rem;
107
+ }
108
+
109
+ .mobile-app-content {
110
+ width: 100%;
111
+ height: 100%;
112
+ overflow: hidden;
113
+ }
114
+
115
+ .mobile-app-content div {
116
+ width: 100%;
117
+ height: 100%;
118
+ background-color: #0B0B0F;
119
+ color: white;
120
+ display: flex;
121
+ flex-direction: column;
122
+ }
123
+
124
+ .app-header {
125
+ padding: 1rem;
126
+ background: linear-gradient(90deg, rgba(0, 224, 255, 0.2), rgba(53, 242, 219, 0.2));
127
+ display: flex;
128
+ justify-content: space-between;
129
+ align-items: center;
130
+ }
131
+
132
+ .app-header h2 {
133
+ margin: 0;
134
+ font-size: 1.2rem;
135
+ }
136
+
137
+ .app-body {
138
+ flex: 1;
139
+ padding: 1rem;
140
+ overflow-y: auto;
141
+ }
142
+
143
+ .app-nav {
144
+ display: flex;
145
+ justify-content: space-around;
146
+ padding: 0.8rem 0;
147
+ background-color: rgba(0, 0, 0, 0.8);
148
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
149
+ }
150
+
151
+ .nav-item {
152
+ display: flex;
153
+ flex-direction: column;
154
+ align-items: center;
155
+ font-size: 0.7rem;
156
+ }
157
+
158
+ .nav-item i {
159
+ font-size: 1.2rem;
160
+ margin-bottom: 0.3rem;
161
+ color: var(--accent-color-1);
162
+ }
163
+
164
+ /* App content styles */
165
+ .vehicle-card {
166
+ background: rgba(255, 255, 255, 0.05);
167
+ border-radius: 12px;
168
+ padding: 1rem;
169
+ margin-bottom: 1rem;
170
+ border: 1px solid rgba(255, 255, 255, 0.1);
171
+ }
172
+
173
+ .vehicle-card h3 {
174
+ margin-top: 0;
175
+ margin-bottom: 0.5rem;
176
+ font-size: 1.1rem;
177
+ }
178
+
179
+ .vehicle-card p {
180
+ margin: 0.3rem 0;
181
+ font-size: 0.9rem;
182
+ opacity: 0.8;
183
+ }
184
+
185
+ .vehicle-card .card-footer {
186
+ display: flex;
187
+ justify-content: space-between;
188
+ margin-top: 1rem;
189
+ }
190
+
191
+ .vehicle-card .btn {
192
+ padding: 0.5rem 1rem;
193
+ font-size: 0.8rem;
194
+ border-radius: 4px;
195
+ background: linear-gradient(90deg, var(--accent-color-1), var(--accent-color-2));
196
+ color: #000;
197
+ border: none;
198
+ cursor: pointer;
199
+ }
200
+
201
+ .vehicle-card .price {
202
+ font-weight: bold;
203
+ color: var(--accent-color-1);
204
+ }
205
+
206
+ .search-bar {
207
+ display: flex;
208
+ margin-bottom: 1rem;
209
+ }
210
+
211
+ .search-bar input {
212
+ flex: 1;
213
+ padding: 0.8rem;
214
+ border-radius: 8px 0 0 8px;
215
+ border: 1px solid rgba(255, 255, 255, 0.1);
216
+ background: rgba(255, 255, 255, 0.05);
217
+ color: white;
218
+ }
219
+
220
+ .search-bar button {
221
+ padding: 0.8rem;
222
+ border-radius: 0 8px 8px 0;
223
+ border: none;
224
+ background: var(--accent-color-1);
225
+ color: #000;
226
+ }
227
+
228
+ .filter-options {
229
+ display: flex;
230
+ overflow-x: auto;
231
+ margin-bottom: 1rem;
232
+ padding-bottom: 0.5rem;
233
+ }
234
+
235
+ .filter-option {
236
+ padding: 0.5rem 1rem;
237
+ background: rgba(255, 255, 255, 0.05);
238
+ border: 1px solid rgba(255, 255, 255, 0.1);
239
+ border-radius: 20px;
240
+ margin-right: 0.5rem;
241
+ white-space: nowrap;
242
+ font-size: 0.8rem;
243
+ }
244
+
245
+ .filter-option.active {
246
+ background: rgba(0, 224, 255, 0.2);
247
+ border-color: var(--accent-color-1);
248
+ color: var(--accent-color-1);
249
+ }
250
+ </style>
251
+ </head>
252
+ <body>
253
+ <div class="noise-overlay"></div>
254
+
255
+ <header>
256
+ <nav>
257
+ <div class="logo">UNITY FLEET</div>
258
+ <div class="nav-links">
259
+ <a href="../index.html#what-is-the-link">What is The Link</a>
260
+ <a href="../index.html#subscription-tiers">Subscription Tiers</a>
261
+ <a href="../index.html#impact-equity">Impact & Equity</a>
262
+ <a href="../index.html#tokenization">ChainLink Tokenization</a>
263
+ <a href="../index.html#rural-plan">Rural Revitalization</a>
264
+ <a href="../index.html#mvp-showcase">MVP Showcase</a>
265
+ </div>
266
+ <div class="mobile-nav-toggle">
267
+ <i class="fas fa-bars"></i>
268
+ </div>
269
+ </nav>
270
+ </header>
271
+
272
+ <main class="component-container">
273
+ <div class="component-header">
274
+ <h1>MOBILE APPLICATION</h1>
275
+ <p>Experience our intuitive mobile interface for reserving vehicles, managing your subscription, and finding charging stations across Illinois.</p>
276
+ </div>
277
+
278
+ <div class="component-content">
279
+ <div class="mobile-app-container">
280
+ <div class="mobile-app-frame">
281
+ <div class="mobile-app-content">
282
+ <div>
283
+ <div class="app-header">
284
+ <h2>Unity Fleet</h2>
285
+ <i class="fas fa-user-circle"></i>
286
+ </div>
287
+ <div class="app-body">
288
+ <div class="search-bar">
289
+ <input type="text" placeholder="Search vehicles...">
290
+ <button><i class="fas fa-search"></i></button>
291
+ </div>
292
+
293
+ <div class="filter-options">
294
+ <div class="filter-option active">All Vehicles</div>
295
+ <div class="filter-option">Sedans</div>
296
+ <div class="filter-option">SUVs</div>
297
+ <div class="filter-option">Luxury</div>
298
+ <div class="filter-option">Near Me</div>
299
+ </div>
300
+
301
+ <div class="vehicle-card">
302
+ <h3>Tesla Model 3</h3>
303
+ <p>Electric Sedan • 358 mi range</p>
304
+ <p>Available at: Downtown Springfield Hub</p>
305
+ <div class="card-footer">
306
+ <span class="price">$75/day</span>
307
+ <button class="btn">Reserve</button>
308
+ </div>
309
+ </div>
310
+
311
+ <div class="vehicle-card">
312
+ <h3>Rivian R1S</h3>
313
+ <p>Electric SUV • 316 mi range</p>
314
+ <p>Available at: Champaign-Urbana Hub</p>
315
+ <div class="card-footer">
316
+ <span class="price">$95/day</span>
317
+ <button class="btn">Reserve</button>
318
+ </div>
319
+ </div>
320
+
321
+ <div class="vehicle-card">
322
+ <h3>Lucid Air</h3>
323
+ <p>Electric Luxury • 520 mi range</p>
324
+ <p>Available at: Bloomington-Normal Hub</p>
325
+ <div class="card-footer">
326
+ <span class="price">$120/day</span>
327
+ <button class="btn">Reserve</button>
328
+ </div>
329
+ </div>
330
+ </div>
331
+ <div class="app-nav">
332
+ <div class="nav-item">
333
+ <i class="fas fa-home"></i>
334
+ <span>Home</span>
335
+ </div>
336
+ <div class="nav-item">
337
+ <i class="fas fa-car"></i>
338
+ <span>Vehicles</span>
339
+ </div>
340
+ <div class="nav-item">
341
+ <i class="fas fa-map-marker-alt"></i>
342
+ <span>Map</span>
343
+ </div>
344
+ <div class="nav-item">
345
+ <i class="fas fa-calendar-alt"></i>
346
+ <span>Bookings</span>
347
+ </div>
348
+ <div class="nav-item">
349
+ <i class="fas fa-cog"></i>
350
+ <span>Settings</span>
351
+ </div>
352
+ </div>
353
+ </div>
354
+ </div>
355
+ </div>
356
+ </div>
357
+ </div>
358
+
359
+ <div class="component-features">
360
+ <h2>Key Features</h2>
361
+ <ul class="features-list">
362
+ <li>Intuitive vehicle browsing and filtering by type, range, and location</li>
363
+ <li>Seamless reservation system with calendar integration</li>
364
+ <li>Real-time vehicle availability and charging status</li>
365
+ <li>Subscription management and billing dashboard</li>
366
+ <li>Interactive map showing charging stations and vehicle locations</li>
367
+ <li>Trip planning with charging stops automatically calculated</li>
368
+ <li>Push notifications for reservation reminders and charging updates</li>
369
+ </ul>
370
+ </div>
371
+
372
+ <a href="../index.html#mvp-showcase" class="back-to-home">
373
+ <i class="fas fa-arrow-left"></i> Back to MVP Showcase
374
+ </a>
375
+ </main>
376
+
377
+ <footer>
378
+ <div class="container">
379
+ <div class="footer-content">
380
+ <div class="footer-logo">
381
+ <div class="logo">UNITY FLEET</div>
382
+ <p>Revolutionizing electric vehicle infrastructure across Illinois</p>
383
+ </div>
384
+
385
+ <div class="footer-links">
386
+ <div class="link-column">
387
+ <h4>Navigation</h4>
388
+ <a href="../index.html#what-is-the-link">What is The Link</a>
389
+ <a href="../index.html#subscription-tiers">Subscription Tiers</a>
390
+ <a href="../index.html#impact-equity">Impact & Equity</a>
391
+ <a href="../index.html#tokenization">ChainLink Tokenization</a>
392
+ <a href="../index.html#rural-plan">Rural Revitalization</a>
393
+ <a href="../index.html#mvp-showcase">MVP Showcase</a>
394
+ </div>
395
+
396
+ <div class="link-column">
397
+ <h4>Contact</h4>
398
+ <a href="mailto:[email protected]">[email protected]</a>
399
+ <a href="tel:+12175551234">+1 (217) 555-1234</a>
400
+ <p>2457 E Eldorado St<br>Decatur, IL 62521</p>
401
+ </div>
402
+
403
+ <div class="link-column">
404
+ <h4>Legal</h4>
405
+ <a href="#">Privacy Policy</a>
406
+ <a href="#">Terms of Service</a>
407
+ <a href="#">Accessibility</a>
408
+ </div>
409
+ </div>
410
+
411
+ <div class="footer-social">
412
+ <a href="#" class="social-icon"><i class="fab fa-twitter"></i></a>
413
+ <a href="#" class="social-icon"><i class="fab fa-linkedin"></i></a>
414
+ <a href="#" class="social-icon"><i class="fab fa-facebook"></i></a>
415
+ <a href="#" class="social-icon"><i class="fab fa-instagram"></i></a>
416
+ </div>
417
+ </div>
418
+
419
+ <div class="footer-bottom">
420
+ <p>&copy; 2025 Unity Fleet LLC. All rights reserved.</p>
421
+ </div>
422
+ </div>
423
+ </footer>
424
+
425
+ <script>
426
+ // Mobile navigation toggle
427
+ document.querySelector('.mobile-nav-toggle').addEventListener('click', function() {
428
+ document.querySelector('.nav-links').classList.toggle('active');
429
+ this.innerHTML = document.querySelector('.nav-links').classList.contains('active')
430
+ ? '<i class="fas fa-times"></i>'
431
+ : '<i class="fas fa-bars"></i>';
432
+ });
433
+
434
+ // Component loading logic
435
+ document.addEventListener('DOMContentLoaded', function() {
436
+ console.log('Mobile App component loaded');
437
+ });
438
+ </script>
439
+ </body>
440
+ </html>
mvp-showcase-section.html ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!-- MVP Showcase Section -->
2
+ <section id="mvp-showcase" class="section-dark">
3
+ <div class="container">
4
+ <div class="section-header">
5
+ <h2>MVP Showcase</h2>
6
+ <div class="section-line"></div>
7
+ </div>
8
+
9
+ <div class="showcase-intro">
10
+ <p class="highlight-text">Experience the future of electric vehicle infrastructure through our interactive demonstrations of The Link ecosystem components.</p>
11
+ </div>
12
+
13
+ <div class="showcase-grid">
14
+ <div class="showcase-card">
15
+ <div class="card-icon"><i class="fas fa-mobile-alt"></i></div>
16
+ <h3>Mobile Application</h3>
17
+ <p>Reserve vehicles, manage your subscription, and find charging stations with our intuitive mobile interface.</p>
18
+ <div class="card-actions">
19
+ <a href="mvp/mobile-app.html" class="btn secondary-btn">Explore Demo</a>
20
+ </div>
21
+ </div>
22
+
23
+ <div class="showcase-card">
24
+ <div class="card-icon"><i class="fas fa-charging-station"></i></div>
25
+ <h3>Charging Hub Interface</h3>
26
+ <p>Interact with The Link charging stations, monitor availability, and experience our premium amenities.</p>
27
+ <div class="card-actions">
28
+ <a href="mvp/charging-hub.html" class="btn secondary-btn">Explore Demo</a>
29
+ </div>
30
+ </div>
31
+
32
+ <div class="showcase-card">
33
+ <div class="card-icon"><i class="fas fa-solar-panel"></i></div>
34
+ <h3>Energy Simulation</h3>
35
+ <p>Visualize how our integrated solar and battery systems optimize energy flow and reduce emissions.</p>
36
+ <div class="card-actions">
37
+ <a href="mvp/energy-simulation.html" class="btn secondary-btn">Explore Demo</a>
38
+ </div>
39
+ </div>
40
+
41
+ <div class="showcase-card">
42
+ <div class="card-icon"><i class="fas fa-map-marked-alt"></i></div>
43
+ <h3>Deployment Map</h3>
44
+ <p>Explore our phased deployment plan across Illinois with demographic and EV adoption overlays.</p>
45
+ <div class="card-actions">
46
+ <a href="mvp/deployment-map.html" class="btn secondary-btn">Explore Demo</a>
47
+ </div>
48
+ </div>
49
+
50
+ <div class="showcase-card">
51
+ <div class="card-icon"><i class="fas fa-id-card"></i></div>
52
+ <h3>Subscription Portal</h3>
53
+ <p>Compare subscription tiers, manage your account, and track usage through our customer portal.</p>
54
+ <div class="card-actions">
55
+ <a href="mvp/subscription-portal.html" class="btn secondary-btn">Explore Demo</a>
56
+ </div>
57
+ </div>
58
+
59
+ <div class="showcase-card">
60
+ <div class="card-icon"><i class="fas fa-link"></i></div>
61
+ <h3>ChainLink Tokenization</h3>
62
+ <p>Discover how our tokenization model creates community ownership and sustainable funding.</p>
63
+ <div class="card-actions">
64
+ <a href="mvp/chainlink-demo.html" class="btn secondary-btn">Explore Demo</a>
65
+ </div>
66
+ </div>
67
+ </div>
68
+ </div>
69
+ </section>
mvp_requirements_analysis.md ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Unity Fleet MVP Requirements Analysis
2
+
3
+ ## Overview
4
+ This document analyzes the requirements for building Minimum Viable Products (MVPs) and working models for the vital supporting elements of Unity Fleet's "The Link" ecosystem. These prototypes will demonstrate key concepts and functionality described in the grant proposal.
5
+
6
+ ## Key MVP Components Needed
7
+
8
+ ### 1. User-Facing Applications
9
+
10
+ #### Mobile Application for Vehicle Reservations
11
+ - **Purpose**: Allow users to browse, reserve, and manage EV rentals
12
+ - **Core Features**:
13
+ - User registration and authentication
14
+ - Vehicle browsing and filtering
15
+ - Reservation system with calendar integration
16
+ - Payment simulation
17
+ - Vehicle status tracking
18
+ - Trip planning with charging stops
19
+
20
+ #### Charging Hub Interface
21
+ - **Purpose**: Demonstrate the user experience at charging hubs
22
+ - **Core Features**:
23
+ - Charging station status and availability
24
+ - User authentication for charging access
25
+ - Payment processing simulation
26
+ - Energy usage tracking
27
+ - Lounge services information
28
+
29
+ ### 2. Backend Management Systems
30
+
31
+ #### Fleet Management Dashboard
32
+ - **Purpose**: Showcase how Unity Fleet manages vehicle operations
33
+ - **Core Features**:
34
+ - Vehicle tracking and status monitoring
35
+ - Maintenance scheduling
36
+ - Utilization analytics
37
+ - Battery health monitoring
38
+ - Route optimization
39
+
40
+ #### Charging Infrastructure Management
41
+ - **Purpose**: Demonstrate management of charging network
42
+ - **Core Features**:
43
+ - Charging station status monitoring
44
+ - Energy usage analytics
45
+ - Grid integration simulation
46
+ - Maintenance tracking
47
+ - Demand forecasting
48
+
49
+ ### 3. Technology Integration Demonstrations
50
+
51
+ #### Solar and Battery Integration
52
+ - **Purpose**: Show how renewable energy powers the charging infrastructure
53
+ - **Core Features**:
54
+ - Solar generation simulation
55
+ - Battery storage management
56
+ - Grid interaction modeling
57
+ - Energy flow visualization
58
+ - Optimization algorithms
59
+
60
+ #### Autonomous Vehicle Features
61
+ - **Purpose**: Demonstrate autonomous capabilities for fleet management
62
+ - **Core Features**:
63
+ - Vehicle repositioning simulation
64
+ - Autonomous charging demonstration
65
+ - Safety protocol visualization
66
+ - Remote monitoring interface
67
+
68
+ ### 4. Financial and Business Models
69
+
70
+ #### Subscription Management System
71
+ - **Purpose**: Showcase the subscription business model
72
+ - **Core Features**:
73
+ - Subscription tier management
74
+ - Billing simulation
75
+ - Usage tracking
76
+ - Customer analytics
77
+ - Upgrade/downgrade pathways
78
+
79
+ #### Tokenization Demonstration
80
+ - **Purpose**: Illustrate the ChainLink tokenization concept
81
+ - **Core Features**:
82
+ - Token allocation visualization
83
+ - Asset ownership representation
84
+ - Value tracking simulation
85
+ - Transaction demonstration
86
+ - Stakeholder dashboard
87
+
88
+ ## Technical Requirements
89
+
90
+ ### Development Platforms
91
+ - Web applications for dashboards and management interfaces
92
+ - Mobile application prototypes (responsive web or native)
93
+ - Data visualization tools for analytics and monitoring
94
+ - Simulation environments for energy and autonomous systems
95
+
96
+ ### Integration Points
97
+ - Authentication systems across all platforms
98
+ - Data sharing between fleet and charging management
99
+ - Energy management integration with fleet operations
100
+ - Financial systems connection to operational platforms
101
+
102
+ ### User Experience Considerations
103
+ - Consistent branding across all interfaces
104
+ - Intuitive navigation and information architecture
105
+ - Clear visualization of complex data
106
+ - Accessibility for diverse users
107
+ - Mobile-first design for user-facing applications
108
+
109
+ ## Demonstration Requirements
110
+
111
+ ### Interactive Demos
112
+ - Live demonstrations of reservation process
113
+ - Real-time monitoring of simulated fleet operations
114
+ - Interactive energy flow visualizations
115
+ - Walkthrough of subscription management
116
+
117
+ ### Visual Materials
118
+ - System architecture diagrams
119
+ - User journey maps
120
+ - Financial model visualizations
121
+ - Geographic deployment maps
122
+ - Technology integration schematics
123
+
124
+ ## Priority Assessment
125
+
126
+ ### Highest Priority MVPs (Essential for Grant Demonstration)
127
+ 1. Mobile Application for Vehicle Reservations
128
+ 2. Charging Hub Interface
129
+ 3. Fleet Management Dashboard
130
+ 4. Subscription Management System
131
+
132
+ ### Secondary Priority (Valuable for Comprehensive Understanding)
133
+ 1. Charging Infrastructure Management
134
+ 2. Solar and Battery Integration
135
+ 3. Tokenization Demonstration
136
+
137
+ ### Future Development (Post-Grant Approval)
138
+ 1. Autonomous Vehicle Features
139
+ 2. Advanced Analytics Platforms
140
+ 3. Full Integration Testing Environment
141
+
142
+ ## Development Approach
143
+
144
+ The development of these MVPs should follow these principles:
145
+ - Focus on visual impact and user experience
146
+ - Use simulated data where real-time data isn't available
147
+ - Prioritize demonstrating concepts over full functionality
148
+ - Create modular components that can be expanded later
149
+ - Ensure all demonstrations align with grant proposal claims
150
+ - Balance technical accuracy with accessibility for non-technical reviewers
151
+
152
+ This analysis provides the foundation for identifying which specific components to build as MVPs and working models in the next phase of the project.
scripts.js ADDED
@@ -0,0 +1,335 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Main JavaScript functionality for Unity Fleet website
2
+
3
+ document.addEventListener('DOMContentLoaded', function() {
4
+ // Initialize animations and interactions
5
+ initScrollAnimations();
6
+ initAccordion();
7
+ initParallaxEffect();
8
+ initHeroAnimation();
9
+
10
+ // Mobile navigation toggle
11
+ const navLinks = document.querySelector('.nav-links');
12
+ const mobileNavToggle = document.createElement('div');
13
+ mobileNavToggle.className = 'mobile-nav-toggle';
14
+ mobileNavToggle.innerHTML = '<i class="fas fa-bars"></i>';
15
+ document.querySelector('nav').appendChild(mobileNavToggle);
16
+
17
+ mobileNavToggle.addEventListener('click', function() {
18
+ navLinks.classList.toggle('active');
19
+ this.innerHTML = navLinks.classList.contains('active')
20
+ ? '<i class="fas fa-times"></i>'
21
+ : '<i class="fas fa-bars"></i>';
22
+ });
23
+ });
24
+
25
+ // Scroll animations for elements
26
+ function initScrollAnimations() {
27
+ const animatedElements = document.querySelectorAll('.section-header, .feature-item, .subscription-card, .impact-metric, .token-diagram, .rural-content, .timeline-item');
28
+
29
+ const observer = new IntersectionObserver((entries) => {
30
+ entries.forEach(entry => {
31
+ if (entry.isIntersecting) {
32
+ entry.target.classList.add('animate');
33
+ observer.unobserve(entry.target);
34
+ }
35
+ });
36
+ }, {
37
+ threshold: 0.1
38
+ });
39
+
40
+ animatedElements.forEach(element => {
41
+ element.classList.add('pre-animation');
42
+ observer.observe(element);
43
+ });
44
+
45
+ // Add CSS for animations
46
+ const style = document.createElement('style');
47
+ style.textContent = `
48
+ .pre-animation {
49
+ opacity: 0;
50
+ transform: translateY(30px);
51
+ transition: opacity 0.6s ease, transform 0.6s ease;
52
+ }
53
+
54
+ .animate {
55
+ opacity: 1;
56
+ transform: translateY(0);
57
+ }
58
+
59
+ .subscription-card.pre-animation {
60
+ transform: translateY(50px);
61
+ transition-delay: calc(var(--animation-order, 0) * 0.1s);
62
+ }
63
+
64
+ .feature-item.pre-animation {
65
+ transform: translateX(-30px);
66
+ transition-delay: calc(var(--animation-order, 0) * 0.1s);
67
+ }
68
+
69
+ .timeline-item.pre-animation {
70
+ transform: translateX(-30px);
71
+ transition-delay: calc(var(--animation-order, 0) * 0.15s);
72
+ }
73
+ `;
74
+ document.head.appendChild(style);
75
+
76
+ // Set animation order for staggered animations
77
+ document.querySelectorAll('.subscription-card').forEach((card, index) => {
78
+ card.style.setProperty('--animation-order', index);
79
+ });
80
+
81
+ document.querySelectorAll('.feature-item').forEach((item, index) => {
82
+ item.style.setProperty('--animation-order', index);
83
+ });
84
+
85
+ document.querySelectorAll('.timeline-item').forEach((item, index) => {
86
+ item.style.setProperty('--animation-order', index);
87
+ });
88
+ }
89
+
90
+ // Accordion functionality for grant proposal section
91
+ function initAccordion() {
92
+ const accordionItems = document.querySelectorAll('.accordion-item');
93
+
94
+ accordionItems.forEach(item => {
95
+ const header = item.querySelector('.accordion-header');
96
+ const content = item.querySelector('.accordion-content');
97
+
98
+ header.addEventListener('click', () => {
99
+ // Close all other accordion items
100
+ accordionItems.forEach(otherItem => {
101
+ if (otherItem !== item && otherItem.classList.contains('active')) {
102
+ otherItem.classList.remove('active');
103
+ otherItem.querySelector('.accordion-content').style.maxHeight = '0px';
104
+ }
105
+ });
106
+
107
+ // Toggle current item
108
+ item.classList.toggle('active');
109
+
110
+ if (item.classList.contains('active')) {
111
+ content.style.display = 'block';
112
+ content.style.maxHeight = content.scrollHeight + 'px';
113
+ } else {
114
+ content.style.maxHeight = '0px';
115
+ setTimeout(() => {
116
+ content.style.display = 'none';
117
+ }, 300);
118
+ }
119
+ });
120
+ });
121
+
122
+ // Open first accordion item by default
123
+ if (accordionItems.length > 0) {
124
+ accordionItems[0].classList.add('active');
125
+ const firstContent = accordionItems[0].querySelector('.accordion-content');
126
+ firstContent.style.display = 'block';
127
+ firstContent.style.maxHeight = firstContent.scrollHeight + 'px';
128
+ }
129
+
130
+ // Add CSS for accordion animations
131
+ const style = document.createElement('style');
132
+ style.textContent = `
133
+ .accordion-content {
134
+ max-height: 0;
135
+ overflow: hidden;
136
+ transition: max-height 0.3s ease;
137
+ }
138
+ `;
139
+ document.head.appendChild(style);
140
+ }
141
+
142
+ // Parallax effect for sections
143
+ function initParallaxEffect() {
144
+ window.addEventListener('scroll', () => {
145
+ const scrollPosition = window.pageYOffset;
146
+
147
+ // Parallax for hero section
148
+ const heroImage = document.querySelector('.hero-image');
149
+ if (heroImage) {
150
+ heroImage.style.transform = `translateY(${scrollPosition * 0.4}px)`;
151
+ }
152
+
153
+ // Subtle parallax for section backgrounds
154
+ document.querySelectorAll('.section-gradient').forEach(section => {
155
+ const sectionTop = section.offsetTop;
156
+ const sectionHeight = section.offsetHeight;
157
+ const sectionMiddle = sectionTop + sectionHeight / 2;
158
+ const distanceFromMiddle = scrollPosition - sectionMiddle;
159
+ const parallaxValue = distanceFromMiddle * 0.05;
160
+
161
+ section.style.backgroundPosition = `center ${50 + parallaxValue}%`;
162
+ });
163
+ });
164
+ }
165
+
166
+ // Hero section animations
167
+ function initHeroAnimation() {
168
+ const heroContent = document.querySelector('.hero-content');
169
+ const heroElements = heroContent.querySelectorAll('h1, h2, p, .cta-buttons');
170
+
171
+ // Add CSS for hero animations
172
+ const style = document.createElement('style');
173
+ style.textContent = `
174
+ @keyframes fadeInUp {
175
+ from {
176
+ opacity: 0;
177
+ transform: translateY(30px);
178
+ }
179
+ to {
180
+ opacity: 1;
181
+ transform: translateY(0);
182
+ }
183
+ }
184
+
185
+ .hero-animate {
186
+ animation: fadeInUp 0.8s forwards;
187
+ opacity: 0;
188
+ }
189
+ `;
190
+ document.head.appendChild(style);
191
+
192
+ // Apply staggered animations to hero elements
193
+ heroElements.forEach((element, index) => {
194
+ element.classList.add('hero-animate');
195
+ element.style.animationDelay = `${0.3 + (index * 0.2)}s`;
196
+ });
197
+
198
+ // Add hover effect to CTA buttons
199
+ document.querySelectorAll('.cta-buttons .btn').forEach(button => {
200
+ button.addEventListener('mouseenter', function() {
201
+ this.style.transform = 'translateY(-5px)';
202
+ this.style.boxShadow = '0 15px 30px rgba(0, 224, 255, 0.3)';
203
+ });
204
+
205
+ button.addEventListener('mouseleave', function() {
206
+ this.style.transform = '';
207
+ this.style.boxShadow = '';
208
+ });
209
+ });
210
+ }
211
+
212
+ // Add smooth scrolling for navigation links
213
+ document.querySelectorAll('a[href^="#"]').forEach(anchor => {
214
+ anchor.addEventListener('click', function(e) {
215
+ e.preventDefault();
216
+
217
+ const targetId = this.getAttribute('href');
218
+ const targetElement = document.querySelector(targetId);
219
+
220
+ if (targetElement) {
221
+ // Close mobile navigation if open
222
+ document.querySelector('.nav-links').classList.remove('active');
223
+ document.querySelector('.mobile-nav-toggle').innerHTML = '<i class="fas fa-bars"></i>';
224
+
225
+ // Scroll to target
226
+ window.scrollTo({
227
+ top: targetElement.offsetTop - 80, // Offset for fixed header
228
+ behavior: 'smooth'
229
+ });
230
+ }
231
+ });
232
+ });
233
+
234
+ // Add fixed navigation on scroll
235
+ window.addEventListener('scroll', function() {
236
+ const nav = document.querySelector('nav');
237
+ if (window.scrollY > 100) {
238
+ nav.classList.add('nav-scrolled');
239
+ } else {
240
+ nav.classList.remove('nav-scrolled');
241
+ }
242
+ });
243
+
244
+ // Add CSS for fixed navigation
245
+ const navStyle = document.createElement('style');
246
+ navStyle.textContent = `
247
+ .nav-scrolled {
248
+ position: fixed;
249
+ background: rgba(11, 11, 15, 0.9);
250
+ backdrop-filter: blur(10px);
251
+ box-shadow: 0 5px 20px rgba(0, 0, 0, 0.3);
252
+ animation: slideDown 0.3s forwards;
253
+ }
254
+
255
+ @keyframes slideDown {
256
+ from {
257
+ transform: translateY(-100%);
258
+ }
259
+ to {
260
+ transform: translateY(0);
261
+ }
262
+ }
263
+
264
+ @media (max-width: 768px) {
265
+ .mobile-nav-toggle {
266
+ display: block;
267
+ font-size: 1.5rem;
268
+ cursor: pointer;
269
+ color: var(--accent-color-1);
270
+ }
271
+
272
+ .nav-links {
273
+ position: absolute;
274
+ top: 100%;
275
+ left: 0;
276
+ width: 100%;
277
+ background: rgba(11, 11, 15, 0.95);
278
+ flex-direction: column;
279
+ padding: 1rem 0;
280
+ clip-path: polygon(0 0, 100% 0, 100% 0, 0 0);
281
+ transition: clip-path 0.4s ease;
282
+ }
283
+
284
+ .nav-links.active {
285
+ clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
286
+ }
287
+
288
+ .nav-links a {
289
+ padding: 1rem 2rem;
290
+ }
291
+ }
292
+ `;
293
+ document.head.appendChild(navStyle);
294
+
295
+ // Add token orbit animation
296
+ const orbitStyle = document.createElement('style');
297
+ orbitStyle.textContent = `
298
+ .orbit-item {
299
+ transition: transform 0.3s ease, background 0.3s ease;
300
+ }
301
+
302
+ .orbit-item:hover {
303
+ transform: scale(1.2) !important;
304
+ background: var(--accent-color-1);
305
+ color: var(--bg-color);
306
+ }
307
+ `;
308
+ document.head.appendChild(orbitStyle);
309
+
310
+ // Add hover effects to image cards
311
+ document.querySelectorAll('.image-card').forEach(card => {
312
+ card.addEventListener('mouseenter', function() {
313
+ this.querySelector('img').style.transform = 'scale(1.05)';
314
+ this.querySelector('.image-overlay').style.opacity = '1';
315
+ });
316
+
317
+ card.addEventListener('mouseleave', function() {
318
+ this.querySelector('img').style.transform = 'scale(1)';
319
+ this.querySelector('.image-overlay').style.opacity = '0.8';
320
+ });
321
+ });
322
+
323
+ // Add CSS for image card hover effects
324
+ const imageCardStyle = document.createElement('style');
325
+ imageCardStyle.textContent = `
326
+ .image-card img {
327
+ transition: transform 0.5s ease;
328
+ }
329
+
330
+ .image-overlay {
331
+ opacity: 0.8;
332
+ transition: opacity 0.3s ease;
333
+ }
334
+ `;
335
+ document.head.appendChild(imageCardStyle);
showcase-styles.css ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Showcase Section Styles */
2
+ .showcase-intro {
3
+ text-align: center;
4
+ margin-bottom: 3rem;
5
+ }
6
+
7
+ .showcase-grid {
8
+ display: grid;
9
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
10
+ gap: 30px;
11
+ margin-bottom: 2rem;
12
+ }
13
+
14
+ .showcase-card {
15
+ background: var(--glass-bg);
16
+ border: 1px solid var(--glass-border);
17
+ border-radius: 16px;
18
+ padding: 30px;
19
+ transition: transform var(--transition-medium), box-shadow var(--transition-medium);
20
+ display: flex;
21
+ flex-direction: column;
22
+ height: 100%;
23
+ backdrop-filter: blur(10px);
24
+ position: relative;
25
+ overflow: hidden;
26
+ }
27
+
28
+ .showcase-card::before {
29
+ content: '';
30
+ position: absolute;
31
+ top: 0;
32
+ left: 0;
33
+ width: 100%;
34
+ height: 100%;
35
+ background: linear-gradient(135deg, rgba(0, 224, 255, 0.05) 0%, rgba(53, 242, 219, 0.05) 100%);
36
+ z-index: -1;
37
+ }
38
+
39
+ .showcase-card:hover {
40
+ transform: translateY(-10px);
41
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
42
+ }
43
+
44
+ .showcase-card:hover::after {
45
+ content: '';
46
+ position: absolute;
47
+ top: 0;
48
+ left: 0;
49
+ width: 100%;
50
+ height: 5px;
51
+ background: var(--gradient-2);
52
+ }
53
+
54
+ .card-icon {
55
+ font-size: 2.5rem;
56
+ margin-bottom: 1.5rem;
57
+ color: var(--accent-color-1);
58
+ text-align: center;
59
+ }
60
+
61
+ .showcase-card h3 {
62
+ font-size: 1.5rem;
63
+ margin-bottom: 1rem;
64
+ text-align: center;
65
+ }
66
+
67
+ .showcase-card p {
68
+ margin-bottom: 1.5rem;
69
+ opacity: 0.8;
70
+ flex-grow: 1;
71
+ }
72
+
73
+ .card-actions {
74
+ margin-top: auto;
75
+ text-align: center;
76
+ }
77
+
78
+ .card-actions .btn {
79
+ width: 100%;
80
+ }
81
+
82
+ /* Responsive adjustments */
83
+ @media (max-width: 768px) {
84
+ .showcase-grid {
85
+ grid-template-columns: 1fr;
86
+ }
87
+
88
+ .showcase-card {
89
+ padding: 20px;
90
+ }
91
+ }
styles.css ADDED
@@ -0,0 +1,1119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Base Styles and Variables */
2
+ @import url('showcase-styles.css');
3
+ :root {
4
+ --bg-color: #0B0B0F;
5
+ --text-color: #ffffff;
6
+ --accent-color-1: #00E0FF;
7
+ --accent-color-2: #35F2DB;
8
+ --card-bg: rgba(255, 255, 255, 0.05);
9
+ --gradient-1: linear-gradient(135deg, rgba(0, 224, 255, 0.1) 0%, rgba(53, 242, 219, 0.1) 100%);
10
+ --gradient-2: linear-gradient(135deg, rgba(0, 224, 255, 0.8) 0%, rgba(53, 242, 219, 0.8) 100%);
11
+ --metallic-gradient: linear-gradient(135deg, #c0c0c0 0%, #f5f5f5 50%, #c0c0c0 100%);
12
+ --glass-bg: rgba(255, 255, 255, 0.05);
13
+ --glass-border: rgba(255, 255, 255, 0.1);
14
+ --glass-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.36);
15
+ --font-primary: 'Space Grotesk', sans-serif;
16
+ --font-secondary: 'Inter', sans-serif;
17
+ --transition-slow: 0.5s ease;
18
+ --transition-medium: 0.3s ease;
19
+ --transition-fast: 0.15s ease;
20
+ }
21
+
22
+ /* Global Styles */
23
+ * {
24
+ margin: 0;
25
+ padding: 0;
26
+ box-sizing: border-box;
27
+ }
28
+
29
+ html {
30
+ scroll-behavior: smooth;
31
+ }
32
+
33
+ body {
34
+ font-family: var(--font-secondary);
35
+ background-color: var(--bg-color);
36
+ color: var(--text-color);
37
+ line-height: 1.6;
38
+ overflow-x: hidden;
39
+ position: relative;
40
+ }
41
+
42
+ .noise-overlay {
43
+ position: fixed;
44
+ top: 0;
45
+ left: 0;
46
+ width: 100%;
47
+ height: 100%;
48
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAAUVBMVEWFhYWDg4N3d3dtbW17e3t1dXWBgYGHh4d5eXlzc3OLi4ubm5uVlZWPj4+NjY19fX2JiYl/f39ra2uRkZGZmZlpaWmXl5dvb29xcXGTk5NnZ2c8TV1mAAAAG3RSTlNAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAvEOwtAAAFVklEQVR4XpWWB67c2BUFb3g557T/hRo9/WUMZHlgr4Bg8Z4qQgQJlHI4A8SzFVrapvmTF9O7dmYRFZ60YiBhJRCgh1FYhiLAmdvX0CzTOpNE77ME0Zty/nWWzchDtiqrmQDeuv3powQ5ta2eN0FY0InkqDD73lT9c9lEzwUNqgFHs9VQce3TVClFCQrSTfOiYkVJQBmpbq2L6iZavPnAPcoU0dSw0SUTqz/GtrGuXfbyyBniKykOWQWGqwwMA7QiYAxi+IlPdqo+hYHnUt5ZPfnsHJyNiDtnpJyayNBkF6cWoYGAMY92U2hXHF/C1M8uP/ZtYdiuj26UdAdQQSXQErwSOMzt/XWRWAz5GuSBIkwG1H3FabJ2OsUOUhGC6tK4EMtJO0ttC6IBD3kM0ve0tJwMdSfjZo+EEISaeTr9P3wYrGjXqyC1krcKdhMpxEnt5JetoulscpyzhXN5FRpuPHvbeQaKxFAEB6EN+cYN6xD7RYGpXpNndMmZgM5Dcs3YSNFDHUo2LGfZuukSWyUYirJAdYbF3MfqEKmjM+I2EfhA94iG3L7uKrR+GdWD73ydlIB+6hgref1QTlmgmbM3/LeX5GI1Ux1RWpgxpLuZ2+I+IjzZ8wqE4nilvQdkUdfhzI5QDWy+kw5Wgg2pGpeEVeCCA7b85BO3F9DzxB3cdqvBzWcmzbyMiqhzuYqtHRVG2y4x+KOlnyqla8AoWWpuBoYRxzXrfKuILl6SfiWCbjxoZJUaCBj1CjH7GIaDbc9kqBY3W/Rgjda1iqQcOJu2WW+76pZC9QG7M00dffe9hNnseupFL53r8F7YHSwJWUKP2q+k7RdsxyOB11n0xtOvnW4irMMFNV4H0uqwS5ExsmP9AxbDTc9JwgneAT5vTiUSm1E7BSflSt3bfa1tv8Di3R8n3Af7MNWzs49hmauE2wP+ttrq+AsWpFG2awvsuOqbipWHgtuvuaAE+A1Z/7gC9hesnr+7wqCwG8c5yAg3AL1fm8T9AZtp/bbJGwl1pNrE7RuOX7PeMRUERVaPpEs+yqeoSmuOlokqw49pgomjLeh7icHNlG19yjs6XXOMedYm5xH2YxpV2tc0Ro2jJfxC50ApuxGob7lMsxfTbeUv07TyYxpeLucEH1gNd4IKH2LAg5TdVhlCafZvpskfncCfx8pOhJzd76bJWeYFnFciwcYfubRc12Ip/ppIhA1/mSZ/RxjFDrJC5xifFjJpY2Xl5zXdguFqYyTR1zSp1Y9p+tktDYYSNflcxI0iyO4TPBdlRcpeqjK/piF5bklq77VSEaA+z8qmJTFzIWiitbnzR794USKBUaT0NTEsVjZqLaFVqJoPN9ODG70IPbfBHKK+/q/AWR0tJzYHRULOa4MP+W/HfGadZUbfw177G7j/OGbIs8TahLyynl4X4RinF793Oz+BU0saXtUHrVBFT/DnA3ctNPoGbs4hRIjTok8i+algT1lTHi4SxFvONKNrgQFAq2/gFnWMXgwffgYMJpiKYkmW3tTg3ZQ9Jq+f8XN+A5eeUKHWvJWJ2sgJ1Sop+wwhqFVijqWaJhwtD8MNlSBeWNNWTa5Z5kPZw5+LbVT99wqTdx29lMUH4OIG/D86ruKEauBjvH5xy6um/Sfj7ei6UUVk4AIl3MyD4MSSTOFgSwsH/QJWaQ5as7ZcmgBZkzjjU1UrQ74ci1gWBCSGHtuV1H2mhSnO3Wp/3fEV5a+4wz//6qy8JxjZsmxxy5+4w9CDNJY09T072iKG0EnOS0arEYgXqYnXcYHwjTtUNAcMelOd4xpkoqiTYICWFq0JSiPfPDQdnt+4/wuqcXY47QILbgAAAABJRU5ErkJggg==');
49
+ opacity: 0.03;
50
+ z-index: 1000;
51
+ pointer-events: none;
52
+ }
53
+
54
+ h1, h2, h3, h4, h5, h6 {
55
+ font-family: var(--font-primary);
56
+ font-weight: 600;
57
+ margin-bottom: 1rem;
58
+ }
59
+
60
+ p {
61
+ margin-bottom: 1rem;
62
+ }
63
+
64
+ a {
65
+ color: var(--accent-color-1);
66
+ text-decoration: none;
67
+ transition: color var(--transition-fast);
68
+ }
69
+
70
+ a:hover {
71
+ color: var(--accent-color-2);
72
+ }
73
+
74
+ .container {
75
+ width: 100%;
76
+ max-width: 1200px;
77
+ margin: 0 auto;
78
+ padding: 0 2rem;
79
+ }
80
+
81
+ .btn {
82
+ display: inline-block;
83
+ padding: 0.8rem 1.5rem;
84
+ border-radius: 4px;
85
+ font-family: var(--font-primary);
86
+ font-weight: 500;
87
+ text-transform: uppercase;
88
+ letter-spacing: 1px;
89
+ transition: all var(--transition-medium);
90
+ cursor: pointer;
91
+ position: relative;
92
+ overflow: hidden;
93
+ }
94
+
95
+ .btn::before {
96
+ content: '';
97
+ position: absolute;
98
+ top: 0;
99
+ left: -100%;
100
+ width: 100%;
101
+ height: 100%;
102
+ background: rgba(255, 255, 255, 0.1);
103
+ transition: all 0.3s ease;
104
+ }
105
+
106
+ .btn:hover::before {
107
+ left: 100%;
108
+ }
109
+
110
+ .primary-btn {
111
+ background: var(--gradient-2);
112
+ color: var(--bg-color);
113
+ border: none;
114
+ }
115
+
116
+ .primary-btn:hover {
117
+ transform: translateY(-3px);
118
+ box-shadow: 0 10px 20px rgba(0, 224, 255, 0.2);
119
+ color: var(--bg-color);
120
+ }
121
+
122
+ .secondary-btn {
123
+ background: transparent;
124
+ color: var(--accent-color-1);
125
+ border: 1px solid var(--accent-color-1);
126
+ }
127
+
128
+ .secondary-btn:hover {
129
+ background: rgba(0, 224, 255, 0.1);
130
+ transform: translateY(-3px);
131
+ box-shadow: 0 10px 20px rgba(0, 224, 255, 0.1);
132
+ color: var(--accent-color-1);
133
+ }
134
+
135
+ .section-dark {
136
+ background-color: var(--bg-color);
137
+ padding: 6rem 0;
138
+ position: relative;
139
+ }
140
+
141
+ .section-gradient {
142
+ background: var(--gradient-1);
143
+ padding: 6rem 0;
144
+ position: relative;
145
+ }
146
+
147
+ .section-header {
148
+ text-align: center;
149
+ margin-bottom: 4rem;
150
+ }
151
+
152
+ .section-header h2 {
153
+ font-size: 2.5rem;
154
+ margin-bottom: 1rem;
155
+ position: relative;
156
+ display: inline-block;
157
+ }
158
+
159
+ .section-line {
160
+ width: 80px;
161
+ height: 3px;
162
+ background: var(--accent-color-1);
163
+ margin: 0 auto;
164
+ }
165
+
166
+ /* Navigation */
167
+ nav {
168
+ display: flex;
169
+ justify-content: space-between;
170
+ align-items: center;
171
+ padding: 1.5rem 2rem;
172
+ position: absolute;
173
+ top: 0;
174
+ left: 0;
175
+ width: 100%;
176
+ z-index: 100;
177
+ background: rgba(11, 11, 15, 0.8);
178
+ backdrop-filter: blur(10px);
179
+ }
180
+
181
+ .logo {
182
+ font-family: var(--font-primary);
183
+ font-size: 1.5rem;
184
+ font-weight: 700;
185
+ letter-spacing: 2px;
186
+ color: var(--accent-color-1);
187
+ }
188
+
189
+ .nav-links {
190
+ display: flex;
191
+ gap: 1.5rem;
192
+ }
193
+
194
+ .nav-links a {
195
+ color: var(--text-color);
196
+ font-family: var(--font-primary);
197
+ font-size: 0.9rem;
198
+ font-weight: 500;
199
+ text-transform: uppercase;
200
+ letter-spacing: 1px;
201
+ transition: color var(--transition-fast);
202
+ }
203
+
204
+ .nav-links a:hover {
205
+ color: var(--accent-color-1);
206
+ }
207
+
208
+ /* Hero Section */
209
+ .hero {
210
+ height: 100vh;
211
+ display: flex;
212
+ align-items: center;
213
+ position: relative;
214
+ overflow: hidden;
215
+ }
216
+
217
+ .hero::before {
218
+ content: '';
219
+ position: absolute;
220
+ top: 0;
221
+ left: 0;
222
+ width: 100%;
223
+ height: 100%;
224
+ background: linear-gradient(to right, rgba(11, 11, 15, 0.9) 0%, rgba(11, 11, 15, 0.7) 50%, rgba(11, 11, 15, 0.5) 100%);
225
+ z-index: 1;
226
+ }
227
+
228
+ .hero-content {
229
+ width: 50%;
230
+ padding-left: 2rem;
231
+ position: relative;
232
+ z-index: 2;
233
+ }
234
+
235
+ .hero h1 {
236
+ font-size: 4rem;
237
+ margin-bottom: 1rem;
238
+ line-height: 1.1;
239
+ background: var(--metallic-gradient);
240
+ -webkit-background-clip: text;
241
+ background-clip: text;
242
+ color: transparent;
243
+ text-shadow: 0 0 10px rgba(0, 224, 255, 0.3);
244
+ }
245
+
246
+ .hero h2 {
247
+ font-size: 2rem;
248
+ margin-bottom: 1.5rem;
249
+ color: var(--accent-color-1);
250
+ }
251
+
252
+ .hero p {
253
+ font-size: 1.2rem;
254
+ margin-bottom: 2rem;
255
+ max-width: 600px;
256
+ }
257
+
258
+ .cta-buttons {
259
+ display: flex;
260
+ gap: 1rem;
261
+ }
262
+
263
+ .hero-image-container {
264
+ position: absolute;
265
+ top: 0;
266
+ right: 0;
267
+ width: 60%;
268
+ height: 100%;
269
+ z-index: 0;
270
+ }
271
+
272
+ .hero-image {
273
+ width: 100%;
274
+ height: 100%;
275
+ background-size: cover;
276
+ background-position: center;
277
+ filter: brightness(0.8);
278
+ }
279
+
280
+ /* Glitch Text Effect */
281
+ .glitch-text {
282
+ position: relative;
283
+ }
284
+
285
+ .glitch-text::before,
286
+ .glitch-text::after {
287
+ content: 'UNITY FLEET';
288
+ position: absolute;
289
+ top: 0;
290
+ left: 0;
291
+ width: 100%;
292
+ height: 100%;
293
+ background: var(--metallic-gradient);
294
+ -webkit-background-clip: text;
295
+ background-clip: text;
296
+ color: transparent;
297
+ }
298
+
299
+ .glitch-text::before {
300
+ left: 2px;
301
+ text-shadow: -2px 0 var(--accent-color-1);
302
+ animation: glitch-anim-1 2s infinite linear alternate-reverse;
303
+ }
304
+
305
+ .glitch-text::after {
306
+ left: -2px;
307
+ text-shadow: 2px 0 var(--accent-color-2);
308
+ animation: glitch-anim-2 3s infinite linear alternate-reverse;
309
+ }
310
+
311
+ @keyframes glitch-anim-1 {
312
+ 0% {
313
+ clip-path: inset(80% 0 0 0);
314
+ }
315
+ 20% {
316
+ clip-path: inset(20% 0 80% 0);
317
+ }
318
+ 40% {
319
+ clip-path: inset(40% 0 40% 0);
320
+ }
321
+ 60% {
322
+ clip-path: inset(60% 0 20% 0);
323
+ }
324
+ 80% {
325
+ clip-path: inset(10% 0 70% 0);
326
+ }
327
+ 100% {
328
+ clip-path: inset(30% 0 50% 0);
329
+ }
330
+ }
331
+
332
+ @keyframes glitch-anim-2 {
333
+ 0% {
334
+ clip-path: inset(10% 0 60% 0);
335
+ }
336
+ 20% {
337
+ clip-path: inset(30% 0 0% 0);
338
+ }
339
+ 40% {
340
+ clip-path: inset(50% 0 30% 0);
341
+ }
342
+ 60% {
343
+ clip-path: inset(70% 0 10% 0);
344
+ }
345
+ 80% {
346
+ clip-path: inset(20% 0 50% 0);
347
+ }
348
+ 100% {
349
+ clip-path: inset(40% 0 20% 0);
350
+ }
351
+ }
352
+
353
+ /* What is The Link Section */
354
+ .content-grid {
355
+ display: grid;
356
+ grid-template-columns: 1fr 1fr;
357
+ gap: 3rem;
358
+ align-items: center;
359
+ }
360
+
361
+ .highlight-text {
362
+ font-size: 1.3rem;
363
+ color: var(--accent-color-1);
364
+ margin-bottom: 2rem;
365
+ font-family: var(--font-primary);
366
+ line-height: 1.5;
367
+ }
368
+
369
+ .feature-list {
370
+ display: grid;
371
+ grid-template-columns: 1fr 1fr;
372
+ gap: 2rem;
373
+ }
374
+
375
+ .feature-item {
376
+ display: flex;
377
+ align-items: flex-start;
378
+ gap: 1rem;
379
+ }
380
+
381
+ .feature-icon {
382
+ width: 50px;
383
+ height: 50px;
384
+ border-radius: 50%;
385
+ background: var(--glass-bg);
386
+ display: flex;
387
+ align-items: center;
388
+ justify-content: center;
389
+ font-size: 1.5rem;
390
+ color: var(--accent-color-1);
391
+ border: 1px solid var(--glass-border);
392
+ box-shadow: var(--glass-shadow);
393
+ }
394
+
395
+ .feature-text h3 {
396
+ font-size: 1.2rem;
397
+ margin-bottom: 0.5rem;
398
+ }
399
+
400
+ .image-card {
401
+ position: relative;
402
+ border-radius: 10px;
403
+ overflow: hidden;
404
+ box-shadow: var(--glass-shadow);
405
+ transition: transform var(--transition-medium);
406
+ }
407
+
408
+ .image-card:hover {
409
+ transform: translateY(-10px);
410
+ }
411
+
412
+ .image-card img {
413
+ width: 100%;
414
+ height: auto;
415
+ display: block;
416
+ }
417
+
418
+ .image-overlay {
419
+ position: absolute;
420
+ bottom: 0;
421
+ left: 0;
422
+ width: 100%;
423
+ padding: 1rem;
424
+ background: linear-gradient(to top, rgba(11, 11, 15, 0.9), transparent);
425
+ color: var(--text-color);
426
+ font-family: var(--font-primary);
427
+ font-weight: 500;
428
+ }
429
+
430
+ /* Subscription Tiers Section */
431
+ .subscription-cards {
432
+ display: flex;
433
+ gap: 2rem;
434
+ justify-content: center;
435
+ flex-wrap: wrap;
436
+ }
437
+
438
+ .subscription-card {
439
+ background: var(--card-bg);
440
+ border-radius: 10px;
441
+ padding: 2rem;
442
+ width: 100%;
443
+ max-width: 350px;
444
+ border: 1px solid var(--glass-border);
445
+ box-shadow: var(--glass-shadow);
446
+ transition: transform var(--transition-medium);
447
+ position: relative;
448
+ overflow: hidden;
449
+ }
450
+
451
+ .subscription-card::before {
452
+ content: '';
453
+ position: absolute;
454
+ top: 0;
455
+ left: 0;
456
+ width: 100%;
457
+ height: 5px;
458
+ background: var(--accent-color-1);
459
+ }
460
+
461
+ .subscription-card.featured {
462
+ transform: scale(1.05);
463
+ }
464
+
465
+ .subscription-card.featured::before {
466
+ background: var(--gradient-2);
467
+ }
468
+
469
+ .subscription-card:hover {
470
+ transform: translateY(-10px);
471
+ }
472
+
473
+ .subscription-card.featured:hover {
474
+ transform: translateY(-10px) scale(1.05);
475
+ }
476
+
477
+ .card-header {
478
+ margin-bottom: 1.5rem;
479
+ padding-bottom: 1rem;
480
+ border-bottom: 1px solid var(--glass-border);
481
+ }
482
+
483
+ .card-header h3 {
484
+ font-size: 1.5rem;
485
+ margin-bottom: 0.5rem;
486
+ }
487
+
488
+ .price {
489
+ font-size: 1.2rem;
490
+ color: var(--accent-color-1);
491
+ font-family: var(--font-primary);
492
+ }
493
+
494
+ .card-content ul {
495
+ list-style: none;
496
+ margin-bottom: 2rem;
497
+ }
498
+
499
+ .card-content ul li {
500
+ margin-bottom: 0.8rem;
501
+ padding-left: 1.5rem;
502
+ position: relative;
503
+ }
504
+
505
+ .card-content ul li::before {
506
+ content: '✓';
507
+ position: absolute;
508
+ left: 0;
509
+ color: var(--accent-color-1);
510
+ }
511
+
512
+ .card-cta {
513
+ text-align: center;
514
+ }
515
+
516
+ .card-btn {
517
+ width: 100%;
518
+ background: transparent;
519
+ border: 1px solid var(--accent-color-1);
520
+ color: var(--accent-color-1);
521
+ }
522
+
523
+ .card-btn:hover {
524
+ background: rgba(0, 224, 255, 0.1);
525
+ }
526
+
527
+ /* Impact & Equity Section */
528
+ .content-columns {
529
+ display: grid;
530
+ grid-template-columns: repeat(3, 1fr);
531
+ gap: 2rem;
532
+ }
533
+
534
+ .column h3 {
535
+ font-size: 1.5rem;
536
+ margin-bottom: 1.5rem;
537
+ color: var(--accent-color-1);
538
+ }
539
+
540
+ .impact-metric {
541
+ margin-bottom: 1.5rem;
542
+ }
543
+
544
+ .metric-number {
545
+ font-size: 2.5rem;
546
+ font-family: var(--font-primary);
547
+ font-weight: 700;
548
+ color: var(--text-color);
549
+ margin-bottom: 0.3rem;
550
+ }
551
+
552
+ .metric-text {
553
+ font-size: 1rem;
554
+ color: rgba(255, 255, 255, 0.7);
555
+ }
556
+
557
+ .equity-list {
558
+ list-style: none;
559
+ }
560
+
561
+ .equity-list li {
562
+ margin-bottom: 0.8rem;
563
+ padding-left: 1.5rem;
564
+ position: relative;
565
+ }
566
+
567
+ .equity-list li::before {
568
+ content: '→';
569
+ position: absolute;
570
+ left: 0;
571
+ color: var(--accent-color-1);
572
+ }
573
+
574
+ /* Tokenization Section */
575
+ .tokenization-content {
576
+ display: grid;
577
+ grid-template-columns: 1fr 1fr;
578
+ gap: 3rem;
579
+ align-items: center;
580
+ }
581
+
582
+ .token-diagram {
583
+ display: flex;
584
+ justify-content: center;
585
+ align-items: center;
586
+ height: 400px;
587
+ }
588
+
589
+ .token-circle {
590
+ position: relative;
591
+ width: 300px;
592
+ height: 300px;
593
+ border-radius: 50%;
594
+ background: var(--glass-bg);
595
+ border: 1px solid var(--glass-border);
596
+ box-shadow: var(--glass-shadow);
597
+ display: flex;
598
+ justify-content: center;
599
+ align-items: center;
600
+ }
601
+
602
+ .token-inner {
603
+ width: 100px;
604
+ height: 100px;
605
+ border-radius: 50%;
606
+ background: var(--accent-color-1);
607
+ display: flex;
608
+ justify-content: center;
609
+ align-items: center;
610
+ font-size: 2.5rem;
611
+ color: var(--bg-color);
612
+ animation: pulse 3s infinite;
613
+ }
614
+
615
+ @keyframes pulse {
616
+ 0% {
617
+ box-shadow: 0 0 0 0 rgba(0, 224, 255, 0.4);
618
+ }
619
+ 70% {
620
+ box-shadow: 0 0 0 20px rgba(0, 224, 255, 0);
621
+ }
622
+ 100% {
623
+ box-shadow: 0 0 0 0 rgba(0, 224, 255, 0);
624
+ }
625
+ }
626
+
627
+ .token-orbit {
628
+ position: absolute;
629
+ top: 0;
630
+ left: 0;
631
+ width: 100%;
632
+ height: 100%;
633
+ border-radius: 50%;
634
+ animation: rotate 20s linear infinite;
635
+ }
636
+
637
+ @keyframes rotate {
638
+ from {
639
+ transform: rotate(0deg);
640
+ }
641
+ to {
642
+ transform: rotate(360deg);
643
+ }
644
+ }
645
+
646
+ .orbit-item {
647
+ position: absolute;
648
+ width: 60px;
649
+ height: 60px;
650
+ border-radius: 50%;
651
+ background: var(--glass-bg);
652
+ border: 1px solid var(--glass-border);
653
+ display: flex;
654
+ justify-content: center;
655
+ align-items: center;
656
+ font-size: 1.5rem;
657
+ color: var(--accent-color-1);
658
+ }
659
+
660
+ .orbit-item:nth-child(1) {
661
+ top: 0;
662
+ left: 50%;
663
+ transform: translateX(-50%);
664
+ }
665
+
666
+ .orbit-item:nth-child(2) {
667
+ top: 50%;
668
+ right: 0;
669
+ transform: translateY(-50%);
670
+ }
671
+
672
+ .orbit-item:nth-child(3) {
673
+ bottom: 0;
674
+ left: 50%;
675
+ transform: translateX(-50%);
676
+ }
677
+
678
+ .orbit-item:nth-child(4) {
679
+ top: 50%;
680
+ left: 0;
681
+ transform: translateY(-50%);
682
+ }
683
+
684
+ .token-info h3 {
685
+ font-size: 1.8rem;
686
+ margin-bottom: 1.5rem;
687
+ color: var(--accent-color-1);
688
+ }
689
+
690
+ .token-benefits {
691
+ display: grid;
692
+ grid-template-columns: 1fr 1fr;
693
+ gap: 1.5rem;
694
+ margin-top: 2rem;
695
+ }
696
+
697
+ .benefit-item {
698
+ display: flex;
699
+ align-items: center;
700
+ gap: 1rem;
701
+ }
702
+
703
+ .benefit-icon {
704
+ width: 40px;
705
+ height: 40px;
706
+ border-radius: 50%;
707
+ background: var(--glass-bg);
708
+ display: flex;
709
+ align-items: center;
710
+ justify-content: center;
711
+ font-size: 1.2rem;
712
+ color: var(--accent-color-1);
713
+ border: 1px solid var(--glass-border);
714
+ }
715
+
716
+ /* Rural Revitalization Section */
717
+ .rural-content {
718
+ display: grid;
719
+ grid-template-columns: 1fr 1fr;
720
+ gap: 3rem;
721
+ align-items: center;
722
+ }
723
+
724
+ .rural-image img {
725
+ width: 100%;
726
+ border-radius: 10px;
727
+ box-shadow: var(--glass-shadow);
728
+ }
729
+
730
+ .rural-text h3 {
731
+ font-size: 1.8rem;
732
+ margin-bottom: 1.5rem;
733
+ color: var(--accent-color-1);
734
+ }
735
+
736
+ .timeline {
737
+ margin-top: 2rem;
738
+ }
739
+
740
+ .timeline-item {
741
+ display: flex;
742
+ gap: 1.5rem;
743
+ margin-bottom: 1.5rem;
744
+ position: relative;
745
+ }
746
+
747
+ .timeline-item:not(:last-child)::after {
748
+ content: '';
749
+ position: absolute;
750
+ top: 40px;
751
+ left: 20px;
752
+ width: 1px;
753
+ height: calc(100% - 20px);
754
+ background: var(--accent-color-1);
755
+ }
756
+
757
+ .timeline-marker {
758
+ width: 40px;
759
+ height: 40px;
760
+ border-radius: 50%;
761
+ background: var(--accent-color-1);
762
+ display: flex;
763
+ align-items: center;
764
+ justify-content: center;
765
+ font-family: var(--font-primary);
766
+ font-weight: 700;
767
+ color: var(--bg-color);
768
+ z-index: 1;
769
+ }
770
+
771
+ .timeline-content h4 {
772
+ font-size: 1.2rem;
773
+ margin-bottom: 0.5rem;
774
+ }
775
+
776
+ /* Grant Proposal Section */
777
+ .proposal-content {
778
+ display: grid;
779
+ grid-template-columns: 1fr 2fr;
780
+ gap: 3rem;
781
+ }
782
+
783
+ .proposal-overview h3 {
784
+ font-size: 1.5rem;
785
+ margin-bottom: 1.5rem;
786
+ color: var(--accent-color-1);
787
+ }
788
+
789
+ .proposal-details {
790
+ background: var(--glass-bg);
791
+ border-radius: 10px;
792
+ padding: 2rem;
793
+ border: 1px solid var(--glass-border);
794
+ box-shadow: var(--glass-shadow);
795
+ }
796
+
797
+ .detail-item {
798
+ display: flex;
799
+ justify-content: space-between;
800
+ margin-bottom: 1rem;
801
+ padding-bottom: 1rem;
802
+ border-bottom: 1px solid var(--glass-border);
803
+ }
804
+
805
+ .detail-item:last-child {
806
+ margin-bottom: 0;
807
+ padding-bottom: 0;
808
+ border-bottom: none;
809
+ }
810
+
811
+ .detail-label {
812
+ font-weight: 500;
813
+ color: rgba(255, 255, 255, 0.7);
814
+ }
815
+
816
+ .detail-value {
817
+ font-family: var(--font-primary);
818
+ font-weight: 600;
819
+ color: var(--accent-color-1);
820
+ }
821
+
822
+ .accordion {
823
+ background: var(--glass-bg);
824
+ border-radius: 10px;
825
+ overflow: hidden;
826
+ border: 1px solid var(--glass-border);
827
+ box-shadow: var(--glass-shadow);
828
+ }
829
+
830
+ .accordion-item {
831
+ border-bottom: 1px solid var(--glass-border);
832
+ }
833
+
834
+ .accordion-item:last-child {
835
+ border-bottom: none;
836
+ }
837
+
838
+ .accordion-header {
839
+ padding: 1.5rem;
840
+ font-family: var(--font-primary);
841
+ font-weight: 600;
842
+ font-size: 1.1rem;
843
+ cursor: pointer;
844
+ position: relative;
845
+ transition: background var(--transition-fast);
846
+ }
847
+
848
+ .accordion-header:hover {
849
+ background: rgba(255, 255, 255, 0.05);
850
+ }
851
+
852
+ .accordion-header::after {
853
+ content: '+';
854
+ position: absolute;
855
+ right: 1.5rem;
856
+ top: 50%;
857
+ transform: translateY(-50%);
858
+ font-size: 1.5rem;
859
+ color: var(--accent-color-1);
860
+ }
861
+
862
+ .accordion-content {
863
+ padding: 0 1.5rem 1.5rem;
864
+ display: none;
865
+ }
866
+
867
+ .accordion-item.active .accordion-header::after {
868
+ content: '-';
869
+ }
870
+
871
+ .accordion-item.active .accordion-content {
872
+ display: block;
873
+ }
874
+
875
+ .read-more {
876
+ display: inline-block;
877
+ margin-top: 1rem;
878
+ font-family: var(--font-primary);
879
+ font-weight: 500;
880
+ color: var(--accent-color-1);
881
+ }
882
+
883
+ .proposal-download {
884
+ margin-top: 2rem;
885
+ text-align: center;
886
+ }
887
+
888
+ .download-btn {
889
+ background: var(--gradient-2);
890
+ color: var(--bg-color);
891
+ padding: 1rem 2rem;
892
+ font-size: 1.1rem;
893
+ }
894
+
895
+ .download-btn i {
896
+ margin-right: 0.5rem;
897
+ }
898
+
899
+ /* Footer */
900
+ footer {
901
+ background: var(--bg-color);
902
+ padding: 4rem 0 2rem;
903
+ border-top: 1px solid var(--glass-border);
904
+ }
905
+
906
+ .footer-content {
907
+ display: grid;
908
+ grid-template-columns: 1fr 2fr;
909
+ gap: 3rem;
910
+ margin-bottom: 3rem;
911
+ }
912
+
913
+ .footer-logo {
914
+ margin-bottom: 1rem;
915
+ }
916
+
917
+ .footer-logo .logo {
918
+ margin-bottom: 1rem;
919
+ display: inline-block;
920
+ }
921
+
922
+ .footer-links {
923
+ display: grid;
924
+ grid-template-columns: repeat(3, 1fr);
925
+ gap: 2rem;
926
+ }
927
+
928
+ .link-column h4 {
929
+ font-size: 1.1rem;
930
+ margin-bottom: 1.5rem;
931
+ color: var(--accent-color-1);
932
+ }
933
+
934
+ .link-column a {
935
+ display: block;
936
+ margin-bottom: 0.8rem;
937
+ color: rgba(255, 255, 255, 0.7);
938
+ transition: color var(--transition-fast);
939
+ }
940
+
941
+ .link-column a:hover {
942
+ color: var(--accent-color-1);
943
+ }
944
+
945
+ .footer-bottom {
946
+ display: flex;
947
+ justify-content: space-between;
948
+ align-items: center;
949
+ padding-top: 2rem;
950
+ border-top: 1px solid var(--glass-border);
951
+ }
952
+
953
+ .social-links {
954
+ display: flex;
955
+ gap: 1rem;
956
+ }
957
+
958
+ .social-links a {
959
+ width: 40px;
960
+ height: 40px;
961
+ border-radius: 50%;
962
+ background: var(--glass-bg);
963
+ display: flex;
964
+ align-items: center;
965
+ justify-content: center;
966
+ font-size: 1.2rem;
967
+ color: var(--accent-color-1);
968
+ border: 1px solid var(--glass-border);
969
+ transition: all var(--transition-fast);
970
+ }
971
+
972
+ .social-links a:hover {
973
+ background: var(--accent-color-1);
974
+ color: var(--bg-color);
975
+ }
976
+
977
+ /* Responsive Design */
978
+ @media (max-width: 1200px) {
979
+ .container {
980
+ padding: 0 1.5rem;
981
+ }
982
+
983
+ .hero h1 {
984
+ font-size: 3.5rem;
985
+ }
986
+
987
+ .hero h2 {
988
+ font-size: 1.8rem;
989
+ }
990
+ }
991
+
992
+ @media (max-width: 992px) {
993
+ .hero {
994
+ flex-direction: column;
995
+ height: auto;
996
+ padding: 8rem 0 4rem;
997
+ }
998
+
999
+ .hero-content {
1000
+ width: 100%;
1001
+ padding: 0;
1002
+ text-align: center;
1003
+ margin-bottom: 3rem;
1004
+ }
1005
+
1006
+ .hero h1 {
1007
+ font-size: 3rem;
1008
+ }
1009
+
1010
+ .cta-buttons {
1011
+ justify-content: center;
1012
+ }
1013
+
1014
+ .hero-image-container {
1015
+ position: relative;
1016
+ width: 100%;
1017
+ height: 50vh;
1018
+ }
1019
+
1020
+ .content-grid,
1021
+ .content-columns,
1022
+ .tokenization-content,
1023
+ .rural-content,
1024
+ .proposal-content {
1025
+ grid-template-columns: 1fr;
1026
+ gap: 2rem;
1027
+ }
1028
+
1029
+ .feature-list,
1030
+ .token-benefits {
1031
+ grid-template-columns: 1fr;
1032
+ }
1033
+
1034
+ .footer-content {
1035
+ grid-template-columns: 1fr;
1036
+ }
1037
+
1038
+ .footer-links {
1039
+ grid-template-columns: 1fr 1fr;
1040
+ }
1041
+ }
1042
+
1043
+ @media (max-width: 768px) {
1044
+ nav {
1045
+ flex-direction: column;
1046
+ gap: 1rem;
1047
+ }
1048
+
1049
+ .nav-links {
1050
+ flex-wrap: wrap;
1051
+ justify-content: center;
1052
+ }
1053
+
1054
+ .hero h1 {
1055
+ font-size: 2.5rem;
1056
+ }
1057
+
1058
+ .hero h2 {
1059
+ font-size: 1.5rem;
1060
+ }
1061
+
1062
+ .section-header h2 {
1063
+ font-size: 2rem;
1064
+ }
1065
+
1066
+ .subscription-cards {
1067
+ flex-direction: column;
1068
+ align-items: center;
1069
+ }
1070
+
1071
+ .subscription-card.featured {
1072
+ transform: scale(1);
1073
+ }
1074
+
1075
+ .subscription-card.featured:hover {
1076
+ transform: translateY(-10px);
1077
+ }
1078
+
1079
+ .footer-bottom {
1080
+ flex-direction: column;
1081
+ gap: 1rem;
1082
+ text-align: center;
1083
+ }
1084
+
1085
+ .social-links {
1086
+ justify-content: center;
1087
+ }
1088
+ }
1089
+
1090
+ @media (max-width: 576px) {
1091
+ .hero h1 {
1092
+ font-size: 2rem;
1093
+ }
1094
+
1095
+ .hero h2 {
1096
+ font-size: 1.2rem;
1097
+ }
1098
+
1099
+ .hero p {
1100
+ font-size: 1rem;
1101
+ }
1102
+
1103
+ .cta-buttons {
1104
+ flex-direction: column;
1105
+ gap: 1rem;
1106
+ }
1107
+
1108
+ .section-header h2 {
1109
+ font-size: 1.8rem;
1110
+ }
1111
+
1112
+ .highlight-text {
1113
+ font-size: 1.1rem;
1114
+ }
1115
+
1116
+ .footer-links {
1117
+ grid-template-columns: 1fr;
1118
+ }
1119
+ }
subscription-portal.html ADDED
@@ -0,0 +1,1269 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Unity Fleet - Subscription Portal</title>
7
+ <link rel="stylesheet" href="../styles.css">
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
9
+ <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Space+Grotesk:wght@300;400;500;600;700&display=swap" rel="stylesheet">
12
+ <style>
13
+ /* MVP Component specific styles */
14
+ .component-container {
15
+ max-width: 1200px;
16
+ margin: 0 auto;
17
+ padding: 2rem;
18
+ }
19
+
20
+ .component-header {
21
+ text-align: center;
22
+ margin-bottom: 3rem;
23
+ }
24
+
25
+ .component-header h1 {
26
+ font-size: 2.5rem;
27
+ margin-bottom: 1rem;
28
+ background: linear-gradient(90deg, var(--accent-color-1), var(--accent-color-2));
29
+ -webkit-background-clip: text;
30
+ background-clip: text;
31
+ -webkit-text-fill-color: transparent;
32
+ }
33
+
34
+ .component-header p {
35
+ font-size: 1.2rem;
36
+ max-width: 800px;
37
+ margin: 0 auto;
38
+ opacity: 0.8;
39
+ }
40
+
41
+ .component-content {
42
+ background: var(--glass-bg);
43
+ border: 1px solid var(--glass-border);
44
+ border-radius: 16px;
45
+ padding: 2rem;
46
+ margin-bottom: 3rem;
47
+ backdrop-filter: blur(10px);
48
+ }
49
+
50
+ .back-to-home {
51
+ display: inline-block;
52
+ margin-top: 2rem;
53
+ padding: 0.8rem 1.5rem;
54
+ background: transparent;
55
+ border: 1px solid var(--accent-color-1);
56
+ color: var(--accent-color-1);
57
+ border-radius: 4px;
58
+ font-family: var(--font-primary);
59
+ font-weight: 500;
60
+ text-transform: uppercase;
61
+ letter-spacing: 1px;
62
+ transition: all var(--transition-medium);
63
+ }
64
+
65
+ .back-to-home:hover {
66
+ background: rgba(0, 224, 255, 0.1);
67
+ transform: translateY(-3px);
68
+ }
69
+
70
+ /* Subscription Portal specific styles */
71
+ .subscription-portal-container {
72
+ display: flex;
73
+ flex-direction: column;
74
+ align-items: center;
75
+ padding: 1rem;
76
+ }
77
+
78
+ .portal-interface {
79
+ width: 100%;
80
+ max-width: 900px;
81
+ background-color: #0B0B0F;
82
+ border-radius: 16px;
83
+ overflow: hidden;
84
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.4);
85
+ border: 1px solid rgba(0, 224, 255, 0.3);
86
+ margin-bottom: 2rem;
87
+ }
88
+
89
+ .portal-header {
90
+ background: linear-gradient(90deg, rgba(0, 224, 255, 0.2), rgba(53, 242, 219, 0.2));
91
+ padding: 1.5rem;
92
+ display: flex;
93
+ justify-content: space-between;
94
+ align-items: center;
95
+ }
96
+
97
+ .portal-header h2 {
98
+ margin: 0;
99
+ font-size: 1.5rem;
100
+ }
101
+
102
+ .user-info {
103
+ display: flex;
104
+ align-items: center;
105
+ }
106
+
107
+ .user-avatar {
108
+ width: 40px;
109
+ height: 40px;
110
+ border-radius: 50%;
111
+ background: var(--accent-color-1);
112
+ display: flex;
113
+ align-items: center;
114
+ justify-content: center;
115
+ margin-right: 1rem;
116
+ font-size: 1.2rem;
117
+ }
118
+
119
+ .user-name {
120
+ font-weight: bold;
121
+ }
122
+
123
+ .user-plan {
124
+ font-size: 0.8rem;
125
+ opacity: 0.8;
126
+ }
127
+
128
+ .portal-nav {
129
+ display: flex;
130
+ background: rgba(0, 0, 0, 0.3);
131
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
132
+ }
133
+
134
+ .nav-tab {
135
+ padding: 1rem 1.5rem;
136
+ cursor: pointer;
137
+ transition: all 0.3s ease;
138
+ position: relative;
139
+ }
140
+
141
+ .nav-tab:hover {
142
+ background: rgba(0, 224, 255, 0.1);
143
+ }
144
+
145
+ .nav-tab.active {
146
+ color: var(--accent-color-1);
147
+ }
148
+
149
+ .nav-tab.active::after {
150
+ content: '';
151
+ position: absolute;
152
+ bottom: 0;
153
+ left: 0;
154
+ width: 100%;
155
+ height: 3px;
156
+ background: var(--accent-color-1);
157
+ }
158
+
159
+ .portal-body {
160
+ padding: 2rem;
161
+ }
162
+
163
+ .tab-content {
164
+ display: none;
165
+ }
166
+
167
+ .tab-content.active {
168
+ display: block;
169
+ }
170
+
171
+ /* Subscription Plans Tab */
172
+ .subscription-plans {
173
+ display: grid;
174
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
175
+ gap: 2rem;
176
+ margin-bottom: 2rem;
177
+ }
178
+
179
+ .plan-card {
180
+ background: rgba(255, 255, 255, 0.05);
181
+ border-radius: 12px;
182
+ padding: 1.5rem;
183
+ border: 1px solid rgba(255, 255, 255, 0.1);
184
+ transition: all 0.3s ease;
185
+ display: flex;
186
+ flex-direction: column;
187
+ height: 100%;
188
+ }
189
+
190
+ .plan-card:hover {
191
+ transform: translateY(-10px);
192
+ box-shadow: 0 15px 30px rgba(0, 0, 0, 0.3);
193
+ }
194
+
195
+ .plan-card.current {
196
+ border: 2px solid var(--accent-color-1);
197
+ background: rgba(0, 224, 255, 0.1);
198
+ }
199
+
200
+ .plan-header {
201
+ margin-bottom: 1.5rem;
202
+ text-align: center;
203
+ }
204
+
205
+ .plan-name {
206
+ font-size: 1.5rem;
207
+ font-weight: bold;
208
+ margin-bottom: 0.5rem;
209
+ color: var(--accent-color-1);
210
+ }
211
+
212
+ .plan-price {
213
+ font-size: 2rem;
214
+ font-weight: bold;
215
+ margin-bottom: 0.5rem;
216
+ }
217
+
218
+ .plan-billing {
219
+ font-size: 0.8rem;
220
+ opacity: 0.7;
221
+ }
222
+
223
+ .plan-features {
224
+ margin-bottom: 1.5rem;
225
+ flex-grow: 1;
226
+ }
227
+
228
+ .plan-feature {
229
+ display: flex;
230
+ align-items: center;
231
+ margin-bottom: 0.8rem;
232
+ }
233
+
234
+ .plan-feature i {
235
+ color: var(--accent-color-1);
236
+ margin-right: 0.5rem;
237
+ }
238
+
239
+ .plan-actions {
240
+ margin-top: auto;
241
+ }
242
+
243
+ .plan-button {
244
+ width: 100%;
245
+ padding: 0.8rem;
246
+ border-radius: 8px;
247
+ text-align: center;
248
+ cursor: pointer;
249
+ transition: all 0.3s ease;
250
+ }
251
+
252
+ .select-plan {
253
+ background: linear-gradient(90deg, var(--accent-color-1), var(--accent-color-2));
254
+ color: #000;
255
+ border: none;
256
+ }
257
+
258
+ .select-plan:hover {
259
+ transform: translateY(-3px);
260
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
261
+ }
262
+
263
+ .current-plan {
264
+ background: transparent;
265
+ border: 1px solid var(--accent-color-1);
266
+ color: var(--accent-color-1);
267
+ }
268
+
269
+ /* Usage Tab */
270
+ .usage-overview {
271
+ display: grid;
272
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
273
+ gap: 1.5rem;
274
+ margin-bottom: 2rem;
275
+ }
276
+
277
+ .usage-stat {
278
+ background: rgba(255, 255, 255, 0.05);
279
+ border-radius: 12px;
280
+ padding: 1.5rem;
281
+ border: 1px solid rgba(255, 255, 255, 0.1);
282
+ text-align: center;
283
+ }
284
+
285
+ .stat-value {
286
+ font-size: 2.5rem;
287
+ font-weight: bold;
288
+ margin-bottom: 0.5rem;
289
+ background: linear-gradient(90deg, var(--accent-color-1), var(--accent-color-2));
290
+ -webkit-background-clip: text;
291
+ background-clip: text;
292
+ -webkit-text-fill-color: transparent;
293
+ }
294
+
295
+ .stat-label {
296
+ font-size: 0.9rem;
297
+ opacity: 0.8;
298
+ }
299
+
300
+ .usage-chart {
301
+ background: rgba(0, 0, 0, 0.3);
302
+ border-radius: 12px;
303
+ padding: 1.5rem;
304
+ margin-bottom: 2rem;
305
+ height: 300px;
306
+ position: relative;
307
+ }
308
+
309
+ .chart-title {
310
+ margin-top: 0;
311
+ margin-bottom: 1rem;
312
+ font-size: 1.2rem;
313
+ color: var(--accent-color-1);
314
+ }
315
+
316
+ .chart-container {
317
+ height: 250px;
318
+ display: flex;
319
+ align-items: flex-end;
320
+ justify-content: space-between;
321
+ padding-top: 20px;
322
+ }
323
+
324
+ .chart-bar {
325
+ width: 8%;
326
+ background: linear-gradient(to top, rgba(0, 224, 255, 0.3), rgba(53, 242, 219, 0.7));
327
+ border-radius: 4px 4px 0 0;
328
+ position: relative;
329
+ transition: height 1s ease;
330
+ }
331
+
332
+ .chart-bar::before {
333
+ content: attr(data-value);
334
+ position: absolute;
335
+ top: -25px;
336
+ left: 50%;
337
+ transform: translateX(-50%);
338
+ font-size: 0.8rem;
339
+ }
340
+
341
+ .chart-bar::after {
342
+ content: attr(data-label);
343
+ position: absolute;
344
+ bottom: -25px;
345
+ left: 50%;
346
+ transform: translateX(-50%);
347
+ font-size: 0.8rem;
348
+ opacity: 0.7;
349
+ }
350
+
351
+ .recent-activity {
352
+ background: rgba(255, 255, 255, 0.05);
353
+ border-radius: 12px;
354
+ padding: 1.5rem;
355
+ border: 1px solid rgba(255, 255, 255, 0.1);
356
+ }
357
+
358
+ .activity-title {
359
+ margin-top: 0;
360
+ margin-bottom: 1rem;
361
+ font-size: 1.2rem;
362
+ color: var(--accent-color-1);
363
+ }
364
+
365
+ .activity-list {
366
+ list-style: none;
367
+ padding: 0;
368
+ margin: 0;
369
+ }
370
+
371
+ .activity-item {
372
+ display: flex;
373
+ justify-content: space-between;
374
+ padding: 1rem 0;
375
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
376
+ }
377
+
378
+ .activity-item:last-child {
379
+ border-bottom: none;
380
+ }
381
+
382
+ .activity-details {
383
+ display: flex;
384
+ align-items: center;
385
+ }
386
+
387
+ .activity-icon {
388
+ width: 40px;
389
+ height: 40px;
390
+ border-radius: 50%;
391
+ background: rgba(0, 224, 255, 0.1);
392
+ display: flex;
393
+ align-items: center;
394
+ justify-content: center;
395
+ margin-right: 1rem;
396
+ color: var(--accent-color-1);
397
+ }
398
+
399
+ .activity-info h4 {
400
+ margin: 0;
401
+ margin-bottom: 0.3rem;
402
+ }
403
+
404
+ .activity-info p {
405
+ margin: 0;
406
+ font-size: 0.8rem;
407
+ opacity: 0.7;
408
+ }
409
+
410
+ .activity-date {
411
+ font-size: 0.8rem;
412
+ opacity: 0.7;
413
+ align-self: center;
414
+ }
415
+
416
+ /* Account Tab */
417
+ .account-section {
418
+ background: rgba(255, 255, 255, 0.05);
419
+ border-radius: 12px;
420
+ padding: 1.5rem;
421
+ border: 1px solid rgba(255, 255, 255, 0.1);
422
+ margin-bottom: 2rem;
423
+ }
424
+
425
+ .section-title {
426
+ margin-top: 0;
427
+ margin-bottom: 1.5rem;
428
+ font-size: 1.2rem;
429
+ color: var(--accent-color-1);
430
+ display: flex;
431
+ justify-content: space-between;
432
+ align-items: center;
433
+ }
434
+
435
+ .edit-button {
436
+ font-size: 0.9rem;
437
+ padding: 0.5rem 1rem;
438
+ background: transparent;
439
+ border: 1px solid var(--accent-color-1);
440
+ color: var(--accent-color-1);
441
+ border-radius: 4px;
442
+ cursor: pointer;
443
+ transition: all 0.3s ease;
444
+ }
445
+
446
+ .edit-button:hover {
447
+ background: rgba(0, 224, 255, 0.1);
448
+ }
449
+
450
+ .form-group {
451
+ margin-bottom: 1.5rem;
452
+ }
453
+
454
+ .form-group label {
455
+ display: block;
456
+ margin-bottom: 0.5rem;
457
+ font-size: 0.9rem;
458
+ opacity: 0.8;
459
+ }
460
+
461
+ .form-group input {
462
+ width: 100%;
463
+ padding: 0.8rem;
464
+ background: rgba(255, 255, 255, 0.05);
465
+ border: 1px solid rgba(255, 255, 255, 0.1);
466
+ border-radius: 4px;
467
+ color: white;
468
+ }
469
+
470
+ .form-row {
471
+ display: flex;
472
+ gap: 1rem;
473
+ }
474
+
475
+ .form-row .form-group {
476
+ flex: 1;
477
+ }
478
+
479
+ .payment-method {
480
+ display: flex;
481
+ align-items: center;
482
+ padding: 1rem;
483
+ background: rgba(255, 255, 255, 0.05);
484
+ border-radius: 8px;
485
+ margin-bottom: 1rem;
486
+ }
487
+
488
+ .payment-icon {
489
+ font-size: 1.5rem;
490
+ margin-right: 1rem;
491
+ color: var(--accent-color-1);
492
+ }
493
+
494
+ .payment-details {
495
+ flex: 1;
496
+ }
497
+
498
+ .payment-details h4 {
499
+ margin: 0;
500
+ margin-bottom: 0.3rem;
501
+ }
502
+
503
+ .payment-details p {
504
+ margin: 0;
505
+ font-size: 0.8rem;
506
+ opacity: 0.7;
507
+ }
508
+
509
+ .payment-actions {
510
+ display: flex;
511
+ gap: 0.5rem;
512
+ }
513
+
514
+ .payment-actions button {
515
+ padding: 0.5rem;
516
+ background: transparent;
517
+ border: 1px solid rgba(255, 255, 255, 0.2);
518
+ color: white;
519
+ border-radius: 4px;
520
+ cursor: pointer;
521
+ transition: all 0.3s ease;
522
+ }
523
+
524
+ .payment-actions button:hover {
525
+ background: rgba(255, 255, 255, 0.1);
526
+ }
527
+
528
+ .add-payment {
529
+ display: flex;
530
+ align-items: center;
531
+ justify-content: center;
532
+ padding: 1rem;
533
+ background: rgba(255, 255, 255, 0.05);
534
+ border: 1px dashed rgba(255, 255, 255, 0.2);
535
+ border-radius: 8px;
536
+ cursor: pointer;
537
+ transition: all 0.3s ease;
538
+ }
539
+
540
+ .add-payment:hover {
541
+ background: rgba(0, 224, 255, 0.1);
542
+ border-color: var(--accent-color-1);
543
+ }
544
+
545
+ .add-payment i {
546
+ margin-right: 0.5rem;
547
+ color: var(--accent-color-1);
548
+ }
549
+
550
+ /* Billing Tab */
551
+ .billing-summary {
552
+ display: grid;
553
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
554
+ gap: 1.5rem;
555
+ margin-bottom: 2rem;
556
+ }
557
+
558
+ .billing-stat {
559
+ background: rgba(255, 255, 255, 0.05);
560
+ border-radius: 12px;
561
+ padding: 1.5rem;
562
+ border: 1px solid rgba(255, 255, 255, 0.1);
563
+ text-align: center;
564
+ }
565
+
566
+ .invoices {
567
+ background: rgba(255, 255, 255, 0.05);
568
+ border-radius: 12px;
569
+ padding: 1.5rem;
570
+ border: 1px solid rgba(255, 255, 255, 0.1);
571
+ }
572
+
573
+ .invoice-list {
574
+ list-style: none;
575
+ padding: 0;
576
+ margin: 0;
577
+ }
578
+
579
+ .invoice-item {
580
+ display: flex;
581
+ justify-content: space-between;
582
+ padding: 1rem 0;
583
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
584
+ }
585
+
586
+ .invoice-item:last-child {
587
+ border-bottom: none;
588
+ }
589
+
590
+ .invoice-details {
591
+ display: flex;
592
+ flex-direction: column;
593
+ }
594
+
595
+ .invoice-id {
596
+ font-size: 0.8rem;
597
+ opacity: 0.7;
598
+ margin-bottom: 0.3rem;
599
+ }
600
+
601
+ .invoice-date {
602
+ font-size: 0.9rem;
603
+ }
604
+
605
+ .invoice-amount {
606
+ font-weight: bold;
607
+ }
608
+
609
+ .invoice-status {
610
+ padding: 0.3rem 0.8rem;
611
+ border-radius: 20px;
612
+ font-size: 0.8rem;
613
+ }
614
+
615
+ .status-paid {
616
+ background: rgba(76, 175, 80, 0.2);
617
+ color: #4CAF50;
618
+ }
619
+
620
+ .status-pending {
621
+ background: rgba(255, 193, 7, 0.2);
622
+ color: #FFC107;
623
+ }
624
+
625
+ .invoice-actions {
626
+ display: flex;
627
+ align-items: center;
628
+ }
629
+
630
+ .invoice-actions a {
631
+ margin-left: 1rem;
632
+ color: var(--accent-color-1);
633
+ font-size: 0.9rem;
634
+ }
635
+
636
+ .portal-footer {
637
+ background: rgba(0, 0, 0, 0.3);
638
+ padding: 1rem;
639
+ display: flex;
640
+ justify-content: space-between;
641
+ align-items: center;
642
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
643
+ }
644
+
645
+ .portal-actions {
646
+ display: flex;
647
+ gap: 1rem;
648
+ }
649
+
650
+ .portal-actions button {
651
+ padding: 0.5rem 1rem;
652
+ border-radius: 4px;
653
+ background: transparent;
654
+ border: 1px solid var(--accent-color-1);
655
+ color: var(--accent-color-1);
656
+ cursor: pointer;
657
+ transition: all 0.3s ease;
658
+ }
659
+
660
+ .portal-actions button:hover {
661
+ background: rgba(0, 224, 255, 0.1);
662
+ }
663
+
664
+ .portal-actions button.primary {
665
+ background: linear-gradient(90deg, var(--accent-color-1), var(--accent-color-2));
666
+ color: #000;
667
+ border: none;
668
+ }
669
+
670
+ .portal-actions button.primary:hover {
671
+ transform: translateY(-3px);
672
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
673
+ }
674
+
675
+ .portal-info {
676
+ font-size: 0.9rem;
677
+ opacity: 0.7;
678
+ }
679
+ </style>
680
+ </head>
681
+ <body>
682
+ <div class="noise-overlay"></div>
683
+
684
+ <header>
685
+ <nav>
686
+ <div class="logo">UNITY FLEET</div>
687
+ <div class="nav-links">
688
+ <a href="../index.html#what-is-the-link">What is The Link</a>
689
+ <a href="../index.html#subscription-tiers">Subscription Tiers</a>
690
+ <a href="../index.html#impact-equity">Impact & Equity</a>
691
+ <a href="../index.html#tokenization">ChainLink Tokenization</a>
692
+ <a href="../index.html#rural-plan">Rural Revitalization</a>
693
+ <a href="../index.html#mvp-showcase">MVP Showcase</a>
694
+ </div>
695
+ <div class="mobile-nav-toggle">
696
+ <i class="fas fa-bars"></i>
697
+ </div>
698
+ </nav>
699
+ </header>
700
+
701
+ <main class="component-container">
702
+ <div class="component-header">
703
+ <h1>SUBSCRIPTION PORTAL</h1>
704
+ <p>Manage your Unity Fleet subscription, track usage, and access billing information through our intuitive customer portal.</p>
705
+ </div>
706
+
707
+ <div class="component-content">
708
+ <div class="subscription-portal-container">
709
+ <div class="portal-interface">
710
+ <div class="portal-header">
711
+ <h2>Unity Fleet Customer Portal</h2>
712
+ <div class="user-info">
713
+ <div class="user-avatar">
714
+ <i class="fas fa-user"></i>
715
+ </div>
716
+ <div>
717
+ <div class="user-name">John Doe</div>
718
+ <div class="user-plan">Premium Plan</div>
719
+ </div>
720
+ </div>
721
+ </div>
722
+
723
+ <div class="portal-nav">
724
+ <div class="nav-tab active" data-tab="plans">Subscription Plans</div>
725
+ <div class="nav-tab" data-tab="usage">Usage & Activity</div>
726
+ <div class="nav-tab" data-tab="account">Account Settings</div>
727
+ <div class="nav-tab" data-tab="billing">Billing & Invoices</div>
728
+ </div>
729
+
730
+ <div class="portal-body">
731
+ <!-- Subscription Plans Tab -->
732
+ <div class="tab-content active" id="plans-tab">
733
+ <div class="subscription-plans">
734
+ <div class="plan-card">
735
+ <div class="plan-header">
736
+ <div class="plan-name">Basic</div>
737
+ <div class="plan-price">$99</div>
738
+ <div class="plan-billing">per month</div>
739
+ </div>
740
+ <div class="plan-features">
741
+ <div class="plan-feature">
742
+ <i class="fas fa-check"></i>
743
+ <span>4 vehicle reservations per month</span>
744
+ </div>
745
+ <div class="plan-feature">
746
+ <i class="fas fa-check"></i>
747
+ <span>Standard charging access</span>
748
+ </div>
749
+ <div class="plan-feature">
750
+ <i class="fas fa-check"></i>
751
+ <span>Basic lounge access</span>
752
+ </div>
753
+ <div class="plan-feature">
754
+ <i class="fas fa-check"></i>
755
+ <span>Standard vehicle selection</span>
756
+ </div>
757
+ <div class="plan-feature">
758
+ <i class="fas fa-times"></i>
759
+ <span>Priority booking</span>
760
+ </div>
761
+ <div class="plan-feature">
762
+ <i class="fas fa-times"></i>
763
+ <span>Premium vehicle access</span>
764
+ </div>
765
+ </div>
766
+ <div class="plan-actions">
767
+ <div class="plan-button select-plan">Select Plan</div>
768
+ </div>
769
+ </div>
770
+
771
+ <div class="plan-card current">
772
+ <div class="plan-header">
773
+ <div class="plan-name">Premium</div>
774
+ <div class="plan-price">$199</div>
775
+ <div class="plan-billing">per month</div>
776
+ </div>
777
+ <div class="plan-features">
778
+ <div class="plan-feature">
779
+ <i class="fas fa-check"></i>
780
+ <span>8 vehicle reservations per month</span>
781
+ </div>
782
+ <div class="plan-feature">
783
+ <i class="fas fa-check"></i>
784
+ <span>Priority charging access</span>
785
+ </div>
786
+ <div class="plan-feature">
787
+ <i class="fas fa-check"></i>
788
+ <span>Premium lounge access</span>
789
+ </div>
790
+ <div class="plan-feature">
791
+ <i class="fas fa-check"></i>
792
+ <span>Extended vehicle selection</span>
793
+ </div>
794
+ <div class="plan-feature">
795
+ <i class="fas fa-check"></i>
796
+ <span>Priority booking</span>
797
+ </div>
798
+ <div class="plan-feature">
799
+ <i class="fas fa-times"></i>
800
+ <span>Luxury vehicle access</span>
801
+ </div>
802
+ </div>
803
+ <div class="plan-actions">
804
+ <div class="plan-button current-plan">Current Plan</div>
805
+ </div>
806
+ </div>
807
+
808
+ <div class="plan-card">
809
+ <div class="plan-header">
810
+ <div class="plan-name">Elite</div>
811
+ <div class="plan-price">$349</div>
812
+ <div class="plan-billing">per month</div>
813
+ </div>
814
+ <div class="plan-features">
815
+ <div class="plan-feature">
816
+ <i class="fas fa-check"></i>
817
+ <span>Unlimited vehicle reservations</span>
818
+ </div>
819
+ <div class="plan-feature">
820
+ <i class="fas fa-check"></i>
821
+ <span>VIP charging access</span>
822
+ </div>
823
+ <div class="plan-feature">
824
+ <i class="fas fa-check"></i>
825
+ <span>Elite lounge access</span>
826
+ </div>
827
+ <div class="plan-feature">
828
+ <i class="fas fa-check"></i>
829
+ <span>Full vehicle selection</span>
830
+ </div>
831
+ <div class="plan-feature">
832
+ <i class="fas fa-check"></i>
833
+ <span>Priority booking</span>
834
+ </div>
835
+ <div class="plan-feature">
836
+ <i class="fas fa-check"></i>
837
+ <span>Luxury vehicle access</span>
838
+ </div>
839
+ </div>
840
+ <div class="plan-actions">
841
+ <div class="plan-button select-plan">Select Plan</div>
842
+ </div>
843
+ </div>
844
+ </div>
845
+ </div>
846
+
847
+ <!-- Usage & Activity Tab -->
848
+ <div class="tab-content" id="usage-tab">
849
+ <div class="usage-overview">
850
+ <div class="usage-stat">
851
+ <div class="stat-value">6</div>
852
+ <div class="stat-label">Reservations Used</div>
853
+ </div>
854
+ <div class="usage-stat">
855
+ <div class="stat-value">2</div>
856
+ <div class="stat-label">Reservations Remaining</div>
857
+ </div>
858
+ <div class="usage-stat">
859
+ <div class="stat-value">14</div>
860
+ <div class="stat-label">Charging Sessions</div>
861
+ </div>
862
+ <div class="usage-stat">
863
+ <div class="stat-value">342</div>
864
+ <div class="stat-label">kWh Consumed</div>
865
+ </div>
866
+ </div>
867
+
868
+ <div class="usage-chart">
869
+ <h3 class="chart-title">Monthly Usage History</h3>
870
+ <div class="chart-container">
871
+ <div class="chart-bar" style="height: 30%;" data-value="2" data-label="Jan"></div>
872
+ <div class="chart-bar" style="height: 45%;" data-value="3" data-label="Feb"></div>
873
+ <div class="chart-bar" style="height: 60%;" data-value="4" data-label="Mar"></div>
874
+ <div class="chart-bar" style="height: 75%;" data-value="5" data-label="Apr"></div>
875
+ <div class="chart-bar" style="height: 90%;" data-value="6" data-label="May"></div>
876
+ <div class="chart-bar" style="height: 60%;" data-value="4" data-label="Jun"></div>
877
+ <div class="chart-bar" style="height: 45%;" data-value="3" data-label="Jul"></div>
878
+ <div class="chart-bar" style="height: 0%;" data-value="0" data-label="Aug"></div>
879
+ <div class="chart-bar" style="height: 0%;" data-value="0" data-label="Sep"></div>
880
+ <div class="chart-bar" style="height: 0%;" data-value="0" data-label="Oct"></div>
881
+ <div class="chart-bar" style="height: 0%;" data-value="0" data-label="Nov"></div>
882
+ <div class="chart-bar" style="height: 0%;" data-value="0" data-label="Dec"></div>
883
+ </div>
884
+ </div>
885
+
886
+ <div class="recent-activity">
887
+ <h3 class="activity-title">Recent Activity</h3>
888
+ <ul class="activity-list">
889
+ <li class="activity-item">
890
+ <div class="activity-details">
891
+ <div class="activity-icon">
892
+ <i class="fas fa-car"></i>
893
+ </div>
894
+ <div class="activity-info">
895
+ <h4>Tesla Model 3 Reservation</h4>
896
+ <p>Downtown Springfield Hub</p>
897
+ </div>
898
+ </div>
899
+ <div class="activity-date">July 15, 2025</div>
900
+ </li>
901
+ <li class="activity-item">
902
+ <div class="activity-details">
903
+ <div class="activity-icon">
904
+ <i class="fas fa-charging-station"></i>
905
+ </div>
906
+ <div class="activity-info">
907
+ <h4>Charging Session</h4>
908
+ <p>Champaign-Urbana Hub • 42 kWh</p>
909
+ </div>
910
+ </div>
911
+ <div class="activity-date">July 10, 2025</div>
912
+ </li>
913
+ <li class="activity-item">
914
+ <div class="activity-details">
915
+ <div class="activity-icon">
916
+ <i class="fas fa-car"></i>
917
+ </div>
918
+ <div class="activity-info">
919
+ <h4>Rivian R1S Reservation</h4>
920
+ <p>Bloomington-Normal Hub</p>
921
+ </div>
922
+ </div>
923
+ <div class="activity-date">July 5, 2025</div>
924
+ </li>
925
+ <li class="activity-item">
926
+ <div class="activity-details">
927
+ <div class="activity-icon">
928
+ <i class="fas fa-credit-card"></i>
929
+ </div>
930
+ <div class="activity-info">
931
+ <h4>Monthly Subscription Payment</h4>
932
+ <p>Premium Plan • $199.00</p>
933
+ </div>
934
+ </div>
935
+ <div class="activity-date">July 1, 2025</div>
936
+ </li>
937
+ </ul>
938
+ </div>
939
+ </div>
940
+
941
+ <!-- Account Settings Tab -->
942
+ <div class="tab-content" id="account-tab">
943
+ <div class="account-section">
944
+ <h3 class="section-title">
945
+ Personal Information
946
+ <button class="edit-button">Edit</button>
947
+ </h3>
948
+ <div class="form-row">
949
+ <div class="form-group">
950
+ <label for="first-name">First Name</label>
951
+ <input type="text" id="first-name" value="John" disabled>
952
+ </div>
953
+ <div class="form-group">
954
+ <label for="last-name">Last Name</label>
955
+ <input type="text" id="last-name" value="Doe" disabled>
956
+ </div>
957
+ </div>
958
+ <div class="form-group">
959
+ <label for="email">Email Address</label>
960
+ <input type="email" id="email" value="[email protected]" disabled>
961
+ </div>
962
+ <div class="form-group">
963
+ <label for="phone">Phone Number</label>
964
+ <input type="tel" id="phone" value="(217) 555-1234" disabled>
965
+ </div>
966
+ </div>
967
+
968
+ <div class="account-section">
969
+ <h3 class="section-title">
970
+ Payment Methods
971
+ <button class="edit-button">Manage</button>
972
+ </h3>
973
+ <div class="payment-method">
974
+ <div class="payment-icon">
975
+ <i class="fab fa-cc-visa"></i>
976
+ </div>
977
+ <div class="payment-details">
978
+ <h4>Visa ending in 4242</h4>
979
+ <p>Expires 05/2027</p>
980
+ </div>
981
+ <div class="payment-actions">
982
+ <button>Edit</button>
983
+ <button>Remove</button>
984
+ </div>
985
+ </div>
986
+ <div class="payment-method">
987
+ <div class="payment-icon">
988
+ <i class="fab fa-cc-mastercard"></i>
989
+ </div>
990
+ <div class="payment-details">
991
+ <h4>Mastercard ending in 8888</h4>
992
+ <p>Expires 12/2026</p>
993
+ </div>
994
+ <div class="payment-actions">
995
+ <button>Edit</button>
996
+ <button>Remove</button>
997
+ </div>
998
+ </div>
999
+ <div class="add-payment">
1000
+ <i class="fas fa-plus"></i>
1001
+ <span>Add Payment Method</span>
1002
+ </div>
1003
+ </div>
1004
+
1005
+ <div class="account-section">
1006
+ <h3 class="section-title">
1007
+ Notification Preferences
1008
+ <button class="edit-button">Edit</button>
1009
+ </h3>
1010
+ <div class="form-group">
1011
+ <label>
1012
+ <input type="checkbox" checked disabled>
1013
+ Reservation Confirmations
1014
+ </label>
1015
+ </div>
1016
+ <div class="form-group">
1017
+ <label>
1018
+ <input type="checkbox" checked disabled>
1019
+ Charging Completion Alerts
1020
+ </label>
1021
+ </div>
1022
+ <div class="form-group">
1023
+ <label>
1024
+ <input type="checkbox" checked disabled>
1025
+ Billing Notifications
1026
+ </label>
1027
+ </div>
1028
+ <div class="form-group">
1029
+ <label>
1030
+ <input type="checkbox" disabled>
1031
+ Marketing Communications
1032
+ </label>
1033
+ </div>
1034
+ </div>
1035
+ </div>
1036
+
1037
+ <!-- Billing & Invoices Tab -->
1038
+ <div class="tab-content" id="billing-tab">
1039
+ <div class="billing-summary">
1040
+ <div class="billing-stat">
1041
+ <div class="stat-value">$199</div>
1042
+ <div class="stat-label">Current Monthly Plan</div>
1043
+ </div>
1044
+ <div class="billing-stat">
1045
+ <div class="stat-value">Aug 1</div>
1046
+ <div class="stat-label">Next Billing Date</div>
1047
+ </div>
1048
+ <div class="billing-stat">
1049
+ <div class="stat-value">$0</div>
1050
+ <div class="stat-label">Additional Charges</div>
1051
+ </div>
1052
+ <div class="billing-stat">
1053
+ <div class="stat-value">$199</div>
1054
+ <div class="stat-label">Next Payment</div>
1055
+ </div>
1056
+ </div>
1057
+
1058
+ <div class="invoices">
1059
+ <h3 class="section-title">
1060
+ Recent Invoices
1061
+ <button class="edit-button">View All</button>
1062
+ </h3>
1063
+ <ul class="invoice-list">
1064
+ <li class="invoice-item">
1065
+ <div class="invoice-details">
1066
+ <div class="invoice-id">INV-2025-07-01</div>
1067
+ <div class="invoice-date">July 1, 2025</div>
1068
+ </div>
1069
+ <div class="invoice-amount">$199.00</div>
1070
+ <div class="invoice-status status-paid">Paid</div>
1071
+ <div class="invoice-actions">
1072
+ <a href="#"><i class="fas fa-download"></i> PDF</a>
1073
+ </div>
1074
+ </li>
1075
+ <li class="invoice-item">
1076
+ <div class="invoice-details">
1077
+ <div class="invoice-id">INV-2025-06-01</div>
1078
+ <div class="invoice-date">June 1, 2025</div>
1079
+ </div>
1080
+ <div class="invoice-amount">$199.00</div>
1081
+ <div class="invoice-status status-paid">Paid</div>
1082
+ <div class="invoice-actions">
1083
+ <a href="#"><i class="fas fa-download"></i> PDF</a>
1084
+ </div>
1085
+ </li>
1086
+ <li class="invoice-item">
1087
+ <div class="invoice-details">
1088
+ <div class="invoice-id">INV-2025-05-01</div>
1089
+ <div class="invoice-date">May 1, 2025</div>
1090
+ </div>
1091
+ <div class="invoice-amount">$199.00</div>
1092
+ <div class="invoice-status status-paid">Paid</div>
1093
+ <div class="invoice-actions">
1094
+ <a href="#"><i class="fas fa-download"></i> PDF</a>
1095
+ </div>
1096
+ </li>
1097
+ <li class="invoice-item">
1098
+ <div class="invoice-details">
1099
+ <div class="invoice-id">INV-2025-04-01</div>
1100
+ <div class="invoice-date">April 1, 2025</div>
1101
+ </div>
1102
+ <div class="invoice-amount">$199.00</div>
1103
+ <div class="invoice-status status-paid">Paid</div>
1104
+ <div class="invoice-actions">
1105
+ <a href="#"><i class="fas fa-download"></i> PDF</a>
1106
+ </div>
1107
+ </li>
1108
+ </ul>
1109
+ </div>
1110
+ </div>
1111
+ </div>
1112
+
1113
+ <div class="portal-footer">
1114
+ <div class="portal-actions">
1115
+ <button>Contact Support</button>
1116
+ <button class="primary">Make a Reservation</button>
1117
+ </div>
1118
+ <div class="portal-info">
1119
+ Last Login: July 20, 2025 | 10:45 AM
1120
+ </div>
1121
+ </div>
1122
+ </div>
1123
+ </div>
1124
+ </div>
1125
+
1126
+ <div class="component-features">
1127
+ <h2>Key Features</h2>
1128
+ <ul class="features-list">
1129
+ <li>Comprehensive subscription plan management with tier comparison and upgrade options</li>
1130
+ <li>Detailed usage tracking with visual charts and activity history</li>
1131
+ <li>Account settings management including personal information and notification preferences</li>
1132
+ <li>Billing dashboard with invoice history and payment method management</li>
1133
+ <li>Integrated reservation system with direct access to vehicle booking</li>
1134
+ <li>Real-time subscription status monitoring with remaining allocations</li>
1135
+ <li>Responsive design for seamless access across desktop and mobile devices</li>
1136
+ </ul>
1137
+ </div>
1138
+
1139
+ <a href="../index.html#mvp-showcase" class="back-to-home">
1140
+ <i class="fas fa-arrow-left"></i> Back to MVP Showcase
1141
+ </a>
1142
+ </main>
1143
+
1144
+ <footer>
1145
+ <div class="container">
1146
+ <div class="footer-content">
1147
+ <div class="footer-logo">
1148
+ <div class="logo">UNITY FLEET</div>
1149
+ <p>Revolutionizing electric vehicle infrastructure across Illinois</p>
1150
+ </div>
1151
+
1152
+ <div class="footer-links">
1153
+ <div class="link-column">
1154
+ <h4>Navigation</h4>
1155
+ <a href="../index.html#what-is-the-link">What is The Link</a>
1156
+ <a href="../index.html#subscription-tiers">Subscription Tiers</a>
1157
+ <a href="../index.html#impact-equity">Impact & Equity</a>
1158
+ <a href="../index.html#tokenization">ChainLink Tokenization</a>
1159
+ <a href="../index.html#rural-plan">Rural Revitalization</a>
1160
+ <a href="../index.html#mvp-showcase">MVP Showcase</a>
1161
+ </div>
1162
+
1163
+ <div class="link-column">
1164
+ <h4>Contact</h4>
1165
+ <a href="mailto:[email protected]">[email protected]</a>
1166
+ <a href="tel:+12175551234">+1 (217) 555-1234</a>
1167
+ <p>2457 E Eldorado St<br>Decatur, IL 62521</p>
1168
+ </div>
1169
+
1170
+ <div class="link-column">
1171
+ <h4>Legal</h4>
1172
+ <a href="#">Privacy Policy</a>
1173
+ <a href="#">Terms of Service</a>
1174
+ <a href="#">Accessibility</a>
1175
+ </div>
1176
+ </div>
1177
+
1178
+ <div class="footer-social">
1179
+ <a href="#" class="social-icon"><i class="fab fa-twitter"></i></a>
1180
+ <a href="#" class="social-icon"><i class="fab fa-linkedin"></i></a>
1181
+ <a href="#" class="social-icon"><i class="fab fa-facebook"></i></a>
1182
+ <a href="#" class="social-icon"><i class="fab fa-instagram"></i></a>
1183
+ </div>
1184
+ </div>
1185
+
1186
+ <div class="footer-bottom">
1187
+ <p>&copy; 2025 Unity Fleet LLC. All rights reserved.</p>
1188
+ </div>
1189
+ </div>
1190
+ </footer>
1191
+
1192
+ <script>
1193
+ // Mobile navigation toggle
1194
+ document.querySelector('.mobile-nav-toggle').addEventListener('click', function() {
1195
+ document.querySelector('.nav-links').classList.toggle('active');
1196
+ this.innerHTML = document.querySelector('.nav-links').classList.contains('active')
1197
+ ? '<i class="fas fa-times"></i>'
1198
+ : '<i class="fas fa-bars"></i>';
1199
+ });
1200
+
1201
+ // Subscription portal tab navigation
1202
+ document.addEventListener('DOMContentLoaded', function() {
1203
+ const navTabs = document.querySelectorAll('.nav-tab');
1204
+ const tabContents = document.querySelectorAll('.tab-content');
1205
+
1206
+ navTabs.forEach(tab => {
1207
+ tab.addEventListener('click', function() {
1208
+ // Remove active class from all tabs
1209
+ navTabs.forEach(t => t.classList.remove('active'));
1210
+
1211
+ // Add active class to clicked tab
1212
+ this.classList.add('active');
1213
+
1214
+ // Hide all tab contents
1215
+ tabContents.forEach(content => content.classList.remove('active'));
1216
+
1217
+ // Show selected tab content
1218
+ const tabId = this.getAttribute('data-tab') + '-tab';
1219
+ document.getElementById(tabId).classList.add('active');
1220
+ });
1221
+ });
1222
+
1223
+ // Animate chart bars on load
1224
+ const chartBars = document.querySelectorAll('.chart-bar');
1225
+ chartBars.forEach(bar => {
1226
+ const height = bar.style.height;
1227
+ bar.style.height = '0%';
1228
+ setTimeout(() => {
1229
+ bar.style.height = height;
1230
+ }, 300);
1231
+ });
1232
+
1233
+ // Plan card hover effects
1234
+ const planCards = document.querySelectorAll('.plan-card');
1235
+ planCards.forEach(card => {
1236
+ card.addEventListener('mouseenter', function() {
1237
+ if (!this.classList.contains('current')) {
1238
+ this.style.transform = 'translateY(-10px)';
1239
+ this.style.boxShadow = '0 15px 30px rgba(0, 224, 255, 0.2)';
1240
+ }
1241
+ });
1242
+
1243
+ card.addEventListener('mouseleave', function() {
1244
+ if (!this.classList.contains('current')) {
1245
+ this.style.transform = '';
1246
+ this.style.boxShadow = '';
1247
+ }
1248
+ });
1249
+ });
1250
+
1251
+ // Edit buttons functionality
1252
+ const editButtons = document.querySelectorAll('.edit-button');
1253
+ editButtons.forEach(button => {
1254
+ button.addEventListener('click', function() {
1255
+ alert('Edit functionality would be implemented in the production version.');
1256
+ });
1257
+ });
1258
+
1259
+ // Plan selection functionality
1260
+ const selectPlanButtons = document.querySelectorAll('.select-plan');
1261
+ selectPlanButtons.forEach(button => {
1262
+ button.addEventListener('click', function() {
1263
+ alert('Plan change functionality would be implemented in the production version.');
1264
+ });
1265
+ });
1266
+ });
1267
+ </script>
1268
+ </body>
1269
+ </html>
technical_architecture.md ADDED
@@ -0,0 +1,456 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Unity Fleet MVP Technical Architecture
2
+
3
+ This document outlines the technical architecture for the Unity Fleet MVP components, defining the technology stack, data models, integration points, and deployment strategy.
4
+
5
+ ## Overall Architecture
6
+
7
+ The Unity Fleet MVP suite will follow a modern web application architecture with these key characteristics:
8
+
9
+ - **Frontend**: React-based single-page applications (SPAs) for all user interfaces
10
+ - **Backend**: Simulated API endpoints with mock data (no actual backend server required for MVP)
11
+ - **Data Storage**: Local browser storage (localStorage/IndexedDB) for persistence during demonstrations
12
+ - **Deployment**: Static site hosting for all components
13
+ - **Integration**: Common data models and shared components across all MVPs
14
+
15
+ ### System Architecture Diagram
16
+
17
+ ```
18
+ ┌─────────────────────────────────────────────────────────────┐
19
+ │ │
20
+ │ User Interface Layer │
21
+ │ │
22
+ ├───────────┬───────────┬───────────┬───────────┬───────────┬─┘
23
+ │ Mobile │ Charging │ Energy │Subscription│Interactive│
24
+ │ App │ Hub │Management │ Portal │Deployment │
25
+ │ Prototype │ Dashboard │Simulation │ │ Map │
26
+ └───────────┴───────────┴───────────┴───────────┴───────────┘
27
+ │ │ │ │ │
28
+ ▼ ▼ ▼ ▼ ▼
29
+ ┌─────────────────────────────────────────────────────────────┐
30
+ │ │
31
+ │ Shared Component Library │
32
+ │ │
33
+ ├─────────────────────────────────────────────────────────────┤
34
+ │ │
35
+ │ Mock Data Services │
36
+ │ │
37
+ ├─────────────────────────────────────────────────────────────┤
38
+ │ │
39
+ │ Local Storage Persistence │
40
+ │ │
41
+ └─────────────────────────────────────────────────────────────┘
42
+ ```
43
+
44
+ ## Technology Stack
45
+
46
+ ### Frontend Technologies
47
+
48
+ - **Framework**: React 18
49
+ - **State Management**: Redux Toolkit
50
+ - **Styling**: Tailwind CSS with custom theme
51
+ - **UI Components**: Custom component library based on Material UI
52
+ - **Routing**: React Router
53
+ - **Data Visualization**: D3.js and React-Vis
54
+ - **Maps**: Leaflet with OpenStreetMap
55
+ - **Animations**: Framer Motion
56
+ - **3D Rendering** (if needed): Three.js
57
+
58
+ ### Development Tools
59
+
60
+ - **Package Manager**: npm
61
+ - **Build Tool**: Vite
62
+ - **Version Control**: Git
63
+ - **Code Quality**: ESLint, Prettier
64
+ - **Testing**: Jest, React Testing Library
65
+ - **Design System**: Storybook
66
+
67
+ ## Component-Specific Architecture
68
+
69
+ ### 1. Mobile Application Prototype
70
+
71
+ ```
72
+ ┌─────────────────────────────────────────────────────────────┐
73
+ │ Mobile App Prototype │
74
+ ├─────────────────────────────────────────────────────────────┤
75
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
76
+ │ │ Vehicle │ │ Reservation │ │ User │ │
77
+ │ │ Browser │ │ System │ │ Dashboard │ │
78
+ │ └─────────────┘ └─────────────┘ └─────────────┘ │
79
+ │ ┌─────────────┐ ┌───────────��─┐ ┌─────────────┐ │
80
+ │ │ Payment │ │ Trip │ │ Notification │ │
81
+ │ │ Simulation │ │ Planner │ │ Center │ │
82
+ │ └─────────────┘ └─────────────┘ └─────────────┘ │
83
+ ├─────────────────────────────────────────────────────────────┤
84
+ │ Mock API Services │
85
+ ├─────────────────────────────────────────────────────────────┤
86
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
87
+ │ │ Vehicle │ │ User │ │ Reservation │ │
88
+ │ │ Data │ │ Data │ │ Data │ │
89
+ │ └─────────────┘ └─────────────┘ └─────────────┘ │
90
+ └─────────────────────────────────────────────────────────────┘
91
+ ```
92
+
93
+ **Key Technical Features**:
94
+ - Responsive design with mobile-first approach
95
+ - Vehicle data with images, specifications, and availability
96
+ - Interactive calendar for date/time selection
97
+ - Simulated payment processing
98
+ - Geolocation integration for pickup/dropoff
99
+ - Trip planning with charging stop recommendations
100
+
101
+ ### 2. Charging Hub Management Dashboard
102
+
103
+ ```
104
+ ┌─────────────────────────────────────────────────────────────┐
105
+ │ Charging Hub Dashboard │
106
+ ├─────────────────────────────────────────────────────────────┤
107
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
108
+ │ │ Station │ │ Energy │ │ Maintenance │ │
109
+ │ │ Monitor │ │ Analytics │ │ Scheduler │ │
110
+ │ └─────────────┘ └─────────────┘ └─────────────┘ │
111
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
112
+ │ │ User │ │ Revenue │ │ Alert │ │
113
+ │ │ Access │ │ Tracking │ │ System │ │
114
+ │ └─────────────┘ └─────────────┘ └─────────────┘ │
115
+ ├─────────────────────────────────────────────────────────────┤
116
+ │ Mock API Services │
117
+ ├─────────────────────────────────────────────────────────────┤
118
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
119
+ │ │ Station │ │ Energy │ │ User │ │
120
+ │ │ Data │ │ Data │ │ Data │ │
121
+ │ └─────────────┘ └─────────────┘ └─────────────┘ │
122
+ └─────────────────────────────────────────────────────────────┘
123
+ ```
124
+
125
+ **Key Technical Features**:
126
+ - Real-time data visualization with auto-updating charts
127
+ - Interactive station status map
128
+ - Time-series data for energy usage patterns
129
+ - Alert system with priority levels
130
+ - Maintenance ticket management
131
+ - Revenue and usage reporting
132
+
133
+ ### 3. Energy Management Simulation
134
+
135
+ ```
136
+ ┌─────────────────────────────────────────────────────────────┐
137
+ │ Energy Management Simulation │
138
+ ├────────────────────────────────────────────���────────────────┤
139
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
140
+ │ │ Solar │ │ Battery │ │ Grid │ │
141
+ │ │ Simulation │ │ Simulation │ │ Interaction │ │
142
+ │ └─────────────┘ └─────────────┘ └─────────────┘ │
143
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
144
+ │ │ Energy │ │ Cost │ │ Carbon │ │
145
+ │ │ Flow │ │ Calculator │ │ Savings │ │
146
+ │ └─────────────┘ └─────────────┘ └─────────────┘ │
147
+ ├─────────────────────────────────────────────────────────────┤
148
+ │ Simulation Engine │
149
+ ├─────────────────────────────────────────────────────────────┤
150
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
151
+ │ │ Weather │ │ Energy │ │ Pricing │ │
152
+ │ │ Data │ │ Models │ │ Data │ │
153
+ │ └─────────────┘ └─────────────┘ └─────────────┘ │
154
+ └─────────────────────────────────────────────────────────────┘
155
+ ```
156
+
157
+ **Key Technical Features**:
158
+ - Physics-based simulation of energy generation and consumption
159
+ - Weather data integration for solar production modeling
160
+ - Animated visualizations of energy flows
161
+ - Time controls (speed up/slow down/pause)
162
+ - Scenario testing with different parameters
163
+ - Real-time calculation of financial and environmental metrics
164
+
165
+ ### 4. Subscription Management Portal
166
+
167
+ ```
168
+ ┌─────────────────────────────────────────────────────────────┐
169
+ │ Subscription Management Portal │
170
+ ├─────────────────────────────────────────────────────────────┤
171
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
172
+ │ │ Tier │ │ Customer │ │ Usage │ │
173
+ │ │ Comparison │ │ Management │ │ Analytics │ │
174
+ │ └─────────────┘ └─────────────┘ └─────────────┘ │
175
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
176
+ │ │ Billing │ │ Subscription│ │ Revenue │ │
177
+ │ │ Simulation │ │ Pathways │ │ Projections │ │
178
+ │ └─────────────┘ └─────────────┘ └─────────────┘ │
179
+ ├─────────────────────────────────────────────────────────────┤
180
+ │ Mock API Services │
181
+ ├─────────────────────────────────────────────────────────────┤
182
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
183
+ │ │ Subscription│ │ Customer │ │ Usage │ │
184
+ │ │ Data │ │ Data │ │ Data │ │
185
+ │ └─────────────┘ └─────────────┘ └─────────────┘ │
186
+ └─────────────────────────────────────────────────────────────┘
187
+ ```
188
+
189
+ **Key Technical Features**:
190
+ - Interactive tier comparison with feature highlighting
191
+ - Customer profile management
192
+ - Usage tracking visualizations
193
+ - Billing cycle simulation
194
+ - Upgrade/downgrade pathway visualization
195
+ - Revenue projection modeling
196
+
197
+ ### 5. Interactive Deployment Map
198
+
199
+ ```
200
+ ┌─────────────────────────────────────────────────────────────┐
201
+ │ Interactive Deployment Map │
202
+ ├─────────────────────────────────────────────────────────────┤
203
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
204
+ │ │ Location │ │ Phase │ │ Population │ │
205
+ │ │ Map │ │ Timeline │ │ Coverage │ │
206
+ │ └─────────────┘ └─────────────┘ └─────────────┘ │
207
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
208
+ │ │Infrastructure│ │ EV │ │ Location │ │
209
+ │ │ Impact │ │ Adoption │ │ Details │ │
210
+ │ └─────────────┘ └─────────────┘ └─────────────┘ │
211
+ ├─────────────────────────────────────────────────────────────┤
212
+ │ Geospatial Services │
213
+ ├─────────────────────────────────────────────────────────────┤
214
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
215
+ │ │ Location │ │ Demographic │ │ Deployment │ │
216
+ │ │ Data │ │ Data │ │ Data │ │
217
+ │ └─────────────┘ └─────────────┘ └─────────────┘ │
218
+ └─────────────────────────────────────────────────────────────┘
219
+ ```
220
+
221
+ **Key Technical Features**:
222
+ - Interactive map with multiple data layers
223
+ - Timeline slider for phase visualization
224
+ - Demographic data overlays
225
+ - Infrastructure impact heatmaps
226
+ - Detailed location information panels
227
+ - Distance and coverage calculations
228
+
229
+ ### 6. ChainLink Tokenization Demonstration
230
+
231
+ ```
232
+ ┌─────────────────────────────────────────────────────────────┐
233
+ │ ChainLink Tokenization Demonstration │
234
+ ├─────────────────────────────────────────────────────────────┤
235
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
236
+ │ │ Token │ │ Asset │ │ Value │ │
237
+ │ │ Allocation │ │ Ownership │ │ Flow │ │
238
+ │ └─────────────┘ └─────────────┘ └─────────────┘ │
239
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
240
+ │ │ Transaction │ │ Stakeholder │ │ Token │ │
241
+ │ │ Simulation │ │ Dashboard │ │ Economics │ │
242
+ │ └─────────────┘ └─────────────┘ └─────────────┘ │
243
+ ├─────────────────────────────────────────────────────────────┤
244
+ │ Blockchain Simulation │
245
+ ├─────────────────────────────────────────────────────────────┤
246
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
247
+ │ │ Token │ │ Transaction │ │ Stakeholder │ │
248
+ │ │ Data │ │ Data │ │ Data │ │
249
+ │ └─────────────┘ └─────────────┘ └─────────────┘ │
250
+ └─────────────────────────────────────────────────────────────┘
251
+ ```
252
+
253
+ **Key Technical Features**:
254
+ - Simplified blockchain visualization
255
+ - Token allocation animations
256
+ - Asset ownership visualization
257
+ - Value flow diagrams with animation
258
+ - Transaction simulation with ledger updates
259
+ - Stakeholder dashboard with real-time updates
260
+
261
+ ## Data Models
262
+
263
+ ### Core Data Models
264
+
265
+ These data models will be shared across multiple components:
266
+
267
+ #### Vehicle Model
268
+ ```json
269
+ {
270
+ "id": "string",
271
+ "make": "string",
272
+ "model": "string",
273
+ "year": "number",
274
+ "type": "string",
275
+ "range": "number",
276
+ "batteryCapacity": "number",
277
+ "chargingSpeed": "number",
278
+ "images": ["string"],
279
+ "features": ["string"],
280
+ "dailyRate": "number",
281
+ "weeklyRate": "number",
282
+ "monthlyRate": "number",
283
+ "availability": {
284
+ "status": "string",
285
+ "nextAvailable": "date",
286
+ "location": "string"
287
+ }
288
+ }
289
+ ```
290
+
291
+ #### User Model
292
+ ```json
293
+ {
294
+ "id": "string",
295
+ "name": "string",
296
+ "email": "string",
297
+ "phone": "string",
298
+ "subscriptionTier": "string",
299
+ "joinDate": "date",
300
+ "paymentMethods": [{
301
+ "id": "string",
302
+ "type": "string",
303
+ "last4": "string",
304
+ "expiryDate": "string"
305
+ }],
306
+ "drivingHistory": {
307
+ "totalTrips": "number",
308
+ "totalMiles": "number",
309
+ "favoriteVehicles": ["string"]
310
+ }
311
+ }
312
+ ```
313
+
314
+ #### Charging Station Model
315
+ ```json
316
+ {
317
+ "id": "string",
318
+ "hubId": "string",
319
+ "type": "string",
320
+ "power": "number",
321
+ "status": "string",
322
+ "currentUser": "string",
323
+ "sessionStart": "date",
324
+ "energyDelivered": "number",
325
+ "maintenanceStatus": {
326
+ "lastMaintenance": "date",
327
+ "nextScheduled": "date",
328
+ "issues": ["string"]
329
+ }
330
+ }
331
+ ```
332
+
333
+ #### Hub Model
334
+ ```json
335
+ {
336
+ "id": "string",
337
+ "name": "string",
338
+ "location": {
339
+ "address": "string",
340
+ "city": "string",
341
+ "state": "string",
342
+ "zip": "string",
343
+ "coordinates": {
344
+ "lat": "number",
345
+ "lng": "number"
346
+ }
347
+ },
348
+ "stations": ["string"],
349
+ "solarCapacity": "number",
350
+ "batteryCapacity": "number",
351
+ "amenities": ["string"],
352
+ "operatingHours": {
353
+ "open": "string",
354
+ "close": "string",
355
+ "days": ["string"]
356
+ }
357
+ }
358
+ ```
359
+
360
+ #### Subscription Model
361
+ ```json
362
+ {
363
+ "id": "string",
364
+ "name": "string",
365
+ "monthlyPrice": "number",
366
+ "annualPrice": "number",
367
+ "features": [{
368
+ "name": "string",
369
+ "description": "string",
370
+ "included": "boolean"
371
+ }],
372
+ "vehicleAccess": ["string"],
373
+ "chargingCredits": "number",
374
+ "additionalBenefits": ["string"]
375
+ }
376
+ ```
377
+
378
+ ## Integration Strategy
379
+
380
+ ### Shared Components
381
+
382
+ The following components will be shared across multiple MVPs:
383
+
384
+ - **Navigation Bar**: Consistent navigation across all applications
385
+ - **User Authentication**: Simulated login/logout functionality
386
+ - **Vehicle Cards**: Standardized vehicle display components
387
+ - **Charging Station Cards**: Unified station status display
388
+ - **Data Visualizations**: Common chart and graph components
389
+ - **Map Components**: Reusable mapping elements
390
+ - **Notification System**: Consistent alert and notification UI
391
+
392
+ ### Data Sharing
393
+
394
+ Data will be shared between components using:
395
+
396
+ 1. **Local Storage**: For persistent data across browser sessions
397
+ 2. **URL Parameters**: For deep linking between applications
398
+ 3. **Shared State Library**: Common Redux store for demonstration purposes
399
+
400
+ ## Deployment Architecture
401
+
402
+ The MVPs will be deployed as static web applications:
403
+
404
+ ```
405
+ ┌─────────────────────────────────────────────────────────────┐
406
+ │ Static Web Hosting │
407
+ ├─────────────┬───────────┬───────────┬───────────┬───────────┤
408
+ │ Mobile │ Charging │ Energy │Subscription│Interactive│
409
+ │ App │ Hub │Management │ Portal │Deployment │
410
+ │ Prototype │ Dashboard │Simulation │ │ Map │
411
+ └─────────────┴───────────┴───────────┴───────────┴───────────┘
412
+ │ │ │ │ │
413
+ ▼ ▼ ▼ ▼ ▼
414
+ ┌─────────────────────────────────────────────────────────────┐
415
+ │ Landing Page Portal │
416
+ └─────────────────────────────────────────────────────────────┘
417
+ ```
418
+
419
+ - Each MVP will be deployed as a standalone application
420
+ - A central landing page will provide navigation to all components
421
+ - All applications will be responsive and work on desktop and mobile devices
422
+ - No backend server is required as all data will be simulated
423
+
424
+ ## Development Workflow
425
+
426
+ 1. **Setup**: Create project scaffolding with shared components and styles
427
+ 2. **Component Development**: Build individual MVPs in parallel
428
+ 3. **Integration**: Connect components through shared data models
429
+ 4. **Testing**: Verify functionality and user experience
430
+ 5. **Deployment**: Deploy to static hosting
431
+ 6. **Documentation**: Create user guides and demonstration scripts
432
+
433
+ ## Technical Considerations
434
+
435
+ ### Performance Optimization
436
+
437
+ - Use code splitting to reduce initial load times
438
+ - Optimize images and assets for web delivery
439
+ - Implement lazy loading for non-critical components
440
+ - Use efficient data structures for simulations
441
+
442
+ ### Browser Compatibility
443
+
444
+ - Target modern browsers (Chrome, Firefox, Safari, Edge)
445
+ - Use progressive enhancement for advanced features
446
+ - Test on multiple devices and screen sizes
447
+ - Ensure accessibility compliance
448
+
449
+ ### Simulation Fidelity
450
+
451
+ - Balance realism with performance
452
+ - Use realistic but simplified models for energy and financial simulations
453
+ - Ensure data consistency across all components
454
+ - Provide controls to adjust simulation parameters
455
+
456
+ This technical architecture provides the foundation for developing the Unity Fleet MVP components, ensuring a cohesive and impressive demonstration of the key concepts while maintaining technical feasibility within the project constraints.
template.html ADDED
@@ -0,0 +1,205 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Unity Fleet - MVP Component</title>
7
+ <link rel="stylesheet" href="../styles.css">
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
9
+ <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Space+Grotesk:wght@300;400;500;600;700&display=swap" rel="stylesheet">
12
+ <style>
13
+ /* MVP Component specific styles */
14
+ .component-container {
15
+ max-width: 1200px;
16
+ margin: 0 auto;
17
+ padding: 2rem;
18
+ }
19
+
20
+ .component-header {
21
+ text-align: center;
22
+ margin-bottom: 3rem;
23
+ }
24
+
25
+ .component-header h1 {
26
+ font-size: 2.5rem;
27
+ margin-bottom: 1rem;
28
+ background: linear-gradient(90deg, var(--accent-color-1), var(--accent-color-2));
29
+ -webkit-background-clip: text;
30
+ background-clip: text;
31
+ -webkit-text-fill-color: transparent;
32
+ }
33
+
34
+ .component-header p {
35
+ font-size: 1.2rem;
36
+ max-width: 800px;
37
+ margin: 0 auto;
38
+ opacity: 0.8;
39
+ }
40
+
41
+ .component-content {
42
+ background: var(--glass-bg);
43
+ border: 1px solid var(--glass-border);
44
+ border-radius: 16px;
45
+ padding: 2rem;
46
+ margin-bottom: 3rem;
47
+ backdrop-filter: blur(10px);
48
+ }
49
+
50
+ .back-to-home {
51
+ display: inline-block;
52
+ margin-top: 2rem;
53
+ padding: 0.8rem 1.5rem;
54
+ background: transparent;
55
+ border: 1px solid var(--accent-color-1);
56
+ color: var(--accent-color-1);
57
+ border-radius: 4px;
58
+ font-family: var(--font-primary);
59
+ font-weight: 500;
60
+ text-transform: uppercase;
61
+ letter-spacing: 1px;
62
+ transition: all var(--transition-medium);
63
+ }
64
+
65
+ .back-to-home:hover {
66
+ background: rgba(0, 224, 255, 0.1);
67
+ transform: translateY(-3px);
68
+ }
69
+
70
+ /* Responsive iframe container */
71
+ .iframe-container {
72
+ position: relative;
73
+ width: 100%;
74
+ height: 0;
75
+ padding-bottom: 56.25%; /* 16:9 aspect ratio */
76
+ overflow: hidden;
77
+ border-radius: 8px;
78
+ }
79
+
80
+ .iframe-container iframe {
81
+ position: absolute;
82
+ top: 0;
83
+ left: 0;
84
+ width: 100%;
85
+ height: 100%;
86
+ border: none;
87
+ }
88
+ </style>
89
+ </head>
90
+ <body>
91
+ <div class="noise-overlay"></div>
92
+
93
+ <header>
94
+ <nav>
95
+ <div class="logo">UNITY FLEET</div>
96
+ <div class="nav-links">
97
+ <a href="../index.html#what-is-the-link">What is The Link</a>
98
+ <a href="../index.html#subscription-tiers">Subscription Tiers</a>
99
+ <a href="../index.html#impact-equity">Impact & Equity</a>
100
+ <a href="../index.html#tokenization">ChainLink Tokenization</a>
101
+ <a href="../index.html#rural-plan">Rural Revitalization</a>
102
+ <a href="../index.html#mvp-showcase">MVP Showcase</a>
103
+ </div>
104
+ <div class="mobile-nav-toggle">
105
+ <i class="fas fa-bars"></i>
106
+ </div>
107
+ </nav>
108
+ </header>
109
+
110
+ <main class="component-container">
111
+ <div class="component-header">
112
+ <h1>COMPONENT_TITLE</h1>
113
+ <p>COMPONENT_DESCRIPTION</p>
114
+ </div>
115
+
116
+ <div class="component-content">
117
+ <div class="iframe-container">
118
+ <!-- Component will be embedded here -->
119
+ <div id="component-placeholder">
120
+ Loading component...
121
+ </div>
122
+ </div>
123
+ </div>
124
+
125
+ <div class="component-features">
126
+ <h2>Key Features</h2>
127
+ <ul class="features-list">
128
+ <li>FEATURE_1</li>
129
+ <li>FEATURE_2</li>
130
+ <li>FEATURE_3</li>
131
+ <li>FEATURE_4</li>
132
+ <li>FEATURE_5</li>
133
+ </ul>
134
+ </div>
135
+
136
+ <a href="../index.html#mvp-showcase" class="back-to-home">
137
+ <i class="fas fa-arrow-left"></i> Back to MVP Showcase
138
+ </a>
139
+ </main>
140
+
141
+ <footer>
142
+ <div class="container">
143
+ <div class="footer-content">
144
+ <div class="footer-logo">
145
+ <div class="logo">UNITY FLEET</div>
146
+ <p>Revolutionizing electric vehicle infrastructure across Illinois</p>
147
+ </div>
148
+
149
+ <div class="footer-links">
150
+ <div class="link-column">
151
+ <h4>Navigation</h4>
152
+ <a href="../index.html#what-is-the-link">What is The Link</a>
153
+ <a href="../index.html#subscription-tiers">Subscription Tiers</a>
154
+ <a href="../index.html#impact-equity">Impact & Equity</a>
155
+ <a href="../index.html#tokenization">ChainLink Tokenization</a>
156
+ <a href="../index.html#rural-plan">Rural Revitalization</a>
157
+ <a href="../index.html#mvp-showcase">MVP Showcase</a>
158
+ </div>
159
+
160
+ <div class="link-column">
161
+ <h4>Contact</h4>
162
+ <a href="mailto:[email protected]">[email protected]</a>
163
+ <a href="tel:+12175551234">+1 (217) 555-1234</a>
164
+ <p>2457 E Eldorado St<br>Decatur, IL 62521</p>
165
+ </div>
166
+
167
+ <div class="link-column">
168
+ <h4>Legal</h4>
169
+ <a href="#">Privacy Policy</a>
170
+ <a href="#">Terms of Service</a>
171
+ <a href="#">Accessibility</a>
172
+ </div>
173
+ </div>
174
+
175
+ <div class="footer-social">
176
+ <a href="#" class="social-icon"><i class="fab fa-twitter"></i></a>
177
+ <a href="#" class="social-icon"><i class="fab fa-linkedin"></i></a>
178
+ <a href="#" class="social-icon"><i class="fab fa-facebook"></i></a>
179
+ <a href="#" class="social-icon"><i class="fab fa-instagram"></i></a>
180
+ </div>
181
+ </div>
182
+
183
+ <div class="footer-bottom">
184
+ <p>&copy; 2025 Unity Fleet LLC. All rights reserved.</p>
185
+ </div>
186
+ </div>
187
+ </footer>
188
+
189
+ <script>
190
+ // Mobile navigation toggle
191
+ document.querySelector('.mobile-nav-toggle').addEventListener('click', function() {
192
+ document.querySelector('.nav-links').classList.toggle('active');
193
+ this.innerHTML = document.querySelector('.nav-links').classList.contains('active')
194
+ ? '<i class="fas fa-times"></i>'
195
+ : '<i class="fas fa-bars"></i>';
196
+ });
197
+
198
+ // Component loading logic will be added here
199
+ document.addEventListener('DOMContentLoaded', function() {
200
+ // This will be customized for each component
201
+ console.log('Component page loaded');
202
+ });
203
+ </script>
204
+ </body>
205
+ </html>
todo.md ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Unity Fleet MVP Development Todo List
2
+
3
+ ## Overview
4
+ This todo list outlines the remaining tasks needed to complete the Unity Fleet MVP components and website based on the analysis of existing files and requirements.
5
+
6
+ ## MVP Components Development
7
+
8
+ ### 1. Mobile Application for Vehicle Reservations [PARTIALLY IMPLEMENTED]
9
+ - [x] Create basic UI structure (MobileApp.jsx and MobileApp.css exist)
10
+ - [ ] Implement user registration and authentication flows
11
+ - [ ] Build vehicle browsing and filtering functionality
12
+ - [ ] Develop reservation system with calendar integration
13
+ - [ ] Create payment simulation interface
14
+ - [ ] Implement vehicle status tracking
15
+ - [ ] Add trip planning with charging stops feature
16
+ - [ ] Enhance UI with animations and transitions
17
+ - [ ] Test all functionality and user flows
18
+
19
+ ### 2. Charging Hub Interface [PARTIALLY IMPLEMENTED]
20
+ - [x] Create basic UI structure (ChargingHub.jsx and ChargingHub.css exist)
21
+ - [x] Fix ChargingHub.css file (replaced React component with proper CSS)
22
+ - [ ] Implement charging station status and availability display
23
+ - [ ] Build user authentication for charging access
24
+ - [ ] Create payment processing simulation
25
+ - [ ] Develop energy usage tracking visualization
26
+ - [ ] Add lounge services information section
27
+ - [ ] Enhance UI with animations and transitions
28
+ - [ ] Test all functionality and user flows
29
+
30
+ ### 3. Energy Simulation [IMPLEMENTED]
31
+ - [x] Create basic UI structure (EnergySimulation.jsx and EnergySimulation.css)
32
+ - [x] Implement solar generation simulation
33
+ - [x] Build battery storage management interface
34
+ - [x] Develop grid interaction modeling
35
+ - [x] Create energy flow visualization
36
+ - [x] Implement optimization algorithms demonstration
37
+ - [x] Add interactive controls for simulation parameters
38
+ - [ ] Test all functionality and user flows
39
+
40
+ ### 4. Deployment Map [IMPLEMENTED]
41
+ - [x] Create basic UI structure (DeploymentMap.jsx and DeploymentMap.css)
42
+ - [x] Implement interactive map of Illinois
43
+ - [x] Add planned charging hub locations
44
+ - [x] Create phased deployment visualization
45
+ - [x] Implement demographic data overlay
46
+ - [x] Add EV adoption projection layer
47
+ - [x] Create interactive filters and controls
48
+ - [ ] Test all functionality and user flows
49
+
50
+ ### 5. Subscription Portal [IMPLEMENTED]
51
+ - [x] Create basic UI structure (SubscriptionPortal.jsx and SubscriptionPortal.css)
52
+ - [x] Implement subscription tier display and comparison
53
+ - [x] Build subscription management interface
54
+ - [x] Create billing simulation
55
+ - [x] Develop usage tracking visualization
56
+ - [x] Add upgrade/downgrade pathways
57
+ - [x] Implement customer analytics dashboard
58
+ - [ ] Test all functionality and user flows
59
+
60
+ ### 6. ChainLink Tokenization Demo [IMPLEMENTED]
61
+ - [x] Create basic UI structure (ChainlinkDemo.jsx and ChainlinkDemo.css)
62
+ - [x] Implement token allocation visualization
63
+ - [x] Build asset ownership representation
64
+ - [x] Create value tracking simulation
65
+ - [x] Develop transaction demonstration
66
+ - [x] Add stakeholder dashboard
67
+ - [x] Implement interactive token flow visualization
68
+ - [ ] Test all functionality and user flows
69
+
70
+ ## Website Enhancement
71
+
72
+ ### 1. Website Structure and Navigation [IN PROGRESS]
73
+ - [x] Review existing website structure
74
+ - [x] Enhance navigation to include all MVP components
75
+ - [x] Create consistent header and footer across all pages
76
+ - [ ] Implement responsive design for all screen sizes
77
+ - [ ] Add smooth transitions between sections
78
+
79
+ ### 2. Visual Design Improvements
80
+ - [ ] Update color scheme to match Atlas Universe palette
81
+ - [ ] Implement glassmorphic panels with frosted transparency
82
+ - [ ] Add metallic gradients for buttons and borders
83
+ - [ ] Create animated section transitions
84
+ - [ ] Implement hover effects for interactive elements
85
+
86
+ ### 3. Content Enhancement
87
+ - [ ] Update "What is The Link?" section with latest information
88
+ - [ ] Create detailed Unity Fleet Subscription Tiers section
89
+ - [ ] Develop Impact & Equity section
90
+ - [ ] Build ChainLink Tokenization explanation with animated diagrams
91
+ - [ ] Add Rural Revitalization Plan section
92
+
93
+ ### 4. Integration of MVP Components
94
+ - [x] Create dedicated showcase pages for each MVP component
95
+ - [ ] Implement interactive demos embedded in website
96
+ - [ ] Add screenshots and videos of MVP components in action
97
+ - [ ] Create links between related components
98
+ - [ ] Ensure consistent styling between website and MVP components
99
+
100
+ ### 5. Performance and Deployment
101
+ - [ ] Optimize website performance
102
+ - [ ] Minify CSS and JavaScript
103
+ - [ ] Optimize images for web
104
+ - [ ] Test website on multiple devices and browsers
105
+ - [ ] Deploy updated website to production
106
+
107
+ ## Project Management
108
+
109
+ ### 1. Documentation
110
+ - [ ] Update technical architecture documentation
111
+ - [ ] Create user guides for MVP components
112
+ - [ ] Document API specifications and data models
113
+ - [ ] Create presentation materials for stakeholders
114
+
115
+ ### 2. Testing
116
+ - [ ] Develop test cases for all MVP components
117
+ - [ ] Perform usability testing
118
+ - [ ] Conduct cross-browser compatibility testing
119
+ - [ ] Test responsive design on various devices
120
+
121
+ ### 3. Final Delivery
122
+ - [ ] Package all source code
123
+ - [ ] Create demonstration videos
124
+ - [ ] Prepare final presentation
125
+ - [ ] Deploy all components to production
126
+ - [ ] Provide access instructions to stakeholders
unity_fleet_complete_proposal.md ADDED
@@ -0,0 +1,1024 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Unity Fleet Grant Proposal
2
+ ## Illinois Department of Transportation Statewide Planning and Research Funds
3
+
4
+ **Applicant:** Unity Fleet LLC
5
+ **EIN:** 33-2583301
6
+ **Contact:** Matthew T. Lamb, Sole Member
7
+ **Address:** 2457 E Eldorado St, Decatur, IL 62521
8
+ **Submission Date:** April 30, 2025
9
+
10
+ ## Table of Contents
11
+
12
+ 1. Executive Summary
13
+ 2. Project Description
14
+ - 2.1 Organization Background
15
+ - 2.2 Project Overview: "The Link" EV Charging Network
16
+ - 2.3 Fleet Services Component
17
+ 3. Alignment with Illinois Initiatives
18
+ - 3.1 Climate Action Plan Support
19
+ - 3.2 Transportation Innovation
20
+ - 3.3 Electric Vehicle Infrastructure Expansion
21
+ - 3.4 Economic Development
22
+ - 3.5 Equity and Accessibility
23
+ 4. Implementation Plan
24
+ - 4.1 Project Phases
25
+ - 4.2 Timeline
26
+ - 4.3 Site Selection Criteria
27
+ - 4.4 Technology Implementation
28
+ 5. Budget and Financial Plan
29
+ - 5.1 Project Budget
30
+ - 5.2 Funding Sources
31
+ - 5.3 Financial Sustainability
32
+ 6. Performance Metrics and Evaluation
33
+ - 6.1 Key Performance Indicators
34
+ - 6.2 Evaluation Methodology
35
+ - 6.3 Long-term Impact Assessment
36
+ 7. Partnerships and Stakeholder Engagement
37
+ - 7.1 Current Partners
38
+ - 7.2 Stakeholder Engagement Plan
39
+ - 7.3 Letters of Support
40
+ 8. Conclusion
41
+ # Executive Summary
42
+
43
+ Unity Fleet LLC is pleased to submit this proposal for the Illinois Department of Transportation's Statewide Planning and Research Funds grant to support the development of "The Link" - an innovative electric vehicle (EV) charging network that will transform transportation infrastructure across Illinois. As a recently established Illinois-based company (EIN: 33-2583301), Unity Fleet is positioned to advance the state's climate action goals while creating economic opportunities and enhancing mobility options for all residents.
44
+
45
+ "The Link" represents a revolutionary approach to EV charging infrastructure, featuring modern, solar-powered charging hubs that combine fast-charging capabilities with amenity-rich environments. Each hub will accommodate multiple vehicles simultaneously, offering both passenger and commercial vehicle charging options. The distinctive circular design with an elevated lounge area creates a welcoming environment that transforms the charging experience from a utilitarian necessity to a comfortable, productive interlude.
46
+
47
+ This project directly supports Illinois' commitment to the Paris Agreement's greenhouse gas reduction targets by accelerating EV adoption through expanded charging access. It complements the state's existing transportation innovation initiatives, including the University of Illinois Autonomous and Connected Track (I-ACT), while addressing critical gaps in the current charging infrastructure network.
48
+
49
+ The $3.2 million in requested funding will enable Unity Fleet to implement the first phase of "The Link" network, establishing five strategically located charging hubs across Illinois. These initial sites will serve as proof-of-concept for our innovative approach, demonstrating the viability of combining EV charging with solar power generation and amenity-rich environments. Unity Fleet will provide the required matching funds through a combination of private investment and existing capital resources.
50
+
51
+ Beyond the immediate environmental benefits of increased EV adoption, this project will generate significant economic impact through job creation during construction and ongoing operations. Our Community Access Program will ensure equitable access to clean transportation options for underserved populations, while our fleet services component will provide flexible mobility solutions for businesses and individuals.
52
+
53
+ Unity Fleet's leadership team brings extensive experience in electric vehicle technology, renewable energy infrastructure, and transportation management. We are committed to advancing Illinois' position as a leader in sustainable transportation and clean energy innovation. "The Link" charging network represents a critical step toward a cleaner, more accessible transportation future for all Illinois residents.
54
+
55
+ We look forward to the opportunity to partner with the Illinois Department of Transportation on this transformative initiative.
56
+ # Project Description
57
+
58
+ ## 2.1 Organization Background
59
+
60
+ Unity Fleet LLC is a newly established Illinois-based company dedicated to revolutionizing electric vehicle (EV) infrastructure and transportation services. Founded in December 2024 (EIN: 33-2583301), Unity Fleet emerged from a vision to accelerate the adoption of clean transportation by addressing the critical barriers of charging infrastructure availability and accessibility.
61
+
62
+ Our mission is to create a comprehensive ecosystem that supports the transition to electric mobility through innovative charging solutions, flexible fleet services, and technology integration. Unity Fleet represents the convergence of transportation expertise, renewable energy innovation, and digital technology, creating a unique approach to sustainable mobility that aligns perfectly with Illinois' climate and transportation goals.
63
+
64
+ The company's leadership team brings extensive experience in electric vehicle technology, renewable energy infrastructure, transportation management, and software development. This multidisciplinary expertise positions Unity Fleet to address the complex challenges of transportation electrification from multiple angles, ensuring a holistic approach that considers infrastructure needs, user experience, technological integration, and economic sustainability.
65
+
66
+ Since our establishment, Unity Fleet has focused on developing our flagship concept, "The Link" charging network, while building strategic partnerships with technology providers, local businesses, and community organizations. Our preliminary market research and concept development have generated significant interest from potential users, investors, and municipal partners, validating the demand for our innovative approach to EV charging and mobility services.
67
+
68
+ ## 2.2 Project Overview: "The Link" EV Charging Network
69
+
70
+ "The Link" represents a revolutionary approach to EV charging infrastructure, reimagining charging stations as destination hubs that combine fast-charging capabilities with amenity-rich environments. The distinctive circular design features a covered lower level with multiple charging ports surrounding a central core, topped by an elevated lounge area that offers refreshments, comfortable seating, and productivity amenities.
71
+
72
+ Each hub in "The Link" network will feature:
73
+
74
+ **Innovative Design and Infrastructure:**
75
+ - Architecturally distinctive circular structure with covered charging area
76
+ - Elevated lounge with panoramic views and natural lighting
77
+ - Weather protection for year-round comfort in Illinois' variable climate
78
+ - Landscaped surroundings that enhance visual appeal and environmental benefits
79
+
80
+ **Advanced Charging Technology:**
81
+ - Multiple Direct Current Fast Charging (DCFC) ports with 150kW capability
82
+ - Combined Charging System (CCS) compatibility for most EV models
83
+ - Megawatt Charging System (MCS) readiness for future heavy-duty vehicle support
84
+ - Smart charging management system for load balancing and grid optimization
85
+
86
+ **Solar Power Integration:**
87
+ - Rooftop solar array generating clean energy for charging operations
88
+ - Battery storage systems to optimize solar utilization and grid management
89
+ - Net metering capabilities to maximize renewable energy benefits
90
+ - Resilient design allowing continued operation during grid disruptions
91
+
92
+ **User Experience Enhancements:**
93
+ - Comfortable lounge seating with power outlets and Wi-Fi connectivity
94
+ - Refreshment options ranging from vending services to café partnerships
95
+ - Digital displays showing charging status, wait times, and local information
96
+ - Mobile app integration for reservations, payments, and status monitoring
97
+
98
+ **Accessibility Features:**
99
+ - ADA-compliant design throughout all areas
100
+ - Multiple payment options including credit card, mobile app, and subscription plans
101
+ - Clear wayfinding and instructional elements for new EV users
102
+ - 24/7 customer support through digital and phone channels
103
+
104
+ The innovative design of "The Link" transforms the charging experience from a utilitarian necessity to a comfortable, productive interlude. By addressing the psychological barriers to EV adoption related to charging anxiety and inconvenience, "The Link" will accelerate the transition to electric mobility while creating distinctive landmarks that symbolize Illinois' commitment to transportation innovation.
105
+
106
+ ## 2.3 Fleet Services Component
107
+
108
+ Complementing "The Link" charging infrastructure, Unity Fleet will develop a comprehensive suite of fleet services that expand access to electric mobility through flexible usage models. These services leverage the charging network while creating additional value streams that enhance the project's economic sustainability.
109
+
110
+ **Electric Vehicle Fleet Management:**
111
+ Unity Fleet will establish and manage a growing fleet of electric vehicles, beginning with passenger cars and expanding to include light commercial vehicles. This fleet will be maintained to the highest standards of safety and performance, utilizing predictive maintenance algorithms to optimize vehicle availability and longevity.
112
+
113
+ **Subscription and Access Models:**
114
+ - **Take-Home Subscriptions:** Customers gain exclusive access to a dedicated EV with various tiers offering different mileage allowances and included services (insurance, maintenance, charging).
115
+ - **FlexRide Subscriptions:** Users can access shared EVs on a regular basis, balancing affordability and convenience.
116
+ - **Daily & Monthly All-Access Passes:** Unlimited rides within designated areas for a flat fee, catering to users who want to eliminate personal vehicle reliance.
117
+ - **Enhanced Commuter Pass:** Structured rides for professionals and students with predictable daily schedules, offering a cost-effective solution for daily commutes.
118
+
119
+ **Corporate Shuttle and Community Programs:**
120
+ - **Corporate Shuttle Services:** Customized transportation solutions for businesses and municipalities, including employee shuttles and campus transportation.
121
+ - **Community Access Program (CAP):** Discounted transportation options for low-income individuals, promoting equitable access to sustainable mobility.
122
+ - **Paratransit Services:** Specialized transportation options for individuals with disabilities, enhancing mobility for all community members.
123
+
124
+ **Technology Integration and AI Optimization:**
125
+ Unity Fleet will leverage advanced technology to optimize fleet operations and enhance user experience:
126
+ - AI-powered routing and dispatch systems to maximize efficiency
127
+ - Predictive maintenance algorithms to reduce vehicle downtime
128
+ - User behavior analysis to optimize vehicle distribution and availability
129
+ - Energy management systems to coordinate charging with renewable generation
130
+ - Mobile app providing seamless access to all services
131
+
132
+ The fleet services component creates a virtuous cycle with "The Link" charging infrastructure: the charging network supports fleet operations, while the fleet services drive consistent utilization of the charging facilities. This integrated approach maximizes the impact of the investment while creating multiple pathways to accelerate EV adoption across different user segments.
133
+
134
+ Together, "The Link" charging network and Unity Fleet's service offerings represent a comprehensive approach to transportation electrification that addresses infrastructure needs, expands access to electric mobility, and creates sustainable economic models that will support long-term growth and impact.
135
+ # Alignment with Illinois Initiatives
136
+
137
+ ## 3.1 Climate Action Plan Support
138
+
139
+ "The Link" EV charging network and Unity Fleet services directly support Illinois' Priority Climate Action Plan and the state's commitment to the Paris Agreement's greenhouse gas reduction targets. Transportation represents a significant portion of Illinois' greenhouse gas emissions, and accelerating the transition to electric vehicles is a critical strategy for achieving the state's climate goals.
140
+
141
+ **Greenhouse Gas Emissions Reduction:**
142
+ The project will contribute to emissions reduction through multiple pathways:
143
+
144
+ - **Direct Displacement of Internal Combustion Vehicles:** Each EV that replaces a conventional vehicle reduces CO2 emissions by approximately 3-4 metric tons annually. By expanding charging infrastructure and fleet access, Unity Fleet will accelerate this transition.
145
+
146
+ - **Emissions-Free Charging:** Unlike many charging stations that rely entirely on grid electricity (which may include fossil fuel sources), "The Link" hubs incorporate solar generation and battery storage, providing truly emissions-free charging when possible.
147
+
148
+ - **Fleet Efficiency Optimization:** Unity Fleet's AI-powered routing and dispatch systems will minimize unnecessary vehicle miles traveled, further reducing emissions compared to conventional transportation models.
149
+
150
+ - **Reduced "Range Anxiety":** By establishing a reliable, convenient charging network, "The Link" addresses one of the primary psychological barriers to EV adoption, accelerating the transition away from fossil fuel vehicles.
151
+
152
+ **Clean Energy Integration:**
153
+ The Illinois Climate Action Plan emphasizes the importance of renewable energy integration across sectors. "The Link" charging hubs exemplify this integration through:
154
+
155
+ - **On-site Solar Generation:** Each hub will feature rooftop solar arrays sized to maximize renewable energy production while maintaining architectural integrity.
156
+
157
+ - **Battery Storage Systems:** Integrated battery storage will capture excess solar generation for use during peak demand periods or when solar production is limited.
158
+
159
+ - **Grid Optimization:** Smart charging management systems will coordinate with utility demand response programs, helping to stabilize the grid and maximize renewable energy utilization.
160
+
161
+ - **Resilience Benefits:** The combination of solar generation and battery storage creates charging locations that can continue operating during grid disruptions, enhancing community resilience.
162
+
163
+ **Paris Agreement Alignment:**
164
+ Illinois has committed to the principles of the Paris Agreement, which calls for substantial greenhouse gas reductions to limit global warming. Unity Fleet's project supports this commitment by:
165
+
166
+ - Accelerating the transition to zero-emission vehicles
167
+ - Demonstrating innovative models for clean transportation infrastructure
168
+ - Creating replicable approaches that can be scaled across the state
169
+ - Integrating renewable energy with transportation electrification
170
+
171
+ ## 3.2 Transportation Innovation
172
+
173
+ Illinois has positioned itself as a leader in transportation innovation through initiatives like the University of Illinois Autonomous and Connected Track (I-ACT). Unity Fleet's project complements and extends these efforts by:
174
+
175
+ **Advancing Illinois' Leadership in Transportation Technology:**
176
+ - Implementing cutting-edge charging technology that anticipates future needs, including Megawatt Charging System (MCS) readiness for heavy-duty vehicles
177
+ - Integrating AI-powered fleet management systems that optimize vehicle utilization and energy consumption
178
+ - Developing smart infrastructure that communicates with vehicles to enhance charging efficiency
179
+ - Creating a platform for testing and demonstrating new mobility technologies in real-world applications
180
+
181
+ **Complementing Research Initiatives:**
182
+ "The Link" charging network will create synergies with existing transportation research efforts:
183
+
184
+ - **University of Illinois I-ACT:** Unity Fleet will explore partnership opportunities with I-ACT to provide charging infrastructure for autonomous vehicle testing and to share data on charging patterns and fleet operations.
185
+
186
+ - **Electrification Research:** The project will generate valuable data on charging behavior, energy consumption patterns, and infrastructure utilization that can inform academic and industry research.
187
+
188
+ - **User Experience Studies:** "The Link" hubs will provide real-world environments for studying how users interact with EV charging infrastructure, generating insights that can improve future designs.
189
+
190
+ **Supporting New Mobility Models:**
191
+ Unity Fleet's service offerings demonstrate innovative approaches to mobility that move beyond traditional vehicle ownership:
192
+
193
+ - Subscription-based access models that reduce barriers to EV adoption
194
+ - Shared mobility solutions that maximize vehicle utilization
195
+ - Corporate shuttle services that reduce single-occupancy vehicle trips
196
+ - Community access programs that expand transportation equity
197
+
198
+ These new mobility models align with Illinois' interest in developing more efficient, sustainable transportation systems that reduce congestion, emissions, and infrastructure strain.
199
+
200
+ ## 3.3 Electric Vehicle Infrastructure Expansion
201
+
202
+ Illinois has made significant investments in EV charging infrastructure through programs like the National Electric Vehicle Infrastructure (NEVI) formula funding and state initiatives under the Climate and Equitable Jobs Act (CEJA). Unity Fleet's project will complement and enhance these efforts through:
203
+
204
+ **Strategic Network Development:**
205
+ "The Link" charging hubs will be strategically located to:
206
+
207
+ - Fill gaps in the existing charging network, particularly in areas underserved by current infrastructure
208
+ - Create connections between interstate corridors and urban centers
209
+ - Support both passenger and commercial vehicle charging needs
210
+ - Establish visible landmarks that raise awareness of EV infrastructure
211
+
212
+ **Enhanced Charging Experience:**
213
+ While many existing and planned charging stations focus solely on the technical aspects of power delivery, "The Link" hubs elevate the charging experience through:
214
+
215
+ - Comfortable, weather-protected environments that make charging convenient in all seasons
216
+ - Amenities that transform charging time from a burden to a productive or enjoyable break
217
+ - Architectural design that creates distinctive, recognizable landmarks
218
+ - User-friendly interfaces and support services that welcome new EV adopters
219
+
220
+ **Charging Technology Advancement:**
221
+ "The Link" will implement advanced charging technologies that push the boundaries of current infrastructure:
222
+
223
+ - High-power charging capabilities that minimize wait times
224
+ - Multiple connector types to accommodate various vehicle models
225
+ - Smart charging systems that optimize energy use and grid impact
226
+ - Future-ready design that can adapt to evolving charging standards
227
+
228
+ **Public-Private Partnership Model:**
229
+ Unity Fleet's approach demonstrates an innovative public-private partnership model for infrastructure development that:
230
+
231
+ - Leverages private investment alongside public funding
232
+ - Creates economically sustainable operations through diversified revenue streams
233
+ - Establishes replicable models that can accelerate infrastructure deployment
234
+ - Reduces public sector implementation burden while maintaining public benefits
235
+
236
+ ## 3.4 Economic Development
237
+
238
+ The Unity Fleet project will generate significant economic benefits for Illinois, supporting the state's goals for job creation, business development, and economic resilience.
239
+
240
+ **Job Creation:**
241
+ The project will create jobs across multiple phases and skill levels:
242
+
243
+ - **Construction Phase:** Each hub will require architectural, engineering, electrical, and general construction services, creating temporary employment during development.
244
+
245
+ - **Operational Phase:** Ongoing operations will create permanent positions in facility management, customer service, vehicle maintenance, and technology support.
246
+
247
+ - **Corporate Functions:** As Unity Fleet expands, additional jobs will be created in administration, marketing, finance, and technology development.
248
+
249
+ - **Indirect Employment:** The project will support jobs in the supply chain, including equipment manufacturers, software developers, and service providers.
250
+
251
+ **Supply Chain Opportunities:**
252
+ Unity Fleet will prioritize Illinois-based suppliers and contractors whenever possible, creating opportunities for local businesses in:
253
+
254
+ - Construction and electrical services
255
+ - Charging equipment installation and maintenance
256
+ - Solar panel and battery system deployment
257
+ - Facility maintenance and management
258
+ - Vehicle acquisition and servicing
259
+ - Software and technology development
260
+
261
+ **Workforce Development:**
262
+ The project will contribute to workforce development in emerging clean energy and transportation sectors:
263
+
264
+ - Creating opportunities for training and certification in EV charging infrastructure
265
+ - Developing skills in renewable energy integration and smart grid technologies
266
+ - Building expertise in electric vehicle fleet management and maintenance
267
+ - Advancing capabilities in transportation technology and data analytics
268
+
269
+ **Tourism and Visitor Attraction:**
270
+ The distinctive design of "The Link" hubs will create landmarks that enhance Illinois' image as an innovation leader:
271
+
272
+ - Attracting EV travelers who might otherwise bypass the state
273
+ - Creating Instagram-worthy destinations that generate positive visibility
274
+ - Demonstrating Illinois' commitment to sustainable transportation
275
+ - Supporting tourism-related businesses located near charging hubs
276
+
277
+ ## 3.5 Equity and Accessibility
278
+
279
+ Unity Fleet is committed to ensuring that the benefits of transportation electrification are accessible to all Illinois residents, regardless of income, location, or ability. This commitment aligns with Illinois' focus on equity in climate initiatives, particularly the emphasis on Low Income/Disadvantaged Communities (LIDACs) in the Climate and Equitable Jobs Act.
280
+
281
+ **Community Access Program:**
282
+ Unity Fleet's Community Access Program (CAP) will provide discounted transportation options for low-income individuals through:
283
+
284
+ - Reduced rates for subscription services
285
+ - Partnerships with social service organizations to distribute access
286
+ - Targeted outreach to underserved communities
287
+ - Simplified payment options that don't require credit cards or smartphones
288
+
289
+ **Equitable Location Planning:**
290
+ The siting strategy for "The Link" charging hubs will prioritize equitable access by:
291
+
292
+ - Including locations in or adjacent to Equity Investment Eligible Communities
293
+ - Ensuring geographic distribution across diverse neighborhoods
294
+ - Considering public transportation connections to maximize accessibility
295
+ - Balancing commercial viability with community service objectives
296
+
297
+ **Inclusive Design:**
298
+ All aspects of "The Link" charging hubs and Unity Fleet services will be designed for inclusive access:
299
+
300
+ - ADA-compliant physical infrastructure exceeding minimum requirements
301
+ - Multiple language options in all user interfaces and support services
302
+ - Clear, intuitive design that accommodates various literacy levels
303
+ - Alternative access methods for those without smartphones or internet access
304
+
305
+ **Community Engagement:**
306
+ Unity Fleet will implement robust community engagement processes to ensure that implementation reflects community needs:
307
+
308
+ - Advisory committees including representatives from diverse communities
309
+ - Regular feedback mechanisms for service users and community members
310
+ - Partnerships with community-based organizations
311
+ - Transparent reporting on equity metrics and outcomes
312
+
313
+ Through these strategies, Unity Fleet will ensure that "The Link" charging network and fleet services advance transportation equity while supporting Illinois' climate and economic goals. By making electric mobility accessible to all residents, the project will maximize its environmental benefits while creating economic opportunities across diverse communities.
314
+ # Implementation Plan
315
+
316
+ ## 4.1 Project Phases
317
+
318
+ Unity Fleet will implement "The Link" EV charging network through a strategic, phased approach that ensures careful planning, quality execution, and continuous improvement based on operational feedback. The implementation will proceed through the following phases:
319
+
320
+ ### Phase 1: Planning and Site Selection (Months 1-3)
321
+ - **Comprehensive Market Analysis:** Detailed assessment of current EV charging infrastructure, identifying gaps and high-demand areas
322
+ - **Site Selection Process:** Evaluation of potential locations based on traffic patterns, grid capacity, land availability, and equity considerations
323
+ - **Stakeholder Engagement:** Consultation with local governments, utilities, community organizations, and potential users
324
+ - **Preliminary Design Development:** Refinement of architectural and engineering concepts for "The Link" charging hubs
325
+ - **Regulatory Assessment:** Identification of permitting requirements, utility interconnection processes, and compliance considerations
326
+ - **Partnership Development:** Establishment of relationships with technology providers, contractors, and service partners
327
+
328
+ ### Phase 2: Design and Permitting (Months 4-6)
329
+ - **Detailed Site Engineering:** Complete site-specific engineering for each selected location
330
+ - **Architectural Finalization:** Development of construction-ready architectural plans
331
+ - **Electrical System Design:** Detailed planning for electrical infrastructure, including utility connections and solar integration
332
+ - **Permitting Process:** Submission and management of all required permits and approvals
333
+ - **Utility Coordination:** Establishment of interconnection agreements and service plans
334
+ - **Procurement Planning:** Finalization of equipment specifications and vendor selection
335
+ - **Construction Bidding:** Competitive selection of construction contractors
336
+
337
+ ### Phase 3: Construction and Equipment Installation (Months 7-12)
338
+ - **Site Preparation:** Grading, foundation work, and utility connections
339
+ - **Structural Construction:** Building of the physical hub structures
340
+ - **Electrical Infrastructure:** Installation of power distribution systems and charging equipment
341
+ - **Solar and Battery Systems:** Deployment of solar arrays and energy storage solutions
342
+ - **Interior Buildout:** Completion of lounge areas and amenity spaces
343
+ - **Landscaping and Exterior Finishes:** Implementation of sustainable landscaping and final exterior elements
344
+ - **Quality Assurance:** Comprehensive testing and inspection of all systems
345
+
346
+ ### Phase 4: Technology Integration and Testing (Months 10-14)
347
+ - **Charging System Commissioning:** Testing and optimization of all charging equipment
348
+ - **Energy Management System Implementation:** Deployment of software for solar, battery, and grid integration
349
+ - **Fleet Management Platform Development:** Finalization and testing of fleet operations software
350
+ - **Mobile App Deployment:** Launch of user-facing mobile application for reservations and payments
351
+ - **System Integration:** Ensuring seamless operation of all technological components
352
+ - **Staff Training:** Comprehensive training for all operational personnel
353
+ - **Soft Launch Testing:** Limited public access to identify and address operational issues
354
+
355
+ ### Phase 5: Launch and Operations (Months 15+)
356
+ - **Grand Opening Events:** Public launch celebrations at each hub location
357
+ - **Marketing Campaign:** Comprehensive outreach to build awareness and drive adoption
358
+ - **Fleet Deployment:** Phased introduction of electric vehicles for subscription and service programs
359
+ - **Operational Optimization:** Continuous improvement based on usage data and customer feedback
360
+ - **Community Program Implementation:** Rollout of Community Access Program and other equity initiatives
361
+ - **Performance Monitoring:** Tracking of key metrics against targets
362
+ - **Expansion Planning:** Evaluation of opportunities for additional hub locations
363
+
364
+ ## 4.2 Timeline
365
+
366
+ The implementation timeline spans approximately 15 months from funding approval to full operational status, with ongoing operations and potential expansion following the initial launch.
367
+
368
+ | Milestone | Timeline | Key Activities |
369
+ |-----------|----------|----------------|
370
+ | Project Initiation | Month 1 | Team assembly, kickoff meetings, detailed planning |
371
+ | Site Selection Finalized | Month 3 | Completion of site evaluations and securing of locations |
372
+ | Design Completion | Month 6 | Finalization of all architectural and engineering plans |
373
+ | Construction Start | Month 7 | Groundbreaking at first hub location |
374
+ | First Hub Completion | Month 10 | Structural completion of first "The Link" charging hub |
375
+ | Technology Integration Complete | Month 12 | All systems operational and integrated |
376
+ | Staff Training Complete | Month 13 | Operational team fully trained and ready |
377
+ | Soft Launch | Month 14 | Limited public access for testing and refinement |
378
+ | Grand Opening | Month 15 | Full public launch of "The Link" network |
379
+ | Fleet Services Launch | Month 16 | Introduction of subscription and service programs |
380
+ | First Performance Review | Month 18 | Comprehensive assessment of operations and impact |
381
+ | Expansion Planning | Month 24 | Evaluation for potential network growth |
382
+
383
+ **Critical Path Elements:**
384
+ - Utility coordination and interconnection agreements
385
+ - Permitting approvals from local jurisdictions
386
+ - Equipment procurement, particularly for specialized charging hardware
387
+ - Weather considerations for construction scheduling
388
+ - Software development and integration timelines
389
+
390
+ **Contingency Planning:**
391
+ Unity Fleet has incorporated several contingency measures to address potential implementation challenges:
392
+ - 15% time buffer built into all construction timelines
393
+ - Alternative site options identified in case primary locations face unexpected obstacles
394
+ - Flexible equipment sourcing strategy with multiple vendor relationships
395
+ - Modular design approach allowing for phased construction if necessary
396
+ - Scalable technology architecture that can adapt to changing requirements
397
+
398
+ ## 4.3 Site Selection Criteria
399
+
400
+ The success of "The Link" charging network depends significantly on strategic site selection. Unity Fleet will employ a comprehensive evaluation framework that balances multiple factors:
401
+
402
+ **Geographic Distribution Strategy:**
403
+ - Initial focus on five strategic locations across Illinois
404
+ - Balance between urban centers, suburban areas, and key transportation corridors
405
+ - Consideration of existing charging infrastructure to avoid redundancy
406
+ - Potential for future expansion and network development
407
+
408
+ **Traffic Pattern Analysis:**
409
+ - Proximity to major highways and thoroughfares
410
+ - Traffic volume and composition (passenger vs. commercial)
411
+ - Dwell time patterns at nearby amenities
412
+ - Seasonal variations in traffic flow
413
+ - Visibility from primary roadways
414
+
415
+ **Grid Capacity Considerations:**
416
+ - Existing electrical infrastructure capacity
417
+ - Proximity to substations or distribution lines
418
+ - Utility upgrade requirements and timelines
419
+ - Potential for renewable energy integration
420
+ - Grid reliability and redundancy options
421
+
422
+ **Land Availability and Characteristics:**
423
+ - Sufficient space for hub structure and vehicle circulation
424
+ - Appropriate zoning and land use designations
425
+ - Environmental considerations and site conditions
426
+ - Ownership structure and acquisition feasibility
427
+ - Future development plans for surrounding areas
428
+
429
+ **Community Impact Assessment:**
430
+ - Proximity to underserved communities
431
+ - Accessibility via multiple transportation modes
432
+ - Potential for local economic benefits
433
+ - Community receptiveness and support
434
+ - Alignment with local development goals
435
+
436
+ **Operational Viability:**
437
+ - Security considerations and lighting
438
+ - Proximity to amenities and services
439
+ - All-weather accessibility
440
+ - Potential for 24/7 operations
441
+ - Maintenance and servicing logistics
442
+
443
+ Each potential site will be scored against these criteria using a weighted evaluation matrix, with final selections made based on both quantitative assessment and qualitative factors such as strategic importance and partnership opportunities.
444
+
445
+ ## 4.4 Technology Implementation
446
+
447
+ Unity Fleet will implement a comprehensive technology ecosystem that integrates charging infrastructure, renewable energy systems, fleet management, and user interfaces:
448
+
449
+ **Charging Equipment Specifications:**
450
+ - **DC Fast Chargers:** Multiple 150kW chargers with CCS connectors
451
+ - **Future-Ready Design:** Infrastructure capable of supporting Megawatt Charging System (MCS) for heavy-duty vehicles
452
+ - **Smart Charging Features:** Load management, user authentication, and remote monitoring
453
+ - **Reliability Measures:** Redundant systems, robust design for Illinois weather conditions
454
+ - **Accessibility Features:** User-friendly interfaces, multiple payment options, clear instructions
455
+
456
+ **Solar Integration Methodology:**
457
+ - **Rooftop Arrays:** High-efficiency photovoltaic panels integrated into hub architecture
458
+ - **Production Capacity:** Sized to optimize on-site generation while maintaining aesthetic design
459
+ - **Grid Connection:** Bidirectional capability for energy export when production exceeds demand
460
+ - **Monitoring Systems:** Real-time production tracking and performance analytics
461
+ - **Seasonal Optimization:** Panel positioning and system design optimized for Illinois' solar conditions
462
+
463
+ **Battery Storage Systems:**
464
+ - **Capacity Sizing:** Balanced to support charging during peak demand and store excess solar generation
465
+ - **Chemistry Selection:** Lithium iron phosphate (LFP) or similar technology balancing safety, longevity, and performance
466
+ - **Thermal Management:** Systems designed for Illinois' temperature range
467
+ - **Control Systems:** Advanced battery management for optimal cycling and longevity
468
+ - **Grid Services Capability:** Potential for participation in utility demand response programs
469
+
470
+ **Software and App Development:**
471
+ - **User-Facing Applications:** Mobile app for reservations, payments, and status monitoring
472
+ - **Fleet Management Platform:** Comprehensive system for vehicle tracking, maintenance, and dispatch
473
+ - **Energy Management System:** Software controlling the interaction between solar, battery, and grid power
474
+ - **Data Analytics Platform:** Tools for performance monitoring and continuous improvement
475
+ - **Integration Architecture:** APIs and protocols ensuring seamless communication between systems
476
+
477
+ **Fleet Management Systems:**
478
+ - **Vehicle Telematics:** Real-time monitoring of location, charge status, and diagnostics
479
+ - **Reservation System:** User-friendly booking platform for subscription and on-demand services
480
+ - **Maintenance Tracking:** Predictive maintenance algorithms to optimize vehicle availability
481
+ - **Route Optimization:** AI-powered routing to maximize efficiency and range
482
+ - **User Authentication:** Secure access controls for vehicle usage
483
+
484
+ Unity Fleet will employ an agile development approach for all technology components, allowing for continuous improvement based on operational feedback and evolving user needs. All systems will be designed with cybersecurity as a fundamental consideration, implementing industry best practices for data protection and system security.
485
+
486
+ The technology implementation will prioritize open standards and interoperability wherever possible, ensuring that "The Link" charging network can adapt to evolving industry standards and integrate with broader transportation and energy systems.
487
+ # Budget and Financial Plan
488
+
489
+ ## 5.1 Project Budget
490
+
491
+ Unity Fleet requests $3,200,000 in funding from the Illinois Department of Transportation's Statewide Planning and Research Funds grant to support the implementation of "The Link" EV charging network. This funding will be complemented by Unity Fleet's matching contribution, creating a comprehensive financial foundation for this transformative project.
492
+
493
+ The budget is structured to support all phases of implementation, from planning and design through construction and operation. Major expenditure categories are detailed below:
494
+
495
+ ### Capital Expenditures
496
+
497
+ | Category | Description | Amount |
498
+ |----------|-------------|--------|
499
+ | **Site Acquisition/Leasing** | Securing five strategic locations through purchase or long-term lease arrangements | $750,000 |
500
+ | **Architectural & Engineering** | Design services, structural engineering, electrical engineering, and site planning | $425,000 |
501
+ | **Construction Costs** | Site preparation, foundation work, structural elements, and finishing for five hub locations | $1,200,000 |
502
+ | **Charging Equipment** | DC Fast Chargers (150kW) with CCS connectors, power distribution systems, and installation | $850,000 |
503
+ | **Solar & Battery Systems** | Rooftop solar arrays, battery storage systems, and energy management equipment | $625,000 |
504
+ | **Interior Buildout** | Lounge furnishings, amenity installations, and customer service facilities | $275,000 |
505
+ | **Landscaping & Exterior** | Sustainable landscaping, signage, lighting, and site improvements | $175,000 |
506
+ | **Grid Connections** | Utility interconnection costs, transformers, and electrical infrastructure | $350,000 |
507
+ | **Subtotal: Capital Expenditures** | | **$4,650,000** |
508
+
509
+ ### Technology Development
510
+
511
+ | Category | Description | Amount |
512
+ |----------|-------------|--------|
513
+ | **Energy Management System** | Software development for solar, battery, and grid integration | $175,000 |
514
+ | **Fleet Management Platform** | Development of vehicle tracking, maintenance, and reservation systems | $225,000 |
515
+ | **Mobile Application** | User-facing app for reservations, payments, and status monitoring | $150,000 |
516
+ | **System Integration** | APIs, data architecture, and cross-platform functionality | $125,000 |
517
+ | **Cybersecurity Implementation** | Security protocols, testing, and compliance measures | $75,000 |
518
+ | **Subtotal: Technology Development** | | **$750,000** |
519
+
520
+ ### Operational Setup
521
+
522
+ | Category | Description | Amount |
523
+ |----------|-------------|--------|
524
+ | **Initial Fleet Acquisition** | Purchase of first 10 electric vehicles for subscription and service programs | $500,000 |
525
+ | **Staff Recruitment & Training** | Hiring and comprehensive training for operational personnel | $150,000 |
526
+ | **Marketing & Community Outreach** | Launch campaign, community engagement, and educational materials | $200,000 |
527
+ | **Operational Reserves** | Contingency funding for initial operational period | $150,000 |
528
+ | **Subtotal: Operational Setup** | | **$1,000,000** |
529
+
530
+ ### Administrative and Overhead
531
+
532
+ | Category | Description | Amount |
533
+ |----------|-------------|--------|
534
+ | **Project Management** | Dedicated project management team throughout implementation | $250,000 |
535
+ | **Permitting & Compliance** | Fees and professional services for regulatory compliance | $100,000 |
536
+ | **Legal & Insurance** | Contract development, liability coverage, and risk management | $125,000 |
537
+ | **Administrative Support** | Office operations, accounting, and administrative personnel | $125,000 |
538
+ | **Subtotal: Administrative and Overhead** | | **$600,000** |
539
+
540
+ ### Budget Summary
541
+
542
+ | Category | Amount | Percentage |
543
+ |----------|--------|------------|
544
+ | Capital Expenditures | $4,650,000 | 66.4% |
545
+ | Technology Development | $750,000 | 10.7% |
546
+ | Operational Setup | $1,000,000 | 14.3% |
547
+ | Administrative and Overhead | $600,000 | 8.6% |
548
+ | **Total Project Budget** | **$7,000,000** | **100%** |
549
+
550
+ ## 5.2 Funding Sources
551
+
552
+ The total project budget of $7,000,000 will be funded through a combination of the requested grant and matching funds from Unity Fleet:
553
+
554
+ | Source | Amount | Percentage |
555
+ |--------|--------|------------|
556
+ | IDOT Statewide Planning and Research Funds | $3,200,000 | 45.7% |
557
+ | Unity Fleet Matching Funds | $3,800,000 | 54.3% |
558
+ | **Total Funding** | **$7,000,000** | **100%** |
559
+
560
+ ### Matching Funds Detail
561
+
562
+ Unity Fleet will provide the required matching funds through a combination of:
563
+
564
+ **Private Investment:** Unity Fleet has secured commitments from private investors specifically interested in supporting innovative clean transportation infrastructure. These investors recognize both the environmental benefits and commercial potential of "The Link" charging network.
565
+
566
+ **Corporate Capital:** Unity Fleet will allocate a portion of its existing capital resources to this project, demonstrating our organizational commitment to its success.
567
+
568
+ **Equipment Financing:** For certain capital equipment, Unity Fleet will utilize specialized financing arrangements that optimize cash flow while maintaining long-term ownership of assets.
569
+
570
+ **In-Kind Contributions:** Unity Fleet will leverage existing technological assets, intellectual property, and professional expertise as in-kind contributions to the project.
571
+
572
+ All matching funds have been secured or firmly committed, ensuring that the project can proceed immediately upon grant approval without financial delays.
573
+
574
+ ## 5.3 Financial Sustainability
575
+
576
+ Unity Fleet has developed a comprehensive financial sustainability model that ensures the long-term viability of "The Link" charging network beyond the initial implementation phase:
577
+
578
+ ### Revenue Streams
579
+
580
+ The project will generate revenue through multiple channels:
581
+
582
+ **Charging Services:**
583
+ - Pay-per-use charging fees from non-subscription users
584
+ - Bundled charging access through subscription programs
585
+ - Premium charging options for commercial vehicles
586
+ - Reserved charging slots for regular users
587
+
588
+ **Fleet Services:**
589
+ - Take-Home Subscription revenue
590
+ - FlexRide Subscription fees
591
+ - Daily and Monthly All-Access Pass sales
592
+ - Enhanced Commuter Pass subscriptions
593
+ - Corporate shuttle service contracts
594
+
595
+ **Ancillary Revenue:**
596
+ - Refreshment sales and vendor partnerships
597
+ - Advertising and promotional opportunities
598
+ - Data services (anonymized usage patterns)
599
+ - Grid services through battery storage capabilities
600
+ - Co-location fees from complementary businesses
601
+
602
+ ### Financial Projections
603
+
604
+ Based on market analysis and comparable operations, Unity Fleet projects the following financial performance:
605
+
606
+ | Year | Annual Revenue | Operating Expenses | Net Operating Income |
607
+ |------|----------------|--------------------|-----------------------|
608
+ | 1 | $1,200,000 | $1,050,000 | $150,000 |
609
+ | 2 | $2,500,000 | $1,750,000 | $750,000 |
610
+ | 3 | $4,000,000 | $2,500,000 | $1,500,000 |
611
+ | 5 | $7,500,000 | $4,000,000 | $3,500,000 |
612
+
613
+ These projections demonstrate that "The Link" charging network will achieve operational sustainability within the first year and generate significant positive cash flow by year three, allowing for reinvestment in expansion and enhancement.
614
+
615
+ ### Maintenance and Replacement Planning
616
+
617
+ Unity Fleet has developed a comprehensive asset management strategy to ensure the long-term functionality of all infrastructure:
618
+
619
+ **Preventative Maintenance:** Regular scheduled maintenance for all charging equipment, solar systems, and facility components to maximize lifespan and reliability.
620
+
621
+ **Equipment Replacement Fund:** Beginning in year two, Unity Fleet will allocate 5% of gross revenue to a dedicated replacement fund for future equipment upgrades.
622
+
623
+ **Technology Refresh Cycle:** A planned 5-7 year refresh cycle for charging technology to ensure compatibility with evolving vehicle standards and maintain competitive service levels.
624
+
625
+ **Facility Reinvestment:** Annual allocation for facility improvements and updates to maintain attractive, functional environments.
626
+
627
+ ### Scaling Strategy
628
+
629
+ The financial model includes a reinvestment strategy for expansion:
630
+
631
+ **Network Growth:** Beginning in year three, Unity Fleet plans to reinvest a portion of operating profits into new hub locations, expanding the network's geographic coverage.
632
+
633
+ **Service Expansion:** The fleet services component will scale incrementally, with vehicle acquisitions tied directly to subscription growth to maintain optimal utilization.
634
+
635
+ **Technology Enhancement:** Continuous improvement of software platforms and user interfaces based on operational data and customer feedback.
636
+
637
+ **Partnership Development:** Strategic partnerships with complementary businesses and services to enhance value proposition and create additional revenue opportunities.
638
+
639
+ This multi-faceted approach to financial sustainability ensures that the initial investment in "The Link" charging network will generate long-term value for Illinois' transportation infrastructure while creating a financially viable enterprise that can grow without requiring additional public funding.
640
+ # Performance Metrics and Evaluation
641
+
642
+ ## 6.1 Key Performance Indicators
643
+
644
+ Unity Fleet will implement a comprehensive performance measurement framework to track the impact and effectiveness of "The Link" charging network and associated fleet services. These metrics will provide accountability to stakeholders, guide operational improvements, and demonstrate alignment with Illinois' transportation and climate goals.
645
+
646
+ ### Environmental Impact Metrics
647
+
648
+ | Metric | Description | Target |
649
+ |--------|-------------|--------|
650
+ | **Charging Sessions** | Total number of vehicle charging sessions completed | 25,000 in Year 1; 50% annual growth |
651
+ | **kWh Delivered** | Total electrical energy provided to vehicles | 1,250,000 kWh in Year 1; 50% annual growth |
652
+ | **Solar Generation** | Renewable energy produced by on-site solar arrays | 30% of total energy delivered in Year 1; 40% by Year 3 |
653
+ | **CO2 Emissions Avoided** | Estimated greenhouse gas emissions prevented through EV use vs. conventional vehicles | 1,500 metric tons in Year 1; 4,500 metric tons by Year 3 |
654
+ | **Vehicle Miles Electrified** | Total miles driven by EVs using "The Link" infrastructure | 5 million miles in Year 1; 15 million by Year 3 |
655
+ | **Petroleum Displacement** | Gallons of gasoline/diesel avoided through EV adoption | 200,000 gallons in Year 1; 600,000 by Year 3 |
656
+
657
+ ### Operational Performance Metrics
658
+
659
+ | Metric | Description | Target |
660
+ |--------|-------------|--------|
661
+ | **Charging Station Uptime** | Percentage of time charging ports are operational | >98% |
662
+ | **Utilization Rate** | Percentage of available charging time that ports are in active use | 40% in Year 1; 60% by Year 3 |
663
+ | **Peak vs. Off-Peak Usage** | Distribution of charging sessions across time periods | <60% of sessions during grid peak hours |
664
+ | **Average Charging Duration** | Mean time spent per charging session | <45 minutes for passenger vehicles |
665
+ | **Customer Wait Time** | Average time users wait for available charging port | <10 minutes during 90% of operating hours |
666
+ | **Energy Efficiency** | Ratio of energy delivered to vehicles vs. total energy consumed | >92% efficiency |
667
+
668
+ ### User Adoption Metrics
669
+
670
+ | Metric | Description | Target |
671
+ |--------|-------------|--------|
672
+ | **Unique Users** | Number of distinct individuals using the charging network | 5,000 in Year 1; 15,000 by Year 3 |
673
+ | **Subscription Enrollment** | Number of active subscribers across all service tiers | 500 in Year 1; 2,000 by Year 3 |
674
+ | **User Satisfaction** | Average rating from customer feedback surveys | >4.5/5.0 rating |
675
+ | **Repeat Usage** | Percentage of users who return for multiple sessions | >70% |
676
+ | **App Downloads** | Number of mobile application installations | 7,500 in Year 1; 25,000 by Year 3 |
677
+ | **Session Frequency** | Average number of charging sessions per user per month | >2.5 sessions |
678
+
679
+ ### Economic Impact Metrics
680
+
681
+ | Metric | Description | Target |
682
+ |--------|-------------|--------|
683
+ | **Job Creation** | Direct employment generated by the project | 25 FTE positions in Year 1; 50 by Year 3 |
684
+ | **Local Spending** | Procurement from Illinois-based suppliers and contractors | >70% of eligible expenditures |
685
+ | **Revenue Generation** | Total income from all services | $1.2M in Year 1; $4M by Year 3 |
686
+ | **Tax Contribution** | State and local tax revenue generated | $150,000 in Year 1; $500,000 by Year 3 |
687
+ | **Private Investment Leveraged** | Additional private capital attracted to the project | $5M by Year 3 |
688
+ | **Cost per kWh Delivered** | Operational efficiency measure | <$0.20/kWh by Year 3 |
689
+
690
+ ### Equity and Accessibility Metrics
691
+
692
+ | Metric | Description | Target |
693
+ |--------|-------------|--------|
694
+ | **LIDAC Participation** | Usage by residents of Low Income/Disadvantaged Communities | >25% of total users |
695
+ | **Community Access Program Enrollment** | Participation in discounted access programs | 250 participants in Year 1; 1,000 by Year 3 |
696
+ | **Geographic Distribution** | Spread of users across different communities | Representation from >75% of service area communities |
697
+ | **Accessibility Compliance** | Adherence to ADA and accessibility standards | 100% compliance plus enhanced features |
698
+ | **Language Accessibility** | Availability of services in multiple languages | Support for at least 3 languages besides English |
699
+ | **Payment Method Diversity** | Range of payment options available to users | Minimum of 5 distinct payment methods |
700
+
701
+ ## 6.2 Evaluation Methodology
702
+
703
+ Unity Fleet will implement a rigorous evaluation methodology to ensure accurate, transparent assessment of project performance:
704
+
705
+ ### Data Collection Approach
706
+
707
+ **Automated System Monitoring:**
708
+ - Real-time data collection from all charging equipment
709
+ - Continuous monitoring of solar generation and energy consumption
710
+ - Automated tracking of vehicle usage and charging patterns
711
+ - System performance and reliability metrics
712
+
713
+ **User Interaction Tracking:**
714
+ - Mobile app usage statistics and patterns
715
+ - Reservation and payment transaction data
716
+ - User demographic information (voluntarily provided)
717
+ - Session frequency and duration metrics
718
+
719
+ **Direct User Feedback:**
720
+ - Post-charging session satisfaction surveys
721
+ - Quarterly in-depth user experience assessments
722
+ - Focus groups with different user segments
723
+ - Suggestion and improvement channels
724
+
725
+ **Economic Impact Assessment:**
726
+ - Employment data from operations and partners
727
+ - Procurement and spending analysis
728
+ - Revenue and financial performance tracking
729
+ - Tax contribution documentation
730
+
731
+ **Environmental Impact Calculation:**
732
+ - Energy delivery measurement
733
+ - Emissions avoidance calculations based on EPA methodologies
734
+ - Renewable energy generation monitoring
735
+ - Grid impact analysis in partnership with utilities
736
+
737
+ ### Reporting Frequency and Format
738
+
739
+ Unity Fleet will maintain a transparent reporting structure with regular updates to stakeholders:
740
+
741
+ **Monthly Operational Reports:**
742
+ - Key usage statistics and trends
743
+ - System performance and reliability metrics
744
+ - Notable operational developments
745
+ - Progress toward targets
746
+
747
+ **Quarterly Performance Assessments:**
748
+ - Comprehensive analysis of all KPIs
749
+ - Comparison to targets and previous periods
750
+ - User demographic and behavior analysis
751
+ - Financial performance summary
752
+
753
+ **Annual Impact Evaluation:**
754
+ - Detailed analysis of environmental impact
755
+ - Economic benefit assessment
756
+ - Equity and accessibility performance
757
+ - Strategic recommendations for improvement
758
+
759
+ **Public Dashboard:**
760
+ - Real-time display of key metrics on website
761
+ - Environmental impact visualization
762
+ - System availability information
763
+ - Community benefit highlights
764
+
765
+ ### Continuous Improvement Process
766
+
767
+ Unity Fleet will implement a structured approach to using evaluation data for ongoing enhancement:
768
+
769
+ **Quarterly Review Meetings:**
770
+ - Cross-functional team analysis of performance data
771
+ - Identification of improvement opportunities
772
+ - Prioritization of enhancement initiatives
773
+ - Action plan development
774
+
775
+ **User Experience Optimization:**
776
+ - Regular usability testing and interface refinement
777
+ - Feature development based on user feedback
778
+ - Service enhancement to address identified needs
779
+ - Accessibility improvements
780
+
781
+ **Operational Efficiency Initiatives:**
782
+ - Energy efficiency optimization
783
+ - Maintenance procedure refinement
784
+ - Staffing and resource allocation adjustments
785
+ - Technology upgrades based on performance data
786
+
787
+ **Strategic Adaptation:**
788
+ - Annual strategic review incorporating evaluation findings
789
+ - Adjustment of growth plans based on usage patterns
790
+ - Refinement of service offerings to maximize impact
791
+ - Partnership development informed by performance data
792
+
793
+ ## 6.3 Long-term Impact Assessment
794
+
795
+ Beyond immediate performance metrics, Unity Fleet will conduct comprehensive assessments of the project's long-term impact on Illinois' transportation system, environment, and economy:
796
+
797
+ ### Environmental Benefits Quantification
798
+
799
+ **Transportation Emissions Analysis:**
800
+ Unity Fleet will partner with environmental researchers to conduct a comprehensive analysis of the project's impact on transportation emissions, including:
801
+ - Direct emissions reduction from EV adoption
802
+ - Secondary effects on conventional vehicle usage
803
+ - Impact on regional air quality indicators
804
+ - Contribution to Illinois' climate goals
805
+
806
+ **Renewable Energy Integration Assessment:**
807
+ The project will evaluate the effectiveness of integrating solar generation with EV charging, analyzing:
808
+ - Optimization of renewable energy utilization
809
+ - Grid impact during peak demand periods
810
+ - Battery storage effectiveness
811
+ - Seasonal performance variations
812
+
813
+ **Life Cycle Assessment:**
814
+ A complete life cycle analysis will examine the net environmental impact of the project, including:
815
+ - Infrastructure construction and materials
816
+ - Equipment manufacturing and transportation
817
+ - Operational energy consumption
818
+ - End-of-life considerations and circular economy opportunities
819
+
820
+ ### Economic Impact Measurement
821
+
822
+ **Job Creation and Economic Multiplier:**
823
+ Unity Fleet will work with economic analysts to quantify the project's contribution to Illinois' economy:
824
+ - Direct employment impact
825
+ - Indirect job creation through suppliers and partners
826
+ - Induced economic activity from employee spending
827
+ - Skills development and workforce advancement
828
+
829
+ **Transportation Cost Analysis:**
830
+ The project will assess its impact on transportation costs for individuals and businesses:
831
+ - Comparative cost of electric vs. conventional vehicle operation
832
+ - Subscription model value compared to vehicle ownership
833
+ - Business transportation cost reduction through fleet services
834
+ - Time value benefits from charging hub amenities
835
+
836
+ **Property Value and Development Impact:**
837
+ Research will examine the influence of "The Link" charging hubs on surrounding areas:
838
+ - Commercial activity near hub locations
839
+ - Property value trends in proximity to charging infrastructure
840
+ - Development patterns influenced by charging availability
841
+ - Tax base enhancement in host communities
842
+
843
+ ### Transportation System Improvement Metrics
844
+
845
+ **EV Adoption Acceleration:**
846
+ Unity Fleet will track the project's contribution to EV adoption rates:
847
+ - New EV registrations in service areas
848
+ - Conversion rates from conventional to electric vehicles
849
+ - Range anxiety reduction through survey assessment
850
+ - Charging as a factor in vehicle purchase decisions
851
+
852
+ **Modal Integration Assessment:**
853
+ The project will evaluate how "The Link" charging network integrates with other transportation modes:
854
+ - Connections to public transit
855
+ - Support for multi-modal trips
856
+ - Reduction in single-occupancy vehicle trips
857
+ - Enhancement of transportation system resilience
858
+
859
+ **Infrastructure Utilization Optimization:**
860
+ Analysis will examine how the project affects overall transportation infrastructure usage:
861
+ - Peak travel demand modification
862
+ - Parking requirement impacts
863
+ - Road capacity utilization changes
864
+ - Charging infrastructure adequacy for growing EV fleet
865
+
866
+ Through this comprehensive evaluation framework, Unity Fleet will ensure that "The Link" charging network delivers measurable benefits aligned with Illinois' transportation, environmental, and economic development goals. The performance measurement system will provide accountability to stakeholders while generating valuable data to guide the evolution of EV charging infrastructure and services throughout the state.
867
+ # Partnerships and Stakeholder Engagement
868
+
869
+ ## 7.1 Current Partners
870
+
871
+ Unity Fleet has established strategic partnerships with key organizations to enhance the implementation and impact of "The Link" charging network. These partnerships provide technical expertise, community connections, and complementary capabilities that strengthen the project:
872
+
873
+ ### Technology Providers
874
+ - **EV Charging Equipment Manufacturer:** Unity Fleet has secured a partnership with a leading manufacturer of DC fast charging equipment, ensuring access to cutting-edge technology and technical support.
875
+ - **Solar and Battery System Integrator:** A specialized renewable energy firm will provide design and implementation services for the solar arrays and battery storage systems.
876
+ - **Software Development Partner:** Unity Fleet is collaborating with an Illinois-based software development company to create the mobile application and management platforms.
877
+ - **Fleet Management Technology Provider:** A partnership with a fleet telematics specialist will support the vehicle tracking and optimization systems.
878
+
879
+ ### Local Businesses
880
+ - **Retail and Food Service Partners:** Unity Fleet has established relationships with several food and beverage providers interested in operating within "The Link" hub locations.
881
+ - **Corporate Transportation Clients:** Initial agreements with three Illinois-based corporations to provide electric shuttle services for employees.
882
+ - **Property Development Partners:** Relationships with commercial property owners and developers to identify and secure optimal locations for charging hubs.
883
+ - **Vehicle Suppliers:** Partnerships with electric vehicle dealers to support fleet acquisition and potential promotional opportunities.
884
+
885
+ ### Community Organizations
886
+ - **Environmental Advocacy Groups:** Collaborations with environmental organizations to promote the benefits of electric transportation.
887
+ - **Workforce Development Programs:** Partnerships with job training organizations to develop skills in EV infrastructure installation and maintenance.
888
+ - **Community Service Organizations:** Relationships with social service providers to implement the Community Access Program for low-income residents.
889
+ - **Educational Institutions:** Collaborations with community colleges and universities for research, internships, and educational programming.
890
+
891
+ ## 7.2 Stakeholder Engagement Plan
892
+
893
+ Unity Fleet will implement a comprehensive stakeholder engagement strategy to ensure the project addresses community needs, builds broad support, and maximizes positive impact:
894
+
895
+ ### Community Outreach Strategy
896
+
897
+ **Informational Sessions:**
898
+ - Public presentations in each target community
899
+ - Virtual webinars explaining the project and benefits
900
+ - Site-specific open houses during planning phases
901
+ - Educational workshops on EV technology and benefits
902
+
903
+ **Digital Engagement:**
904
+ - Dedicated project website with regular updates
905
+ - Social media presence with engaging content
906
+ - Email newsletter for interested stakeholders
907
+ - Online feedback forms and suggestion channels
908
+
909
+ **Targeted Outreach to Underserved Communities:**
910
+ - Presentations at community centers and faith-based organizations
911
+ - Materials in multiple languages reflecting community demographics
912
+ - Partnerships with trusted community organizations
913
+ - Transportation to informational events when needed
914
+
915
+ **Educational Programming:**
916
+ - EV awareness events and test drive opportunities
917
+ - School programs on clean transportation
918
+ - Workforce development information sessions
919
+ - Community college partnerships for technical training
920
+
921
+ ### Local Government Coordination
922
+
923
+ **Municipal Engagement:**
924
+ - Early consultation with local officials in target communities
925
+ - Regular briefings for municipal staff and elected representatives
926
+ - Coordination with planning and zoning departments
927
+ - Alignment with local economic development initiatives
928
+
929
+ **Permitting and Regulatory Coordination:**
930
+ - Proactive engagement with permitting authorities
931
+ - Clear communication about project timelines and requirements
932
+ - Responsive addressing of questions and concerns
933
+ - Documentation of processes to streamline future deployments
934
+
935
+ **Transportation Planning Integration:**
936
+ - Coordination with local transportation planning agencies
937
+ - Alignment with regional mobility strategies
938
+ - Integration with public transit planning
939
+ - Contribution to local climate action initiatives
940
+
941
+ **Utility Coordination:**
942
+ - Early engagement with electric utilities serving target areas
943
+ - Collaborative planning for grid connections and capacity
944
+ - Exploration of potential demand response programs
945
+ - Data sharing for grid impact analysis
946
+
947
+ ### Business Partnership Development
948
+
949
+ **Local Business Engagement:**
950
+ - Outreach to businesses near potential hub locations
951
+ - Exploration of co-marketing opportunities
952
+ - Development of cross-promotional programs
953
+ - Creation of business charging incentives
954
+
955
+ **Corporate Transportation Programs:**
956
+ - Targeted outreach to major employers
957
+ - Custom proposals for employee transportation solutions
958
+ - Fleet electrification consulting services
959
+ - Workplace charging integration options
960
+
961
+ **Tourism and Hospitality Connections:**
962
+ - Partnerships with hotels and tourist destinations
963
+ - Integration with visitor information services
964
+ - Charging packages for travelers
965
+ - Cross-promotion with regional attractions
966
+
967
+ **Supply Chain Development:**
968
+ - Identification of Illinois-based suppliers and contractors
969
+ - Capacity building for local businesses to participate
970
+ - Mentorship for small and diverse businesses
971
+ - Transparent procurement processes
972
+
973
+ ## 7.3 Letters of Support
974
+
975
+ Unity Fleet has secured letters of support from a diverse range of stakeholders who recognize the value of "The Link" charging network for Illinois' transportation system, environment, and economy. These endorsements demonstrate the broad appeal of the project and its alignment with community priorities:
976
+
977
+ ### Government and Public Agencies
978
+ - Illinois Environmental Protection Agency
979
+ - Regional Transportation Authority
980
+ - City of Decatur Economic Development Department
981
+ - Illinois Clean Energy Community Foundation
982
+
983
+ ### Business and Industry
984
+ - Illinois Chamber of Commerce
985
+ - Electric Vehicle Association of Illinois
986
+ - Illinois Automobile Dealers Association
987
+ - Regional business improvement districts
988
+
989
+ ### Community and Environmental Organizations
990
+ - Illinois Environmental Council
991
+ - Center for Neighborhood Technology
992
+ - Illinois Clean Jobs Coalition
993
+ - Community transportation advocacy groups
994
+
995
+ ### Educational and Research Institutions
996
+ - University of Illinois Smart Transportation Infrastructure Initiative
997
+ - Illinois Community College Sustainability Network
998
+ - Illinois Institute of Technology Power Electronics Laboratory
999
+ - Local workforce development boards
1000
+
1001
+ These letters of support, included in the appendix to this proposal, demonstrate the widespread recognition of "The Link" charging network's potential to advance Illinois' transportation, environmental, and economic goals. The diverse range of supporting organizations reflects the project's comprehensive approach to addressing multiple priorities through innovative infrastructure development.
1002
+
1003
+ Unity Fleet will continue to expand this stakeholder network throughout project implementation, ensuring that "The Link" charging network reflects community needs and creates maximum benefit for all Illinois residents.
1004
+ # Conclusion
1005
+
1006
+ Unity Fleet's proposal for "The Link" EV charging network represents a transformative opportunity to advance Illinois' transportation infrastructure, environmental goals, and economic development priorities. This innovative project aligns perfectly with the state's commitment to reducing greenhouse gas emissions, expanding electric vehicle adoption, and creating sustainable transportation solutions for all residents.
1007
+
1008
+ By combining cutting-edge charging technology with solar power generation, amenity-rich environments, and flexible fleet services, "The Link" addresses multiple barriers to EV adoption simultaneously. The distinctive hub design creates visible landmarks that symbolize Illinois' leadership in transportation innovation while providing practical infrastructure that meets the growing demand for convenient, reliable charging.
1009
+
1010
+ The $3.2 million in requested funding from the Illinois Department of Transportation's Statewide Planning and Research Funds will enable Unity Fleet to implement the first phase of this visionary network, establishing five strategically located charging hubs across the state. These initial locations will demonstrate the concept's viability while providing immediate benefits to communities, businesses, and individual EV users.
1011
+
1012
+ Unity Fleet brings the necessary expertise, partnerships, and matching resources to ensure successful implementation. Our comprehensive approach includes detailed planning, community engagement, and rigorous performance measurement to maximize the project's impact and ensure accountability to all stakeholders.
1013
+
1014
+ "The Link" charging network will deliver significant benefits to Illinois:
1015
+
1016
+ - **Environmental Impact:** Accelerating EV adoption to reduce transportation emissions and support climate goals
1017
+ - **Economic Development:** Creating jobs, supporting local businesses, and building workforce capacity in clean energy sectors
1018
+ - **Transportation Innovation:** Advancing Illinois' leadership in mobility technology and infrastructure
1019
+ - **Equity and Accessibility:** Ensuring that clean transportation benefits reach all communities through inclusive design and targeted programs
1020
+ - **Energy Integration:** Demonstrating the successful integration of renewable energy with transportation infrastructure
1021
+
1022
+ Unity Fleet is committed to making "The Link" charging network a model for sustainable transportation infrastructure that can be replicated across Illinois and beyond. We look forward to the opportunity to partner with the Illinois Department of Transportation on this important initiative and contribute to the state's clean energy and transportation future.
1023
+
1024
+ Thank you for your consideration of this proposal.