@krizaka/charts 0.3.1 → 0.5.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 (172) hide show
  1. package/dist/actions-5VG352VZ.js +53 -0
  2. package/dist/actions-5VG352VZ.js.map +1 -0
  3. package/dist/bar.d.ts +3 -3
  4. package/dist/bar.js +7 -6
  5. package/dist/candlestick.d.ts +2 -2
  6. package/dist/candlestick.js +6 -5
  7. package/dist/card.d.ts +52 -0
  8. package/dist/card.js +19 -0
  9. package/dist/card.js.map +1 -0
  10. package/dist/{cartesian-BRhNQ3ib.d.ts → cartesian-CEY_wwe_.d.ts} +12 -2
  11. package/dist/chart.d.ts +2 -2
  12. package/dist/chart.js +5 -4
  13. package/dist/{chunk-BV4DBGN7.js → chunk-7W4T255Q.js} +4 -4
  14. package/dist/{chunk-W5ILLSPK.js → chunk-AGSSNMK5.js} +5 -5
  15. package/dist/{chunk-VKZZY2QD.js → chunk-FE4LUGAE.js} +5 -5
  16. package/dist/{chunk-ARARFMNE.js → chunk-FIQHMJZK.js} +5 -5
  17. package/dist/chunk-FIQHMJZK.js.map +1 -0
  18. package/dist/{chunk-ANUCSRUN.js → chunk-GD7TWEN3.js} +3 -3
  19. package/dist/chunk-GRRFPI27.js +89 -0
  20. package/dist/chunk-GRRFPI27.js.map +1 -0
  21. package/dist/{chunk-SLEJDQ3A.js → chunk-HH65IEUV.js} +3 -3
  22. package/dist/{chunk-OIRHLJBC.js → chunk-IJTI6VJD.js} +3 -3
  23. package/dist/{chunk-WVTIKOII.js → chunk-IURCLBUQ.js} +2 -2
  24. package/dist/{chunk-CVWSMUUB.js → chunk-JST4HJC3.js} +33 -15
  25. package/dist/chunk-JST4HJC3.js.map +1 -0
  26. package/dist/{chunk-IKQV3NSL.js → chunk-KERGFVSN.js} +3 -3
  27. package/dist/{chunk-XDDALY4C.js → chunk-KMQ7RANJ.js} +5 -5
  28. package/dist/{chunk-NCIQMRV3.js → chunk-LLUQEK5J.js} +5 -5
  29. package/dist/{chunk-AA5EWWYV.js → chunk-LZPZWBBY.js} +2 -2
  30. package/dist/{chunk-PBQV3B6O.js → chunk-MK2ZFUWM.js} +31 -16
  31. package/dist/chunk-MK2ZFUWM.js.map +1 -0
  32. package/dist/{chunk-CSSZLFLO.js → chunk-MRGMLDNS.js} +5 -5
  33. package/dist/{chunk-I3D7KUGN.js → chunk-NLTZWJLV.js} +3 -3
  34. package/dist/{chunk-PWMMXRMC.js → chunk-NV52AKHG.js} +3 -3
  35. package/dist/{chunk-MXLITIGU.js → chunk-NWJ5VDN7.js} +5 -5
  36. package/dist/{chunk-3CJHBJXA.js → chunk-OVASCEGF.js} +12 -73
  37. package/dist/chunk-OVASCEGF.js.map +1 -0
  38. package/dist/{chunk-EQLC2QVN.js → chunk-OZOAKP5F.js} +4 -4
  39. package/dist/chunk-OZOAKP5F.js.map +1 -0
  40. package/dist/{chunk-KNDHO67X.js → chunk-P2NK5L3B.js} +3 -3
  41. package/dist/{chunk-JTKR7ZWP.js → chunk-P6RS2L23.js} +140 -36
  42. package/dist/chunk-P6RS2L23.js.map +1 -0
  43. package/dist/{chunk-W5FX4TU3.js → chunk-PGD6SH5I.js} +30 -2
  44. package/dist/chunk-PGD6SH5I.js.map +1 -0
  45. package/dist/{chunk-4LBXEAGC.js → chunk-PWZHIGPO.js} +5 -5
  46. package/dist/{chunk-L2EKYWVI.js → chunk-VEOJNMPF.js} +3 -3
  47. package/dist/chunk-YHQFW2PR.js +71 -0
  48. package/dist/chunk-YHQFW2PR.js.map +1 -0
  49. package/dist/{chunk-C4MFZLJM.js → chunk-Z4T3JFNU.js} +2 -2
  50. package/dist/{chunk-EEP7PS2L.js → chunk-ZF7LVQTR.js} +3 -3
  51. package/dist/{context-BgYUymEO.d.ts → context-DNW7bJYw.d.ts} +19 -0
  52. package/dist/credits.d.ts +1 -1
  53. package/dist/credits.js +7 -6
  54. package/dist/earnings.d.ts +3 -3
  55. package/dist/earnings.js +8 -7
  56. package/dist/{frame-I7_xYGy5.d.ts → frame-B1HDNm7c.d.ts} +9 -5
  57. package/dist/funnel.d.ts +2 -2
  58. package/dist/funnel.js +6 -5
  59. package/dist/gauge.d.ts +2 -2
  60. package/dist/gauge.js +4 -3
  61. package/dist/geo.d.ts +2 -2
  62. package/dist/geo.js +5 -4
  63. package/dist/globe.d.ts +2 -2
  64. package/dist/globe.js +4 -3
  65. package/dist/goal.d.ts +2 -2
  66. package/dist/goal.js +5 -4
  67. package/dist/heatmap.d.ts +2 -2
  68. package/dist/heatmap.js +6 -5
  69. package/dist/index.d.ts +5 -3
  70. package/dist/index.js +45 -37
  71. package/dist/latency.d.ts +3 -3
  72. package/dist/latency.js +8 -7
  73. package/dist/line.d.ts +3 -3
  74. package/dist/line.js +7 -6
  75. package/dist/native.d.ts +19 -0
  76. package/dist/native.js +13 -1
  77. package/dist/native.js.map +1 -1
  78. package/dist/pie.d.ts +2 -2
  79. package/dist/pie.js +6 -5
  80. package/dist/provider.d.ts +2 -2
  81. package/dist/provider.js +4 -2
  82. package/dist/radar.d.ts +2 -2
  83. package/dist/radar.js +6 -5
  84. package/dist/sankey.d.ts +2 -2
  85. package/dist/sankey.js +6 -5
  86. package/dist/scatter.d.ts +2 -2
  87. package/dist/scatter.js +6 -5
  88. package/dist/sparkline.d.ts +2 -2
  89. package/dist/sparkline.js +6 -5
  90. package/dist/table-sheet-CQBIAV5N.js +36 -0
  91. package/dist/table-sheet-CQBIAV5N.js.map +1 -0
  92. package/dist/throughput.d.ts +3 -3
  93. package/dist/throughput.js +8 -7
  94. package/dist/ticker.d.ts +3 -3
  95. package/dist/ticker.js +8 -7
  96. package/dist/treemap.d.ts +2 -2
  97. package/dist/treemap.js +7 -6
  98. package/package.json +292 -50
  99. package/registry/area-chart.json +93 -12
  100. package/registry/bar-chart.json +93 -12
  101. package/registry/calendar-heatmap.json +59 -18
  102. package/registry/candlestick.json +59 -18
  103. package/registry/chart-card.json +248 -0
  104. package/registry/chart.json +53 -12
  105. package/registry/charts-provider.json +13 -2
  106. package/registry/credit-usage.json +11 -0
  107. package/registry/earnings-chart.json +93 -12
  108. package/registry/examples/chart-card/before-after.d.ts +4 -0
  109. package/registry/examples/chart-card/before-after.js +22 -0
  110. package/registry/examples/chart-card/before-after.tsx +22 -0
  111. package/registry/examples/chart-card/jobs-activity.d.ts +4 -0
  112. package/registry/examples/chart-card/jobs-activity.js +20 -0
  113. package/registry/examples/chart-card/jobs-activity.tsx +20 -0
  114. package/registry/examples/chart-card/sparse-and-empty.d.ts +4 -0
  115. package/registry/examples/chart-card/sparse-and-empty.js +16 -0
  116. package/registry/examples/chart-card/sparse-and-empty.tsx +18 -0
  117. package/registry/examples/chart-card/usage-donut.d.ts +4 -0
  118. package/registry/examples/chart-card/usage-donut.js +18 -0
  119. package/registry/examples/chart-card/usage-donut.tsx +18 -0
  120. package/registry/examples/charts-provider/french-orazaka.js +1 -1
  121. package/registry/examples/charts-provider/french-orazaka.tsx +1 -1
  122. package/registry/examples/kpi-stat/dashboard-row.d.ts +4 -0
  123. package/registry/examples/kpi-stat/dashboard-row.js +19 -0
  124. package/registry/examples/kpi-stat/dashboard-row.tsx +17 -0
  125. package/registry/examples/kpi-stat/single.d.ts +4 -0
  126. package/registry/examples/kpi-stat/single.js +11 -0
  127. package/registry/examples/kpi-stat/single.tsx +6 -0
  128. package/registry/funnel.json +59 -18
  129. package/registry/gauge.json +53 -14
  130. package/registry/geo-map.json +59 -18
  131. package/registry/globe.json +54 -12
  132. package/registry/goal-progress.json +47 -8
  133. package/registry/heatmap.json +59 -18
  134. package/registry/index.json +362 -1
  135. package/registry/job-throughput.json +93 -12
  136. package/registry/kpi-stat.json +309 -0
  137. package/registry/latency-chart.json +93 -12
  138. package/registry/line-chart.json +93 -12
  139. package/registry/pie-chart.json +103 -36
  140. package/registry/price-ticker.json +93 -12
  141. package/registry/radar-chart.json +59 -18
  142. package/registry/sankey.json +59 -18
  143. package/registry/scatter-chart.json +59 -18
  144. package/registry/sparkline.json +49 -10
  145. package/registry/treemap.json +53 -12
  146. package/dist/chunk-3CJHBJXA.js.map +0 -1
  147. package/dist/chunk-ARARFMNE.js.map +0 -1
  148. package/dist/chunk-CVWSMUUB.js.map +0 -1
  149. package/dist/chunk-EQLC2QVN.js.map +0 -1
  150. package/dist/chunk-JTKR7ZWP.js.map +0 -1
  151. package/dist/chunk-PBQV3B6O.js.map +0 -1
  152. package/dist/chunk-W5FX4TU3.js.map +0 -1
  153. /package/dist/{chunk-BV4DBGN7.js.map → chunk-7W4T255Q.js.map} +0 -0
  154. /package/dist/{chunk-W5ILLSPK.js.map → chunk-AGSSNMK5.js.map} +0 -0
  155. /package/dist/{chunk-VKZZY2QD.js.map → chunk-FE4LUGAE.js.map} +0 -0
  156. /package/dist/{chunk-ANUCSRUN.js.map → chunk-GD7TWEN3.js.map} +0 -0
  157. /package/dist/{chunk-SLEJDQ3A.js.map → chunk-HH65IEUV.js.map} +0 -0
  158. /package/dist/{chunk-OIRHLJBC.js.map → chunk-IJTI6VJD.js.map} +0 -0
  159. /package/dist/{chunk-WVTIKOII.js.map → chunk-IURCLBUQ.js.map} +0 -0
  160. /package/dist/{chunk-IKQV3NSL.js.map → chunk-KERGFVSN.js.map} +0 -0
  161. /package/dist/{chunk-XDDALY4C.js.map → chunk-KMQ7RANJ.js.map} +0 -0
  162. /package/dist/{chunk-NCIQMRV3.js.map → chunk-LLUQEK5J.js.map} +0 -0
  163. /package/dist/{chunk-AA5EWWYV.js.map → chunk-LZPZWBBY.js.map} +0 -0
  164. /package/dist/{chunk-CSSZLFLO.js.map → chunk-MRGMLDNS.js.map} +0 -0
  165. /package/dist/{chunk-I3D7KUGN.js.map → chunk-NLTZWJLV.js.map} +0 -0
  166. /package/dist/{chunk-PWMMXRMC.js.map → chunk-NV52AKHG.js.map} +0 -0
  167. /package/dist/{chunk-MXLITIGU.js.map → chunk-NWJ5VDN7.js.map} +0 -0
  168. /package/dist/{chunk-KNDHO67X.js.map → chunk-P2NK5L3B.js.map} +0 -0
  169. /package/dist/{chunk-4LBXEAGC.js.map → chunk-PWZHIGPO.js.map} +0 -0
  170. /package/dist/{chunk-L2EKYWVI.js.map → chunk-VEOJNMPF.js.map} +0 -0
  171. /package/dist/{chunk-C4MFZLJM.js.map → chunk-Z4T3JFNU.js.map} +0 -0
  172. /package/dist/{chunk-EEP7PS2L.js.map → chunk-ZF7LVQTR.js.map} +0 -0
