@krizaka/charts 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +47 -2
  3. package/dist/bar.d.ts +17 -0
  4. package/dist/bar.js +16 -0
  5. package/dist/bar.js.map +1 -0
  6. package/dist/candlestick-IG626XL4.js +13 -0
  7. package/dist/candlestick-IG626XL4.js.map +1 -0
  8. package/dist/candlestick.d.ts +42 -0
  9. package/dist/candlestick.js +13 -0
  10. package/dist/candlestick.js.map +1 -0
  11. package/dist/canvas-4MSYDVFO.js +14 -0
  12. package/dist/canvas-4MSYDVFO.js.map +1 -0
  13. package/dist/cartesian-BRhNQ3ib.d.ts +34 -0
  14. package/dist/chart.d.ts +58 -0
  15. package/dist/chart.js +11 -0
  16. package/dist/chart.js.map +1 -0
  17. package/dist/chunk-3CJHBJXA.js +186 -0
  18. package/dist/chunk-3CJHBJXA.js.map +1 -0
  19. package/dist/chunk-6FINSUOS.js +49 -0
  20. package/dist/chunk-6FINSUOS.js.map +1 -0
  21. package/dist/chunk-7CSAGFBW.js +166 -0
  22. package/dist/chunk-7CSAGFBW.js.map +1 -0
  23. package/dist/chunk-7TIFCK5E.js +103 -0
  24. package/dist/chunk-7TIFCK5E.js.map +1 -0
  25. package/dist/chunk-AHQXJSAQ.js +38 -0
  26. package/dist/chunk-AHQXJSAQ.js.map +1 -0
  27. package/dist/chunk-ANUCSRUN.js +43 -0
  28. package/dist/chunk-ANUCSRUN.js.map +1 -0
  29. package/dist/chunk-BISL7DYW.js +66 -0
  30. package/dist/chunk-BISL7DYW.js.map +1 -0
  31. package/dist/chunk-BZ5CQFPH.js +19 -0
  32. package/dist/chunk-BZ5CQFPH.js.map +1 -0
  33. package/dist/chunk-DWJPPEMC.js +455 -0
  34. package/dist/chunk-DWJPPEMC.js.map +1 -0
  35. package/dist/chunk-DZB6HEVO.js +73 -0
  36. package/dist/chunk-DZB6HEVO.js.map +1 -0
  37. package/dist/chunk-EK3Z647J.js +133 -0
  38. package/dist/chunk-EK3Z647J.js.map +1 -0
  39. package/dist/chunk-I5QUZVU2.js +234 -0
  40. package/dist/chunk-I5QUZVU2.js.map +1 -0
  41. package/dist/chunk-OB5EFDDH.js +118 -0
  42. package/dist/chunk-OB5EFDDH.js.map +1 -0
  43. package/dist/chunk-OER6ETT4.js +155 -0
  44. package/dist/chunk-OER6ETT4.js.map +1 -0
  45. package/dist/chunk-PTSB3H5Q.js +205 -0
  46. package/dist/chunk-PTSB3H5Q.js.map +1 -0
  47. package/dist/chunk-TPJDOB7R.js +15 -0
  48. package/dist/chunk-TPJDOB7R.js.map +1 -0
  49. package/dist/chunk-UNK4MJVG.js +378 -0
  50. package/dist/chunk-UNK4MJVG.js.map +1 -0
  51. package/dist/chunk-VKO2OYYM.js +88 -0
  52. package/dist/chunk-VKO2OYYM.js.map +1 -0
  53. package/dist/chunk-VKTZD7UT.js +107 -0
  54. package/dist/chunk-VKTZD7UT.js.map +1 -0
  55. package/dist/chunk-W5FX4TU3.js +102 -0
  56. package/dist/chunk-W5FX4TU3.js.map +1 -0
  57. package/dist/chunk-WBH2QU77.js +178 -0
  58. package/dist/chunk-WBH2QU77.js.map +1 -0
  59. package/dist/chunk-WIRCIOLH.js +145 -0
  60. package/dist/chunk-WIRCIOLH.js.map +1 -0
  61. package/dist/chunk-XAJ3KCC4.js +116 -0
  62. package/dist/chunk-XAJ3KCC4.js.map +1 -0
  63. package/dist/chunk-XC6BQ3RN.js +92 -0
  64. package/dist/chunk-XC6BQ3RN.js.map +1 -0
  65. package/dist/chunk-XLLYNNC6.js +89 -0
  66. package/dist/chunk-XLLYNNC6.js.map +1 -0
  67. package/dist/chunk-XR4ZJDOV.js +15 -0
  68. package/dist/chunk-XR4ZJDOV.js.map +1 -0
  69. package/dist/context-BgYUymEO.d.ts +163 -0
  70. package/dist/frame-I7_xYGy5.d.ts +45 -0
  71. package/dist/full-S2MBPEEP.js +11 -0
  72. package/dist/full-S2MBPEEP.js.map +1 -0
  73. package/dist/funnel-QU5ZPC52.js +13 -0
  74. package/dist/funnel-QU5ZPC52.js.map +1 -0
  75. package/dist/funnel.d.ts +26 -0
  76. package/dist/funnel.js +13 -0
  77. package/dist/funnel.js.map +1 -0
  78. package/dist/gauge.d.ts +38 -0
  79. package/dist/gauge.js +12 -0
  80. package/dist/gauge.js.map +1 -0
  81. package/dist/geo.d.ts +37 -0
  82. package/dist/geo.js +13 -0
  83. package/dist/geo.js.map +1 -0
  84. package/dist/globe.d.ts +36 -0
  85. package/dist/globe.js +12 -0
  86. package/dist/globe.js.map +1 -0
  87. package/dist/heatmap-JWQOKUGM.js +13 -0
  88. package/dist/heatmap-JWQOKUGM.js.map +1 -0
  89. package/dist/heatmap.d.ts +47 -0
  90. package/dist/heatmap.js +15 -0
  91. package/dist/heatmap.js.map +1 -0
  92. package/dist/host-_F8RgiIz.d.ts +15 -0
  93. package/dist/index.d.ts +22 -0
  94. package/dist/index.js +101 -0
  95. package/dist/index.js.map +1 -0
  96. package/dist/line.d.ts +25 -0
  97. package/dist/line.js +18 -0
  98. package/dist/line.js.map +1 -0
  99. package/dist/native.d.ts +300 -0
  100. package/dist/native.js +875 -0
  101. package/dist/native.js.map +1 -0
  102. package/dist/pie.d.ts +37 -0
  103. package/dist/pie.js +16 -0
  104. package/dist/pie.js.map +1 -0
  105. package/dist/provider.d.ts +73 -0
  106. package/dist/provider.js +24 -0
  107. package/dist/provider.js.map +1 -0
  108. package/dist/radar-75GRJ2IK.js +13 -0
  109. package/dist/radar-75GRJ2IK.js.map +1 -0
  110. package/dist/radar.d.ts +22 -0
  111. package/dist/radar.js +13 -0
  112. package/dist/radar.js.map +1 -0
  113. package/dist/sankey-XQTX2EG6.js +13 -0
  114. package/dist/sankey-XQTX2EG6.js.map +1 -0
  115. package/dist/sankey.d.ts +28 -0
  116. package/dist/sankey.js +13 -0
  117. package/dist/sankey.js.map +1 -0
  118. package/dist/scatter-XSNG4OKD.js +13 -0
  119. package/dist/scatter-XSNG4OKD.js.map +1 -0
  120. package/dist/scatter.d.ts +41 -0
  121. package/dist/scatter.js +15 -0
  122. package/dist/scatter.js.map +1 -0
  123. package/dist/sparkline.d.ts +26 -0
  124. package/dist/sparkline.js +15 -0
  125. package/dist/sparkline.js.map +1 -0
  126. package/dist/svg-BJUHYX3B.js +14 -0
  127. package/dist/svg-BJUHYX3B.js.map +1 -0
  128. package/dist/treemap-OMGGGB5U.js +13 -0
  129. package/dist/treemap-OMGGGB5U.js.map +1 -0
  130. package/dist/treemap.d.ts +24 -0
  131. package/dist/treemap.js +14 -0
  132. package/dist/treemap.js.map +1 -0
  133. package/dist/world-110m-DVFWXS42.js +18 -0
  134. package/dist/world-110m-DVFWXS42.js.map +1 -0
  135. package/package.json +518 -3
  136. package/registry/area-chart.json +784 -0
  137. package/registry/bar-chart.json +783 -0
  138. package/registry/calendar-heatmap.json +459 -0
  139. package/registry/candlestick.json +552 -0
  140. package/registry/chart.json +440 -0
  141. package/registry/charts-provider.json +190 -0
  142. package/registry/examples/area-chart/credits-usage.d.ts +4 -0
  143. package/registry/examples/area-chart/credits-usage.js +38 -0
  144. package/registry/examples/area-chart/credits-usage.tsx +32 -0
  145. package/registry/examples/area-chart/native/credits-usage.d.ts +4 -0
  146. package/registry/examples/area-chart/native/credits-usage.dark.png +0 -0
  147. package/registry/examples/area-chart/native/credits-usage.js +33 -0
  148. package/registry/examples/area-chart/native/credits-usage.light.png +0 -0
  149. package/registry/examples/area-chart/native/credits-usage.tsx +27 -0
  150. package/registry/examples/area-chart/storage.d.ts +4 -0
  151. package/registry/examples/area-chart/storage.js +27 -0
  152. package/registry/examples/area-chart/storage.tsx +21 -0
  153. package/registry/examples/bar-chart/jobs-by-status.d.ts +4 -0
  154. package/registry/examples/bar-chart/jobs-by-status.js +37 -0
  155. package/registry/examples/bar-chart/jobs-by-status.tsx +31 -0
  156. package/registry/examples/bar-chart/native/jobs-by-status.d.ts +4 -0
  157. package/registry/examples/bar-chart/native/jobs-by-status.dark.png +0 -0
  158. package/registry/examples/bar-chart/native/jobs-by-status.js +32 -0
  159. package/registry/examples/bar-chart/native/jobs-by-status.light.png +0 -0
  160. package/registry/examples/bar-chart/native/jobs-by-status.tsx +26 -0
  161. package/registry/examples/bar-chart/plans-by-quarter.d.ts +4 -0
  162. package/registry/examples/bar-chart/plans-by-quarter.js +31 -0
  163. package/registry/examples/bar-chart/plans-by-quarter.tsx +26 -0
  164. package/registry/examples/bar-chart/top-supporters.d.ts +4 -0
  165. package/registry/examples/bar-chart/top-supporters.js +32 -0
  166. package/registry/examples/bar-chart/top-supporters.tsx +27 -0
  167. package/registry/examples/calendar-heatmap/publishing.d.ts +4 -0
  168. package/registry/examples/calendar-heatmap/publishing.js +28 -0
  169. package/registry/examples/calendar-heatmap/publishing.tsx +23 -0
  170. package/registry/examples/candlestick/auction-bids.d.ts +4 -0
  171. package/registry/examples/candlestick/auction-bids.js +37 -0
  172. package/registry/examples/candlestick/auction-bids.tsx +32 -0
  173. package/registry/examples/chart/polar-uploads.d.ts +4 -0
  174. package/registry/examples/chart/polar-uploads.js +34 -0
  175. package/registry/examples/chart/polar-uploads.tsx +30 -0
  176. package/registry/examples/charts-provider/french-orazaka.d.ts +4 -0
  177. package/registry/examples/charts-provider/french-orazaka.js +26 -0
  178. package/registry/examples/charts-provider/french-orazaka.tsx +22 -0
  179. package/registry/examples/charts-provider/native/french-orazaka.d.ts +4 -0
  180. package/registry/examples/charts-provider/native/french-orazaka.dark.png +0 -0
  181. package/registry/examples/charts-provider/native/french-orazaka.js +17 -0
  182. package/registry/examples/charts-provider/native/french-orazaka.light.png +0 -0
  183. package/registry/examples/charts-provider/native/french-orazaka.tsx +17 -0
  184. package/registry/examples/funnel/signup.d.ts +4 -0
  185. package/registry/examples/funnel/signup.js +30 -0
  186. package/registry/examples/funnel/signup.tsx +24 -0
  187. package/registry/examples/gauge/challenge-goal.d.ts +4 -0
  188. package/registry/examples/gauge/challenge-goal.js +24 -0
  189. package/registry/examples/gauge/challenge-goal.tsx +18 -0
  190. package/registry/examples/gauge/credits-quota.d.ts +4 -0
  191. package/registry/examples/gauge/credits-quota.js +26 -0
  192. package/registry/examples/gauge/credits-quota.tsx +19 -0
  193. package/registry/examples/gauge/native/credits-quota.d.ts +4 -0
  194. package/registry/examples/gauge/native/credits-quota.dark.png +0 -0
  195. package/registry/examples/gauge/native/credits-quota.js +25 -0
  196. package/registry/examples/gauge/native/credits-quota.light.png +0 -0
  197. package/registry/examples/gauge/native/credits-quota.tsx +18 -0
  198. package/registry/examples/geo-map/viewers.d.ts +4 -0
  199. package/registry/examples/geo-map/viewers.js +43 -0
  200. package/registry/examples/geo-map/viewers.tsx +29 -0
  201. package/registry/examples/globe/deployment-regions.d.ts +4 -0
  202. package/registry/examples/globe/deployment-regions.js +36 -0
  203. package/registry/examples/globe/deployment-regions.tsx +30 -0
  204. package/registry/examples/heatmap/upload-activity.d.ts +4 -0
  205. package/registry/examples/heatmap/upload-activity.js +30 -0
  206. package/registry/examples/heatmap/upload-activity.tsx +25 -0
  207. package/registry/examples/line-chart/creator-earnings.d.ts +4 -0
  208. package/registry/examples/line-chart/creator-earnings.js +35 -0
  209. package/registry/examples/line-chart/creator-earnings.tsx +30 -0
  210. package/registry/examples/line-chart/forecast.d.ts +4 -0
  211. package/registry/examples/line-chart/forecast.js +36 -0
  212. package/registry/examples/line-chart/forecast.tsx +30 -0
  213. package/registry/examples/line-chart/live-jobs.d.ts +4 -0
  214. package/registry/examples/line-chart/live-jobs.js +21 -0
  215. package/registry/examples/line-chart/live-jobs.tsx +23 -0
  216. package/registry/examples/line-chart/native/creator-earnings.d.ts +4 -0
  217. package/registry/examples/line-chart/native/creator-earnings.dark.png +0 -0
  218. package/registry/examples/line-chart/native/creator-earnings.js +32 -0
  219. package/registry/examples/line-chart/native/creator-earnings.light.png +0 -0
  220. package/registry/examples/line-chart/native/creator-earnings.tsx +26 -0
  221. package/registry/examples/line-chart/states.d.ts +4 -0
  222. package/registry/examples/line-chart/states.js +16 -0
  223. package/registry/examples/line-chart/states.tsx +13 -0
  224. package/registry/examples/pie-chart/credit-spend.d.ts +4 -0
  225. package/registry/examples/pie-chart/credit-spend.js +30 -0
  226. package/registry/examples/pie-chart/credit-spend.tsx +24 -0
  227. package/registry/examples/pie-chart/native/credit-spend.d.ts +4 -0
  228. package/registry/examples/pie-chart/native/credit-spend.dark.png +0 -0
  229. package/registry/examples/pie-chart/native/credit-spend.js +17 -0
  230. package/registry/examples/pie-chart/native/credit-spend.light.png +0 -0
  231. package/registry/examples/pie-chart/native/credit-spend.tsx +12 -0
  232. package/registry/examples/pie-chart/storage-by-kind.d.ts +4 -0
  233. package/registry/examples/pie-chart/storage-by-kind.js +31 -0
  234. package/registry/examples/pie-chart/storage-by-kind.tsx +26 -0
  235. package/registry/examples/radar-chart/model-comparison.d.ts +4 -0
  236. package/registry/examples/radar-chart/model-comparison.js +33 -0
  237. package/registry/examples/radar-chart/model-comparison.tsx +28 -0
  238. package/registry/examples/sankey/credit-flow.d.ts +4 -0
  239. package/registry/examples/sankey/credit-flow.js +37 -0
  240. package/registry/examples/sankey/credit-flow.tsx +32 -0
  241. package/registry/examples/scatter-chart/watch-time.d.ts +4 -0
  242. package/registry/examples/scatter-chart/watch-time.js +36 -0
  243. package/registry/examples/scatter-chart/watch-time.tsx +31 -0
  244. package/registry/examples/sparkline/bars.d.ts +4 -0
  245. package/registry/examples/sparkline/bars.js +12 -0
  246. package/registry/examples/sparkline/bars.tsx +7 -0
  247. package/registry/examples/sparkline/native/stat-trend.d.ts +4 -0
  248. package/registry/examples/sparkline/native/stat-trend.dark.png +0 -0
  249. package/registry/examples/sparkline/native/stat-trend.js +12 -0
  250. package/registry/examples/sparkline/native/stat-trend.light.png +0 -0
  251. package/registry/examples/sparkline/native/stat-trend.tsx +7 -0
  252. package/registry/examples/sparkline/stat-trend.d.ts +4 -0
  253. package/registry/examples/sparkline/stat-trend.js +18 -0
  254. package/registry/examples/sparkline/stat-trend.tsx +15 -0
  255. package/registry/examples/sparkline/table-rows.d.ts +4 -0
  256. package/registry/examples/sparkline/table-rows.js +23 -0
  257. package/registry/examples/sparkline/table-rows.tsx +26 -0
  258. package/registry/examples/treemap/storage.d.ts +4 -0
  259. package/registry/examples/treemap/storage.js +17 -0
  260. package/registry/examples/treemap/storage.tsx +13 -0
  261. package/registry/funnel.json +486 -0
  262. package/registry/gauge.json +599 -0
  263. package/registry/geo-map.json +483 -0
  264. package/registry/globe.json +468 -0
  265. package/registry/heatmap.json +530 -0
  266. package/registry/index.json +420 -0
  267. package/registry/line-chart.json +792 -0
  268. package/registry/pie-chart.json +1287 -0
  269. package/registry/radar-chart.json +458 -0
  270. package/registry/sankey.json +502 -0
  271. package/registry/scatter-chart.json +558 -0
  272. package/registry/sparkline.json +562 -0
  273. package/registry/treemap.json +431 -0
