codexmate 0.0.33 → 0.0.36

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.
Files changed (47) hide show
  1. package/cli/agents-files.js +6 -0
  2. package/cli/archive-helpers.js +11 -4
  3. package/cli/local-bridge.js +9 -4
  4. package/cli/openai-bridge.js +1 -1
  5. package/cli/update.js +11 -2
  6. package/cli.js +133 -64
  7. package/lib/cli-webhook.js +29 -1
  8. package/package.json +2 -1
  9. package/web-ui/app.js +37 -2
  10. package/web-ui/index.html +2 -1
  11. package/web-ui/logic.claude.mjs +4 -0
  12. package/web-ui/logic.sessions.mjs +6 -5
  13. package/web-ui/modules/app.computed.dashboard.mjs +4 -0
  14. package/web-ui/modules/app.computed.session.mjs +147 -6
  15. package/web-ui/modules/app.methods.claude-config.mjs +41 -0
  16. package/web-ui/modules/app.methods.codex-config.mjs +11 -3
  17. package/web-ui/modules/app.methods.navigation.mjs +32 -2
  18. package/web-ui/modules/app.methods.session-browser.mjs +12 -6
  19. package/web-ui/modules/app.methods.session-trash.mjs +30 -0
  20. package/web-ui/modules/app.methods.startup-claude.mjs +9 -0
  21. package/web-ui/modules/app.methods.webhook.mjs +8 -0
  22. package/web-ui/modules/i18n.dict.mjs +8 -0
  23. package/web-ui/modules/sessions-filters-url.mjs +65 -12
  24. package/web-ui/modules/skills.methods.mjs +31 -0
  25. package/web-ui/partials/index/layout-header.html +17 -12
  26. package/web-ui/partials/index/modal-webhook.html +42 -0
  27. package/web-ui/partials/index/modals-basic.html +50 -0
  28. package/web-ui/partials/index/panel-config-claude.html +13 -22
  29. package/web-ui/partials/index/panel-config-codex.html +8 -22
  30. package/web-ui/partials/index/panel-market.html +76 -149
  31. package/web-ui/partials/index/panel-sessions.html +2 -2
  32. package/web-ui/partials/index/panel-settings.html +119 -149
  33. package/web-ui/partials/index/panel-usage.html +115 -68
  34. package/web-ui/res/vue.runtime.global.prod.js +7 -0
  35. package/web-ui/res/web-ui-render.precompiled.js +7274 -0
  36. package/web-ui/session-helpers.mjs +15 -4
  37. package/web-ui/source-bundle.cjs +73 -1
  38. package/web-ui/styles/base-theme.css +10 -0
  39. package/web-ui/styles/bridge-pool.css +69 -0
  40. package/web-ui/styles/layout-shell.css +66 -27
  41. package/web-ui/styles/navigation-panels.css +8 -0
  42. package/web-ui/styles/responsive.css +50 -9
  43. package/web-ui/styles/sessions-usage.css +336 -319
  44. package/web-ui/styles/settings-panel.css +300 -234
  45. package/web-ui/styles/skills-market.css +294 -0
  46. package/web-ui/styles/titles-cards.css +14 -0
  47. package/web-ui/styles/webhook.css +38 -4
@@ -1,5 +1,5 @@
1
1
  /* ============================================
2
- Usage Tab — Refined Design System
2
+ Usage Tab — 时光之河设计
3
3
  ============================================ */
4
4
 
5
5
  /* ---- Toolbar ---- */
@@ -9,21 +9,21 @@
9
9
  align-items: center;
10
10
  gap: 12px;
11
11
  flex-wrap: wrap;
12
- margin-bottom: 18px;
12
+ margin-bottom: 20px;
13
13
  }
14
14
 
15
15
  .usage-toolbar-title {
16
- font-size: var(--font-size-title);
17
- font-weight: var(--font-weight-title);
16
+ font-size: 18px;
17
+ font-weight: 600;
18
18
  color: var(--color-text-primary);
19
- letter-spacing: -0.01em;
19
+ letter-spacing: -0.02em;
20
20
  }
21
21
 
22
22
  .usage-range-group {
23
23
  display: flex;
24
- gap: 4px;
25
- padding: 3px;
26
- border-radius: var(--radius-md);
24
+ gap: 3px;
25
+ padding: 4px;
26
+ border-radius: 10px;
27
27
  background: var(--color-surface-alt);
28
28
  border: 1px solid var(--color-border-soft);
29
29
  }
