openclaw-smartmeter 0.3.0 → 0.4.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.
@@ -1,1249 +1,1445 @@
1
- /* Reset and Base Styles */
2
- * {
3
- margin: 0;
4
- padding: 0;
5
- box-sizing: border-box;
6
- }
7
-
1
+ /* ===== SmartMeter Dashboard Design Tokens ===== */
8
2
  :root {
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;
19
- --warning-color: #f59e0b;
20
- --warning-light: #fef3c7;
21
- --success-color: #10b981;
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 */
32
- --bg-primary: #ffffff;
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);
70
- }
71
-
72
- body {
73
- font-family: -apple-system, BlinkMacSystemFont, 'Inter', 'Segoe UI', 'Roboto', 'Helvetica Neue',
74
- sans-serif;
75
- -webkit-font-smoothing: antialiased;
76
- -moz-osx-font-smoothing: grayscale;
77
- background: linear-gradient(to bottom, #f8fafc 0%, #f1f5f9 100%);
78
- color: var(--text-primary);
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;
92
- }
93
-
94
- .container {
95
- max-width: 1400px;
96
- margin: 0 auto;
97
- padding: 0;
98
- }
99
-
100
- /* Header - Enhanced Professional Design */
101
- .header {
102
- background: rgba(255, 255, 255, 0.95);
103
- border-bottom: 1px solid var(--border-color);
104
- padding: var(--space-lg) var(--space-2xl);
105
- backdrop-filter: blur(12px) saturate(180%);
106
- position: sticky;
107
- top: 0;
108
- z-index: 100;
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);
115
- }
116
-
117
- .header-content {
118
- display: flex;
119
- justify-content: space-between;
120
- align-items: center;
121
- }
122
-
123
- .logo {
124
- display: flex;
125
- align-items: center;
126
- gap: 16px;
127
- }
128
-
129
- .logo-text h1 {
130
- font-size: 24px;
131
- font-weight: 700;
132
- color: var(--text-primary);
133
- margin: 0;
134
- letter-spacing: -0.02em;
135
- }
136
-
137
- .logo-text p {
138
- font-size: 13px;
139
- color: var(--text-secondary);
140
- margin: 0;
141
- letter-spacing: 0.01em;
142
- font-weight: 500;
143
- }
144
-
145
- .header-actions {
146
- display: flex;
147
- align-items: center;
148
- gap: 20px;
149
- }
150
-
151
- .last-updated {
152
- font-size: 14px;
153
- color: var(--text-secondary);
3
+ /* Palette */
4
+ --bg: #0f1117;
5
+ --bg-surface: #161822;
6
+ --bg-card: #1c1f2e;
7
+ --bg-card-hover: #242838;
8
+ --bg-input: #1a1d2b;
9
+ --border: #2a2e3f;
10
+ --border-light: #333752;
11
+
12
+ /* Text */
13
+ --text-primary: #e4e6f0;
14
+ --text-secondary: #8b90a5;
15
+ --text-muted: #5d6178;
16
+ --text-inverse: #0f1117;
17
+
18
+ /* Accents */
19
+ --accent: #6366f1;
20
+ --accent-hover: #818cf8;
21
+ --accent-subtle: rgba(99,102,241,.12);
22
+
23
+ --green: #22c55e;
24
+ --green-subtle: rgba(34,197,94,.12);
25
+ --red: #ef4444;
26
+ --red-subtle: rgba(239,68,68,.12);
27
+ --amber: #f59e0b;
28
+ --amber-subtle: rgba(245,158,11,.12);
29
+ --sky: #38bdf8;
30
+ --sky-subtle: rgba(56,189,248,.12);
31
+
32
+ /* Radii / Spacing */
33
+ --radius-sm: 6px;
34
+ --radius: 10px;
35
+ --radius-lg: 14px;
36
+ --radius-xl: 18px;
37
+ --sidebar-w: 240px;
38
+
39
+ /* Fonts */
40
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
41
+ --font-mono: 'JetBrains Mono', 'Fira Code', 'Cascadia Code', 'SF Mono', monospace;
42
+
43
+ /* Shadows */
44
+ --shadow-sm: 0 1px 2px rgba(0,0,0,.3);
45
+ --shadow: 0 4px 16px rgba(0,0,0,.35);
46
+ --shadow-lg: 0 8px 30px rgba(0,0,0,.45);
47
+ }
48
+
49
+ /* ===== Reset & Base ===== */
50
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
51
+
52
+ html, body {
53
+ height: 100%;
54
+ font-family: var(--font-sans);
55
+ font-size: 14px;
56
+ color: var(--text-primary);
57
+ background: var(--bg);
58
+ -webkit-font-smoothing: antialiased;
59
+ overflow: hidden;
60
+ }
61
+
62
+ body { display: flex; }
63
+
64
+ a { color: var(--accent); text-decoration: none; }
65
+ a:hover { color: var(--accent-hover); }
66
+
67
+ /* ===== Sidebar ===== */
68
+ .sidebar {
69
+ position: fixed; top: 0; left: 0; bottom: 0;
70
+ width: var(--sidebar-w);
71
+ background: var(--bg-surface);
72
+ border-right: 1px solid var(--border);
73
+ display: flex;
74
+ flex-direction: column;
75
+ z-index: 90;
76
+ transition: transform .25s ease;
77
+ }
78
+
79
+ .sidebar-brand {
80
+ display: flex;
81
+ align-items: center;
82
+ gap: 10px;
83
+ padding: 20px 18px 24px;
84
+ }
85
+ .brand-icon { flex-shrink: 0; }
86
+ .brand-text {
87
+ font-size: 17px;
88
+ font-weight: 700;
89
+ letter-spacing: -.02em;
90
+ color: var(--text-primary);
91
+ }
92
+
93
+ .sidebar-nav {
94
+ flex: 1;
95
+ display: flex;
96
+ flex-direction: column;
97
+ gap: 2px;
98
+ padding: 0 10px;
99
+ }
100
+
101
+ .nav-item {
102
+ display: flex;
103
+ align-items: center;
104
+ gap: 10px;
105
+ padding: 10px 12px;
106
+ border-radius: var(--radius-sm);
107
+ color: var(--text-secondary);
108
+ font-size: 13.5px;
109
+ font-weight: 500;
110
+ cursor: pointer;
111
+ transition: all .15s;
112
+ }
113
+ .nav-item:hover {
114
+ background: var(--accent-subtle);
115
+ color: var(--text-primary);
116
+ }
117
+ .nav-item.active {
118
+ background: var(--accent-subtle);
119
+ color: var(--accent);
120
+ font-weight: 600;
121
+ }
122
+
123
+ .sidebar-footer {
124
+ display: flex;
125
+ align-items: center;
126
+ justify-content: space-between;
127
+ padding: 14px 18px;
128
+ border-top: 1px solid var(--border);
129
+ }
130
+ .sidebar-version {
131
+ font-size: 11px;
132
+ color: var(--text-muted);
133
+ font-family: var(--font-mono);
134
+ }
135
+
136
+ /* ===== Main ===== */
137
+ .main {
138
+ margin-left: var(--sidebar-w);
139
+ flex: 1;
140
+ display: flex;
141
+ flex-direction: column;
142
+ height: 100vh;
143
+ overflow-y: auto;
144
+ scroll-behavior: smooth;
145
+ }
146
+
147
+ /* ===== Top Bar ===== */
148
+ .topbar {
149
+ position: sticky; top: 0;
150
+ display: flex;
151
+ align-items: center;
152
+ gap: 12px;
153
+ padding: 14px 28px;
154
+ background: rgba(15,17,23,.85);
155
+ backdrop-filter: blur(12px);
156
+ border-bottom: 1px solid var(--border);
157
+ z-index: 80;
158
+ }
159
+ .btn-hamburger {
160
+ display: none;
161
+ background: none; border: none; color: var(--text-secondary); cursor: pointer;
162
+ }
163
+ .topbar-title {
164
+ font-size: 16px;
165
+ font-weight: 600;
166
+ color: var(--text-primary);
167
+ }
168
+ .topbar-actions {
169
+ margin-left: auto;
170
+ display: flex;
171
+ align-items: center;
172
+ gap: 12px;
173
+ }
174
+ .last-updated-text {
175
+ font-size: 12px;
176
+ color: var(--text-muted);
177
+ }
178
+
179
+ /* Badge */
180
+ .badge {
181
+ display: inline-flex;
182
+ align-items: center;
183
+ gap: 6px;
184
+ padding: 3px 10px;
185
+ border-radius: 50px;
186
+ font-size: 11px;
187
+ font-weight: 600;
188
+ text-transform: uppercase;
189
+ letter-spacing: .04em;
190
+ }
191
+ .badge-live {
192
+ background: var(--green-subtle);
193
+ color: var(--green);
194
+ }
195
+ .pulse-dot {
196
+ width: 7px; height: 7px;
197
+ border-radius: 50%;
198
+ background: var(--green);
199
+ animation: pulse 1.5s infinite;
154
200
  }
