codexmate 0.0.21 → 0.0.22

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 (114) hide show
  1. package/README.md +389 -284
  2. package/README.zh.md +321 -0
  3. package/cli/agents-files.js +224 -162
  4. package/cli/archive-helpers.js +446 -446
  5. package/cli/auth-profiles.js +359 -359
  6. package/cli/builtin-proxy.js +1044 -580
  7. package/cli/claude-proxy.js +998 -998
  8. package/cli/config-bootstrap.js +384 -384
  9. package/cli/config-health.js +338 -338
  10. package/cli/openai-bridge.js +950 -0
  11. package/cli/openclaw-config.js +629 -629
  12. package/cli/session-usage.concurrent.js +28 -0
  13. package/cli/session-usage.js +112 -0
  14. package/cli/session-usage.models.js +176 -0
  15. package/cli/skills.js +1141 -1141
  16. package/cli/zip-commands.js +510 -510
  17. package/cli.js +13214 -13129
  18. package/lib/cli-file-utils.js +151 -151
  19. package/lib/cli-models-utils.js +419 -419
  20. package/lib/cli-network-utils.js +164 -164
  21. package/lib/cli-path-utils.js +69 -69
  22. package/lib/cli-session-utils.js +121 -121
  23. package/lib/cli-sessions.js +386 -386
  24. package/lib/cli-utils.js +155 -155
  25. package/lib/download-artifacts.js +77 -77
  26. package/lib/mcp-stdio.js +440 -440
  27. package/lib/task-orchestrator.js +869 -869
  28. package/lib/text-diff.js +303 -303
  29. package/lib/workflow-engine.js +340 -340
  30. package/package.json +74 -74
  31. package/res/json5.min.js +1 -1
  32. package/res/logo.png +0 -0
  33. package/res/vue.global.prod.js +13 -13
  34. package/web-ui/app.js +575 -530
  35. package/web-ui/index.html +34 -33
  36. package/web-ui/logic.agents-diff.mjs +386 -386
  37. package/web-ui/logic.claude.mjs +168 -168
  38. package/web-ui/logic.mjs +5 -5
  39. package/web-ui/logic.runtime.mjs +128 -124
  40. package/web-ui/logic.sessions.mjs +614 -581
  41. package/web-ui/modules/api.mjs +90 -90
  42. package/web-ui/modules/app.computed.dashboard.mjs +126 -113
  43. package/web-ui/modules/app.computed.index.mjs +17 -15
  44. package/web-ui/modules/app.computed.main-tabs.mjs +198 -195
  45. package/web-ui/modules/app.computed.session.mjs +653 -507
  46. package/web-ui/modules/app.constants.mjs +15 -15
  47. package/web-ui/modules/app.methods.agents.mjs +544 -493
  48. package/web-ui/modules/app.methods.claude-config.mjs +174 -174
  49. package/web-ui/modules/app.methods.codex-config.mjs +795 -640
  50. package/web-ui/modules/app.methods.index.mjs +92 -88
  51. package/web-ui/modules/app.methods.install.mjs +161 -149
  52. package/web-ui/modules/app.methods.navigation.mjs +619 -619
  53. package/web-ui/modules/app.methods.openclaw-core.mjs +814 -814
  54. package/web-ui/modules/app.methods.openclaw-editing.mjs +372 -372
  55. package/web-ui/modules/app.methods.openclaw-persist.mjs +369 -369
  56. package/web-ui/modules/app.methods.providers.mjs +404 -363
  57. package/web-ui/modules/app.methods.runtime.mjs +323 -323
  58. package/web-ui/modules/app.methods.session-actions.mjs +537 -520
  59. package/web-ui/modules/app.methods.session-browser.mjs +626 -626
  60. package/web-ui/modules/app.methods.session-timeline.mjs +448 -448
  61. package/web-ui/modules/app.methods.session-trash.mjs +422 -422
  62. package/web-ui/modules/app.methods.startup-claude.mjs +405 -412
  63. package/web-ui/modules/app.methods.task-orchestration.mjs +471 -471
  64. package/web-ui/modules/config-mode.computed.mjs +126 -126
  65. package/web-ui/modules/config-template-confirm-pref.mjs +33 -0
  66. package/web-ui/modules/i18n.mjs +1609 -0
  67. package/web-ui/modules/plugins.computed.mjs +220 -0
  68. package/web-ui/modules/plugins.methods.mjs +620 -0
  69. package/web-ui/modules/plugins.storage.mjs +37 -0
  70. package/web-ui/modules/skills.computed.mjs +107 -107
  71. package/web-ui/modules/skills.methods.mjs +481 -481
  72. package/web-ui/partials/index/layout-footer.html +13 -13
  73. package/web-ui/partials/index/layout-header.html +461 -402
  74. package/web-ui/partials/index/modal-config-template-agents.html +175 -125
  75. package/web-ui/partials/index/modal-confirm-toast.html +32 -32
  76. package/web-ui/partials/index/modal-health-check.html +72 -72
  77. package/web-ui/partials/index/modal-openclaw-config.html +280 -280
  78. package/web-ui/partials/index/modal-skills.html +200 -184
  79. package/web-ui/partials/index/modals-basic.html +165 -156
  80. package/web-ui/partials/index/panel-config-claude.html +138 -126
  81. package/web-ui/partials/index/panel-config-codex.html +234 -237
  82. package/web-ui/partials/index/panel-config-openclaw.html +78 -78
  83. package/web-ui/partials/index/panel-docs.html +147 -130
  84. package/web-ui/partials/index/panel-market.html +174 -174
  85. package/web-ui/partials/index/panel-orchestration.html +397 -397
  86. package/web-ui/partials/index/panel-plugins.html +243 -0
  87. package/web-ui/partials/index/panel-sessions.html +292 -292
  88. package/web-ui/partials/index/panel-settings.html +258 -190
  89. package/web-ui/partials/index/panel-usage.html +353 -213
  90. package/web-ui/session-helpers.mjs +573 -559
  91. package/web-ui/source-bundle.cjs +233 -233
  92. package/web-ui/styles/base-theme.css +264 -271
  93. package/web-ui/styles/controls-forms.css +362 -360
  94. package/web-ui/styles/docs-panel.css +247 -182
  95. package/web-ui/styles/feedback.css +108 -108
  96. package/web-ui/styles/health-check-dialog.css +144 -144
  97. package/web-ui/styles/layout-shell.css +596 -376
  98. package/web-ui/styles/modals-core.css +464 -464
  99. package/web-ui/styles/navigation-panels.css +382 -348
  100. package/web-ui/styles/openclaw-structured.css +266 -266
  101. package/web-ui/styles/plugins-panel.css +518 -0
  102. package/web-ui/styles/responsive.css +456 -450
  103. package/web-ui/styles/sessions-list.css +400 -400
  104. package/web-ui/styles/sessions-preview.css +411 -411
  105. package/web-ui/styles/sessions-toolbar-trash.css +268 -243
  106. package/web-ui/styles/sessions-usage.css +851 -628
  107. package/web-ui/styles/settings-panel.css +166 -0
  108. package/web-ui/styles/skills-list.css +303 -296
  109. package/web-ui/styles/skills-market.css +396 -335
  110. package/web-ui/styles/task-orchestration.css +776 -776
  111. package/web-ui/styles/titles-cards.css +408 -408
  112. package/web-ui/styles.css +20 -18
  113. package/web-ui.html +17 -17
  114. package/README.en.md +0 -349