@@ -8,6 +8,19 @@
8
8
  "status": "beta",
9
9
  "category": "charts",
10
10
  "platforms": "web",
11
+ "parity": {
12
+ "web": {
13
+ "state": "yes"
14
+ },
15
+ "native": {
16
+ "state": "gap",
17
+ "reason": "Advanced tier: no phone screen needs it yet.",
18
+ "issue": "krizaka/krizaka-ui#280"
19
+ },
20
+ "desktop": {
21
+ "state": "yes"
22
+ }
23
+ },
11
24
  "engine": "echarts",
12
25
  "tier": "advanced",
13
26
  "whenToUse": [
@@ -102,13 +115,6 @@
102
115
  "description": "The field of the price at the start of the period.",
103
116
  "required": true
104
117
  },
105
- {
106
- "name": "title",
107
- "type": "string",
108
- "default": null,
109
- "description": "What the chart shows, in a few words: its accessible name, and its heading unless `hideTitle`.",
110
- "required": true
111
- },
112
118
  {
113
119
  "name": "x",
114
120
  "type": "string | ((datum: T, index: number) => unknown)",
@@ -116,6 +122,13 @@
116
122
  "description": "The field of the period (a date, an hour).",
117
123
  "required": true
118
124
  },
125
+ {
126
+ "name": "actionsMenu",
127
+ "type": "boolean",
128
+ "default": null,
129
+ "description": "The ⋯ actions menu of the kit. `false`: the former “Show data” and export buttons, drawn in line. Default true.",
130
+ "required": false
131
+ },
119
132
  {
120
133
  "name": "brand",
121
134
  "type": "BrandId",
@@ -141,7 +154,7 @@
141
154
  "name": "dataTable",
142
155
  "type": "boolean",
143
156
  "default": null,
144
- "description": "The \"Show data\" button (the table is in the page for screen readers either way). Default true.",
157
+ "description": "“View as table” in the actions menu (the table is in the page for screen readers either way). Default true.",
145
158
  "required": false
146
159
  },