155
-
156
- /* Buttons */
157
- .btn-refresh {
158
- display: flex;
159
- align-items: center;
160
- gap: 6px;
161
- padding: 8px 16px;
162
- background: var(--bg-primary);
163
- border: 1.5px solid var(--border-color);
164
- border-radius: var(--radius-sm);
165
- font-size: 14px;
166
- font-weight: 500;
167
- color: var(--text-primary);
168
- cursor: pointer;
169
- transition: all var(--transition-base);
170
- box-shadow: var(--shadow-xs);
171
- }
172
-
173
- .btn-refresh:hover {
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);
182
- }
183
-
201
+ @keyframes pulse {
202
+ 0%, 100% { opacity: 1; transform: scale(1); }
203
+ 50% { opacity: .4; transform: scale(.85); }
204
+ }
205
+
206
+ /* ===== Page Sections ===== */
207
+ .page-section {
208
+ display: none;
209
+ padding: 28px;
210
+ animation: fadeIn .25s ease;
211
+ }
212
+ .page-section.active { display: block; }
213
+ @keyframes fadeIn { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: translateY(0); } }
214
+
215
+ .section-header {
216
+ display: flex;
217
+ align-items: flex-start;
218
+ justify-content: space-between;
219
+ margin-bottom: 24px;
220
+ gap: 16px;
221
+ flex-wrap: wrap;
222
+ }
223
+ .section-header h2 {
224
+ font-size: 20px;
225
+ font-weight: 700;
226
+ color: var(--text-primary);
227
+ }
228
+ .section-subtitle {
229
+ font-size: 13px;
230
+ color: var(--text-secondary);
231
+ margin-top: 4px;
232
+ }
233
+ .section-actions { display: flex; gap: 8px; align-items: center; }
234
+
235
+ /* ===== Alert ===== */
236
+ .alert {
237
+ display: flex;
238
+ align-items: flex-start;
239
+ gap: 12px;
240
+ padding: 14px 18px;
241
+ border-radius: var(--radius);
242
+ margin-bottom: 20px;
243
+ font-size: 13px;
244
+ line-height: 1.5;
245
+ }
246
+ .alert-info {
247
+ background: var(--sky-subtle);
248
+ border: 1px solid rgba(56,189,248,.2);
249
+ color: var(--sky);
250
+ }
251
+ .alert-info strong { color: var(--text-primary); }
252
+ .alert-info p { color: var(--text-secondary); margin-top: 2px; }
253
+
254
+ /* ===== How It Works Banner ===== */
255
+ .how-it-works-banner {
256
+ background: var(--bg-card);
257
+ border: 1px solid var(--border);
258
+ border-radius: var(--radius-lg);
259
+ padding: 22px 24px;
260
+ margin-bottom: 20px;
261
+ }
262
+ .hiw-header {
263
+ display: flex;
264
+ align-items: center;
265
+ gap: 8px;
266
+ font-size: 15px;
267
+ color: var(--text-primary);
268
+ margin-bottom: 10px;
269
+ }
270
+ .hiw-desc {
271
+ font-size: 13px;
272
+ color: var(--text-secondary);
273
+ line-height: 1.6;
274
+ margin-bottom: 16px;
275
+ }
276
+ .hiw-desc strong {
277
+ color: var(--text-primary);
278
+ }
279
+ .hiw-steps {
280
+ display: grid;
281
+ grid-template-columns: repeat(3, 1fr);
282
+ gap: 14px;
283
+ margin-bottom: 14px;
284
+ }
285
+ .hiw-step {
286
+ display: flex;
287
+ gap: 12px;
288
+ padding: 14px;
289
+ background: var(--bg-surface);
290
+ border-radius: var(--radius);
291
+ border: 1px solid var(--border);
292
+ }
293
+ .hiw-step-num {
294
+ flex-shrink: 0;
295
+ width: 28px;
296
+ height: 28px;
297
+ display: flex;
298
+ align-items: center;
299
+ justify-content: center;
300
+ border-radius: 50%;
301
+ background: var(--accent-subtle);
302
+ color: var(--accent);
303
+ font-size: 13px;
304
+ font-weight: 700;
305
+ }
306
+ .hiw-step-title {
307
+ font-size: 13px;
308
+ font-weight: 700;
309
+ color: var(--text-primary);
310
+ margin-bottom: 4px;
311
+ }
312
+ .hiw-step-desc {
313
+ font-size: 12px;
314
+ color: var(--text-muted);
315
+ line-height: 1.5;
316
+ }
317
+ .hiw-note {
318
+ display: flex;
319
+ align-items: center;
320
+ gap: 8px;
321
+ font-size: 12px;
322
+ color: var(--text-muted);
323
+ padding: 10px 14px;
324
+ background: var(--amber-subtle);
325
+ border-radius: var(--radius-sm);
326
+ border: 1px solid rgba(245,158,11,.15);
327
+ }
328
+ .hiw-note strong {
329
+ color: var(--amber);
330
+ }
331
+ .hiw-note a {
332
+ color: var(--amber);
333
+ font-weight: 600;
334
+ text-decoration: underline;
335
+ text-underline-offset: 2px;
336
+ }
337
+ .hiw-note svg {
338
+ flex-shrink: 0;
339
+ color: var(--amber);
340
+ }
341
+
342
+ /* ===== Model Rec Explainer ===== */
343
+ .model-rec-explainer {
344
+ background: var(--bg-surface);
345
+ border: 1px solid var(--border);
346
+ border-radius: var(--radius);
347
+ padding: 14px 18px;
348
+ margin-bottom: 16px;
349
+ }
350
+ .model-rec-explainer p {
351
+ font-size: 13px;
352
+ color: var(--text-secondary);
353
+ line-height: 1.6;
354
+ margin: 0;
355
+ }
356
+ .model-rec-explainer p + p {
357
+ margin-top: 8px;
358
+ }
359
+ .model-rec-explainer strong {
360
+ color: var(--text-primary);
361
+ }
362
+
363
+ /* ===== KPI Row ===== */
364
+ .kpi-row {
365
+ display: grid;
366
+ grid-template-columns: repeat(3, 1fr);
367
+ gap: 16px;
368
+ margin-bottom: 20px;
369
+ }
370
+ .kpi-card {
371
+ background: var(--bg-card);
372
+ border: 1px solid var(--border);
373
+ border-radius: var(--radius-lg);
374
+ padding: 22px 24px;
375
+ transition: transform .15s, box-shadow .15s;
376
+ }
377
+ .kpi-card:hover {
378
+ transform: translateY(-2px);
379
+ box-shadow: var(--shadow);
380
+ }
381
+ .kpi-hero {
382
+ background: linear-gradient(135deg, rgba(99,102,241,.15), rgba(99,102,241,.05));
383
+ border-color: rgba(99,102,241,.25);
384
+ }
385
+ .kpi-success {
386
+ background: linear-gradient(135deg, rgba(34,197,94,.12), rgba(34,197,94,.04));
387
+ border-color: rgba(34,197,94,.2);
388
+ }
389
+ .kpi-label {
390
+ font-size: 12px;
391
+ font-weight: 600;
392
+ text-transform: uppercase;
393
+ letter-spacing: .05em;
394
+ color: var(--text-secondary);
395
+ margin-bottom: 8px;
396
+ }
397
+ .kpi-value {
398
+ font-size: 30px;
399
+ font-weight: 800;
400
+ font-family: var(--font-mono);
401
+ line-height: 1.1;
402
+ color: var(--text-primary);
403
+ }
404
+ .kpi-value small {
405
+ font-size: 14px;
406
+ font-weight: 500;
407
+ color: var(--text-secondary);
408
+ }
409
+ .kpi-sub {
410
+ font-size: 13px;
411
+ color: var(--green);
412
+ font-weight: 600;
413
+ margin-top: 6px;
414
+ }
415
+
416
+ /* ===== Confidence Strip ===== */
417
+ .confidence-strip {
418
+ display: inline-flex;
419
+ align-items: center;
420
+ gap: 8px;
421
+ background: var(--bg-card);
422
+ border: 1px solid var(--border);
423
+ border-radius: 50px;
424
+ padding: 6px 16px;
425
+ font-size: 12px;
426
+ color: var(--text-secondary);
427
+ margin-bottom: 20px;
428
+ }
429
+
430
+ /* ===== Metrics Grid ===== */
431
+ .metrics-grid {
432
+ display: grid;
433
+ grid-template-columns: repeat(4, 1fr);
434
+ gap: 14px;
435
+ margin-bottom: 24px;
436
+ }
437
+ .metric-card {
438
+ display: flex;
439
+ align-items: center;
440
+ gap: 14px;
441
+ background: var(--bg-card);
442
+ border: 1px solid var(--border);
443
+ border-radius: var(--radius);
444
+ padding: 16px 18px;
445
+ }
446
+ .metric-icon {
447
+ font-size: 22px;
448
+ flex-shrink: 0;
449
+ }
450
+ .metric-label {
451
+ font-size: 11px;
452
+ color: var(--text-muted);
453
+ text-transform: uppercase;
454
+ letter-spacing: .04em;
455
+ margin-bottom: 4px;
456
+ }
457
+ .metric-value {
458
+ font-size: 18px;
459
+ font-weight: 700;
460
+ font-family: var(--font-mono);
461
+ }
462
+
463
+ /* ===== Cards ===== */
464
+ .card {
465
+ background: var(--bg-card);
466
+ border: 1px solid var(--border);
467
+ border-radius: var(--radius-lg);
468
+ overflow: hidden;
469
+ }
470
+ .card-header {
471
+ font-size: 13px;
472
+ font-weight: 600;
473
+ text-transform: uppercase;
474
+ letter-spacing: .04em;
475
+ color: var(--text-secondary);
476
+ padding: 16px 20px 0;
477
+ }
478
+
479
+ /* Charts */
480
+ .charts-row {
481
+ display: grid;
482
+ grid-template-columns: 1fr 1fr;
483
+ gap: 16px;
484
+ margin-bottom: 24px;
485
+ }
486
+ .chart-card { padding-bottom: 10px; }
487
+ .chart-wrap {
488
+ padding: 12px 16px 8px;
489
+ height: 260px;
490
+ position: relative;
491
+ }
492
+ .chart-wrap canvas { width: 100% !important; height: 100% !important; }
493
+
494
+ /* ===== Actions Bar ===== */
495
+ .actions-bar {
496
+ display: flex;
497
+ gap: 10px;
498
+ flex-wrap: wrap;
499
+ }
500
+
501
+ /* ===== Buttons ===== */
184
502
  .btn {
185
- padding: 12px 24px;
186
- border-radius: var(--radius-md);
187
- font-size: 15px;
188
- font-weight: 600;
189
- cursor: pointer;
190
- transition: all 0.2s;
191
- border: none;
192
- display: inline-flex;
193
- align-items: center;
194
- gap: 8px;
503
+ display: inline-flex;
504
+ align-items: center;
505
+ gap: 6px;
506
+ padding: 9px 18px;
507
+ border-radius: var(--radius-sm);
508
+ font-size: 13px;
509
+ font-weight: 600;
510
+ border: none;
511
+ cursor: pointer;
512
+ transition: all .15s;
513
+ white-space: nowrap;
195
514
  }