@@ -0,0 +1,38 @@
1
+ "use client";
2
+ import {
3
+ EChartHost,
4
+ baseOption
5
+ } from "./chunk-I5QUZVU2.js";
6
+
7
+ // src/chart/chart.tsx
8
+ import { useCallback } from "react";
9
+ import { jsx } from "react/jsx-runtime";
10
+ var fullEngine = () => import("./full-S2MBPEEP.js");
11
+ function Chart({ option, modules = fullEngine, summaryText, table, items, onItem, ...frame }) {
12
+ const build = useCallback(
13
+ (theme, size) => {
14
+ const own = typeof option === "function" ? option(theme, size) : option;
15
+ return { ...baseOption(theme, true), ...own };
16
+ },
17
+ [option]
18
+ );
19
+ return /* @__PURE__ */ jsx(
20
+ EChartHost,
21
+ {
22
+ kind: "chart",
23
+ frame: { ...frame, summaryText },
24
+ table,
25
+ summary: summaryText,
26
+ isEmpty: table.rows.length === 0,
27
+ engine: modules,
28
+ build,
29
+ items,
30
+ onItem
31
+ }
32
+ );
33
+ }
34
+
35
+ export {
36
+ Chart
37
+ };
38
+ //# sourceMappingURL=chunk-AHQXJSAQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chart/chart.tsx"],"sourcesContent":["\"use client\";\n// The way out for what the typed charts do not cover: any ECharts option, on the same frame — the theme (palette, text,\n// tooltip surface resolved from the tokens, re-applied on a theme switch), the lazy engine, the states, the export —\n// and the same duty: a title, a summary and the data as a table, written by you since the option is opaque.\nimport type { EChartsCoreOption } from \"echarts/core\";\nimport { useCallback } from \"react\";\n\nimport { EChartHost, type EngineProps, type WalkItem } from \"../echarts/host\";\nimport { baseOption, type ResolvedTheme } from \"../echarts/theme\";\nimport type { ChartFrameProps, TableModel } from \"../web/frame\";\n\nconst fullEngine = () => import(\"../echarts/engines/full\");\n\nexport type { ResolvedTheme };\n\nexport interface ChartProps extends ChartFrameProps, EngineProps {\n /** The ECharts option, or a function of the resolved theme (colours as plain strings, the palette, the ramp). */\n option: EChartsCoreOption | ((theme: ResolvedTheme, size: { width: number; height: number }) => EChartsCoreOption);\n /**\n * Registers what the option needs, from `echarts/charts` and `echarts/components` (tree-shaken):\n * `() => import(\"./my-echarts\")` where that module calls `use([...])`. Default: all of ECharts (~380 kB gzip).\n */\n modules?: () => Promise<unknown>;\n /** The written summary: an option says nothing on its own. */\n summaryText: string;\n /** The data as a table: the alternative of every chart. */\n table: TableModel;\n /** What the arrow keys walk (series and data indexes, and what each one says). */\n items?: readonly WalkItem[];\n /** A click (or Enter) on a data item. */\n onItem?: (item: { seriesIndex: number; dataIndex: number }) => void;\n}\n\n/** Any ECharts option, themed and framed like the typed charts. Memoise `option` when it is a function. */\nexport function Chart({ option, modules = fullEngine, summaryText, table, items, onItem, ...frame }: ChartProps) {\n const build = useCallback(\n (theme: ResolvedTheme, size: { width: number; height: number }) => {\n const own = typeof option === \"function\" ? option(theme, size) : option;\n return { ...baseOption(theme, true), ...own };\n },\n [option],\n );\n return (\n <EChartHost\n kind=\"chart\"\n frame={{ ...frame, summaryText }}\n table={table}\n summary={summaryText}\n isEmpty={table.rows.length === 0}\n engine={modules}\n build={build}\n items={items}\n onItem={onItem}\n />\n );\n}\n"],"mappings":";;;;;;;AAKA,SAAS,mBAAmB;AAsCxB;AAhCJ,IAAM,aAAa,MAAM,OAAO,oBAAyB;AAuBlD,SAAS,MAAM,EAAE,QAAQ,UAAU,YAAY,aAAa,OAAO,OAAO,QAAQ,GAAG,MAAM,GAAe;AAC/G,QAAM,QAAQ;AAAA,IACZ,CAAC,OAAsB,SAA4C;AACjE,YAAM,MAAM,OAAO,WAAW,aAAa,OAAO,OAAO,IAAI,IAAI;AACjE,aAAO,EAAE,GAAG,WAAW,OAAO,IAAI,GAAG,GAAG,IAAI;AAAA,IAC9C;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,OAAO,EAAE,GAAG,OAAO,YAAY;AAAA,MAC/B;AAAA,MACA,SAAS;AAAA,MACT,SAAS,MAAM,KAAK,WAAW;AAAA,MAC/B,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -0,0 +1,43 @@
1
+ "use client";
2
+ import {
3
+ summarize
4
+ } from "./chunk-W5FX4TU3.js";
5
+ import {
6
+ capitalize,
7
+ fill
8
+ } from "./chunk-3CJHBJXA.js";
9
+
10
+ // src/core/describe.ts
11
+ function describeSeries(table, { kind, labels, value, category, share, thresholds = [] }) {
12
+ const points = table.categories.length;
13
+ const first = points ? category(table.categories[0]) : "";
14
+ const last = points ? category(table.categories[points - 1]) : "";
15
+ const count = table.series.length > 1 ? `${table.series.length} \xD7 ${points}` : String(points);
16
+ const intro = fill(labels.summaryIntro, { kind: labels.kinds[kind], count: points > 1 ? `${count} (${first} \u2013 ${last})` : count });
17
+ const sentences = table.series.map((series) => {
18
+ const s = summarize(series, table.categories, category);
19
+ if (!s.count) return `${s.label}: ${labels.noValue}.`;
20
+ const parts = [fill(labels.summarySeries, { label: s.label, first: value(s.first), last: value(s.last) })];
21
+ if (s.min && s.max && s.count > 2) parts.push(fill(labels.summaryRange, { min: value(s.min.value), minAt: s.min.category, max: value(s.max.value), maxAt: s.max.category }));
22
+ if (s.trend === "up" || s.trend === "down") {
23
+ const template = s.trend === "up" ? labels.summaryTrendUp : labels.summaryTrendDown;
24
+ if (s.change !== null) parts.push(fill(template, { change: share(Math.abs(s.change)) }));
25
+ } else if (s.trend === "flat") parts.push(labels.summaryTrendFlat);
26
+ return `${parts.join(", ")}.`;
27
+ });
28
+ const marks = thresholds.map((t) => fill(labels.summaryThreshold, { label: t.label, value: value(t.value) }));
29
+ return [intro, ...sentences, ...marks.length ? [`${marks.join(", ")}.`] : []].join(" ");
30
+ }
31
+ function describeParts(kind, parts, { labels, value, share }) {
32
+ const total = parts.reduce((sum, p) => sum + Math.max(0, p.value), 0);
33
+ const intro = fill(labels.summaryIntro, { kind: labels.kinds[kind], count: parts.length });
34
+ const sorted = [...parts].sort((a, b) => b.value - a.value);
35
+ const items = sorted.map((p) => fill(labels.summaryShare, { label: p.label, value: value(p.value), share: share(total ? p.value / total : 0) }));
36
+ return `${intro} ${items.join(", ")}. ${capitalize(fill(labels.summaryTotal, { total: value(total) }))}.`;
37
+ }
38
+
39
+ export {
40
+ describeSeries,
41
+ describeParts
42
+ };
43
+ //# sourceMappingURL=chunk-ANUCSRUN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/describe.ts"],"sourcesContent":["// The written summary of a chart — what a sighted reader takes in at a glance, said in words for a screen reader (and\n// shown under the chart when `summary=\"visible\"`): the kind, the size, then per series its range, extremes and trend.\nimport { summarize, type Table } from \"./data\";\nimport type { CategoryFormatter, ValueFormatter } from \"./format\";\nimport { capitalize, type ChartKind, type ChartLabels, fill } from \"./labels\";\nimport type { Threshold } from \"./types\";\n\nexport interface DescribeOptions {\n readonly kind: ChartKind;\n readonly labels: ChartLabels;\n readonly value: ValueFormatter;\n readonly category: CategoryFormatter;\n readonly share: (ratio: number) => string;\n readonly thresholds?: readonly Threshold[];\n}\n\n/** A cartesian chart (line, area, bar, sparkline): one sentence per series. */\nexport function describeSeries(table: Table, { kind, labels, value, category, share, thresholds = [] }: DescribeOptions): string {\n const points = table.categories.length;\n const first = points ? category(table.categories[0]) : \"\";\n const last = points ? category(table.categories[points - 1]) : \"\";\n const count = table.series.length > 1 ? `${table.series.length} × ${points}` : String(points);\n const intro = fill(labels.summaryIntro, { kind: labels.kinds[kind], count: points > 1 ? `${count} (${first} – ${last})` : count });\n const sentences = table.series.map((series) => {\n const s = summarize(series, table.categories, category);\n if (!s.count) return `${s.label}: ${labels.noValue}.`;\n const parts = [fill(labels.summarySeries, { label: s.label, first: value(s.first), last: value(s.last) })];\n if (s.min && s.max && s.count > 2) parts.push(fill(labels.summaryRange, { min: value(s.min.value), minAt: s.min.category, max: value(s.max.value), maxAt: s.max.category }));\n if (s.trend === \"up\" || s.trend === \"down\") {\n const template = s.trend === \"up\" ? labels.summaryTrendUp : labels.summaryTrendDown;\n if (s.change !== null) parts.push(fill(template, { change: share(Math.abs(s.change)) }));\n } else if (s.trend === \"flat\") parts.push(labels.summaryTrendFlat);\n return `${parts.join(\", \")}.`;\n });\n const marks = thresholds.map((t) => fill(labels.summaryThreshold, { label: t.label, value: value(t.value) }));\n return [intro, ...sentences, ...(marks.length ? [`${marks.join(\", \")}.`] : [])].join(\" \");\n}\n\n/** A part-to-whole chart (pie, donut, funnel, treemap): the parts, largest first, with their share. */\nexport function describeParts(kind: ChartKind, parts: readonly { label: string; value: number }[], { labels, value, share }: Omit<DescribeOptions, \"kind\" | \"category\">): string {\n const total = parts.reduce((sum, p) => sum + Math.max(0, p.value), 0);\n const intro = fill(labels.summaryIntro, { kind: labels.kinds[kind], count: parts.length });\n const sorted = [...parts].sort((a, b) => b.value - a.value);\n const items = sorted.map((p) => fill(labels.summaryShare, { label: p.label, value: value(p.value), share: share(total ? p.value / total : 0) }));\n return `${intro} ${items.join(\", \")}. ${capitalize(fill(labels.summaryTotal, { total: value(total) }))}.`;\n}\n"],"mappings":";;;;;;;;;;AAiBO,SAAS,eAAe,OAAc,EAAE,MAAM,QAAQ,OAAO,UAAU,OAAO,aAAa,CAAC,EAAE,GAA4B;AAC/H,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,QAAQ,SAAS,SAAS,MAAM,WAAW,CAAC,CAAC,IAAI;AACvD,QAAM,OAAO,SAAS,SAAS,MAAM,WAAW,SAAS,CAAC,CAAC,IAAI;AAC/D,QAAM,QAAQ,MAAM,OAAO,SAAS,IAAI,GAAG,MAAM,OAAO,MAAM,SAAM,MAAM,KAAK,OAAO,MAAM;AAC5F,QAAM,QAAQ,KAAK,OAAO,cAAc,EAAE,MAAM,OAAO,MAAM,IAAI,GAAG,OAAO,SAAS,IAAI,GAAG,KAAK,KAAK,KAAK,WAAM,IAAI,MAAM,MAAM,CAAC;AACjI,QAAM,YAAY,MAAM,OAAO,IAAI,CAAC,WAAW;AAC7C,UAAM,IAAI,UAAU,QAAQ,MAAM,YAAY,QAAQ;AACtD,QAAI,CAAC,EAAE,MAAO,QAAO,GAAG,EAAE,KAAK,KAAK,OAAO,OAAO;AAClD,UAAM,QAAQ,CAAC,KAAK,OAAO,eAAe,EAAE,OAAO,EAAE,OAAO,OAAO,MAAM,EAAE,KAAK,GAAG,MAAM,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AACzG,QAAI,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAG,OAAM,KAAK,KAAK,OAAO,cAAc,EAAE,KAAK,MAAM,EAAE,IAAI,KAAK,GAAG,OAAO,EAAE,IAAI,UAAU,KAAK,MAAM,EAAE,IAAI,KAAK,GAAG,OAAO,EAAE,IAAI,SAAS,CAAC,CAAC;AAC3K,QAAI,EAAE,UAAU,QAAQ,EAAE,UAAU,QAAQ;AAC1C,YAAM,WAAW,EAAE,UAAU,OAAO,OAAO,iBAAiB,OAAO;AACnE,UAAI,EAAE,WAAW,KAAM,OAAM,KAAK,KAAK,UAAU,EAAE,QAAQ,MAAM,KAAK,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AAAA,IACzF,WAAW,EAAE,UAAU,OAAQ,OAAM,KAAK,OAAO,gBAAgB;AACjE,WAAO,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,EAC5B,CAAC;AACD,QAAM,QAAQ,WAAW,IAAI,CAAC,MAAM,KAAK,OAAO,kBAAkB,EAAE,OAAO,EAAE,OAAO,OAAO,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5G,SAAO,CAAC,OAAO,GAAG,WAAW,GAAI,MAAM,SAAS,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,CAAE,EAAE,KAAK,GAAG;AAC1F;AAGO,SAAS,cAAc,MAAiB,OAAoD,EAAE,QAAQ,OAAO,MAAM,GAAuD;AAC/K,QAAM,QAAQ,MAAM,OAAO,CAAC,KAAK,MAAM,MAAM,KAAK,IAAI,GAAG,EAAE,KAAK,GAAG,CAAC;AACpE,QAAM,QAAQ,KAAK,OAAO,cAAc,EAAE,MAAM,OAAO,MAAM,IAAI,GAAG,OAAO,MAAM,OAAO,CAAC;AACzF,QAAM,SAAS,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAC1D,QAAM,QAAQ,OAAO,IAAI,CAAC,MAAM,KAAK,OAAO,cAAc,EAAE,OAAO,EAAE,OAAO,OAAO,MAAM,EAAE,KAAK,GAAG,OAAO,MAAM,QAAQ,EAAE,QAAQ,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC/I,SAAO,GAAG,KAAK,IAAI,MAAM,KAAK,IAAI,CAAC,KAAK,WAAW,KAAK,OAAO,cAAc,EAAE,OAAO,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC;AACxG;","names":[]}
@@ -0,0 +1,66 @@
1
+ "use client";
2
+
3
+ // src/core/scale.ts
4
+ function niceStep(span, count) {
5
+ if (!(span > 0) || !(count > 0)) return 1;
6
+ const raw = span / count;
7
+ const power = 10 ** Math.floor(Math.log10(raw));
8
+ const fraction = raw / power;
9
+ const nice = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 2.5 ? 2.5 : fraction <= 5 ? 5 : 10;
10
+ return nice * power;
11
+ }
12
+ function niceDomain(min, max, count = 5) {
13
+ if (!Number.isFinite(min) || !Number.isFinite(max)) return { domain: [0, 1], ticks: [0, 1] };
14
+ if (min === max) {
15
+ if (min === 0) return { domain: [0, 1], ticks: [0, 0.5, 1] };
16
+ const pad = Math.abs(min) * 0.5;
17
+ [min, max] = min > 0 ? [0, max + pad] : [min - pad, 0];
18
+ }
19
+ const step = niceStep(max - min, count);
20
+ const lo = Math.floor(min / step) * step;
21
+ const hi = Math.ceil(max / step) * step;
22
+ const ticks = [];
23
+ const digits = Math.max(0, -Math.floor(Math.log10(step)) + 2);
24
+ for (let v = lo; v <= hi + step / 2; v += step) ticks.push(Number(v.toFixed(digits)));
25
+ return { domain: [lo, hi], ticks };
26
+ }
27
+ function linearScale(domain, range, ticks = domain) {
28
+ const [d0, d1] = domain;
29
+ const [r0, r1] = range;
30
+ const k = d1 === d0 ? 0 : (r1 - r0) / (d1 - d0);
31
+ const scale = ((value) => r0 + (value - d0) * k);
32
+ return Object.assign(scale, { domain, range, ticks });
33
+ }
34
+ function bandScale(count, range, padding = 0.3) {
35
+ const [r0, r1] = range;
36
+ const step = count > 0 ? (r1 - r0) / count : 0;
37
+ const bandwidth = step * (1 - padding);
38
+ const scale = ((index) => r0 + index * step + (step - bandwidth) / 2);
39
+ return Object.assign(scale, { bandwidth, step, count });
40
+ }
41
+ function pointScale(count, range) {
42
+ const [r0, r1] = range;
43
+ if (count <= 1) return () => (r0 + r1) / 2;
44
+ const step = (r1 - r0) / (count - 1);
45
+ return (index) => r0 + index * step;
46
+ }
47
+ function thinLabels(count, max) {
48
+ if (count <= max) return Array.from({ length: count }, (_, i) => i);
49
+ const every = Math.ceil(count / Math.max(1, max));
50
+ const out = [];
51
+ for (let i = 0; i < count; i += every) out.push(i);
52
+ if (out[out.length - 1] !== count - 1) {
53
+ if (count - 1 - out[out.length - 1] < every) out.pop();
54
+ out.push(count - 1);
55
+ }
56
+ return out;
57
+ }
58
+
59
+ export {
60
+ niceDomain,
61
+ linearScale,
62
+ bandScale,
63
+ pointScale,
64
+ thinLabels
65
+ };
66
+ //# sourceMappingURL=chunk-BISL7DYW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/scale.ts"],"sourcesContent":["// Scales and ticks: the few functions a cartesian chart needs, without d3-scale (the charts draw a handful of shapes;\n// a full scale library would weigh more than the charts themselves).\n\nexport interface LinearScale {\n (value: number): number;\n readonly domain: readonly [number, number];\n readonly range: readonly [number, number];\n readonly ticks: readonly number[];\n}\n\n/** A step of 1, 2, 2.5 or 5 × 10ⁿ near `span / count`: ticks a reader counts without effort (0, 250, 500…). */\nexport function niceStep(span: number, count: number): number {\n if (!(span > 0) || !(count > 0)) return 1;\n const raw = span / count;\n const power = 10 ** Math.floor(Math.log10(raw));\n const fraction = raw / power;\n const nice = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 2.5 ? 2.5 : fraction <= 5 ? 5 : 10;\n return nice * power;\n}\n\n/**\n * A domain stretched to round ticks: `[0, 4870]` with about 5 ticks → `[0, 5000]`, ticks `0 1000 … 5000`. A single\n * value is padded towards zero, so a lone point never sits on the edge.\n */\nexport function niceDomain(min: number, max: number, count = 5): { domain: [number, number]; ticks: number[] } {\n if (!Number.isFinite(min) || !Number.isFinite(max)) return { domain: [0, 1], ticks: [0, 1] };\n if (min === max) {\n if (min === 0) return { domain: [0, 1], ticks: [0, 0.5, 1] };\n const pad = Math.abs(min) * 0.5;\n [min, max] = min > 0 ? [0, max + pad] : [min - pad, 0];\n }\n const step = niceStep(max - min, count);\n const lo = Math.floor(min / step) * step;\n const hi = Math.ceil(max / step) * step;\n const ticks: number[] = [];\n // Rounded to the step's precision: 0.1 + 0.2 must read 0.3.\n const digits = Math.max(0, -Math.floor(Math.log10(step)) + 2);\n for (let v = lo; v <= hi + step / 2; v += step) ticks.push(Number(v.toFixed(digits)));\n return { domain: [lo, hi], ticks };\n}\n\n/** A linear scale from a domain to pixels, with its round ticks. */\nexport function linearScale(domain: readonly [number, number], range: readonly [number, number], ticks: readonly number[] = domain): LinearScale {\n const [d0, d1] = domain;\n const [r0, r1] = range;\n const k = d1 === d0 ? 0 : (r1 - r0) / (d1 - d0);\n const scale = ((value: number) => r0 + (value - d0) * k) as LinearScale;\n return Object.assign(scale, { domain, range, ticks });\n}\n\nexport interface BandScale {\n (index: number): number;\n /** The width of one band (the bars of a category share it). */\n readonly bandwidth: number;\n /** The distance between the starts of two bands. */\n readonly step: number;\n readonly count: number;\n}\n\n/** `count` bands over the range, with an inner padding between them (a ratio of the step). */\nexport function bandScale(count: number, range: readonly [number, number], padding = 0.3): BandScale {\n const [r0, r1] = range;\n const step = count > 0 ? (r1 - r0) / count : 0;\n const bandwidth = step * (1 - padding);\n const scale = ((index: number) => r0 + index * step + (step - bandwidth) / 2) as BandScale;\n return Object.assign(scale, { bandwidth, step, count });\n}\n\n/** A point scale: `count` points from one end of the range to the other (lines, areas). */\nexport function pointScale(count: number, range: readonly [number, number]): (index: number) => number {\n const [r0, r1] = range;\n if (count <= 1) return () => (r0 + r1) / 2;\n const step = (r1 - r0) / (count - 1);\n return (index) => r0 + index * step;\n}\n\n/** At most `max` of `count` labels, evenly spaced, the last one always kept: which indexes to write on an axis. */\nexport function thinLabels(count: number, max: number): number[] {\n if (count <= max) return Array.from({ length: count }, (_, i) => i);\n const every = Math.ceil(count / Math.max(1, max));\n const out: number[] = [];\n for (let i = 0; i < count; i += every) out.push(i);\n if (out[out.length - 1] !== count - 1) {\n // The last label is always written; the one before it gives way when they would touch.\n if (count - 1 - out[out.length - 1]! < every) out.pop();\n out.push(count - 1);\n }\n return out;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import {
3
+ Cartesian
4
+ } from "./chunk-UNK4MJVG.js";
5
+
6
+ // src/line/line-chart.tsx
7
+ import { jsx } from "react/jsx-runtime";
8
+ function LineChart({ curve, dots, endLabels = true, ...props }) {
9
+ return /* @__PURE__ */ jsx(Cartesian, { props, options: { kind: "line", mode: "line", curve, dots, endLabels } });
10
+ }
11
+ function AreaChart({ curve, dots, endLabels = true, stacked, ...props }) {
12
+ return /* @__PURE__ */ jsx(Cartesian, { props, options: { kind: "area", mode: "area", curve, dots, endLabels: endLabels && !stacked, stacked } });
13
+ }
14
+
15
+ export {
16
+ LineChart,
17
+ AreaChart
18
+ };
19
+ //# sourceMappingURL=chunk-BZ5CQFPH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/line/line-chart.tsx"],"sourcesContent":["\"use client\";\nimport { Cartesian, type CartesianProps } from \"../cartesian/cartesian\";\nimport type { Curve } from \"../core/shape\";\nimport type { Datum } from \"../core/types\";\n\nexport interface LineChartProps<T extends Datum> extends CartesianProps<T> {\n /** The shape between points: `monotone` (default, never overshoots), `linear`, `step` (a value that holds). */\n curve?: Curve;\n /** A dot on every point (short series). Default false: the end of each line carries one. */\n dots?: boolean;\n /** Write the last value at the end of each line (up to three series). Default true. */\n endLabels?: boolean;\n}\n\n/** Change over time: one line per series, the last value written at its end, a crosshair tooltip, the keyboard. */\nexport function LineChart<T extends Datum>({ curve, dots, endLabels = true, ...props }: LineChartProps<T>) {\n return <Cartesian props={props} options={{ kind: \"line\", mode: \"line\", curve, dots, endLabels }} />;\n}\n\nexport interface AreaChartProps<T extends Datum> extends LineChartProps<T> {\n /** Stack the series: a total and its parts over time. */\n stacked?: boolean;\n}\n\n/** A volume over time: a line over a soft wash (stacked: the parts of a total). */\nexport function AreaChart<T extends Datum>({ curve, dots, endLabels = true, stacked, ...props }: AreaChartProps<T>) {\n return <Cartesian props={props} options={{ kind: \"area\", mode: \"area\", curve, dots, endLabels: endLabels && !stacked, stacked }} />;\n}\n"],"mappings":";;;;;;AAgBS;AADF,SAAS,UAA2B,EAAE,OAAO,MAAM,YAAY,MAAM,GAAG,MAAM,GAAsB;AACzG,SAAO,oBAAC,aAAU,OAAc,SAAS,EAAE,MAAM,QAAQ,MAAM,QAAQ,OAAO,MAAM,UAAU,GAAG;AACnG;AAQO,SAAS,UAA2B,EAAE,OAAO,MAAM,YAAY,MAAM,SAAS,GAAG,MAAM,GAAsB;AAClH,SAAO,oBAAC,aAAU,OAAc,SAAS,EAAE,MAAM,QAAQ,MAAM,QAAQ,OAAO,MAAM,WAAW,aAAa,CAAC,SAAS,QAAQ,GAAG;AACnI;","names":[]}