@@ -32,14 +32,14 @@
32
32
  border: none;
33
33
  background: transparent;
34
34
  color: var(--color-text-tertiary);
35
- padding: 5px 11px;
36
- border-radius: var(--radius-sm);
35
+ padding: 6px 14px;
36
+ border-radius: 7px;
37
37
  cursor: pointer;
38
- font-size: 12px;
39
- font-weight: 600;
38
+ font-size: 13px;
39
+ font-weight: 500;
40
40
  font-family: var(--font-family);
41
41
  white-space: nowrap;
42
- transition: all 120ms var(--ease-spring);
42
+ transition: all 150ms var(--ease-spring);
43
43
  outline: none;
44
44
  -webkit-tap-highlight-color: transparent;
45
45
  }
@@ -50,13 +50,13 @@
50
50
  }
51
51
 
52
52
  .usage-range-btn:active:not(:disabled) {
53
- transform: scale(0.97);
53
+ transform: scale(0.96);
54
54
  }
55
55
 
56
56
  .usage-range-btn.active {
57
57
  color: #fff;
58
58
  background: var(--color-brand);
59
- box-shadow: 0 1px 3px rgba(200, 121, 99, 0.35);
59
+ box-shadow: 0 2px 8px rgba(200, 121, 99, 0.3);
60
60
  }
61
61
 
62
62
  .usage-range-btn:disabled {
@@ -65,34 +65,75 @@
65
65
  }
66
66
 
67
67
  .usage-range-btn-icon {
68
- padding: 5px 8px;
68
+ padding: 6px 10px;
69
69
  display: inline-flex;
70
70
  align-items: center;
71
71
  justify-content: center;
72
72
  }
73
73
 
74
74
  .usage-range-btn-icon svg {
75
- width: 14px;
76
- height: 14px;
75
+ width: 15px;
76
+ height: 15px;
77
77
  }
78
78
 