196
-
197
515
  .btn-primary {
198
- background: linear-gradient(135deg, var(--primary-color) 0%, var(--primary-hover) 100%);
199
- color: white;
200
- box-shadow: 0 4px 12px rgba(14, 165, 233, 0.3);
201
- border: none;
202
- }
203
-
204
- .btn-primary:hover {
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);
212
- }
213
-
214
- .btn-secondary {
215
- background: var(--bg-primary);
216
- color: var(--text-primary);
217
- border: 1px solid var(--border-color);
218
- }
219
-
220
- .btn-secondary:hover {
221
- background: var(--bg-tertiary);
222
- }
223
-
224
- /* Dashboard Main - Enhanced Spacing */
225
- .dashboard {
226
- padding: 48px;
227
- display: flex;
228
- flex-direction: column;
229
- gap: 36px;
230
- max-width: 1600px;
231
- margin: 0 auto;
232
- }
233
-
234
- /* Hero Card - Enhanced Savings Display */
235
- .hero-card {
236
- background: linear-gradient(135deg, var(--success-color) 0%, var(--success-dark) 100%);
237
- border-radius: var(--radius-xl);
238
- padding: 48px;
239
- color: white;
240
- box-shadow: 0 20px 40px rgba(16, 185, 129, 0.25);
241
- position: relative;
242
- overflow: hidden;
243
- border: 1px solid rgba(255, 255, 255, 0.1);
244
- }
245
-
246
- .hero-card::before {
247
- content: '';
248
- position: absolute;
249
- top: -50%;
250
- right: -10%;
251
- width: 400px;
252
- height: 400px;
253
- background: radial-gradient(circle, rgba(255, 255, 255, 0.15) 0%, transparent 70%);
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; }
261
- }
262
-
263
- .savings-display {
264
- text-align: center;
265
- margin-bottom: 30px;
266
- position: relative;
267
- }
268
-
269
- .savings-label {
270
- font-size: 16px;
271
- font-weight: 500;
272
- opacity: 0.9;
273
- margin-bottom: 10px;
274
- }
275
-
276
- .savings-amount {
277
- font-size: 64px;
278
- font-weight: 800;
279
- margin-bottom: 8px;
280
- text-shadow: 0 2px 20px rgba(0, 0, 0, 0.2);
281
- letter-spacing: -0.03em;
282
- }
283
-
284
- .savings-percentage {
285
- font-size: 24px;
286
- font-weight: 600;
287
- opacity: 0.95;
288
- }
289
-
290
- .cost-comparison {
291
- display: flex;
292
- justify-content: center;
293
- align-items: center;
294
- gap: 30px;
295
- margin-bottom: 20px;
296
- }
297
-
298
- .cost-item {
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;
304
- text-align: center;
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);
312
- }
313
-
314
- .cost-label {
315
- font-size: 14px;
316
- font-weight: 500;
317
- opacity: 0.9;
318
- margin-bottom: 8px;
319
- }
320
-
321
- .cost-value {
322
- font-size: 28px;
323
- font-weight: 700;
324
- }
325
-
326
- .cost-arrow {
327
- font-size: 32px;
328
- font-weight: 300;
329
- }
330
-
331
- .confidence-badge {
332
- display: inline-flex;
333
- align-items: center;
334
- gap: 8px;
335
- background: rgba(255, 255, 255, 0.2);
336
- backdrop-filter: blur(10px);
337
- padding: 8px 16px;
338
- border-radius: 20px;
339
- font-size: 14px;
340
- font-weight: 500;
341
- }
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
-
396
- /* Stats Grid */
397
- .stats-grid {
398
- display: grid;
399
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
400
- gap: 20px;
401
- }
402
-
403
- .stat-card {
404
- background: var(--bg-primary);
405
- border-radius: var(--radius-lg);
406
- padding: 28px;
407
- display: flex;
408
- align-items: center;
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);
427
- }
428
-
429
- .stat-card:hover {
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;
437
- }
438
-
439
- .stat-icon {
440
- font-size: 32px;
441
- width: 64px;
442
- height: 64px;
443
- display: flex;
444
- align-items: center;
445
- justify-content: center;
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);
454
- }
455
-
456
- .stat-content {
457
- flex: 1;
458
- }
459
-
460
- .stat-label {
461
- font-size: 14px;
462
- color: var(--text-secondary);
463
- margin-bottom: 4px;
464
- }
465
-
466
- .stat-value {
467
- font-size: 28px;
468
- font-weight: 700;
469
- color: var(--text-primary);
470
- letter-spacing: -0.02em;
471
- }
472
-
473
- /* Charts Grid */
474
- .charts-grid {
475
- display: grid;
476
- grid-template-columns: repeat(auto-fit, minmax(500px, 1fr));
477
- gap: 20px;
478
- }
479
-
480
- .chart-card {
481
- background: var(--bg-primary);
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);
491
- }
492
-
493
- .chart-card h3 {
494
- font-size: 18px;
495
- font-weight: 700;
496
- margin-bottom: 24px;
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;
510
- }
511
-
512
- .chart-container {
513
- position: relative;
514
- height: 300px;
515
- }
516
-
517
- /* Recommendations Section - Enhanced */
518
- .recommendations-section {
519
- background: var(--bg-primary);
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);
524
- }
525
-
526
- .recommendations-section h2 {
527
- font-size: 22px;
528
- font-weight: 700;
529
- margin-bottom: 28px;
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;
540
- }
541
-
542
- .recommendations-list {
543
- display: flex;
544
- flex-direction: column;
545
- gap: 16px;
546
- }
547
-
548
- .recommendation-item {
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);
569
- }
570
-
571
- .recommendation-item:hover {
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);
579
- }
580
-
581
- .recommendation-header {
582
- display: flex;
583
- justify-content: space-between;
584
- align-items: start;
585
- margin-bottom: 12px;
586
- }
587
-
588
- .recommendation-title {
589
- display: flex;
590
- align-items: center;
591
- gap: 10px;
592
- font-size: 16px;
593
- font-weight: 600;
594
- color: var(--text-primary);
595
- }
596
-
597
- .recommendation-impact {
598
- background: linear-gradient(135deg, var(--success-color), var(--success-hover));
599
- color: white;
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);
607
- }
608
-
609
- .recommendation-description {
610
- color: var(--text-secondary);
611
- font-size: 14px;
612
- line-height: 1.6;
613
- margin-bottom: 12px;
614
- }
615
-
616
- .recommendation-details {
617
- display: flex;
618
- gap: 20px;
619
- font-size: 13px;
620
- color: var(--text-secondary);
621
- margin-bottom: 12px;
622
- }
623
-
624
- .recommendation-actions {
625
- display: flex;
626
- gap: 10px;
627
- }
628
-
629
- /* Details Section - Enhanced */
630
- .details-section {
631
- background: var(--bg-primary);
632
- border-radius: var(--radius-xl);
633
- padding: 0;
634
- box-shadow: 0 2px 8px rgba(15, 23, 42, 0.06);
635
- border: 1.5px solid var(--border-color);
636
- overflow: hidden;
637
- }
638
-
639
- .details-tabs {
640
- display: flex;
641
- border-bottom: 1px solid var(--border-color);
642
- background: var(--bg-tertiary);
643
- }
644
-
645
- .tab-btn {
646
- padding: 16px 24px;
647
- background: transparent;
648
- border: none;
649
- font-size: 15px;
650
- font-weight: 500;
651
- color: var(--text-secondary);
652
- cursor: pointer;
653
- border-bottom: 2px solid transparent;
654
- transition: all 0.2s;
655
- }
656
-
657
- .tab-btn:hover {
658
- color: var(--text-primary);
659
- background: rgba(0, 0, 0, 0.02);
516
+ background: var(--accent);
517
+ color: #fff;
518
+ }
519
+ .btn-primary:hover { background: var(--accent-hover); }
520
+ .btn-outline {
521
+ background: transparent;
522
+ color: var(--text-secondary);
523
+ border: 1px solid var(--border);
524
+ }
525
+ .btn-outline:hover {
526
+ background: var(--bg-card);
527
+ color: var(--text-primary);
528
+ border-color: var(--border-light);
529
+ }
530
+ .btn-ghost {
531
+ background: transparent;
532
+ color: var(--text-secondary);
533
+ border: none;
534
+ }
535
+ .btn-ghost:hover { color: var(--text-primary); }
536
+ .btn-sm { padding: 6px 12px; font-size: 12px; }
537
+ .btn-icon {
538
+ background: none;
539
+ border: none;
540
+ color: var(--text-muted);
541
+ cursor: pointer;
542
+ padding: 4px;
543
+ border-radius: var(--radius-sm);
544
+ display: flex;
545
+ align-items: center;
546
+ justify-content: center;
547
+ transition: color .15s, background .15s;
548
+ }
549
+ .btn-icon:hover { color: var(--text-primary); background: var(--accent-subtle); }
550
+
551
+ .btn-danger {
552
+ background: var(--red-subtle);
553
+ color: var(--red);
554
+ border: 1px solid rgba(239,68,68,.2);
555
+ }
556
+ .btn-danger:hover { background: rgba(239,68,68,.2); }
557
+
558
+ .btn-success {
559
+ background: var(--green-subtle);
560
+ color: var(--green);
561
+ border: 1px solid rgba(34,197,94,.2);
562
+ }
563
+ .btn-success:hover { background: rgba(34,197,94,.2); }
564
+
565
+ /* ===== Recommendations ===== */
566
+ .recommendations-grid {
567
+ display: flex;
568
+ flex-direction: column;
569
+ gap: 12px;
570
+ }
571
+
572
+ .rec-card {
573
+ background: var(--bg-card);
574
+ border: 1px solid var(--border);
575
+ border-radius: var(--radius);
576
+ overflow: hidden;
577
+ transition: border-color .15s;
578
+ }
579
+ .rec-card:hover { border-color: var(--border-light); }
580
+ .rec-card.selected { border-color: var(--accent); }
581
+ .rec-card.editing { border-color: var(--amber); }
582
+
583
+ .rec-header {
584
+ display: flex;
585
+ align-items: center;
586
+ gap: 12px;
587
+ padding: 16px 18px;
588
+ cursor: pointer;
589
+ }
590
+ .rec-checkbox {
591
+ width: 18px; height: 18px;
592
+ flex-shrink: 0;
593
+ accent-color: var(--accent);
594
+ cursor: pointer;
595
+ }
596
+ .rec-title-wrap { flex: 1; min-width: 0; }
597
+ .rec-title {
598
+ font-size: 14px;
599
+ font-weight: 600;
600
+ color: var(--text-primary);
601
+ white-space: nowrap;
602
+ overflow: hidden;
603
+ text-overflow: ellipsis;
604
+ }
605
+ .rec-meta {
606
+ font-size: 12px;
607
+ color: var(--text-muted);
608
+ margin-top: 2px;
609
+ }
610
+ .rec-impact-badge {
611
+ display: inline-flex;
612
+ align-items: center;
613
+ padding: 3px 10px;
614
+ border-radius: 50px;
615
+ font-size: 11px;
616
+ font-weight: 700;
617
+ text-transform: uppercase;
618
+ letter-spacing: .04em;
619
+ }
620
+ .impact-high {
621
+ background: var(--green-subtle);
622
+ color: var(--green);
623
+ }
624
+ .impact-medium {
625
+ background: var(--amber-subtle);
626
+ color: var(--amber);
627
+ }
628
+ .impact-low {
629
+ background: var(--sky-subtle);
630
+ color: var(--sky);
631
+ }
632
+ .rec-actions {
633
+ display: flex;
634
+ gap: 6px;
635
+ }
636
+
637
+ /* Expandable body */
638
+ .rec-body {
639
+ display: none;
640
+ padding: 0 18px 16px;
641
+ animation: fadeIn .2s ease;
642
+ }
643
+ .rec-card.expanded .rec-body { display: block; }
644
+
645
+ .rec-description {
646
+ font-size: 13px;
647
+ color: var(--text-secondary);
648
+ line-height: 1.6;
649
+ margin-bottom: 12px;
650
+ }
651
+
652
+ .rec-edit-area {
653
+ display: none;
654
+ }
655
+ .rec-card.editing .rec-edit-area { display: block; }
656
+ .rec-card.editing .rec-description { display: none; }
657
+
658
+ .rec-edit-textarea {
659
+ width: 100%;
660
+ min-height: 80px;
661
+ background: var(--bg-input);
662
+ border: 1px solid var(--border);
663
+ border-radius: var(--radius-sm);
664
+ color: var(--text-primary);
665
+ font-family: var(--font-mono);
666
+ font-size: 12.5px;
667
+ padding: 10px 12px;
668
+ resize: vertical;
669
+ line-height: 1.5;
670
+ }
671
+ .rec-edit-textarea:focus {
672
+ outline: none;
673
+ border-color: var(--accent);
674
+ }
675
+ .rec-edit-actions {
676
+ display: flex;
677
+ gap: 8px;
678
+ margin-top: 10px;
679
+ }
680
+
681
+ .rec-details {
682
+ display: grid;
683
+ grid-template-columns: 1fr 1fr;
684
+ gap: 10px;
685
+ margin-top: 10px;
686
+ }
687
+ .rec-detail-item {
688
+ background: var(--bg-surface);
689
+ border-radius: var(--radius-sm);
690
+ padding: 10px 12px;
691
+ }
692
+ .rec-detail-label {
693
+ font-size: 10px;
694
+ text-transform: uppercase;
695
+ letter-spacing: .06em;
696
+ color: var(--text-muted);
697
+ margin-bottom: 3px;
698
+ }
699
+ .rec-detail-value {
700
+ font-size: 13px;
701
+ font-weight: 600;
702
+ font-family: var(--font-mono);
703
+ color: var(--text-primary);
704
+ }
705
+
706
+ /* ===== Model Table ===== */
707
+ .model-table {
708
+ width: 100%;
709
+ border-collapse: collapse;
710
+ }
711
+ .model-table th {
712
+ text-align: left;
713
+ font-size: 11px;
714
+ font-weight: 600;
715
+ text-transform: uppercase;
716
+ letter-spacing: .05em;
717
+ color: var(--text-muted);
718
+ padding: 12px 16px;
719
+ border-bottom: 1px solid var(--border);
720
+ }
721
+ .model-table td {
722
+ padding: 12px 16px;
723
+ font-size: 13px;
724
+ border-bottom: 1px solid var(--border);
725
+ color: var(--text-secondary);
726
+ }
727
+ .model-table tr:last-child td { border-bottom: none; }
728
+ .model-table tr:hover td { background: var(--bg-card-hover); }
729
+ .model-name {
730
+ font-weight: 600;
731
+ font-family: var(--font-mono);
732
+ color: var(--text-primary);
733
+ font-size: 12.5px;
734
+ }
735
+
736
+ /* ===== OpenRouter Stats ===== */
737
+ .or-stats-grid {
738
+ display: grid;
739
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
740
+ gap: 14px;
741
+ padding: 20px;
742
+ }
743
+ .or-stat-card {
744
+ background: var(--bg-surface);
745
+ border-radius: var(--radius);
746
+ padding: 16px;
747
+ }
748
+ .or-stat-label {
749
+ font-size: 11px;
750
+ color: var(--text-muted);
751
+ text-transform: uppercase;
752
+ letter-spacing: .04em;
753
+ margin-bottom: 6px;
754
+ }
755
+ .or-stat-value {
756
+ font-size: 22px;
757
+ font-weight: 700;
758
+ font-family: var(--font-mono);
759
+ color: var(--text-primary);
760
+ }
761
+
762
+ /* ===== Modals ===== */
763
+ .modal-overlay {
764
+ position: fixed;
765
+ inset: 0;
766
+ background: rgba(0,0,0,.55);
767
+ backdrop-filter: blur(6px);
768
+ display: flex;
769
+ align-items: center;
770
+ justify-content: center;
771
+ z-index: 200;
772
+ animation: fadeIn .15s ease;
660
773
  }