147
160
  {
@@ -169,7 +182,7 @@
169
182
  "name": "exportable",
170
183
  "type": "boolean | readonly ExportFormat[]",
171
184
  "default": null,
172
- "description": "Export buttons: `true` for PNG, SVG and CSV, or the formats you want.",
185
+ "description": "The downloads of the actions menu: all three by default, or the formats you want, or `false` for none.",
173
186
  "required": false
174
187
  },
175
188
  {
@@ -200,6 +213,13 @@
200
213
  "description": "The id of the figure.",
201
214
  "required": false
202
215
  },
216
+ {
217
+ "name": "insight",
218
+ "type": "ReactNode",
219
+ "default": null,
220
+ "description": "One line that says what the chart shows, between the title and the chart: “100 jobs · +100 % vs last week”.",
221
+ "required": false
222
+ },
203
223
  {
204
224
  "name": "labels",
205
225
  "type": "ChartLabelsInput",
@@ -263,6 +283,13 @@
263
283
  "description": "Horizontal lines: a reserve price, a target.",
264
284
  "required": false
265
285
  },
286
+ {
287
+ "name": "title",
288
+ "type": "string",
289
+ "default": null,
290
+ "description": "What the chart shows, in a few words: its accessible name, and its heading unless `hideTitle`. Inside a `ChartCard`, the card's title is the default.",
291
+ "required": false
292
+ },
266
293
  {
267
294
  "name": "volume",
268
295
  "type": "string | ((datum: T, index: number) => number)",
@@ -358,13 +385,6 @@
358
385
  "description": "The field of the price at the start of the period.",
359
386
  "required": true
360
387
  },
361
- {
362
- "name": "title",
363
- "type": "string",
364
- "default": null,
365
- "description": "What the chart shows, in a few words: its accessible name, and its heading unless `hideTitle`.",
366
- "required": true
367
- },
368
388
  {
369
389
  "name": "x",
370
390
  "type": "string | ((datum: T, index: number) => unknown)",
@@ -372,6 +392,13 @@
372
392
  "description": "The field of the period (a date, an hour).",
373
393
  "required": true
374
394
  },
