openclaw-smartmeter 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,35 +6,89 @@
6
6
  }
7
7
 
8
8
  :root {
9
- --primary-color: #16a34a;
10
- --primary-hover: #15803d;
11
- --secondary-color: #3b82f6;
12
- --danger-color: #ef4444;
9
+ /* Professional Technical Color Palette */
10
+ --primary-color: #0ea5e9;
11
+ --primary-hover: #0284c7;
12
+ --primary-light: #e0f2fe;
13
+ --primary-dark: #075985;
14
+ --secondary-color: #8b5cf6;
15
+ --secondary-hover: #7c3aed;
16
+ --secondary-light: #ede9fe;
17
+ --danger-color: #dc2626;
18
+ --danger-light: #fee2e2;
13
19
  --warning-color: #f59e0b;
20
+ --warning-light: #fef3c7;
14
21
  --success-color: #10b981;
15
- --text-primary: #1f2937;
16
- --text-secondary: #6b7280;
22
+ --success-hover: #059669;
23
+ --success-light: #d1fae5;
24
+ --success-dark: #065f46;
25
+
26
+ /* Text Colors - Enhanced Contrast */
27
+ --text-primary: #0f172a;
28
+ --text-secondary: #475569;
29
+ --text-muted: #94a3b8;
30
+
31
+ /* Background Colors - Refined Hierarchy */
17
32
  --bg-primary: #ffffff;
18
- --bg-secondary: #f9fafb;
19
- --bg-tertiary: #f3f4f6;
20
- --border-color: #e5e7eb;
21
- --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
22
- --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
23
- --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
24
- --radius-sm: 6px;
25
- --radius-md: 8px;
26
- --radius-lg: 12px;
33
+ --bg-secondary: #f8fafc;
34
+ --bg-tertiary: #f1f5f9;
35
+ --bg-hover: #e2e8f0;
36
+ --bg-accent: #eff6ff;
37
+ --bg-code: #1e293b;
38
+
39
+ /* Border Colors */
40
+ --border-color: #e2e8f0;
41
+ --border-light: #f1f5f9;
42
+ --border-accent: #cbd5e1;
43
+
44
+ /* Shadows - Modern elevation system */
45
+ --shadow-xs: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
46
+ --shadow-sm: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1);
47
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);
48
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
49
+ --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
50
+
51
+ /* Border Radius */
52
+ --radius-sm: 8px;
53
+ --radius-md: 12px;
54
+ --radius-lg: 16px;
55
+ --radius-xl: 20px;
56
+ --radius-full: 9999px;
57
+
58
+ /* Spacing */
59
+ --space-xs: 4px;
60
+ --space-sm: 8px;
61
+ --space-md: 16px;
62
+ --space-lg: 24px;
63
+ --space-xl: 32px;
64
+ --space-2xl: 48px;
65
+
66
+ /* Transitions */
67
+ --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
68
+ --transition-base: 250ms cubic-bezier(0.4, 0, 0.2, 1);
69
+ --transition-slow: 350ms cubic-bezier(0.4, 0, 0.2, 1);
27
70
  }
28
71
 