661
-
662
- .tab-btn.active {
663
- color: var(--primary-color);
664
- border-bottom-color: var(--primary-color);
665
- background: var(--bg-primary);
666
- }
667
-
668
- .details-content {
669
- padding: 30px;
670
- }
671
-
672
- /* Actions Footer */
673
- .actions-footer {
674
- background: var(--bg-primary);
675
- border-radius: var(--radius-md);
676
- padding: 30px;
677
- box-shadow: var(--shadow-sm);
678
- border: 1px solid var(--border-color);
679
- }
680
-
681
- .action-buttons {
682
- display: flex;
683
- justify-content: center;
684
- gap: 16px;
685
- margin-bottom: 16px;
686
- }
687
-
688
- .action-info {
689
- text-align: center;
690
- }
691
-
692
- .action-info p {
693
- font-size: 14px;
694
- color: var(--text-secondary);
695
- }
696
-
697
- /* Toast Notifications */
698
- .toast {
699
- position: fixed;
700
- bottom: 30px;
701
- right: 30px;
702
- background: var(--text-primary);
703
- color: white;
704
- padding: 16px 24px;
705
- border-radius: var(--radius-md);
706
- box-shadow: var(--shadow-lg);
707
- display: none;
708
- z-index: 1000;
709
- animation: slideIn 0.3s ease;
710
- }
711
-
712
- .toast.show {
713
- display: block;
714
- }
715
-
716
- @keyframes slideIn {
717
- from {
718
- transform: translateX(400px);
719
- opacity: 0;
720
- }
721
- to {
722
- transform: translateX(0);
723
- opacity: 1;
724
- }
725
- }
726
-
727
- /* Loading Overlay */
728
- .loading-overlay {
729
- position: fixed;
730
- top: 0;
731
- left: 0;
732
- right: 0;
733
- bottom: 0;
734
- background: rgba(255, 255, 255, 0.95);
735
- display: flex;
736
- flex-direction: column;
737
- align-items: center;
738
- justify-content: center;
739
- z-index: 9999;
740
- }
741
-
742
- .loading-overlay.hidden {
743
- display: none;
744
- }
745
-
746
- .loading-spinner {
747
- width: 50px;
748
- height: 50px;
749
- border: 4px solid var(--border-color);
750
- border-top-color: var(--primary-color);
751
- border-radius: 50%;
752
- animation: spin 1s linear infinite;
753
- margin-bottom: 16px;
754
- }
755
-
756
- @keyframes spin {
757
- to { transform: rotate(360deg); }
758
- }
759
-
760
- /* Responsive Design */
761
- @media (max-width: 768px) {
762
- .dashboard {
763
- padding: 20px;
764
- }
765
-
766
- .header {
767
- padding: 16px 20px;
768
- }
769
-
770
- .header-content {
771
- flex-direction: column;
772
- gap: 16px;
773
- }
774
-
775
- .cost-comparison {
776
- flex-direction: column;
777
- gap: 16px;
778
- }
779
-
780
- .charts-grid {
781
- grid-template-columns: 1fr;
782
- }
783
-
784
- .action-buttons {
785
- flex-direction: column;
786
- }
787
-
788
- .btn {
789
- width: 100%;
790
- justify-content: center;
791
- }
792
- }
793
-
794
- /* Utility Classes */
795
- .text-success { color: var(--success-color); }
796
- .text-warning { color: var(--warning-color); }
797
- .text-danger { color: var(--danger-color); }
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
774
  .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; }