395
+ {
396
+ "name": "actionsMenu",
397
+ "type": "boolean",
398
+ "default": null,
399
+ "description": "The ⋯ actions menu of the kit. `false`: the former “Show data” and export buttons, drawn in line. Default true.",
400
+ "required": false
401
+ },
375
402
  {
376
403
  "name": "brand",
377
404
  "type": "BrandId",
@@ -397,7 +424,7 @@
397
424
  "name": "dataTable",
398
425
  "type": "boolean",
399
426
  "default": null,
400
- "description": "The \"Show data\" button (the table is in the page for screen readers either way). Default true.",
427
+ "description": "“View as table” in the actions menu (the table is in the page for screen readers either way). Default true.",
401
428
  "required": false
402
429
  },
403
430
  {
@@ -425,7 +452,7 @@
425
452
  "name": "exportable",
426
453
  "type": "boolean | readonly ExportFormat[]",
427
454
  "default": null,
428
- "description": "Export buttons: `true` for PNG, SVG and CSV, or the formats you want.",
455
+ "description": "The downloads of the actions menu: all three by default, or the formats you want, or `false` for none.",
429
456
  "required": false
430
457
  },
431
458
  {
@@ -456,6 +483,13 @@
456
483
  "description": "The id of the figure.",
457
484
  "required": false
458
485
  },
486
+ {
487
+ "name": "insight",
488
+ "type": "ReactNode",
489
+ "default": null,
490
+ "description": "One line that says what the chart shows, between the title and the chart: “100 jobs · +100 % vs last week”.",
491
+ "required": false
492
+ },
459
493
  {
460
494
  "name": "labels",
461
495
  "type": "ChartLabelsInput",
@@ -519,6 +553,13 @@
519
553
  "description": "Horizontal lines: a reserve price, a target.",
520
554
  "required": false
521
555
  },
