dsh-token-chart 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +200 -2
  3. package/cordis.patch.yml +7 -0
  4. package/icon.svg +7 -0
  5. package/lib/buckets.js +115 -0
  6. package/lib/chunk/echarts.entry.js +25 -0
  7. package/lib/client.echarts.js +58 -0
  8. package/lib/client.js +1743 -0
  9. package/lib/constants.js +22 -0
  10. package/lib/index.js +640 -0
  11. package/lib/paths.js +24 -0
  12. package/lib/prefs.js +54 -0
  13. package/lib/store.js +273 -0
  14. package/lib/token-chart.css +568 -0
  15. package/lib/types/buckets.d.ts +24 -0
  16. package/lib/types/chunk/echarts.entry.d.ts +11 -0
  17. package/lib/types/constants.d.ts +22 -0
  18. package/lib/types/index.d.ts +8 -0
  19. package/lib/types/paths.d.ts +3 -0
  20. package/lib/types/prefs.d.ts +8 -0
  21. package/lib/types/store.d.ts +72 -0
  22. package/lib/types/types.d.ts +230 -0
  23. package/lib/types/update.d.ts +24 -0
  24. package/lib/types.js +10 -0
  25. package/lib/update.js +110 -0
  26. package/locale/en.json +4 -0
  27. package/locale/zh.json +4 -0
  28. package/package.json +110 -4
  29. package/src/buckets.ts +120 -0
  30. package/src/chunk/echarts.entry.ts +27 -0
  31. package/src/client/api.ts +126 -0
  32. package/src/client/charts.tsx +255 -0
  33. package/src/client/chrome.tsx +127 -0
  34. package/src/client/contract.ts +62 -0
  35. package/src/client/drawer.tsx +113 -0
  36. package/src/client/format.ts +36 -0
  37. package/src/client/globals.d.ts +21 -0
  38. package/src/client/index.tsx +227 -0
  39. package/src/client/locales.ts +164 -0
  40. package/src/client/models.ts +76 -0
  41. package/src/client/mount.tsx +312 -0
  42. package/src/client/panel.tsx +152 -0
  43. package/src/client/pill.ts +21 -0
  44. package/src/client/react.ts +12 -0
  45. package/src/client/series.tsx +140 -0
  46. package/src/client/settings.tsx +347 -0
  47. package/src/client/styles/components.less +191 -0
  48. package/src/client/styles/index.less +7 -0
  49. package/src/client/styles/tailwind.css +21 -0
  50. package/src/client/styles/tokens.less +25 -0
  51. package/src/client/table.tsx +153 -0
  52. package/src/client/ui.tsx +87 -0
  53. package/src/constants.ts +26 -0
  54. package/src/index.ts +673 -0
  55. package/src/paths.ts +28 -0
  56. package/src/prefs.ts +61 -0
  57. package/src/store.ts +295 -0
  58. package/src/types.ts +216 -0
  59. package/src/update.ts +106 -0