79
- /* ---- Current session bar ---- */
80
- .usage-current-session-bar {
79
+ /* ---- Empty State (插画风格) ---- */
80
+ .usage-empty-state {
81
81
  display: flex;
82
- flex-wrap: wrap;
82
+ flex-direction: column;
83
83
  align-items: center;
84
- gap: 10px;
85
- padding: 8px 14px;
84
+ justify-content: center;
85
+ padding: 48px 20px;
86
+ text-align: center;
87
+ }
88
+
89
+ .usage-empty-illustration {
90
+ width: 64px;
91
+ height: 64px;
92
+ color: var(--color-text-muted);
93
+ opacity: 0.6;
86
94
  margin-bottom: 16px;
87
- border-radius: var(--radius-md);
95
+ animation: usage-empty-breathe 3s ease-in-out infinite;
96
+ }
97
+
98
+ @keyframes usage-empty-breathe {
99
+ 0%, 100% { transform: scale(1); opacity: 0.5; }
100
+ 50% { transform: scale(1.05); opacity: 0.7; }
101
+ }
102
+
103
+ .usage-empty-text {
104
+ font-size: 13px;
105
+ color: var(--color-text-secondary);
106
+ max-width: 280px;
107
+ }
108
+
109
+ /* ---- Hero 区域 ---- */
110
+ .usage-hero {
111
+ padding: 24px;
112
+ margin-bottom: 20px;
113
+ border-radius: 14px;
114
+ background: var(--color-surface);
115
+ border: 1px solid var(--color-border-soft);
116
+ min-height: 140px;
117
+ display: flex;
118
+ flex-direction: column;
119
+ justify-content: center;
120
+ gap: 16px;
121
+ }
122
+
123
+ .usage-hero-active {
124
+ display: flex;
125
+ flex-wrap: wrap;
126
+ align-items: center;
127
+ gap: 8px 12px;
128
+ padding: 10px 16px;
129
+ border-radius: 10px;
88
130
  background: var(--color-surface-alt);
89
131
  font-size: 12px;
90
- color: var(--color-text-secondary);
91
132
  }
92
133
 
93
- .usage-current-session-dot {
94
- width: 7px;
95
- height: 7px;
134
+ .usage-hero-active-dot {
135
+ width: 6px;
136
+ height: 6px;
96
137
  border-radius: 50%;
97
138
  background: var(--color-success);
98
139
  flex-shrink: 0;
@@ -100,258 +141,136 @@
100
141
  }
101
142
 
102
143
  @keyframes usage-pulse {
103
- 0%, 100% { opacity: 1; }
104
- 50% { opacity: 0.4; }
144
+ 0%, 100% { opacity: 1; transform: scale(1); }
145
+ 50% { opacity: 0.4; transform: scale(0.9); }
105
146
  }
106
147
 
107
- .usage-current-session-label {
108
- font-weight: 700;
148
+ .usage-hero-active-label {
149
+ font-weight: 600;
109
150
  color: var(--color-text-primary);
110
151
  }
111
152
 
112
- .usage-current-session-stat {
153
+ .usage-hero-active-stat {
113
154
  color: var(--color-text-tertiary);
114
155
  }
115
156
 
116
- .usage-current-session-stat::before {
157
+ .usage-hero-active-stat::before {
117
158
  content: '·';
118
159
  margin-right: 10px;
119
160
  color: var(--color-border-strong);
120
161
  }
121
162
 
122
- /* ---- Summary cards ---- */
123
- .usage-summary-grid {
124
- display: grid;
125
- grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));
126
- gap: 10px;
127
- margin-bottom: 18px;
128
- }
129
-
130
- .usage-summary-card {
131
- display: flex;
132
- flex-direction: column;
133
- justify-content: center;
134
- gap: 2px;
135
- padding: 14px 16px;
136
- border-radius: var(--radius-md);
137
- background: var(--color-surface);
138
- border: 1px solid var(--color-border-soft);
139
- transition: all 120ms var(--ease-spring);
140
- min-height: 72px;
163
+ .usage-hero-metrics {
164
+ text-align: center;
141
165
  }
142
166
 
143
- .usage-summary-card-value {
144
- font-size: 26px;
167
+ .usage-hero-main {
168
+ font-size: 42px;
145
169
  font-weight: 700;
146
170
  color: var(--color-text-primary);
147
- line-height: 1.1;
148
- letter-spacing: -0.02em;
171
+ line-height: 1;
172
+ letter-spacing: -0.03em;
149
173
  font-variant-numeric: tabular-nums;
174
+ animation: usage-hero-count 0.8s ease-out;
150
175
  }
151
176
 
152
- .usage-summary-card-label {
153
- font-size: 11px;
154
- font-weight: 500;
155
- color: var(--color-text-tertiary);
156
- text-transform: uppercase;
157
- letter-spacing: 0.04em;
158
- }
159
-
160
- .usage-copyable {
161
- cursor: pointer;
162
- -webkit-tap-highlight-color: transparent;
163
- }
164
-
165
- .usage-copyable:hover {
166
- border-color: var(--color-brand);
167
- background: var(--color-surface-alt);
168
- }
169
-
170
- .usage-copyable:active {
171
- transform: scale(0.98);
172
- }
173
-
174
- .usage-copyable:focus-visible {
175
- outline: 2px solid var(--color-brand-light);
176
- outline-offset: 2px;
177
- }
178
-
179
- /* ---- Content area ---- */
180
- .usage-content {
181
- position: relative;
182
- }
183
-
184
- .usage-content-loading {
185
- opacity: 0.7;
186
- pointer-events: none;
177
+ @keyframes usage-hero-count {
178
+ from { opacity: 0; transform: translateY(10px); }
179
+ to { opacity: 1; transform: translateY(0); }
187
180
  }
188
181
 
189
- .usage-content-overlay {
190
- position: absolute;
191
- inset: 0;
182
+ .usage-hero-sub {
183
+ margin-top: 8px;
184
+ font-size: 13px;
185
+ color: var(--color-text-tertiary);
192
186
  display: flex;
193
- align-items: flex-start;
194
- justify-content: flex-end;
195
- padding: 12px;
196
- z-index: 1;
197
- }
198
-
199
- .usage-spinner {
200
- width: 16px;
201
- height: 16px;
202
- border-radius: 50%;
203
- border: 2px solid var(--color-border-soft);
204
- border-top-color: var(--color-brand);
205
- animation: usage-spin 0.8s linear infinite;
206
- }
207
-
208
- @keyframes usage-spin {
209
- to { transform: rotate(360deg); }
210
- }
211
-
212
- /* ---- Cards ---- */
213
- .usage-card {
214
- padding: 18px;
215
- border-radius: var(--radius-md);
216
- background: var(--color-surface);
217
- border: 1px solid var(--color-border-soft);
218
- margin-bottom: 12px;
219
- }
220
-
221
- .usage-card-head {
222
- margin-bottom: 14px;
223
- }
224
-
225
- .usage-card-title {
226
- font-size: 14px;
227
- font-weight: 700;
228
- color: var(--color-text-primary);
229
- margin-bottom: 2px;
230
- }
231
-
232
- .usage-card-subtitle {
233
- font-size: 11px;
234
- color: var(--color-text-muted);
235
- }
236
-
237
- /* ---- Chart grid ---- */
238
- .usage-chart-grid {
239
- display: grid;
240
- grid-template-columns: repeat(2, 1fr);
187
+ align-items: center;
188
+ justify-content: center;
241
189
  gap: 12px;
190
+ flex-wrap: wrap;
242
191
  }
243
192
 
244
- .usage-card-wide {
245
- grid-column: 1 / -1;
193
+ .usage-hero-delta {
194
+ font-size: 12px;
195
+ font-weight: 600;
196
+ padding: 2px 8px;
197
+ border-radius: 12px;
246
198
  }
247
199
 
248
- /* ---- Daily chart ---- */
249
- .usage-daily-chart {
250
- display: flex;
251
- align-items: flex-end;
252
- gap: 4px;
253
- height: 140px;
254
- padding: 0 2px;
200
+ .usage-hero-delta.delta-up {
201
+ color: var(--color-delta-up);
202
+ background: rgba(76, 175, 80, 0.12);
255
203
  }
256
204
 
257
- .usage-daily-bar-group {
258
- flex: 1;
259
- display: flex;
260
- flex-direction: column;
261
- align-items: center;
262
- gap: 6px;
263
- cursor: pointer;
264
- min-width: 0;
265
- -webkit-tap-highlight-color: transparent;
205
+ .usage-hero-delta.delta-down {
206
+ color: var(--color-delta-down);
207
+ background: rgba(244, 67, 54, 0.12);
266
208
  }
267
209
 
268
- .usage-daily-bar-stack {
269
- width: 100%;
270
- max-width: 32px;
271
- height: 100px;
272
- display: flex;
273
- flex-direction: column;
274
- justify-content: flex-end;
275
- position: relative;
276
- border-radius: 4px 4px 0 0;
210
+ /* ---- 波浪图 ---- */
211
+ .usage-wave-section {
277
212
  overflow: hidden;
278
- background: var(--color-surface-alt);
279
213
  }
280
214
 
281
- .usage-daily-bar-fill {
282
- width: 100%;
283
- border-radius: 4px 4px 0 0;
284
- background: var(--color-brand);
285
- transition: height 200ms var(--ease-spring);
286
- min-height: 2px;
215
+ .usage-wave-container {
216
+ margin-top: 12px;
217
+ position: relative;
287
218
  }
288
219
 
289
- .usage-daily-bar-prev {
220
+ .usage-wave-chart {
290
221
  width: 100%;
291
- background: var(--color-text-muted);
292
- opacity: 0.35;
293
- border-radius: 4px 4px 0 0;
222
+ height: 140px;
223
+ display: block;
294
224
  }
295
225
 
296
- .usage-daily-bar-group.active .usage-daily-bar-fill {
297
- background: var(--color-brand-dark);
298
- box-shadow: 0 0 8px rgba(200, 121, 99, 0.3);
226
+ .usage-wave-area {
227
+ transition: d 0.4s var(--ease-spring);
299
228
  }
300
229
 
301
- .usage-daily-bar-group:hover .usage-daily-bar-fill {
302
- filter: brightness(1.1);
230
+ .usage-wave-line {
231
+ transition: d 0.4s var(--ease-spring);
303
232
  }
304
233
 
305
- .usage-daily-bar-label {
306
- font-size: 10px;
307
- color: var(--color-text-muted);
308
- text-align: center;
309
- white-space: nowrap;
310
- overflow: hidden;
311
- text-overflow: ellipsis;
312
- max-width: 100%;
234
+ .usage-wave-hover-line {
235
+ transition: x1 0.2s, x2 0.2s, y1 0.2s, y2 0.2s;
313
236
  }
314
237
 
315
- .usage-daily-bar-group.active .usage-daily-bar-label {
316
- color: var(--color-brand-dark);
317
- font-weight: 700;
238
+ .usage-wave-hover-point {
239
+ transition: cx 0.2s, cy 0.2s;
318
240
  }
319
241
 
320
- /* ---- Daily legend ---- */
321
- .usage-daily-legend {
242
+ .usage-wave-labels {
322
243
  display: flex;
323
- gap: 16px;
324
- margin-top: 10px;
325
- font-size: 11px;
326
- color: var(--color-text-muted);
327
- }
328
-
329
- .usage-daily-legend-item {
330
- display: inline-flex;
331
- align-items: center;
332
- gap: 5px;
244
+ justify-content: space-between;
245
+ margin-top: 8px;
246
+ padding: 0 4px;
333
247
  }
334
248
 
335
- .usage-daily-legend-swatch {
336
- width: 10px;
337
- height: 10px;
338
- border-radius: 2px;
249
+ .usage-wave-label {
250
+ font-size: 10px;
251
+ color: var(--color-text-muted);
252
+ cursor: pointer;
253
+ padding: 2px 6px;
254
+ border-radius: 4px;
255
+ transition: all 0.15s ease-out;
256
+ -webkit-tap-highlight-color: transparent;
339
257
  }
340
258
 
341
- .usage-daily-legend-swatch.current {
342
- background: var(--color-brand);
259
+ .usage-wave-label:hover {
260
+ color: var(--color-text-secondary);
261
+ background: var(--color-surface-alt);
343
262
  }
344
263
 
345
- .usage-daily-legend-swatch.prev {
346
- background: var(--color-text-muted);
347
- opacity: 0.35;
264
+ .usage-wave-label.active {
265
+ color: var(--color-brand);
266
+ font-weight: 600;
348
267
  }
349
268
 
350
- /* ---- Day detail ---- */
269
+ /* ---- 日期详情 ---- */
351
270
  .usage-daydetail {
352
- margin-top: 12px;
353
- padding: 10px 14px;
354
- border-radius: var(--radius-sm);
271
+ margin-top: 16px;
272
+ padding: 12px 16px;
273
+ border-radius: 10px;
355
274
  background: var(--color-surface-alt);
356
275
  }
357
276
 
@@ -364,7 +283,7 @@
364
283
  }
365
284
 
366
285
  .usage-daydetail-date {
367
- font-weight: 700;
286
+ font-weight: 600;
368
287
  font-size: 13px;
369
288
  color: var(--color-text-primary);
370
289
  }
@@ -380,82 +299,7 @@
380
299
  color: var(--color-text-muted);
381
300
  }
382
301
 
383
- /* ---- Lists ---- */
384
- .usage-list {
385
- display: flex;
386
- flex-direction: column;
387
- gap: 8px;
388
- }
389
-
390
- .usage-list-row {
391
- display: grid;
392
- grid-template-columns: 1fr auto;
393
- align-items: center;
394
- gap: 8px 12px;
395
- padding: 8px 10px;
396
- border-radius: var(--radius-sm);
397
- background: var(--color-surface-alt);
398
- transition: background 120ms var(--ease-spring);
399
- }
400
-
401
- .usage-list-row:hover {
402
- background: var(--color-surface-elevated);
403
- }
404
-
405
- .usage-list-title {
406
- font-size: 12px;
407
- font-weight: 600;
408
- color: var(--color-text-primary);
409
- overflow: hidden;
410
- text-overflow: ellipsis;
411
- white-space: nowrap;
412
- }
413
-
414
- .usage-list-path {
415
- font-size: 12px;
416
- color: var(--color-text-secondary);
417
- overflow: hidden;
418
- text-overflow: ellipsis;
419
- white-space: nowrap;
420
- font-family: var(--font-family-mono);
421
- font-size: 11px;
422
- }
423
-
424
- .usage-list-stat {
425
- font-size: 13px;
426
- font-weight: 700;
427
- color: var(--color-text-primary);
428
- font-variant-numeric: tabular-nums;
429
- text-align: right;
430
- }
431
-
432
- .usage-list-meta {
433
- grid-column: 1 / -1;
434
- font-size: 11px;
435
- color: var(--color-text-muted);
436
- }
437
-
438
- .usage-list-value {
439
- font-size: 12px;
440
- color: var(--color-text-secondary);
441
- padding: 8px 0;
442
- }
443
-
444
- .usage-progress {
445
- height: 3px;
446
- border-radius: 2px;
447
- background: var(--color-surface-alt);
448
- overflow: hidden;
449
- }
450
-
451
- .usage-progress-fill {
452
- height: 100%;
453
- border-radius: 2px;
454
- background: var(--color-brand);
455
- transition: width 300ms var(--ease-spring);
456
- }
457
-
458
- /* ---- Hourly heatmap ---- */
302
+ /* ---- 热力图 ---- */
459
303
  .usage-card-hourly-heatmap {
460
304
  overflow-x: auto;
461
305
  }
@@ -506,8 +350,9 @@
506
350
  .hourly-heatmap-cell {
507
351
  flex: 1;
508
352
  min-width: 0;
509
- aspect-ratio: 1;
353
+ height: 6px;
510
354
  border-radius: 3px;
355
+ transition: background 0.15s ease-out;
511
356
  }
512
357
 
513
358
  .hourly-heatmap-cell.level-0 { background: var(--color-surface-alt); }
@@ -521,7 +366,7 @@
521
366
  align-items: center;
522
367
  gap: 3px;
523
368
  justify-content: flex-end;
524
- margin-top: 8px;
369
+ margin-top: 10px;
525
370
  font-size: 10px;
526
371
  color: var(--color-text-muted);
527
372
  }
@@ -529,32 +374,199 @@
529
374
  .hourly-heatmap-legend .hourly-heatmap-cell {
530
375
  width: 11px;
531
376
  height: 11px;
532
- aspect-ratio: auto;
533
377
  }
534
378
 
535
379
  .hourly-heatmap-legend-label {
536
380
  margin: 0 2px;
537
381
  }
538
382
 
539
- /* ---- Empty state ---- */
540
- .usage-empty {
541
- padding: 32px 16px;
542
- border-radius: var(--radius-md);
383
+ /* ---- 列表样式 ---- */
384
+ .usage-list-compact {
385
+ display: flex;
386
+ flex-direction: column;
387
+ gap: 4px;
388
+ }
389
+
390
+ .usage-list-compact-item {
391
+ display: flex;
392
+ align-items: flex-start;
393
+ gap: 8px;
394
+ padding: 8px 10px;
395
+ border-radius: 8px;
396
+ cursor: pointer;
397
+ transition: all 0.15s ease-out;
398
+ -webkit-tap-highlight-color: transparent;
399
+ }
400
+
401
+ .usage-list-compact-item:hover {
402
+ background: var(--color-surface-elevated);
403
+ }
404
+
405
+ .usage-list-compact-item:active {
406
+ transform: scale(0.98);
407
+ }
408
+
409
+ .usage-list-bullet {
410
+ color: var(--color-brand);
411
+ font-size: 14px;
412
+ line-height: 1.4;
413
+ flex-shrink: 0;
414
+ }
415
+
416
+ .usage-list-compact-content {
417
+ flex: 1;
418
+ min-width: 0;
419
+ }
420
+
421
+ .usage-list-title {
422
+ font-size: 12px;
423
+ font-weight: 500;
424
+ color: var(--color-text-primary);
425
+ overflow: hidden;
426
+ text-overflow: ellipsis;
427
+ white-space: nowrap;
428
+ }
429
+
430
+ .usage-list-meta {
431
+ font-size: 11px;
432
+ color: var(--color-text-muted);
433
+ margin-top: 2px;
434
+ }
435
+
436
+ .usage-list-value {
437
+ font-size: 12px;
438
+ color: var(--color-text-secondary);
439
+ padding: 8px 0;
440
+ }
441
+
442
+ /* ---- Path 列表 ---- */
443
+ .usage-paths-section {
444
+ grid-column: 1 / -1;
445
+ }
446
+
447
+ .usage-list-paths {
448
+ display: flex;
449
+ flex-direction: column;
450
+ gap: 6px;
451
+ }
452
+
453
+ .usage-list-path-row {
454
+ display: flex;
455
+ align-items: center;
456
+ gap: 10px;
457
+ padding: 8px 10px;
458
+ border-radius: 8px;
459
+ transition: background 0.15s ease-out;
460
+ }
461
+
462
+ .usage-list-path-row:hover {
543
463
  background: var(--color-surface-alt);
544
- border: 1px dashed var(--color-border);
464
+ }
465
+
466
+ .usage-list-path-rank {
467
+ width: 18px;
468
+ height: 18px;
469
+ display: flex;
470
+ align-items: center;
471
+ justify-content: center;
472
+ font-size: 10px;
473
+ font-weight: 600;
474
+ color: var(--color-brand);
475
+ background: var(--color-surface-alt);
476
+ border-radius: 4px;
477
+ flex-shrink: 0;
478
+ }
479
+
480
+ .usage-list-path-content {
481
+ flex: 1;
482
+ display: flex;
483
+ justify-content: space-between;
484
+ align-items: center;
485
+ gap: 10px;
486
+ min-width: 0;
487
+ }
488
+
489
+ .usage-list-path {
490
+ font-size: 12px;
545
491
  color: var(--color-text-secondary);
546
- text-align: center;
492
+ font-family: var(--font-family-mono);
493
+ overflow: hidden;
494
+ text-overflow: ellipsis;
495
+ white-space: nowrap;
496
+ }
497
+
498
+ .usage-list-path-stat {
547
499
  font-size: 13px;
500
+ font-weight: 600;
501
+ color: var(--color-text-primary);
502
+ font-variant-numeric: tabular-nums;
503
+ flex-shrink: 0;
548
504
  }
549
505
 
550
- /* ---- Responsive ---- */
506
+ /* ---- 卡片 ---- */
507
+ .usage-card {
508
+ padding: 20px;
509
+ border-radius: 14px;
510
+ background: var(--color-surface);
511
+ border: 1px solid var(--color-border-soft);
512
+ margin-bottom: 0;
513
+ }
514
+
515
+ .usage-card-title {
516
+ font-size: 14px;
517
+ font-weight: 600;
518
+ color: var(--color-text-primary);
519
+ margin-bottom: 4px;
520
+ }
521
+
522
+ /* ---- 图表网格 ---- */
523
+ .usage-chart-grid {
524
+ display: grid;
525
+ grid-template-columns: repeat(2, 1fr);
526
+ gap: 12px;
527
+ }
528
+
529
+ /* ---- 内容区域 ---- */
530
+ .usage-content {
531
+ position: relative;
532
+ }
533
+
534
+ .usage-content-loading {
535
+ opacity: 0.7;
536
+ pointer-events: none;
537
+ }
538
+
539
+ .usage-content-overlay {
540
+ position: absolute;
541
+ inset: 0;
542
+ display: flex;
543
+ align-items: flex-start;
544
+ justify-content: flex-end;
545
+ padding: 12px;
546
+ z-index: 1;
547
+ }
548
+
549
+ .usage-spinner {
550
+ width: 16px;
551
+ height: 16px;
552
+ border-radius: 50%;
553
+ border: 2px solid var(--color-border-soft);
554
+ border-top-color: var(--color-brand);
555
+ animation: usage-spin 0.8s linear infinite;
556
+ }
557
+
558
+ @keyframes usage-spin {
559
+ to { transform: rotate(360deg); }
560
+ }
561
+
562
+ /* ---- 响应式 ---- */
551
563
  @media (max-width: 960px) {
552
564
  .usage-chart-grid {
553
565
  grid-template-columns: 1fr;
554
566
  }
555
567
 
556
- .usage-summary-grid {
557
- grid-template-columns: repeat(2, 1fr);
568
+ .usage-hero-main {
569
+ font-size: 36px;
558
570
  }
559
571
  }
560
572
 
@@ -569,20 +581,25 @@
569
581
  flex-wrap: wrap;
570
582
  }
571
583
 
572
- .usage-summary-grid {
573
- grid-template-columns: repeat(2, 1fr);
584
+ .usage-hero {
585
+ padding: 20px;
586
+ min-height: 120px;
574
587
  }
575
588
 
576
- .usage-summary-card-value {
577
- font-size: 22px;
589
+ .usage-hero-main {
590
+ font-size: 32px;
578
591
  }
579
592
 
580
- .usage-daily-chart {
593
+ .usage-wave-chart {
581
594
  height: 100px;
582
595
  }
583
596
 
584
- .usage-daily-bar-stack {
585
- max-width: 24px;
586
- height: 70px;
597
+ .usage-wave-labels {
598
+ font-size: 9px;
599
+ }
600
+
601
+ .hourly-heatmap-wrapper {
602
+ min-width: 100%;
603
+ overflow-x: auto;
587
604
  }
588
605
  }