556
+ {
557
+ "name": "title",
558
+ "type": "string",
559
+ "default": null,
560
+ "description": "What the chart shows, in a few words: its accessible name, and its heading unless `hideTitle`. Inside a `ChartCard`, the card's title is the default.",
561
+ "required": false
562
+ },
522
563
  {
523
564
  "name": "volume",
524
565
  "type": "string | ((datum: T, index: number) => number)",
@@ -0,0 +1,248 @@
1
+ {
2
+ "name": "chart-card",
3
+ "package": "@krizaka/charts",
4
+ "type": "chart",
5
+ "title": "Chart card",
6
+ "summary": "The frame of a chart: title, one line of insight, the chart, a footer, and the actions menu (view as table, download, copy) — used everywhere a chart is shown.",
7
+ "description": "The frame of a chart: title, one line of insight, the chart, a footer, and the actions menu (view as table, download, copy) — used everywhere a chart is shown.",
8
+ "status": "beta",
9
+ "category": "charts",
10
+ "platforms": "web",
11
+ "parity": {
12
+ "web": {
13
+ "state": "yes"
14
+ },
15
+ "native": {
16
+ "state": "gap",
17
+ "reason": "A phone dashboard frames its charts in a Card by hand today.",
18
+ "issue": "krizaka/krizaka-ui#275"
19
+ },
20
+ "desktop": {
21
+ "state": "yes"
22
+ }
23
+ },
24
+ "engine": null,
25
+ "tier": "ready-made",
26
+ "whenToUse": [
27
+ "Every chart of a dashboard or a usage page: the same frame, the same hierarchy, the same actions.",
28
+ "A chart that needs a period switch or a filter beside its actions menu."
29
+ ],
30
+ "whenNotToUse": [
31
+ {
32
+ "when": "A figure with its trend.",
33
+ "use": "kpi-stat"
34
+ },
35
+ {
36
+ "when": "A chart that sits inside running text.",
37
+ "use": "sparkline"
38
+ },
39
+ {
40
+ "when": "On React Native: the native charts draw their own frame."
41
+ }
42
+ ],
43
+ "bestPractices": [
44
+ "Write the insight from the data, in one line: the figure first, then the change (`100 jobs · +100 % vs last week`).",
45
+ "Leave the chart without a title: the card hands it its own, which stays the chart's accessible name.",
46
+ "Zoom the time axis on the period that has data with `autoRange` rather than drawing empty days.",
47
+ "Keep the footer for the source and the freshness; never a second insight."
48
+ ],
49
+ "accessibility": {
50
+ "keyboard": [],
51
+ "notes": [
52
+ "The chart keeps its data table in the page, its written summary and its keyboard walk inside the card.",
53
+ "The actions menu is a real menu: arrow keys, Escape, focus returned to the ⋯ button; the table opens in a sheet with a focus trap.",
54
+ "Legend chips are toggle buttons (`aria-pressed`); the last visible series cannot be switched off."
55
+ ]
56
+ },
57
+ "related": [
58
+ "kpi-stat",
59
+ "line-chart",
60
+ "bar-chart",
61
+ "pie-chart",
62
+ "sparkline"
63
+ ],
64
+ "source": "packages/charts/src/meta/chart-card.ts",
65
+ "install": {
66
+ "web": "npm install @krizaka/charts",
67
+ "native": "npx expo install react-native-svg\nnpm install @krizaka/charts"
68
+ },
69
+ "web": {
70
+ "entry": "@krizaka/charts/card",
71
+ "import": "import { ChartCard } from \"@krizaka/charts/card\";",
72
+ "props": [
73
+ {
74
+ "component": "ChartCard",
75
+ "description": "The frame of a chart: title, insight, actions, chart, footer — used everywhere a chart is shown.",
76
+ "props": [
77
+ {
78
+ "name": "children",
79
+ "type": "ReactNode",
80
+ "default": null,
81
+ "description": "The chart (`LineChart`, `BarChart`, `DonutChart`…), without its own title.",
82
+ "required": true
83
+ },
84
+ {
85
+ "name": "title",
86
+ "type": "string",
87
+ "default": null,
88
+ "description": "What the chart shows, in a few words (a heading and the chart's accessible name).",
89
+ "required": true
90
+ },
91
+ {
92
+ "name": "actions",
93
+ "type": "ReactNode",
94
+ "default": null,
95
+ "description": "Controls beside the actions menu: a period switch, a filter.",
96
+ "required": false
97
+ },
98
+ {
99
+ "name": "className",
100
+ "type": "string",
101
+ "default": null,
102
+ "description": "A class on the card (layout: grid placement).",
103
+ "required": false
104
+ },
105
+ {
106
+ "name": "description",
107
+ "type": "ReactNode",
108
+ "default": null,
109
+ "description": "The period, the unit, the source — under the insight.",
110
+ "required": false
111
+ },
112
+ {
113
+ "name": "footer",
114
+ "type": "ReactNode",
115
+ "default": null,
116
+ "description": "A line under the chart: the source, the freshness, a link.",
117
+ "required": false
118
+ },
119
+ {
120
+ "name": "id",
121
+ "type": "string",
122
+ "default": null,
123
+ "description": "The id of the card.",
124
+ "required": false
125
+ },
126
+ {
127
+ "name": "insight",
128
+ "type": "ReactNode",
129
+ "default": null,
130
+ "description": "One line that says what the chart shows: “100 jobs · +100 % vs last week”. Written by the app, from its data.",
131
+ "required": false
132
+ }
133
+ ]
134
+ }
135
+ ],
136
+ "examples": [
137
+ {
138
+ "name": "jobs-activity",
139
+ "title": "Jobs per day",
140
+ "description": "Stacked bars by outcome, an insight, a footer and the actions menu.",
141
+ "path": "examples/chart-card/jobs-activity.tsx",
142
+ "module": "@krizaka/charts/registry/examples/chart-card/jobs-activity",
143
+ "code": "import { BarChart } from \"@krizaka/charts/bar\";\nimport { ChartCard } from \"@krizaka/charts/card\";\n\nconst days = [\"2026-10-03\", \"2026-10-04\", \"2026-10-05\", \"2026-10-06\", \"2026-10-07\", \"2026-10-08\", \"2026-10-09\", \"2026-10-10\"];\nconst completed = [12, 18, 9, 22, 31, 27, 35, 41];\nconst failed = [1, 0, 2, 1, 3, 0, 1, 2];\nconst data = days.map((day, i) => ({ day, completed: completed[i], failed: failed[i] }));\nconst series = [\n { key: \"completed\", label: \"Completed\", color: \"accent\" },\n { key: \"failed\", label: \"Failed\", color: \"danger\" },\n] as const;\n\n// The card hands the chart its title and insight; the ⋯ menu (table, CSV, PNG, SVG, copy) comes with it.\nexport default function JobsActivity() {\n return (\n <ChartCard title=\"Jobs per day\" insight=\"195 jobs · +24 % vs the week before\" footer=\"Read from your own jobs — nothing estimated.\">\n <BarChart data={data} x=\"day\" xFormat=\"day\" xLabel=\"Day\" series={series} stacked format=\"integer\" height={220} autoRange />\n </ChartCard>\n );\n}\n"
144
+ },
145
+ {
146
+ "name": "usage-donut",
147
+ "title": "What you made",
148
+ "description": "A donut whose legend chips carry values and filter the ring.",
149
+ "path": "examples/chart-card/usage-donut.tsx",
150
+ "module": "@krizaka/charts/registry/examples/chart-card/usage-donut",
151
+ "code": "import { ChartCard } from \"@krizaka/charts/card\";\nimport { DonutChart } from \"@krizaka/charts/pie\";\n\nconst kinds = [\n { kind: \"Images\", jobs: 96 },\n { kind: \"Video\", jobs: 41 },\n { kind: \"Audio\", jobs: 33 },\n { kind: \"Text\", jobs: 25 },\n];\n\n// Legend chips carry the value and the share, and switch a part off: click “Video” and the ring re-measures.\nexport default function UsageDonut() {\n return (\n <ChartCard title=\"What you made\" insight=\"195 jobs, most of them images\" description=\"Jobs by kind, last 7 days.\">\n <DonutChart data={kinds} label=\"kind\" value=\"jobs\" labelHeader=\"Kind\" valueHeader=\"Jobs\" centerLabel=\"jobs\" format=\"integer\" height={220} />\n </ChartCard>\n );\n}\n"
152
+ },
153
+ {
154
+ "name": "sparse-and-empty",
155
+ "title": "Sparse and empty",
156
+ "description": "The time axis zoomed on the active period, and a calm empty state.",
157
+ "path": "examples/chart-card/sparse-and-empty.tsx",
158
+ "module": "@krizaka/charts/registry/examples/chart-card/sparse-and-empty",
159
+ "code": "import { BarChart } from \"@krizaka/charts/bar\";\nimport { ChartCard } from \"@krizaka/charts/card\";\n\nconst days = Array.from({ length: 30 }, (_, i) => ({ day: `2026-09-${String(i + 1).padStart(2, \"0\")}`, jobs: i === 27 ? 100 : 0 }));\n\n// 29 empty days and one bar: `autoRange` zooms on the active period and says how sparse it is. No data: a calm state.\nexport default function SparseAndEmpty() {\n return (\n <div style={{ display: \"grid\", gap: 16, gridTemplateColumns: \"repeat(auto-fit, minmax(280px, 1fr))\" }}>\n <ChartCard title=\"Jobs per day\" insight=\"100 jobs on Sep 28\">\n <BarChart data={days} x=\"day\" xFormat=\"day\" y=\"jobs\" yLabel=\"Jobs\" format=\"integer\" height={180} autoRange />\n </ChartCard>\n <ChartCard title=\"Failed jobs\" insight=\"Nothing failed yet\">\n <BarChart data={[]} x=\"day\" y=\"jobs\" yLabel=\"Jobs\" height={180} />\n </ChartCard>\n </div>\n );\n}\n"
160
+ },
161
+ {
162
+ "name": "before-after",
163
+ "title": "Before and after",
164
+ "description": "The same chart bare, then in a ChartCard.",
165
+ "path": "examples/chart-card/before-after.tsx",
166
+ "module": "@krizaka/charts/registry/examples/chart-card/before-after",
167
+ "code": "import { BarChart } from \"@krizaka/charts/bar\";\nimport { ChartCard } from \"@krizaka/charts/card\";\n\nconst data = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"].map((day, i) => ({ day, jobs: [12, 18, 9, 22, 31, 27, 35][i] }));\n\n// Before: a bare chart, “Show data” and the exports as text buttons. After: the same chart in a ChartCard.\nexport default function BeforeAfter() {\n return (\n <div style={{ display: \"grid\", gap: 16, gridTemplateColumns: \"repeat(auto-fit, minmax(280px, 1fr))\" }}>\n <div>\n <p style={{ margin: \"0 0 8px\", fontSize: 12, color: \"var(--kz-text-secondary)\" }}>Before</p>\n <BarChart title=\"Jobs per day\" data={data} x=\"day\" y=\"jobs\" yLabel=\"Jobs\" height={180} actionsMenu={false} exportable />\n </div>\n <div>\n <p style={{ margin: \"0 0 8px\", fontSize: 12, color: \"var(--kz-text-secondary)\" }}>After</p>\n <ChartCard title=\"Jobs per day\" insight=\"154 jobs · busiest on Sunday\" footer=\"Source: your own jobs.\">\n <BarChart data={data} x=\"day\" y=\"jobs\" yLabel=\"Jobs\" height={180} />\n </ChartCard>\n </div>\n </div>\n );\n}\n"
168
+ }
169
+ ]
170
+ },
171
+ "native": null,
172
+ "files": [],
173
+ "dependencies": [
174
+ "@krizaka/intl@workspace:^",
175
+ "d3-geo@^3.1.1",
176
+ "echarts@^6.1.0",
177
+ "topojson-client@^3.1.0"
178
+ ],
179
+ "registryDependencies": [],
180
+ "demo": {
181
+ "path": "examples/chart-card/jobs-activity.tsx",
182
+ "content": "import { BarChart } from \"@krizaka/charts/bar\";\nimport { ChartCard } from \"@krizaka/charts/card\";\n\nconst days = [\"2026-10-03\", \"2026-10-04\", \"2026-10-05\", \"2026-10-06\", \"2026-10-07\", \"2026-10-08\", \"2026-10-09\", \"2026-10-10\"];\nconst completed = [12, 18, 9, 22, 31, 27, 35, 41];\nconst failed = [1, 0, 2, 1, 3, 0, 1, 2];\nconst data = days.map((day, i) => ({ day, completed: completed[i], failed: failed[i] }));\nconst series = [\n { key: \"completed\", label: \"Completed\", color: \"accent\" },\n { key: \"failed\", label: \"Failed\", color: \"danger\" },\n] as const;\n\n// The card hands the chart its title and insight; the ⋯ menu (table, CSV, PNG, SVG, copy) comes with it.\nexport default function JobsActivity() {\n return (\n <ChartCard title=\"Jobs per day\" insight=\"195 jobs · +24 % vs the week before\" footer=\"Read from your own jobs — nothing estimated.\">\n <BarChart data={data} x=\"day\" xFormat=\"day\" xLabel=\"Day\" series={series} stacked format=\"integer\" height={220} autoRange />\n </ChartCard>\n );\n}\n"
183
+ },
184
+ "props": [
185
+ {
186
+ "component": "ChartCard",
187
+ "description": "The frame of a chart: title, insight, actions, chart, footer — used everywhere a chart is shown.",
188
+ "props": [
189
+ {
190
+ "name": "children",
191
+ "type": "ReactNode",
192
+ "default": null,
193
+ "description": "The chart (`LineChart`, `BarChart`, `DonutChart`…), without its own title.",
194
+ "required": true
195
+ },
196
+ {
197
+ "name": "title",
198
+ "type": "string",
199
+ "default": null,
200
+ "description": "What the chart shows, in a few words (a heading and the chart's accessible name).",
201
+ "required": true
202
+ },
203
+ {
204
+ "name": "actions",
205
+ "type": "ReactNode",
206
+ "default": null,
207
+ "description": "Controls beside the actions menu: a period switch, a filter.",
208
+ "required": false
209
+ },
210
+ {
211
+ "name": "className",
212
+ "type": "string",
213
+ "default": null,
214
+ "description": "A class on the card (layout: grid placement).",
215
+ "required": false
216
+ },
217
+ {
218
+ "name": "description",
219
+ "type": "ReactNode",
220
+ "default": null,
221
+ "description": "The period, the unit, the source — under the insight.",
222
+ "required": false
223
+ },
224
+ {
225
+ "name": "footer",
226
+ "type": "ReactNode",
227
+ "default": null,
228
+ "description": "A line under the chart: the source, the freshness, a link.",
229
+ "required": false
230
+ },
231
+ {
232
+ "name": "id",
233
+ "type": "string",
234
+ "default": null,
235
+ "description": "The id of the card.",
236
+ "required": false
237
+ },
238
+ {
239
+ "name": "insight",
240
+ "type": "ReactNode",
241
+ "default": null,
242
+ "description": "One line that says what the chart shows: “100 jobs · +100 % vs last week”. Written by the app, from its data.",
243
+ "required": false
244
+ }
245
+ ]
246
+ }
247
+ ]
248
+ }
@@ -8,6 +8,19 @@
8
8
  "status": "beta",