775
+ background: var(--bg-surface);
776
+ border: 1px solid var(--border);
777
+ border-radius: var(--radius-xl);
778
+ width: 440px;
779
+ max-width: 92vw;
780
+ box-shadow: var(--shadow-lg);
781
+ animation: modalIn .2s ease;
782
+ }
783
+ .modal-lg { width: 640px; }
784
+ @keyframes modalIn {
785
+ from { opacity: 0; transform: scale(.96) translateY(8px); }
786
+ to { opacity: 1; transform: scale(1) translateY(0); }
1094
787
  }
1095
-
1096
788
  .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%);
789
+ display: flex;
790
+ align-items: center;
791
+ justify-content: space-between;
792
+ padding: 20px 24px 0;
1103
793
  }
1104
-
1105
- .modal-header h2 {
1106
- font-size: 22px;
1107
- font-weight: 700;
1108
- color: var(--text-primary);
1109
- letter-spacing: -0.02em;
794
+ .modal-header h3 {
795
+ font-size: 16px;
796
+ font-weight: 700;
797
+ color: var(--text-primary);
1110
798
  }
1111
-
1112
799
  .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);
800
+ font-size: 18px;
801
+ line-height: 1;
1133
802
  }
1134
-
1135
- .modal-body {
1136
- padding: 28px;
803
+ .modal-body { padding: 16px 24px; }
804
+ .modal-desc {
805
+ font-size: 13px;
806
+ color: var(--text-secondary);
807
+ line-height: 1.5;
808
+ margin-bottom: 16px;
1137
809
  }
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);
810
+ .modal-footer {
811
+ display: flex;
812
+ gap: 8px;
813
+ justify-content: flex-end;
814
+ padding: 12px 24px 20px;
815
+ }
816
+
817
+ /* Form */
818
+ .form-label {
819
+ display: block;
820
+ font-size: 12px;
821
+ font-weight: 600;
822
+ color: var(--text-secondary);
823
+ margin-bottom: 6px;
824
+ }
825
+ .form-input {
826
+ width: 100%;
827
+ padding: 10px 14px;
828
+ background: var(--bg-input);
829
+ border: 1px solid var(--border);
830
+ border-radius: var(--radius-sm);
831
+ color: var(--text-primary);
832
+ font-size: 13px;
833
+ font-family: var(--font-mono);
834
+ transition: border-color .15s;
835
+ }
836
+ .form-input:focus {
837
+ outline: none;
838
+ border-color: var(--accent);
1175
839
  }
