codexmate 0.0.31 → 0.0.32

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 (145) hide show
  1. package/README.md +363 -363
  2. package/README.zh.md +371 -371
  3. package/cli/agents-files.js +224 -224
  4. package/cli/archive-helpers.js +446 -446
  5. package/cli/auth-profiles.js +375 -375
  6. package/cli/builtin-proxy.js +1725 -1725
  7. package/cli/claude-proxy.js +1022 -1022
  8. package/cli/config-bootstrap.js +402 -402
  9. package/cli/config-health.js +454 -454
  10. package/cli/doctor-core.js +903 -903
  11. package/cli/import-skills-url.js +356 -356
  12. package/cli/local-bridge.js +324 -324
  13. package/cli/openai-bridge.js +1653 -1653
  14. package/cli/openclaw-config.js +629 -629
  15. package/cli/session-convert-args.js +69 -69
  16. package/cli/session-convert-io.js +82 -82
  17. package/cli/session-convert.js +150 -150
  18. package/cli/session-usage.concurrent.js +28 -28
  19. package/cli/session-usage.js +118 -118
  20. package/cli/session-usage.models.js +176 -176
  21. package/cli/skills.js +1141 -1141
  22. package/cli/zip-commands.js +510 -510
  23. package/cli.js +15829 -15778
  24. package/lib/automation.js +404 -404
  25. package/lib/cli-file-utils.js +151 -151
  26. package/lib/cli-models-utils.js +440 -440
  27. package/lib/cli-network-utils.js +190 -190
  28. package/lib/cli-path-utils.js +85 -85
  29. package/lib/cli-session-utils.js +121 -121
  30. package/lib/cli-sessions.js +426 -417
  31. package/lib/cli-utils.js +155 -155
  32. package/lib/cli-webhook.js +126 -126
  33. package/lib/download-artifacts.js +92 -92
  34. package/lib/mcp-stdio.js +453 -453
  35. package/lib/task-orchestrator.js +869 -869
  36. package/lib/text-diff.js +303 -303
  37. package/lib/workflow-engine.js +340 -340
  38. package/package.json +76 -76
  39. package/plugins/README.md +20 -20
  40. package/plugins/README.zh-CN.md +20 -20
  41. package/plugins/prompt-templates/comment-polish/index.mjs +25 -25
  42. package/plugins/prompt-templates/computed.mjs +253 -253
  43. package/plugins/prompt-templates/index.mjs +8 -8
  44. package/plugins/prompt-templates/manifest.mjs +15 -15
  45. package/plugins/prompt-templates/methods.mjs +553 -553
  46. package/plugins/prompt-templates/overview.mjs +91 -91
  47. package/plugins/prompt-templates/ownership.mjs +19 -19
  48. package/plugins/prompt-templates/rule-ack/index.mjs +21 -21
  49. package/plugins/prompt-templates/storage.mjs +64 -64
  50. package/plugins/registry.mjs +16 -16
  51. package/web-ui/app.js +647 -646
  52. package/web-ui/index.html +36 -36
  53. package/web-ui/logic.agents-diff.mjs +386 -386
  54. package/web-ui/logic.claude.mjs +168 -168
  55. package/web-ui/logic.codex.mjs +69 -69
  56. package/web-ui/logic.mjs +5 -5
  57. package/web-ui/logic.runtime.mjs +128 -128
  58. package/web-ui/logic.session-convert.mjs +70 -70
  59. package/web-ui/logic.sessions.mjs +781 -765
  60. package/web-ui/modules/api.mjs +90 -90
  61. package/web-ui/modules/app.computed.dashboard.mjs +248 -248
  62. package/web-ui/modules/app.computed.index.mjs +17 -17
  63. package/web-ui/modules/app.computed.main-tabs.mjs +205 -205
  64. package/web-ui/modules/app.computed.session.mjs +693 -999
  65. package/web-ui/modules/app.constants.mjs +15 -15
  66. package/web-ui/modules/app.methods.agents.mjs +651 -632
  67. package/web-ui/modules/app.methods.claude-config.mjs +200 -200
  68. package/web-ui/modules/app.methods.codex-config.mjs +861 -841
  69. package/web-ui/modules/app.methods.index.mjs +94 -94
  70. package/web-ui/modules/app.methods.install.mjs +205 -205
  71. package/web-ui/modules/app.methods.navigation.mjs +774 -774
  72. package/web-ui/modules/app.methods.openclaw-core.mjs +814 -814
  73. package/web-ui/modules/app.methods.openclaw-editing.mjs +372 -372
  74. package/web-ui/modules/app.methods.openclaw-persist.mjs +369 -369
  75. package/web-ui/modules/app.methods.providers.mjs +529 -529
  76. package/web-ui/modules/app.methods.runtime.mjs +345 -345
  77. package/web-ui/modules/app.methods.session-actions.mjs +591 -591
  78. package/web-ui/modules/app.methods.session-browser.mjs +1012 -984
  79. package/web-ui/modules/app.methods.session-timeline.mjs +479 -479
  80. package/web-ui/modules/app.methods.session-trash.mjs +438 -438
  81. package/web-ui/modules/app.methods.startup-claude.mjs +537 -534
  82. package/web-ui/modules/app.methods.task-orchestration.mjs +556 -556
  83. package/web-ui/modules/app.methods.webhook.mjs +79 -79
  84. package/web-ui/modules/config-mode.computed.mjs +124 -124
  85. package/web-ui/modules/config-template-confirm-pref.mjs +33 -33
  86. package/web-ui/modules/i18n.dict.mjs +3177 -3174
  87. package/web-ui/modules/i18n.mjs +62 -62
  88. package/web-ui/modules/plugins.computed.mjs +3 -3
  89. package/web-ui/modules/plugins.methods.mjs +3 -3
  90. package/web-ui/modules/plugins.storage.mjs +11 -11
  91. package/web-ui/modules/provider-url-display.mjs +17 -17
  92. package/web-ui/modules/sessions-filters-url.mjs +85 -85
  93. package/web-ui/modules/skills.computed.mjs +107 -107
  94. package/web-ui/modules/skills.methods.mjs +482 -482
  95. package/web-ui/partials/index/layout-footer.html +13 -13
  96. package/web-ui/partials/index/layout-header.html +503 -500
  97. package/web-ui/partials/index/modal-config-template-agents.html +185 -174
  98. package/web-ui/partials/index/modal-confirm-toast.html +32 -32
  99. package/web-ui/partials/index/modal-health-check.html +45 -45
  100. package/web-ui/partials/index/modal-openclaw-config.html +280 -280
  101. package/web-ui/partials/index/modal-skills.html +200 -200
  102. package/web-ui/partials/index/modals-basic.html +162 -162
  103. package/web-ui/partials/index/panel-config-claude.html +136 -194
  104. package/web-ui/partials/index/panel-config-codex.html +197 -357
  105. package/web-ui/partials/index/panel-config-openclaw.html +83 -83
  106. package/web-ui/partials/index/panel-dashboard.html +219 -219
  107. package/web-ui/partials/index/panel-docs.html +115 -147
  108. package/web-ui/partials/index/panel-market.html +177 -177
  109. package/web-ui/partials/index/panel-orchestration.html +391 -391
  110. package/web-ui/partials/index/panel-plugins.html +253 -253
  111. package/web-ui/partials/index/panel-sessions.html +313 -302
  112. package/web-ui/partials/index/panel-settings.html +190 -190
  113. package/web-ui/partials/index/panel-trash.html +83 -88
  114. package/web-ui/partials/index/panel-usage.html +138 -371
  115. package/web-ui/res/json5.min.js +1 -1
  116. package/web-ui/res/vue.global.prod.js +13 -13
  117. package/web-ui/session-helpers.mjs +591 -591
  118. package/web-ui/source-bundle.cjs +233 -233
  119. package/web-ui/styles/base-theme.css +281 -281
  120. package/web-ui/styles/bridge-pool.css +197 -197
  121. package/web-ui/styles/controls-forms.css +433 -422
  122. package/web-ui/styles/dashboard.css +406 -406
  123. package/web-ui/styles/docs-panel.css +245 -271
  124. package/web-ui/styles/feedback.css +108 -108
  125. package/web-ui/styles/health-check-dialog.css +144 -144
  126. package/web-ui/styles/layout-shell.css +638 -626
  127. package/web-ui/styles/modals-core.css +466 -466
  128. package/web-ui/styles/navigation-panels.css +391 -391
  129. package/web-ui/styles/openclaw-structured.css +266 -266
  130. package/web-ui/styles/plugins-panel.css +564 -564
  131. package/web-ui/styles/responsive.css +392 -454
  132. package/web-ui/styles/sessions-list.css +647 -417
  133. package/web-ui/styles/sessions-preview.css +407 -407
  134. package/web-ui/styles/sessions-toolbar-trash.css +518 -348
  135. package/web-ui/styles/sessions-usage.css +588 -1040
  136. package/web-ui/styles/settings-panel.css +349 -349
  137. package/web-ui/styles/skills-list.css +305 -305
  138. package/web-ui/styles/skills-market.css +429 -429
  139. package/web-ui/styles/task-orchestration.css +822 -822
  140. package/web-ui/styles/titles-cards.css +472 -472
  141. package/web-ui/styles/trash-panel.css +90 -90
  142. package/web-ui/styles/webhook.css +81 -81
  143. package/web-ui/styles.css +24 -24
  144. package/web-ui.html +17 -17
  145. package/web-ui/partials/index/panel-config-codex.html.bak +0 -337