9
9
  "category": "charts",
10
10
  "platforms": "web",
11
+ "parity": {
12
+ "web": {
13
+ "state": "yes"
14
+ },
15
+ "native": {
16
+ "state": "n/a",
17
+ "reason": "The ECharts escape hatch needs the DOM; a phone draws the SVG charts of the native entry.",
18
+ "use": "line-chart"
19
+ },
20
+ "desktop": {
21
+ "state": "yes"
22
+ }
23
+ },
11
24
  "engine": "echarts",
12
25
  "tier": "advanced",
13
26
  "whenToUse": [
@@ -89,11 +102,11 @@
89
102
  "required": true
90
103
  },
91
104
  {
92
- "name": "title",
93
- "type": "string",
105
+ "name": "actionsMenu",
106
+ "type": "boolean",
94
107
  "default": null,
95
- "description": "What the chart shows, in a few words: its accessible name, and its heading unless `hideTitle`.",
96
- "required": true
108
+ "description": "The ⋯ actions menu of the kit. `false`: the former “Show data” and export buttons, drawn in line. Default true.",
109
+ "required": false
97
110
  },
98
111
  {
99
112
  "name": "brand",
@@ -113,7 +126,7 @@
113
126
  "name": "dataTable",
114
127
  "type": "boolean",
115
128
  "default": null,
116
- "description": "The \"Show data\" button (the table is in the page for screen readers either way). Default true.",
129
+ "description": "“View as table” in the actions menu (the table is in the page for screen readers either way). Default true.",
117
130
  "required": false
118
131
  },