1176
-
1177
840
  .form-hint {
1178
- display: block;
1179
- margin-top: 6px;
1180
- font-size: 12px;
1181
- color: var(--text-secondary);
1182
- font-style: italic;
841
+ display: block;
842
+ font-size: 11px;
843
+ color: var(--text-muted);
844
+ margin-top: 6px;
1183
845
  }
1184
-
1185
846
  .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;
847
+ margin-top: 12px;
848
+ font-size: 12px;
849
+ border-radius: var(--radius-sm);
850
+ padding: 8px 12px;
851
+ display: none;
852
+ }
853
+ .config-status.error {
854
+ display: block;
855
+ background: var(--red-subtle);
856
+ color: var(--red);
857
+ }
858
+ .config-status.success {
859
+ display: block;
860
+ background: var(--green-subtle);
861
+ color: var(--green);
862
+ }
863
+
864
+ /* Code block */
865
+ .code-block {
866
+ background: var(--bg);
867
+ border: 1px solid var(--border);
868
+ border-radius: var(--radius-sm);
869
+ padding: 16px;
870
+ font-family: var(--font-mono);
871
+ font-size: 12px;
872
+ color: var(--text-secondary);
873
+ overflow-x: auto;
874
+ white-space: pre;
875
+ line-height: 1.55;
876
+ max-height: 400px;
877
+ overflow-y: auto;
878
+ }
879
+
880
+ /* ===== Empty State ===== */
881
+ .empty-state {
882
+ text-align: center;
883
+ padding: 48px 24px;
884
+ color: var(--text-muted);
885
+ }
886
+ .empty-state p {
887
+ margin-bottom: 16px;
888
+ font-size: 14px;
889
+ }
890
+
891
+ /* ===== Toast ===== */
892
+ .toast {
893
+ position: fixed;
894
+ bottom: 28px;
895
+ right: 28px;
896
+ background: var(--bg-card);
897
+ border: 1px solid var(--border);
898
+ border-radius: var(--radius);
899
+ padding: 12px 20px;
900
+ font-size: 13px;
901
+ font-weight: 500;
902
+ color: var(--text-primary);
903
+ box-shadow: var(--shadow-lg);
904
+ opacity: 0;
905
+ transform: translateY(12px);
906
+ pointer-events: none;
907
+ transition: all .25s ease;
908
+ z-index: 300;
1228
909
  }