@@ -1,628 +1,851 @@
1
- .sessions-subtabs {
2
- display: flex;
3
- gap: 10px;
4
- align-items: center;
5
- margin: 0 0 16px;
6
- }
7
-
8
- .sessions-subtab {
9
- border: 1px solid var(--color-border);
10
- background: var(--color-surface-alt);
11
- color: var(--color-text-secondary);
12
- padding: 8px 14px;
13
- border-radius: 999px;
14
- cursor: pointer;
15
- font-size: 13px;
16
- font-weight: 600;
17
- transition:
18
- background var(--transition-fast) var(--ease-smooth),
19
- color var(--transition-fast) var(--ease-smooth),
20
- border-color var(--transition-fast) var(--ease-smooth),
21
- box-shadow var(--transition-fast) var(--ease-smooth),
22
- transform var(--transition-fast) var(--ease-smooth);
23
- }
24
-
25
- .sessions-subtab:hover {
26
- background: var(--color-surface);
27
- border-color: var(--color-border-strong);
28
- color: var(--color-text-primary);
29
- }
30
-
31
- .sessions-subtab.active {
32
- background: var(--color-brand-light);
33
- color: var(--color-brand-dark);
34
- border-color: var(--color-brand);
35
- box-shadow: var(--shadow-subtle);
36
- }
37
-
38
- .usage-toolbar {
39
- display: flex;
40
- justify-content: space-between;
41
- align-items: center;
42
- gap: 12px;
43
- flex-wrap: wrap;
44
- margin-bottom: 16px;
45
- }
46
-
47
- .usage-range-group {
48
- display: flex;
49
- gap: 8px;
50
- flex-wrap: wrap;
51
- }
52
-
53
- .usage-range-btn {
54
- border: 1px solid var(--color-border);
55
- background: var(--color-surface-alt);
56
- color: var(--color-text-secondary);
57
- padding: 6px 12px;
58
- border-radius: 999px;
59
- cursor: pointer;
60
- font-size: 12px;
61
- font-weight: 600;
62
- transition:
63
- background var(--transition-fast) var(--ease-smooth),
64
- color var(--transition-fast) var(--ease-smooth),
65
- border-color var(--transition-fast) var(--ease-smooth),
66
- box-shadow var(--transition-fast) var(--ease-smooth);
67
- }
68
-
69
- .usage-range-btn:hover {
70
- background: var(--color-surface);
71
- border-color: var(--color-border-strong);
72
- color: var(--color-text-primary);
73
- }
74
-
75
- .usage-range-btn.active {
76
- background: var(--color-brand-light);
77
- color: var(--color-brand-dark);
78
- border-color: var(--color-brand);
79
- box-shadow: var(--shadow-subtle);
80
- }
81
-
82
- .usage-summary-grid {
83
- display: grid;
84
- grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
85
- gap: 12px;
86
- margin-bottom: 16px;
87
- }
88
-
89
- .usage-summary-card {
90
- display: flex;
91
- flex-direction: column;
92
- justify-content: flex-start;
93
- gap: 4px;
94
- min-height: 88px;
95
- padding: 12px 14px;
96
- border-radius: 14px;
97
- background: var(--color-surface-alt);
98
- border: 1px solid var(--color-border-soft);
99
- box-shadow: var(--shadow-subtle);
100
- }
101
-
102
- .usage-summary-label {
103
- min-height: 0;
104
- font-size: 12px;
105
- line-height: 1.4;
106
- color: var(--color-text-secondary);
107
- margin-bottom: 0;
108
- }
109
-
110
- .usage-summary-value {
111
- min-height: 0;
112
- display: flex;
113
- align-items: center;
114
- font-size: clamp(18px, 1.8vw, 22px);
115
- line-height: 1.15;
116
- font-weight: 700;
117
- color: var(--color-text-primary);
118
- word-break: break-word;
119
- }
120
-
121
- .usage-summary-note {
122
- margin-top: 2px;
123
- min-height: 0;
124
- font-size: 12px;
125
- color: var(--color-text-secondary);
126
- line-height: 1.35;
127
- }
128
-
129
- .usage-chart-grid {
130
- display: grid;
131
- grid-template-columns: 2fr 1fr;
132
- gap: 16px;
133
- }
134
-
135
- .usage-card {
136
- padding: 16px;
137
- border-radius: 16px;
138
- background: var(--color-surface);
139
- border: 1px solid var(--color-border-soft);
140
- box-shadow: var(--shadow-subtle);
141
- min-width: 0;
142
- overflow: hidden;
143
- }
144
-
145
- .usage-card-head {
146
- display: flex;
147
- align-items: flex-start;
148
- justify-content: space-between;
149
- gap: 12px;
150
- margin-bottom: 12px;
151
- }
152
-
153
- .usage-card-title {
154
- font-size: 14px;
155
- font-weight: 700;
156
- color: var(--color-text-primary);
157
- margin-bottom: 4px;
158
- }
159
-
160
- .usage-card-subtitle {
161
- font-size: 12px;
162
- line-height: 1.5;
163
- color: var(--color-text-secondary);
164
- }
165
-
166
- .usage-card-kicker {
167
- display: inline-flex;
168
- align-items: center;
169
- min-height: 30px;
170
- padding: 0 10px;
171
- border-radius: 999px;
172
- border: 1px solid var(--color-border);
173
- background: var(--color-surface-alt);
174
- color: var(--color-text-secondary);
175
- font-size: 12px;
176
- font-weight: 600;
177
- white-space: nowrap;
178
- }
179
-
180
- .usage-bars {
181
- display: flex;
182
- align-items: flex-end;
183
- gap: 8px;
184
- min-height: 180px;
185
- width: 100%;
186
- min-width: 0;
187
- overflow-x: auto;
188
- overflow-y: hidden;
189
- padding: 0 2px 10px;
190
- scrollbar-gutter: stable both-edges;
191
- scrollbar-width: thin;
192
- scrollbar-color: rgba(199, 116, 98, 0.72) rgba(199, 116, 98, 0.08);
193
- }
194
-
195
- .usage-bars::-webkit-scrollbar {
196
- height: 10px;
197
- }
198
-
199
- .usage-bars::-webkit-scrollbar-track {
200
- background: linear-gradient(90deg, rgba(199, 116, 98, 0.04), rgba(199, 116, 98, 0.1));
201
- border-radius: 999px;
202
- }
203
-
204
- .usage-bars::-webkit-scrollbar-thumb {
205
- background: linear-gradient(90deg, rgba(199, 116, 98, 0.68), rgba(180, 94, 78, 0.92));
206
- border-radius: 999px;
207
- border: 2px solid rgba(248, 243, 238, 0.96);
208
- }
209
-
210
- .usage-bars::-webkit-scrollbar-thumb:hover {
211
- background: linear-gradient(90deg, rgba(199, 116, 98, 0.82), rgba(180, 94, 78, 1));
212
- }
213
-
214
- .usage-bar-group {
215
- flex: 1 0 44px;
216
- min-width: 44px;
217
- display: flex;
218
- flex-direction: column;
219
- align-items: center;
220
- gap: 8px;
221
- }
222
-
223
- .usage-bar-stack {
224
- width: 100%;
225
- max-width: 36px;
226
- height: 160px;
227
- display: flex;
228
- align-items: flex-end;
229
- gap: 4px;
230
- }
231
-
232
- .usage-bar {
233
- flex: 1;
234
- border-radius: 10px 10px 4px 4px;
235
- min-height: 4px;
236
- }
237
-
238
- .usage-bar.codex {
239
- background: var(--color-brand);
240
- }
241
-
242
- .usage-bar.claude {
243
- background: #8b6bd6;
244
- }
245
-
246
- .usage-bar-label {
247
- font-size: 11px;
248
- color: var(--color-text-secondary);
249
- width: 100%;
250
- text-align: center;
251
- white-space: nowrap;
252
- overflow: hidden;
253
- text-overflow: ellipsis;
254
- }
255
-
256
- .usage-legend {
257
- display: flex;
258
- gap: 14px;
259
- flex-wrap: wrap;
260
- font-size: 12px;
261
- color: var(--color-text-secondary);
262
- margin-bottom: 10px;
263
- }
264
-
265
- .usage-legend-dot {
266
- width: 10px;
267
- height: 10px;
268
- border-radius: 999px;
269
- display: inline-block;
270
- margin-right: 6px;
271
- }
272
-
273
- .usage-list {
274
- display: flex;
275
- flex-direction: column;
276
- gap: 10px;
277
- min-width: 0;
278
- }
279
-
280
- .usage-list-row {
281
- display: grid;
282
- grid-template-columns: minmax(56px, 72px) minmax(0, 1fr) minmax(48px, auto);
283
- gap: 10px;
284
- align-items: center;
285
- min-width: 0;
286
- }
287
-
288
- .usage-list-label,
289
- .usage-list-value {
290
- font-size: 12px;
291
- color: var(--color-text-secondary);
292
- min-width: 0;
293
- }
294
-
295
- .usage-list-label {
296
- font-weight: 600;
297
- color: var(--color-text-primary);
298
- }
299
-
300
- .usage-list-value {
301
- word-break: break-word;
302
- overflow-wrap: anywhere;
303
- text-align: right;
304
- }
305
-
306
- .usage-list-subvalue {
307
- grid-column: 1 / -1;
308
- font-size: 11px;
309
- color: var(--color-text-tertiary, var(--color-text-secondary));
310
- line-height: 1.45;
311
- }
312
-
313
- .usage-list-row-compact {
314
- grid-template-columns: minmax(52px, 64px) minmax(0, 1fr) minmax(32px, auto);
315
- }
316
-
317
- .usage-progress {
318
- height: 8px;
319
- border-radius: 999px;
320
- background: rgba(71, 60, 52, 0.10);
321
- overflow: hidden;
322
- }
323
-
324
- .usage-progress-fill {
325
- height: 100%;
326
- border-radius: 999px;
327
- background: linear-gradient(90deg, var(--color-brand), #8b6bd6);
328
- }
329
-
330
- .usage-mini-bars {
331
- display: grid;
332
- grid-template-columns: repeat(24, minmax(0, 1fr));
333
- gap: 10px 8px;
334
- align-items: end;
335
- }
336
-
337
- .usage-mini-bar-group {
338
- display: flex;
339
- flex-direction: column;
340
- align-items: center;
341
- gap: 6px;
342
- min-width: 0;
343
- }
344
-
345
- .usage-mini-bar-track {
346
- width: 100%;
347
- min-width: 16px;
348
- max-width: 24px;
349
- height: 72px;
350
- border-radius: 10px;
351
- background: rgba(71, 60, 52, 0.08);
352
- display: flex;
353
- align-items: flex-end;
354
- overflow: hidden;
355
- }
356
-
357
- .usage-mini-bar-fill {
358
- width: 100%;
359
- min-height: 6px;
360
- border-radius: 10px 10px 4px 4px;
361
- background: linear-gradient(180deg, #8b6bd6 0%, var(--color-brand) 100%);
362
- }
363
-
364
- .usage-mini-bar-label {
365
- font-size: 10px;
366
- color: var(--color-text-secondary);
367
- }
368
-
369
- .usage-session-list {
370
- display: flex;
371
- flex-direction: column;
372
- gap: 10px;
373
- }
374
-
375
- .usage-session-item {
376
- padding: 12px;
377
- border-radius: 12px;
378
- background: var(--color-surface-alt);
379
- border: 1px solid var(--color-border-soft);
380
- min-width: 0;
381
- }
382
-
383
- .usage-session-row {
384
- display: flex;
385
- justify-content: space-between;
386
- gap: 10px;
387
- align-items: flex-start;
388
- min-width: 0;
389
- }
390
-
391
- .usage-session-title {
392
- font-size: 13px;
393
- font-weight: 600;
394
- color: var(--color-text-primary);
395
- min-width: 0;
396
- overflow: hidden;
397
- text-overflow: ellipsis;
398
- white-space: nowrap;
399
- }
400
-
401
- .usage-inline-stat {
402
- font-size: 11px;
403
- color: var(--color-brand-dark);
404
- background: var(--color-brand-light);
405
- border-radius: 999px;
406
- padding: 4px 8px;
407
- flex-shrink: 0;
408
- font-weight: 700;
409
- }
410
-
411
- .usage-session-meta {
412
- display: flex;
413
- gap: 10px;
414
- flex-wrap: wrap;
415
- font-size: 11px;
416
- color: var(--color-text-secondary);
417
- margin-top: 6px;
418
- }
419
-
420
- .usage-session-path {
421
- margin-top: 6px;
422
- font-size: 11px;
423
- color: var(--color-text-secondary);
424
- word-break: break-word;
425
- overflow-wrap: anywhere;
426
- }
427
-
428
- .usage-card-models {
429
- display: flex;
430
- flex-direction: column;
431
- gap: 12px;
432
- }
433
-
434
- .usage-model-coverage-strip {
435
- display: grid;
436
- grid-template-columns: repeat(3, minmax(0, 1fr));
437
- gap: 10px;
438
- }
439
-
440
- .usage-model-coverage-item {
441
- padding: 12px;
442
- border-radius: 12px;
443
- border: 1px solid var(--color-border-soft);
444
- background: var(--color-surface-alt);
445
- display: flex;
446
- flex-direction: column;
447
- gap: 4px;
448
- }
449
-
450
- .usage-model-coverage-item strong {
451
- font-size: 20px;
452
- color: var(--color-text-primary);
453
- }
454
-
455
- .usage-model-coverage-item span,
456
- .usage-inline-note,
457
- .usage-diagnostic-copy,
458
- .usage-diagnostic-meta {
459
- font-size: 12px;
460
- line-height: 1.5;
461
- color: var(--color-text-secondary);
462
- }
463
-
464
- .usage-diagnostic-empty {
465
- padding: 14px;
466
- border-radius: 14px;
467
- border: 1px dashed var(--color-border);
468
- background: var(--color-surface-alt);
469
- }
470
-
471
- .usage-diagnostic-title {
472
- font-size: 13px;
473
- font-weight: 700;
474
- color: var(--color-text-primary);
475
- margin-bottom: 6px;
476
- }
477
-
478
- .usage-inline-note {
479
- padding: 10px 12px;
480
- border-radius: 12px;
481
- background: rgba(255, 244, 220, 0.62);
482
- color: #7a5110;
483
- }
484
-
485
- .usage-inline-tag {
486
- display: inline-flex;
487
- align-items: center;
488
- margin: 0 6px 0 0;
489
- padding: 2px 8px;
490
- border-radius: 999px;
491
- background: rgba(122, 81, 16, 0.10);
492
- border: 1px solid rgba(122, 81, 16, 0.14);
493
- color: inherit;
494
- font-weight: 700;
495
- }
496
-
497
- .usage-diagnostic-list {
498
- display: flex;
499
- flex-direction: column;
500
- gap: 8px;
501
- }
502
-
503
- .usage-diagnostic-list-title {
504
- font-size: 12px;
505
- font-weight: 700;
506
- color: var(--color-text-primary);
507
- }
508
-
509
- .usage-diagnostic-row {
510
- display: flex;
511
- justify-content: space-between;
512
- gap: 12px;
513
- align-items: center;
514
- padding: 10px 12px;
515
- border-radius: 12px;
516
- border: 1px solid var(--color-border-soft);
517
- background: var(--color-surface-alt);
518
- }
519
-
520
- .usage-diagnostic-row-main,
521
- .usage-diagnostic-row-side {
522
- min-width: 0;
523
- }
524
-
525
- .usage-diagnostic-row-title {
526
- font-size: 12px;
527
- font-weight: 700;
528
- color: var(--color-text-primary);
529
- word-break: break-word;
530
- overflow-wrap: anywhere;
531
- }
532
-
533
- .usage-diagnostic-row-meta {
534
- display: flex;
535
- flex-wrap: wrap;
536
- gap: 8px;
537
- margin-top: 4px;
538
- font-size: 11px;
539
- color: var(--color-text-secondary);
540
- }
541
-
542
- .usage-diagnostic-row-side {
543
- display: flex;
544
- align-items: center;
545
- gap: 8px;
546
- flex-wrap: wrap;
547
- justify-content: flex-end;
548
- }
549
-
550
- .usage-model-list {
551
- display: flex;
552
- flex-wrap: wrap;
553
- gap: 10px;
554
- }
555
-
556
- .usage-model-chip {
557
- min-width: 0;
558
- max-width: 100%;
559
- padding: 10px 12px;
560
- border-radius: 12px;
561
- background: var(--color-surface-alt);
562
- border: 1px solid var(--color-border-soft);
563
- }
564
-
565
- .usage-model-name {
566
- font-size: 12px;
567
- font-weight: 700;
568
- color: var(--color-text-primary);
569
- word-break: break-word;
570
- overflow-wrap: anywhere;
571
- }
572
-
573
- .usage-model-meta {
574
- margin-top: 4px;
575
- font-size: 11px;
576
- color: var(--color-text-secondary);
577
- line-height: 1.4;
578
- }
579
-
580
- .usage-empty {
581
- padding: 24px 16px;
582
- border-radius: 16px;
583
- background: var(--color-surface-alt);
584
- border: 1px dashed var(--color-border);
585
- color: var(--color-text-secondary);
586
- }
587
-
588
- @media (max-width: 960px) {
589
- .usage-chart-grid,
590
- .usage-model-coverage-strip {
591
- grid-template-columns: 1fr;
592
- }
593
- }
594
-
595
- @media (max-width: 640px) {
596
- .usage-list-row {
597
- grid-template-columns: 1fr;
598
- gap: 6px;
599
- }
600
-
601
- .usage-list-subvalue {
602
- grid-column: auto;
603
- }
604
-
605
- .usage-list-value {
606
- text-align: left;
607
- }
608
-
609
- .usage-mini-bars {
610
- grid-template-columns: repeat(12, minmax(0, 1fr));
611
- }
612
-
613
- .usage-bar-group {
614
- flex-basis: 36px;
615
- min-width: 36px;
616
- }
617
-
618
- .usage-bar-stack {
619
- max-width: 28px;
620
- }
621
-
622
- .usage-toolbar,
623
- .usage-card-head,
624
- .usage-session-row {
625
- flex-direction: column;
626
- align-items: stretch;
627
- }
628
- }
1
+ .sessions-subtabs {
2
+ display: flex;
3
+ gap: 10px;
4
+ align-items: center;
5
+ margin: 0 0 16px;
6
+ }
7
+
8
+ .sessions-subtab {
9
+ border: 1px solid var(--color-border);
10
+ background: var(--color-surface-alt);
11
+ color: var(--color-text-secondary);
12
+ padding: 8px 14px;
13
+ border-radius: 999px;
14
+ cursor: pointer;
15
+ font-size: 13px;
16
+ font-weight: 600;
17
+ transition:
18
+ background var(--transition-fast) var(--ease-smooth),
19
+ color var(--transition-fast) var(--ease-smooth),
20
+ border-color var(--transition-fast) var(--ease-smooth),
21
+ box-shadow var(--transition-fast) var(--ease-smooth),
22
+ transform var(--transition-fast) var(--ease-smooth);
23
+ }
24
+
25
+ .sessions-subtab:hover {
26
+ background: var(--color-surface);
27
+ border-color: var(--color-border-strong);
28
+ color: var(--color-text-primary);
29
+ }
30
+
31
+ .sessions-subtab.active {
32
+ background: var(--color-brand-light);
33
+ color: var(--color-brand-dark);
34
+ border-color: var(--color-brand);
35
+ box-shadow: var(--shadow-subtle);
36
+ }
37
+
38
+ .usage-toolbar {
39
+ display: flex;
40
+ justify-content: space-between;
41
+ align-items: center;
42
+ gap: 12px;
43
+ flex-wrap: wrap;
44
+ margin-bottom: 16px;
45
+ }
46
+
47
+ .usage-range-group {
48
+ display: flex;
49
+ gap: 8px;
50
+ flex-wrap: wrap;
51
+ }
52
+
53
+ .usage-range-btn {
54
+ border: 1px solid var(--color-border);
55
+ background: var(--color-surface-alt);
56
+ color: var(--color-text-secondary);
57
+ padding: 6px 12px;
58
+ border-radius: 999px;
59
+ cursor: pointer;
60
+ font-size: 12px;
61
+ font-weight: 600;
62
+ transition:
63
+ background var(--transition-fast) var(--ease-smooth),
64
+ color var(--transition-fast) var(--ease-smooth),
65
+ border-color var(--transition-fast) var(--ease-smooth),
66
+ box-shadow var(--transition-fast) var(--ease-smooth);
67
+ }
68
+
69
+ .usage-range-btn:hover {
70
+ background: var(--color-surface);
71
+ border-color: var(--color-border-strong);
72
+ color: var(--color-text-primary);
73
+ }
74
+
75
+ .usage-range-btn.active {
76
+ background: var(--color-brand-light);
77
+ color: var(--color-brand-dark);
78
+ border-color: var(--color-brand);
79
+ box-shadow: var(--shadow-subtle);
80
+ }
81
+
82
+ .usage-summary-grid {
83
+ display: grid;
84
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
85
+ gap: 12px;
86
+ margin-bottom: 16px;
87
+ }
88
+
89
+ .usage-summary-card {
90
+ display: flex;
91
+ flex-direction: column;
92
+ justify-content: flex-start;
93
+ gap: 4px;
94
+ min-height: 88px;
95
+ padding: 12px 14px;
96
+ border-radius: 14px;
97
+ background: var(--color-surface-alt);
98
+ border: 1px solid var(--color-border-soft);
99
+ box-shadow: var(--shadow-subtle);
100
+ }
101
+
102
+ .usage-content {
103
+ position: relative;
104
+ }
105
+
106
+ .usage-content-loading {
107
+ opacity: 0.82;
108
+ }
109
+
110
+ .usage-content-overlay {
111
+ position: absolute;
112
+ inset: 0;
113
+ display: flex;
114
+ align-items: flex-start;
115
+ justify-content: flex-end;
116
+ padding: 12px 10px;
117
+ pointer-events: none;
118
+ font-size: 12px;
119
+ color: var(--color-text-secondary);
120
+ }
121
+
122
+ .usage-spinner {
123
+ width: 14px;
124
+ height: 14px;
125
+ border-radius: 999px;
126
+ border: 2px solid rgba(80, 90, 100, 0.22);
127
+ border-top-color: rgba(80, 90, 100, 0.7);
128
+ margin-right: 8px;
129
+ animation: usage-spin 0.9s linear infinite;
130
+ }
131
+
132
+ @keyframes usage-spin {
133
+ to {
134
+ transform: rotate(360deg);
135
+ }
136
+ }
137
+
138
+ .usage-copyable {
139
+ cursor: pointer;
140
+ user-select: none;
141
+ -webkit-tap-highlight-color: transparent;
142
+ }
143
+
144
+ .usage-copyable:focus-visible {
145
+ outline: 2px solid var(--color-brand);
146
+ outline-offset: 2px;
147
+ border-radius: 10px;
148
+ }
149
+
150
+ .usage-summary-card.usage-copyable:hover {
151
+ border-color: var(--color-border-strong);
152
+ }
153
+
154
+ .usage-loading-skeleton {
155
+ display: flex;
156
+ flex-direction: column;
157
+ gap: 16px;
158
+ }
159
+
160
+ /* When showing the "正在加载" notice above the skeleton, keep comfortable spacing. */
161
+ .session-empty + .usage-loading-skeleton {
162
+ margin-top: 14px;
163
+ }
164
+
165
+ .usage-skeleton-card {
166
+ position: relative;
167
+ overflow: hidden;
168
+ }
169
+
170
+ .usage-skeleton-block {
171
+ position: relative;
172
+ min-height: 220px;
173
+ overflow: hidden;
174
+ }
175
+
176
+ .usage-skeleton-line {
177
+ height: 10px;
178
+ border-radius: 999px;
179
+ background: linear-gradient(90deg, rgba(150, 160, 170, 0.12), rgba(150, 160, 170, 0.22), rgba(150, 160, 170, 0.12));
180
+ background-size: 200% 100%;
181
+ animation: usage-skeleton 1.2s ease-in-out infinite;
182
+ }
183
+
184
+ .usage-skeleton-line.h-lg {
185
+ height: 20px;
186
+ margin-top: 6px;
187
+ }
188
+
189
+ .usage-skeleton-line.w-40 { width: 40%; }
190
+ .usage-skeleton-line.w-55 { width: 55%; }
191
+ .usage-skeleton-line.w-70 { width: 70%; }
192
+
193
+ .usage-skeleton-card .usage-skeleton-line + .usage-skeleton-line {
194
+ margin-top: 10px;
195
+ }
196
+
197
+ .usage-skeleton-block::before,
198
+ .usage-skeleton-card::before {
199
+ content: '';
200
+ position: absolute;
201
+ inset: 0;
202
+ background: radial-gradient(circle at 25% 10%, rgba(255, 255, 255, 0.22), transparent 55%);
203
+ pointer-events: none;
204
+ }
205
+
206
+ @keyframes usage-skeleton {
207
+ 0% { background-position: 0% 0; }
208
+ 100% { background-position: 200% 0; }
209
+ }
210
+
211
+ .usage-summary-label {
212
+ min-height: 0;
213
+ font-size: 12px;
214
+ line-height: 1.4;
215
+ color: var(--color-text-secondary);
216
+ margin-bottom: 0;
217
+ }
218
+
219
+ .usage-summary-value {
220
+ min-height: 0;
221
+ display: flex;
222
+ align-items: center;
223
+ font-size: clamp(18px, 1.8vw, 22px);
224
+ line-height: 1.15;
225
+ font-weight: 700;
226
+ color: var(--color-text-primary);
227
+ word-break: break-word;
228
+ }
229
+
230
+ .usage-summary-note {
231
+ margin-top: 2px;
232
+ min-height: 0;
233
+ font-size: 12px;
234
+ color: var(--color-text-secondary);
235
+ line-height: 1.35;
236
+ }
237
+
238
+ .usage-chart-grid {
239
+ display: grid;
240
+ grid-template-columns: 2fr 1fr;
241
+ gap: 16px;
242
+ }
243
+
244
+ .usage-card {
245
+ padding: 16px;
246
+ border-radius: 16px;
247
+ background: var(--color-surface);
248
+ border: 1px solid var(--color-border-soft);
249
+ box-shadow: var(--shadow-subtle);
250
+ min-width: 0;
251
+ overflow: hidden;
252
+ }
253
+
254
+ .usage-card-head {
255
+ display: flex;
256
+ align-items: flex-start;
257
+ justify-content: space-between;
258
+ gap: 12px;
259
+ margin-bottom: 12px;
260
+ }
261
+
262
+ .usage-card-title {
263
+ font-size: 14px;
264
+ font-weight: 700;
265
+ color: var(--color-text-primary);
266
+ margin-bottom: 4px;
267
+ }
268
+
269
+ .usage-card-subtitle {
270
+ font-size: 12px;
271
+ line-height: 1.5;
272
+ color: var(--color-text-secondary);
273
+ }
274
+
275
+ .usage-card-kicker {
276
+ display: inline-flex;
277
+ align-items: center;
278
+ min-height: 30px;
279
+ padding: 0 10px;
280
+ border-radius: 999px;
281
+ border: 1px solid var(--color-border);
282
+ background: var(--color-surface-alt);
283
+ color: var(--color-text-secondary);
284
+ font-size: 12px;
285
+ font-weight: 600;
286
+ white-space: nowrap;
287
+ }
288
+
289
+ .usage-bars {
290
+ display: flex;
291
+ align-items: flex-end;
292
+ gap: 8px;
293
+ min-height: 180px;
294
+ width: 100%;
295
+ min-width: 0;
296
+ overflow-x: auto;
297
+ overflow-y: hidden;
298
+ padding: 0 2px 10px;
299
+ scrollbar-gutter: stable both-edges;
300
+ scrollbar-width: thin;
301
+ scrollbar-color: rgba(199, 116, 98, 0.72) rgba(199, 116, 98, 0.08);
302
+ }
303
+
304
+ .usage-bars::-webkit-scrollbar {
305
+ height: 10px;
306
+ }
307
+
308
+ .usage-bars::-webkit-scrollbar-track {
309
+ background: linear-gradient(90deg, rgba(199, 116, 98, 0.04), rgba(199, 116, 98, 0.1));
310
+ border-radius: 999px;
311
+ }
312
+
313
+ .usage-bars::-webkit-scrollbar-thumb {
314
+ background: linear-gradient(90deg, rgba(199, 116, 98, 0.68), rgba(180, 94, 78, 0.92));
315
+ border-radius: 999px;
316
+ border: 2px solid rgba(248, 243, 238, 0.96);
317
+ }
318
+
319
+ .usage-bars::-webkit-scrollbar-thumb:hover {
320
+ background: linear-gradient(90deg, rgba(199, 116, 98, 0.82), rgba(180, 94, 78, 1));
321
+ }
322
+
323
+ .usage-bar-group {
324
+ flex: 1 0 44px;
325
+ min-width: 44px;
326
+ display: flex;
327
+ flex-direction: column;
328
+ align-items: center;
329
+ gap: 8px;
330
+ }
331
+
332
+ .usage-bar-stack {
333
+ width: 100%;
334
+ max-width: 36px;
335
+ height: 160px;
336
+ display: flex;
337
+ align-items: flex-end;
338
+ gap: 4px;
339
+ }
340
+
341
+ .usage-bar {
342
+ flex: 1;
343
+ border-radius: 10px 10px 4px 4px;
344
+ min-height: 4px;
345
+ }
346
+
347
+ .usage-bar.codex {
348
+ background: var(--color-brand);
349
+ }
350
+
351
+ /* =========================
352
+ Daily usage (token + cost)
353
+ ========================= */
354
+
355
+ .usage-card-wide {
356
+ grid-column: 1 / -1;
357
+ }
358
+
359
+ .usage-daily-legend {
360
+ display: flex;
361
+ flex-wrap: wrap;
362
+ align-items: center;
363
+ gap: 12px;
364
+ margin: 0 0 10px;
365
+ font-size: 12px;
366
+ color: var(--color-text-secondary);
367
+ }
368
+
369
+ .usage-daily-dot {
370
+ width: 10px;
371
+ height: 10px;
372
+ border-radius: 999px;
373
+ }
374
+
375
+ .usage-daily-dot-tokens {
376
+ background: var(--color-brand);
377
+ }
378
+
379
+ .usage-daily-dot-cost {
380
+ background: linear-gradient(135deg, rgba(139, 107, 214, 0.95), rgba(199, 116, 98, 0.95));
381
+ }
382
+
383
+ .usage-daily-bar-stack {
384
+ width: 100%;
385
+ max-width: 40px;
386
+ height: 160px;
387
+ display: flex;
388
+ align-items: flex-end;
389
+ justify-content: center;
390
+ gap: 4px;
391
+ }
392
+
393
+ .usage-daily-bar {
394
+ flex: 1;
395
+ min-height: 4px;
396
+ border-radius: 10px 10px 4px 4px;
397
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.28);
398
+ }
399
+
400
+ .usage-daily-bar-tokens {
401
+ background: linear-gradient(180deg, rgba(199, 116, 98, 1) 0%, rgba(180, 94, 78, 1) 100%);
402
+ }
403
+
404
+ .usage-daily-bar-cost {
405
+ background: linear-gradient(180deg, rgba(139, 107, 214, 0.92) 0%, rgba(95, 72, 170, 0.98) 100%);
406
+ }
407
+
408
+ .usage-daily-table-wrap {
409
+ margin-top: 12px;
410
+ border-radius: 14px;
411
+ border: 1px solid var(--color-border-soft);
412
+ background: var(--color-surface-alt);
413
+ overflow: auto;
414
+ }
415
+
416
+ .usage-daily-table {
417
+ width: 100%;
418
+ border-collapse: collapse;
419
+ min-width: 560px;
420
+ }
421
+
422
+ .usage-daily-table th,
423
+ .usage-daily-table td {
424
+ padding: 10px 12px;
425
+ border-bottom: 1px solid rgba(216, 201, 184, 0.22);
426
+ font-size: 12px;
427
+ color: var(--color-text-secondary);
428
+ white-space: nowrap;
429
+ }
430
+
431
+ .usage-daily-table thead th {
432
+ position: sticky;
433
+ top: 0;
434
+ background: rgba(248, 243, 238, 0.92);
435
+ backdrop-filter: blur(6px);
436
+ font-weight: 700;
437
+ color: var(--color-text-primary);
438
+ z-index: 1;
439
+ }
440
+
441
+ .usage-daily-table tr:last-child td {
442
+ border-bottom: none;
443
+ }
444
+
445
+ .usage-daily-table .right {
446
+ text-align: right;
447
+ }
448
+
449
+ .usage-daily-table .mono {
450
+ font-family: var(--font-family-mono);
451
+ letter-spacing: -0.01em;
452
+ }
453
+
454
+ .usage-daily-note {
455
+ margin-top: 10px;
456
+ padding: 10px 12px;
457
+ border-radius: 12px;
458
+ background: rgba(255, 244, 220, 0.58);
459
+ border: 1px solid rgba(216, 201, 184, 0.22);
460
+ color: #7a5110;
461
+ font-size: 12px;
462
+ line-height: 1.45;
463
+ }
464
+
465
+ .usage-bar.claude {
466
+ background: #8b6bd6;
467
+ }
468
+
469
+ .usage-bar-label {
470
+ font-size: 11px;
471
+ color: var(--color-text-secondary);
472
+ width: 100%;
473
+ text-align: center;
474
+ white-space: nowrap;
475
+ overflow: hidden;
476
+ text-overflow: ellipsis;
477
+ }
478
+
479
+ .usage-legend {
480
+ display: flex;
481
+ gap: 14px;
482
+ flex-wrap: wrap;
483
+ font-size: 12px;
484
+ color: var(--color-text-secondary);
485
+ margin-bottom: 10px;
486
+ }
487
+
488
+ .usage-legend-dot {
489
+ width: 10px;
490
+ height: 10px;
491
+ border-radius: 999px;
492
+ display: inline-block;
493
+ margin-right: 6px;
494
+ }
495
+
496
+ .usage-list {
497
+ display: flex;
498
+ flex-direction: column;
499
+ gap: 10px;
500
+ min-width: 0;
501
+ }
502
+
503
+ .usage-list-row {
504
+ display: grid;
505
+ grid-template-columns: minmax(56px, 72px) minmax(0, 1fr) minmax(48px, auto);
506
+ gap: 10px;
507
+ align-items: center;
508
+ min-width: 0;
509
+ }
510
+
511
+ .usage-list-label,
512
+ .usage-list-value {
513
+ font-size: 12px;
514
+ color: var(--color-text-secondary);
515
+ min-width: 0;
516
+ }
517
+
518
+ .usage-list-label {
519
+ font-weight: 600;
520
+ color: var(--color-text-primary);
521
+ }
522
+
523
+ .usage-list-value {
524
+ word-break: break-word;
525
+ overflow-wrap: anywhere;
526
+ text-align: right;
527
+ }
528
+
529
+ .usage-list-subvalue {
530
+ grid-column: 1 / -1;
531
+ font-size: 11px;
532
+ color: var(--color-text-tertiary, var(--color-text-secondary));
533
+ line-height: 1.45;
534
+ }
535
+
536
+ .usage-list-row-compact {
537
+ grid-template-columns: minmax(52px, 64px) minmax(0, 1fr) minmax(32px, auto);
538
+ }
539
+
540
+ .usage-progress {
541
+ height: 8px;
542
+ border-radius: 999px;
543
+ background: rgba(71, 60, 52, 0.10);
544
+ overflow: hidden;
545
+ }
546
+
547
+ .usage-progress-fill {
548
+ height: 100%;
549
+ border-radius: 999px;
550
+ background: linear-gradient(90deg, var(--color-brand), #8b6bd6);
551
+ }
552
+
553
+ .usage-mini-bars {
554
+ display: grid;
555
+ grid-template-columns: repeat(24, minmax(0, 1fr));
556
+ gap: 10px 8px;
557
+ align-items: end;
558
+ }
559
+
560
+ .usage-mini-bar-group {
561
+ display: flex;
562
+ flex-direction: column;
563
+ align-items: center;
564
+ gap: 6px;
565
+ min-width: 0;
566
+ }
567
+
568
+ .usage-mini-bar-track {
569
+ width: 100%;
570
+ min-width: 16px;
571
+ max-width: 24px;
572
+ height: 72px;
573
+ border-radius: 10px;
574
+ background: rgba(71, 60, 52, 0.08);
575
+ display: flex;
576
+ align-items: flex-end;
577
+ overflow: hidden;
578
+ }
579
+
580
+ .usage-mini-bar-fill {
581
+ width: 100%;
582
+ min-height: 6px;
583
+ border-radius: 10px 10px 4px 4px;
584
+ background: linear-gradient(180deg, #8b6bd6 0%, var(--color-brand) 100%);
585
+ }
586
+
587
+ .usage-mini-bar-label {
588
+ font-size: 10px;
589
+ color: var(--color-text-secondary);
590
+ }
591
+
592
+ .usage-session-list {
593
+ display: flex;
594
+ flex-direction: column;
595
+ gap: 10px;
596
+ }
597
+
598
+ .usage-session-item {
599
+ padding: 12px;
600
+ border-radius: 12px;
601
+ background: var(--color-surface-alt);
602
+ border: 1px solid var(--color-border-soft);
603
+ min-width: 0;
604
+ }
605
+
606
+ .usage-session-row {
607
+ display: flex;
608
+ justify-content: space-between;
609
+ gap: 10px;
610
+ align-items: flex-start;
611
+ min-width: 0;
612
+ }
613
+
614
+ .usage-session-title {
615
+ font-size: 13px;
616
+ font-weight: 600;
617
+ color: var(--color-text-primary);
618
+ min-width: 0;
619
+ overflow: hidden;
620
+ text-overflow: ellipsis;
621
+ white-space: nowrap;
622
+ }
623
+
624
+ .usage-inline-stat {
625
+ font-size: 11px;
626
+ color: var(--color-brand-dark);
627
+ background: var(--color-brand-light);
628
+ border-radius: 999px;
629
+ padding: 4px 8px;
630
+ flex-shrink: 0;
631
+ font-weight: 700;
632
+ }
633
+
634
+ .usage-session-meta {
635
+ display: flex;
636
+ gap: 10px;
637
+ flex-wrap: wrap;
638
+ font-size: 11px;
639
+ color: var(--color-text-secondary);
640
+ margin-top: 6px;
641
+ }
642
+
643
+ .usage-session-path {
644
+ margin-top: 6px;
645
+ font-size: 11px;
646
+ color: var(--color-text-secondary);
647
+ word-break: break-word;
648
+ overflow-wrap: anywhere;
649
+ }
650
+
651
+ .usage-card-models {
652
+ display: flex;
653
+ flex-direction: column;
654
+ gap: 12px;
655
+ }
656
+
657
+ .usage-model-coverage-strip {
658
+ display: grid;
659
+ grid-template-columns: repeat(3, minmax(0, 1fr));
660
+ gap: 10px;
661
+ }
662
+
663
+ .usage-model-coverage-item {
664
+ padding: 12px;
665
+ border-radius: 12px;
666
+ border: 1px solid var(--color-border-soft);
667
+ background: var(--color-surface-alt);
668
+ display: flex;
669
+ flex-direction: column;
670
+ gap: 4px;
671
+ }
672
+
673
+ .usage-model-coverage-item strong {
674
+ font-size: 20px;
675
+ color: var(--color-text-primary);
676
+ }
677
+
678
+ .usage-model-coverage-item span,
679
+ .usage-inline-note,
680
+ .usage-diagnostic-copy,
681
+ .usage-diagnostic-meta {
682
+ font-size: 12px;
683
+ line-height: 1.5;
684
+ color: var(--color-text-secondary);
685
+ }
686
+
687
+ .usage-diagnostic-empty {
688
+ padding: 14px;
689
+ border-radius: 14px;
690
+ border: 1px dashed var(--color-border);
691
+ background: var(--color-surface-alt);
692
+ }
693
+
694
+ .usage-diagnostic-title {
695
+ font-size: 13px;
696
+ font-weight: 700;
697
+ color: var(--color-text-primary);
698
+ margin-bottom: 6px;
699
+ }
700
+
701
+ .usage-inline-note {
702
+ padding: 10px 12px;
703
+ border-radius: 12px;
704
+ background: rgba(255, 244, 220, 0.62);
705
+ color: #7a5110;
706
+ }
707
+
708
+ .usage-inline-tag {
709
+ display: inline-flex;
710
+ align-items: center;
711
+ margin: 0 6px 0 0;
712
+ padding: 2px 8px;
713
+ border-radius: 999px;
714
+ background: rgba(122, 81, 16, 0.10);
715
+ border: 1px solid rgba(122, 81, 16, 0.14);
716
+ color: inherit;
717
+ font-weight: 700;
718
+ }
719
+
720
+ .usage-diagnostic-list {
721
+ display: flex;
722
+ flex-direction: column;
723
+ gap: 8px;
724
+ }
725
+
726
+ .usage-diagnostic-list-title {
727
+ font-size: 12px;
728
+ font-weight: 700;
729
+ color: var(--color-text-primary);
730
+ }
731
+
732
+ .usage-diagnostic-row {
733
+ display: flex;
734
+ justify-content: space-between;
735
+ gap: 12px;
736
+ align-items: center;
737
+ padding: 10px 12px;
738
+ border-radius: 12px;
739
+ border: 1px solid var(--color-border-soft);
740
+ background: var(--color-surface-alt);
741
+ }
742
+
743
+ .usage-diagnostic-row-main,
744
+ .usage-diagnostic-row-side {
745
+ min-width: 0;
746
+ }
747
+
748
+ .usage-diagnostic-row-title {
749
+ font-size: 12px;
750
+ font-weight: 700;
751
+ color: var(--color-text-primary);
752
+ word-break: break-word;
753
+ overflow-wrap: anywhere;
754
+ }
755
+
756
+ .usage-diagnostic-row-meta {
757
+ display: flex;
758
+ flex-wrap: wrap;
759
+ gap: 8px;
760
+ margin-top: 4px;
761
+ font-size: 11px;
762
+ color: var(--color-text-secondary);
763
+ }
764
+
765
+ .usage-diagnostic-row-side {
766
+ display: flex;
767
+ align-items: center;
768
+ gap: 8px;
769
+ flex-wrap: wrap;
770
+ justify-content: flex-end;
771
+ }
772
+
773
+ .usage-model-list {
774
+ display: flex;
775
+ flex-wrap: wrap;
776
+ gap: 10px;
777
+ }
778
+
779
+ .usage-model-chip {
780
+ min-width: 0;
781
+ max-width: 100%;
782
+ padding: 10px 12px;
783
+ border-radius: 12px;
784
+ background: var(--color-surface-alt);
785
+ border: 1px solid var(--color-border-soft);
786
+ }
787
+
788
+ .usage-model-name {
789
+ font-size: 12px;
790
+ font-weight: 700;
791
+ color: var(--color-text-primary);
792
+ word-break: break-word;
793
+ overflow-wrap: anywhere;
794
+ }
795
+
796
+ .usage-model-meta {
797
+ margin-top: 4px;
798
+ font-size: 11px;
799
+ color: var(--color-text-secondary);
800
+ line-height: 1.4;
801
+ }
802
+
803
+ .usage-empty {
804
+ padding: 24px 16px;
805
+ border-radius: 16px;
806
+ background: var(--color-surface-alt);
807
+ border: 1px dashed var(--color-border);
808
+ color: var(--color-text-secondary);
809
+ }
810
+
811
+ @media (max-width: 960px) {
812
+ .usage-chart-grid,
813
+ .usage-model-coverage-strip {
814
+ grid-template-columns: 1fr;
815
+ }
816
+ }
817
+
818
+ @media (max-width: 640px) {
819
+ .usage-list-row {
820
+ grid-template-columns: 1fr;
821
+ gap: 6px;
822
+ }
823
+
824
+ .usage-list-subvalue {
825
+ grid-column: auto;
826
+ }
827
+
828
+ .usage-list-value {
829
+ text-align: left;
830
+ }
831
+
832
+ .usage-mini-bars {
833
+ grid-template-columns: repeat(12, minmax(0, 1fr));
834
+ }
835
+
836
+ .usage-bar-group {
837
+ flex-basis: 36px;
838
+ min-width: 36px;
839
+ }
840
+
841
+ .usage-bar-stack {
842
+ max-width: 28px;
843
+ }
844
+
845
+ .usage-toolbar,
846
+ .usage-card-head,
847
+ .usage-session-row {
848
+ flex-direction: column;
849
+ align-items: stretch;
850
+ }
851
+ }