119
132
  {
@@ -141,7 +154,7 @@
141
154
  "name": "exportable",
142
155
  "type": "boolean | readonly ExportFormat[]",
143
156
  "default": null,
144
- "description": "Export buttons: `true` for PNG, SVG and CSV, or the formats you want.",
157
+ "description": "The downloads of the actions menu: all three by default, or the formats you want, or `false` for none.",
145
158
  "required": false
146
159
  },
147
160
  {
@@ -165,6 +178,13 @@
165
178
  "description": "The id of the figure.",
166
179
  "required": false
167
180
  },
181
+ {
182
+ "name": "insight",
183
+ "type": "ReactNode",
184
+ "default": null,
185
+ "description": "One line that says what the chart shows, between the title and the chart: “100 jobs · +100 % vs last week”.",
186
+ "required": false
187
+ },
168
188
  {
169
189
  "name": "items",
170
190
  "type": "readonly WalkItem[]",
@@ -234,6 +254,13 @@
234
254
  "default": null,
235
255
  "description": "The written summary: read by screen readers only (`\"hidden\"`, default), or shown under the chart (`\"visible\"`).",
236
256
  "required": false
257
+ },
258
+ {
259
+ "name": "title",
260
+ "type": "string",
261
+ "default": null,
262
+ "description": "What the chart shows, in a few words: its accessible name, and its heading unless `hideTitle`. Inside a `ChartCard`, the card's title is the default.",
263
+ "required": false
237
264
  }
238
265
  ]
239
266
  }
@@ -289,11 +316,11 @@
289
316
  "required": true
290
317
  },
291
318
  {
292
- "name": "title",
293
- "type": "string",
319
+ "name": "actionsMenu",
320
+ "type": "boolean",
294
321
  "default": null,
295
- "description": "What the chart shows, in a few words: its accessible name, and its heading unless `hideTitle`.",
296
- "required": true
322
+ "description": "The ⋯ actions menu of the kit. `false`: the former “Show data” and export buttons, drawn in line. Default true.",
323
+ "required": false
297
324
  },
298
325
  {
299
326
  "name": "brand",
@@ -313,7 +340,7 @@
313
340
  "name": "dataTable",
314
341
  "type": "boolean",
315
342
  "default": null,
316
- "description": "The \"Show data\" button (the table is in the page for screen readers either way). Default true.",
343
+ "description": "“View as table” in the actions menu (the table is in the page for screen readers either way). Default true.",
317
344
  "required": false
318
345
  },
319
346
  {
@@ -341,7 +368,7 @@
341
368
  "name": "exportable",
342
369
  "type": "boolean | readonly ExportFormat[]",
343
370
  "default": null,
344
- "description": "Export buttons: `true` for PNG, SVG and CSV, or the formats you want.",
371
+ "description": "The downloads of the actions menu: all three by default, or the formats you want, or `false` for none.",
345
372
  "required": false
346
373
  },
347
374
  {
@@ -365,6 +392,13 @@
365
392
  "description": "The id of the figure.",
366
393
  "required": false
367
394
  },
395
+ {
396
+ "name": "insight",
397
+ "type": "ReactNode",
398
+ "default": null,
399
+ "description": "One line that says what the chart shows, between the title and the chart: “100 jobs · +100 % vs last week”.",
400
+ "required": false
401
+ },
368
402
  {
369
403
  "name": "items",
370
404
  "type": "readonly WalkItem[]",
@@ -434,6 +468,13 @@
434
468
  "default": null,
435
469
  "description": "The written summary: read by screen readers only (`\"hidden\"`, default), or shown under the chart (`\"visible\"`).",
436
470
  "required": false
471
+ },
472
+ {
473
+ "name": "title",
474
+ "type": "string",
475
+ "default": null,
476
+ "description": "What the chart shows, in a few words: its accessible name, and its heading unless `hideTitle`. Inside a `ChartCard`, the card's title is the default.",
477
+ "required": false
437
478
  }
438
479
  ]
439
480
  }
@@ -8,6 +8,17 @@
8
8
  "status": "beta",
9
9
  "category": "charts",
10
10
  "platforms": "both",
