@rowsncolumns/charts 27.0.30

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 (281) hide show
  1. package/LICENSE.md +100 -0
  2. package/Readme.md +81 -0
  3. package/dist/cjs/atoms/editing-chart.atom.d.ts +13 -0
  4. package/dist/cjs/atoms/editing-chart.atom.d.ts.map +1 -0
  5. package/dist/cjs/atoms/editing-chart.atom.js +26 -0
  6. package/dist/cjs/basic-chart/basic-chart.d.ts +5 -0
  7. package/dist/cjs/basic-chart/basic-chart.d.ts.map +1 -0
  8. package/dist/cjs/basic-chart/basic-chart.js +2250 -0
  9. package/dist/cjs/basic-chart/helpers.d.ts +12 -0
  10. package/dist/cjs/basic-chart/helpers.d.ts.map +1 -0
  11. package/dist/cjs/basic-chart/helpers.js +105 -0
  12. package/dist/cjs/basic-chart/index.d.ts +5 -0
  13. package/dist/cjs/basic-chart/index.d.ts.map +1 -0
  14. package/dist/cjs/basic-chart/index.js +12 -0
  15. package/dist/cjs/components/dialogs/chart-editor-dialog.d.ts +5 -0
  16. package/dist/cjs/components/dialogs/chart-editor-dialog.d.ts.map +1 -0
  17. package/dist/cjs/components/dialogs/chart-editor-dialog.js +25 -0
  18. package/dist/cjs/components/editors/chart-editor.d.ts +10 -0
  19. package/dist/cjs/components/editors/chart-editor.d.ts.map +1 -0
  20. package/dist/cjs/components/editors/chart-editor.js +631 -0
  21. package/dist/cjs/components/editors/chart-range-input.d.ts +17 -0
  22. package/dist/cjs/components/editors/chart-range-input.d.ts.map +1 -0
  23. package/dist/cjs/components/editors/chart-range-input.js +16 -0
  24. package/dist/cjs/config.d.ts +19 -0
  25. package/dist/cjs/config.d.ts.map +1 -0
  26. package/dist/cjs/config.js +196 -0
  27. package/dist/cjs/hooks/use-chart-editor.d.ts +8 -0
  28. package/dist/cjs/hooks/use-chart-editor.d.ts.map +1 -0
  29. package/dist/cjs/hooks/use-chart-editor.js +29 -0
  30. package/dist/cjs/hooks/use-charts.d.ts +35 -0
  31. package/dist/cjs/hooks/use-charts.d.ts.map +1 -0
  32. package/dist/cjs/hooks/use-charts.js +67 -0
  33. package/dist/cjs/hooks/use-on-create-chart.d.ts +13 -0
  34. package/dist/cjs/hooks/use-on-create-chart.d.ts.map +1 -0
  35. package/dist/cjs/hooks/use-on-create-chart.js +24 -0
  36. package/dist/cjs/hooks/use-on-delete-chart.d.ts +8 -0
  37. package/dist/cjs/hooks/use-on-delete-chart.d.ts.map +1 -0
  38. package/dist/cjs/hooks/use-on-delete-chart.js +19 -0
  39. package/dist/cjs/hooks/use-on-move-chart.d.ts +8 -0
  40. package/dist/cjs/hooks/use-on-move-chart.d.ts.map +1 -0
  41. package/dist/cjs/hooks/use-on-move-chart.js +15 -0
  42. package/dist/cjs/hooks/use-on-resize-chart.d.ts +8 -0
  43. package/dist/cjs/hooks/use-on-resize-chart.d.ts.map +1 -0
  44. package/dist/cjs/hooks/use-on-resize-chart.js +15 -0
  45. package/dist/cjs/hooks/use-on-update-chart.d.ts +9 -0
  46. package/dist/cjs/hooks/use-on-update-chart.d.ts.map +1 -0
  47. package/dist/cjs/hooks/use-on-update-chart.js +15 -0
  48. package/dist/cjs/index.d.ts +11 -0
  49. package/dist/cjs/index.d.ts.map +1 -0
  50. package/dist/cjs/index.js +18 -0
  51. package/dist/cjs/interface/create-chart.d.ts +9 -0
  52. package/dist/cjs/interface/create-chart.d.ts.map +1 -0
  53. package/dist/cjs/interface/create-chart.js +110 -0
  54. package/dist/cjs/interface/delete-chart.d.ts +4 -0
  55. package/dist/cjs/interface/delete-chart.d.ts.map +1 -0
  56. package/dist/cjs/interface/delete-chart.js +26 -0
  57. package/dist/cjs/interface/move-chart.d.ts +5 -0
  58. package/dist/cjs/interface/move-chart.d.ts.map +1 -0
  59. package/dist/cjs/interface/move-chart.js +28 -0
  60. package/dist/cjs/interface/resize-chart.d.ts +5 -0
  61. package/dist/cjs/interface/resize-chart.d.ts.map +1 -0
  62. package/dist/cjs/interface/resize-chart.js +30 -0
  63. package/dist/cjs/interface/update-chart.d.ts +4 -0
  64. package/dist/cjs/interface/update-chart.d.ts.map +1 -0
  65. package/dist/cjs/interface/update-chart.js +29 -0
  66. package/dist/cjs/plotly/basic-chart/basic-chart.d.ts +5 -0
  67. package/dist/cjs/plotly/basic-chart/basic-chart.d.ts.map +1 -0
  68. package/dist/cjs/plotly/basic-chart/basic-chart.js +1586 -0
  69. package/dist/cjs/plotly/basic-chart/helpers.d.ts +20 -0
  70. package/dist/cjs/plotly/basic-chart/helpers.d.ts.map +1 -0
  71. package/dist/cjs/plotly/basic-chart/helpers.js +114 -0
  72. package/dist/cjs/plotly/basic-chart/index.d.ts +5 -0
  73. package/dist/cjs/plotly/basic-chart/index.d.ts.map +1 -0
  74. package/dist/cjs/plotly/basic-chart/index.js +12 -0
  75. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  76. package/dist/cjs/types.d.ts +27 -0
  77. package/dist/cjs/types.d.ts.map +1 -0
  78. package/dist/cjs/types.js +2 -0
  79. package/dist/cjs/utils/aggregation.d.ts +6 -0
  80. package/dist/cjs/utils/aggregation.d.ts.map +1 -0
  81. package/dist/cjs/utils/aggregation.js +127 -0
  82. package/dist/cjs/utils/bar-layout.d.ts +57 -0
  83. package/dist/cjs/utils/bar-layout.d.ts.map +1 -0
  84. package/dist/cjs/utils/bar-layout.js +81 -0
  85. package/dist/cjs/utils/boxplot.d.ts +62 -0
  86. package/dist/cjs/utils/boxplot.d.ts.map +1 -0
  87. package/dist/cjs/utils/boxplot.js +105 -0
  88. package/dist/cjs/utils/bubble.d.ts +52 -0
  89. package/dist/cjs/utils/bubble.d.ts.map +1 -0
  90. package/dist/cjs/utils/bubble.js +139 -0
  91. package/dist/cjs/utils/chart-spec-utils.d.ts +67 -0
  92. package/dist/cjs/utils/chart-spec-utils.d.ts.map +1 -0
  93. package/dist/cjs/utils/chart-spec-utils.js +355 -0
  94. package/dist/cjs/utils/echarts-gl-loader.d.ts +11 -0
  95. package/dist/cjs/utils/echarts-gl-loader.d.ts.map +1 -0
  96. package/dist/cjs/utils/echarts-gl-loader.js +59 -0
  97. package/dist/cjs/utils/error-bars.d.ts +58 -0
  98. package/dist/cjs/utils/error-bars.d.ts.map +1 -0
  99. package/dist/cjs/utils/error-bars.js +154 -0
  100. package/dist/cjs/utils/gradient.d.ts +52 -0
  101. package/dist/cjs/utils/gradient.d.ts.map +1 -0
  102. package/dist/cjs/utils/gradient.js +93 -0
  103. package/dist/cjs/utils/hierarchy.d.ts +28 -0
  104. package/dist/cjs/utils/hierarchy.d.ts.map +1 -0
  105. package/dist/cjs/utils/hierarchy.js +186 -0
  106. package/dist/cjs/utils/histogram.d.ts +46 -0
  107. package/dist/cjs/utils/histogram.d.ts.map +1 -0
  108. package/dist/cjs/utils/histogram.js +125 -0
  109. package/dist/cjs/utils/of-pie.d.ts +101 -0
  110. package/dist/cjs/utils/of-pie.d.ts.map +1 -0
  111. package/dist/cjs/utils/of-pie.js +159 -0
  112. package/dist/cjs/utils/overrides.d.ts +12 -0
  113. package/dist/cjs/utils/overrides.d.ts.map +1 -0
  114. package/dist/cjs/utils/overrides.js +171 -0
  115. package/dist/cjs/utils/radar.d.ts +37 -0
  116. package/dist/cjs/utils/radar.d.ts.map +1 -0
  117. package/dist/cjs/utils/radar.js +70 -0
  118. package/dist/cjs/utils/region-map-loader.d.ts +22 -0
  119. package/dist/cjs/utils/region-map-loader.d.ts.map +1 -0
  120. package/dist/cjs/utils/region-map-loader.js +174 -0
  121. package/dist/cjs/utils/region-map.d.ts +100 -0
  122. package/dist/cjs/utils/region-map.d.ts.map +1 -0
  123. package/dist/cjs/utils/region-map.js +327 -0
  124. package/dist/cjs/utils/stock.d.ts +64 -0
  125. package/dist/cjs/utils/stock.d.ts.map +1 -0
  126. package/dist/cjs/utils/stock.js +153 -0
  127. package/dist/cjs/utils/three-d.d.ts +96 -0
  128. package/dist/cjs/utils/three-d.d.ts.map +1 -0
  129. package/dist/cjs/utils/three-d.js +191 -0
  130. package/dist/cjs/utils/trendline.d.ts +41 -0
  131. package/dist/cjs/utils/trendline.d.ts.map +1 -0
  132. package/dist/cjs/utils/trendline.js +303 -0
  133. package/dist/cjs/utils/waterfall.d.ts +24 -0
  134. package/dist/cjs/utils/waterfall.d.ts.map +1 -0
  135. package/dist/cjs/utils/waterfall.js +61 -0
  136. package/dist/cjs/utils/webgl.d.ts +12 -0
  137. package/dist/cjs/utils/webgl.d.ts.map +1 -0
  138. package/dist/cjs/utils/webgl.js +36 -0
  139. package/dist/cjs/vitest.config.d.ts +3 -0
  140. package/dist/cjs/vitest.config.d.ts.map +1 -0
  141. package/dist/cjs/vitest.config.js +9 -0
  142. package/dist/esm/atoms/editing-chart.atom.d.ts +13 -0
  143. package/dist/esm/atoms/editing-chart.atom.d.ts.map +1 -0
  144. package/dist/esm/atoms/editing-chart.atom.js +12 -0
  145. package/dist/esm/basic-chart/basic-chart.d.ts +5 -0
  146. package/dist/esm/basic-chart/basic-chart.d.ts.map +1 -0
  147. package/dist/esm/basic-chart/basic-chart.js +2343 -0
  148. package/dist/esm/basic-chart/helpers.d.ts +12 -0
  149. package/dist/esm/basic-chart/helpers.d.ts.map +1 -0
  150. package/dist/esm/basic-chart/helpers.js +98 -0
  151. package/dist/esm/basic-chart/index.d.ts +5 -0
  152. package/dist/esm/basic-chart/index.d.ts.map +1 -0
  153. package/dist/esm/basic-chart/index.js +7 -0
  154. package/dist/esm/components/dialogs/chart-editor-dialog.d.ts +5 -0
  155. package/dist/esm/components/dialogs/chart-editor-dialog.d.ts.map +1 -0
  156. package/dist/esm/components/dialogs/chart-editor-dialog.js +19 -0
  157. package/dist/esm/components/editors/chart-editor.d.ts +10 -0
  158. package/dist/esm/components/editors/chart-editor.d.ts.map +1 -0
  159. package/dist/esm/components/editors/chart-editor.js +550 -0
  160. package/dist/esm/components/editors/chart-range-input.d.ts +17 -0
  161. package/dist/esm/components/editors/chart-range-input.d.ts.map +1 -0
  162. package/dist/esm/components/editors/chart-range-input.js +10 -0
  163. package/dist/esm/config.d.ts +19 -0
  164. package/dist/esm/config.d.ts.map +1 -0
  165. package/dist/esm/config.js +161 -0
  166. package/dist/esm/hooks/use-chart-editor.d.ts +8 -0
  167. package/dist/esm/hooks/use-chart-editor.d.ts.map +1 -0
  168. package/dist/esm/hooks/use-chart-editor.js +32 -0
  169. package/dist/esm/hooks/use-charts.d.ts +35 -0
  170. package/dist/esm/hooks/use-charts.d.ts.map +1 -0
  171. package/dist/esm/hooks/use-charts.js +62 -0
  172. package/dist/esm/hooks/use-on-create-chart.d.ts +13 -0
  173. package/dist/esm/hooks/use-on-create-chart.d.ts.map +1 -0
  174. package/dist/esm/hooks/use-on-create-chart.js +19 -0
  175. package/dist/esm/hooks/use-on-delete-chart.d.ts +8 -0
  176. package/dist/esm/hooks/use-on-delete-chart.d.ts.map +1 -0
  177. package/dist/esm/hooks/use-on-delete-chart.js +14 -0
  178. package/dist/esm/hooks/use-on-move-chart.d.ts +8 -0
  179. package/dist/esm/hooks/use-on-move-chart.d.ts.map +1 -0
  180. package/dist/esm/hooks/use-on-move-chart.js +10 -0
  181. package/dist/esm/hooks/use-on-resize-chart.d.ts +8 -0
  182. package/dist/esm/hooks/use-on-resize-chart.d.ts.map +1 -0
  183. package/dist/esm/hooks/use-on-resize-chart.js +10 -0
  184. package/dist/esm/hooks/use-on-update-chart.d.ts +9 -0
  185. package/dist/esm/hooks/use-on-update-chart.d.ts.map +1 -0
  186. package/dist/esm/hooks/use-on-update-chart.js +10 -0
  187. package/dist/esm/index.d.ts +11 -0
  188. package/dist/esm/index.d.ts.map +1 -0
  189. package/dist/esm/index.js +13 -0
  190. package/dist/esm/interface/create-chart.d.ts +9 -0
  191. package/dist/esm/interface/create-chart.d.ts.map +1 -0
  192. package/dist/esm/interface/create-chart.js +126 -0
  193. package/dist/esm/interface/delete-chart.d.ts +4 -0
  194. package/dist/esm/interface/delete-chart.d.ts.map +1 -0
  195. package/dist/esm/interface/delete-chart.js +20 -0
  196. package/dist/esm/interface/move-chart.d.ts +5 -0
  197. package/dist/esm/interface/move-chart.d.ts.map +1 -0
  198. package/dist/esm/interface/move-chart.js +22 -0
  199. package/dist/esm/interface/resize-chart.d.ts +5 -0
  200. package/dist/esm/interface/resize-chart.d.ts.map +1 -0
  201. package/dist/esm/interface/resize-chart.js +24 -0
  202. package/dist/esm/interface/update-chart.d.ts +4 -0
  203. package/dist/esm/interface/update-chart.d.ts.map +1 -0
  204. package/dist/esm/interface/update-chart.js +26 -0
  205. package/dist/esm/plotly/basic-chart/basic-chart.d.ts +5 -0
  206. package/dist/esm/plotly/basic-chart/basic-chart.d.ts.map +1 -0
  207. package/dist/esm/plotly/basic-chart/basic-chart.js +1682 -0
  208. package/dist/esm/plotly/basic-chart/helpers.d.ts +20 -0
  209. package/dist/esm/plotly/basic-chart/helpers.d.ts.map +1 -0
  210. package/dist/esm/plotly/basic-chart/helpers.js +107 -0
  211. package/dist/esm/plotly/basic-chart/index.d.ts +5 -0
  212. package/dist/esm/plotly/basic-chart/index.d.ts.map +1 -0
  213. package/dist/esm/plotly/basic-chart/index.js +7 -0
  214. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
  215. package/dist/esm/types.d.ts +27 -0
  216. package/dist/esm/types.d.ts.map +1 -0
  217. package/dist/esm/types.js +1 -0
  218. package/dist/esm/utils/aggregation.d.ts +6 -0
  219. package/dist/esm/utils/aggregation.d.ts.map +1 -0
  220. package/dist/esm/utils/aggregation.js +96 -0
  221. package/dist/esm/utils/bar-layout.d.ts +57 -0
  222. package/dist/esm/utils/bar-layout.d.ts.map +1 -0
  223. package/dist/esm/utils/bar-layout.js +70 -0
  224. package/dist/esm/utils/boxplot.d.ts +62 -0
  225. package/dist/esm/utils/boxplot.d.ts.map +1 -0
  226. package/dist/esm/utils/boxplot.js +91 -0
  227. package/dist/esm/utils/bubble.d.ts +52 -0
  228. package/dist/esm/utils/bubble.d.ts.map +1 -0
  229. package/dist/esm/utils/bubble.js +122 -0
  230. package/dist/esm/utils/chart-spec-utils.d.ts +67 -0
  231. package/dist/esm/utils/chart-spec-utils.d.ts.map +1 -0
  232. package/dist/esm/utils/chart-spec-utils.js +270 -0
  233. package/dist/esm/utils/echarts-gl-loader.d.ts +11 -0
  234. package/dist/esm/utils/echarts-gl-loader.d.ts.map +1 -0
  235. package/dist/esm/utils/echarts-gl-loader.js +51 -0
  236. package/dist/esm/utils/error-bars.d.ts +58 -0
  237. package/dist/esm/utils/error-bars.d.ts.map +1 -0
  238. package/dist/esm/utils/error-bars.js +134 -0
  239. package/dist/esm/utils/gradient.d.ts +52 -0
  240. package/dist/esm/utils/gradient.d.ts.map +1 -0
  241. package/dist/esm/utils/gradient.js +84 -0
  242. package/dist/esm/utils/hierarchy.d.ts +28 -0
  243. package/dist/esm/utils/hierarchy.d.ts.map +1 -0
  244. package/dist/esm/utils/hierarchy.js +150 -0
  245. package/dist/esm/utils/histogram.d.ts +46 -0
  246. package/dist/esm/utils/histogram.d.ts.map +1 -0
  247. package/dist/esm/utils/histogram.js +95 -0
  248. package/dist/esm/utils/of-pie.d.ts +101 -0
  249. package/dist/esm/utils/of-pie.d.ts.map +1 -0
  250. package/dist/esm/utils/of-pie.js +141 -0
  251. package/dist/esm/utils/overrides.d.ts +12 -0
  252. package/dist/esm/utils/overrides.d.ts.map +1 -0
  253. package/dist/esm/utils/overrides.js +159 -0
  254. package/dist/esm/utils/radar.d.ts +37 -0
  255. package/dist/esm/utils/radar.d.ts.map +1 -0
  256. package/dist/esm/utils/radar.js +49 -0
  257. package/dist/esm/utils/region-map-loader.d.ts +22 -0
  258. package/dist/esm/utils/region-map-loader.d.ts.map +1 -0
  259. package/dist/esm/utils/region-map-loader.js +141 -0
  260. package/dist/esm/utils/region-map.d.ts +100 -0
  261. package/dist/esm/utils/region-map.d.ts.map +1 -0
  262. package/dist/esm/utils/region-map.js +266 -0
  263. package/dist/esm/utils/stock.d.ts +64 -0
  264. package/dist/esm/utils/stock.d.ts.map +1 -0
  265. package/dist/esm/utils/stock.js +123 -0
  266. package/dist/esm/utils/three-d.d.ts +96 -0
  267. package/dist/esm/utils/three-d.d.ts.map +1 -0
  268. package/dist/esm/utils/three-d.js +162 -0
  269. package/dist/esm/utils/trendline.d.ts +41 -0
  270. package/dist/esm/utils/trendline.d.ts.map +1 -0
  271. package/dist/esm/utils/trendline.js +257 -0
  272. package/dist/esm/utils/waterfall.d.ts +24 -0
  273. package/dist/esm/utils/waterfall.d.ts.map +1 -0
  274. package/dist/esm/utils/waterfall.js +55 -0
  275. package/dist/esm/utils/webgl.d.ts +12 -0
  276. package/dist/esm/utils/webgl.d.ts.map +1 -0
  277. package/dist/esm/utils/webgl.js +30 -0
  278. package/dist/esm/vitest.config.d.ts +3 -0
  279. package/dist/esm/vitest.config.d.ts.map +1 -0
  280. package/dist/esm/vitest.config.js +7 -0
  281. package/package.json +96 -0