@@ -0,0 +1,568 @@
1
+ /* dsh-token-chart — Tailwind utilities + Less components. Generated by scripts/build-styles.mjs. */
2
+ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
3
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-leading:initial}}}@layer theme{:root,:host{--spacing:.25rem;--radius-md:.375rem}}@layer utilities{.box-border{box-sizing:border-box}.flex{display:flex}.h-\[22px\]{height:22px}.w-\[22px\]{width:22px}.min-w-11{min-width:calc(var(--spacing) * 11)}.cursor-pointer{cursor:pointer}.items-center{align-items:center}.justify-end{justify-content:flex-end}.gap-1{gap:var(--spacing)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-\[color\:var\(--dsw-alias-border-l1\)\]{border-color:var(--dsw-alias-border-l1)}.bg-transparent{background-color:#0000}.p-0{padding:0}.text-center{text-align:center}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.leading-none{--tw-leading:1;line-height:1}.text-\[color\:var\(--dsw-alias-label-primary\)\]{color:var(--dsw-alias-label-primary)}.text-\[color\:var\(--dsw-alias-label-secondary\)\]{color:var(--dsw-alias-label-secondary)}.\[font-variant-numeric\:tabular-nums\]{font-variant-numeric:tabular-nums}.opacity-70{opacity:.7}@media (hover:hover){.hover\:opacity-100:hover{opacity:1}.enabled\:hover\:bg-\[color\:var\(--dsw-alias-interactive-bg-hover\)\]:enabled:hover{background-color:var(--dsw-alias-interactive-bg-hover)}}.disabled\:cursor-default:disabled{cursor:default}.disabled\:opacity-40:disabled{opacity:.4}}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}
4
+ /**
5
+ * Entry point for the plugin stylesheet, compiled by `npm run build:styles`
6
+ * into `client/token-chart.css`.
7
+ *
8
+ * @module dsh-token-chart/client/styles
9
+ */
10
+ /**
11
+ * Component styles for the plugin's surfaces.
12
+ *
13
+ * Everything is namespaced with the `dtc-` prefix so a plugin stylesheet can
14
+ * never reach into the product's own DOM. Utility classes (Tailwind) handle
15
+ * layout in the newer surfaces; the rules here carry the pieces that read
16
+ * better as named components.
17
+ *
18
+ * @module dsh-token-chart/client/styles/components
19
+ */
20
+ /**
21
+ * Shared Less variables for the plugin's styles.
22
+ *
23
+ * They deliberately hold the product's own CSS custom properties rather than
24
+ * literal colors: the tokens resolve at paint time, so the plugin follows the
25
+ * active theme (light / dark / high contrast) without a second definition.
26
+ */
27
+ /** Radius and spacing the plugin reuses across surfaces. */
28
+ .dtc-root {
29
+ color: var(--dsw-alias-label-primary);
30
+ font-size: 13px;
31
+ line-height: 1.55;
32
+ }
33
+ .dtc-panel {
34
+ padding: 20px 24px 32px;
35
+ overflow: auto;
36
+ height: 100%;
37
+ box-sizing: border-box;
38
+ }
39
+ .dtc-drawer {
40
+ padding: 12px 14px 24px;
41
+ overflow: auto;
42
+ height: 100%;
43
+ box-sizing: border-box;
44
+ }
45
+ .dtc-head {
46
+ display: flex;
47
+ align-items: flex-start;
48
+ justify-content: space-between;
49
+ gap: 12px;
50
+ margin-bottom: 12px;
51
+ }
52
+ .dtc-title {
53
+ margin: 0;
54
+ font-size: 16px;
55
+ font-weight: 600;
56
+ }
57
+ .dtc-subtitle {
58
+ margin: 2px 0 0;
59
+ color: var(--dsw-alias-label-secondary);
60
+ font-size: 12px;
61
+ }
62
+ .dtc-toolbar {
63
+ display: flex;
64
+ gap: 8px;
65
+ align-items: center;
66
+ }
67
+ .dtc-button {
68
+ border: 1px solid var(--dsw-alias-border-l2);
69
+ background: var(--dsw-alias-bg-layer-1);
70
+ color: var(--dsw-alias-label-primary);
71
+ border-radius: 8px;
72
+ padding: 5px 12px;
73
+ font-size: 12px;
74
+ cursor: pointer;
75
+ }
76
+ .dtc-button:hover {
77
+ background: var(--dsw-alias-bg-layer-2);
78
+ }
79
+ .dtc-filters {
80
+ display: flex;
81
+ align-items: center;
82
+ justify-content: space-between;
83
+ gap: 12px;
84
+ flex-wrap: wrap;
85
+ margin-bottom: 14px;
86
+ }
87
+ .dtc-segmented {
88
+ display: inline-flex;
89
+ border: 1px solid var(--dsw-alias-border-l1);
90
+ border-radius: 9px;
91
+ overflow: hidden;
92
+ background: var(--dsw-alias-bg-layer-1);
93
+ }
94
+ .dtc-segment {
95
+ border: 0;
96
+ background: transparent;
97
+ color: var(--dsw-alias-label-secondary);
98
+ padding: 5px 14px;
99
+ font-size: 12px;
100
+ cursor: pointer;
101
+ }
102
+ .dtc-segment + .dtc-segment {
103
+ border-left: 1px solid var(--dsw-alias-border-l1);
104
+ }
105
+ .dtc-segment-active {
106
+ background: var(--dsw-alias-bg-layer-2);
107
+ color: var(--dsw-alias-label-primary);
108
+ font-weight: 600;
109
+ }
110
+ .dtc-meta {
111
+ color: var(--dsw-alias-label-secondary);
112
+ font-size: 11px;
113
+ }
114
+ .dtc-banner {
115
+ display: flex;
116
+ align-items: baseline;
117
+ gap: 10px;
118
+ padding: 12px 14px;
119
+ border: 1px solid var(--dsw-alias-border-l1);
120
+ border-radius: 12px;
121
+ background: var(--dsw-alias-bg-layer-1);
122
+ margin-bottom: 12px;
123
+ }
124
+ .dtc-banner-label {
125
+ color: var(--dsw-alias-label-secondary);
126
+ font-size: 12px;
127
+ }
128
+ .dtc-banner-value {
129
+ font-size: 24px;
130
+ font-weight: 650;
131
+ letter-spacing: 0.5px;
132
+ }
133
+ .dtc-banner-extra {
134
+ margin-left: auto;
135
+ color: var(--dsw-alias-label-secondary);
136
+ font-size: 11px;
137
+ }
138
+ .dtc-kpis {
139
+ display: grid;
140
+ grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
141
+ gap: 8px;
142
+ margin-bottom: 14px;
143
+ }
144
+ .dtc-kpi {
145
+ border: 1px solid var(--dsw-alias-border-l1);
146
+ border-radius: 10px;
147
+ padding: 8px 10px;
148
+ background: var(--dsw-alias-bg-layer-1);
149
+ display: flex;
150
+ flex-direction: column;
151
+ gap: 2px;
152
+ }
153
+ .dtc-kpi-label {
154
+ color: var(--dsw-alias-label-secondary);
155
+ font-size: 11px;
156
+ }
157
+ .dtc-kpi-value {
158
+ font-size: 17px;
159
+ font-weight: 600;
160
+ }
161
+ .dtc-kpi-exact {
162
+ color: var(--dsw-alias-label-secondary);
163
+ font-size: 10px;
164
+ }
165
+ .dtc-facts {
166
+ display: grid;
167
+ grid-template-columns: auto 1fr;
168
+ gap: 2px 12px;
169
+ margin: 0 0 14px;
170
+ padding: 10px 12px;
171
+ border: 1px solid var(--dsw-alias-border-l1);
172
+ border-radius: 10px;
173
+ background: var(--dsw-alias-bg-layer-1);
174
+ font-size: 12px;
175
+ }
176
+ .dtc-facts dt {
177
+ color: var(--dsw-alias-label-secondary);
178
+ }
179
+ .dtc-facts dd {
180
+ margin: 0;
181
+ text-align: right;
182
+ font-variant-numeric: tabular-nums;
183
+ }
184
+ .dtc-section-title {
185
+ font-size: 12px;
186
+ color: var(--dsw-alias-label-secondary);
187
+ margin: 4px 0 6px;
188
+ }
189
+ .dtc-chart {
190
+ width: 100%;
191
+ }
192
+ .dtc-chart svg {
193
+ display: block;
194
+ max-width: 100%;
195
+ }
196
+ .dtc-chart-pie {
197
+ display: flex;
198
+ align-items: center;
199
+ gap: 16px;
200
+ flex-wrap: wrap;
201
+ }
202
+ .dtc-legend {
203
+ display: flex;
204
+ flex-wrap: wrap;
205
+ gap: 10px;
206
+ margin-top: 6px;
207
+ font-size: 11px;
208
+ color: var(--dsw-alias-label-secondary);
209
+ }
210
+ .dtc-legend-column {
211
+ flex-direction: column;
212
+ gap: 4px;
213
+ margin-top: 0;
214
+ }
215
+ .dtc-legend-item {
216
+ display: inline-flex;
217
+ align-items: center;
218
+ gap: 5px;
219
+ }
220
+ .dtc-swatch {
221
+ width: 9px;
222
+ height: 9px;
223
+ border-radius: 2px;
224
+ display: inline-block;
225
+ }
226
+ /* The block spans the surface; only the table inside it scrolls. */
227
+ .dtc-table-block {
228
+ width: 100%;
229
+ }
230
+ .dtc-table-wrap {
231
+ margin-top: 12px;
232
+ overflow: auto;
233
+ border: 1px solid var(--dsw-alias-border-l1);
234
+ border-radius: 10px;
235
+ }
236
+ .dtc-table {
237
+ width: 100%;
238
+ border-collapse: collapse;
239
+ font-size: 12px;
240
+ }
241
+ .dtc-table th,
242
+ .dtc-table td {
243
+ padding: 6px 10px;
244
+ border-bottom: 1px solid var(--dsw-alias-border-l1);
245
+ text-align: left;
246
+ white-space: nowrap;
247
+ }
248
+ .dtc-table th {
249
+ color: var(--dsw-alias-label-secondary);
250
+ font-weight: 500;
251
+ background: var(--dsw-alias-bg-layer-1);
252
+ position: sticky;
253
+ top: 0;
254
+ }
255
+ .dtc-table tbody tr:last-child td {
256
+ border-bottom: 0;
257
+ }
258
+ .dtc-right {
259
+ text-align: right !important;
260
+ font-variant-numeric: tabular-nums;
261
+ }
262
+ .dtc-empty {
263
+ color: var(--dsw-alias-label-secondary);
264
+ font-size: 12px;
265
+ padding: 18px 2px;
266
+ }
267
+ .dtc-error {
268
+ color: var(--dsw-alias-state-error-primary);
269
+ font-size: 12px;
270
+ }
271
+ .dtc-warn {
272
+ color: var(--dsw-alias-state-warn-primary);
273
+ font-size: 11px;
274
+ margin: 6px 0 0;
275
+ }
276
+ .dtc-footnote {
277
+ color: var(--dsw-alias-label-secondary);
278
+ font-size: 11px;
279
+ line-height: 1.5;
280
+ margin: 8px 0 0;
281
+ }
282
+ .dtc-settings {
283
+ padding: 4px 2px 16px;
284
+ max-width: 760px;
285
+ }
286
+ .dtc-card {
287
+ border: 1px solid var(--dsw-alias-border-l1);
288
+ border-radius: 12px;
289
+ padding: 14px 16px;
290
+ margin: 12px 0;
291
+ background: var(--dsw-alias-bg-layer-1);
292
+ }
293
+ .dtc-card-title {
294
+ margin: 0 0 2px;
295
+ font-size: 13px;
296
+ font-weight: 600;
297
+ }
298
+ .dtc-card-hint {
299
+ margin: 0 0 10px;
300
+ color: var(--dsw-alias-label-secondary);
301
+ font-size: 11px;
302
+ }
303
+ .dtc-field-label {
304
+ margin: 12px 0 6px;
305
+ font-size: 12px;
306
+ color: var(--dsw-alias-label-secondary);
307
+ }
308
+ .dtc-picker {
309
+ display: flex;
310
+ flex-wrap: wrap;
311
+ gap: 6px;
312
+ }
313
+ .dtc-chip {
314
+ border: 1px solid var(--dsw-alias-border-l1);
315
+ background: var(--dsw-alias-bg-base);
316
+ color: var(--dsw-alias-label-secondary);
317
+ border-radius: 999px;
318
+ padding: 4px 12px;
319
+ font-size: 12px;
320
+ cursor: pointer;
321
+ }
322
+ .dtc-chip:hover {
323
+ border-color: var(--dsw-alias-border-l2);
324
+ color: var(--dsw-alias-label-primary);
325
+ }
326
+ .dtc-chip-active {
327
+ border-color: var(--dsw-alias-brand-primary);
328
+ color: var(--dsw-alias-brand-primary);
329
+ background: color-mix(in srgb, var(--dsw-alias-brand-primary) 10%, transparent);
330
+ font-weight: 600;
331
+ }
332
+ .dtc-switch-row {
333
+ display: flex;
334
+ align-items: center;
335
+ justify-content: space-between;
336
+ gap: 12px;
337
+ padding: 8px 0;
338
+ border-bottom: 1px solid var(--dsw-alias-border-l1);
339
+ }
340
+ .dtc-switch-row:last-child {
341
+ border-bottom: 0;
342
+ }
343
+ .dtc-switch-text {
344
+ display: flex;
345
+ flex-direction: column;
346
+ }
347
+ .dtc-switch-label {
348
+ font-size: 12.5px;
349
+ }
350
+ .dtc-switch-hint {
351
+ color: var(--dsw-alias-label-secondary);
352
+ font-size: 11px;
353
+ }
354
+ .dtc-switch {
355
+ width: 36px;
356
+ height: 20px;
357
+ border-radius: 999px;
358
+ border: 1px solid var(--dsw-alias-border-l2);
359
+ background: var(--dsw-alias-bg-layer-2);
360
+ position: relative;
361
+ cursor: pointer;
362
+ padding: 0;
363
+ flex: none;
364
+ }
365
+ .dtc-switch-on {
366
+ background: var(--dsw-alias-brand-primary);
367
+ border-color: var(--dsw-alias-brand-primary);
368
+ }
369
+ .dtc-switch-knob {
370
+ position: absolute;
371
+ top: 2px;
372
+ left: 2px;
373
+ width: 14px;
374
+ height: 14px;
375
+ border-radius: 50%;
376
+ background: var(--dsw-alias-bg-base);
377
+ transition: transform 0.16s ease;
378
+ }
379
+ .dtc-switch-on .dtc-switch-knob {
380
+ transform: translateX(16px);
381
+ }
382
+ .dtc-settings-footer {
383
+ display: flex;
384
+ align-items: center;
385
+ justify-content: space-between;
386
+ gap: 12px;
387
+ margin-top: 10px;
388
+ }
389
+ .dtc-status {
390
+ color: var(--dsw-alias-label-secondary);
391
+ font-size: 11px;
392
+ }
393
+ .dtc-status-error {
394
+ color: var(--dsw-alias-state-error-primary);
395
+ }
396
+ .dtc-plugin-head {
397
+ display: flex;
398
+ flex-direction: column;
399
+ gap: 4px;
400
+ margin: 2px 0 6px;
401
+ }
402
+ .dtc-plugin-id {
403
+ display: flex;
404
+ align-items: center;
405
+ gap: 8px;
406
+ flex-wrap: wrap;
407
+ }
408
+ .dtc-plugin-icon {
409
+ display: inline-flex;
410
+ color: var(--dsw-alias-label-primary);
411
+ }
412
+ .dtc-plugin-name {
413
+ color: var(--dsw-alias-label-secondary);
414
+ font-size: 12px;
415
+ }
416
+ .dtc-plugin-version {
417
+ color: var(--dsw-alias-label-secondary);
418
+ font-size: 12px;
419
+ font-variant-numeric: tabular-nums;
420
+ }
421
+ .dtc-update-button {
422
+ margin-left: auto;
423
+ border: 1px solid var(--dsw-alias-label-primary);
424
+ background: var(--dsw-alias-label-primary);
425
+ color: var(--dsw-alias-bg-base);
426
+ border-radius: 8px;
427
+ padding: 4px 12px;
428
+ font-size: 12px;
429
+ font-weight: 500;
430
+ cursor: pointer;
431
+ }
432
+ .dtc-update-button:hover {
433
+ opacity: 0.88;
434
+ }
435
+ .dtc-update-button:disabled {
436
+ opacity: 0.5;
437
+ cursor: default;
438
+ }
439
+ .dtc-plugin-note {
440
+ color: var(--dsw-alias-label-secondary);
441
+ font-size: 11px;
442
+ }
443
+ /* The settings shell owns the nav row; our own row gets the sidebar glyph. */
444
+ [data-dtc-settings-nav] > svg:first-child {
445
+ display: none;
446
+ }
447
+ [data-dtc-settings-nav]::before {
448
+ content: '';
449
+ flex: none;
450
+ width: 16px;
451
+ height: 16px;
452
+ background: currentColor;
453
+ -webkit-mask: url("data:image/svg+xml,<svg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'><g%20fill='black'><rect%20x='3'%20y='12'%20width='4'%20height='9'%20rx='1'/><rect%20x='9'%20y='8'%20width='4'%20height='13'%20rx='1'/><rect%20x='15'%20y='4'%20width='4'%20height='17'%20rx='1'/></g></svg>") center / contain no-repeat;
454
+ mask: url("data:image/svg+xml,<svg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'><g%20fill='black'><rect%20x='3'%20y='12'%20width='4'%20height='9'%20rx='1'/><rect%20x='9'%20y='8'%20width='4'%20height='13'%20rx='1'/><rect%20x='15'%20y='4'%20width='4'%20height='17'%20rx='1'/></g></svg>") center / contain no-repeat;
455
+ }
456
+ .dtc-echarts {
457
+ min-width: 120px;
458
+ }
459
+ .dtc-echarts svg {
460
+ display: block;
461
+ max-width: 100%;
462
+ }
463
+ .dtc-engine {
464
+ display: flex;
465
+ align-items: center;
466
+ justify-content: space-between;
467
+ gap: 12px;
468
+ font-size: 12px;
469
+ }
470
+ .dtc-engine-label {
471
+ color: var(--dsw-alias-label-secondary);
472
+ }
473
+ .dtc-engine[data-dtc-engine="echarts"] {
474
+ color: var(--dsw-alias-label-primary);
475
+ }
476
+ .dtc-engine[data-dtc-engine="svg"] {
477
+ color: var(--dsw-alias-state-warn-primary);
478
+ }
479
+ .dtc-header-button {
480
+ display: inline-flex;
481
+ align-items: center;
482
+ gap: 5px;
483
+ border: 1px solid var(--dsw-alias-border-l1);
484
+ background: transparent;
485
+ color: var(--dsw-alias-label-secondary);
486
+ border-radius: 8px;
487
+ padding: 3px 9px;
488
+ font-size: 12px;
489
+ cursor: pointer;
490
+ }
491
+ .dtc-header-button:hover {
492
+ color: var(--dsw-alias-label-primary);
493
+ border-color: var(--dsw-alias-border-l2);
494
+ }
495
+ .dtc-header-label {
496
+ white-space: nowrap;
497
+ }
498
+ /* ---------------------------------------------------------------- pager */
499
+ /* The pager sits at the bottom-right of the table; the row count stays left. */
500
+ /* Layout lives here rather than only in utilities: these rules are unlayered, so
501
+ a product rule that targets `nav` cannot outrank the pager's own class. */
502
+ .dtc-pager {
503
+ display: flex;
504
+ align-items: center;
505
+ justify-content: flex-end;
506
+ gap: 4px;
507
+ margin-top: 10px;
508
+ font-size: 11px;
509
+ color: var(--dsw-alias-label-secondary);
510
+ }
511
+ .dtc-pager-total {
512
+ margin-right: auto;
513
+ }
514
+ .dtc-page {
515
+ box-sizing: border-box;
516
+ min-width: 26px;
517
+ height: 26px;
518
+ padding: 0 6px;
519
+ border: 1px solid var(--dsw-alias-border-l1);
520
+ border-radius: 6px;
521
+ background: var(--dsw-alias-bg-layer-1);
522
+ color: var(--dsw-alias-label-primary);
523
+ font: inherit;
524
+ font-size: 12px;
525
+ line-height: 1;
526
+ cursor: pointer;
527
+ }
528
+ .dtc-page:hover:not(:disabled) {
529
+ background: var(--dsw-alias-interactive-bg-hover);
530
+ }
531
+ .dtc-page:disabled {
532
+ opacity: 0.4;
533
+ cursor: default;
534
+ }
535
+ /* The page in view: brand border and text, no fill. */
536
+ .dtc-page-current {
537
+ border-color: var(--dsw-alias-brand-primary);
538
+ color: var(--dsw-alias-brand-primary);
539
+ background: transparent;
540
+ }
541
+ .dtc-page-gap {
542
+ padding: 0 2px;
543
+ }
544
+ .dtc-page-size {
545
+ position: relative;
546
+ display: inline-flex;
547
+ align-items: center;
548
+ margin-left: 6px;
549
+ }
550
+ .dtc-select {
551
+ appearance: none;
552
+ height: 26px;
553
+ padding: 0 22px 0 8px;
554
+ border: 1px solid var(--dsw-alias-border-l1);
555
+ border-radius: 6px;
556
+ background: var(--dsw-alias-bg-layer-1);
557
+ color: var(--dsw-alias-label-primary);
558
+ font: inherit;
559
+ font-size: 12px;
560
+ cursor: pointer;
561
+ }
562
+ .dtc-select-chevron {
563
+ position: absolute;
564
+ right: 6px;
565
+ color: var(--dsw-alias-label-secondary);
566
+ pointer-events: none;
567
+ }
568
+
@@ -0,0 +1,24 @@
1
+ import type { Buckets, Derived, SessionEvent, UsageSample } from './types.ts';
2
+ /** One zeroed bucket set. */
3
+ export declare function zeroBuckets(): Buckets;
4
+ export declare function isCount(value: unknown): value is number;
5
+ /**
6
+ * The last `usage` chunk embedded in one durable Assistant settlement stream.
7
+ * @param stream - compact records of the settlement.
8
+ * @returns the provider usage object, or undefined.
9
+ */
10
+ export declare function lastStreamUsage(stream: readonly unknown[] | undefined): UsageSample | undefined;
11
+ /** The usage one durable settlement reports, if any. */
12
+ export declare function usageOf(event: SessionEvent): UsageSample | undefined;
13
+ /** Normalize one provider usage sample into the four billed buckets. */
14
+ export declare function bucketsFrom(usage: UsageSample | undefined): Buckets | undefined;
15
+ export declare function bucketsEqual(left: Buckets, right: Buckets): boolean;
16
+ export declare function addInto(total: Buckets, buckets: Buckets): Buckets;
17
+ export declare function subtract(total: Buckets, buckets: Buckets): Buckets;
18
+ /** Derived figures shared by every response. */
19
+ export declare function derived<T extends Record<string, unknown>>(buckets: Buckets, extra?: T): Derived & T;
20
+ /** Local calendar-day key `YYYY-MM-DD`. */
21
+ export declare function dayKey(time: number): string;
22
+ /** Epoch ms of local midnight, `offset` days back. */
23
+ export declare function startOfLocalDay(offset?: number): number;
24
+ export declare function timeLabel(time: number): string;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Build entry for the package-local lazy chunk `client.echarts.js`.
3
+ *
4
+ * Only what the token-usage surfaces actually draw is pulled in: bar, line and
5
+ * pie series plus the grid/tooltip/legend/dataZoom components and the SVG
6
+ * renderer.
7
+ * Everything else ECharts ships (maps, 3D, GL, canvas renderer, the full
8
+ * component set) is tree-shaken away by the bundler.
9
+ */
10
+ import * as echarts from 'echarts/core';
11
+ export default echarts;
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Values both halves and every Host module agree on.
3
+ *
4
+ * @module dsh-token-chart/constants
5
+ */
6
+ /** The plugin's package name: the client entry id and the artifact key. */
7
+ export declare const PACKAGE_NAME = "dsh-token-chart";
8
+ /** Retention window: only the newest 7 calendar days are kept on disk. */
9
+ export declare const RETENTION_DAYS = 7;
10
+ /** Store schema version; a document from another version is rebuilt from logs. */
11
+ export declare const STORE_VERSION = 2;
12
+ export declare const DAY_MS: number;
13
+ /** Browser half and Host half agree on this prefix; it is part of the package contract. */
14
+ export declare const API_PREFIX = "/token-chart/api";
15
+ export declare const SAVE_DEBOUNCE_MS = 1200;
16
+ export declare const BACKFILL_SESSION_LIMIT = 40;
17
+ /** Fallback registry for the update check when the profile names none. */
18
+ export declare const DEFAULT_REGISTRY = "https://registry.npmmirror.com/";
19
+ export declare const UPDATE_CHECK_TTL_MS: number;
20
+ export declare const UPDATE_FETCH_TIMEOUT_MS = 12000;
21
+ export declare const METRIC_IDS: readonly ['input', 'output', 'cache', 'total'];
22
+ export declare const CHART_IDS: readonly ['bar', 'line', 'pie', 'table', 'multi-bar', 'multi-line', 'bar-line'];
@@ -0,0 +1,8 @@
1
+ import { HostContext } from './types.ts';
2
+ export declare const name = "dsh-token-chart";
3
+ export { compareVersions, fetchLatestVersion, readOwnManifest } from './update.ts';
4
+ /**
5
+ * Mount the collector, the store, and the browser API.
6
+ * @param ctx - the plugin's Cordis context.
7
+ */
8
+ export declare function apply(ctx: HostContext): void;
@@ -0,0 +1,3 @@
1
+ export declare function dataDir(): string;
2
+ export declare function usageFile(): string;
3
+ export declare function prefsFile(): string;
@@ -0,0 +1,8 @@
1
+ import type { Prefs } from './types.ts';
2
+ /** Preference defaults — the single definition shared by Host and browser halves. */
3
+ export declare const DEFAULT_PREFS: Prefs;
4
+ /**
5
+ * Coerce one stored preference document into the accepted shape.
6
+ * @param raw - whatever `prefs.json` (or a client patch) held.
7
+ */
8
+ export declare function normalizePrefs(raw: unknown): Prefs;