1229
-
1230
- .status-loading {
1231
- background: linear-gradient(135deg, #dbeafe 0%, #bfdbfe 100%);
1232
- color: #1e40af;
1233
- border: 1.5px solid #93c5fd;
910
+ .toast.show {
911
+ opacity: 1;
912
+ transform: translateY(0);
913
+ pointer-events: auto;
1234
914
  }
1235
915
 
1236
- .status-loading::before {
1237
- content: '⏳';
1238
- font-size: 18px;
1239
- animation: pulse 1.5s ease-in-out infinite;
916
+ /* ===== Loading ===== */
917
+ .loading-overlay {
918
+ position: fixed;
919
+ inset: 0;
920
+ background: var(--bg);
921
+ display: flex;
922
+ flex-direction: column;
923
+ align-items: center;
924
+ justify-content: center;
925
+ gap: 16px;
926
+ z-index: 500;
927
+ transition: opacity .3s ease;
1240
928
  }
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
- }
929
+ .loading-overlay.hidden {
930
+ opacity: 0;
931
+ pointer-events: none;
932
+ }
933
+ .spinner {
934
+ width: 32px; height: 32px;
935
+ border: 3px solid var(--border);
936
+ border-top-color: var(--accent);
937
+ border-radius: 50%;
938
+ animation: spin .7s linear infinite;
939
+ }
940
+ @keyframes spin { to { transform: rotate(360deg); } }
941
+ .loading-overlay p {
942
+ font-size: 13px;
943
+ color: var(--text-muted);
944
+ }
945
+
946
+ /* ===== Savings Banner ===== */
947
+ .savings-banner {
948
+ margin-bottom: 24px;
949
+ }
950
+ .savings-banner-inner {
951
+ display: flex;
952
+ align-items: center;
953
+ justify-content: space-between;
954
+ background: linear-gradient(135deg, rgba(34,197,94,.1), rgba(34,197,94,.04));
955
+ border: 1px solid rgba(34,197,94,.2);
956
+ border-radius: var(--radius-lg);
957
+ padding: 20px 24px;
958
+ gap: 20px;
959
+ flex-wrap: wrap;
960
+ }
961
+ .savings-banner-left {
962
+ display: flex;
963
+ align-items: center;
964
+ gap: 14px;
965
+ }
966
+ .savings-banner-icon {
967
+ font-size: 28px;
968
+ }
969
+ .savings-banner-title {
970
+ font-size: 12px;
971
+ font-weight: 600;
972
+ text-transform: uppercase;
973
+ letter-spacing: .04em;
974
+ color: var(--text-secondary);
975
+ margin-bottom: 2px;
976
+ }
977
+ .savings-banner-amount {
978
+ font-size: 28px;
979
+ font-weight: 800;
980
+ font-family: var(--font-mono);
981
+ color: var(--green);
982
+ }
983
+ .savings-banner-right {
984
+ display: flex;
985
+ align-items: center;
986
+ gap: 14px;
987
+ }
988
+ .savings-banner-stat {
989
+ text-align: center;
990
+ }
991
+ .savings-stat-label {
992
+ display: block;
993
+ font-size: 10px;
994
+ text-transform: uppercase;
995
+ letter-spacing: .05em;
996
+ color: var(--text-muted);
997
+ margin-bottom: 2px;
998
+ }
999
+ .savings-stat-value {
1000
+ font-size: 18px;
1001
+ font-weight: 700;
1002
+ font-family: var(--font-mono);
1003
+ color: var(--text-secondary);
1004
+ }
1005
+ .savings-stat-green {
1006
+ color: var(--green);
1007
+ }
1008
+
1009
+ /* ===== Rec Section Titles ===== */
1010
+ .rec-section-title {
1011
+ display: flex;
1012
+ align-items: center;
1013
+ gap: 8px;
1014
+ font-size: 14px;
1015
+ font-weight: 700;
1016
+ color: var(--text-primary);
1017
+ margin-bottom: 14px;
1018
+ padding-bottom: 8px;
1019
+ border-bottom: 1px solid var(--border);
1020
+ }
1021
+ .rec-section-title svg {
1022
+ color: var(--accent);
1023
+ }
1024
+
1025
+ /* ===== Model Recommendation Cards ===== */
1026
+ .model-rec-grid {
1027
+ display: flex;
1028
+ flex-direction: column;
1029
+ gap: 16px;
1030
+ margin-bottom: 8px;
1031
+ }
1032
+ .model-rec-card {
1033
+ background: var(--bg-card);
1034
+ border: 1px solid var(--border);
1035
+ border-radius: var(--radius-lg);
1036
+ padding: 20px;
1037
+ transition: border-color .15s, box-shadow .15s;
1038
+ }
1039
+ .model-rec-card:hover {
1040
+ border-color: var(--border-light);
1041
+ }
1042
+ .model-rec-card.has-selection {
1043
+ border-color: var(--accent);
1044
+ box-shadow: 0 0 0 1px var(--accent-subtle);
1045
+ }
1046
+ .model-rec-header {
1047
+ display: flex;
1048
+ align-items: flex-start;
1049
+ justify-content: space-between;
1050
+ margin-bottom: 16px;
1051
+ gap: 12px;
1052
+ }
1053
+ .model-rec-label {
1054
+ font-size: 10px;
1055
+ font-weight: 600;
1056
+ text-transform: uppercase;
1057
+ letter-spacing: .06em;
1058
+ color: var(--text-muted);
1059
+ margin-bottom: 4px;
1060
+ }
1061
+ .model-rec-name {
1062
+ font-size: 17px;
1063
+ font-weight: 700;
1064
+ color: var(--text-primary);
1065
+ font-family: var(--font-mono);
1066
+ }
1067
+ .model-rec-stats {
1068
+ font-size: 12px;
1069
+ color: var(--text-secondary);
1070
+ margin-top: 4px;
1071
+ }
1072
+
1073
+ /* Tier Badge */
1074
+ .tier-badge {
1075
+ display: inline-flex;
1076
+ align-items: center;
1077
+ gap: 6px;
1078
+ padding: 5px 14px;
1079
+ border-radius: 50px;
1080
+ font-size: 13px;
1081
+ font-weight: 700;
1082
+ letter-spacing: .02em;
1083
+ margin-bottom: 6px;
1084
+ }
1085
+ .model-rec-tier-desc {
1086
+ font-size: 12px;
1087
+ color: var(--text-secondary);
1088
+ line-height: 1.5;
1089
+ margin-bottom: 6px;
1090
+ }
1091
+ .model-rec-savings-badge {
1092
+ display: inline-flex;
1093
+ align-items: center;
1094
+ gap: 4px;
1095
+ background: var(--green-subtle);
1096
+ color: var(--green);
1097
+ padding: 6px 14px;
1098
+ border-radius: 50px;
1099
+ font-size: 14px;
1100
+ font-weight: 700;
1101
+ font-family: var(--font-mono);
1102
+ white-space: nowrap;
1103
+ }
1104
+ .savings-arrow {
1105
+ font-size: 16px;
1106
+ }
1107
+ .model-rec-note {
1108
+ margin-top: 14px;
1109
+ padding: 10px 14px;
1110
+ background: var(--accent-subtle);
1111
+ border-radius: var(--radius-sm);
1112
+ font-size: 12px;
1113
+ color: var(--text-secondary);
1114
+ line-height: 1.5;
1115
+ }
1116
+
1117
+ .model-alt-label {
1118
+ font-size: 11px;
1119
+ font-weight: 600;
1120
+ text-transform: uppercase;
1121
+ letter-spacing: .04em;
1122
+ color: var(--text-muted);
1123
+ margin-bottom: 10px;
1124
+ }
1125
+
1126
+ /* ===== Model Alternative Options ===== */
1127
+ .model-alt-list {
1128
+ display: flex;
1129
+ flex-direction: column;
1130
+ gap: 6px;
1131
+ }
1132
+ .model-alt-option {
1133
+ display: flex;
1134
+ align-items: center;
1135
+ gap: 12px;
1136
+ padding: 12px 14px;
1137
+ border-radius: var(--radius);
1138
+ border: 1px solid var(--border);
1139
+ background: var(--bg-surface);
1140
+ cursor: pointer;
1141
+ transition: all .15s;
1142
+ }
1143
+ .model-alt-option:hover {
1144
+ background: var(--bg-card-hover);
1145
+ border-color: var(--border-light);
1146
+ }
1147
+ .model-alt-option.selected {
1148
+ background: var(--accent-subtle);
1149
+ border-color: var(--accent);
1150
+ }
1151
+ .model-alt-option.current {
1152
+ border-color: var(--border-light);
1153
+ }
1154
+ .model-alt-radio {
1155
+ flex-shrink: 0;
1156
+ }
1157
+ .model-alt-radio input[type="radio"] {
1158
+ width: 16px;
1159
+ height: 16px;
1160
+ accent-color: var(--accent);
1161
+ cursor: pointer;
1162
+ }
1163
+ .model-alt-info {
1164
+ flex: 1;
1165
+ min-width: 0;
1166
+ }
1167
+ .model-alt-name {
1168
+ font-size: 13px;
1169
+ font-weight: 600;
1170
+ color: var(--text-primary);
1171
+ display: flex;
1172
+ align-items: center;
1173
+ gap: 8px;
1174
+ flex-wrap: wrap;
1175
+ }
1176
+ .model-tag {
1177
+ display: inline-flex;
1178
+ padding: 1px 7px;
1179
+ border-radius: 50px;
1180
+ font-size: 9px;
1181
+ font-weight: 700;
1182
+ text-transform: uppercase;
1183
+ letter-spacing: .06em;
1184
+ }
1185
+ .current-tag {
1186
+ background: var(--sky-subtle);
1187
+ color: var(--sky);
1188
+ }
1189
+ .best-tag {
1190
+ background: var(--green-subtle);
1191
+ color: var(--green);
1192
+ }
1193
+ .model-alt-meta {
1194
+ font-size: 11px;
1195
+ color: var(--text-muted);
1196
+ margin-top: 3px;
1197
+ display: flex;
1198
+ align-items: center;
1199
+ gap: 4px;
1200
+ flex-wrap: wrap;
1201
+ }
1202
+ .model-alt-cost {
1203
+ text-align: right;
1204
+ flex-shrink: 0;
1205
+ min-width: 90px;
1206
+ }
1207
+ .model-alt-price {
1208
+ font-size: 15px;
1209
+ font-weight: 700;
1210
+ font-family: var(--font-mono);
1211
+ color: var(--text-primary);
1212
+ }
1213
+ .model-alt-price small {
1214
+ font-size: 10px;
1215
+ font-weight: 500;
1216
+ color: var(--text-muted);
1217
+ }
1218
+ .model-alt-delta {
1219
+ font-size: 11px;
1220
+ font-weight: 600;
1221
+ font-family: var(--font-mono);
1222
+ margin-top: 2px;
1223
+ }
1224
+ .delta-positive {
1225
+ color: var(--green);
1226
+ }
1227
+ .delta-negative {
1228
+ color: var(--red);
1229
+ }
1230
+
1231
+ /* Quality Dots */
1232
+ .quality-dots {
1233
+ display: inline-flex;
1234
+ align-items: center;
1235
+ gap: 2px;
1236
+ font-size: 11px;
1237
+ color: var(--text-muted);
1238
+ }
1239
+ .quality-dot {
1240
+ width: 6px;
1241
+ height: 6px;
1242
+ border-radius: 50%;
1243
+ background: var(--border);
1244
+ }
1245
+ .quality-dot.filled {
1246
+ background: var(--accent);
1247
+ }
1248
+
1249
+ /* ===== Budget Controls ===== */
1250
+ .budget-controls-card {
1251
+ background: var(--bg-card);
1252
+ border: 1px solid var(--border);
1253
+ border-radius: var(--radius-lg);
1254
+ padding: 24px;
1255
+ }
1256
+ .budget-controls-desc {
1257
+ font-size: 13px;
1258
+ color: var(--text-secondary);
1259
+ margin-bottom: 20px;
1260
+ line-height: 1.5;
1261
+ }
1262
+ .budget-grid {
1263
+ display: grid;
1264
+ grid-template-columns: 1fr 1fr;
1265
+ gap: 20px;
1266
+ margin-bottom: 20px;
1267
+ }
1268
+ .budget-field {
1269
+ background: var(--bg-surface);
1270
+ border-radius: var(--radius);
1271
+ padding: 16px;
1272
+ border: 1px solid var(--border);
1273
+ transition: border-color .15s;
1274
+ }
1275
+ .budget-field:focus-within {
1276
+ border-color: var(--accent);
1277
+ }
1278
+ .budget-label {
1279
+ display: flex;
1280
+ align-items: center;
1281
+ gap: 6px;
1282
+ font-size: 13px;
1283
+ font-weight: 600;
1284
+ color: var(--text-primary);
1285
+ margin-bottom: 10px;
1286
+ }
1287
+ .budget-label-icon {
1288
+ font-size: 16px;
1289
+ }
1290
+ .budget-input-row {
1291
+ display: flex;
1292
+ align-items: center;
1293
+ gap: 6px;
1294
+ }
1295
+ .budget-currency {
1296
+ font-size: 16px;
1297
+ font-weight: 700;
1298
+ color: var(--text-muted);
1299
+ font-family: var(--font-mono);
1300
+ }
1301
+ .budget-input {
1302
+ width: 100%;
1303
+ max-width: 120px;
1304
+ padding: 8px 10px;
1305
+ background: var(--bg-input);
1306
+ border: 1px solid var(--border);
1307
+ border-radius: var(--radius-sm);
1308
+ color: var(--text-primary);
1309
+ font-size: 16px;
1310
+ font-weight: 700;
1311
+ font-family: var(--font-mono);
1312
+ transition: border-color .15s;
1313
+ }
1314
+ .budget-input:focus {
1315
+ outline: none;
1316
+ border-color: var(--accent);
1317
+ }
1318
+ .budget-unit {
1319
+ font-size: 12px;
1320
+ color: var(--text-muted);
1321
+ white-space: nowrap;
1322
+ }
1323
+ .budget-hint {
1324
+ font-size: 11px;
1325
+ color: var(--text-muted);
1326
+ margin-top: 6px;
1327
+ line-height: 1.4;
1328
+ }
1329
+ .budget-slider {
1330
+ -webkit-appearance: none;
1331
+ appearance: none;
1332
+ width: 100%;
1333
+ height: 4px;
1334
+ border-radius: 2px;
1335
+ background: var(--border);
1336
+ outline: none;
1337
+ margin-top: 12px;
1338
+ cursor: pointer;
1339
+ }
1340
+ .budget-slider::-webkit-slider-thumb {
1341
+ -webkit-appearance: none;
1342
+ appearance: none;
1343
+ width: 16px;
1344
+ height: 16px;
1345
+ border-radius: 50%;
1346
+ background: var(--accent);
1347
+ cursor: pointer;
1348
+ border: 2px solid var(--bg-card);
1349
+ box-shadow: 0 0 0 2px var(--accent);
1350
+ transition: transform .15s;
1351
+ }
1352
+ .budget-slider::-webkit-slider-thumb:hover {
1353
+ transform: scale(1.2);
1354
+ }
1355
+ .budget-slider::-moz-range-thumb {
1356
+ width: 16px;
1357
+ height: 16px;
1358
+ border-radius: 50%;
1359
+ background: var(--accent);
1360
+ cursor: pointer;
1361
+ border: 2px solid var(--bg-card);
1362
+ }
1363
+
1364
+ /* Budget Impact Preview */
1365
+ .budget-impact {
1366
+ background: var(--bg-surface);
1367
+ border-radius: var(--radius);
1368
+ padding: 16px;
1369
+ margin-bottom: 16px;
1370
+ border: 1px solid var(--border);
1371
+ }
1372
+ .budget-impact-title {
1373
+ font-size: 11px;
1374
+ font-weight: 600;
1375
+ text-transform: uppercase;
1376
+ letter-spacing: .05em;
1377
+ color: var(--text-muted);
1378
+ margin-bottom: 12px;
1379
+ }
1380
+ .budget-impact-grid {
1381
+ display: grid;
1382
+ grid-template-columns: repeat(4, 1fr);
1383
+ gap: 12px;
1384
+ }
1385
+ .impact-item {
1386
+ text-align: center;
1387
+ }
1388
+ .impact-label {
1389
+ font-size: 10px;
1390
+ text-transform: uppercase;
1391
+ letter-spacing: .04em;
1392
+ color: var(--text-muted);
1393
+ margin-bottom: 4px;
1394
+ }
1395
+ .impact-value {
1396
+ font-size: 15px;
1397
+ font-weight: 700;
1398
+ font-family: var(--font-mono);
1399
+ color: var(--text-primary);
1400
+ }
1401
+ .impact-value small {
1402
+ font-size: 10px;
1403
+ font-weight: 500;
1404
+ color: var(--text-muted);
1405
+ }
1406
+ .impact-safe .impact-value {
1407
+ color: var(--green);
1408
+ }
1409
+ .impact-warning .impact-value {
1410
+ color: var(--red);
1411
+ }
1412
+
1413
+ .budget-actions {
1414
+ display: flex;
1415
+ justify-content: flex-end;
1416
+ gap: 10px;
1417
+ }
1418
+
1419
+ /* ===== Responsive ===== */
1420
+ @media (max-width: 900px) {
1421
+ :root { --sidebar-w: 0px; }
1422
+ .sidebar { transform: translateX(-260px); }
1423
+ .sidebar.open { transform: translateX(0); width: 260px; }
1424
+ .btn-hamburger { display: flex; }
1425
+ .kpi-row { grid-template-columns: 1fr; }
1426
+ .metrics-grid { grid-template-columns: repeat(2, 1fr); }
1427
+ .charts-row { grid-template-columns: 1fr; }
1428
+ .rec-details { grid-template-columns: 1fr; }
1429
+ .budget-grid { grid-template-columns: 1fr; }
1430
+ .budget-impact-grid { grid-template-columns: repeat(2, 1fr); }
1431
+ .savings-banner-inner { flex-direction: column; align-items: flex-start; }
1432
+ .hiw-steps { grid-template-columns: 1fr; }
1433
+ }
1434
+
1435
+ @media (max-width: 600px) {
1436
+ .metrics-grid { grid-template-columns: 1fr; }
1437
+ .page-section { padding: 16px; }
1438
+ .topbar { padding: 12px 16px; }
1439
+ }
1440
+
1441
+ /* ===== Scrollbar ===== */
1442
+ ::-webkit-scrollbar { width: 6px; }
1443
+ ::-webkit-scrollbar-track { background: transparent; }
1444
+ ::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
1445
+ ::-webkit-scrollbar-thumb:hover { background: var(--border-light); }