@@ -0,0 +1,20 @@
1
+ import type { EmbeddedChart } from "@rowsncolumns/spreadsheet";
2
+ export declare const chartTypeToPlotlyType: (type: EmbeddedChart["spec"]["chartType"]) => string;
3
+ export declare const getPlotlyTraceStyle: (type: EmbeddedChart["spec"]["chartType"]) => {
4
+ mode: "lines";
5
+ fill?: undefined;
6
+ } | {
7
+ mode: "lines";
8
+ fill: "tozeroy";
9
+ } | {
10
+ mode?: undefined;
11
+ fill?: undefined;
12
+ };
13
+ /**
14
+ * Map OOXML `<c:marker><c:symbol val=…>` to plotly marker symbol names.
15
+ * OOXML symbols don't all have direct plotly equivalents — closest
16
+ * visual analog is used.
17
+ */
18
+ export declare const mapMarkerSymbolToPlotly: (symbol: string | undefined | null) => string | undefined;
19
+ export declare const showXAxis: (type: EmbeddedChart["spec"]["chartType"]) => boolean;
20
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../plotly/basic-chart/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,eAAO,MAAM,qBAAqB,GAChC,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,KACvC,MA+DF,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC;;;;;;;;;CAgBzC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,GAClC,QAAQ,MAAM,GAAG,SAAS,GAAG,IAAI,KAChC,MAAM,GAAG,SA0BX,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,YAejE,CAAC"}
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.showXAxis = exports.mapMarkerSymbolToPlotly = exports.getPlotlyTraceStyle = exports.chartTypeToPlotlyType = void 0;
4
+ var chartTypeToPlotlyType = function (type) {
5
+ switch (type) {
6
+ case "column":
7
+ return "bar";
8
+ case "line":
9
+ return "scatter";
10
+ case "area":
11
+ return "scatter";
12
+ case "bar":
13
+ return "bar";
14
+ case "pie":
15
+ return "pie";
16
+ case "treemap":
17
+ return "treemap";
18
+ case "sunburst":
19
+ return "sunburst";
20
+ case "bubble":
21
+ return "scatter";
22
+ case "scatter":
23
+ return "scatter";
24
+ case "histogram":
25
+ return "histogram";
26
+ case "boxplot":
27
+ return "box";
28
+ // Radar maps to plotly's polar scatter trace; the caller also sets a
29
+ // `polar` layout block. See basic-chart.tsx.
30
+ case "radar":
31
+ return "scatterpolar";
32
+ // Stock is rendered "line-derived" — each price role becomes its own
33
+ // scatter line trace. See basic-chart.tsx.
34
+ case "stock":
35
+ return "scatter";
36
+ case "waterfall":
37
+ return "waterfall";
38
+ case "funnel":
39
+ return "funnel";
40
+ // Combo defaults to bar; per-series seriesChartType overrides each
41
+ // trace independently. See chart-editor "Series type" selector.
42
+ case "combo":
43
+ return "bar";
44
+ // Region map (filled map) — plotly's built-in choropleth trace
45
+ // (plotly ships its own world geometry). See basic-chart.tsx.
46
+ case "regionMap":
47
+ return "choropleth";
48
+ default:
49
+ return "scatter";
50
+ }
51
+ };
52
+ exports.chartTypeToPlotlyType = chartTypeToPlotlyType;
53
+ var getPlotlyTraceStyle = function (type) {
54
+ switch (type) {
55
+ case "line":
56
+ return { mode: "lines" };
57
+ case "area":
58
+ return { mode: "lines", fill: "tozeroy" };
59
+ // Stock price roles render as plain lines.
60
+ case "stock":
61
+ return { mode: "lines" };
62
+ default:
63
+ return {};
64
+ }
65
+ };
66
+ exports.getPlotlyTraceStyle = getPlotlyTraceStyle;
67
+ /**
68
+ * Map OOXML `<c:marker><c:symbol val=…>` to plotly marker symbol names.
69
+ * OOXML symbols don't all have direct plotly equivalents — closest
70
+ * visual analog is used.
71
+ */
72
+ var mapMarkerSymbolToPlotly = function (symbol) {
73
+ switch (symbol) {
74
+ case "circle":
75
+ case "dot":
76
+ return "circle";
77
+ case "square":
78
+ return "square";
79
+ case "diamond":
80
+ return "diamond";
81
+ case "triangle":
82
+ return "triangle-up";
83
+ case "x":
84
+ return "x";
85
+ case "plus":
86
+ return "cross";
87
+ case "star":
88
+ return "star";
89
+ case "dash":
90
+ return "line-ew";
91
+ case "auto":
92
+ case undefined:
93
+ case null:
94
+ return undefined;
95
+ default:
96
+ return undefined;
97
+ }
98
+ };
99
+ exports.mapMarkerSymbolToPlotly = mapMarkerSymbolToPlotly;
100
+ var showXAxis = function (type) {
101
+ if (type === "line" ||
102
+ type === "area" ||
103
+ type === "bar" ||
104
+ type === "column" ||
105
+ type === "bubble" ||
106
+ type === "histogram" ||
107
+ // Stock is line-derived on a category x-axis. Radar is polar and
108
+ // does not use the cartesian x-axis.
109
+ type === "stock") {
110
+ return true;
111
+ }
112
+ return false;
113
+ };
114
+ exports.showXAxis = showXAxis;
@@ -0,0 +1,5 @@
1
+ import React from "react";
2
+ import type { EChartComponentProps } from "../../types";
3
+ export declare const ChartComponent: (props: EChartComponentProps) => React.JSX.Element;
4
+ export default ChartComponent;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../plotly/basic-chart/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGxD,eAAO,MAAM,cAAc,GAAI,OAAO,oBAAoB,sBAMzD,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ChartComponent = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var react_1 = tslib_1.__importDefault(require("react"));
6
+ var basic_chart_1 = require("./basic-chart");
7
+ var ChartComponent = function (props) {
8
+ return (react_1.default.createElement("div", { className: "shadow-lg bg-rnc-background flex-1 flex break-words flex-col" },
9
+ react_1.default.createElement(basic_chart_1.BasicChart, tslib_1.__assign({}, props))));
10
+ };
11
+ exports.ChartComponent = ChartComponent;
12
+ exports.default = exports.ChartComponent;
@@ -0,0 +1 @@
1
+ {"root":["../../config.ts","../../echarts-gl.d.ts","../../geo-modules.d.ts","../../index.ts","../../types.ts","../../vitest.config.ts","../../atoms/editing-chart.atom.ts","../../basic-chart/basic-chart.tsx","../../basic-chart/helpers.ts","../../basic-chart/index.tsx","../../components/dialogs/chart-editor-dialog.tsx","../../components/editors/chart-editor.tsx","../../components/editors/chart-range-input.tsx","../../hooks/use-chart-editor.ts","../../hooks/use-charts.ts","../../hooks/use-on-create-chart.ts","../../hooks/use-on-delete-chart.ts","../../hooks/use-on-move-chart.ts","../../hooks/use-on-resize-chart.ts","../../hooks/use-on-update-chart.ts","../../interface/create-chart.ts","../../interface/delete-chart.ts","../../interface/move-chart.ts","../../interface/resize-chart.ts","../../interface/update-chart.ts","../../plotly/basic-chart/basic-chart.tsx","../../plotly/basic-chart/helpers.ts","../../plotly/basic-chart/index.tsx","../../utils/aggregation.ts","../../utils/bar-layout.ts","../../utils/boxplot.ts","../../utils/bubble.ts","../../utils/chart-spec-utils.ts","../../utils/echarts-gl-loader.ts","../../utils/error-bars.ts","../../utils/gradient.ts","../../utils/hierarchy.ts","../../utils/histogram.ts","../../utils/of-pie.ts","../../utils/overrides.ts","../../utils/radar.ts","../../utils/region-map-loader.ts","../../utils/region-map.ts","../../utils/stock.ts","../../utils/three-d.ts","../../utils/trendline.ts","../../utils/waterfall.ts","../../utils/webgl.ts"],"version":"5.8.3"}
@@ -0,0 +1,27 @@
1
+ import type { ChartComponentProps, EmbeddedChart } from "@rowsncolumns/spreadsheet";
2
+ import type { useCalculation } from "@rowsncolumns/spreadsheet-state";
3
+ import type { useSpreadsheetState } from "@rowsncolumns/spreadsheet-state";
4
+ export type EChartComponentProps = ChartComponentProps & {
5
+ /**
6
+ * Dark mode
7
+ */
8
+ isDarkMode?: boolean;
9
+ /**
10
+ * Get all formatted values from a domain
11
+ */
12
+ getDomainValuesFromRange: ReturnType<typeof useSpreadsheetState>["getDomainValuesFromRange"];
13
+ /**
14
+ * Get all effective values from a series
15
+ */
16
+ getSeriesValuesFromRange: ReturnType<typeof useSpreadsheetState>["getSeriesValuesFromRange"];
17
+ /**
18
+ * Request edit chart
19
+ * @param chart
20
+ */
21
+ onRequestEdit?(chart: EmbeddedChart): void;
22
+ /**
23
+ * Callback to trigger a calculation request
24
+ */
25
+ onRequestCalculate: ReturnType<typeof useCalculation>["onRequestCalculate"];
26
+ };
27
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACd,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAE3E,MAAM,MAAM,oBAAoB,GAAG,mBAAmB,GAAG;IACvD;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,wBAAwB,EAAE,UAAU,CAClC,OAAO,mBAAmB,CAC3B,CAAC,0BAA0B,CAAC,CAAC;IAC9B;;OAEG;IACH,wBAAwB,EAAE,UAAU,CAClC,OAAO,mBAAmB,CAC3B,CAAC,0BAA0B,CAAC,CAAC;IAC9B;;;OAGG;IACH,aAAa,CAAC,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3C;;OAEG;IACH,kBAAkB,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,oBAAoB,CAAC,CAAC;CAC7E,CAAC"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,6 @@
1
+ import type { ChartAggregateType, ChartData } from "@rowsncolumns/spreadsheet";
2
+ export declare const sanitizeDomainValues: (values: (string | number | null | undefined)[]) => string[];
3
+ export declare const shouldAggregateSeries: (series?: ChartData[]) => boolean;
4
+ export declare const getDomainValuesForAxis: (domainValues: string[], aggregate: boolean) => string[];
5
+ export declare const aggregateSeriesByDomain: (rawDomainValues: string[], seriesValues: (string | number | boolean | undefined)[], aggregateType: ChartAggregateType, orderedDomainValues: string[]) => (number | null)[];
6
+ //# sourceMappingURL=aggregation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregation.d.ts","sourceRoot":"","sources":["../../../utils/aggregation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,SAAS,EACV,MAAM,2BAA2B,CAAC;AA0EnC,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,KAC7C,MAAM,EAA+B,CAAC;AAEzC,eAAO,MAAM,qBAAqB,GAAI,SAAS,SAAS,EAAE,KAAG,OAM5D,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,cAAc,MAAM,EAAE,EACtB,WAAW,OAAO,aACyC,CAAC;AAE9D,eAAO,MAAM,uBAAuB,GAClC,iBAAiB,MAAM,EAAE,EACzB,cAAc,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,EAAE,EACvD,eAAe,kBAAkB,EACjC,qBAAqB,MAAM,EAAE,KAC5B,CAAC,MAAM,GAAG,IAAI,CAAC,EA8BjB,CAAC"}
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.aggregateSeriesByDomain = exports.getDomainValuesForAxis = exports.shouldAggregateSeries = exports.sanitizeDomainValues = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var toDomainLabel = function (value) {
6
+ if (value === null || value === undefined) {
7
+ return "";
8
+ }
9
+ return String(value);
10
+ };
11
+ var toNumericValue = function (value) {
12
+ if (typeof value === "number" && Number.isFinite(value)) {
13
+ return value;
14
+ }
15
+ if (typeof value === "string") {
16
+ var parsed = Number(value);
17
+ return Number.isFinite(parsed) ? parsed : undefined;
18
+ }
19
+ if (typeof value === "boolean") {
20
+ return value ? 1 : 0;
21
+ }
22
+ return undefined;
23
+ };
24
+ var uniqueDomains = function (values) {
25
+ var e_1, _a;
26
+ var seen = new Set();
27
+ var ordered = [];
28
+ try {
29
+ for (var values_1 = tslib_1.__values(values), values_1_1 = values_1.next(); !values_1_1.done; values_1_1 = values_1.next()) {
30
+ var value = values_1_1.value;
31
+ if (!seen.has(value)) {
32
+ seen.add(value);
33
+ ordered.push(value);
34
+ }
35
+ }
36
+ }
37
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
38
+ finally {
39
+ try {
40
+ if (values_1_1 && !values_1_1.done && (_a = values_1.return)) _a.call(values_1);
41
+ }
42
+ finally { if (e_1) throw e_1.error; }
43
+ }
44
+ return ordered;
45
+ };
46
+ var median = function (values) {
47
+ var sorted = tslib_1.__spreadArray([], tslib_1.__read(values), false).sort(function (a, b) { return a - b; });
48
+ var mid = Math.floor(sorted.length / 2);
49
+ if (sorted.length % 2 === 0) {
50
+ return (sorted[mid - 1] + sorted[mid]) / 2;
51
+ }
52
+ return sorted[mid];
53
+ };
54
+ var aggregateValues = function (values, aggregateType) {
55
+ if (values.length === 0) {
56
+ return null;
57
+ }
58
+ switch (aggregateType) {
59
+ case "SUM":
60
+ return values.reduce(function (total, value) { return total + value; }, 0);
61
+ case "AVERAGE": {
62
+ var sum = values.reduce(function (total, value) { return total + value; }, 0);
63
+ return sum / values.length;
64
+ }
65
+ case "COUNT":
66
+ return values.length;
67
+ case "MAX":
68
+ return Math.max.apply(Math, tslib_1.__spreadArray([], tslib_1.__read(values), false));
69
+ case "MIN":
70
+ return Math.min.apply(Math, tslib_1.__spreadArray([], tslib_1.__read(values), false));
71
+ case "MEDIAN":
72
+ return median(values);
73
+ default:
74
+ return null;
75
+ }
76
+ };
77
+ var sanitizeDomainValues = function (values) { return values.map(toDomainLabel); };
78
+ exports.sanitizeDomainValues = sanitizeDomainValues;
79
+ var shouldAggregateSeries = function (series) {
80
+ if (!series || series.length === 0) {
81
+ return false;
82
+ }
83
+ return series.every(function (item) { return !!item.aggregateType; });
84
+ };
85
+ exports.shouldAggregateSeries = shouldAggregateSeries;
86
+ var getDomainValuesForAxis = function (domainValues, aggregate) { return (aggregate ? uniqueDomains(domainValues) : domainValues); };
87
+ exports.getDomainValuesForAxis = getDomainValuesForAxis;
88
+ var aggregateSeriesByDomain = function (rawDomainValues, seriesValues, aggregateType, orderedDomainValues) {
89
+ var e_2, _a;
90
+ var grouped = new Map();
91
+ try {
92
+ for (var orderedDomainValues_1 = tslib_1.__values(orderedDomainValues), orderedDomainValues_1_1 = orderedDomainValues_1.next(); !orderedDomainValues_1_1.done; orderedDomainValues_1_1 = orderedDomainValues_1.next()) {
93
+ var domain = orderedDomainValues_1_1.value;
94
+ grouped.set(domain, []);
95
+ }
96
+ }
97
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
98
+ finally {
99
+ try {
100
+ if (orderedDomainValues_1_1 && !orderedDomainValues_1_1.done && (_a = orderedDomainValues_1.return)) _a.call(orderedDomainValues_1);
101
+ }
102
+ finally { if (e_2) throw e_2.error; }
103
+ }
104
+ rawDomainValues.forEach(function (domainValue, index) {
105
+ var currentGroup = grouped.get(domainValue);
106
+ if (!currentGroup) {
107
+ return;
108
+ }
109
+ if (aggregateType === "COUNT") {
110
+ var source = seriesValues[index];
111
+ if (source !== undefined && source !== null && source !== "") {
112
+ currentGroup.push(1);
113
+ }
114
+ return;
115
+ }
116
+ var numericValue = toNumericValue(seriesValues[index]);
117
+ if (numericValue !== undefined) {
118
+ currentGroup.push(numericValue);
119
+ }
120
+ });
121
+ return orderedDomainValues.map(function (domain) {
122
+ var _a;
123
+ var values = (_a = grouped.get(domain)) !== null && _a !== void 0 ? _a : [];
124
+ return aggregateValues(values, aggregateType);
125
+ });
126
+ };
127
+ exports.aggregateSeriesByDomain = aggregateSeriesByDomain;
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Bar/column layout mapping — Excel `<c:overlap>` / `<c:gapWidth>` to
3
+ * echarts `barGap` / `barCategoryGap`.
4
+ *
5
+ * Excel semantics:
6
+ * - `overlap` (-100..100): how much adjacent bars *within* a category
7
+ * cluster overlap, as a percentage of one bar's width. 100 = bars
8
+ * fully stacked on the same X slot, 0 = side-by-side touching,
9
+ * -100 = a full bar-width gap between them.
10
+ * - `gapWidth` (0..500): the gap *between* category clusters, as a
11
+ * percentage of one bar's width. Excel default is 150.
12
+ *
13
+ * echarts semantics:
14
+ * - `barGap` ("<p>%"): gap between bars of different series in the same
15
+ * category, as a percentage of the bar width. Negative values overlap
16
+ * ("-100%" = fully overlapped).
17
+ * - `barCategoryGap` ("<p>%"): the gap reserved for each category slot,
18
+ * as a percentage of the *band width* (the whole category slot), i.e.
19
+ * `barWidth = (band - categoryGap) / (n + (n - 1) * barGapPercent)`.
20
+ */
21
+ type MaybeNumber = number | null | undefined;
22
+ /**
23
+ * Map Excel series overlap (-100..100) to an echarts `barGap`
24
+ * percentage string.
25
+ *
26
+ * Both express the same quantity in bar-width units with opposite
27
+ * sign conventions (Excel measures overlap, echarts measures gap), so
28
+ * the mapping is a negation:
29
+ * overlap 100 → barGap "-100%" (fully overlapped)
30
+ * overlap 0 → barGap "0%" (touching)
31
+ * overlap -100 → barGap "100%" (one bar-width gap)
32
+ *
33
+ * Returns undefined when overlap is unset so echarts keeps its own
34
+ * default ("30%").
35
+ */
36
+ export declare const overlapToBarGap: (overlap?: MaybeNumber) => string | undefined;
37
+ /**
38
+ * Map Excel `gapWidth` (0..500, % of bar width) to an echarts
39
+ * `barCategoryGap` percentage string (% of the category band width).
40
+ *
41
+ * Derivation — measure the whole band in bar-width units:
42
+ * bars + in-cluster gaps: n - (n - 1) * overlap / 100
43
+ * category gap: gapWidth / 100
44
+ * so the gap's share of the band is
45
+ * gapWidth / (100 * n - (n - 1) * overlap + gapWidth)
46
+ * e.g. one series with the Excel default gapWidth=150 → 150/250 = "60%".
47
+ *
48
+ * `seriesCount` is the number of side-by-side bars per category (1 for
49
+ * stacked charts, where all series share one slot). Returns undefined
50
+ * when gapWidth is unset so echarts keeps its default ("20%").
51
+ */
52
+ export declare const gapWidthToBarCategoryGap: (gapWidth?: MaybeNumber, options?: {
53
+ seriesCount?: number;
54
+ overlap?: MaybeNumber;
55
+ }) => string | undefined;
56
+ export {};
57
+ //# sourceMappingURL=bar-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bar-layout.d.ts","sourceRoot":"","sources":["../../../utils/bar-layout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,KAAK,WAAW,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;AAQ7C;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,eAAe,GAAI,UAAU,WAAW,KAAG,MAAM,GAAG,SAGhE,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,wBAAwB,GACnC,WAAW,WAAW,EACtB,UAAS;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,WAAW,CAAA;CAAO,KAC5D,MAAM,GAAG,SAWX,CAAC"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ /**
3
+ * Bar/column layout mapping — Excel `<c:overlap>` / `<c:gapWidth>` to
4
+ * echarts `barGap` / `barCategoryGap`.
5
+ *
6
+ * Excel semantics:
7
+ * - `overlap` (-100..100): how much adjacent bars *within* a category
8
+ * cluster overlap, as a percentage of one bar's width. 100 = bars
9
+ * fully stacked on the same X slot, 0 = side-by-side touching,
10
+ * -100 = a full bar-width gap between them.
11
+ * - `gapWidth` (0..500): the gap *between* category clusters, as a
12
+ * percentage of one bar's width. Excel default is 150.
13
+ *
14
+ * echarts semantics:
15
+ * - `barGap` ("<p>%"): gap between bars of different series in the same
16
+ * category, as a percentage of the bar width. Negative values overlap
17
+ * ("-100%" = fully overlapped).
18
+ * - `barCategoryGap` ("<p>%"): the gap reserved for each category slot,
19
+ * as a percentage of the *band width* (the whole category slot), i.e.
20
+ * `barWidth = (band - categoryGap) / (n + (n - 1) * barGapPercent)`.
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.gapWidthToBarCategoryGap = exports.overlapToBarGap = void 0;
24
+ var clamp = function (value, min, max) {
25
+ return Math.max(min, Math.min(max, value));
26
+ };
27
+ var isFiniteNumber = function (value) {
28
+ return typeof value === "number" && Number.isFinite(value);
29
+ };
30
+ /**
31
+ * Map Excel series overlap (-100..100) to an echarts `barGap`
32
+ * percentage string.
33
+ *
34
+ * Both express the same quantity in bar-width units with opposite
35
+ * sign conventions (Excel measures overlap, echarts measures gap), so
36
+ * the mapping is a negation:
37
+ * overlap 100 → barGap "-100%" (fully overlapped)
38
+ * overlap 0 → barGap "0%" (touching)
39
+ * overlap -100 → barGap "100%" (one bar-width gap)
40
+ *
41
+ * Returns undefined when overlap is unset so echarts keeps its own
42
+ * default ("30%").
43
+ */
44
+ var overlapToBarGap = function (overlap) {
45
+ if (!isFiniteNumber(overlap))
46
+ return undefined;
47
+ return "".concat(-clamp(overlap, -100, 100), "%");
48
+ };
49
+ exports.overlapToBarGap = overlapToBarGap;
50
+ /**
51
+ * Map Excel `gapWidth` (0..500, % of bar width) to an echarts
52
+ * `barCategoryGap` percentage string (% of the category band width).
53
+ *
54
+ * Derivation — measure the whole band in bar-width units:
55
+ * bars + in-cluster gaps: n - (n - 1) * overlap / 100
56
+ * category gap: gapWidth / 100
57
+ * so the gap's share of the band is
58
+ * gapWidth / (100 * n - (n - 1) * overlap + gapWidth)
59
+ * e.g. one series with the Excel default gapWidth=150 → 150/250 = "60%".
60
+ *
61
+ * `seriesCount` is the number of side-by-side bars per category (1 for
62
+ * stacked charts, where all series share one slot). Returns undefined
63
+ * when gapWidth is unset so echarts keeps its default ("20%").
64
+ */
65
+ var gapWidthToBarCategoryGap = function (gapWidth, options) {
66
+ var _a;
67
+ if (options === void 0) { options = {}; }
68
+ if (!isFiniteNumber(gapWidth))
69
+ return undefined;
70
+ var gap = clamp(gapWidth, 0, 500);
71
+ var seriesCount = Math.max(1, Math.floor((_a = options.seriesCount) !== null && _a !== void 0 ? _a : 1));
72
+ var overlap = isFiniteNumber(options.overlap)
73
+ ? clamp(options.overlap, -100, 100)
74
+ : 0;
75
+ var band = 100 * seriesCount - (seriesCount - 1) * overlap + gap;
76
+ if (band <= 0)
77
+ return undefined;
78
+ var percent = (100 * gap) / band;
79
+ return "".concat(Math.round(percent * 100) / 100, "%");
80
+ };
81
+ exports.gapWidthToBarCategoryGap = gapWidthToBarCategoryGap;
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Box-and-whisker statistics shared by chart renderers.
3
+ *
4
+ * Plotly's box trace computes quartiles itself from raw values.
5
+ * Echarts' boxplot series requires pre-computed [min, Q1, median, Q3, max]
6
+ * tuples per box; this helper produces that shape.
7
+ */
8
+ export type BoxplotStats = [number, number, number, number, number];
9
+ /**
10
+ * Quartile computation method, mirroring Excel's box & whisker
11
+ * "quartile calculation" option:
12
+ * - "inclusive" — QUARTILE.INC: linear interpolation over positions
13
+ * `(n - 1) * q` (median included in both halves).
14
+ * - "exclusive" — QUARTILE.EXC: linear interpolation over positions
15
+ * `(n + 1) * q` (median excluded), Tukey-style hinges.
16
+ */
17
+ export type QuartileMethod = "inclusive" | "exclusive";
18
+ /**
19
+ * QUARTILE.INC — linear interpolation at position `(n - 1) * q`
20
+ * (0-indexed). Identical to the interpolation echarts' built-in
21
+ * boxplot transform uses.
22
+ */
23
+ export declare const quartileInc: (sorted: number[], q: number) => number;
24
+ /**
25
+ * QUARTILE.EXC — linear interpolation at 1-indexed position
26
+ * `(n + 1) * q`. Excel returns #NUM! when the position falls outside
27
+ * `[1, n]` (tiny samples); for charting we clamp to the nearest order
28
+ * statistic instead so every box still renders.
29
+ */
30
+ export declare const quartileExc: (sorted: number[], q: number) => number;
31
+ /**
32
+ * Full box-and-whisker summary. Quartiles follow the requested method
33
+ * ("inclusive" when omitted — the same interpolation
34
+ * `computeBoxplotStats` has always used). Outliers are points beyond
35
+ * the Tukey fences `Q1 - 1.5×IQR` / `Q3 + 1.5×IQR`; the whisker ends
36
+ * are the most extreme data points still inside the fences (Excel's
37
+ * behavior when "show outlier points" is on).
38
+ */
39
+ export type BoxplotSummary = {
40
+ min: number;
41
+ q1: number;
42
+ median: number;
43
+ q3: number;
44
+ max: number;
45
+ mean: number;
46
+ /** Smallest data point >= Q1 - 1.5×IQR. */
47
+ lowerWhisker: number;
48
+ /** Largest data point <= Q3 + 1.5×IQR. */
49
+ upperWhisker: number;
50
+ /** Data points outside the 1.5×IQR fences, ascending. */
51
+ outliers: number[];
52
+ };
53
+ export declare const computeBoxplotSummary: (values: (number | null | undefined)[], options?: {
54
+ quartileMethod?: QuartileMethod | null;
55
+ }) => BoxplotSummary | null;
56
+ /**
57
+ * Compute [min, Q1, median, Q3, max] using linear interpolation between
58
+ * order statistics — matches echarts' built-in `dataset.transform: 'boxplot'`
59
+ * behavior.
60
+ */
61
+ export declare const computeBoxplotStats: (values: (number | null | undefined)[]) => BoxplotStats | null;
62
+ //# sourceMappingURL=boxplot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boxplot.d.ts","sourceRoot":"","sources":["../../../utils/boxplot.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpE;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,WAAW,CAAC;AAUvD;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,EAAE,EAAE,GAAG,MAAM,KAAG,MACrC,CAAC;AAEtB;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,EAAE,EAAE,GAAG,MAAM,KAAG,MAQzD,CAAC;AAeF;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,QAAQ,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,EACrC,UAAU;IAAE,cAAc,CAAC,EAAE,cAAc,GAAG,IAAI,CAAA;CAAE,KACnD,cAAc,GAAG,IA0BnB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAC9B,QAAQ,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,KACpC,YAAY,GAAG,IAejB,CAAC"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ /**
3
+ * Box-and-whisker statistics shared by chart renderers.
4
+ *
5
+ * Plotly's box trace computes quartiles itself from raw values.
6
+ * Echarts' boxplot series requires pre-computed [min, Q1, median, Q3, max]
7
+ * tuples per box; this helper produces that shape.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.computeBoxplotStats = exports.computeBoxplotSummary = exports.quartileExc = exports.quartileInc = void 0;
11
+ var quantile = function (sorted, q) {
12
+ var idx = (sorted.length - 1) * q;
13
+ var lo = Math.floor(idx);
14
+ var hi = Math.ceil(idx);
15
+ if (lo === hi)
16
+ return sorted[lo];
17
+ return sorted[lo] + (sorted[hi] - sorted[lo]) * (idx - lo);
18
+ };
19
+ /**
20
+ * QUARTILE.INC — linear interpolation at position `(n - 1) * q`
21
+ * (0-indexed). Identical to the interpolation echarts' built-in
22
+ * boxplot transform uses.
23
+ */
24
+ var quartileInc = function (sorted, q) {
25
+ return quantile(sorted, q);
26
+ };
27
+ exports.quartileInc = quartileInc;
28
+ /**
29
+ * QUARTILE.EXC — linear interpolation at 1-indexed position
30
+ * `(n + 1) * q`. Excel returns #NUM! when the position falls outside
31
+ * `[1, n]` (tiny samples); for charting we clamp to the nearest order
32
+ * statistic instead so every box still renders.
33
+ */
34
+ var quartileExc = function (sorted, q) {
35
+ var n = sorted.length;
36
+ var pos = (n + 1) * q; // 1-indexed
37
+ if (pos <= 1)
38
+ return sorted[0];
39
+ if (pos >= n)
40
+ return sorted[n - 1];
41
+ var lo = Math.floor(pos);
42
+ var frac = pos - lo;
43
+ return sorted[lo - 1] + (sorted[lo] - sorted[lo - 1]) * frac;
44
+ };
45
+ exports.quartileExc = quartileExc;
46
+ var quartile = function (sorted, q, method) {
47
+ return method === "exclusive" ? (0, exports.quartileExc)(sorted, q) : (0, exports.quartileInc)(sorted, q);
48
+ };
49
+ var toSortedNumeric = function (values) {
50
+ return values
51
+ .filter(function (v) { return typeof v === "number" && Number.isFinite(v); })
52
+ .slice()
53
+ .sort(function (a, b) { return a - b; });
54
+ };
55
+ var computeBoxplotSummary = function (values, options) {
56
+ var _a;
57
+ var numeric = toSortedNumeric(values);
58
+ if (numeric.length === 0)
59
+ return null;
60
+ var method = (_a = options === null || options === void 0 ? void 0 : options.quartileMethod) !== null && _a !== void 0 ? _a : "inclusive";
61
+ var q1 = quartile(numeric, 0.25, method);
62
+ var median = quartile(numeric, 0.5, method);
63
+ var q3 = quartile(numeric, 0.75, method);
64
+ var iqr = q3 - q1;
65
+ var lowerFence = q1 - 1.5 * iqr;
66
+ var upperFence = q3 + 1.5 * iqr;
67
+ var inliers = numeric.filter(function (v) { return v >= lowerFence && v <= upperFence; });
68
+ var outliers = numeric.filter(function (v) { return v < lowerFence || v > upperFence; });
69
+ var mean = numeric.reduce(function (sum, v) { return sum + v; }, 0) / numeric.length;
70
+ return {
71
+ min: numeric[0],
72
+ q1: q1,
73
+ median: median,
74
+ q3: q3,
75
+ max: numeric[numeric.length - 1],
76
+ mean: mean,
77
+ // Degenerate fences (all points outliers) can't happen — Q1/Q3 are
78
+ // always inside [min, max] — so inliers is never empty.
79
+ lowerWhisker: inliers[0],
80
+ upperWhisker: inliers[inliers.length - 1],
81
+ outliers: outliers,
82
+ };
83
+ };
84
+ exports.computeBoxplotSummary = computeBoxplotSummary;
85
+ /**
86
+ * Compute [min, Q1, median, Q3, max] using linear interpolation between
87
+ * order statistics — matches echarts' built-in `dataset.transform: 'boxplot'`
88
+ * behavior.
89
+ */
90
+ var computeBoxplotStats = function (values) {
91
+ var numeric = values
92
+ .filter(function (v) { return typeof v === "number" && Number.isFinite(v); })
93
+ .slice()
94
+ .sort(function (a, b) { return a - b; });
95
+ if (numeric.length === 0)
96
+ return null;
97
+ return [
98
+ numeric[0],
99
+ quantile(numeric, 0.25),
100
+ quantile(numeric, 0.5),
101
+ quantile(numeric, 0.75),
102
+ numeric[numeric.length - 1],
103
+ ];
104
+ };
105
+ exports.computeBoxplotStats = computeBoxplotStats;