@krizaka/charts 0.1.0 → 0.2.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.
- package/README.md +17 -5
- package/dist/bar.js +5 -4
- package/dist/candlestick.js +3 -3
- package/dist/chart.js +3 -3
- package/dist/{chunk-EK3Z647J.js → chunk-4LBXEAGC.js} +3 -3
- package/dist/{chunk-AHQXJSAQ.js → chunk-AA5EWWYV.js} +2 -2
- package/dist/{chunk-VKO2OYYM.js → chunk-ARARFMNE.js} +2 -2
- package/dist/{chunk-WBH2QU77.js → chunk-BV4DBGN7.js} +2 -2
- package/dist/{chunk-BZ5CQFPH.js → chunk-C4MFZLJM.js} +2 -2
- package/dist/{chunk-XAJ3KCC4.js → chunk-CSSZLFLO.js} +3 -3
- package/dist/{chunk-UNK4MJVG.js → chunk-CVWSMUUB.js} +8 -8
- package/dist/chunk-E5DKBSWX.js +2 -0
- package/dist/chunk-E5DKBSWX.js.map +1 -0
- package/dist/chunk-EEP7PS2L.js +54 -0
- package/dist/chunk-EEP7PS2L.js.map +1 -0
- package/dist/{chunk-DZB6HEVO.js → chunk-EQLC2QVN.js} +2 -2
- package/dist/chunk-FINOPIDN.js +2 -0
- package/dist/chunk-FINOPIDN.js.map +1 -0
- package/dist/chunk-G2KF2WL4.js +2 -0
- package/dist/chunk-G2KF2WL4.js.map +1 -0
- package/dist/{chunk-PTSB3H5Q.js → chunk-I3D7KUGN.js} +2 -2
- package/dist/chunk-IKQV3NSL.js +76 -0
- package/dist/chunk-IKQV3NSL.js.map +1 -0
- package/dist/{chunk-DWJPPEMC.js → chunk-JTKR7ZWP.js} +73 -60
- package/dist/chunk-JTKR7ZWP.js.map +1 -0
- package/dist/chunk-KNDHO67X.js +78 -0
- package/dist/chunk-KNDHO67X.js.map +1 -0
- package/dist/chunk-L2EKYWVI.js +94 -0
- package/dist/chunk-L2EKYWVI.js.map +1 -0
- package/dist/{chunk-XC6BQ3RN.js → chunk-MXLITIGU.js} +3 -3
- package/dist/{chunk-OER6ETT4.js → chunk-NCIQMRV3.js} +3 -3
- package/dist/chunk-OIRHLJBC.js +83 -0
- package/dist/chunk-OIRHLJBC.js.map +1 -0
- package/dist/{chunk-WIRCIOLH.js → chunk-PBQV3B6O.js} +5 -5
- package/dist/chunk-POQIHFAZ.js +2 -0
- package/dist/chunk-POQIHFAZ.js.map +1 -0
- package/dist/{chunk-I5QUZVU2.js → chunk-PWMMXRMC.js} +2 -2
- package/dist/chunk-SLEJDQ3A.js +81 -0
- package/dist/chunk-SLEJDQ3A.js.map +1 -0
- package/dist/{chunk-7TIFCK5E.js → chunk-VKZZY2QD.js} +3 -3
- package/dist/{chunk-VKTZD7UT.js → chunk-W5ILLSPK.js} +3 -3
- package/dist/chunk-WBHFVBSK.js +25 -0
- package/dist/chunk-WBHFVBSK.js.map +1 -0
- package/dist/chunk-WNUFGMS7.js +113 -0
- package/dist/chunk-WNUFGMS7.js.map +1 -0
- package/dist/{chunk-XR4ZJDOV.js → chunk-WVTIKOII.js} +2 -2
- package/dist/{chunk-7CSAGFBW.js → chunk-XDDALY4C.js} +3 -3
- package/dist/credits.d.ts +42 -0
- package/dist/credits.js +21 -0
- package/dist/credits.js.map +1 -0
- package/dist/earnings.d.ts +29 -0
- package/dist/earnings.js +22 -0
- package/dist/earnings.js.map +1 -0
- package/dist/funnel.js +3 -3
- package/dist/gauge.js +3 -2
- package/dist/geo.js +2 -2
- package/dist/globe.js +2 -2
- package/dist/goal.d.ts +26 -0
- package/dist/goal.js +17 -0
- package/dist/goal.js.map +1 -0
- package/dist/heatmap.js +3 -3
- package/dist/index.d.ts +7 -0
- package/dist/index.js +80 -33
- package/dist/labels-DE_743fQ.d.ts +72 -0
- package/dist/latency.d.ts +33 -0
- package/dist/latency.js +24 -0
- package/dist/latency.js.map +1 -0
- package/dist/line.js +5 -4
- package/dist/native.d.ts +195 -1
- package/dist/native.js +383 -14
- package/dist/native.js.map +1 -1
- package/dist/pie.js +3 -3
- package/dist/radar.js +3 -3
- package/dist/sankey.js +3 -3
- package/dist/scatter.js +3 -3
- package/dist/sparkline.js +4 -3
- package/dist/throughput.d.ts +37 -0
- package/dist/throughput.js +24 -0
- package/dist/throughput.js.map +1 -0
- package/dist/ticker.d.ts +38 -0
- package/dist/ticker.js +22 -0
- package/dist/ticker.js.map +1 -0
- package/dist/treemap.js +3 -3
- package/package.json +100 -4
- package/registry/area-chart.json +1 -0
- package/registry/bar-chart.json +1 -0
- package/registry/calendar-heatmap.json +1 -0
- package/registry/candlestick.json +1 -0
- package/registry/chart.json +1 -0
- package/registry/charts-provider.json +1 -0
- package/registry/credit-usage.json +473 -0
- package/registry/earnings-chart.json +703 -0
- package/registry/examples/credit-usage/monthly-credits.d.ts +4 -0
- package/registry/examples/credit-usage/monthly-credits.js +24 -0
- package/registry/examples/credit-usage/monthly-credits.tsx +19 -0
- package/registry/examples/credit-usage/native/monthly-credits.d.ts +4 -0
- package/registry/examples/credit-usage/native/monthly-credits.dark.png +0 -0
- package/registry/examples/credit-usage/native/monthly-credits.js +23 -0
- package/registry/examples/credit-usage/native/monthly-credits.light.png +0 -0
- package/registry/examples/credit-usage/native/monthly-credits.tsx +18 -0
- package/registry/examples/credit-usage/storage-plan.d.ts +4 -0
- package/registry/examples/credit-usage/storage-plan.js +21 -0
- package/registry/examples/credit-usage/storage-plan.tsx +15 -0
- package/registry/examples/earnings-chart/creator-month.d.ts +4 -0
- package/registry/examples/earnings-chart/creator-month.js +29 -0
- package/registry/examples/earnings-chart/creator-month.tsx +24 -0
- package/registry/examples/earnings-chart/gross-and-net.d.ts +4 -0
- package/registry/examples/earnings-chart/gross-and-net.js +29 -0
- package/registry/examples/earnings-chart/gross-and-net.tsx +24 -0
- package/registry/examples/earnings-chart/native/creator-month.d.ts +4 -0
- package/registry/examples/earnings-chart/native/creator-month.dark.png +0 -0
- package/registry/examples/earnings-chart/native/creator-month.js +29 -0
- package/registry/examples/earnings-chart/native/creator-month.light.png +0 -0
- package/registry/examples/earnings-chart/native/creator-month.tsx +24 -0
- package/registry/examples/goal-progress/challenge-pot.d.ts +4 -0
- package/registry/examples/goal-progress/challenge-pot.js +22 -0
- package/registry/examples/goal-progress/challenge-pot.tsx +16 -0
- package/registry/examples/goal-progress/goal-reached.d.ts +4 -0
- package/registry/examples/goal-progress/goal-reached.js +11 -0
- package/registry/examples/goal-progress/goal-reached.tsx +6 -0
- package/registry/examples/goal-progress/native/challenge-pot.d.ts +4 -0
- package/registry/examples/goal-progress/native/challenge-pot.dark.png +0 -0
- package/registry/examples/goal-progress/native/challenge-pot.js +11 -0
- package/registry/examples/goal-progress/native/challenge-pot.light.png +0 -0
- package/registry/examples/goal-progress/native/challenge-pot.tsx +6 -0
- package/registry/examples/job-throughput/live-hours.d.ts +4 -0
- package/registry/examples/job-throughput/live-hours.js +33 -0
- package/registry/examples/job-throughput/live-hours.tsx +28 -0
- package/registry/examples/job-throughput/native/week-of-jobs.d.ts +4 -0
- package/registry/examples/job-throughput/native/week-of-jobs.dark.png +0 -0
- package/registry/examples/job-throughput/native/week-of-jobs.js +20 -0
- package/registry/examples/job-throughput/native/week-of-jobs.light.png +0 -0
- package/registry/examples/job-throughput/native/week-of-jobs.tsx +16 -0
- package/registry/examples/job-throughput/week-of-jobs.d.ts +4 -0
- package/registry/examples/job-throughput/week-of-jobs.js +20 -0
- package/registry/examples/job-throughput/week-of-jobs.tsx +16 -0
- package/registry/examples/latency-chart/by-capability.d.ts +4 -0
- package/registry/examples/latency-chart/by-capability.js +26 -0
- package/registry/examples/latency-chart/by-capability.tsx +21 -0
- package/registry/examples/latency-chart/native/by-capability.d.ts +4 -0
- package/registry/examples/latency-chart/native/by-capability.dark.png +0 -0
- package/registry/examples/latency-chart/native/by-capability.js +17 -0
- package/registry/examples/latency-chart/native/by-capability.light.png +0 -0
- package/registry/examples/latency-chart/native/by-capability.tsx +13 -0
- package/registry/examples/latency-chart/time-to-result.d.ts +4 -0
- package/registry/examples/latency-chart/time-to-result.js +27 -0
- package/registry/examples/latency-chart/time-to-result.tsx +22 -0
- package/registry/examples/price-ticker/auction-room.d.ts +4 -0
- package/registry/examples/price-ticker/auction-room.js +21 -0
- package/registry/examples/price-ticker/auction-room.tsx +17 -0
- package/registry/examples/price-ticker/native/auction-room.d.ts +4 -0
- package/registry/examples/price-ticker/native/auction-room.dark.png +0 -0
- package/registry/examples/price-ticker/native/auction-room.js +19 -0
- package/registry/examples/price-ticker/native/auction-room.light.png +0 -0
- package/registry/examples/price-ticker/native/auction-room.tsx +15 -0
- package/registry/examples/price-ticker/no-bid-yet.d.ts +4 -0
- package/registry/examples/price-ticker/no-bid-yet.js +11 -0
- package/registry/examples/price-ticker/no-bid-yet.tsx +6 -0
- package/registry/funnel.json +1 -0
- package/registry/gauge.json +1 -0
- package/registry/geo-map.json +1 -0
- package/registry/globe.json +1 -0
- package/registry/goal-progress.json +520 -0
- package/registry/heatmap.json +1 -0
- package/registry/index.json +163 -1
- package/registry/job-throughput.json +654 -0
- package/registry/latency-chart.json +671 -0
- package/registry/line-chart.json +1 -0
- package/registry/pie-chart.json +1 -0
- package/registry/price-ticker.json +684 -0
- package/registry/radar-chart.json +1 -0
- package/registry/sankey.json +1 -0
- package/registry/scatter-chart.json +1 -0
- package/registry/sparkline.json +1 -0
- package/registry/treemap.json +1 -0
- package/dist/chunk-DWJPPEMC.js.map +0 -1
- /package/dist/{chunk-EK3Z647J.js.map → chunk-4LBXEAGC.js.map} +0 -0
- /package/dist/{chunk-AHQXJSAQ.js.map → chunk-AA5EWWYV.js.map} +0 -0
- /package/dist/{chunk-VKO2OYYM.js.map → chunk-ARARFMNE.js.map} +0 -0
- /package/dist/{chunk-WBH2QU77.js.map → chunk-BV4DBGN7.js.map} +0 -0
- /package/dist/{chunk-BZ5CQFPH.js.map → chunk-C4MFZLJM.js.map} +0 -0
- /package/dist/{chunk-XAJ3KCC4.js.map → chunk-CSSZLFLO.js.map} +0 -0
- /package/dist/{chunk-UNK4MJVG.js.map → chunk-CVWSMUUB.js.map} +0 -0
- /package/dist/{chunk-DZB6HEVO.js.map → chunk-EQLC2QVN.js.map} +0 -0
- /package/dist/{chunk-PTSB3H5Q.js.map → chunk-I3D7KUGN.js.map} +0 -0
- /package/dist/{chunk-XC6BQ3RN.js.map → chunk-MXLITIGU.js.map} +0 -0
- /package/dist/{chunk-OER6ETT4.js.map → chunk-NCIQMRV3.js.map} +0 -0
- /package/dist/{chunk-WIRCIOLH.js.map → chunk-PBQV3B6O.js.map} +0 -0
- /package/dist/{chunk-I5QUZVU2.js.map → chunk-PWMMXRMC.js.map} +0 -0
- /package/dist/{chunk-7TIFCK5E.js.map → chunk-VKZZY2QD.js.map} +0 -0
- /package/dist/{chunk-VKTZD7UT.js.map → chunk-W5ILLSPK.js.map} +0 -0
- /package/dist/{chunk-XR4ZJDOV.js.map → chunk-WVTIKOII.js.map} +0 -0
- /package/dist/{chunk-7CSAGFBW.js.map → chunk-XDDALY4C.js.map} +0 -0
|
@@ -0,0 +1,671 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "latency-chart",
|
|
3
|
+
"package": "@krizaka/charts",
|
|
4
|
+
"type": "chart",
|
|
5
|
+
"title": "Latency chart",
|
|
6
|
+
"summary": "Median and 95th-percentile latency per item, in the unit that fits (ms, s, min), against a service objective.",
|
|
7
|
+
"description": "Median and 95th-percentile latency per item, in the unit that fits (ms, s, min), against a service objective.",
|
|
8
|
+
"status": "beta",
|
|
9
|
+
"category": "charts",
|
|
10
|
+
"platforms": "both",
|
|
11
|
+
"engine": "svg",
|
|
12
|
+
"tier": "ready-made",
|
|
13
|
+
"whenToUse": [
|
|
14
|
+
"The console's supervision: latency per capability against the objective.",
|
|
15
|
+
"Orazaka's “time to result” per kind of job, where seconds turn into minutes.",
|
|
16
|
+
"Any duration compared across items: a model, a region, an endpoint."
|
|
17
|
+
],
|
|
18
|
+
"whenNotToUse": [
|
|
19
|
+
{
|
|
20
|
+
"when": "A duration over time (the latency of the last hours).",
|
|
21
|
+
"use": "line-chart"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"when": "How many jobs ran.",
|
|
25
|
+
"use": "job-throughput"
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"bestPractices": [
|
|
29
|
+
"Pass milliseconds: the chart picks the unit for each value.",
|
|
30
|
+
"Show the p95 beside the median: the median alone hides the slow tail people feel.",
|
|
31
|
+
"Name the objective in its label (“Objective”: the line writes its value)."
|
|
32
|
+
],
|
|
33
|
+
"accessibility": {
|
|
34
|
+
"keyboard": [
|
|
35
|
+
{
|
|
36
|
+
"keys": "Tab",
|
|
37
|
+
"action": "Moves the focus to the plot, then to the data and export buttons."
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"keys": "Arrow keys",
|
|
41
|
+
"action": "Walk the items: the median and the p95 of each are announced."
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
"notes": [
|
|
45
|
+
"The slowest p95 and the number of items past the objective are written above the chart.",
|
|
46
|
+
"Durations are written with their unit everywhere: axis, tooltip, table and summary."
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
"related": [
|
|
50
|
+
"bar-chart",
|
|
51
|
+
"job-throughput",
|
|
52
|
+
"line-chart"
|
|
53
|
+
],
|
|
54
|
+
"source": "packages/charts/src/meta/latency-chart.ts",
|
|
55
|
+
"install": {
|
|
56
|
+
"web": "npm install @krizaka/charts",
|
|
57
|
+
"native": "npx expo install react-native-svg\nnpm install @krizaka/charts"
|
|
58
|
+
},
|
|
59
|
+
"web": {
|
|
60
|
+
"entry": "@krizaka/charts/latency",
|
|
61
|
+
"import": "import { LatencyChart, formatDuration } from \"@krizaka/charts/latency\";",
|
|
62
|
+
"props": [
|
|
63
|
+
{
|
|
64
|
+
"component": "LatencyChart",
|
|
65
|
+
"description": "Median and p95 latency per item, durations in the unit that fits, against a service objective.",
|
|
66
|
+
"props": [
|
|
67
|
+
{
|
|
68
|
+
"name": "data",
|
|
69
|
+
"type": "readonly T[]",
|
|
70
|
+
"default": null,
|
|
71
|
+
"description": "The rows, in the order of the x axis.",
|
|
72
|
+
"required": true
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"name": "title",
|
|
76
|
+
"type": "string",
|
|
77
|
+
"default": null,
|
|
78
|
+
"description": "What the chart shows, in a few words: its accessible name, and its heading unless `hideTitle`.",
|
|
79
|
+
"required": true
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"name": "brand",
|
|
83
|
+
"type": "BrandId",
|
|
84
|
+
"default": null,
|
|
85
|
+
"description": "The brand whose palette the charts use. Without it, a chart follows a `.brand-<id>` ancestor, else Krizaka. Set it\nwhen the app loads a brand stylesheet on `:root` (`@krizaka/tokens/brands/orazaka.css`).",
|
|
86
|
+
"required": false
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"name": "className",
|
|
90
|
+
"type": "string",
|
|
91
|
+
"default": null,
|
|
92
|
+
"description": "A class on the figure (layout: margins, grid placement).",
|
|
93
|
+
"required": false
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"name": "dataTable",
|
|
97
|
+
"type": "boolean",
|
|
98
|
+
"default": null,
|
|
99
|
+
"description": "The \"Show data\" button (the table is in the page for screen readers either way). Default true.",
|
|
100
|
+
"required": false
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"name": "description",
|
|
104
|
+
"type": "ReactNode",
|
|
105
|
+
"default": null,
|
|
106
|
+
"description": "A sentence under the title: the period, the unit, the source.",
|
|
107
|
+
"required": false
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"name": "empty",
|
|
111
|
+
"type": "ReactNode",
|
|
112
|
+
"default": null,
|
|
113
|
+
"description": "What to show when there is nothing to draw (default: the `empty` label). An `EmptyState` of\n@krizaka /ui fits.",
|
|
114
|
+
"required": false
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"name": "error",
|
|
118
|
+
"type": "ReactNode",
|
|
119
|
+
"default": null,
|
|
120
|
+
"description": "The data could not be loaded: `true` says the default words, a node says yours (a retry button…).",
|
|
121
|
+
"required": false
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"name": "exportable",
|
|
125
|
+
"type": "boolean | readonly ExportFormat[]",
|
|
126
|
+
"default": null,
|
|
127
|
+
"description": "Export buttons: `true` for PNG, SVG and CSV, or the formats you want.",
|
|
128
|
+
"required": false
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"name": "height",
|
|
132
|
+
"type": "number",
|
|
133
|
+
"default": null,
|
|
134
|
+
"description": "The height of the plot in pixels. Default 280 (a sparkline: 32).",
|
|
135
|
+
"required": false
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"name": "hideSummary",
|
|
139
|
+
"type": "boolean",
|
|
140
|
+
"default": null,
|
|
141
|
+
"description": "Hide the slowest p95 and the count over the objective.",
|
|
142
|
+
"required": false
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"name": "hideTitle",
|
|
146
|
+
"type": "boolean",
|
|
147
|
+
"default": null,
|
|
148
|
+
"description": "Visually hide the title (it stays the chart's accessible name): a card that already has its heading.",
|
|
149
|
+
"required": false
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"name": "id",
|
|
153
|
+
"type": "string",
|
|
154
|
+
"default": null,
|
|
155
|
+
"description": "The id of the figure.",
|
|
156
|
+
"required": false
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"name": "labels",
|
|
160
|
+
"type": "Partial<LatencyLabels>",
|
|
161
|
+
"default": null,
|
|
162
|
+
"description": "The words, passed translated; English by default.",
|
|
163
|
+
"required": false
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"name": "legend",
|
|
167
|
+
"type": "boolean",
|
|
168
|
+
"default": null,
|
|
169
|
+
"description": "Show the legend (from two series). Default true.",
|
|
170
|
+
"required": false
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"name": "live",
|
|
174
|
+
"type": "boolean",
|
|
175
|
+
"default": null,
|
|
176
|
+
"description": "Streaming data (a job queue, an auction): no entrance on updates, no announcement of every new point.",
|
|
177
|
+
"required": false
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"name": "loading",
|
|
181
|
+
"type": "boolean",
|
|
182
|
+
"default": null,
|
|
183
|
+
"description": "The data is on its way: a skeleton of the chart, announced once.",
|
|
184
|
+
"required": false
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"name": "locale",
|
|
188
|
+
"type": "Locale",
|
|
189
|
+
"default": null,
|
|
190
|
+
"description": "The locale of every figure and date (`\"fr-FR\"`). Default `\"en-US\"`.",
|
|
191
|
+
"required": false
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
"name": "markers",
|
|
195
|
+
"type": "readonly Marker[]",
|
|
196
|
+
"default": null,
|
|
197
|
+
"description": "Vertical markers at a category: a launch, an incident.",
|
|
198
|
+
"required": false
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"name": "objective",
|
|
202
|
+
"type": "{ readonly value: number; readonly label: string; }",
|
|
203
|
+
"default": null,
|
|
204
|
+
"description": "The service objective, in milliseconds: a line, and the count of what goes past it (by p95).",
|
|
205
|
+
"required": false
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"name": "onSelect",
|
|
209
|
+
"type": "((datum: T, index: number) => void)",
|
|
210
|
+
"default": null,
|
|
211
|
+
"description": "Called with the row when a point or a bar is clicked (or Enter is pressed on it).",
|
|
212
|
+
"required": false
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"name": "p50",
|
|
216
|
+
"type": "string | ((datum: T, index: number) => number | null)",
|
|
217
|
+
"default": "\"p50\" as Accessor<T, number | null | undefined>",
|
|
218
|
+
"description": "The median, in milliseconds. Default `\"p50\"`.",
|
|
219
|
+
"required": false
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"name": "p95",
|
|
223
|
+
"type": "string | ((datum: T, index: number) => number | null) | null",
|
|
224
|
+
"default": "\"p95\" as Accessor<T, number | null | undefined>",
|
|
225
|
+
"description": "The 95th percentile, in milliseconds. Default `\"p95\"`; `null` to draw the median alone.",
|
|
226
|
+
"required": false
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
"name": "style",
|
|
230
|
+
"type": "CSSProperties",
|
|
231
|
+
"default": null,
|
|
232
|
+
"description": "Inline style on the figure (layout only: colours come from the tokens).",
|
|
233
|
+
"required": false
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
"name": "summary",
|
|
237
|
+
"type": "\"hidden\" | \"visible\"",
|
|
238
|
+
"default": null,
|
|
239
|
+
"description": "The written summary: read by screen readers only (`\"hidden\"`, default), or shown under the chart (`\"visible\"`).",
|
|
240
|
+
"required": false
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
"name": "summaryText",
|
|
244
|
+
"type": "string",
|
|
245
|
+
"default": null,
|
|
246
|
+
"description": "Your own summary instead of the generated one (still read first by screen readers).",
|
|
247
|
+
"required": false
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
"name": "vertical",
|
|
251
|
+
"type": "boolean",
|
|
252
|
+
"default": null,
|
|
253
|
+
"description": "Vertical bars instead of horizontal ones (few, short names).",
|
|
254
|
+
"required": false
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
"name": "x",
|
|
258
|
+
"type": "string | ((datum: T, index: number) => unknown)",
|
|
259
|
+
"default": "\"name\" as Accessor<T, unknown>",
|
|
260
|
+
"description": "The field (or function) naming what is measured (a capability, a model). Default `\"name\"`.",
|
|
261
|
+
"required": false
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
"name": "xLabel",
|
|
265
|
+
"type": "string",
|
|
266
|
+
"default": null,
|
|
267
|
+
"description": "The header of the categories in the data table (`Month`).",
|
|
268
|
+
"required": false
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
"name": "zero",
|
|
272
|
+
"type": "boolean",
|
|
273
|
+
"default": null,
|
|
274
|
+
"description": "Start the value axis at zero. Default: true for bars and areas; for lines, unless the values sit far from zero.",
|
|
275
|
+
"required": false
|
|
276
|
+
}
|
|
277
|
+
]
|
|
278
|
+
}
|
|
279
|
+
],
|
|
280
|
+
"examples": [
|
|
281
|
+
{
|
|
282
|
+
"name": "by-capability",
|
|
283
|
+
"title": "By capability",
|
|
284
|
+
"description": "The console: p50 and p95 per capability against a 2 s objective.",
|
|
285
|
+
"path": "examples/latency-chart/by-capability.tsx",
|
|
286
|
+
"module": "@krizaka/charts/registry/examples/latency-chart/by-capability",
|
|
287
|
+
"code": "import { LatencyChart } from \"@krizaka/charts/latency\";\n\n// Milliseconds, per capability, over the last 24 hours (the console's supervision).\nconst capabilities = [\n { name: \"Chat\", p50: 420, p95: 1_180 },\n { name: \"Embeddings\", p50: 85, p95: 210 },\n { name: \"Speech to text\", p50: 1_350, p95: 2_900 },\n { name: \"Image\", p50: 4_200, p95: 9_800 },\n { name: \"Translation\", p50: 610, p95: 1_640 },\n];\n\nexport default function ByCapability() {\n return (\n <LatencyChart\n title=\"Latency by capability\"\n description=\"Last 24 hours\"\n data={capabilities}\n objective={{ value: 2_000, label: \"Objective\" }}\n />\n );\n}\n"
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
"name": "time-to-result",
|
|
291
|
+
"title": "Time to result",
|
|
292
|
+
"description": "Orazaka: the median time to a result per kind of job, in minutes when it takes minutes.",
|
|
293
|
+
"path": "examples/latency-chart/time-to-result.tsx",
|
|
294
|
+
"module": "@krizaka/charts/registry/examples/latency-chart/time-to-result",
|
|
295
|
+
"code": "import { LatencyChart } from \"@krizaka/charts/latency\";\n\n// Orazaka: how long a job takes to give its result, per kind — seconds turn into minutes.\nconst kinds = [\n { kind: \"Summary\", median: 8_400 },\n { kind: \"Transcript\", median: 46_000 },\n { kind: \"Dubbing\", median: 312_000 },\n { kind: \"Video clip\", median: 540_000 },\n];\n\nexport default function TimeToResult() {\n return (\n <LatencyChart\n title=\"Time to result\"\n data={kinds}\n x=\"kind\"\n p50=\"median\"\n p95={null}\n labels={{ p50: \"Median\", slowest: \"median of {name}, the slowest\" }}\n />\n );\n}\n"
|
|
296
|
+
}
|
|
297
|
+
]
|
|
298
|
+
},
|
|
299
|
+
"native": {
|
|
300
|
+
"entry": "@krizaka/charts/native",
|
|
301
|
+
"import": "import { LatencyChart } from \"@krizaka/charts/native\";",
|
|
302
|
+
"differences": [
|
|
303
|
+
"Vertical bars only (no `vertical` prop): keep the names short.",
|
|
304
|
+
"The slowest p95 is a headline above the chart."
|
|
305
|
+
],
|
|
306
|
+
"props": [
|
|
307
|
+
{
|
|
308
|
+
"component": "LatencyChart",
|
|
309
|
+
"description": "Median and p95 latency per item (React Native, vertical bars): the slowest p95 first.",
|
|
310
|
+
"props": [
|
|
311
|
+
{
|
|
312
|
+
"name": "data",
|
|
313
|
+
"type": "readonly T[]",
|
|
314
|
+
"default": null,
|
|
315
|
+
"description": "The rows, in the order of the x axis.",
|
|
316
|
+
"required": true
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
"name": "title",
|
|
320
|
+
"type": "string",
|
|
321
|
+
"default": null,
|
|
322
|
+
"description": "What the chart shows: its heading and accessible name.",
|
|
323
|
+
"required": true
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
"name": "brand",
|
|
327
|
+
"type": "BrandId",
|
|
328
|
+
"default": null,
|
|
329
|
+
"description": "The brand whose palette leads. Default Krizaka.",
|
|
330
|
+
"required": false
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
"name": "empty",
|
|
334
|
+
"type": "ReactNode",
|
|
335
|
+
"default": null,
|
|
336
|
+
"description": "Shown instead of the plot when there is nothing to draw. Default: the `empty` label.",
|
|
337
|
+
"required": false
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
"name": "height",
|
|
341
|
+
"type": "number",
|
|
342
|
+
"default": null,
|
|
343
|
+
"description": "The plot's height.",
|
|
344
|
+
"required": false
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
"name": "hideTitle",
|
|
348
|
+
"type": "boolean",
|
|
349
|
+
"default": null,
|
|
350
|
+
"description": "Hide the heading (it stays the accessible name).",
|
|
351
|
+
"required": false
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
"name": "labels",
|
|
355
|
+
"type": "Partial<LatencyLabels>",
|
|
356
|
+
"default": null,
|
|
357
|
+
"description": "The words, passed translated.",
|
|
358
|
+
"required": false
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
"name": "loading",
|
|
362
|
+
"type": "boolean",
|
|
363
|
+
"default": null,
|
|
364
|
+
"description": "The data is on its way.",
|
|
365
|
+
"required": false
|
|
366
|
+
},
|
|
367
|
+
{
|
|
368
|
+
"name": "locale",
|
|
369
|
+
"type": "Locale",
|
|
370
|
+
"default": null,
|
|
371
|
+
"description": "The locale of every figure and date. Default `\"en-US\"`.",
|
|
372
|
+
"required": false
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
"name": "objective",
|
|
376
|
+
"type": "{ readonly value: number; readonly label: string; }",
|
|
377
|
+
"default": null,
|
|
378
|
+
"description": "The service objective, in milliseconds.",
|
|
379
|
+
"required": false
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
"name": "p50",
|
|
383
|
+
"type": "string | ((datum: T, index: number) => number | null)",
|
|
384
|
+
"default": "\"p50\" as Accessor<T, number | null | undefined>",
|
|
385
|
+
"description": "The median, in milliseconds. Default `\"p50\"`.",
|
|
386
|
+
"required": false
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
"name": "p95",
|
|
390
|
+
"type": "string | ((datum: T, index: number) => number | null) | null",
|
|
391
|
+
"default": "\"p95\" as Accessor<T, number | null | undefined>",
|
|
392
|
+
"description": "The 95th percentile, in milliseconds. Default `\"p95\"`; `null` for the median alone.",
|
|
393
|
+
"required": false
|
|
394
|
+
},
|
|
395
|
+
{
|
|
396
|
+
"name": "scheme",
|
|
397
|
+
"type": "Mode",
|
|
398
|
+
"default": null,
|
|
399
|
+
"description": "Dark or light. Default: the device's (pass `useTheme().scheme` of\n@krizaka /ui/native to follow the app).",
|
|
400
|
+
"required": false
|
|
401
|
+
},
|
|
402
|
+
{
|
|
403
|
+
"name": "style",
|
|
404
|
+
"type": "ViewStyle",
|
|
405
|
+
"default": null,
|
|
406
|
+
"description": "The style of the chart's container (layout only: colours come from the theme).",
|
|
407
|
+
"required": false
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
"name": "theme",
|
|
411
|
+
"type": "Partial<ChartTheme>",
|
|
412
|
+
"default": null,
|
|
413
|
+
"description": "The app's colour roles (`useTheme().theme` of\n@krizaka /ui/native): a product's brand overrides apply.",
|
|
414
|
+
"required": false
|
|
415
|
+
},
|
|
416
|
+
{
|
|
417
|
+
"name": "x",
|
|
418
|
+
"type": "string | ((datum: T, index: number) => unknown)",
|
|
419
|
+
"default": "\"name\" as Accessor<T, unknown>",
|
|
420
|
+
"description": "The field naming what is measured. Default `\"name\"`.",
|
|
421
|
+
"required": false
|
|
422
|
+
}
|
|
423
|
+
]
|
|
424
|
+
}
|
|
425
|
+
],
|
|
426
|
+
"examples": [
|
|
427
|
+
{
|
|
428
|
+
"name": "by-capability",
|
|
429
|
+
"title": "By capability",
|
|
430
|
+
"description": "The latency per capability, on a phone.",
|
|
431
|
+
"path": "examples/latency-chart/native/by-capability.tsx",
|
|
432
|
+
"module": "@krizaka/charts/registry/examples/latency-chart/native/by-capability",
|
|
433
|
+
"code": "import { LatencyChart } from \"@krizaka/charts/native\";\n\nconst capabilities = [\n { name: \"Chat\", p50: 420, p95: 1_180 },\n { name: \"Embed\", p50: 85, p95: 210 },\n { name: \"Speech\", p50: 1_350, p95: 2_900 },\n { name: \"Image\", p50: 4_200, p95: 9_800 },\n];\n\n// Short names: the bars stand upright on a phone.\nexport default function NativeByCapability() {\n return <LatencyChart title=\"Latency by capability\" data={capabilities} height={170} objective={{ value: 2_000, label: \"Objective\" }} />;\n}\n",
|
|
434
|
+
"screenshots": {
|
|
435
|
+
"dark": "examples/latency-chart/native/by-capability.dark.png",
|
|
436
|
+
"light": "examples/latency-chart/native/by-capability.light.png"
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
]
|
|
440
|
+
},
|
|
441
|
+
"files": [],
|
|
442
|
+
"dependencies": [
|
|
443
|
+
"@krizaka/intl@workspace:^",
|
|
444
|
+
"d3-geo@^3.1.1",
|
|
445
|
+
"echarts@^6.1.0",
|
|
446
|
+
"topojson-client@^3.1.0"
|
|
447
|
+
],
|
|
448
|
+
"registryDependencies": [],
|
|
449
|
+
"demo": {
|
|
450
|
+
"path": "examples/latency-chart/by-capability.tsx",
|
|
451
|
+
"content": "import { LatencyChart } from \"@krizaka/charts/latency\";\n\n// Milliseconds, per capability, over the last 24 hours (the console's supervision).\nconst capabilities = [\n { name: \"Chat\", p50: 420, p95: 1_180 },\n { name: \"Embeddings\", p50: 85, p95: 210 },\n { name: \"Speech to text\", p50: 1_350, p95: 2_900 },\n { name: \"Image\", p50: 4_200, p95: 9_800 },\n { name: \"Translation\", p50: 610, p95: 1_640 },\n];\n\nexport default function ByCapability() {\n return (\n <LatencyChart\n title=\"Latency by capability\"\n description=\"Last 24 hours\"\n data={capabilities}\n objective={{ value: 2_000, label: \"Objective\" }}\n />\n );\n}\n"
|
|
452
|
+
},
|
|
453
|
+
"props": [
|
|
454
|
+
{
|
|
455
|
+
"component": "LatencyChart",
|
|
456
|
+
"description": "Median and p95 latency per item, durations in the unit that fits, against a service objective.",
|
|
457
|
+
"props": [
|
|
458
|
+
{
|
|
459
|
+
"name": "data",
|
|
460
|
+
"type": "readonly T[]",
|
|
461
|
+
"default": null,
|
|
462
|
+
"description": "The rows, in the order of the x axis.",
|
|
463
|
+
"required": true
|
|
464
|
+
},
|
|
465
|
+
{
|
|
466
|
+
"name": "title",
|
|
467
|
+
"type": "string",
|
|
468
|
+
"default": null,
|
|
469
|
+
"description": "What the chart shows, in a few words: its accessible name, and its heading unless `hideTitle`.",
|
|
470
|
+
"required": true
|
|
471
|
+
},
|
|
472
|
+
{
|
|
473
|
+
"name": "brand",
|
|
474
|
+
"type": "BrandId",
|
|
475
|
+
"default": null,
|
|
476
|
+
"description": "The brand whose palette the charts use. Without it, a chart follows a `.brand-<id>` ancestor, else Krizaka. Set it\nwhen the app loads a brand stylesheet on `:root` (`@krizaka/tokens/brands/orazaka.css`).",
|
|
477
|
+
"required": false
|
|
478
|
+
},
|
|
479
|
+
{
|
|
480
|
+
"name": "className",
|
|
481
|
+
"type": "string",
|
|
482
|
+
"default": null,
|
|
483
|
+
"description": "A class on the figure (layout: margins, grid placement).",
|
|
484
|
+
"required": false
|
|
485
|
+
},
|
|
486
|
+
{
|
|
487
|
+
"name": "dataTable",
|
|
488
|
+
"type": "boolean",
|
|
489
|
+
"default": null,
|
|
490
|
+
"description": "The \"Show data\" button (the table is in the page for screen readers either way). Default true.",
|
|
491
|
+
"required": false
|
|
492
|
+
},
|
|
493
|
+
{
|
|
494
|
+
"name": "description",
|
|
495
|
+
"type": "ReactNode",
|
|
496
|
+
"default": null,
|
|
497
|
+
"description": "A sentence under the title: the period, the unit, the source.",
|
|
498
|
+
"required": false
|
|
499
|
+
},
|
|
500
|
+
{
|
|
501
|
+
"name": "empty",
|
|
502
|
+
"type": "ReactNode",
|
|
503
|
+
"default": null,
|
|
504
|
+
"description": "What to show when there is nothing to draw (default: the `empty` label). An `EmptyState` of\n@krizaka /ui fits.",
|
|
505
|
+
"required": false
|
|
506
|
+
},
|
|
507
|
+
{
|
|
508
|
+
"name": "error",
|
|
509
|
+
"type": "ReactNode",
|
|
510
|
+
"default": null,
|
|
511
|
+
"description": "The data could not be loaded: `true` says the default words, a node says yours (a retry button…).",
|
|
512
|
+
"required": false
|
|
513
|
+
},
|
|
514
|
+
{
|
|
515
|
+
"name": "exportable",
|
|
516
|
+
"type": "boolean | readonly ExportFormat[]",
|
|
517
|
+
"default": null,
|
|
518
|
+
"description": "Export buttons: `true` for PNG, SVG and CSV, or the formats you want.",
|
|
519
|
+
"required": false
|
|
520
|
+
},
|
|
521
|
+
{
|
|
522
|
+
"name": "height",
|
|
523
|
+
"type": "number",
|
|
524
|
+
"default": null,
|
|
525
|
+
"description": "The height of the plot in pixels. Default 280 (a sparkline: 32).",
|
|
526
|
+
"required": false
|
|
527
|
+
},
|
|
528
|
+
{
|
|
529
|
+
"name": "hideSummary",
|
|
530
|
+
"type": "boolean",
|
|
531
|
+
"default": null,
|
|
532
|
+
"description": "Hide the slowest p95 and the count over the objective.",
|
|
533
|
+
"required": false
|
|
534
|
+
},
|
|
535
|
+
{
|
|
536
|
+
"name": "hideTitle",
|
|
537
|
+
"type": "boolean",
|
|
538
|
+
"default": null,
|
|
539
|
+
"description": "Visually hide the title (it stays the chart's accessible name): a card that already has its heading.",
|
|
540
|
+
"required": false
|
|
541
|
+
},
|
|
542
|
+
{
|
|
543
|
+
"name": "id",
|
|
544
|
+
"type": "string",
|
|
545
|
+
"default": null,
|
|
546
|
+
"description": "The id of the figure.",
|
|
547
|
+
"required": false
|
|
548
|
+
},
|
|
549
|
+
{
|
|
550
|
+
"name": "labels",
|
|
551
|
+
"type": "Partial<LatencyLabels>",
|
|
552
|
+
"default": null,
|
|
553
|
+
"description": "The words, passed translated; English by default.",
|
|
554
|
+
"required": false
|
|
555
|
+
},
|
|
556
|
+
{
|
|
557
|
+
"name": "legend",
|
|
558
|
+
"type": "boolean",
|
|
559
|
+
"default": null,
|
|
560
|
+
"description": "Show the legend (from two series). Default true.",
|
|
561
|
+
"required": false
|
|
562
|
+
},
|
|
563
|
+
{
|
|
564
|
+
"name": "live",
|
|
565
|
+
"type": "boolean",
|
|
566
|
+
"default": null,
|
|
567
|
+
"description": "Streaming data (a job queue, an auction): no entrance on updates, no announcement of every new point.",
|
|
568
|
+
"required": false
|
|
569
|
+
},
|
|
570
|
+
{
|
|
571
|
+
"name": "loading",
|
|
572
|
+
"type": "boolean",
|
|
573
|
+
"default": null,
|
|
574
|
+
"description": "The data is on its way: a skeleton of the chart, announced once.",
|
|
575
|
+
"required": false
|
|
576
|
+
},
|
|
577
|
+
{
|
|
578
|
+
"name": "locale",
|
|
579
|
+
"type": "Locale",
|
|
580
|
+
"default": null,
|
|
581
|
+
"description": "The locale of every figure and date (`\"fr-FR\"`). Default `\"en-US\"`.",
|
|
582
|
+
"required": false
|
|
583
|
+
},
|
|
584
|
+
{
|
|
585
|
+
"name": "markers",
|
|
586
|
+
"type": "readonly Marker[]",
|
|
587
|
+
"default": null,
|
|
588
|
+
"description": "Vertical markers at a category: a launch, an incident.",
|
|
589
|
+
"required": false
|
|
590
|
+
},
|
|
591
|
+
{
|
|
592
|
+
"name": "objective",
|
|
593
|
+
"type": "{ readonly value: number; readonly label: string; }",
|
|
594
|
+
"default": null,
|
|
595
|
+
"description": "The service objective, in milliseconds: a line, and the count of what goes past it (by p95).",
|
|
596
|
+
"required": false
|
|
597
|
+
},
|
|
598
|
+
{
|
|
599
|
+
"name": "onSelect",
|
|
600
|
+
"type": "((datum: T, index: number) => void)",
|
|
601
|
+
"default": null,
|
|
602
|
+
"description": "Called with the row when a point or a bar is clicked (or Enter is pressed on it).",
|
|
603
|
+
"required": false
|
|
604
|
+
},
|
|
605
|
+
{
|
|
606
|
+
"name": "p50",
|
|
607
|
+
"type": "string | ((datum: T, index: number) => number | null)",
|
|
608
|
+
"default": "\"p50\" as Accessor<T, number | null | undefined>",
|
|
609
|
+
"description": "The median, in milliseconds. Default `\"p50\"`.",
|
|
610
|
+
"required": false
|
|
611
|
+
},
|
|
612
|
+
{
|
|
613
|
+
"name": "p95",
|
|
614
|
+
"type": "string | ((datum: T, index: number) => number | null) | null",
|
|
615
|
+
"default": "\"p95\" as Accessor<T, number | null | undefined>",
|
|
616
|
+
"description": "The 95th percentile, in milliseconds. Default `\"p95\"`; `null` to draw the median alone.",
|
|
617
|
+
"required": false
|
|
618
|
+
},
|
|
619
|
+
{
|
|
620
|
+
"name": "style",
|
|
621
|
+
"type": "CSSProperties",
|
|
622
|
+
"default": null,
|
|
623
|
+
"description": "Inline style on the figure (layout only: colours come from the tokens).",
|
|
624
|
+
"required": false
|
|
625
|
+
},
|
|
626
|
+
{
|
|
627
|
+
"name": "summary",
|
|
628
|
+
"type": "\"hidden\" | \"visible\"",
|
|
629
|
+
"default": null,
|
|
630
|
+
"description": "The written summary: read by screen readers only (`\"hidden\"`, default), or shown under the chart (`\"visible\"`).",
|
|
631
|
+
"required": false
|
|
632
|
+
},
|
|
633
|
+
{
|
|
634
|
+
"name": "summaryText",
|
|
635
|
+
"type": "string",
|
|
636
|
+
"default": null,
|
|
637
|
+
"description": "Your own summary instead of the generated one (still read first by screen readers).",
|
|
638
|
+
"required": false
|
|
639
|
+
},
|
|
640
|
+
{
|
|
641
|
+
"name": "vertical",
|
|
642
|
+
"type": "boolean",
|
|
643
|
+
"default": null,
|
|
644
|
+
"description": "Vertical bars instead of horizontal ones (few, short names).",
|
|
645
|
+
"required": false
|
|
646
|
+
},
|
|
647
|
+
{
|
|
648
|
+
"name": "x",
|
|
649
|
+
"type": "string | ((datum: T, index: number) => unknown)",
|
|
650
|
+
"default": "\"name\" as Accessor<T, unknown>",
|
|
651
|
+
"description": "The field (or function) naming what is measured (a capability, a model). Default `\"name\"`.",
|
|
652
|
+
"required": false
|
|
653
|
+
},
|
|
654
|
+
{
|
|
655
|
+
"name": "xLabel",
|
|
656
|
+
"type": "string",
|
|
657
|
+
"default": null,
|
|
658
|
+
"description": "The header of the categories in the data table (`Month`).",
|
|
659
|
+
"required": false
|
|
660
|
+
},
|
|
661
|
+
{
|
|
662
|
+
"name": "zero",
|
|
663
|
+
"type": "boolean",
|
|
664
|
+
"default": null,
|
|
665
|
+
"description": "Start the value axis at zero. Default: true for bars and areas; for lines, unless the values sit far from zero.",
|
|
666
|
+
"required": false
|
|
667
|
+
}
|
|
668
|
+
]
|
|
669
|
+
}
|
|
670
|
+
]
|
|
671
|
+
}
|
package/registry/line-chart.json
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"category": "charts",
|
|
10
10
|
"platforms": "both",
|
|
11
11
|
"engine": "svg",
|
|
12
|
+
"tier": "core",
|
|
12
13
|
"whenToUse": [
|
|
13
14
|
"A trend over time: a creator's earnings per month, credits used per day, latency per hour.",
|
|
14
15
|
"Two or three series compared over the same period (this year and last, two plans).",
|