29
72
  body {
30
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
31
- 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
73
+ font-family: -apple-system, BlinkMacSystemFont, 'Inter', 'Segoe UI', 'Roboto', 'Helvetica Neue',
32
74
  sans-serif;
33
75
  -webkit-font-smoothing: antialiased;
34
76
  -moz-osx-font-smoothing: grayscale;
35
- background: var(--bg-secondary);
77
+ background: linear-gradient(to bottom, #f8fafc 0%, #f1f5f9 100%);
36
78
  color: var(--text-primary);
37
79
  line-height: 1.6;
80
+ font-size: 15px;
81
+ min-height: 100vh;
82
+ }
83
+
84
+ /* Monospace font for data and metrics */
85
+ .metric-value,
86
+ .cost-value,
87
+ .savings-amount,
88
+ .stat-value {
89
+ font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Fira Code', 'Roboto Mono', monospace;
90
+ font-variant-numeric: tabular-nums;
91
+ letter-spacing: -0.02em;
38
92
  }
39
93
 
40
94
  .container {
@@ -43,15 +97,21 @@ body {
43
97
  padding: 0;
44
98
  }
45
99
 
46
- /* Header */
100
+ /* Header - Enhanced Professional Design */
47
101
  .header {
48
- background: var(--bg-primary);
102
+ background: rgba(255, 255, 255, 0.95);
49
103
  border-bottom: 1px solid var(--border-color);
50
- padding: 20px 40px;
104
+ padding: var(--space-lg) var(--space-2xl);
105
+ backdrop-filter: blur(12px) saturate(180%);
51
106
  position: sticky;
52
107
  top: 0;
53
108
  z-index: 100;
54
- box-shadow: var(--shadow-sm);
109
+ box-shadow: 0 1px 3px rgba(15, 23, 42, 0.08);
110
+ transition: all var(--transition-base);
111
+ }
112
+
113
+ .header:hover {
114
+ box-shadow: 0 4px 12px rgba(15, 23, 42, 0.12);
55
115
  }
56
116
 
57
117
  .header-content {
@@ -71,12 +131,15 @@ body {
71
131
  font-weight: 700;
72
132
  color: var(--text-primary);
73
133
  margin: 0;
134
+ letter-spacing: -0.02em;
74
135
  }
75
136
 
76
137
  .logo-text p {
77
- font-size: 14px;
138
+ font-size: 13px;
78
139
  color: var(--text-secondary);
79
140
  margin: 0;
141
+ letter-spacing: 0.01em;
142
+ font-weight: 500;
80
143
  }
81
144
 
82
145
  .header-actions {
@@ -96,18 +159,26 @@ body {
96
159
  align-items: center;
97
160
  gap: 6px;
98
161
  padding: 8px 16px;
99
- background: var(--bg-tertiary);
100
- border: 1px solid var(--border-color);
162
+ background: var(--bg-primary);
163
+ border: 1.5px solid var(--border-color);
101
164
  border-radius: var(--radius-sm);
102
165
  font-size: 14px;
103
166
  font-weight: 500;
104
167
  color: var(--text-primary);
105
168
  cursor: pointer;
106
- transition: all 0.2s;
169
+ transition: all var(--transition-base);
170
+ box-shadow: var(--shadow-xs);
107
171
  }
108
172
 
109
173
  .btn-refresh:hover {
110
- background: var(--border-color);
174
+ background: var(--bg-accent);
175
+ border-color: var(--primary-color);
176
+ transform: translateY(-1px);
177
+ box-shadow: var(--shadow-sm);
178
+ }
179
+
180
+ .btn-refresh:active {
181
+ transform: translateY(0);
111
182
  }
112
183
 
113
184
  .btn {
@@ -124,14 +195,20 @@ body {
124
195
  }
125
196
 
126
197
  .btn-primary {
127
- background: var(--primary-color);
198
+ background: linear-gradient(135deg, var(--primary-color) 0%, var(--primary-hover) 100%);
128
199
  color: white;
129
- box-shadow: var(--shadow-md);
200
+ box-shadow: 0 4px 12px rgba(14, 165, 233, 0.3);
201
+ border: none;
130
202
  }
131
203
 
132
204
  .btn-primary:hover {
133
- background: var(--primary-hover);
134
- box-shadow: var(--shadow-lg);
205
+ background: linear-gradient(135deg, var(--primary-hover) 0%, var(--primary-dark) 100%);
206
+ box-shadow: 0 6px 20px rgba(14, 165, 233, 0.4);
207
+ transform: translateY(-2px);
208
+ }
209
+
210
+ .btn-primary:active {
211
+ transform: translateY(0);
135
212
  }
136
213
 
137
214
  .btn-secondary {
@@ -144,23 +221,26 @@ body {
144
221
  background: var(--bg-tertiary);
145
222
  }
146
223
 
147
- /* Dashboard Main */
224
+ /* Dashboard Main - Enhanced Spacing */
148
225
  .dashboard {
149
- padding: 40px;
226
+ padding: 48px;
150
227
  display: flex;
151
228
  flex-direction: column;
152
- gap: 30px;
229
+ gap: 36px;
230
+ max-width: 1600px;
231
+ margin: 0 auto;
153
232
  }
154
233
 
155
- /* Hero Card - Savings Display */
234
+ /* Hero Card - Enhanced Savings Display */
156
235
  .hero-card {
157
- background: linear-gradient(135deg, #16a34a 0%, #15803d 100%);
158
- border-radius: var(--radius-lg);
159
- padding: 40px;
236
+ background: linear-gradient(135deg, var(--success-color) 0%, var(--success-dark) 100%);
237
+ border-radius: var(--radius-xl);
238
+ padding: 48px;
160
239
  color: white;
161
- box-shadow: var(--shadow-lg);
240
+ box-shadow: 0 20px 40px rgba(16, 185, 129, 0.25);
162
241
  position: relative;
163
242
  overflow: hidden;
243
+ border: 1px solid rgba(255, 255, 255, 0.1);
164
244
  }
165
245
 
166
246
  .hero-card::before {
@@ -168,10 +248,16 @@ body {
168
248
  position: absolute;
169
249
  top: -50%;
170
250
  right: -10%;
171
- width: 300px;
172
- height: 300px;
173
- background: rgba(255, 255, 255, 0.1);
251
+ width: 400px;
252
+ height: 400px;
253
+ background: radial-gradient(circle, rgba(255, 255, 255, 0.15) 0%, transparent 70%);
174
254
  border-radius: 50%;
255
+ animation: pulse 8s ease-in-out infinite;
256
+ }
257
+
258
+ @keyframes pulse {
259
+ 0%, 100% { transform: scale(1); opacity: 0.15; }
260
+ 50% { transform: scale(1.1); opacity: 0.25; }
175
261
  }
176
262
 
177
263
  .savings-display {
@@ -188,9 +274,11 @@ body {
188
274
  }
189
275
 
190
276
  .savings-amount {
191
- font-size: 56px;
277
+ font-size: 64px;
192
278
  font-weight: 800;
193
279
  margin-bottom: 8px;
280
+ text-shadow: 0 2px 20px rgba(0, 0, 0, 0.2);
281
+ letter-spacing: -0.03em;
194
282
  }
195
283
 
196
284
  .savings-percentage {
@@ -208,12 +296,19 @@ body {
208
296
  }
209
297
 
210
298
  .cost-item {
211
- background: rgba(255, 255, 255, 0.15);
212
- backdrop-filter: blur(10px);
213
- border-radius: var(--radius-md);
214
- padding: 20px 30px;
299
+ background: rgba(255, 255, 255, 0.12);
300
+ backdrop-filter: blur(16px);
301
+ border: 1px solid rgba(255, 255, 255, 0.2);
302
+ border-radius: var(--radius-lg);
303
+ padding: 24px 36px;
215
304
  text-align: center;
216
- min-width: 200px;
305
+ min-width: 220px;
306
+ transition: all var(--transition-base);
307
+ }
308
+
309
+ .cost-item:hover {
310
+ background: rgba(255, 255, 255, 0.18);
311
+ transform: translateY(-2px);
217
312
  }
218
313
 
219
314
  .cost-label {
@@ -245,6 +340,59 @@ body {
245
340
  font-weight: 500;
246
341
  }
247
342
 
343
+ /* Insufficient Data State */
344
+ .insufficient-data {
345
+ color: rgba(255, 255, 255, 0.85);
346
+ font-size: 18px;
347
+ font-weight: 500;
348
+ font-style: italic;
349
+ }
350
+
351
+ .info-banner {
352
+ background: linear-gradient(135deg, #0ea5e9 0%, #0284c7 100%);
353
+ border-radius: var(--radius-lg);
354
+ padding: 20px 24px;
355
+ color: white;
356
+ margin-bottom: 24px;
357
+ display: flex;
358
+ align-items: center;
359
+ gap: 16px;
360
+ box-shadow: 0 4px 16px rgba(14, 165, 233, 0.25);
361
+ border: 1px solid rgba(255, 255, 255, 0.2);
362
+ backdrop-filter: blur(8px);
363
+ }
364
+
365
+ .info-banner-icon {
366
+ font-size: 28px;
367
+ flex-shrink: 0;
368
+ width: 44px;
369
+ height: 44px;
370
+ display: flex;
371
+ align-items: center;
372
+ justify-content: center;
373
+ background: rgba(255, 255, 255, 0.15);
374
+ border-radius: var(--radius-md);
375
+ backdrop-filter: blur(8px);
376
+ }
377
+
378
+ .info-banner-content {
379
+ flex-grow: 1;
380
+ }
381
+
382
+ .info-banner-title {
383
+ font-weight: 700;
384
+ font-size: 16px;
385
+ margin-bottom: 6px;
386
+ letter-spacing: -0.01em;
387
+ }
388
+
389
+ .info-banner-text {
390
+ font-size: 14px;
391
+ opacity: 0.95;
392
+ line-height: 1.5;
393
+ font-weight: 400;
394
+ }
395
+
248
396
  /* Stats Grid */
249
397
  .stats-grid {
250
398
  display: grid;
@@ -254,30 +402,55 @@ body {
254
402
 
255
403
  .stat-card {
256
404
  background: var(--bg-primary);
257
- border-radius: var(--radius-md);
258
- padding: 24px;
405
+ border-radius: var(--radius-lg);
406
+ padding: 28px;
259
407
  display: flex;
260
408
  align-items: center;
261
- gap: 16px;
262
- box-shadow: var(--shadow-sm);
263
- border: 1px solid var(--border-color);
264
- transition: all 0.2s;
409
+ gap: 20px;
410
+ box-shadow: 0 2px 8px rgba(15, 23, 42, 0.06);
411
+ border: 1.5px solid var(--border-color);
412
+ transition: all var(--transition-base);
413
+ position: relative;
414
+ overflow: hidden;
415
+ }
416
+
417
+ .stat-card::before {
418
+ content: '';
419
+ position: absolute;
420
+ top: 0;
421
+ left: 0;
422
+ width: 4px;
423
+ height: 100%;
424
+ background: linear-gradient(to bottom, var(--primary-color), var(--secondary-color));
425
+ opacity: 0;
426
+ transition: opacity var(--transition-base);
265
427
  }
266
428
 
267
429
  .stat-card:hover {
268
- box-shadow: var(--shadow-md);
269
- transform: translateY(-2px);
430
+ box-shadow: 0 8px 24px rgba(15, 23, 42, 0.12);
431
+ transform: translateY(-4px);
432
+ border-color: var(--primary-light);
433
+ }
434
+
435
+ .stat-card:hover::before {
436
+ opacity: 1;
270
437
  }
271
438
 
272
439
  .stat-icon {
273
440
  font-size: 32px;
274
- width: 56px;
275
- height: 56px;
441
+ width: 64px;
442
+ height: 64px;
276
443
  display: flex;
277
444
  align-items: center;
278
445
  justify-content: center;
279
- background: var(--bg-tertiary);
280
- border-radius: var(--radius-md);
446
+ background: linear-gradient(135deg, var(--bg-accent) 0%, var(--bg-tertiary) 100%);
447
+ border-radius: var(--radius-lg);
448
+ box-shadow: inset 0 2px 4px rgba(15, 23, 42, 0.05);
449
+ transition: all var(--transition-base);
450
+ }
451
+
452
+ .stat-card:hover .stat-icon {
453
+ transform: scale(1.1) rotate(5deg);
281
454
  }
282
455
 
283
456
  .stat-content {
@@ -291,9 +464,10 @@ body {
291
464
  }
292
465
 
293
466
  .stat-value {
294
- font-size: 24px;
467
+ font-size: 28px;
295
468
  font-weight: 700;
296
469
  color: var(--text-primary);
470
+ letter-spacing: -0.02em;
297
471
  }
298
472
 
299
473
  /* Charts Grid */
@@ -305,17 +479,34 @@ body {
305
479
 
306
480
  .chart-card {
307
481
  background: var(--bg-primary);
308
- border-radius: var(--radius-md);
309
- padding: 24px;
310
- box-shadow: var(--shadow-sm);
311
- border: 1px solid var(--border-color);
482
+ border-radius: var(--radius-lg);
483
+ padding: 28px;
484
+ box-shadow: 0 2px 8px rgba(15, 23, 42, 0.06);
485
+ border: 1.5px solid var(--border-color);
486
+ transition: all var(--transition-base);
487
+ }
488
+
489
+ .chart-card:hover {
490
+ box-shadow: 0 8px 24px rgba(15, 23, 42, 0.10);
312
491
  }
313
492
 
314
493
  .chart-card h3 {
315
494
  font-size: 18px;
316
- font-weight: 600;
317
- margin-bottom: 20px;
495
+ font-weight: 700;
496
+ margin-bottom: 24px;
318
497
  color: var(--text-primary);
498
+ letter-spacing: -0.01em;
499
+ display: flex;
500
+ align-items: center;
501
+ gap: 8px;
502
+ }
503
+
504
+ .chart-card h3::before {
505
+ content: '';
506
+ width: 4px;
507
+ height: 20px;
508
+ background: linear-gradient(to bottom, var(--primary-color), var(--secondary-color));
509
+ border-radius: 2px;
319
510
  }
320
511
 
321
512
  .chart-container {
@@ -323,20 +514,29 @@ body {
323
514
  height: 300px;
324
515
  }
325
516
 
326
- /* Recommendations Section */
517
+ /* Recommendations Section - Enhanced */
327
518
  .recommendations-section {
328
519
  background: var(--bg-primary);
329
- border-radius: var(--radius-md);
330
- padding: 30px;
331
- box-shadow: var(--shadow-sm);
332
- border: 1px solid var(--border-color);
520
+ border-radius: var(--radius-xl);
521
+ padding: 36px;
522
+ box-shadow: 0 2px 8px rgba(15, 23, 42, 0.06);
523
+ border: 1.5px solid var(--border-color);
333
524
  }
334
525
 
335
526
  .recommendations-section h2 {
336
- font-size: 20px;
527
+ font-size: 22px;
337
528
  font-weight: 700;
338
- margin-bottom: 24px;
529
+ margin-bottom: 28px;
339
530
  color: var(--text-primary);
531
+ letter-spacing: -0.02em;
532
+ display: flex;
533
+ align-items: center;
534
+ gap: 12px;
535
+ }
536
+
537
+ .recommendations-section h2::before {
538
+ content: '💡';
539
+ font-size: 24px;
340
540
  }
341
541
 
342
542
  .recommendations-list {
@@ -346,16 +546,36 @@ body {
346
546
  }
347
547
 
348
548
  .recommendation-item {
349
- background: var(--bg-secondary);
350
- border-radius: var(--radius-md);
351
- padding: 20px;
352
- border: 2px solid var(--border-color);
353
- transition: all 0.2s;
549
+ background: var(--bg-primary);
550
+ border-radius: var(--radius-lg);
551
+ padding: 24px;
552
+ border: 2px solid var(--border-light);
553
+ transition: all var(--transition-base);
554
+ position: relative;
555
+ overflow: hidden;
556
+ }
557
+
558
+ .recommendation-item::before {
559
+ content: '';
560
+ position: absolute;
561
+ top: 0;
562
+ left: 0;
563
+ width: 100%;
564
+ height: 4px;
565
+ background: linear-gradient(90deg, var(--primary-color), var(--success-color));
566
+ transform: scaleX(0);
567
+ transform-origin: left;
568
+ transition: transform var(--transition-base);
354
569
  }
355
570
 
356
571
  .recommendation-item:hover {
357
- border-color: var(--primary-color);
358
- box-shadow: var(--shadow-md);
572
+ border-color: var(--primary-light);
573
+ box-shadow: 0 8px 24px rgba(14, 165, 233, 0.15);
574
+ transform: translateY(-2px);
575
+ }
576
+
577
+ .recommendation-item:hover::before {
578
+ transform: scaleX(1);
359
579
  }
360
580
 
361
581
  .recommendation-header {
@@ -375,12 +595,15 @@ body {
375
595
  }
376
596
 
377
597
  .recommendation-impact {
378
- background: var(--success-color);
598
+ background: linear-gradient(135deg, var(--success-color), var(--success-hover));
379
599
  color: white;
380
- padding: 4px 12px;
381
- border-radius: 12px;
382
- font-size: 14px;
383
- font-weight: 600;
600
+ padding: 6px 14px;
601
+ border-radius: 14px;
602
+ font-size: 13px;
603
+ font-weight: 700;
604
+ text-transform: uppercase;
605
+ letter-spacing: 0.05em;
606
+ box-shadow: 0 2px 8px rgba(16, 185, 129, 0.3);
384
607
  }
385
608
 
386
609
  .recommendation-description {
@@ -403,13 +626,13 @@ body {
403
626
  gap: 10px;
404
627
  }
405
628
 
406
- /* Details Section */
629
+ /* Details Section - Enhanced */
407
630
  .details-section {
408
631
  background: var(--bg-primary);
409
- border-radius: var(--radius-md);
632
+ border-radius: var(--radius-xl);
410
633
  padding: 0;
411
- box-shadow: var(--shadow-sm);
412
- border: 1px solid var(--border-color);
634
+ box-shadow: 0 2px 8px rgba(15, 23, 42, 0.06);
635
+ border: 1.5px solid var(--border-color);
413
636
  overflow: hidden;
414
637
  }
415
638
 
@@ -573,3 +796,454 @@ body {
573
796
  .text-warning { color: var(--warning-color); }
574
797
  .text-danger { color: var(--danger-color); }
575
798
  .text-primary { color: var(--primary-color); }
799
+ /* OpenRouter Integration Section */
800
+ /* OpenRouter Section - Enhanced Professional Design */
801
+ .openrouter-section {
802
+ margin-bottom: 36px;
803
+ }
804
+
805
+ .openrouter-card {
806
+ background: linear-gradient(135deg, var(--bg-primary) 0%, var(--bg-accent) 100%);
807
+ border-radius: var(--radius-xl);
808
+ padding: 32px;
809
+ box-shadow: 0 4px 16px rgba(14, 165, 233, 0.12);
810
+ border: 1.5px solid var(--border-color);
811
+ transition: all var(--transition-base);
812
+ }
813
+
814
+ .openrouter-card:hover {
815
+ box-shadow: 0 8px 32px rgba(14, 165, 233, 0.18);
816
+ border-color: var(--primary-light);
817
+ }
818
+
819
+ .openrouter-header {
820
+ display: flex;
821
+ justify-content: space-between;
822
+ align-items: center;
823
+ margin-bottom: 24px;
824
+ padding-bottom: 20px;
825
+ border-bottom: 2px solid var(--border-light);
826
+ }
827
+
828
+ .openrouter-header h3 {
829
+ font-size: 22px;
830
+ font-weight: 700;
831
+ color: var(--text-primary);
832
+ letter-spacing: -0.02em;
833
+ display: flex;
834
+ align-items: center;
835
+ gap: 10px;
836
+ }
837
+
838
+ .openrouter-header h3::before {
839
+ content: '🔌';
840
+ font-size: 24px;
841
+ }
842
+
843
+ .btn-config {
844
+ background: linear-gradient(135deg, var(--secondary-color), var(--secondary-hover));
845
+ color: white;
846
+ border: none;
847
+ padding: 10px 20px;
848
+ border-radius: var(--radius-md);
849
+ font-size: 14px;
850
+ font-weight: 600;
851
+ cursor: pointer;
852
+ transition: all var(--transition-base);
853
+ box-shadow: 0 4px 12px rgba(139, 92, 246, 0.25);
854
+ display: flex;
855
+ align-items: center;
856
+ gap: 6px;
857
+ }
858
+
859
+ .btn-config:hover {
860
+ background: linear-gradient(135deg, var(--secondary-hover), #6d28d9);
861
+ transform: translateY(-2px);
862
+ box-shadow: 0 6px 20px rgba(139, 92, 246, 0.35);
863
+ }
864
+
865
+ .btn-config:active {
866
+ transform: translateY(0);
867
+ }
868
+
869
+ .openrouter-loading,
870
+ .openrouter-notice,
871
+ .openrouter-error {
872
+ text-align: center;
873
+ padding: 40px 20px;
874
+ }
875
+
876
+ .openrouter-notice {
877
+ background: linear-gradient(135deg, var(--primary-color) 0%, var(--primary-hover) 100%);
878
+ color: white;
879
+ border-radius: var(--radius-lg);
880
+ padding: 32px;
881
+ border: 1px solid rgba(255, 255, 255, 0.2);
882
+ box-shadow: 0 4px 16px rgba(14, 165, 233, 0.25);
883
+ }
884
+
885
+ .openrouter-notice p {
886
+ margin-bottom: 20px;
887
+ font-size: 15px;
888
+ line-height: 1.6;
889
+ font-weight: 500;
890
+ }
891
+
892
+ .openrouter-error {
893
+ background: #fee2e2;
894
+ color: #991b1b;
895
+ border-radius: var(--radius-md);
896
+ }
897
+
898
+ .openrouter-data {
899
+ display: flex;
900
+ flex-direction: column;
901
+ gap: 20px;
902
+ }
903
+
904
+ .usage-grid {
905
+ display: grid;
906
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
907
+ gap: 16px;
908
+ }
909
+
910
+ .usage-item {
911
+ background: linear-gradient(135deg, var(--bg-secondary) 0%, var(--bg-tertiary) 100%);
912
+ padding: 20px;
913
+ border-radius: var(--radius-lg);
914
+ border: 1.5px solid var(--border-light);
915
+ transition: all var(--transition-base);
916
+ }
917
+
918
+ .usage-item:hover {
919
+ transform: translateY(-2px);
920
+ box-shadow: 0 4px 12px rgba(15, 23, 42, 0.08);
921
+ border-color: var(--border-accent);
922
+ }
923
+
924
+ .usage-label {
925
+ font-size: 13px;
926
+ color: var(--text-secondary);
927
+ margin-bottom: 8px;
928
+ font-weight: 500;
929
+ }
930
+
931
+ .usage-value {
932
+ font-size: 28px;
933
+ font-weight: 700;
934
+ color: var(--text-primary);
935
+ letter-spacing: -0.02em;
936
+ }
937
+
938
+ .usage-value.highlight {
939
+ color: var(--primary-color);
940
+ text-shadow: 0 2px 8px rgba(14, 165, 233, 0.15);
941
+ }
942
+
943
+ /* Comparison Section - Enhanced Data Display */
944
+ .comparison-section {
945
+ background: linear-gradient(135deg, var(--bg-accent) 0%, var(--bg-tertiary) 100%);
946
+ padding: 28px;
947
+ border-radius: var(--radius-lg);
948
+ border: 1.5px solid var(--border-light);
949
+ box-shadow: inset 0 2px 4px rgba(15, 23, 42, 0.03);
950
+ }
951
+
952
+ .comparison-section h4 {
953
+ font-size: 18px;
954
+ font-weight: 700;
955
+ margin-bottom: 20px;
956
+ color: var(--text-primary);
957
+ letter-spacing: -0.01em;
958
+ display: flex;
959
+ align-items: center;
960
+ gap: 8px;
961
+ }
962
+
963
+ .comparison-section h4::before {
964
+ content: '🔍';
965
+ font-size: 20px;
966
+ }
967
+
968
+ .comparison-grid {
969
+ display: flex;
970
+ flex-direction: column;
971
+ gap: 12px;
972
+ }
973
+
974
+ .comparison-item {
975
+ display: flex;
976
+ justify-content: space-between;
977
+ align-items: center;
978
+ padding: 16px 18px;
979
+ background: white;
980
+ border-radius: var(--radius-md);
981
+ border: 1.5px solid var(--border-light);
982
+ transition: all var(--transition-base);
983
+ }
984
+
985
+ .comparison-item:hover {
986
+ border-color: var(--primary-light);
987
+ box-shadow: 0 2px 8px rgba(14, 165, 233, 0.1);
988
+ transform: translateX(4px);
989
+ }
990
+
991
+ .comparison-label {
992
+ font-size: 14px;
993
+ color: var(--text-secondary);
994
+ font-weight: 500;
995
+ }
996
+
997
+ .comparison-value {
998
+ font-size: 18px;
999
+ font-weight: 700;
1000
+ color: var(--text-primary);
1001
+ font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', monospace;
1002
+ letter-spacing: -0.01em;
1003
+ }
1004
+
1005
+ .comparison-value.positive {
1006
+ color: var(--success-color);
1007
+ text-shadow: 0 1px 4px rgba(16, 185, 129, 0.2);
1008
+ }
1009
+
1010
+ .comparison-value.negative {
1011
+ color: var(--danger-color);
1012
+ text-shadow: 0 1px 4px rgba(220, 38, 38, 0.2);
1013
+ }
1014
+
1015
+ .comparison-note {
1016
+ margin-top: 20px;
1017
+ padding: 16px 18px;
1018
+ background: linear-gradient(135deg, #dbeafe 0%, #bfdbfe 100%);
1019
+ border-left: 4px solid var(--primary-color);
1020
+ border-radius: var(--radius-md);
1021
+ font-size: 14px;
1022
+ color: #0c4a6e;
1023
+ font-weight: 500;
1024
+ line-height: 1.6;
1025
+ box-shadow: inset 0 1px 2px rgba(14, 165, 233, 0.1);
1026
+ }
1027
+
1028
+ .openrouter-footer {
1029
+ display: flex;
1030
+ justify-content: space-between;
1031
+ align-items: center;
1032
+ margin-top: 16px;
1033
+ padding-top: 16px;
1034
+ border-top: 1px solid var(--border-color);
1035
+ }
1036
+
1037
+ .openrouter-footer small {
1038
+ color: var(--text-secondary);
1039
+ font-size: 12px;
1040
+ }
1041
+
1042
+ .btn-link {
1043
+ background: none;
1044
+ border: none;
1045
+ color: var(--secondary-color);
1046
+ cursor: pointer;
1047
+ font-size: 14px;
1048
+ font-weight: 500;
1049
+ padding: 4px 8px;
1050
+ transition: color 0.2s;
1051
+ }
1052
+
1053
+ .btn-link:hover {
1054
+ color: #2563eb;
1055
+ text-decoration: underline;
1056
+ }
1057
+
1058
+ /* Modal - Enhanced Professional Design */
1059
+ .modal {
1060
+ display: none;
1061
+ position: fixed;
1062
+ top: 0;
1063
+ left: 0;
1064
+ width: 100%;
1065
+ height: 100%;
1066
+ background: rgba(15, 23, 42, 0.6);
1067
+ z-index: 1000;
1068
+ align-items: center;
1069
+ justify-content: center;
1070
+ backdrop-filter: blur(8px);
1071
+ animation: fadeIn var(--transition-base);
1072
+ }
1073
+
1074
+ @keyframes fadeIn {
1075
+ from { opacity: 0; }
1076
+ to { opacity: 1; }
1077
+ }
1078
+
1079
+ .modal-content {
1080
+ background: white;
1081
+ border-radius: var(--radius-xl);
1082
+ box-shadow: 0 25px 50px -12px rgba(15, 23, 42, 0.25);
1083
+ max-width: 540px;
1084
+ width: 90%;
1085
+ max-height: 90vh;
1086
+ overflow: auto;
1087
+ animation: slideUp var(--transition-slow);
1088
+ border: 1.5px solid var(--border-light);
1089
+ }
1090
+
1091
+ @keyframes slideUp {
1092
+ from { transform: translateY(20px); opacity: 0; }
1093
+ to { transform: translateY(0); opacity: 1; }
1094
+ }
1095
+
1096
+ .modal-header {
1097
+ display: flex;
1098
+ justify-content: space-between;
1099
+ align-items: center;
1100
+ padding: 28px 28px 24px;
1101
+ border-bottom: 1.5px solid var(--border-light);
1102
+ background: linear-gradient(135deg, var(--bg-primary) 0%, var(--bg-accent) 100%);
1103
+ }
1104
+
1105
+ .modal-header h2 {
1106
+ font-size: 22px;
1107
+ font-weight: 700;
1108
+ color: var(--text-primary);
1109
+ letter-spacing: -0.02em;
1110
+ }
1111
+
1112
+ .modal-close {
1113
+ background: var(--bg-tertiary);
1114
+ border: 1.5px solid var(--border-light);
1115
+ font-size: 24px;
1116
+ color: var(--text-secondary);
1117
+ cursor: pointer;
1118
+ padding: 0;
1119
+ width: 36px;
1120
+ height: 36px;
1121
+ display: flex;
1122
+ align-items: center;
1123
+ justify-content: center;
1124
+ border-radius: var(--radius-md);
1125
+ transition: all var(--transition-base);
1126
+ }
1127
+
1128
+ .modal-close:hover {
1129
+ background: var(--danger-light);
1130
+ color: var(--danger-color);
1131
+ border-color: var(--danger-color);
1132
+ transform: rotate(90deg);
1133
+ }
1134
+
1135
+ .modal-body {
1136
+ padding: 28px;
1137
+ }
1138
+
1139
+ .modal-body p {
1140
+ margin-bottom: 24px;
1141
+ color: var(--text-secondary);
1142
+ font-size: 15px;
1143
+ line-height: 1.6;
1144
+ }
1145
+
1146
+ .form-group {
1147
+ margin-bottom: 20px;
1148
+ }
1149
+
1150
+ .form-group label {
1151
+ display: block;
1152
+ margin-bottom: 10px;
1153
+ font-weight: 600;
1154
+ color: var(--text-primary);
1155
+ font-size: 15px;
1156
+ letter-spacing: -0.01em;
1157
+ }
1158
+
1159
+ .api-key-input {
1160
+ width: 100%;
1161
+ padding: 14px 16px;
1162
+ border: 2px solid var(--border-color);
1163
+ border-radius: var(--radius-md);
1164
+ font-size: 14px;
1165
+ font-family: 'SF Mono', 'Monaco', 'Courier New', monospace;
1166
+ transition: all var(--transition-base);
1167
+ background: var(--bg-secondary);
1168
+ }
1169
+
1170
+ .api-key-input:focus {
1171
+ outline: none;
1172
+ border-color: var(--primary-color);
1173
+ background: white;
1174
+ box-shadow: 0 0 0 4px rgba(14, 165, 233, 0.1);
1175
+ }
1176
+
1177
+ .form-hint {
1178
+ display: block;
1179
+ margin-top: 6px;
1180
+ font-size: 12px;
1181
+ color: var(--text-secondary);
1182
+ font-style: italic;
1183
+ }
1184
+
1185
+ .config-status {
1186
+ min-height: 40px;
1187
+ }
1188
+
1189
+ .status-error,
1190
+ .status-success,
1191
+ .status-loading {
1192
+ padding: 14px 16px;
1193
+ border-radius: var(--radius-md);
1194
+ margin-bottom: 20px;
1195
+ font-size: 14px;
1196
+ font-weight: 500;
1197
+ display: flex;
1198
+ align-items: center;
1199
+ gap: 10px;
1200
+ animation: slideDown var(--transition-base);
1201
+ }
1202
+
1203
+ @keyframes slideDown {
1204
+ from { transform: translateY(-10px); opacity: 0; }
1205
+ to { transform: translateY(0); opacity: 1; }
1206
+ }
1207
+
1208
+ .status-error {
1209
+ background: linear-gradient(135deg, #fee2e2 0%, #fecaca 100%);
1210
+ color: #991b1b;
1211
+ border: 1.5px solid #fca5a5;
1212
+ }
1213
+
1214
+ .status-error::before {
1215
+ content: '⚠️';
1216
+ font-size: 18px;
1217
+ }
1218
+
1219
+ .status-success {
1220
+ background: linear-gradient(135deg, #d1fae5 0%, #a7f3d0 100%);
1221
+ color: #065f46;
1222
+ border: 1.5px solid #6ee7b7;
1223
+ }
1224
+
1225
+ .status-success::before {
1226
+ content: '✅';
1227
+ font-size: 18px;
1228
+ }
1229
+
1230
+ .status-loading {
1231
+ background: linear-gradient(135deg, #dbeafe 0%, #bfdbfe 100%);
1232
+ color: #1e40af;
1233
+ border: 1.5px solid #93c5fd;
1234
+ }
1235
+
1236
+ .status-loading::before {
1237
+ content: '⏳';
1238
+ font-size: 18px;
1239
+ animation: pulse 1.5s ease-in-out infinite;
1240
+ }
1241
+
1242
+ .modal-footer {
1243
+ display: flex;
1244
+ justify-content: flex-end;
1245
+ gap: 12px;
1246
+ padding: 24px 28px;
1247
+ border-top: 1.5px solid var(--border-light);
1248
+ background: var(--bg-secondary);
1249
+ }