@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.
Files changed (193) hide show
  1. package/README.md +17 -5
  2. package/dist/bar.js +5 -4
  3. package/dist/candlestick.js +3 -3
  4. package/dist/chart.js +3 -3
  5. package/dist/{chunk-EK3Z647J.js → chunk-4LBXEAGC.js} +3 -3
  6. package/dist/{chunk-AHQXJSAQ.js → chunk-AA5EWWYV.js} +2 -2
  7. package/dist/{chunk-VKO2OYYM.js → chunk-ARARFMNE.js} +2 -2
  8. package/dist/{chunk-WBH2QU77.js → chunk-BV4DBGN7.js} +2 -2
  9. package/dist/{chunk-BZ5CQFPH.js → chunk-C4MFZLJM.js} +2 -2
  10. package/dist/{chunk-XAJ3KCC4.js → chunk-CSSZLFLO.js} +3 -3
  11. package/dist/{chunk-UNK4MJVG.js → chunk-CVWSMUUB.js} +8 -8
  12. package/dist/chunk-E5DKBSWX.js +2 -0
  13. package/dist/chunk-E5DKBSWX.js.map +1 -0
  14. package/dist/chunk-EEP7PS2L.js +54 -0
  15. package/dist/chunk-EEP7PS2L.js.map +1 -0
  16. package/dist/{chunk-DZB6HEVO.js → chunk-EQLC2QVN.js} +2 -2
  17. package/dist/chunk-FINOPIDN.js +2 -0
  18. package/dist/chunk-FINOPIDN.js.map +1 -0
  19. package/dist/chunk-G2KF2WL4.js +2 -0
  20. package/dist/chunk-G2KF2WL4.js.map +1 -0
  21. package/dist/{chunk-PTSB3H5Q.js → chunk-I3D7KUGN.js} +2 -2
  22. package/dist/chunk-IKQV3NSL.js +76 -0
  23. package/dist/chunk-IKQV3NSL.js.map +1 -0
  24. package/dist/{chunk-DWJPPEMC.js → chunk-JTKR7ZWP.js} +73 -60
  25. package/dist/chunk-JTKR7ZWP.js.map +1 -0
  26. package/dist/chunk-KNDHO67X.js +78 -0
  27. package/dist/chunk-KNDHO67X.js.map +1 -0
  28. package/dist/chunk-L2EKYWVI.js +94 -0
  29. package/dist/chunk-L2EKYWVI.js.map +1 -0
  30. package/dist/{chunk-XC6BQ3RN.js → chunk-MXLITIGU.js} +3 -3
  31. package/dist/{chunk-OER6ETT4.js → chunk-NCIQMRV3.js} +3 -3
  32. package/dist/chunk-OIRHLJBC.js +83 -0
  33. package/dist/chunk-OIRHLJBC.js.map +1 -0
  34. package/dist/{chunk-WIRCIOLH.js → chunk-PBQV3B6O.js} +5 -5
  35. package/dist/chunk-POQIHFAZ.js +2 -0
  36. package/dist/chunk-POQIHFAZ.js.map +1 -0
  37. package/dist/{chunk-I5QUZVU2.js → chunk-PWMMXRMC.js} +2 -2
  38. package/dist/chunk-SLEJDQ3A.js +81 -0
  39. package/dist/chunk-SLEJDQ3A.js.map +1 -0
  40. package/dist/{chunk-7TIFCK5E.js → chunk-VKZZY2QD.js} +3 -3
  41. package/dist/{chunk-VKTZD7UT.js → chunk-W5ILLSPK.js} +3 -3
  42. package/dist/chunk-WBHFVBSK.js +25 -0
  43. package/dist/chunk-WBHFVBSK.js.map +1 -0
  44. package/dist/chunk-WNUFGMS7.js +113 -0
  45. package/dist/chunk-WNUFGMS7.js.map +1 -0
  46. package/dist/{chunk-XR4ZJDOV.js → chunk-WVTIKOII.js} +2 -2
  47. package/dist/{chunk-7CSAGFBW.js → chunk-XDDALY4C.js} +3 -3
  48. package/dist/credits.d.ts +42 -0
  49. package/dist/credits.js +21 -0
  50. package/dist/credits.js.map +1 -0
  51. package/dist/earnings.d.ts +29 -0
  52. package/dist/earnings.js +22 -0
  53. package/dist/earnings.js.map +1 -0
  54. package/dist/funnel.js +3 -3
  55. package/dist/gauge.js +3 -2
  56. package/dist/geo.js +2 -2
  57. package/dist/globe.js +2 -2
  58. package/dist/goal.d.ts +26 -0
  59. package/dist/goal.js +17 -0
  60. package/dist/goal.js.map +1 -0
  61. package/dist/heatmap.js +3 -3
  62. package/dist/index.d.ts +7 -0
  63. package/dist/index.js +80 -33
  64. package/dist/labels-DE_743fQ.d.ts +72 -0
  65. package/dist/latency.d.ts +33 -0
  66. package/dist/latency.js +24 -0
  67. package/dist/latency.js.map +1 -0
  68. package/dist/line.js +5 -4
  69. package/dist/native.d.ts +195 -1
  70. package/dist/native.js +383 -14
  71. package/dist/native.js.map +1 -1
  72. package/dist/pie.js +3 -3
  73. package/dist/radar.js +3 -3
  74. package/dist/sankey.js +3 -3
  75. package/dist/scatter.js +3 -3
  76. package/dist/sparkline.js +4 -3
  77. package/dist/throughput.d.ts +37 -0
  78. package/dist/throughput.js +24 -0
  79. package/dist/throughput.js.map +1 -0
  80. package/dist/ticker.d.ts +38 -0
  81. package/dist/ticker.js +22 -0
  82. package/dist/ticker.js.map +1 -0
  83. package/dist/treemap.js +3 -3
  84. package/package.json +100 -4
  85. package/registry/area-chart.json +1 -0
  86. package/registry/bar-chart.json +1 -0
  87. package/registry/calendar-heatmap.json +1 -0
  88. package/registry/candlestick.json +1 -0
  89. package/registry/chart.json +1 -0
  90. package/registry/charts-provider.json +1 -0
  91. package/registry/credit-usage.json +473 -0
  92. package/registry/earnings-chart.json +703 -0
  93. package/registry/examples/credit-usage/monthly-credits.d.ts +4 -0
  94. package/registry/examples/credit-usage/monthly-credits.js +24 -0
  95. package/registry/examples/credit-usage/monthly-credits.tsx +19 -0
  96. package/registry/examples/credit-usage/native/monthly-credits.d.ts +4 -0
  97. package/registry/examples/credit-usage/native/monthly-credits.dark.png +0 -0
  98. package/registry/examples/credit-usage/native/monthly-credits.js +23 -0
  99. package/registry/examples/credit-usage/native/monthly-credits.light.png +0 -0
  100. package/registry/examples/credit-usage/native/monthly-credits.tsx +18 -0
  101. package/registry/examples/credit-usage/storage-plan.d.ts +4 -0
  102. package/registry/examples/credit-usage/storage-plan.js +21 -0
  103. package/registry/examples/credit-usage/storage-plan.tsx +15 -0
  104. package/registry/examples/earnings-chart/creator-month.d.ts +4 -0
  105. package/registry/examples/earnings-chart/creator-month.js +29 -0
  106. package/registry/examples/earnings-chart/creator-month.tsx +24 -0
  107. package/registry/examples/earnings-chart/gross-and-net.d.ts +4 -0
  108. package/registry/examples/earnings-chart/gross-and-net.js +29 -0
  109. package/registry/examples/earnings-chart/gross-and-net.tsx +24 -0
  110. package/registry/examples/earnings-chart/native/creator-month.d.ts +4 -0
  111. package/registry/examples/earnings-chart/native/creator-month.dark.png +0 -0
  112. package/registry/examples/earnings-chart/native/creator-month.js +29 -0
  113. package/registry/examples/earnings-chart/native/creator-month.light.png +0 -0
  114. package/registry/examples/earnings-chart/native/creator-month.tsx +24 -0
  115. package/registry/examples/goal-progress/challenge-pot.d.ts +4 -0
  116. package/registry/examples/goal-progress/challenge-pot.js +22 -0
  117. package/registry/examples/goal-progress/challenge-pot.tsx +16 -0
  118. package/registry/examples/goal-progress/goal-reached.d.ts +4 -0
  119. package/registry/examples/goal-progress/goal-reached.js +11 -0
  120. package/registry/examples/goal-progress/goal-reached.tsx +6 -0
  121. package/registry/examples/goal-progress/native/challenge-pot.d.ts +4 -0
  122. package/registry/examples/goal-progress/native/challenge-pot.dark.png +0 -0
  123. package/registry/examples/goal-progress/native/challenge-pot.js +11 -0
  124. package/registry/examples/goal-progress/native/challenge-pot.light.png +0 -0
  125. package/registry/examples/goal-progress/native/challenge-pot.tsx +6 -0
  126. package/registry/examples/job-throughput/live-hours.d.ts +4 -0
  127. package/registry/examples/job-throughput/live-hours.js +33 -0
  128. package/registry/examples/job-throughput/live-hours.tsx +28 -0
  129. package/registry/examples/job-throughput/native/week-of-jobs.d.ts +4 -0
  130. package/registry/examples/job-throughput/native/week-of-jobs.dark.png +0 -0
  131. package/registry/examples/job-throughput/native/week-of-jobs.js +20 -0
  132. package/registry/examples/job-throughput/native/week-of-jobs.light.png +0 -0
  133. package/registry/examples/job-throughput/native/week-of-jobs.tsx +16 -0
  134. package/registry/examples/job-throughput/week-of-jobs.d.ts +4 -0
  135. package/registry/examples/job-throughput/week-of-jobs.js +20 -0
  136. package/registry/examples/job-throughput/week-of-jobs.tsx +16 -0
  137. package/registry/examples/latency-chart/by-capability.d.ts +4 -0
  138. package/registry/examples/latency-chart/by-capability.js +26 -0
  139. package/registry/examples/latency-chart/by-capability.tsx +21 -0
  140. package/registry/examples/latency-chart/native/by-capability.d.ts +4 -0
  141. package/registry/examples/latency-chart/native/by-capability.dark.png +0 -0
  142. package/registry/examples/latency-chart/native/by-capability.js +17 -0
  143. package/registry/examples/latency-chart/native/by-capability.light.png +0 -0
  144. package/registry/examples/latency-chart/native/by-capability.tsx +13 -0
  145. package/registry/examples/latency-chart/time-to-result.d.ts +4 -0
  146. package/registry/examples/latency-chart/time-to-result.js +27 -0
  147. package/registry/examples/latency-chart/time-to-result.tsx +22 -0
  148. package/registry/examples/price-ticker/auction-room.d.ts +4 -0
  149. package/registry/examples/price-ticker/auction-room.js +21 -0
  150. package/registry/examples/price-ticker/auction-room.tsx +17 -0
  151. package/registry/examples/price-ticker/native/auction-room.d.ts +4 -0
  152. package/registry/examples/price-ticker/native/auction-room.dark.png +0 -0
  153. package/registry/examples/price-ticker/native/auction-room.js +19 -0
  154. package/registry/examples/price-ticker/native/auction-room.light.png +0 -0
  155. package/registry/examples/price-ticker/native/auction-room.tsx +15 -0
  156. package/registry/examples/price-ticker/no-bid-yet.d.ts +4 -0
  157. package/registry/examples/price-ticker/no-bid-yet.js +11 -0
  158. package/registry/examples/price-ticker/no-bid-yet.tsx +6 -0
  159. package/registry/funnel.json +1 -0
  160. package/registry/gauge.json +1 -0
  161. package/registry/geo-map.json +1 -0
  162. package/registry/globe.json +1 -0
  163. package/registry/goal-progress.json +520 -0
  164. package/registry/heatmap.json +1 -0
  165. package/registry/index.json +163 -1
  166. package/registry/job-throughput.json +654 -0
  167. package/registry/latency-chart.json +671 -0
  168. package/registry/line-chart.json +1 -0
  169. package/registry/pie-chart.json +1 -0
  170. package/registry/price-ticker.json +684 -0
  171. package/registry/radar-chart.json +1 -0
  172. package/registry/sankey.json +1 -0
  173. package/registry/scatter-chart.json +1 -0
  174. package/registry/sparkline.json +1 -0
  175. package/registry/treemap.json +1 -0
  176. package/dist/chunk-DWJPPEMC.js.map +0 -1
  177. /package/dist/{chunk-EK3Z647J.js.map → chunk-4LBXEAGC.js.map} +0 -0
  178. /package/dist/{chunk-AHQXJSAQ.js.map → chunk-AA5EWWYV.js.map} +0 -0
  179. /package/dist/{chunk-VKO2OYYM.js.map → chunk-ARARFMNE.js.map} +0 -0
  180. /package/dist/{chunk-WBH2QU77.js.map → chunk-BV4DBGN7.js.map} +0 -0
  181. /package/dist/{chunk-BZ5CQFPH.js.map → chunk-C4MFZLJM.js.map} +0 -0
  182. /package/dist/{chunk-XAJ3KCC4.js.map → chunk-CSSZLFLO.js.map} +0 -0
  183. /package/dist/{chunk-UNK4MJVG.js.map → chunk-CVWSMUUB.js.map} +0 -0
  184. /package/dist/{chunk-DZB6HEVO.js.map → chunk-EQLC2QVN.js.map} +0 -0
  185. /package/dist/{chunk-PTSB3H5Q.js.map → chunk-I3D7KUGN.js.map} +0 -0
  186. /package/dist/{chunk-XC6BQ3RN.js.map → chunk-MXLITIGU.js.map} +0 -0
  187. /package/dist/{chunk-OER6ETT4.js.map → chunk-NCIQMRV3.js.map} +0 -0
  188. /package/dist/{chunk-WIRCIOLH.js.map → chunk-PBQV3B6O.js.map} +0 -0
  189. /package/dist/{chunk-I5QUZVU2.js.map → chunk-PWMMXRMC.js.map} +0 -0
  190. /package/dist/{chunk-7TIFCK5E.js.map → chunk-VKZZY2QD.js.map} +0 -0
  191. /package/dist/{chunk-VKTZD7UT.js.map → chunk-W5ILLSPK.js.map} +0 -0
  192. /package/dist/{chunk-XR4ZJDOV.js.map → chunk-WVTIKOII.js.map} +0 -0
  193. /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
+ }
@@ -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).",