11
+ "parity": {
12
+ "web": {
13
+ "state": "yes"
14
+ },
15
+ "native": {
16
+ "state": "yes"
17
+ },
18
+ "desktop": {
19
+ "state": "yes"
20
+ }
21
+ },
11
22
  "engine": null,
12
23
  "tier": "core",
13
24
  "whenToUse": [
@@ -79,7 +90,7 @@
79
90
  "description": "Figures and dates in French, the Orazaka palette, the words translated.",
80
91
  "path": "examples/charts-provider/french-orazaka.tsx",
81
92
  "module": "@krizaka/charts/registry/examples/charts-provider/french-orazaka",
82
- "code": "import { BarChart } from \"@krizaka/charts/bar\";\nimport { ChartsProvider } from \"@krizaka/charts/provider\";\n\nconst months = [\n { month: \"2026-06\", credits: 412_000 },\n { month: \"2026-07\", credits: 468_500 },\n { month: \"2026-08\", credits: 391_200 },\n { month: \"2026-09\", credits: 523_900 },\n];\n\n// Once near the app's root: the locale, the brand's palette, the words from the app's catalogue.\nexport default function FrenchOrazaka() {\n return (\n <ChartsProvider\n locale=\"fr-FR\"\n brand=\"orazaka\"\n labels={{ showData: \"Voir les données\", hideData: \"Masquer les données\", empty: \"Pas encore de données.\", kinds: { bar: \"Histogramme\" } }}\n >\n <BarChart title=\"Crédits consommés par mois\" data={months} x=\"month\" xLabel=\"Mois\" y=\"credits\" yLabel=\"Crédits\" format=\"compact\" />\n </ChartsProvider>\n );\n}\n"
93
+ "code": "import { BarChart } from \"@krizaka/charts/bar\";\nimport { ChartsProvider } from \"@krizaka/charts/provider\";\n\nconst months = [\n { month: \"2026-06\", credits: 412_000 },\n { month: \"2026-07\", credits: 468_500 },\n { month: \"2026-08\", credits: 391_200 },\n { month: \"2026-09\", credits: 523_900 },\n];\n\n// Once near the app's root: the locale, the brand's palette, the words from the app's catalogue.\nexport default function FrenchOrazaka() {\n return (\n <ChartsProvider\n locale=\"fr-FR\"\n brand=\"orazaka\"\n labels={{ actions: \"Actions du graphique\", viewTable: \"Voir en tableau\", downloadCsv: \"Télécharger le CSV\", copyData: \"Copier les données\", empty: \"Pas encore de données.\", kinds: { bar: \"Histogramme\" } }}\n >\n <BarChart title=\"Crédits consommés par mois\" data={months} x=\"month\" xLabel=\"Mois\" y=\"credits\" yLabel=\"Crédits\" format=\"compact\" />\n </ChartsProvider>\n );\n}\n"
83
94
  }
84
95
  ]
85
96
  },
@@ -157,7 +168,7 @@
157
168
  "registryDependencies": [],
158
169
  "demo": {
159
170
  "path": "examples/charts-provider/french-orazaka.tsx",
160
- "content": "import { BarChart } from \"@krizaka/charts/bar\";\nimport { ChartsProvider } from \"@krizaka/charts/provider\";\n\nconst months = [\n { month: \"2026-06\", credits: 412_000 },\n { month: \"2026-07\", credits: 468_500 },\n { month: \"2026-08\", credits: 391_200 },\n { month: \"2026-09\", credits: 523_900 },\n];\n\n// Once near the app's root: the locale, the brand's palette, the words from the app's catalogue.\nexport default function FrenchOrazaka() {\n return (\n <ChartsProvider\n locale=\"fr-FR\"\n brand=\"orazaka\"\n labels={{ showData: \"Voir les données\", hideData: \"Masquer les données\", empty: \"Pas encore de données.\", kinds: { bar: \"Histogramme\" } }}\n >\n <BarChart title=\"Crédits consommés par mois\" data={months} x=\"month\" xLabel=\"Mois\" y=\"credits\" yLabel=\"Crédits\" format=\"compact\" />\n </ChartsProvider>\n );\n}\n"
171
+ "content": "import { BarChart } from \"@krizaka/charts/bar\";\nimport { ChartsProvider } from \"@krizaka/charts/provider\";\n\nconst months = [\n { month: \"2026-06\", credits: 412_000 },\n { month: \"2026-07\", credits: 468_500 },\n { month: \"2026-08\", credits: 391_200 },\n { month: \"2026-09\", credits: 523_900 },\n];\n\n// Once near the app's root: the locale, the brand's palette, the words from the app's catalogue.\nexport default function FrenchOrazaka() {\n return (\n <ChartsProvider\n locale=\"fr-FR\"\n brand=\"orazaka\"\n labels={{ actions: \"Actions du graphique\", viewTable: \"Voir en tableau\", downloadCsv: \"Télécharger le CSV\", copyData: \"Copier les données\", empty: \"Pas encore de données.\", kinds: { bar: \"Histogramme\" } }}\n >\n <BarChart title=\"Crédits consommés par mois\" data={months} x=\"month\" xLabel=\"Mois\" y=\"credits\" yLabel=\"Crédits\" format=\"compact\" />\n </ChartsProvider>\n );\n}\n"
161
172
  },
162
173
  "props": [
163
174
  {
@@ -8,6 +8,17 @@
8
8
  "status": "beta",
9
9
  "category": "charts",
10
10
  "platforms": "both",
11
+ "parity": {
12
+ "web": {
13
+ "state": "yes"
14
+ },
15
+ "native": {
16
+ "state": "yes"
17
+ },
18
+ "desktop": {
19
+ "state": "yes"
20
+ }
21
+ },
11
22
  "engine": "svg",
12
23
  "tier": "ready-made",
13
24
  "whenToUse": [