@@ -1,1040 +1,588 @@
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-current-session-bar {
48
- display: flex;
49
- flex-wrap: wrap;
50
- align-items: center;
51
- gap: 12px;
52
- padding: 10px 12px;
53
- margin: 0 0 14px;
54
- border-radius: 12px;
55
- border: 1px solid var(--color-border-soft);
56
- background: var(--color-surface-alt);
57
- font-size: 12px;
58
- color: var(--color-text-secondary);
59
- }
60
-
61
- .usage-current-session-label {
62
- font-weight: 700;
63
- color: var(--color-text-primary);
64
- }
65
-
66
- .usage-current-session-item strong {
67
- font-weight: 700;
68
- color: var(--color-text-primary);
69
- }
70
-
71
- .usage-range-group {
72
- display: flex;
73
- gap: 8px;
74
- flex-wrap: wrap;
75
- }
76
-
77
- .usage-range-btn {
78
- border: 1px solid var(--color-border);
79
- background: var(--color-surface-alt);
80
- color: var(--color-text-secondary);
81
- padding: 6px 12px;
82
- border-radius: 999px;
83
- cursor: pointer;
84
- font-size: 12px;
85
- font-weight: 600;
86
- transition:
87
- background var(--transition-fast) var(--ease-smooth),
88
- color var(--transition-fast) var(--ease-smooth),
89
- border-color var(--transition-fast) var(--ease-smooth),
90
- box-shadow var(--transition-fast) var(--ease-smooth);
91
- }
92
-
93
- .usage-range-btn:hover {
94
- background: var(--color-surface);
95
- border-color: var(--color-border-strong);
96
- color: var(--color-text-primary);
97
- }
98
-
99
- .usage-range-btn.active {
100
- background: var(--color-brand-light);
101
- color: var(--color-brand-dark);
102
- border-color: var(--color-brand);
103
- box-shadow: var(--shadow-subtle);
104
- }
105
-
106
- .usage-summary-grid {
107
- display: grid;
108
- grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
109
- gap: 12px;
110
- margin-bottom: 16px;
111
- }
112
-
113
- .usage-summary-card {
114
- display: flex;
115
- flex-direction: column;
116
- justify-content: flex-start;
117
- gap: 4px;
118
- min-height: 88px;
119
- padding: 12px 14px;
120
- border-radius: 12px;
121
- background: var(--color-surface);
122
- border: 1px solid var(--color-border);
123
- box-shadow: none;
124
- }
125
-
126
- .usage-content {
127
- position: relative;
128
- }
129
-
130
- .usage-content-loading {
131
- opacity: 0.82;
132
- }
133
-
134
- .usage-content-overlay {
135
- position: absolute;
136
- inset: 0;
137
- display: flex;
138
- align-items: flex-start;
139
- justify-content: flex-end;
140
- padding: 12px 10px;
141
- pointer-events: none;
142
- font-size: 12px;
143
- color: var(--color-text-secondary);
144
- }
145
-
146
- .usage-spinner {
147
- width: 14px;
148
- height: 14px;
149
- border-radius: 999px;
150
- border: 2px solid rgba(80, 90, 100, 0.22);
151
- border-top-color: rgba(80, 90, 100, 0.7);
152
- margin-right: 8px;
153
- animation: usage-spin 0.9s linear infinite;
154
- }
155
-
156
- @keyframes usage-spin {
157
- to {
158
- transform: rotate(360deg);
159
- }
160
- }
161
-
162
- .usage-copyable {
163
- cursor: pointer;
164
- user-select: none;
165
- -webkit-tap-highlight-color: transparent;
166
- }
167
-
168
- .usage-copyable:focus-visible {
169
- outline: 2px solid var(--color-brand);
170
- outline-offset: 2px;
171
- border-radius: 10px;
172
- }
173
-
174
- .usage-summary-card.usage-copyable:hover {
175
- border-color: var(--color-border-strong);
176
- background: var(--color-surface-alt);
177
- }
178
-
179
- .usage-loading-skeleton {
180
- display: flex;
181
- flex-direction: column;
182
- gap: 16px;
183
- }
184
-
185
- /* When showing the "正在加载" notice above the skeleton, keep comfortable spacing. */
186
- .session-empty + .usage-loading-skeleton {
187
- margin-top: 14px;
188
- }
189
-
190
- .usage-skeleton-card {
191
- position: relative;
192
- overflow: hidden;
193
- }
194
-
195
- .usage-skeleton-block {
196
- position: relative;
197
- min-height: 220px;
198
- overflow: hidden;
199
- }
200
-
201
- .usage-skeleton-line {
202
- height: 10px;
203
- border-radius: 999px;
204
- background: linear-gradient(90deg, rgba(150, 160, 170, 0.12), rgba(150, 160, 170, 0.22), rgba(150, 160, 170, 0.12));
205
- background-size: 200% 100%;
206
- animation: usage-skeleton 1.2s ease-in-out infinite;
207
- }
208
-
209
- .usage-skeleton-line.h-lg {
210
- height: 20px;
211
- margin-top: 6px;
212
- }
213
-
214
- .usage-skeleton-line.w-40 { width: 40%; }
215
- .usage-skeleton-line.w-55 { width: 55%; }
216
- .usage-skeleton-line.w-70 { width: 70%; }
217
-
218
- .usage-skeleton-card .usage-skeleton-line + .usage-skeleton-line {
219
- margin-top: 10px;
220
- }
221
-
222
- .usage-skeleton-block::before,
223
- .usage-skeleton-card::before {
224
- content: '';
225
- position: absolute;
226
- inset: 0;
227
- background: radial-gradient(circle at 25% 10%, rgba(255, 255, 255, 0.22), transparent 55%);
228
- pointer-events: none;
229
- }
230
-
231
- @keyframes usage-skeleton {
232
- 0% { background-position: 0% 0; }
233
- 100% { background-position: 200% 0; }
234
- }
235
-
236
- .usage-summary-label {
237
- min-height: 0;
238
- font-size: 12px;
239
- line-height: 1.4;
240
- color: var(--color-text-secondary);
241
- margin-bottom: 0;
242
- }
243
-
244
- .usage-summary-value {
245
- min-height: 0;
246
- display: flex;
247
- align-items: center;
248
- font-size: clamp(18px, 1.8vw, 22px);
249
- line-height: 1.15;
250
- font-weight: 700;
251
- color: var(--color-text-primary);
252
- word-break: break-word;
253
- }
254
-
255
- .usage-summary-note {
256
- margin-top: 2px;
257
- min-height: 0;
258
- font-size: 12px;
259
- color: var(--color-text-secondary);
260
- line-height: 1.35;
261
- }
262
-
263
- .usage-chart-grid {
264
- display: grid;
265
- grid-template-columns: 1fr;
266
- gap: 16px;
267
- }
268
-
269
- .usage-card {
270
- padding: 16px;
271
- border-radius: 12px;
272
- background: var(--color-surface);
273
- border: 1px solid var(--color-border);
274
- box-shadow: none;
275
- min-width: 0;
276
- overflow: hidden;
277
- }
278
-
279
- .usage-card-head {
280
- display: flex;
281
- align-items: flex-start;
282
- justify-content: space-between;
283
- gap: 12px;
284
- margin-bottom: 12px;
285
- }
286
-
287
- .usage-card-title {
288
- font-size: 14px;
289
- font-weight: 700;
290
- color: var(--color-text-primary);
291
- margin-bottom: 4px;
292
- }
293
-
294
- .usage-card-subtitle {
295
- font-size: 12px;
296
- line-height: 1.5;
297
- color: var(--color-text-secondary);
298
- }
299
-
300
- .usage-card-kicker {
301
- display: inline-flex;
302
- align-items: center;
303
- min-height: 30px;
304
- padding: 0 10px;
305
- border-radius: 999px;
306
- border: 1px solid var(--color-border);
307
- background: transparent;
308
- color: var(--color-text-secondary);
309
- font-size: 12px;
310
- font-weight: 600;
311
- white-space: nowrap;
312
- }
313
-
314
- .usage-bars {
315
- display: flex;
316
- align-items: flex-end;
317
- gap: 8px;
318
- min-height: 180px;
319
- width: 100%;
320
- min-width: 0;
321
- overflow-x: auto;
322
- overflow-y: hidden;
323
- padding: 0 2px 10px;
324
- scrollbar-gutter: stable both-edges;
325
- scrollbar-width: thin;
326
- scrollbar-color: rgba(24, 24, 27, 0.26) rgba(24, 24, 27, 0.08);
327
- }
328
-
329
- .usage-bars::-webkit-scrollbar {
330
- height: 10px;
331
- }
332
-
333
- .usage-bars::-webkit-scrollbar-track {
334
- background: rgba(24, 24, 27, 0.06);
335
- border-radius: 999px;
336
- }
337
-
338
- .usage-bars::-webkit-scrollbar-thumb {
339
- background: rgba(24, 24, 27, 0.26);
340
- border-radius: 999px;
341
- border: 2px solid rgba(255, 255, 255, 0.92);
342
- }
343
-
344
- .usage-bars::-webkit-scrollbar-thumb:hover {
345
- background: rgba(24, 24, 27, 0.34);
346
- }
347
-
348
- .usage-bar-group {
349
- flex: 1 0 44px;
350
- min-width: 44px;
351
- display: flex;
352
- flex-direction: column;
353
- align-items: center;
354
- gap: 8px;
355
- }
356
-
357
- .usage-bar-stack {
358
- width: 100%;
359
- max-width: 36px;
360
- height: 160px;
361
- display: flex;
362
- align-items: flex-end;
363
- gap: 4px;
364
- }
365
-
366
- .usage-bar {
367
- flex: 1;
368
- border-radius: 10px 10px 4px 4px;
369
- min-height: 4px;
370
- }
371
-
372
- .usage-bar.codex {
373
- background: var(--color-brand);
374
- }
375
-
376
- /* =========================
377
- Daily usage (token + cost)
378
- ========================= */
379
-
380
- .usage-card-wide {
381
- grid-column: 1 / -1;
382
- }
383
-
384
- .usage-daydetail-controls {
385
- display: inline-flex;
386
- align-items: center;
387
- gap: 8px;
388
- }
389
-
390
- .usage-daydetail-select {
391
- min-height: 30px;
392
- padding: 0 30px 0 10px;
393
- border-radius: 999px;
394
- border: 1px solid var(--color-border);
395
- background-color: transparent;
396
- color: var(--color-text-secondary);
397
- font-size: 12px;
398
- font-weight: 600;
399
- cursor: pointer;
400
- appearance: none;
401
- -webkit-appearance: none;
402
- -moz-appearance: none;
403
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='none' stroke='%23505A66' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round' d='M2 4l4 4 4-4'/%3E%3C/svg%3E");
404
- background-repeat: no-repeat;
405
- background-position: right 10px center;
406
- background-size: 12px;
407
- }
408
-
409
- .usage-daydetail-select:hover {
410
- background-color: var(--color-surface-alt);
411
- }
412
-
413
- .usage-daydetail-select:focus {
414
- outline: none;
415
- box-shadow: var(--shadow-input-focus);
416
- border-color: var(--color-brand);
417
- background-color: var(--color-surface-alt);
418
- }
419
-
420
- .usage-daydetail-empty {
421
- padding: 10px 0 2px;
422
- font-size: 12px;
423
- color: var(--color-text-secondary);
424
- }
425
-
426
- .usage-daydetail-grid {
427
- display: grid;
428
- grid-template-columns: repeat(2, minmax(0, 1fr));
429
- gap: 10px;
430
- margin-top: 10px;
431
- }
432
-
433
- .usage-daydetail-metric {
434
- border: 1px solid var(--color-border);
435
- border-radius: 14px;
436
- padding: 10px 12px;
437
- background: var(--color-surface-alt);
438
- }
439
-
440
- .usage-daydetail-label {
441
- font-size: 12px;
442
- color: var(--color-text-tertiary);
443
- }
444
-
445
- .usage-daydetail-value {
446
- margin-top: 4px;
447
- font-size: 18px;
448
- font-weight: 750;
449
- color: var(--color-text-primary);
450
- }
451
-
452
- .usage-daydetail-sub {
453
- margin-top: 6px;
454
- font-size: 11px;
455
- color: var(--color-text-tertiary);
456
- line-height: 1.25;
457
- }
458
-
459
- .usage-daydetail-section {
460
- margin-top: 12px;
461
- }
462
-
463
- .usage-daydetail-section-title {
464
- font-size: 12px;
465
- font-weight: 700;
466
- color: var(--color-text-secondary);
467
- margin-bottom: 8px;
468
- }
469
-
470
- .usage-daydetail-list {
471
- display: grid;
472
- gap: 8px;
473
- }
474
-
475
- .usage-daydetail-row {
476
- display: flex;
477
- align-items: center;
478
- justify-content: space-between;
479
- gap: 10px;
480
- padding: 8px 10px;
481
- border-radius: 12px;
482
- background: rgba(24, 24, 27, 0.02);
483
- border: 1px solid rgba(24, 24, 27, 0.08);
484
- }
485
-
486
- .usage-daydetail-row-title {
487
- flex: 1;
488
- min-width: 0;
489
- overflow: hidden;
490
- text-overflow: ellipsis;
491
- white-space: nowrap;
492
- color: var(--color-text-primary);
493
- font-size: 12px;
494
- }
495
-
496
- .usage-daydetail-row-meta {
497
- flex-shrink: 0;
498
- color: var(--color-text-tertiary);
499
- font-size: 12px;
500
- }
501
-
502
- .usage-daydetail-models {
503
- display: flex;
504
- flex-wrap: wrap;
505
- gap: 6px;
506
- }
507
-
508
- .usage-daydetail-model {
509
- font-size: 12px;
510
- padding: 4px 8px;
511
- border-radius: 999px;
512
- background: rgba(24, 24, 27, 0.06);
513
- color: var(--color-text-secondary);
514
- }
515
-
516
- @media (max-width: 900px) {
517
- .usage-chart-grid {
518
- grid-template-columns: 1fr;
519
- }
520
- }
521
-
522
- .usage-bar.claude {
523
- background: #8b6bd6;
524
- }
525
-
526
- .usage-bar-label {
527
- font-size: 11px;
528
- color: var(--color-text-secondary);
529
- width: 100%;
530
- text-align: center;
531
- white-space: nowrap;
532
- overflow: hidden;
533
- text-overflow: ellipsis;
534
- }
535
-
536
- .usage-legend {
537
- display: flex;
538
- gap: 14px;
539
- flex-wrap: wrap;
540
- font-size: 12px;
541
- color: var(--color-text-secondary);
542
- margin-bottom: 10px;
543
- }
544
-
545
- .usage-legend-dot {
546
- width: 10px;
547
- height: 10px;
548
- border-radius: 999px;
549
- display: inline-block;
550
- margin-right: 6px;
551
- }
552
-
553
- .usage-list {
554
- display: flex;
555
- flex-direction: column;
556
- gap: 10px;
557
- min-width: 0;
558
- }
559
-
560
- .usage-list-scroll {
561
- max-height: 220px;
562
- overflow-y: auto;
563
- padding-right: 6px;
564
- scrollbar-gutter: stable;
565
- scrollbar-width: thin;
566
- scrollbar-color: rgba(199, 116, 98, 0.72) rgba(199, 116, 98, 0.08);
567
- }
568
-
569
- .usage-list-top-paths {
570
- max-height: 140px;
571
- gap: 6px;
572
- }
573
-
574
- .usage-card-top-paths {
575
- grid-column: 1 / -1;
576
- }
577
-
578
- .usage-list-scroll::-webkit-scrollbar {
579
- width: 10px;
580
- }
581
-
582
- .usage-list-scroll::-webkit-scrollbar-track {
583
- background: linear-gradient(180deg, rgba(199, 116, 98, 0.04), rgba(199, 116, 98, 0.1));
584
- border-radius: 999px;
585
- }
586
-
587
- .usage-list-scroll::-webkit-scrollbar-thumb {
588
- background: linear-gradient(180deg, rgba(199, 116, 98, 0.68), rgba(180, 94, 78, 0.92));
589
- border-radius: 999px;
590
- border: 2px solid rgba(248, 243, 238, 0.96);
591
- }
592
-
593
- .usage-list-scroll::-webkit-scrollbar-thumb:hover {
594
- background: linear-gradient(180deg, rgba(199, 116, 98, 0.82), rgba(180, 94, 78, 1));
595
- }
596
-
597
- .usage-list-row {
598
- display: grid;
599
- grid-template-columns: minmax(56px, 72px) minmax(0, 1fr) minmax(48px, auto);
600
- gap: 10px;
601
- align-items: center;
602
- min-width: 0;
603
- }
604
-
605
- .usage-list-label,
606
- .usage-list-value {
607
- font-size: 12px;
608
- color: var(--color-text-secondary);
609
- min-width: 0;
610
- }
611
-
612
- .usage-list-label {
613
- font-weight: 600;
614
- color: var(--color-text-primary);
615
- }
616
-
617
- .usage-list-value {
618
- word-break: break-word;
619
- overflow-wrap: anywhere;
620
- text-align: right;
621
- }
622
-
623
- .usage-list-subvalue {
624
- grid-column: 1 / -1;
625
- font-size: 11px;
626
- color: var(--color-text-tertiary, var(--color-text-secondary));
627
- line-height: 1.45;
628
- }
629
-
630
- .usage-list-row-compact {
631
- grid-template-columns: minmax(52px, 64px) minmax(0, 1fr) minmax(32px, auto);
632
- }
633
-
634
- .usage-progress {
635
- height: 8px;
636
- border-radius: 999px;
637
- background: rgba(71, 60, 52, 0.10);
638
- overflow: hidden;
639
- }
640
-
641
- .usage-progress-fill {
642
- height: 100%;
643
- border-radius: 999px;
644
- background: linear-gradient(90deg, var(--color-brand), #8b6bd6);
645
- }
646
-
647
- .usage-mini-bars {
648
- display: grid;
649
- grid-template-columns: repeat(24, minmax(0, 1fr));
650
- gap: 10px 8px;
651
- align-items: end;
652
- }
653
-
654
- .usage-mini-bar-group {
655
- display: flex;
656
- flex-direction: column;
657
- align-items: center;
658
- gap: 6px;
659
- min-width: 0;
660
- }
661
-
662
- .usage-mini-bar-track {
663
- width: 100%;
664
- min-width: 16px;
665
- max-width: 24px;
666
- height: 72px;
667
- border-radius: 10px;
668
- background: rgba(71, 60, 52, 0.08);
669
- display: flex;
670
- align-items: flex-end;
671
- overflow: hidden;
672
- }
673
-
674
- .usage-mini-bar-fill {
675
- width: 100%;
676
- min-height: 6px;
677
- border-radius: 10px 10px 4px 4px;
678
- background: linear-gradient(180deg, #8b6bd6 0%, var(--color-brand) 100%);
679
- }
680
-
681
- .usage-mini-bar-label {
682
- font-size: 10px;
683
- color: var(--color-text-secondary);
684
- }
685
-
686
- .usage-session-list {
687
- display: flex;
688
- flex-direction: column;
689
- gap: 10px;
690
- }
691
-
692
- .usage-session-item {
693
- padding: 12px;
694
- border-radius: 12px;
695
- background: var(--color-surface-alt);
696
- border: 1px solid var(--color-border-soft);
697
- min-width: 0;
698
- }
699
-
700
- .usage-session-row {
701
- display: flex;
702
- justify-content: space-between;
703
- gap: 10px;
704
- align-items: flex-start;
705
- min-width: 0;
706
- }
707
-
708
- .usage-session-title {
709
- font-size: 13px;
710
- font-weight: 600;
711
- color: var(--color-text-primary);
712
- min-width: 0;
713
- overflow: hidden;
714
- text-overflow: ellipsis;
715
- white-space: nowrap;
716
- }
717
-
718
- .usage-inline-stat {
719
- font-size: 11px;
720
- color: var(--color-brand-dark);
721
- background: var(--color-brand-light);
722
- border-radius: 999px;
723
- padding: 4px 8px;
724
- flex-shrink: 0;
725
- font-weight: 700;
726
- }
727
-
728
- .usage-session-meta {
729
- display: flex;
730
- gap: 10px;
731
- flex-wrap: wrap;
732
- font-size: 11px;
733
- color: var(--color-text-secondary);
734
- margin-top: 6px;
735
- }
736
-
737
- .usage-session-path {
738
- margin-top: 6px;
739
- font-size: 11px;
740
- color: var(--color-text-secondary);
741
- word-break: break-word;
742
- overflow-wrap: anywhere;
743
- }
744
-
745
- .usage-card-models {
746
- display: flex;
747
- flex-direction: column;
748
- gap: 12px;
749
- }
750
-
751
- .usage-model-coverage-strip {
752
- display: grid;
753
- grid-template-columns: repeat(3, minmax(0, 1fr));
754
- gap: 10px;
755
- }
756
-
757
- .usage-model-coverage-item {
758
- padding: 12px;
759
- border-radius: 12px;
760
- border: 1px solid var(--color-border-soft);
761
- background: var(--color-surface-alt);
762
- display: flex;
763
- flex-direction: column;
764
- gap: 4px;
765
- }
766
-
767
- .usage-model-coverage-item strong {
768
- font-size: 20px;
769
- color: var(--color-text-primary);
770
- }
771
-
772
- .usage-model-coverage-item span,
773
- .usage-inline-note,
774
- .usage-diagnostic-copy,
775
- .usage-diagnostic-meta {
776
- font-size: 12px;
777
- line-height: 1.5;
778
- color: var(--color-text-secondary);
779
- }
780
-
781
- .usage-diagnostic-empty {
782
- padding: 14px;
783
- border-radius: 14px;
784
- border: 1px dashed var(--color-border);
785
- background: var(--color-surface-alt);
786
- }
787
-
788
- .usage-diagnostic-title {
789
- font-size: 13px;
790
- font-weight: 700;
791
- color: var(--color-text-primary);
792
- margin-bottom: 6px;
793
- }
794
-
795
- .usage-inline-note {
796
- padding: 10px 12px;
797
- border-radius: 12px;
798
- background: rgba(255, 244, 220, 0.62);
799
- color: #7a5110;
800
- }
801
-
802
- .usage-inline-tag {
803
- display: inline-flex;
804
- align-items: center;
805
- margin: 0 6px 0 0;
806
- padding: 2px 8px;
807
- border-radius: 999px;
808
- background: rgba(122, 81, 16, 0.10);
809
- border: 1px solid rgba(122, 81, 16, 0.14);
810
- color: inherit;
811
- font-weight: 700;
812
- }
813
-
814
- .usage-diagnostic-list {
815
- display: flex;
816
- flex-direction: column;
817
- gap: 8px;
818
- }
819
-
820
- .usage-diagnostic-list-title {
821
- font-size: 12px;
822
- font-weight: 700;
823
- color: var(--color-text-primary);
824
- }
825
-
826
- .usage-diagnostic-row {
827
- display: flex;
828
- justify-content: space-between;
829
- gap: 12px;
830
- align-items: center;
831
- padding: 10px 12px;
832
- border-radius: 12px;
833
- border: 1px solid var(--color-border-soft);
834
- background: var(--color-surface-alt);
835
- }
836
-
837
- .usage-diagnostic-row-main,
838
- .usage-diagnostic-row-side {
839
- min-width: 0;
840
- }
841
-
842
- .usage-diagnostic-row-title {
843
- font-size: 12px;
844
- font-weight: 700;
845
- color: var(--color-text-primary);
846
- word-break: break-word;
847
- overflow-wrap: anywhere;
848
- }
849
-
850
- .usage-diagnostic-row-meta {
851
- display: flex;
852
- flex-wrap: wrap;
853
- gap: 8px;
854
- margin-top: 4px;
855
- font-size: 11px;
856
- color: var(--color-text-secondary);
857
- }
858
-
859
- .usage-diagnostic-row-side {
860
- display: flex;
861
- align-items: center;
862
- gap: 8px;
863
- flex-wrap: wrap;
864
- justify-content: flex-end;
865
- }
866
-
867
- .usage-model-list {
868
- display: flex;
869
- flex-wrap: wrap;
870
- gap: 10px;
871
- }
872
-
873
- .usage-model-chip {
874
- min-width: 0;
875
- max-width: 100%;
876
- padding: 10px 12px;
877
- border-radius: 12px;
878
- background: var(--color-surface-alt);
879
- border: 1px solid var(--color-border-soft);
880
- }
881
-
882
- .usage-model-name {
883
- font-size: 12px;
884
- font-weight: 700;
885
- color: var(--color-text-primary);
886
- word-break: break-word;
887
- overflow-wrap: anywhere;
888
- }
889
-
890
- .usage-model-meta {
891
- margin-top: 4px;
892
- font-size: 11px;
893
- color: var(--color-text-secondary);
894
- line-height: 1.4;
895
- }
896
-
897
- .usage-empty {
898
- padding: 24px 16px;
899
- border-radius: 16px;
900
- background: var(--color-surface-alt);
901
- border: 1px dashed var(--color-border);
902
- color: var(--color-text-secondary);
903
- }
904
-
905
- @media (max-width: 960px) {
906
- .usage-chart-grid,
907
- .usage-model-coverage-strip {
908
- grid-template-columns: 1fr;
909
- }
910
- }
911
-
912
- @media (max-width: 640px) {
913
- .usage-list-row {
914
- grid-template-columns: 1fr;
915
- gap: 6px;
916
- }
917
-
918
- .usage-list-subvalue {
919
- grid-column: auto;
920
- }
921
-
922
- .usage-list-value {
923
- text-align: left;
924
- }
925
-
926
- .usage-mini-bars {
927
- grid-template-columns: repeat(12, minmax(0, 1fr));
928
- }
929
-
930
- .usage-bar-group {
931
- flex-basis: 36px;
932
- min-width: 36px;
933
- }
934
-
935
- .usage-bar-stack {
936
- max-width: 28px;
937
- }
938
-
939
- .usage-toolbar,
940
- .usage-card-head,
941
- .usage-session-row {
942
- flex-direction: column;
943
- align-items: stretch;
944
- }
945
- }
946
-
947
- .usage-card-hourly-heatmap {
948
- overflow-x: auto;
949
- }
950
-
951
- .hourly-heatmap-wrapper {
952
- display: flex;
953
- flex-direction: column;
954
- gap: 2px;
955
- margin-top: 8px;
956
- min-width: 580px;
957
- }
958
-
959
- .hourly-heatmap-header {
960
- display: flex;
961
- gap: 2px;
962
- align-items: flex-end;
963
- }
964
-
965
- .hourly-heatmap-corner {
966
- width: 36px;
967
- flex-shrink: 0;
968
- }
969
-
970
- .hourly-heatmap-hour-label {
971
- flex: 1;
972
- min-width: 0;
973
- font-size: 10px;
974
- color: var(--color-text-muted);
975
- text-align: center;
976
- line-height: 14px;
977
- }
978
-
979
- .hourly-heatmap-row {
980
- display: flex;
981
- gap: 2px;
982
- align-items: center;
983
- }
984
-
985
- .hourly-heatmap-weekday-label {
986
- width: 36px;
987
- flex-shrink: 0;
988
- font-size: 11px;
989
- color: var(--color-text-secondary);
990
- text-align: right;
991
- padding-right: 4px;
992
- }
993
-
994
- .hourly-heatmap-cell {
995
- flex: 1;
996
- min-width: 0;
997
- aspect-ratio: 1;
998
- border-radius: 3px;
999
- cursor: default;
1000
- }
1001
-
1002
- .hourly-heatmap-cell.level-0 {
1003
- background: var(--color-surface-alt);
1004
- }
1005
-
1006
- .hourly-heatmap-cell.level-1 {
1007
- background: var(--color-heatmap-1);
1008
- }
1009
-
1010
- .hourly-heatmap-cell.level-2 {
1011
- background: var(--color-heatmap-2);
1012
- }
1013
-
1014
- .hourly-heatmap-cell.level-3 {
1015
- background: var(--color-heatmap-3);
1016
- }
1017
-
1018
- .hourly-heatmap-cell.level-4 {
1019
- background: var(--color-heatmap-4);
1020
- }
1021
-
1022
- .hourly-heatmap-legend {
1023
- display: flex;
1024
- align-items: center;
1025
- gap: 3px;
1026
- justify-content: flex-end;
1027
- margin-top: 6px;
1028
- font-size: 10px;
1029
- color: var(--color-text-muted);
1030
- }
1031
-
1032
- .hourly-heatmap-legend .hourly-heatmap-cell {
1033
- width: 12px;
1034
- height: 12px;
1035
- aspect-ratio: auto;
1036
- }
1037
-
1038
- .hourly-heatmap-legend-label {
1039
- margin: 0 2px;
1040
- }
1
+ /* ============================================
2
+ Usage Tab — Refined Design System
3
+ ============================================ */
4
+
5
+ /* ---- Toolbar ---- */
6
+ .usage-toolbar {
7
+ display: flex;
8
+ justify-content: space-between;
9
+ align-items: center;
10
+ gap: 12px;
11
+ flex-wrap: wrap;
12
+ margin-bottom: 18px;
13
+ }
14
+
15
+ .usage-toolbar-title {
16
+ font-size: var(--font-size-title);
17
+ font-weight: var(--font-weight-title);
18
+ color: var(--color-text-primary);
19
+ letter-spacing: -0.01em;
20
+ }
21
+
22
+ .usage-range-group {
23
+ display: flex;
24
+ gap: 4px;
25
+ padding: 3px;
26
+ border-radius: var(--radius-md);
27
+ background: var(--color-surface-alt);
28
+ border: 1px solid var(--color-border-soft);
29
+ }
30
+
31
+ .usage-range-btn {
32
+ border: none;
33
+ background: transparent;
34
+ color: var(--color-text-tertiary);
35
+ padding: 5px 11px;
36
+ border-radius: var(--radius-sm);
37
+ cursor: pointer;
38
+ font-size: 12px;
39
+ font-weight: 600;
40
+ font-family: var(--font-family);
41
+ white-space: nowrap;
42
+ transition: all 120ms var(--ease-spring);
43
+ outline: none;
44
+ -webkit-tap-highlight-color: transparent;
45
+ }
46
+
47
+ .usage-range-btn:hover:not(:disabled) {
48
+ color: var(--color-text-secondary);
49
+ background: var(--color-surface);
50
+ }
51
+
52
+ .usage-range-btn:active:not(:disabled) {
53
+ transform: scale(0.97);
54
+ }
55
+
56
+ .usage-range-btn.active {
57
+ color: #fff;
58
+ background: var(--color-brand);
59
+ box-shadow: 0 1px 3px rgba(200, 121, 99, 0.35);
60
+ }
61
+
62
+ .usage-range-btn:disabled {
63
+ opacity: 0.4;
64
+ cursor: not-allowed;
65
+ }
66
+
67
+ .usage-range-btn-icon {
68
+ padding: 5px 8px;
69
+ display: inline-flex;
70
+ align-items: center;
71
+ justify-content: center;
72
+ }
73
+
74
+ .usage-range-btn-icon svg {
75
+ width: 14px;
76
+ height: 14px;
77
+ }
78
+
79
+ /* ---- Current session bar ---- */
80
+ .usage-current-session-bar {
81
+ display: flex;
82
+ flex-wrap: wrap;
83
+ align-items: center;
84
+ gap: 10px;
85
+ padding: 8px 14px;
86
+ margin-bottom: 16px;
87
+ border-radius: var(--radius-md);
88
+ background: var(--color-surface-alt);
89
+ font-size: 12px;
90
+ color: var(--color-text-secondary);
91
+ }
92
+
93
+ .usage-current-session-dot {
94
+ width: 7px;
95
+ height: 7px;
96
+ border-radius: 50%;
97
+ background: var(--color-success);
98
+ flex-shrink: 0;
99
+ animation: usage-pulse 2s ease-in-out infinite;
100
+ }
101
+
102
+ @keyframes usage-pulse {
103
+ 0%, 100% { opacity: 1; }
104
+ 50% { opacity: 0.4; }
105
+ }
106
+
107
+ .usage-current-session-label {
108
+ font-weight: 700;
109
+ color: var(--color-text-primary);
110
+ }
111
+
112
+ .usage-current-session-stat {
113
+ color: var(--color-text-tertiary);
114
+ }
115
+
116
+ .usage-current-session-stat::before {
117
+ content: '·';
118
+ margin-right: 10px;
119
+ color: var(--color-border-strong);
120
+ }
121
+
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;
141
+ }
142
+
143
+ .usage-summary-card-value {
144
+ font-size: 26px;
145
+ font-weight: 700;
146
+ color: var(--color-text-primary);
147
+ line-height: 1.1;
148
+ letter-spacing: -0.02em;
149
+ font-variant-numeric: tabular-nums;
150
+ }
151
+
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;
187
+ }
188
+
189
+ .usage-content-overlay {
190
+ position: absolute;
191
+ inset: 0;
192
+ 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);
241
+ gap: 12px;
242
+ }
243
+
244
+ .usage-card-wide {
245
+ grid-column: 1 / -1;
246
+ }
247
+
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;
255
+ }
256
+
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;
266
+ }
267
+
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;
277
+ overflow: hidden;
278
+ background: var(--color-surface-alt);
279
+ }
280
+
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;
287
+ }
288
+
289
+ .usage-daily-bar-prev {
290
+ width: 100%;
291
+ background: var(--color-text-muted);
292
+ opacity: 0.35;
293
+ border-radius: 4px 4px 0 0;
294
+ }
295
+
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);
299
+ }
300
+
301
+ .usage-daily-bar-group:hover .usage-daily-bar-fill {
302
+ filter: brightness(1.1);
303
+ }
304
+
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%;
313
+ }
314
+
315
+ .usage-daily-bar-group.active .usage-daily-bar-label {
316
+ color: var(--color-brand-dark);
317
+ font-weight: 700;
318
+ }
319
+
320
+ /* ---- Daily legend ---- */
321
+ .usage-daily-legend {
322
+ 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;
333
+ }
334
+
335
+ .usage-daily-legend-swatch {
336
+ width: 10px;
337
+ height: 10px;
338
+ border-radius: 2px;
339
+ }
340
+
341
+ .usage-daily-legend-swatch.current {
342
+ background: var(--color-brand);
343
+ }
344
+
345
+ .usage-daily-legend-swatch.prev {
346
+ background: var(--color-text-muted);
347
+ opacity: 0.35;
348
+ }
349
+
350
+ /* ---- Day detail ---- */
351
+ .usage-daydetail {
352
+ margin-top: 12px;
353
+ padding: 10px 14px;
354
+ border-radius: var(--radius-sm);
355
+ background: var(--color-surface-alt);
356
+ }
357
+
358
+ .usage-daydetail-header {
359
+ display: flex;
360
+ justify-content: space-between;
361
+ align-items: center;
362
+ flex-wrap: wrap;
363
+ gap: 8px;
364
+ }
365
+
366
+ .usage-daydetail-date {
367
+ font-weight: 700;
368
+ font-size: 13px;
369
+ color: var(--color-text-primary);
370
+ }
371
+
372
+ .usage-daydetail-stats {
373
+ font-size: 12px;
374
+ color: var(--color-text-secondary);
375
+ }
376
+
377
+ .usage-daydetail-compare {
378
+ margin-top: 4px;
379
+ font-size: 11px;
380
+ color: var(--color-text-muted);
381
+ }
382
+
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 ---- */
459
+ .usage-card-hourly-heatmap {
460
+ overflow-x: auto;
461
+ }
462
+
463
+ .hourly-heatmap-wrapper {
464
+ display: flex;
465
+ flex-direction: column;
466
+ gap: 2px;
467
+ margin-top: 10px;
468
+ min-width: 480px;
469
+ }
470
+
471
+ .hourly-heatmap-header {
472
+ display: flex;
473
+ gap: 2px;
474
+ align-items: flex-end;
475
+ }
476
+
477
+ .hourly-heatmap-corner {
478
+ width: 32px;
479
+ flex-shrink: 0;
480
+ }
481
+
482
+ .hourly-heatmap-hour-label {
483
+ flex: 1;
484
+ min-width: 0;
485
+ font-size: 9px;
486
+ color: var(--color-text-muted);
487
+ text-align: center;
488
+ line-height: 14px;
489
+ }
490
+
491
+ .hourly-heatmap-row {
492
+ display: flex;
493
+ gap: 2px;
494
+ align-items: center;
495
+ }
496
+
497
+ .hourly-heatmap-weekday-label {
498
+ width: 32px;
499
+ flex-shrink: 0;
500
+ font-size: 10px;
501
+ color: var(--color-text-secondary);
502
+ text-align: right;
503
+ padding-right: 4px;
504
+ }
505
+
506
+ .hourly-heatmap-cell {
507
+ flex: 1;
508
+ min-width: 0;
509
+ aspect-ratio: 1;
510
+ border-radius: 3px;
511
+ }
512
+
513
+ .hourly-heatmap-cell.level-0 { background: var(--color-surface-alt); }
514
+ .hourly-heatmap-cell.level-1 { background: var(--color-heatmap-1); }
515
+ .hourly-heatmap-cell.level-2 { background: var(--color-heatmap-2); }
516
+ .hourly-heatmap-cell.level-3 { background: var(--color-heatmap-3); }
517
+ .hourly-heatmap-cell.level-4 { background: var(--color-heatmap-4); }
518
+
519
+ .hourly-heatmap-legend {
520
+ display: flex;
521
+ align-items: center;
522
+ gap: 3px;
523
+ justify-content: flex-end;
524
+ margin-top: 8px;
525
+ font-size: 10px;
526
+ color: var(--color-text-muted);
527
+ }
528
+
529
+ .hourly-heatmap-legend .hourly-heatmap-cell {
530
+ width: 11px;
531
+ height: 11px;
532
+ aspect-ratio: auto;
533
+ }
534
+
535
+ .hourly-heatmap-legend-label {
536
+ margin: 0 2px;
537
+ }
538
+
539
+ /* ---- Empty state ---- */
540
+ .usage-empty {
541
+ padding: 32px 16px;
542
+ border-radius: var(--radius-md);
543
+ background: var(--color-surface-alt);
544
+ border: 1px dashed var(--color-border);
545
+ color: var(--color-text-secondary);
546
+ text-align: center;
547
+ font-size: 13px;
548
+ }
549
+
550
+ /* ---- Responsive ---- */
551
+ @media (max-width: 960px) {
552
+ .usage-chart-grid {
553
+ grid-template-columns: 1fr;
554
+ }
555
+
556
+ .usage-summary-grid {
557
+ grid-template-columns: repeat(2, 1fr);
558
+ }
559
+ }
560
+
561
+ @media (max-width: 640px) {
562
+ .usage-toolbar {
563
+ flex-direction: column;
564
+ align-items: stretch;
565
+ }
566
+
567
+ .usage-range-group {
568
+ justify-content: center;
569
+ flex-wrap: wrap;
570
+ }
571
+
572
+ .usage-summary-grid {
573
+ grid-template-columns: repeat(2, 1fr);
574
+ }
575
+
576
+ .usage-summary-card-value {
577
+ font-size: 22px;
578
+ }
579
+
580
+ .usage-daily-chart {
581
+ height: 100px;
582
+ }
583
+
584
+ .usage-daily-bar-stack {
585
+ max-width: 24px;
586
+ height: 70px;
587
+ }
588
+ }