minerva-design 1.5.0 → 1.6.1

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 (477) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/custom-elements.json +122 -5
  3. package/dist/angular/fesm2022/minerva-angular.mjs +55 -0
  4. package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
  5. package/dist/angular/types/minerva-angular.d.ts +23 -2
  6. package/dist/charts/canvas.d.cts +2 -1
  7. package/dist/charts/canvas.d.ts +2 -1
  8. package/dist/charts/core.d.cts +1 -1
  9. package/dist/charts/core.d.ts +1 -1
  10. package/dist/charts/engine/canvas.cjs +1 -1
  11. package/dist/charts/engine/canvas.cjs.map +1 -1
  12. package/dist/charts/engine/canvas.js +2 -1
  13. package/dist/charts/engine/canvas.js.map +1 -1
  14. package/dist/charts/engine/chart.cjs +1 -1
  15. package/dist/charts/engine/chart.cjs.map +1 -1
  16. package/dist/charts/engine/chart.js +144 -143
  17. package/dist/charts/engine/chart.js.map +1 -1
  18. package/dist/charts/engine/controller.cjs +2 -2
  19. package/dist/charts/engine/controller.cjs.map +1 -1
  20. package/dist/charts/engine/controller.d.cts +3 -1
  21. package/dist/charts/engine/controller.d.ts +3 -1
  22. package/dist/charts/engine/controller.js +130 -132
  23. package/dist/charts/engine/controller.js.map +1 -1
  24. package/dist/charts/engine/data.cjs +1 -1
  25. package/dist/charts/engine/data.cjs.map +1 -1
  26. package/dist/charts/engine/data.d.cts +2 -0
  27. package/dist/charts/engine/data.d.ts +2 -0
  28. package/dist/charts/engine/data.js +6 -4
  29. package/dist/charts/engine/data.js.map +1 -1
  30. package/dist/charts/engine/defaults.cjs +1 -1
  31. package/dist/charts/engine/defaults.cjs.map +1 -1
  32. package/dist/charts/engine/defaults.d.cts +4 -4
  33. package/dist/charts/engine/defaults.d.ts +4 -4
  34. package/dist/charts/engine/defaults.js +22 -18
  35. package/dist/charts/engine/defaults.js.map +1 -1
  36. package/dist/charts/engine/graph/chart.cjs +1 -1
  37. package/dist/charts/engine/graph/chart.cjs.map +1 -1
  38. package/dist/charts/engine/graph/chart.js +798 -616
  39. package/dist/charts/engine/graph/chart.js.map +1 -1
  40. package/dist/charts/engine/graph/dag.cjs +1 -1
  41. package/dist/charts/engine/graph/dag.cjs.map +1 -1
  42. package/dist/charts/engine/graph/dag.js +191 -166
  43. package/dist/charts/engine/graph/dag.js.map +1 -1
  44. package/dist/charts/engine/graph/force.cjs +1 -1
  45. package/dist/charts/engine/graph/force.cjs.map +1 -1
  46. package/dist/charts/engine/graph/force.d.cts +9 -0
  47. package/dist/charts/engine/graph/force.d.ts +9 -0
  48. package/dist/charts/engine/graph/force.js +279 -181
  49. package/dist/charts/engine/graph/force.js.map +1 -1
  50. package/dist/charts/engine/graph/geometry.cjs +1 -1
  51. package/dist/charts/engine/graph/geometry.cjs.map +1 -1
  52. package/dist/charts/engine/graph/geometry.d.cts +26 -3
  53. package/dist/charts/engine/graph/geometry.d.ts +26 -3
  54. package/dist/charts/engine/graph/geometry.js +92 -35
  55. package/dist/charts/engine/graph/geometry.js.map +1 -1
  56. package/dist/charts/engine/graph/model.cjs +1 -1
  57. package/dist/charts/engine/graph/model.cjs.map +1 -1
  58. package/dist/charts/engine/graph/model.d.cts +9 -0
  59. package/dist/charts/engine/graph/model.d.ts +9 -0
  60. package/dist/charts/engine/graph/model.js +63 -43
  61. package/dist/charts/engine/graph/model.js.map +1 -1
  62. package/dist/charts/engine/graph/types.d.cts +14 -0
  63. package/dist/charts/engine/graph/types.d.ts +14 -0
  64. package/dist/charts/engine/graph/worker.cjs +12 -6
  65. package/dist/charts/engine/graph/worker.cjs.map +1 -1
  66. package/dist/charts/engine/graph/worker.js +12 -6
  67. package/dist/charts/engine/graph/worker.js.map +1 -1
  68. package/dist/charts/engine/labels.cjs.map +1 -1
  69. package/dist/charts/engine/labels.d.cts +17 -0
  70. package/dist/charts/engine/labels.d.ts +17 -0
  71. package/dist/charts/engine/labels.js.map +1 -1
  72. package/dist/charts/engine/model.cjs +1 -1
  73. package/dist/charts/engine/model.cjs.map +1 -1
  74. package/dist/charts/engine/model.d.cts +33 -0
  75. package/dist/charts/engine/model.d.ts +33 -0
  76. package/dist/charts/engine/model.js +172 -128
  77. package/dist/charts/engine/model.js.map +1 -1
  78. package/dist/charts/engine/orderbook/field.cjs +37 -0
  79. package/dist/charts/engine/orderbook/field.cjs.map +1 -0
  80. package/dist/charts/engine/orderbook/field.d.cts +105 -0
  81. package/dist/charts/engine/orderbook/field.d.ts +105 -0
  82. package/dist/charts/engine/orderbook/field.js +309 -0
  83. package/dist/charts/engine/orderbook/field.js.map +1 -0
  84. package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
  85. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
  86. package/dist/charts/engine/orderbook/heatmap.d.cts +12 -0
  87. package/dist/charts/engine/orderbook/heatmap.d.ts +12 -0
  88. package/dist/charts/engine/orderbook/heatmap.js +560 -527
  89. package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
  90. package/dist/charts/engine/orderbook/host.cjs +1 -1
  91. package/dist/charts/engine/orderbook/host.cjs.map +1 -1
  92. package/dist/charts/engine/orderbook/host.d.cts +8 -1
  93. package/dist/charts/engine/orderbook/host.d.ts +8 -1
  94. package/dist/charts/engine/orderbook/host.js +27 -5
  95. package/dist/charts/engine/orderbook/host.js.map +1 -1
  96. package/dist/charts/engine/orderbook/ladder.cjs +1 -1
  97. package/dist/charts/engine/orderbook/ladder.cjs.map +1 -1
  98. package/dist/charts/engine/orderbook/ladder.js +1 -1
  99. package/dist/charts/engine/orderbook/ladder.js.map +1 -1
  100. package/dist/charts/engine/orderbook/layout.cjs +1 -1
  101. package/dist/charts/engine/orderbook/layout.cjs.map +1 -1
  102. package/dist/charts/engine/orderbook/layout.d.cts +5 -0
  103. package/dist/charts/engine/orderbook/layout.d.ts +5 -0
  104. package/dist/charts/engine/orderbook/layout.js +8 -2
  105. package/dist/charts/engine/orderbook/layout.js.map +1 -1
  106. package/dist/charts/engine/orderbook/tape.cjs +1 -1
  107. package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
  108. package/dist/charts/engine/orderbook/tape.js +3 -3
  109. package/dist/charts/engine/orderbook/tape.js.map +1 -1
  110. package/dist/charts/engine/orderbook/types.d.cts +33 -13
  111. package/dist/charts/engine/orderbook/types.d.ts +33 -13
  112. package/dist/charts/engine/overlay.cjs +1 -1
  113. package/dist/charts/engine/overlay.cjs.map +1 -1
  114. package/dist/charts/engine/overlay.d.cts +17 -0
  115. package/dist/charts/engine/overlay.d.ts +17 -0
  116. package/dist/charts/engine/overlay.js +29 -13
  117. package/dist/charts/engine/overlay.js.map +1 -1
  118. package/dist/charts/engine/presets.cjs +1 -1
  119. package/dist/charts/engine/presets.cjs.map +1 -1
  120. package/dist/charts/engine/presets.d.cts +27 -4
  121. package/dist/charts/engine/presets.d.ts +27 -4
  122. package/dist/charts/engine/presets.js +42 -26
  123. package/dist/charts/engine/presets.js.map +1 -1
  124. package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
  125. package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
  126. package/dist/charts/engine/renderers/canvas2d.js +13 -9
  127. package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
  128. package/dist/charts/engine/renderers/follow.cjs +2 -0
  129. package/dist/charts/engine/renderers/follow.cjs.map +1 -0
  130. package/dist/charts/engine/renderers/follow.d.cts +8 -0
  131. package/dist/charts/engine/renderers/follow.d.ts +8 -0
  132. package/dist/charts/engine/renderers/follow.js +10 -0
  133. package/dist/charts/engine/renderers/follow.js.map +1 -0
  134. package/dist/charts/engine/renderers/gl-budget.cjs +2 -0
  135. package/dist/charts/engine/renderers/gl-budget.cjs.map +1 -0
  136. package/dist/charts/engine/renderers/gl-budget.d.cts +32 -0
  137. package/dist/charts/engine/renderers/gl-budget.d.ts +32 -0
  138. package/dist/charts/engine/renderers/gl-budget.js +95 -0
  139. package/dist/charts/engine/renderers/gl-budget.js.map +1 -0
  140. package/dist/charts/engine/renderers/gl.cjs +1 -1
  141. package/dist/charts/engine/renderers/gl.cjs.map +1 -1
  142. package/dist/charts/engine/renderers/gl.js +1 -1
  143. package/dist/charts/engine/renderers/gl.js.map +1 -1
  144. package/dist/charts/engine/renderers/shaders.cjs +9 -6
  145. package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
  146. package/dist/charts/engine/renderers/shaders.d.cts +1 -1
  147. package/dist/charts/engine/renderers/shaders.d.ts +1 -1
  148. package/dist/charts/engine/renderers/shaders.js +9 -6
  149. package/dist/charts/engine/renderers/shaders.js.map +1 -1
  150. package/dist/charts/engine/renderers/types.cjs.map +1 -1
  151. package/dist/charts/engine/renderers/types.d.cts +2 -0
  152. package/dist/charts/engine/renderers/types.d.ts +2 -0
  153. package/dist/charts/engine/renderers/types.js.map +1 -1
  154. package/dist/charts/engine/renderers/webgl.cjs +1 -1
  155. package/dist/charts/engine/renderers/webgl.cjs.map +1 -1
  156. package/dist/charts/engine/renderers/webgl.js +85 -64
  157. package/dist/charts/engine/renderers/webgl.js.map +1 -1
  158. package/dist/charts/engine/renderers/webgl2.cjs +1 -1
  159. package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
  160. package/dist/charts/engine/renderers/webgl2.js +72 -58
  161. package/dist/charts/engine/renderers/webgl2.js.map +1 -1
  162. package/dist/charts/engine/renderers/webgpu.cjs +1 -1
  163. package/dist/charts/engine/renderers/webgpu.cjs.map +1 -1
  164. package/dist/charts/engine/renderers/webgpu.js +1 -1
  165. package/dist/charts/engine/renderers/webgpu.js.map +1 -1
  166. package/dist/charts/engine/scene.cjs +1 -1
  167. package/dist/charts/engine/scene.cjs.map +1 -1
  168. package/dist/charts/engine/scene.d.cts +53 -4
  169. package/dist/charts/engine/scene.d.ts +53 -4
  170. package/dist/charts/engine/scene.js +265 -121
  171. package/dist/charts/engine/scene.js.map +1 -1
  172. package/dist/charts/engine/shapes/chord.cjs +1 -1
  173. package/dist/charts/engine/shapes/chord.cjs.map +1 -1
  174. package/dist/charts/engine/shapes/chord.js +108 -103
  175. package/dist/charts/engine/shapes/chord.js.map +1 -1
  176. package/dist/charts/engine/shapes/types.d.cts +5 -3
  177. package/dist/charts/engine/shapes/types.d.ts +5 -3
  178. package/dist/charts/engine/three-d/canvas2d.cjs +1 -1
  179. package/dist/charts/engine/three-d/canvas2d.cjs.map +1 -1
  180. package/dist/charts/engine/three-d/canvas2d.d.cts +36 -1
  181. package/dist/charts/engine/three-d/canvas2d.d.ts +36 -1
  182. package/dist/charts/engine/three-d/canvas2d.js +155 -80
  183. package/dist/charts/engine/three-d/canvas2d.js.map +1 -1
  184. package/dist/charts/engine/three-d/chart.cjs +1 -1
  185. package/dist/charts/engine/three-d/chart.cjs.map +1 -1
  186. package/dist/charts/engine/three-d/chart.js +219 -215
  187. package/dist/charts/engine/three-d/chart.js.map +1 -1
  188. package/dist/charts/engine/three-d/oit.cjs +194 -0
  189. package/dist/charts/engine/three-d/oit.cjs.map +1 -0
  190. package/dist/charts/engine/three-d/oit.d.cts +89 -0
  191. package/dist/charts/engine/three-d/oit.d.ts +89 -0
  192. package/dist/charts/engine/three-d/oit.js +196 -0
  193. package/dist/charts/engine/three-d/oit.js.map +1 -0
  194. package/dist/charts/engine/three-d/render-types.cjs +1 -1
  195. package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
  196. package/dist/charts/engine/three-d/render-types.d.cts +35 -3
  197. package/dist/charts/engine/three-d/render-types.d.ts +35 -3
  198. package/dist/charts/engine/three-d/render-types.js +6 -9
  199. package/dist/charts/engine/three-d/render-types.js.map +1 -1
  200. package/dist/charts/engine/three-d/shaders.cjs +60 -26
  201. package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
  202. package/dist/charts/engine/three-d/shaders.d.cts +16 -3
  203. package/dist/charts/engine/three-d/shaders.d.ts +16 -3
  204. package/dist/charts/engine/three-d/shaders.js +100 -42
  205. package/dist/charts/engine/three-d/shaders.js.map +1 -1
  206. package/dist/charts/engine/three-d/sort.cjs +1 -1
  207. package/dist/charts/engine/three-d/sort.cjs.map +1 -1
  208. package/dist/charts/engine/three-d/sort.d.cts +6 -4
  209. package/dist/charts/engine/three-d/sort.d.ts +6 -4
  210. package/dist/charts/engine/three-d/sort.js +51 -39
  211. package/dist/charts/engine/three-d/sort.js.map +1 -1
  212. package/dist/charts/engine/three-d/types.d.cts +9 -0
  213. package/dist/charts/engine/three-d/types.d.ts +9 -0
  214. package/dist/charts/engine/three-d/webgl.cjs +1 -1
  215. package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
  216. package/dist/charts/engine/three-d/webgl.d.cts +9 -0
  217. package/dist/charts/engine/three-d/webgl.d.ts +9 -0
  218. package/dist/charts/engine/three-d/webgl.js +242 -77
  219. package/dist/charts/engine/three-d/webgl.js.map +1 -1
  220. package/dist/charts/engine/three-d/webgpu.cjs +1 -1
  221. package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
  222. package/dist/charts/engine/three-d/webgpu.js +260 -105
  223. package/dist/charts/engine/three-d/webgpu.js.map +1 -1
  224. package/dist/charts/engine/trading/chart.cjs +1 -1
  225. package/dist/charts/engine/trading/chart.cjs.map +1 -1
  226. package/dist/charts/engine/trading/chart.d.cts +0 -1
  227. package/dist/charts/engine/trading/chart.d.ts +0 -1
  228. package/dist/charts/engine/trading/chart.js +1364 -1073
  229. package/dist/charts/engine/trading/chart.js.map +1 -1
  230. package/dist/charts/engine/trading/drawings.cjs +2 -2
  231. package/dist/charts/engine/trading/drawings.cjs.map +1 -1
  232. package/dist/charts/engine/trading/drawings.d.cts +6 -0
  233. package/dist/charts/engine/trading/drawings.d.ts +6 -0
  234. package/dist/charts/engine/trading/drawings.js +100 -88
  235. package/dist/charts/engine/trading/drawings.js.map +1 -1
  236. package/dist/charts/engine/trading/format.cjs +1 -1
  237. package/dist/charts/engine/trading/format.cjs.map +1 -1
  238. package/dist/charts/engine/trading/format.d.cts +6 -0
  239. package/dist/charts/engine/trading/format.d.ts +6 -0
  240. package/dist/charts/engine/trading/format.js +42 -30
  241. package/dist/charts/engine/trading/format.js.map +1 -1
  242. package/dist/charts/engine/trading/geometry.cjs +1 -1
  243. package/dist/charts/engine/trading/geometry.cjs.map +1 -1
  244. package/dist/charts/engine/trading/geometry.d.cts +16 -0
  245. package/dist/charts/engine/trading/geometry.d.ts +16 -0
  246. package/dist/charts/engine/trading/geometry.js +19 -4
  247. package/dist/charts/engine/trading/geometry.js.map +1 -1
  248. package/dist/charts/engine/trading/labels.cjs +1 -1
  249. package/dist/charts/engine/trading/labels.cjs.map +1 -1
  250. package/dist/charts/engine/trading/labels.js +36 -4
  251. package/dist/charts/engine/trading/labels.js.map +1 -1
  252. package/dist/charts/engine/trading/layout.cjs +2 -0
  253. package/dist/charts/engine/trading/layout.cjs.map +1 -0
  254. package/dist/charts/engine/trading/layout.d.cts +37 -0
  255. package/dist/charts/engine/trading/layout.d.ts +37 -0
  256. package/dist/charts/engine/trading/layout.js +63 -0
  257. package/dist/charts/engine/trading/layout.js.map +1 -0
  258. package/dist/charts/engine/trading/studies.cjs +1 -1
  259. package/dist/charts/engine/trading/studies.cjs.map +1 -1
  260. package/dist/charts/engine/trading/studies.d.cts +8 -0
  261. package/dist/charts/engine/trading/studies.d.ts +8 -0
  262. package/dist/charts/engine/trading/studies.js +4 -1
  263. package/dist/charts/engine/trading/studies.js.map +1 -1
  264. package/dist/charts/engine/trading/types.d.cts +53 -13
  265. package/dist/charts/engine/trading/types.d.ts +53 -13
  266. package/dist/charts/engine/types.d.cts +39 -5
  267. package/dist/charts/engine/types.d.ts +39 -5
  268. package/dist/charts/react/charts.cjs +1 -1
  269. package/dist/charts/react/charts.cjs.map +1 -1
  270. package/dist/charts/react/charts.js +20 -15
  271. package/dist/charts/react/charts.js.map +1 -1
  272. package/dist/charts/react/graph.cjs +1 -1
  273. package/dist/charts/react/graph.cjs.map +1 -1
  274. package/dist/charts/react/graph.d.cts +6 -0
  275. package/dist/charts/react/graph.d.ts +6 -0
  276. package/dist/charts/react/graph.js +28 -27
  277. package/dist/charts/react/graph.js.map +1 -1
  278. package/dist/charts/react/orderbook.cjs +1 -1
  279. package/dist/charts/react/orderbook.cjs.map +1 -1
  280. package/dist/charts/react/orderbook.d.cts +3 -1
  281. package/dist/charts/react/orderbook.d.ts +3 -1
  282. package/dist/charts/react/orderbook.js +1 -0
  283. package/dist/charts/react/orderbook.js.map +1 -1
  284. package/dist/charts/react/shapes.cjs.map +1 -1
  285. package/dist/charts/react/shapes.d.cts +4 -3
  286. package/dist/charts/react/shapes.d.ts +4 -3
  287. package/dist/charts/react/shapes.js.map +1 -1
  288. package/dist/charts/react/three-d.cjs +1 -1
  289. package/dist/charts/react/three-d.cjs.map +1 -1
  290. package/dist/charts/react/three-d.d.cts +7 -0
  291. package/dist/charts/react/three-d.d.ts +7 -0
  292. package/dist/charts/react/three-d.js +14 -13
  293. package/dist/charts/react/three-d.js.map +1 -1
  294. package/dist/charts/react/trading.cjs.map +1 -1
  295. package/dist/charts/react/trading.d.cts +3 -3
  296. package/dist/charts/react/trading.d.ts +3 -3
  297. package/dist/charts/react/trading.js.map +1 -1
  298. package/dist/core/contracts.cjs +1 -1
  299. package/dist/core/contracts.cjs.map +1 -1
  300. package/dist/core/contracts.js +1 -1
  301. package/dist/core/contracts.js.map +1 -1
  302. package/dist/native/charts/src/canvas.cjs +1 -1
  303. package/dist/native/charts/src/canvas.js +4 -3
  304. package/dist/native/charts/src/engine/controller.cjs +2 -2
  305. package/dist/native/charts/src/engine/controller.cjs.map +1 -1
  306. package/dist/native/charts/src/engine/controller.js +102 -104
  307. package/dist/native/charts/src/engine/controller.js.map +1 -1
  308. package/dist/native/charts/src/engine/data.cjs +1 -1
  309. package/dist/native/charts/src/engine/data.cjs.map +1 -1
  310. package/dist/native/charts/src/engine/data.js +6 -4
  311. package/dist/native/charts/src/engine/data.js.map +1 -1
  312. package/dist/native/charts/src/engine/labels.cjs +1 -1
  313. package/dist/native/charts/src/engine/labels.cjs.map +1 -1
  314. package/dist/native/charts/src/engine/labels.js +14 -1
  315. package/dist/native/charts/src/engine/labels.js.map +1 -1
  316. package/dist/native/charts/src/engine/model.cjs +1 -1
  317. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  318. package/dist/native/charts/src/engine/model.js +207 -163
  319. package/dist/native/charts/src/engine/model.js.map +1 -1
  320. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  321. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  322. package/dist/native/charts/src/engine/presets.cjs +1 -1
  323. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  324. package/dist/native/charts/src/engine/presets.js +42 -26
  325. package/dist/native/charts/src/engine/presets.js.map +1 -1
  326. package/dist/native/charts/src/engine/scene.cjs +1 -1
  327. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  328. package/dist/native/charts/src/engine/scene.js +265 -121
  329. package/dist/native/charts/src/engine/scene.js.map +1 -1
  330. package/dist/native/charts/src/engine/shapes/chord.cjs +1 -1
  331. package/dist/native/charts/src/engine/shapes/chord.cjs.map +1 -1
  332. package/dist/native/charts/src/engine/shapes/chord.js +108 -103
  333. package/dist/native/charts/src/engine/shapes/chord.js.map +1 -1
  334. package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
  335. package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
  336. package/dist/native/charts/src/engine/shapes/layout.js +88 -73
  337. package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
  338. package/dist/native/components/Chart/ChartBase.cjs +1 -1
  339. package/dist/native/components/Chart/ChartBase.cjs.map +1 -1
  340. package/dist/native/components/Chart/ChartBase.js +127 -115
  341. package/dist/native/components/Chart/ChartBase.js.map +1 -1
  342. package/dist/native/components/Chart/charts.cjs +1 -1
  343. package/dist/native/components/Chart/charts.cjs.map +1 -1
  344. package/dist/native/components/Chart/charts.js +8 -5
  345. package/dist/native/components/Chart/charts.js.map +1 -1
  346. package/dist/native/components/Chart/scene.cjs +1 -1
  347. package/dist/native/components/Chart/scene.cjs.map +1 -1
  348. package/dist/native/components/Chart/scene.d.cts +6 -1
  349. package/dist/native/components/Chart/scene.d.ts +6 -1
  350. package/dist/native/components/Chart/scene.js +99 -50
  351. package/dist/native/components/Chart/scene.js.map +1 -1
  352. package/dist/native/components/Chart/types.d.cts +7 -1
  353. package/dist/native/components/Chart/types.d.ts +7 -1
  354. package/dist/native/components/Charts/charts.cjs +1 -1
  355. package/dist/native/components/Charts/charts.cjs.map +1 -1
  356. package/dist/native/components/Charts/charts.js +23 -18
  357. package/dist/native/components/Charts/charts.js.map +1 -1
  358. package/dist/native/components/ShapeChart/ShapeChartBase.cjs +1 -1
  359. package/dist/native/components/ShapeChart/ShapeChartBase.cjs.map +1 -1
  360. package/dist/native/components/ShapeChart/ShapeChartBase.d.cts +1 -1
  361. package/dist/native/components/ShapeChart/ShapeChartBase.d.ts +1 -1
  362. package/dist/native/components/ShapeChart/ShapeChartBase.js +97 -107
  363. package/dist/native/components/ShapeChart/ShapeChartBase.js.map +1 -1
  364. package/dist/native/components/ShapeChart/geometry.cjs +1 -1
  365. package/dist/native/components/ShapeChart/geometry.cjs.map +1 -1
  366. package/dist/native/components/ShapeChart/geometry.js +120 -36
  367. package/dist/native/components/ShapeChart/geometry.js.map +1 -1
  368. package/dist/native/components/ShapeChart/types.d.cts +6 -4
  369. package/dist/native/components/ShapeChart/types.d.ts +6 -4
  370. package/dist/native/source/components/Chart/ChartBase.tsx +19 -6
  371. package/dist/native/source/components/Chart/charts.tsx +10 -3
  372. package/dist/native/source/components/Chart/scene.tsx +85 -0
  373. package/dist/native/source/components/Chart/types.ts +7 -0
  374. package/dist/native/source/components/Charts/charts.tsx +7 -0
  375. package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +10 -36
  376. package/dist/native/source/components/ShapeChart/geometry.ts +188 -18
  377. package/dist/native/source/components/ShapeChart/types.ts +6 -4
  378. package/dist/taro/chart-a11y.d.ts +7 -0
  379. package/dist/taro/charts.d.ts +4 -1
  380. package/dist/taro/index.js +3347 -3073
  381. package/dist/taro/shape-charts.d.ts +6 -4
  382. package/dist/uni/AreaChart.vue +2 -1
  383. package/dist/uni/AreaChart.vue.d.ts +1 -1
  384. package/dist/uni/BarChart.vue +2 -1
  385. package/dist/uni/BarChart.vue.d.ts +1 -1
  386. package/dist/uni/BoxPlotChart.vue +2 -1
  387. package/dist/uni/BubbleChart.vue +2 -1
  388. package/dist/uni/CandlestickChart.vue +2 -1
  389. package/dist/uni/Chart.vue +2 -1
  390. package/dist/uni/Divider.vue.d.ts +1 -1
  391. package/dist/uni/DonutChart.vue.d.ts +1 -1
  392. package/dist/uni/GanttChart.vue +2 -1
  393. package/dist/uni/GanttChart.vue.d.ts +11 -0
  394. package/dist/uni/GaugeChart.vue.d.ts +1 -1
  395. package/dist/uni/HeatmapChart.vue +2 -1
  396. package/dist/uni/HistogramChart.vue +2 -1
  397. package/dist/uni/HorizontalBarChart.vue +2 -1
  398. package/dist/uni/HorizontalBarChart.vue.d.ts +1 -1
  399. package/dist/uni/LineChart.vue +2 -1
  400. package/dist/uni/MixedChart.vue +2 -1
  401. package/dist/uni/PieChart.vue.d.ts +1 -1
  402. package/dist/uni/QuadrantChart.vue +2 -1
  403. package/dist/uni/RangeAreaChart.vue +2 -1
  404. package/dist/uni/ScatterChart.vue +2 -1
  405. package/dist/uni/Sparkline.vue +2 -1
  406. package/dist/uni/WaterfallChart.vue +2 -1
  407. package/dist/uni/chart-a11y.d.ts +7 -0
  408. package/dist/uni/chart-a11y.js +29 -0
  409. package/dist/uni/chart-canvas.d.ts +9 -0
  410. package/dist/uni/chart-canvas.js +11 -1
  411. package/dist/uni/chart-types.d.ts +8 -1
  412. package/dist/uni/chart-types.js +5 -1
  413. package/dist/uni/charts-canvas.js +2 -1
  414. package/dist/uni/named-chart-options.d.ts +2 -0
  415. package/dist/uni/named-chart-options.js +3 -0
  416. package/dist/uni/shape-chart-canvas.d.ts +0 -2
  417. package/dist/uni/shape-chart-canvas.js +4 -36
  418. package/dist/uni/shape-chart-types.d.ts +2 -2
  419. package/dist/uni/shape-chart-types.js +2 -2
  420. package/dist/vue/components/Chart/Bar3DChart.vue.d.ts +2 -0
  421. package/dist/vue/components/Chart/DependencyGraph.vue.d.ts +2 -0
  422. package/dist/vue/components/Chart/GanttChart.vue.d.ts +15 -0
  423. package/dist/vue/components/Chart/GanttChart.vue.js.map +1 -1
  424. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js +8 -0
  425. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  426. package/dist/vue/components/Chart/GraphChart.vue.d.ts +2 -0
  427. package/dist/vue/components/Chart/Line3DChart.vue.d.ts +2 -0
  428. package/dist/vue/components/Chart/Scatter3DChart.vue.d.ts +2 -0
  429. package/dist/vue/components/Chart/Surface3DChart.vue.d.ts +2 -0
  430. package/dist/vue/components/Chart/TradingChart.vue.d.ts +9 -0
  431. package/dist/vue/components/Chart/TreeChart.vue.d.ts +2 -0
  432. package/dist/vue/components/Chart/graph.d.ts +3 -0
  433. package/dist/vue/components/Chart/graph.js +2 -0
  434. package/dist/vue/components/Chart/graph.js.map +1 -1
  435. package/dist/vue/components/Chart/three-d.d.ts +3 -0
  436. package/dist/vue/components/Chart/three-d.js +2 -0
  437. package/dist/vue/components/Chart/three-d.js.map +1 -1
  438. package/dist/vue/components/Chart/trading.d.ts +7 -2
  439. package/dist/vue/components/Chart/trading.js +1 -0
  440. package/dist/vue/components/Chart/trading.js.map +1 -1
  441. package/dist/weapp/area-chart/index.wxml +1 -1
  442. package/dist/weapp/bar-chart/index.wxml +1 -1
  443. package/dist/weapp/box-plot-chart/index.wxml +1 -1
  444. package/dist/weapp/bubble-chart/index.wxml +1 -1
  445. package/dist/weapp/candlestick-chart/index.wxml +1 -1
  446. package/dist/weapp/chart/index.wxml +1 -1
  447. package/dist/weapp/charts/canvas.js +511 -63
  448. package/dist/weapp/charts/core.js +2 -0
  449. package/dist/weapp/controls.js +58 -27
  450. package/dist/weapp/gantt-chart/index.wxml +1 -1
  451. package/dist/weapp/heatmap-chart/index.wxml +1 -1
  452. package/dist/weapp/histogram-chart/index.wxml +1 -1
  453. package/dist/weapp/horizontal-bar-chart/index.wxml +1 -1
  454. package/dist/weapp/line-chart/index.wxml +1 -1
  455. package/dist/weapp/mixed-chart/index.wxml +1 -1
  456. package/dist/weapp/quadrant-chart/index.wxml +1 -1
  457. package/dist/weapp/range-area-chart/index.wxml +1 -1
  458. package/dist/weapp/scatter-chart/index.wxml +1 -1
  459. package/dist/weapp/sparkline/index.wxml +1 -1
  460. package/dist/weapp/types.d.ts +11 -2
  461. package/dist/weapp/waterfall-chart/index.wxml +1 -1
  462. package/dist/web-components/components/chart/extended.d.ts +4 -0
  463. package/dist/web-components/components/chart/extended.js +8 -2
  464. package/dist/web-components/components/chart/extended.js.map +1 -1
  465. package/dist/web-components/components/chart-3d/chart-3d.d.ts +1 -1
  466. package/dist/web-components/components/chart-3d/chart-3d.js.map +1 -1
  467. package/dist/web-components/components/graph/graph.d.ts +2 -0
  468. package/dist/web-components/components/graph/graph.js +3 -2
  469. package/dist/web-components/components/graph/graph.js.map +1 -1
  470. package/dist/web-components/components/trading-chart/trading-chart.d.ts +1 -1
  471. package/dist/web-components/components/trading-chart/trading-chart.js.map +1 -1
  472. package/dist/web-components/html-custom-data.json +45 -0
  473. package/dist/web-components/types/react.d.ts +4 -4
  474. package/dist/web-components/types/solid.d.ts +8 -8
  475. package/dist/web-components/types/svelte.d.ts +8 -8
  476. package/dist/web-components/types/vue.d.ts +4 -4
  477. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"presets.cjs","names":["localeLabels","tickStep","resolveLocale","numberFormat","chartLabels","require_locale","require_labels","require_scale","PRESET_LABELS","presetLabels","locale","withSeriesType","series","t","s","type","stack","curve","lineSeries","area","extra","areaSeries","barSeries","stacked","labels","scatterSeries","candlestickSeries","heatmapChartOptions","numericX","config","c","numericY","base","sparklineOptions","DEFAULT_QUADRANT_COLORS","DIVIDER","splits","x0","x1","y0","y1","quadrantOf","right","x","xs","y","ys","quadrantCenter","visualRight","corner","quadrantChartOptions","reverseX","color","p","left","rect","xa","xb","ya","yb","position","ends","visualLeft","texts","annotations","showTicks","interaction","item","event","region","sortedFinite","n","i","values","out","k","v","quantileOf","sorted","at","lo","hi","quantiles","ps","SPREAD_SAMPLE","binValues","min","max","options","span","rule","sturges","count","stride","sample","width","start","end","counts","total","edges","histogramSeries","bins","format","formatEdge","value","a","b","boxplotStats","q1","median","q3","sum","whisker","low","high","outliers","reach","from","to","j","upper","boxplotData","groups","g","boxplotSeries","waterfallSeries","up","down","running","data","steps","step","bubbleSeries","minSize","maxSize","valuesOf","list","top","sizeOf","size","points","d","THEMED","FALLBACK","paletteColor","fallback","themed","time","ganttSeries","names","rows","taskName","progressName","separator","tasks","colorOf","formatProgress","share","details","progress","milestones","pad","rangeAreaSeries"],"sources":["../../../../charts/src/engine/presets.ts"],"sourcesContent":["// Option presets of the chart components, shared by every platform (React,\n// mini-programs, React Native): they turn component props into engine\n// options.\n\nimport {\n localeLabels,\n numberFormat,\n resolveLocale,\n type LabelDictionary,\n} from \"./locale\";\nimport { chartLabels } from \"./labels\";\nimport { tickStep } from \"./scale\";\nimport type {\n ChartAnnotation,\n ChartColorScheme,\n ChartConnectorOptions,\n ChartCurve,\n ChartInteractionOptions,\n ChartOptions,\n ChartPointDatum,\n ChartSeries,\n ChartSeriesType,\n ChartTooltipDetail,\n ChartXValue,\n} from \"./types\";\n\n/** Default series names of the presets */\ninterface PresetLabels {\n value: string;\n values: string;\n count: string;\n change: string;\n tasks: string;\n progress: string;\n milestones: string;\n}\n\nconst PRESET_LABELS: LabelDictionary<PresetLabels> = {\n en: {\n value: \"Value\",\n values: \"Values\",\n count: \"Count\",\n change: \"Change\",\n tasks: \"Tasks\",\n progress: \"Progress\",\n milestones: \"Milestones\",\n },\n zh: {\n value: \"数值\",\n values: \"数值\",\n count: \"数量\",\n change: \"变化\",\n tasks: \"任务\",\n progress: \"进度\",\n milestones: \"里程碑\",\n },\n ja: {\n value: \"値\",\n values: \"値\",\n count: \"件数\",\n change: \"増減\",\n tasks: \"タスク\",\n progress: \"進捗\",\n milestones: \"マイルストーン\",\n },\n fr: {\n value: \"Valeur\",\n values: \"Valeurs\",\n count: \"Effectif\",\n change: \"Variation\",\n tasks: \"Tâches\",\n progress: \"Avancement\",\n milestones: \"Jalons\",\n },\n};\n\n/** Default series names of the presets in a locale (the page language by default) */\nexport const presetLabels = (locale?: string): PresetLabels =>\n localeLabels(PRESET_LABELS, locale);\n\n/** Gives the series without a `type` the type of the component */\nexport const withSeriesType = (\n series: readonly ChartSeries[],\n type: ChartSeriesType,\n stack?: string,\n curve?: ChartCurve,\n): ChartSeries[] =>\n series.map((s) => {\n const t = s.type ?? type;\n return {\n ...s,\n type: t,\n ...(stack !== undefined && t === type ? { stack: s.stack ?? stack } : {}),\n ...(curve !== undefined && (t === \"line\" || t === \"area\")\n ? { curve: s.curve ?? curve }\n : {}),\n };\n });\n\n/** Options of the line-like components */\nexport interface LineSeriesOptions {\n /** Stacks the series on top of each other */\n stacked?: boolean;\n /** Shape of the lines */\n curve?: ChartCurve;\n}\n\n/** Series of a LineChart (`area` fills them) */\nexport const lineSeries = (\n series: readonly ChartSeries[],\n area = false,\n extra: LineSeriesOptions = {},\n) =>\n withSeriesType(\n series,\n area ? \"area\" : \"line\",\n extra.stacked ? \"stack\" : undefined,\n extra.curve,\n );\n\n/** Series of an AreaChart */\nexport const areaSeries = (\n series: readonly ChartSeries[],\n extra: LineSeriesOptions = {},\n) => lineSeries(series, true, extra);\n\n/** Series of a BarChart (`stacked` stacks them, `labels` shows the values) */\nexport const barSeries = (\n series: readonly ChartSeries[],\n stacked = false,\n labels = false,\n) =>\n withSeriesType(series, \"bar\", stacked ? \"stack\" : undefined).map((s) =>\n labels && s.type === \"bar\" ? { ...s, showLabels: s.showLabels ?? true } : s,\n );\n\n/** Series of a ScatterChart */\nexport const scatterSeries = (series: readonly ChartSeries[]) =>\n withSeriesType(series, \"scatter\");\n\n/** Series of a CandlestickChart */\nexport const candlestickSeries = (series: readonly ChartSeries[]) =>\n withSeriesType(series, \"candlestick\");\n\n/** A cell of a HeatmapChart */\nexport interface HeatmapCell {\n /** Column: a category name (or a number on a numeric axis) */\n x: string | number;\n /** Row: a category name (or a number on a numeric axis) */\n y: string | number;\n /** Value mapped to the color scale; `null` leaves the cell empty */\n value: number | null;\n}\n\n/** Settings of a heatmap (the props of HeatmapChart) */\nexport interface HeatmapConfig {\n /** Cells */\n data: readonly HeatmapCell[];\n /** Column names in order (collected from the data when omitted) */\n xCategories?: readonly string[];\n /** Row names from bottom to top (collected from the data when omitted) */\n yCategories?: readonly string[];\n /**\n * Colors from the lowest to the highest value (interpolated in OKLab), or\n * a built-in theme-aware ramp of the first palette color\n * @default \"sequential\"\n */\n colorScale?: readonly string[] | ChartColorScheme;\n /** Values at the ends of the color scale; the data range by default */\n valueRange?: readonly [number, number];\n /**\n * Value at the middle of the color scale (diverging data)\n * @default 0 for `diverging` ramps spanning it, else the middle of the range\n */\n colorMidpoint?: number;\n /** Name of the value in the tooltip */\n name?: string;\n /** Corner radius of the cells, in pixels */\n radius?: number;\n /** Formats the values in the tooltip */\n format?: (value: number) => string;\n}\n\n/** Engine options of a heatmap */\nexport const heatmapChartOptions = (\n config: HeatmapConfig,\n base: Partial<ChartOptions> = {},\n): ChartOptions => {\n const numericX = config.data.some((c) => typeof c.x === \"number\");\n const numericY = config.data.some((c) => typeof c.y === \"number\");\n return {\n ...base,\n series: [\n {\n id: \"heatmap\",\n name: config.name ?? presetLabels(base.locale).value,\n type: \"heatmap\",\n data: config.data.map((c) => ({ x: c.x, y: c.y, value: c.value })),\n colorScale: config.colorScale,\n valueRange: config.valueRange,\n colorMidpoint: config.colorMidpoint,\n radius: config.radius,\n format: config.format,\n },\n ],\n xAxis: {\n ...(numericX\n ? {}\n : { type: \"category\" as const, categories: config.xCategories }),\n grid: false,\n ...base.xAxis,\n },\n yAxis: {\n ...(numericY\n ? {}\n : { type: \"category\" as const, categories: config.yCategories }),\n grid: false,\n ...base.yAxis,\n },\n // the color legend (visual map)\n legend: base.legend ?? true,\n interaction: base.interaction ?? { zoom: false },\n tooltip: base.tooltip ?? { mode: \"nearest\" },\n };\n};\n\n/** Settings of a sparkline (the props of Sparkline) */\nexport interface SparklineConfig {\n /** Values (or `[x, y]` pairs, typed arrays, ...) */\n data: ChartSeries[\"data\"];\n /**\n * How the values are drawn\n * @default \"line\"\n */\n type?: \"line\" | \"area\" | \"bar\";\n /** Color (any CSS color); the first palette color by default */\n color?: string;\n /**\n * Shape of the line\n * @default \"smooth\"\n */\n curve?: ChartCurve;\n /** Name shown in the tooltip */\n name?: string;\n /** Draws a reference line at this value (e.g. a target or the average) */\n reference?: number;\n /** Formats the value in the tooltip */\n format?: (value: number) => string;\n}\n\n/** Engine options of a sparkline: no axes, no legend, a tooltip only */\nexport const sparklineOptions = (\n config: SparklineConfig,\n base: Partial<ChartOptions> = {},\n): ChartOptions => {\n const type = config.type ?? \"line\";\n return {\n ...base,\n series: [\n {\n id: \"sparkline\",\n name: config.name ?? presetLabels(base.locale).value,\n type,\n data: config.data,\n color: config.color,\n curve: type === \"bar\" ? undefined : (config.curve ?? \"smooth\"),\n lineWidth: 1.5,\n opacity: type === \"area\" ? 0.22 : undefined,\n radius: type === \"bar\" ? 1.5 : undefined,\n format: config.format,\n },\n ],\n xAxis: { visible: false, grid: false, ...base.xAxis },\n yAxis: { visible: false, grid: false, nice: false, ...base.yAxis },\n legend: false,\n padding: base.padding ?? { top: 4, right: 4, bottom: 4, left: 4 },\n interaction: base.interaction ?? { zoom: false },\n annotations:\n config.reference !== undefined\n ? [\n ...(base.annotations ?? []),\n {\n type: \"line\",\n axis: \"y\",\n value: config.reference,\n dash: [2, 3],\n },\n ]\n : base.annotations,\n };\n};\n\n/** A point of a QuadrantChart */\nexport interface QuadrantPoint {\n /** Position on the horizontal axis */\n x: number;\n /** Position on the vertical axis */\n y: number;\n /** Text drawn next to the dot and shown in the tooltip */\n label?: string;\n /** Dot color (any CSS color); the color of its quadrant by default */\n color?: string;\n /** Dot diameter in pixels */\n size?: number;\n}\n\n/** Title and color of a quadrant */\nexport interface QuadrantRegion {\n /** Title drawn in the outer corner of the quadrant */\n label?: string;\n /** Background tint and default dot color (any CSS color) */\n color?: string;\n}\n\n/** The four quadrants of a QuadrantChart */\nexport interface QuadrantRegions {\n topLeft?: QuadrantRegion;\n topRight?: QuadrantRegion;\n bottomLeft?: QuadrantRegion;\n bottomRight?: QuadrantRegion;\n}\n\n/** A quadrant, as seen on screen */\nexport type QuadrantCorner = keyof QuadrantRegions;\n\n/** Texts at the four ends of the dividers, inside the plot */\nexport interface QuadrantAxisLabels {\n top?: string;\n bottom?: string;\n left?: string;\n right?: string;\n}\n\n/** Settings of a quadrant matrix (the props of QuadrantChart) */\nexport interface QuadrantConfig {\n /** Points to place */\n points: readonly QuadrantPoint[];\n /**\n * Range of the horizontal axis\n * @default [0, 10]\n */\n xDomain?: [number, number];\n /**\n * Range of the vertical axis\n * @default [0, 10]\n */\n yDomain?: [number, number];\n /** X value of the vertical divider (the middle of `xDomain` by default) */\n xSplit?: number;\n /** Y value of the horizontal divider (the middle of `yDomain` by default) */\n ySplit?: number;\n /** Titles and colors of the quadrants */\n quadrants?: QuadrantRegions;\n /** Title of the horizontal axis */\n xLabel?: string;\n /** Title of the vertical axis */\n yLabel?: string;\n /** Texts at the ends of the dividers, drawn inside the plot (e.g. \"Important\" at the top) */\n axisLabels?: QuadrantAxisLabels;\n /**\n * Shows the numeric ticks of the axes; `false` keeps only the matrix\n * @default true\n */\n showTicks?: boolean;\n /** Reverses the horizontal axis (e.g. \"urgent\" on the left) */\n reverseX?: boolean;\n /**\n * Draws the labels next to the dots (overlapping labels are skipped)\n * @default true\n */\n showLabels?: boolean;\n /**\n * Dot diameter in pixels\n * @default 12\n */\n pointSize?: number;\n /** Name of the points in the tooltip */\n name?: string;\n /** Lets the user drag the dots (`drag` / `drop` events) */\n draggable?: boolean;\n}\n\nexport const DEFAULT_QUADRANT_COLORS: Required<Record<QuadrantCorner, string>> =\n {\n topLeft: \"var(--danger-color, #ef4444)\",\n topRight: \"var(--primary-color, #4f46e5)\",\n bottomLeft: \"var(--warning-color, #f59e0b)\",\n bottomRight: \"var(--text-secondary-color, #64748b)\",\n };\n\nconst DIVIDER = \"var(--border-strong-color, var(--border-color, #cbd5e1))\";\n\nconst splits = (config: QuadrantConfig) => {\n const [x0, x1] = config.xDomain ?? [0, 10];\n const [y0, y1] = config.yDomain ?? [0, 10];\n return {\n x0,\n x1,\n y0,\n y1,\n xs: config.xSplit ?? (x0 + x1) / 2,\n ys: config.ySplit ?? (y0 + y1) / 2,\n };\n};\n\n/** Quadrant of a data position, as seen on screen */\nexport const quadrantOf = (\n config: Pick<\n QuadrantConfig,\n \"xDomain\" | \"yDomain\" | \"xSplit\" | \"ySplit\" | \"reverseX\"\n >,\n x: number,\n y: number,\n): QuadrantCorner => {\n const { xs, ys } = splits(config as QuadrantConfig);\n const right = config.reverseX ? x < xs : x >= xs;\n const top = y >= ys;\n return top\n ? right\n ? \"topRight\"\n : \"topLeft\"\n : right\n ? \"bottomRight\"\n : \"bottomLeft\";\n};\n\n/** Center of a quadrant in data coordinates */\nexport const quadrantCenter = (\n config: Pick<\n QuadrantConfig,\n \"xDomain\" | \"yDomain\" | \"xSplit\" | \"ySplit\" | \"reverseX\"\n >,\n corner: QuadrantCorner,\n): { x: number; y: number } => {\n const { x0, x1, y0, y1, xs, ys } = splits(config as QuadrantConfig);\n const visualRight = corner.endsWith(\"Right\");\n const dataHigh = config.reverseX ? !visualRight : visualRight;\n return {\n x: dataHigh ? (xs + x1) / 2 : (x0 + xs) / 2,\n y: corner.startsWith(\"top\") ? (ys + y1) / 2 : (y0 + ys) / 2,\n };\n};\n\n/** Engine options of a quadrant matrix */\nexport const quadrantChartOptions = (\n config: QuadrantConfig,\n base: Omit<ChartOptions, \"series\"> = {},\n): ChartOptions => {\n const { x0, x1, y0, y1, xs, ys } = splits(config);\n const reverseX = !!config.reverseX;\n const color = (corner: QuadrantCorner) =>\n config.quadrants?.[corner]?.color ?? DEFAULT_QUADRANT_COLORS[corner];\n\n const series: ChartSeries[] = [\n {\n type: \"scatter\",\n name: config.name ?? \"\",\n pointSize: config.pointSize ?? 12,\n showLabels: config.showLabels ?? true,\n opacity: 0.9,\n data: config.points.map((p) => ({\n x: p.x,\n y: p.y,\n label: p.label,\n size: p.size,\n color: p.color ?? color(quadrantOf(config, p.x, p.y)),\n })),\n },\n ];\n\n // visual left / right -> data ranges\n const left: [number, number] = reverseX ? [xs, x1] : [x0, xs];\n const right: [number, number] = reverseX ? [x0, xs] : [xs, x1];\n const rect = (\n corner: QuadrantCorner,\n [xa, xb]: [number, number],\n [ya, yb]: [number, number],\n position: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\",\n ): ChartAnnotation => ({\n type: \"rect\",\n x0: xa,\n x1: xb,\n y0: ya,\n y1: yb,\n color: color(corner),\n opacity: 0.07,\n label: config.quadrants?.[corner]?.label,\n labelPosition: position,\n });\n const ends = config.axisLabels ?? {};\n const visualLeft = reverseX ? x1 : x0;\n const visualRight = reverseX ? x0 : x1;\n const texts: ChartAnnotation[] = [\n ...(ends.top\n ? [{ type: \"text\", x: xs, y: y1, text: ends.top, anchor: \"top\" } as const]\n : []),\n ...(ends.bottom\n ? [\n {\n type: \"text\",\n x: xs,\n y: y0,\n text: ends.bottom,\n anchor: \"bottom\",\n } as const,\n ]\n : []),\n ...(ends.left\n ? [\n {\n type: \"text\",\n x: visualLeft,\n y: ys,\n text: ends.left,\n anchor: \"left\",\n } as const,\n ]\n : []),\n ...(ends.right\n ? [\n {\n type: \"text\",\n x: visualRight,\n y: ys,\n text: ends.right,\n anchor: \"right\",\n } as const,\n ]\n : []),\n ];\n\n const annotations: ChartAnnotation[] = [\n rect(\"topLeft\", left, [ys, y1], \"top-left\"),\n rect(\"topRight\", right, [ys, y1], \"top-right\"),\n rect(\"bottomLeft\", left, [y0, ys], \"bottom-left\"),\n rect(\"bottomRight\", right, [y0, ys], \"bottom-right\"),\n { type: \"line\", axis: \"x\", value: xs, dash: [], color: DIVIDER },\n { type: \"line\", axis: \"y\", value: ys, dash: [], color: DIVIDER },\n ...texts,\n ...(base.annotations ?? []),\n ];\n\n const showTicks = config.showTicks ?? true;\n const interaction: boolean | ChartInteractionOptions =\n base.interaction === false\n ? false\n : {\n zoom: false,\n ...(typeof base.interaction === \"object\" ? base.interaction : {}),\n ...(config.draggable ? { dragPoints: true } : {}),\n };\n\n return {\n ...base,\n series,\n annotations,\n tooltip:\n base.tooltip ??\n (showTicks\n ? undefined\n : {\n render: (event) => {\n const item = event.items[0];\n if (!item) return null;\n const region =\n config.quadrants?.[quadrantOf(config, item.x, item.y)]?.label;\n return [item.label ?? config.name ?? \"\", region ?? \"\"]\n .filter(Boolean)\n .join(\"\\n\");\n },\n }),\n xAxis: {\n min: x0,\n max: x1,\n title: config.xLabel,\n reverse: reverseX,\n nice: false,\n grid: false,\n tickCount: 4,\n visible: showTicks || !!config.xLabel,\n ...(showTicks ? {} : { format: () => \"\" }),\n },\n yAxis: {\n min: y0,\n max: y1,\n title: config.yLabel,\n nice: false,\n grid: false,\n tickCount: 4,\n visible: showTicks || !!config.yLabel,\n ...(showTicks ? {} : { format: () => \"\" }),\n },\n legend: base.legend ?? false,\n padding:\n base.padding ??\n (showTicks ? undefined : { top: 4, right: 4, bottom: 4, left: 4 }),\n interaction,\n };\n};\n\n// ------------------------------------------------------------- statistics\n\n/** Finite values of a list, as a sorted typed array */\nconst sortedFinite = (values: ArrayLike<number>): Float64Array => {\n let n = 0;\n for (let i = 0; i < values.length; i++) if (Number.isFinite(values[i])) n++;\n const out = new Float64Array(n);\n let k = 0;\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (Number.isFinite(v)) out[k++] = v;\n }\n return out.sort();\n};\n\n/** Quantile `p` (0-1) of sorted values, linearly interpolated (NumPy / Excel) */\nconst quantileOf = (sorted: ArrayLike<number>, p: number): number => {\n const n = sorted.length;\n if (!n) return NaN;\n const at = Math.min(1, Math.max(0, p)) * (n - 1);\n const lo = Math.floor(at);\n const hi = Math.min(n - 1, lo + 1);\n return sorted[lo] + (sorted[hi] - sorted[lo]) * (at - lo);\n};\n\n/**\n * Quantiles of values (`[0.5, 0.95, 0.99]` gives the median, p95 and p99),\n * linearly interpolated like NumPy and Excel; non-finite values are ignored\n */\nexport const quantiles = (\n values: ArrayLike<number>,\n ps: readonly number[],\n): number[] => {\n const sorted = sortedFinite(values);\n return ps.map((p) => quantileOf(sorted, p));\n};\n\n/** How the bins of a histogram are chosen: a count, or a rule */\nexport type HistogramBinning =\n number | \"auto\" | \"sturges\" | \"freedman-diaconis\";\n\n/** Options of `binValues` */\nexport interface BinOptions {\n /**\n * Number of bins, or the rule choosing it: `sturges` (log2 n + 1, for\n * small normal-ish samples), `freedman-diaconis` (bin width from the\n * interquartile range, robust to outliers); `auto` uses Freedman-Diaconis\n * and Sturges when the spread is zero\n * @default \"auto\"\n */\n bins?: HistogramBinning;\n /** Range covered by the bins (values outside are not counted); the data range by default */\n domain?: readonly [number, number];\n /**\n * Rounds the bin width to 1, 2 or 5 × 10^k and aligns the edges on it\n * @default true\n */\n nice?: boolean;\n}\n\n/** Bins of a histogram */\nexport interface HistogramBins {\n /** Edges of the bins: one more than the bins */\n edges: number[];\n /** Number of values in every bin */\n counts: number[];\n /** Width of a bin */\n width: number;\n /** Number of values counted (finite, inside the domain) */\n total: number;\n}\n\n/** At most this many values are sorted to estimate the spread (Freedman-Diaconis) */\nconst SPREAD_SAMPLE = 100_000;\n\n/**\n * Counts values into bins of equal width: linear in the number of values\n * (a million samples take a few milliseconds; the spread of large samples\n * is estimated on an even subsample)\n */\nexport const binValues = (\n values: ArrayLike<number>,\n options: BinOptions = {},\n): HistogramBins => {\n let n = 0;\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (!Number.isFinite(v)) continue;\n n++;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n let [lo, hi] = options.domain ?? [min, max];\n if (!n || !Number.isFinite(lo) || !Number.isFinite(hi)) {\n return { edges: [0, 1], counts: [0], width: 1, total: 0 };\n }\n if (lo > hi) [lo, hi] = [hi, lo];\n if (hi === lo) {\n lo -= 0.5;\n hi += 0.5;\n }\n const span = hi - lo;\n const rule = options.bins ?? \"auto\";\n const sturges = Math.ceil(Math.log2(n)) + 1;\n let count: number;\n if (typeof rule === \"number\") {\n count = Math.round(rule);\n } else if (rule === \"sturges\") {\n count = sturges;\n } else {\n // Freedman-Diaconis: width = 2 IQR / n^(1/3)\n const stride = Math.max(1, Math.floor(values.length / SPREAD_SAMPLE));\n const sample: number[] = [];\n for (let i = 0; i < values.length; i += stride) {\n const v = values[i];\n if (Number.isFinite(v)) sample.push(v);\n }\n const sorted = Float64Array.from(sample).sort();\n const iqr = quantileOf(sorted, 0.75) - quantileOf(sorted, 0.25);\n const width = (2 * iqr) / Math.cbrt(n);\n count = width > 0 ? Math.ceil(span / width) : sturges;\n }\n count = Math.max(1, Math.min(1000, count || 1));\n let width = span / count;\n let start = lo;\n if (options.nice ?? true) {\n width = tickStep(lo, hi, count) || width;\n start = Math.floor(lo / width + 1e-9) * width;\n count = Math.max(1, Math.ceil((hi - start) / width - 1e-9));\n }\n const end = start + count * width;\n const counts = new Array<number>(count).fill(0);\n let total = 0;\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (!(v >= start && v <= end)) continue;\n // the last bin includes its right edge\n const k = Math.min(count - 1, Math.floor((v - start) / width));\n counts[k]++;\n total++;\n }\n const edges: number[] = [];\n for (let k = 0; k <= count; k++)\n edges.push(Number((start + k * width).toPrecision(12)));\n return { edges, counts, width, total };\n};\n\n/** Options of `histogramSeries` */\nexport interface HistogramSeriesOptions extends BinOptions {\n /** Name of the series (legend, tooltip) */\n name?: string;\n /** Bar color (any CSS color) */\n color?: string;\n /** Formats the edges of the bins in the tooltip */\n format?: (value: number) => string;\n /** Bins already computed (`binValues`): `values` are then ignored */\n binned?: HistogramBins;\n /**\n * Locale of the default name and of the bin edges\n * @default the page language\n */\n locale?: string;\n}\n\n/** Bar series of a histogram: one touching bar per bin, labelled with its range */\nexport const histogramSeries = (\n values: ArrayLike<number>,\n options: HistogramSeriesOptions = {},\n): ChartSeries => {\n const bins = options.binned ?? binValues(values, options);\n const locale = resolveLocale(options.locale);\n const format =\n options.format ?? ((value: number) => formatEdge(value, locale));\n return {\n id: \"histogram\",\n name: options.name ?? presetLabels(locale).count,\n type: \"bar\",\n color: options.color,\n barWidth: 1,\n radius: 1,\n data: bins.counts.map((count, k) => {\n const a = bins.edges[k] ?? 0;\n const b = bins.edges[k + 1] ?? a;\n return {\n x: (a + b) / 2,\n y: count,\n label: `${format(a)} – ${format(b)}`,\n };\n }),\n };\n};\n\nconst formatEdge = (value: number, locale: string) =>\n numberFormat(locale, { maximumSignificantDigits: 6 }).format(value);\n\n/** Options of `boxplotStats` */\nexport interface BoxplotStatsOptions {\n /**\n * Reach of the whiskers in interquartile ranges beyond the box (Tukey:\n * 1.5); `\"minmax\"` extends them to the extremes (no outliers)\n * @default 1.5\n */\n whisker?: number | \"minmax\";\n}\n\n/** Five-number summary of a sample, with the outliers */\nexport interface BoxplotStats {\n /** Lower whisker: the smallest value within reach */\n low: number;\n /** First quartile */\n q1: number;\n median: number;\n /** Third quartile */\n q3: number;\n /** Upper whisker: the largest value within reach */\n high: number;\n /** Values beyond the whiskers */\n outliers: number[];\n min: number;\n max: number;\n mean: number;\n /** Number of finite values */\n count: number;\n}\n\n/** Quartiles, whiskers (Tukey's 1.5 IQR by default) and outliers of raw values */\nexport const boxplotStats = (\n values: ArrayLike<number>,\n options: BoxplotStatsOptions = {},\n): BoxplotStats => {\n const sorted = sortedFinite(values);\n const n = sorted.length;\n if (!n) {\n return {\n low: NaN,\n q1: NaN,\n median: NaN,\n q3: NaN,\n high: NaN,\n outliers: [],\n min: NaN,\n max: NaN,\n mean: NaN,\n count: 0,\n };\n }\n const q1 = quantileOf(sorted, 0.25);\n const median = quantileOf(sorted, 0.5);\n const q3 = quantileOf(sorted, 0.75);\n const min = sorted[0];\n const max = sorted[n - 1];\n let sum = 0;\n for (let i = 0; i < n; i++) sum += sorted[i];\n const whisker = options.whisker ?? 1.5;\n let low = min;\n let high = max;\n const outliers: number[] = [];\n if (whisker !== \"minmax\") {\n const reach = (q3 - q1) * whisker;\n const from = q1 - reach;\n const to = q3 + reach;\n let i = 0;\n while (i < n && sorted[i] < from) outliers.push(sorted[i++]);\n low = i < n ? sorted[i] : q1;\n let j = n - 1;\n const upper: number[] = [];\n while (j >= 0 && sorted[j] > to) upper.push(sorted[j--]);\n high = j >= 0 ? sorted[j] : q3;\n outliers.push(...upper.reverse());\n }\n return {\n low: Math.min(low, q1),\n q1,\n median,\n q3,\n high: Math.max(high, q3),\n outliers,\n min,\n max,\n mean: sum / n,\n count: n,\n };\n};\n\n/** A sample of a box plot */\nexport interface BoxplotGroup {\n /** Category (or position) of the box */\n x: ChartXValue;\n /** Raw values: their quartiles, whiskers and outliers are computed */\n values: ArrayLike<number>;\n /** Color of the box (any CSS color) */\n color?: string;\n}\n\n/** Box plot data of raw samples (one datum per group) */\nexport const boxplotData = (\n groups: readonly BoxplotGroup[],\n options: BoxplotStatsOptions = {},\n): ChartPointDatum[] =>\n groups.map((g) => {\n const s = boxplotStats(g.values, options);\n return {\n x: g.x,\n y: Number.isFinite(s.median) ? s.median : null,\n low: s.low,\n q1: s.q1,\n q3: s.q3,\n high: s.high,\n outliers: s.outliers,\n ...(g.color ? { color: g.color } : {}),\n };\n });\n\n/** Series of a BoxPlotChart */\nexport const boxplotSeries = (series: readonly ChartSeries[]) =>\n withSeriesType(series, \"boxplot\");\n\n// ---------------------------------------------------------------- waterfall\n\n/** A bar of a waterfall chart */\nexport interface WaterfallStep {\n /** Category name of the bar */\n label: string;\n /** Change (positive or negative); ignored by totals */\n value?: number;\n /**\n * `subtotal` and `total` bars show the running total, from zero\n * @default \"change\"\n */\n kind?: \"change\" | \"subtotal\" | \"total\";\n /** Color of this bar (any CSS color) */\n color?: string;\n}\n\n/** Options of `waterfallSeries` */\nexport interface WaterfallOptions {\n /** Name of the series (tooltip) */\n name?: string;\n /** Color of the increases @default the success color */\n upColor?: string;\n /** Color of the decreases @default the danger color */\n downColor?: string;\n /** Color of the totals and subtotals @default the primary color */\n totalColor?: string;\n /**\n * Value the first change starts from\n * @default 0\n */\n start?: number;\n /**\n * Writes the change (or the total) at the end of every bar\n * @default false\n */\n labels?: boolean;\n /** Formats the values (labels, tooltip) */\n format?: (value: number) => string;\n /**\n * Thin lines from the end of every bar to the next one; an object styles\n * them\n * @default true (dashed, secondary text color)\n */\n connector?: boolean | ChartConnectorOptions;\n /**\n * Locale of the default name\n * @default the page language\n */\n locale?: string;\n}\n\n/**\n * Floating bar series of a waterfall (bridge) chart: every change starts\n * where the previous one ended; totals and subtotals start from zero\n */\nexport const waterfallSeries = (\n steps: readonly WaterfallStep[],\n options: WaterfallOptions = {},\n): ChartSeries => {\n const up = options.upColor ?? \"var(--success-color, #16a34a)\";\n const down = options.downColor ?? \"var(--danger-color, #dc2626)\";\n const total = options.totalColor ?? \"var(--primary-color, #4f46e5)\";\n let running = options.start ?? 0;\n const data: ChartPointDatum[] = steps.map((step) => {\n if (step.kind === \"total\" || step.kind === \"subtotal\") {\n return { x: step.label, y: running, color: step.color ?? total };\n }\n const value = step.value ?? 0;\n const from = running;\n running += value;\n return {\n x: step.label,\n y0: from,\n y: running,\n color: step.color ?? (value >= 0 ? up : down),\n };\n });\n return {\n id: \"waterfall\",\n name: options.name ?? presetLabels(options.locale).change,\n type: \"bar\",\n color: total,\n data,\n showLabels: options.labels ?? false,\n format: options.format,\n connector: options.connector ?? true,\n };\n};\n\n// ------------------------------------------------------------------ bubbles\n\n/** Options of `bubbleSeries` */\nexport interface BubbleOptions {\n /**\n * Diameter in pixels of the smallest bubbles\n * @default 6\n */\n minSize?: number;\n /**\n * Diameter in pixels of the largest value\n * @default 48\n */\n maxSize?: number;\n /** Value drawn with `maxSize` (share a scale between charts); the largest value by default */\n maxValue?: number;\n}\n\n/**\n * Scatter series whose dots are sized by the `value` of their points: the\n * area of a bubble is proportional to its value (diameter ∝ √value), the\n * scale is shared by every series. Points are drawn from the largest to\n * the smallest, so small bubbles stay on top (hover indexes refer to that\n * order).\n */\nexport const bubbleSeries = (\n series: readonly ChartSeries[],\n options: BubbleOptions = {},\n): ChartSeries[] => {\n const minSize = options.minSize ?? 6;\n const maxSize = options.maxSize ?? 48;\n const valuesOf = (data: ChartSeries[\"data\"]): ArrayLike<number> | null => {\n if (typeof data !== \"object\" || data === null) return null;\n if (!(\"length\" in data)) {\n const v = (data as { value?: ArrayLike<number> }).value;\n return v ?? null;\n }\n const list = data as ArrayLike<unknown>;\n const out = new Float64Array(list.length).fill(NaN);\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n if (item && typeof item === \"object\" && !Array.isArray(item)) {\n const v = (item as { value?: unknown }).value;\n if (typeof v === \"number\") out[i] = v;\n }\n }\n return out;\n };\n let top = options.maxValue ?? 0;\n if (options.maxValue === undefined) {\n for (const s of series) {\n const values = valuesOf(s.data);\n if (!values) continue;\n for (let i = 0; i < values.length; i++) {\n const v = Math.abs(values[i]);\n if (v > top) top = v;\n }\n }\n }\n const sizeOf = (v: number) =>\n Number.isFinite(v) && top > 0\n ? Math.max(minSize, maxSize * Math.sqrt(Math.min(1, Math.abs(v) / top)))\n : minSize;\n return series.map((s) => {\n const base: ChartSeries = {\n ...s,\n type: s.type ?? \"scatter\",\n opacity: s.opacity ?? 0.68,\n };\n if (base.type !== \"scatter\") return base;\n const data = s.data;\n if (typeof data === \"object\" && data !== null && !(\"length\" in data)) {\n const values = (data as { value?: ArrayLike<number> }).value;\n if (!values) return base;\n const size = new Float32Array(values.length);\n for (let i = 0; i < values.length; i++) size[i] = sizeOf(values[i]);\n return { ...base, data: { ...data, size } };\n }\n const list = data as ArrayLike<unknown>;\n const points: ChartPointDatum[] = [];\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n if (!item || typeof item !== \"object\" || Array.isArray(item)) continue;\n const d = item as ChartPointDatum;\n points.push({\n ...d,\n size: d.size ?? sizeOf(typeof d.value === \"number\" ? d.value : NaN),\n });\n }\n points.sort((a, b) => (b.size ?? 0) - (a.size ?? 0));\n return { ...base, data: points };\n });\n};\n\n// -------------------------------------------------------------------- gantt\n\n/** A task (or milestone) of a Gantt chart */\nexport interface GanttTask {\n /** Row name (unique) */\n name: string;\n /** Start (a timestamp or a date) */\n start: number | Date;\n /** End; omitted for milestones */\n end?: number | Date;\n /** Share done, 0-1: drawn as a solid bar over the task */\n progress?: number;\n /** Group (phase, team): a color and a legend entry per group */\n group?: string;\n /** Color of the task (any CSS color); the color of its group by default */\n color?: string;\n /** Draws a dot at `start` instead of a bar */\n milestone?: boolean;\n /** Names of the tasks this one waits for (shown in its tooltip) */\n dependencies?: readonly string[];\n}\n\n/** Options of `ganttSeries` */\nexport interface GanttOptions {\n /** Colors of the groups in order of appearance (any CSS colors); the chart palette by default */\n colors?: readonly string[];\n /**\n * Name of the tasks without a group\n * @default \"Tasks\" (in the `locale`)\n */\n taskName?: string;\n /**\n * Name of the progress bars (legend, tooltip)\n * @default \"Progress\" (in the `locale`)\n */\n progressName?: string;\n /**\n * Name of the milestones (legend, tooltip)\n * @default \"Milestones\" (in the `locale`)\n */\n milestoneName?: string;\n /** Formats the progress shares (tooltip) @default \"60%\" */\n formatProgress?: (share: number) => string;\n /**\n * Name of the dependencies row of the tooltip\n * @default \"Depends on\" (in the `locale`)\n */\n dependenciesName?: string;\n /**\n * Locale of the default names and of the progress shares\n * @default the page language\n */\n locale?: string;\n}\n\n/** Series of a Gantt chart and the row names in order */\nexport interface GanttSeries {\n series: ChartSeries[];\n /** Task names from top to bottom (the `categories` of the x axis) */\n categories: string[];\n /** Time range of the tasks with a small margin (the `min` / `max` of the value axis) */\n domain: [number, number];\n}\n\nconst THEMED = [\n \"--primary-color\",\n \"--success-color\",\n \"--warning-color\",\n \"--danger-color\",\n \"--info-color\",\n];\nconst FALLBACK = [\n \"#4f46e5\",\n \"#10b981\",\n \"#f59e0b\",\n \"#ef4444\",\n \"#0ea5e9\",\n \"#8b5cf6\",\n \"#14b8a6\",\n \"#f97316\",\n];\n\n/** Color `k` of the chart palette as a CSS color (theme variables first) */\nexport const paletteColor = (k: number): string => {\n const i = k % 8;\n const fallback = FALLBACK[i] ?? \"#4f46e5\";\n const themed = THEMED[i];\n return themed\n ? `var(--chart-series-${i + 1}, var(${themed}, ${fallback}))`\n : `var(--chart-series-${i + 1}, ${fallback})`;\n};\n\nconst time = (v: number | Date | undefined) =>\n v instanceof Date ? v.getTime() : v === undefined ? NaN : v;\n\n/**\n * Floating bar series of a Gantt chart (horizontal, on a time axis): a\n * translucent bar per task with its progress drawn over it, one series per\n * group, and the milestones as dots\n */\nexport const ganttSeries = (\n tasks: readonly GanttTask[],\n options: GanttOptions = {},\n): GanttSeries => {\n const locale = resolveLocale(options.locale);\n const names = presetLabels(locale);\n const rows = chartLabels(locale);\n const taskName = options.taskName ?? names.tasks;\n const progressName = options.progressName ?? names.progress;\n const separator = /^(zh|ja)\\b/i.test(locale) ? \"、\" : \", \";\n const groups: string[] = [];\n for (const t of tasks) {\n const g = t.group ?? taskName;\n if (!t.milestone && !groups.includes(g)) groups.push(g);\n }\n const colorOf = (g: string) => {\n const k = Math.max(0, groups.indexOf(g));\n return options.colors?.[k] ?? paletteColor(k);\n };\n const formatProgress =\n options.formatProgress ??\n ((share: number) =>\n numberFormat(locale, {\n style: \"percent\",\n maximumFractionDigits: 0,\n }).format(share));\n const series: ChartSeries[] = groups.map((g) => ({\n id: `gantt:${g}`,\n name: g,\n type: \"bar\",\n stack: \"gantt\",\n color: colorOf(g),\n opacity: 0.3,\n barWidth: 0.62,\n radius: 4,\n data: tasks\n .filter((t) => !t.milestone && (t.group ?? taskName) === g)\n .map((t) => {\n // the tooltip of a task: its progress and what it waits for\n const details: ChartTooltipDetail[] = [];\n if (t.progress !== undefined)\n details.push({\n name: progressName,\n value: formatProgress(Math.min(1, Math.max(0, t.progress))),\n });\n if (t.dependencies?.length)\n details.push({\n name: options.dependenciesName ?? rows.dependencies,\n value: t.dependencies.join(separator),\n });\n return {\n x: t.name,\n y0: time(t.start),\n y: time(t.end ?? t.start),\n ...(t.color ? { color: t.color } : {}),\n ...(details.length ? { details } : {}),\n };\n }),\n }));\n const progress = tasks.filter(\n (t) => !t.milestone && t.progress !== undefined && t.progress > 0,\n );\n if (progress.length) {\n series.push({\n id: \"gantt:progress\",\n name: progressName,\n type: \"bar\",\n stack: \"gantt\",\n // shown in the tooltip of its task\n tooltip: false,\n // every bar has the color of its task: a neutral legend swatch\n color: \"var(--text-secondary-color, #6b7280)\",\n radius: 4,\n data: progress.map((t) => {\n const start = time(t.start);\n const end = time(t.end ?? t.start);\n const share = Math.min(1, Math.max(0, t.progress ?? 0));\n return {\n x: t.name,\n y0: start,\n y: start + (end - start) * share,\n label: formatProgress(share),\n color: t.color ?? colorOf(t.group ?? taskName),\n };\n }),\n });\n }\n const milestones = tasks.filter((t) => t.milestone);\n if (milestones.length) {\n series.push({\n id: \"gantt:milestones\",\n name: options.milestoneName ?? names.milestones,\n type: \"scatter\",\n color: \"var(--text-color, #1f2937)\",\n pointSize: 13,\n opacity: 1,\n data: milestones.map((t) => ({\n x: t.name,\n y: time(t.start),\n ...(t.color ? { color: t.color } : {}),\n })),\n });\n }\n let lo = Infinity;\n let hi = -Infinity;\n for (const t of tasks) {\n for (const v of [time(t.start), time(t.end ?? t.start)]) {\n if (v < lo) lo = v;\n if (v > hi) hi = v;\n }\n }\n // room for the milestone dots at the ends\n const pad = Number.isFinite(hi - lo) ? Math.max((hi - lo) * 0.025, 1) : 0;\n return {\n series,\n categories: tasks.map((t) => t.name),\n domain: Number.isFinite(lo) ? [lo - pad, hi + pad] : [0, 1],\n };\n};\n\n// -------------------------------------------------------------- range areas\n\n/** Series of a RangeAreaChart: bands between `y0` and `y` (thin edges) */\nexport const rangeAreaSeries = (\n series: readonly ChartSeries[],\n curve?: ChartCurve,\n) =>\n withSeriesType(series, \"area\", undefined, curve).map((s) =>\n s.type === \"area\" ? { ...s, lineWidth: s.lineWidth ?? 1.5 } : s,\n );\n"],"mappings":"mFAqCA,IAAMQ,EAA+C,CACnD,GAAI,CACF,MAAO,QACP,OAAQ,SACR,MAAO,QACP,OAAQ,SACR,MAAO,QACP,SAAU,WACV,WAAY,YACd,EACA,GAAI,CACF,MAAO,KACP,OAAQ,KACR,MAAO,KACP,OAAQ,KACR,MAAO,KACP,SAAU,KACV,WAAY,KACd,EACA,GAAI,CACF,MAAO,IACP,OAAQ,IACR,MAAO,KACP,OAAQ,KACR,MAAO,MACP,SAAU,KACV,WAAY,SACd,EACA,GAAI,CACF,MAAO,SACP,OAAQ,UACR,MAAO,WACP,OAAQ,YACR,MAAO,SACP,SAAU,aACV,WAAY,QACd,CACF,EAGaC,EAAgB,GAC3BT,EAAAA,aAAaQ,EAAeE,CAAM,EAGvBC,GACX,EACA,EACA,EACA,IAEAC,EAAO,IAAK,GAAM,CAChB,IAAMC,EAAIC,EAAE,MAAQC,EACpB,MAAO,CACL,GAAGD,EACH,KAAMD,EACN,GAAIG,IAAU,IAAA,IAAaH,IAAME,EAAO,CAAE,MAAOD,EAAE,OAASE,CAAM,EAAI,CAAC,EACvE,GAAIC,IAAU,IAAA,KAAcJ,IAAM,QAAUA,IAAM,QAC9C,CAAE,MAAOC,EAAE,OAASG,CAAM,EAC1B,CAAC,CACP,CACF,CAAC,EAWUC,GACX,EACA,EAAO,GACP,EAA2B,CAAC,IAE5BP,EACEC,EACAO,EAAO,OAAS,OAChBC,EAAM,QAAU,QAAU,IAAA,GAC1BA,EAAM,KACR,EAGWC,GACX,EACA,EAA2B,CAAC,IACzBH,EAAWN,EAAQ,GAAMQ,CAAK,EAGtBE,GACX,EACA,EAAU,GACV,EAAS,KAETX,EAAeC,EAAQ,MAAOW,EAAU,QAAU,IAAA,EAAS,CAAC,CAAC,IAAK,GAChEC,GAAUV,EAAE,OAAS,MAAQ,CAAE,GAAGA,EAAG,WAAYA,EAAE,YAAc,EAAK,EAAIA,CAC5E,EAGWW,EAAiB,GAC5Bd,EAAeC,EAAQ,SAAS,EAGrBc,EAAqB,GAChCf,EAAeC,EAAQ,aAAa,EA0CzBe,GACX,EACA,EAA8B,CAAC,IACd,CACjB,IAAMC,EAAWC,EAAO,KAAK,KAAM,GAAM,OAAOC,EAAE,GAAM,QAAQ,EAC1DC,EAAWF,EAAO,KAAK,KAAM,GAAM,OAAOC,EAAE,GAAM,QAAQ,EAChE,MAAO,CACL,GAAGE,EACH,OAAQ,CACN,CACE,GAAI,UACJ,KAAMH,EAAO,MAAQpB,EAAauB,EAAK,MAAM,CAAC,CAAC,MAC/C,KAAM,UACN,KAAMH,EAAO,KAAK,IAAK,IAAO,CAAE,EAAGC,EAAE,EAAG,EAAGA,EAAE,EAAG,MAAOA,EAAE,KAAM,EAAE,EACjE,WAAYD,EAAO,WACnB,WAAYA,EAAO,WACnB,cAAeA,EAAO,cACtB,OAAQA,EAAO,OACf,OAAQA,EAAO,MACjB,CACF,EACA,MAAO,CACL,GAAID,EACA,CAAC,EACD,CAAE,KAAM,WAAqB,WAAYC,EAAO,WAAY,EAChE,KAAM,GACN,GAAGG,EAAK,KACV,EACA,MAAO,CACL,GAAID,EACA,CAAC,EACD,CAAE,KAAM,WAAqB,WAAYF,EAAO,WAAY,EAChE,KAAM,GACN,GAAGG,EAAK,KACV,EAEA,OAAQA,EAAK,QAAU,GACvB,YAAaA,EAAK,aAAe,CAAE,KAAM,EAAM,EAC/C,QAASA,EAAK,SAAW,CAAE,KAAM,SAAU,CAC7C,CACF,EA2BaC,GACX,EACA,EAA8B,CAAC,IACd,CACjB,IAAMlB,EAAOc,EAAO,MAAQ,OAC5B,MAAO,CACL,GAAGG,EACH,OAAQ,CACN,CACE,GAAI,YACJ,KAAMH,EAAO,MAAQpB,EAAauB,EAAK,MAAM,CAAC,CAAC,MAC/C,OACA,KAAMH,EAAO,KACb,MAAOA,EAAO,MACd,MAAOd,IAAS,MAAQ,IAAA,GAAac,EAAO,OAAS,SACrD,UAAW,IACX,QAASd,IAAS,OAAS,IAAO,IAAA,GAClC,OAAQA,IAAS,MAAQ,IAAM,IAAA,GAC/B,OAAQc,EAAO,MACjB,CACF,EACA,MAAO,CAAE,QAAS,GAAO,KAAM,GAAO,GAAGG,EAAK,KAAM,EACpD,MAAO,CAAE,QAAS,GAAO,KAAM,GAAO,KAAM,GAAO,GAAGA,EAAK,KAAM,EACjE,OAAQ,GACR,QAASA,EAAK,SAAW,CAAE,IAAK,EAAG,MAAO,EAAG,OAAQ,EAAG,KAAM,CAAE,EAChE,YAAaA,EAAK,aAAe,CAAE,KAAM,EAAM,EAC/C,YACEH,EAAO,YAAc,IAAA,GAUjBG,EAAK,YATL,CACE,GAAIA,EAAK,aAAe,CAAC,EACzB,CACE,KAAM,OACN,KAAM,IACN,MAAOH,EAAO,UACd,KAAM,CAAC,EAAG,CAAC,CACb,CACF,CAER,CACF,EA4FaK,EACX,CACE,QAAS,+BACT,SAAU,gCACV,WAAY,gCACZ,YAAa,sCACf,EAEIC,EAAU,2DAEVC,EAAU,GAA2B,CACzC,GAAM,CAACC,EAAIC,GAAMT,EAAO,SAAW,CAAC,EAAG,EAAE,EACnC,CAACU,EAAIC,GAAMX,EAAO,SAAW,CAAC,EAAG,EAAE,EACzC,MAAO,CACL,KACA,KACA,KACA,KACA,GAAIA,EAAO,SAAWQ,EAAKC,GAAM,EACjC,GAAIT,EAAO,SAAWU,EAAKC,GAAM,CACnC,CACF,EAGaC,GACX,EAIA,EACA,IACmB,CACnB,GAAM,CAAE,KAAI,MAAOL,EAAOP,CAAwB,EAC5Ca,EAAQb,EAAO,SAAWc,EAAIC,EAAKD,GAAKC,EAE9C,OADYC,GAAKC,EAEbJ,EACE,WACA,UACFA,EACE,cACA,YACR,EAGaK,GACX,EAIA,IAC6B,CAC7B,GAAM,CAAE,KAAI,KAAI,KAAI,KAAI,KAAI,MAAOX,EAAOP,CAAwB,EAC5DmB,EAAcC,EAAO,SAAS,OAAO,EAE3C,MAAO,CACL,GAFepB,EAAO,SAAW,CAACmB,EAAcA,IAEjCJ,EAAKN,GAAM,GAAKD,EAAKO,GAAM,EAC1C,EAAGK,EAAO,WAAW,KAAK,GAAKH,EAAKN,GAAM,GAAKD,EAAKO,GAAM,CAC5D,CACF,EAGaI,GACX,EACA,EAAqC,CAAC,IACrB,CACjB,GAAM,CAAE,KAAI,KAAI,KAAI,KAAI,KAAI,MAAOd,EAAOP,CAAM,EAC1CsB,EAAW,CAAC,CAACtB,EAAO,SACpBuB,EAAS,GACbvB,EAAO,YAAYoB,EAAO,EAAE,OAASf,EAAwBe,GAEzDrC,EAAwB,CAC5B,CACE,KAAM,UACN,KAAMiB,EAAO,MAAQ,GACrB,UAAWA,EAAO,WAAa,GAC/B,WAAYA,EAAO,YAAc,GACjC,QAAS,GACT,KAAMA,EAAO,OAAO,IAAK,IAAO,CAC9B,EAAGwB,EAAE,EACL,EAAGA,EAAE,EACL,MAAOA,EAAE,MACT,KAAMA,EAAE,KACR,MAAOA,EAAE,OAASD,EAAMX,EAAWZ,EAAQwB,EAAE,EAAGA,EAAE,CAAC,CAAC,CACtD,EAAE,CACJ,CACF,EAGMC,EAAyBH,EAAW,CAACP,EAAIN,CAAE,EAAI,CAACD,EAAIO,CAAE,EACtDF,EAA0BS,EAAW,CAACd,EAAIO,CAAE,EAAI,CAACA,EAAIN,CAAE,EACvDiB,GACJ,EACA,CAACC,EAAIC,GACL,CAACC,EAAIC,GACL,KACqB,CACrB,KAAM,OACN,GAAIH,EACJ,GAAIC,EACJ,GAAIC,EACJ,GAAIC,EACJ,MAAOP,EAAMH,CAAM,EACnB,QAAS,IACT,MAAOpB,EAAO,YAAYoB,EAAO,EAAE,MACnC,cAAeW,CACjB,GACMC,EAAOhC,EAAO,YAAc,CAAC,EAC7BiC,EAAaX,EAAWb,EAAKD,EAC7BW,EAAcG,EAAWd,EAAKC,EAC9ByB,EAA2B,CAC/B,GAAIF,EAAK,IACL,CAAC,CAAE,KAAM,OAAQ,EAAGjB,EAAI,EAAGJ,EAAI,KAAMqB,EAAK,IAAK,OAAQ,KAAM,CAAU,EACvE,CAAC,EACL,GAAIA,EAAK,OACL,CACE,CACE,KAAM,OACN,EAAGjB,EACH,EAAGL,EACH,KAAMsB,EAAK,OACX,OAAQ,QACV,CACF,EACA,CAAC,EACL,GAAIA,EAAK,KACL,CACE,CACE,KAAM,OACN,EAAGC,EACH,EAAGhB,EACH,KAAMe,EAAK,KACX,OAAQ,MACV,CACF,EACA,CAAC,EACL,GAAIA,EAAK,MACL,CACE,CACE,KAAM,OACN,EAAGb,EACH,EAAGF,EACH,KAAMe,EAAK,MACX,OAAQ,OACV,CACF,EACA,CAAC,CACP,EAEMG,EAAiC,CACrCT,EAAK,UAAWD,EAAM,CAACR,EAAIN,CAAE,EAAG,UAAU,EAC1Ce,EAAK,WAAYb,EAAO,CAACI,EAAIN,CAAE,EAAG,WAAW,EAC7Ce,EAAK,aAAcD,EAAM,CAACf,EAAIO,CAAE,EAAG,aAAa,EAChDS,EAAK,cAAeb,EAAO,CAACH,EAAIO,CAAE,EAAG,cAAc,EACnD,CAAE,KAAM,OAAQ,KAAM,IAAK,MAAOF,EAAI,KAAM,CAAC,EAAG,MAAOT,CAAQ,EAC/D,CAAE,KAAM,OAAQ,KAAM,IAAK,MAAOW,EAAI,KAAM,CAAC,EAAG,MAAOX,CAAQ,EAC/D,GAAG4B,EACH,GAAI/B,EAAK,aAAe,CAAC,CAC3B,EAEMiC,EAAYpC,EAAO,WAAa,GAChCqC,EACJlC,EAAK,cAAgB,IAEjB,CACE,KAAM,GACN,GAAI,OAAOA,EAAK,aAAgB,SAAWA,EAAK,YAAc,CAAC,EAC/D,GAAIH,EAAO,UAAY,CAAE,WAAY,EAAK,EAAI,CAAC,CACjD,EAEN,MAAO,CACL,GAAGG,EACH,SACA,cACA,QACEA,EAAK,UACJiC,EACG,IAAA,GACA,CACE,OAAS,GAAU,CACjB,IAAME,EAAOC,EAAM,MAAM,GACzB,GAAI,CAACD,EAAM,OAAO,KAClB,IAAME,EACJxC,EAAO,YAAYY,EAAWZ,EAAQsC,EAAK,EAAGA,EAAK,CAAC,EAAE,EAAE,MAC1D,MAAO,CAACA,EAAK,OAAStC,EAAO,MAAQ,GAAIwC,GAAU,EAAE,CAAC,CACnD,OAAO,OAAO,CAAC,CACf,KAAK;CAAI,CACd,CACF,GACN,MAAO,CACL,IAAKhC,EACL,IAAKC,EACL,MAAOT,EAAO,OACd,QAASsB,EACT,KAAM,GACN,KAAM,GACN,UAAW,EACX,QAASc,GAAa,CAAC,CAACpC,EAAO,OAC/B,GAAIoC,EAAY,CAAC,EAAI,CAAE,WAAc,EAAG,CAC1C,EACA,MAAO,CACL,IAAK1B,EACL,IAAKC,EACL,MAAOX,EAAO,OACd,KAAM,GACN,KAAM,GACN,UAAW,EACX,QAASoC,GAAa,CAAC,CAACpC,EAAO,OAC/B,GAAIoC,EAAY,CAAC,EAAI,CAAE,WAAc,EAAG,CAC1C,EACA,OAAQjC,EAAK,QAAU,GACvB,QACEA,EAAK,UACJiC,EAAY,IAAA,GAAY,CAAE,IAAK,EAAG,MAAO,EAAG,OAAQ,EAAG,KAAM,CAAE,GAClE,aACF,CACF,EAKMK,EAAgB,GAA4C,CAChE,IAAIC,EAAI,EACR,IAAK,IAAIC,EAAI,EAAGA,EAAIC,EAAO,OAAQ,IAAS,OAAO,SAASA,EAAOD,EAAE,GAAG,IACxE,IAAME,EAAM,IAAI,aAAaH,CAAC,EAC1BI,EAAI,EACR,IAAK,IAAIH,EAAI,EAAGA,EAAIC,EAAO,OAAQ,IAAK,CACtC,IAAMG,EAAIH,EAAOD,GACb,OAAO,SAASI,CAAC,IAAG,EAAI,KAAOA,EACrC,CACA,OAAOF,EAAI,KAAK,CAClB,EAGMG,GAAc,EAA2B,IAAsB,CACnE,IAAM,EAAIC,EAAO,OACjB,GAAI,CAAC,EAAG,MAAO,KACf,IAAMC,EAAK,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG1B,CAAC,CAAC,GAAK,EAAI,GACxC2B,EAAK,KAAK,MAAMD,CAAE,EAClBE,EAAK,KAAK,IAAI,EAAI,EAAGD,EAAK,CAAC,EACjC,OAAOF,EAAOE,IAAOF,EAAOG,GAAMH,EAAOE,KAAQD,EAAKC,EACxD,EAMaE,GACX,EACA,IACa,CACb,IAAMJ,EAASR,EAAaG,CAAM,EAClC,OAAOU,EAAG,IAAK,GAAMN,EAAWC,EAAQzB,CAAC,CAAC,CAC5C,EAsCM+B,EAAgB,IAOTC,GACX,EACA,EAAsB,CAAC,IACL,CAClB,IAAId,EAAI,EACJe,EAAM,IACNC,EAAM,KACV,IAAK,IAAIf,EAAI,EAAGA,EAAIC,EAAO,OAAQ,IAAK,CACtC,IAAMG,EAAIH,EAAOD,GACZ,OAAO,SAASI,CAAC,IACtB,IACIA,EAAIU,IAAK,EAAMV,GACfA,EAAIW,IAAK,EAAMX,GACrB,CACA,GAAI,CAACI,EAAIC,GAAMO,EAAQ,QAAU,CAACF,EAAKC,CAAG,EAC1C,GAAI,CAAChB,GAAK,CAAC,OAAO,SAASS,CAAE,GAAK,CAAC,OAAO,SAASC,CAAE,EACnD,MAAO,CAAE,MAAO,CAAC,EAAG,CAAC,EAAG,OAAQ,CAAC,CAAC,EAAG,MAAO,EAAG,MAAO,CAAE,EAEtDD,EAAKC,IAAI,CAACD,EAAIC,GAAM,CAACA,EAAID,CAAE,GAC3BC,IAAOD,IACT,GAAM,GACN,GAAM,IAER,IAAMS,EAAOR,EAAKD,EACZU,EAAOF,EAAQ,MAAQ,OACvBG,EAAU,KAAK,KAAK,KAAK,KAAKpB,CAAC,CAAC,EAAI,EACtCqB,EACJ,GAAI,OAAOF,GAAS,SAClB,EAAQ,KAAK,MAAMA,CAAI,OAClB,GAAIA,IAAS,UAClB,EAAQC,MACH,CAEL,IAAME,EAAS,KAAK,IAAI,EAAG,KAAK,MAAMpB,EAAO,OAASW,CAAa,CAAC,EAC9DU,EAAmB,CAAC,EAC1B,IAAK,IAAItB,EAAI,EAAGA,EAAIC,EAAO,OAAQ,GAAKoB,EAAQ,CAC9C,IAAMjB,EAAIH,EAAOD,GACb,OAAO,SAASI,CAAC,GAAGkB,EAAO,KAAKlB,CAAC,CACvC,CACA,IAAME,EAAS,aAAa,KAAKgB,CAAM,CAAC,CAAC,KAAK,EAExCC,EAAS,GADHlB,EAAWC,EAAQ,GAAI,EAAID,EAAWC,EAAQ,GAAI,GACpC,KAAK,KAAKP,CAAC,EACrC,EAAQwB,EAAQ,EAAI,KAAK,KAAKN,EAAOM,CAAK,EAAIJ,CAChD,CACA,EAAQ,KAAK,IAAI,EAAG,KAAK,IAAI,IAAMC,GAAS,CAAC,CAAC,EAC9C,IAAIG,EAAQN,EAAOG,EACfI,EAAQhB,GACRQ,EAAQ,MAAQ,MAClB,EAAQvF,EAAAA,SAAS+E,EAAIC,EAAIW,CAAK,GAAKG,EACnC,EAAQ,KAAK,MAAMf,EAAKe,EAAQ,IAAI,EAAIA,EACxC,EAAQ,KAAK,IAAI,EAAG,KAAK,MAAMd,EAAKe,GAASD,EAAQ,IAAI,CAAC,GAE5D,IAAME,EAAMD,EAAQJ,EAAQG,EACtBG,EAAa,MAAcN,CAAK,CAAC,CAAC,KAAK,CAAC,EAC1CO,EAAQ,EACZ,IAAK,IAAI3B,EAAI,EAAGA,EAAIC,EAAO,OAAQ,IAAK,CACtC,IAAMG,EAAIH,EAAOD,GACjB,GAAI,EAAEI,GAAKoB,GAASpB,GAAKqB,GAAM,SAE/B,IAAMtB,EAAI,KAAK,IAAIiB,EAAQ,EAAG,KAAK,OAAOhB,EAAIoB,GAASD,CAAK,CAAC,EAC7D,EAAOpB,EAAE,GACT,GACF,CACA,IAAMyB,EAAkB,CAAC,EACzB,IAAK,IAAIzB,EAAI,EAAGA,GAAKiB,EAAO,IAC1BQ,EAAM,KAAK,QAAQJ,EAAQrB,EAAIoB,EAAA,CAAO,YAAY,EAAE,CAAC,CAAC,EACxD,MAAO,CAAE,QAAO,SAAQ,QAAO,OAAM,CACvC,EAoBaM,GACX,EACA,EAAkC,CAAC,IACnB,CAChB,IAAMC,EAAOd,EAAQ,QAAUH,EAAUZ,EAAQe,CAAO,EAClD9E,EAASR,EAAAA,cAAcsF,EAAQ,MAAM,EACrCe,EACJf,EAAQ,SAAY,GAAkBgB,EAAWC,EAAO/F,CAAM,GAChE,MAAO,CACL,GAAI,YACJ,KAAM8E,EAAQ,MAAQ/E,EAAaC,CAAM,CAAC,CAAC,MAC3C,KAAM,MACN,MAAO8E,EAAQ,MACf,SAAU,EACV,OAAQ,EACR,KAAMc,EAAK,OAAO,KAAK,EAAO,IAAM,CAClC,IAAMI,EAAIJ,EAAK,MAAM3B,IAAM,EACrBgC,EAAIL,EAAK,MAAM3B,EAAI,IAAM+B,EAC/B,MAAO,CACL,GAAIA,EAAIC,GAAK,EACb,EAAGf,EACH,MAAO,GAAGW,EAAOG,CAAC,EAAE,KAAKH,EAAOI,CAAC,GACnC,CACF,CAAC,CACH,CACF,EAEMH,GAAc,EAAe,IACjCrG,EAAAA,aAAaO,EAAQ,CAAE,yBAA0B,CAAE,CAAC,CAAC,CAAC,OAAO+F,CAAK,EAiCvDG,GACX,EACA,EAA+B,CAAC,IACf,CACjB,IAAM9B,EAASR,EAAaG,CAAM,EAC5BF,EAAIO,EAAO,OACjB,GAAI,CAACP,EACH,MAAO,CACL,IAAK,IACL,GAAI,IACJ,OAAQ,IACR,GAAI,IACJ,KAAM,IACN,SAAU,CAAC,EACX,IAAK,IACL,IAAK,IACL,KAAM,IACN,MAAO,CACT,EAEF,IAAMsC,EAAKhC,EAAWC,EAAQ,GAAI,EAC5BgC,EAASjC,EAAWC,EAAQ,EAAG,EAC/BiC,EAAKlC,EAAWC,EAAQ,GAAI,EAC5BQ,EAAMR,EAAO,GACbS,EAAMT,EAAOP,EAAI,GACnByC,EAAM,EACV,IAAK,IAAIxC,EAAI,EAAGA,EAAID,EAAG,IAAK,GAAOO,EAAON,GAC1C,IAAMyC,EAAUzB,EAAQ,SAAW,IAC/B0B,EAAM5B,EACN6B,EAAO5B,EACL6B,EAAqB,CAAC,EAC5B,GAAIH,IAAY,SAAU,CACxB,IAAMI,GAASN,EAAKF,GAAMI,EACpBK,EAAOT,EAAKQ,EACZE,EAAKR,EAAKM,EACZ7C,EAAI,EACR,KAAOA,EAAID,GAAKO,EAAON,GAAK8C,GAAMF,EAAS,KAAKtC,EAAO,IAAI,EAC3D,EAAMN,EAAID,EAAIO,EAAON,GAAKqC,EAC1B,IAAIW,EAAIjD,EAAI,EACNkD,EAAkB,CAAC,EACzB,KAAOD,GAAK,GAAK1C,EAAO0C,GAAKD,GAAIE,EAAM,KAAK3C,EAAO,IAAI,EACvD,EAAO0C,GAAK,EAAI1C,EAAO0C,GAAKT,EAC5BK,EAAS,KAAK,GAAGK,EAAM,QAAQ,CAAC,CAClC,CACA,MAAO,CACL,IAAK,KAAK,IAAIP,EAAKL,CAAE,EACrB,KACA,SACA,KACA,KAAM,KAAK,IAAIM,EAAMJ,CAAE,EACvB,WACA,MACA,MACA,KAAMC,EAAMzC,EACZ,MAAOA,CACT,CACF,EAaamD,GACX,EACA,EAA+B,CAAC,IAEhCC,EAAO,IAAK,GAAM,CAChB,IAAM7G,EAAI8F,EAAagB,EAAE,OAAQpC,CAAO,EACxC,MAAO,CACL,EAAGoC,EAAE,EACL,EAAG,OAAO,SAAS9G,EAAE,MAAM,EAAIA,EAAE,OAAS,KAC1C,IAAKA,EAAE,IACP,GAAIA,EAAE,GACN,GAAIA,EAAE,GACN,KAAMA,EAAE,KACR,SAAUA,EAAE,SACZ,GAAI8G,EAAE,MAAQ,CAAE,MAAOA,EAAE,KAAM,EAAI,CAAC,CACtC,CACF,CAAC,EAGUC,EAAiB,GAC5BlH,EAAeC,EAAQ,SAAS,EA0DrBkH,GACX,EACA,EAA4B,CAAC,IACb,CAChB,IAAMC,EAAKvC,EAAQ,SAAW,gCACxBwC,EAAOxC,EAAQ,WAAa,+BAC5BW,EAAQX,EAAQ,YAAc,gCAChCyC,EAAUzC,EAAQ,OAAS,EACzB0C,EAA0BC,EAAM,IAAK,GAAS,CAClD,GAAIC,EAAK,OAAS,SAAWA,EAAK,OAAS,WACzC,MAAO,CAAE,EAAGA,EAAK,MAAO,EAAGH,EAAS,MAAOG,EAAK,OAASjC,CAAM,EAEjE,IAAMM,EAAQ2B,EAAK,OAAS,EACtBd,EAAOW,EAEb,MADA,IAAWxB,EACJ,CACL,EAAG2B,EAAK,MACR,GAAId,EACJ,EAAGW,EACH,MAAOG,EAAK,QAAU3B,GAAS,EAAIsB,EAAKC,EAC1C,CACF,CAAC,EACD,MAAO,CACL,GAAI,YACJ,KAAMxC,EAAQ,MAAQ/E,EAAa+E,EAAQ,MAAM,CAAC,CAAC,OACnD,KAAM,MACN,MAAOW,EACP,OACA,WAAYX,EAAQ,QAAU,GAC9B,OAAQA,EAAQ,OAChB,UAAWA,EAAQ,WAAa,EAClC,CACF,EA2Ba6C,GACX,EACA,EAAyB,CAAC,IACR,CAClB,IAAMC,EAAU9C,EAAQ,SAAW,EAC7B+C,EAAU/C,EAAQ,SAAW,GAC7BgD,EAAY,GAAwD,CACxE,GAAI,OAAON,GAAS,WAAYA,EAAe,OAAO,KACtD,GAAI,EAAE,WAAYA,GAEhB,OADWA,EAAuC,OACtC,KAEd,IAAMO,EAAOP,EACPxD,EAAM,IAAI,aAAa+D,EAAK,MAAM,CAAC,CAAC,KAAK,GAAG,EAClD,IAAK,IAAIjE,EAAI,EAAGA,EAAIiE,EAAK,OAAQ,IAAK,CACpC,IAAMtE,EAAOsE,EAAKjE,GAClB,GAAIL,GAAQ,OAAOA,GAAS,UAAY,CAAC,MAAM,QAAQA,CAAI,EAAG,CAC5D,IAAMS,EAAKT,EAA6B,MACpC,OAAOS,GAAM,WAAU,EAAIJ,GAAKI,EACtC,CACF,CACA,OAAOF,CACT,EACIgE,EAAMlD,EAAQ,UAAY,EAC9B,GAAIA,EAAQ,WAAa,IAAA,GACvB,IAAK,IAAM1E,KAAKF,EAAQ,CACtB,IAAM6D,EAAS+D,EAAS1H,EAAE,IAAI,EAC9B,GAAK2D,EACL,IAAK,IAAID,EAAI,EAAGA,EAAIC,EAAO,OAAQ,IAAK,CACtC,IAAMG,EAAI,KAAK,IAAIH,EAAOD,EAAE,EACxBI,EAAI8D,IAAK,EAAM9D,EACrB,CACF,CAEF,IAAM+D,EAAU,GACd,OAAO,SAAS/D,CAAC,GAAK8D,EAAM,EACxB,KAAK,IAAIJ,EAASC,EAAU,KAAK,KAAK,KAAK,IAAI,EAAG,KAAK,IAAI3D,CAAC,EAAI8D,CAAG,CAAC,CAAC,EACrEJ,EACN,OAAO1H,EAAO,IAAK,GAAM,CACvB,IAAMoB,EAAoB,CACxB,GAAGlB,EACH,KAAMA,EAAE,MAAQ,UAChB,QAASA,EAAE,SAAW,GACxB,EACA,GAAIkB,EAAK,OAAS,UAAW,OAAOA,EACpC,IAAMkG,EAAOpH,EAAE,KACf,GAAI,OAAOoH,GAAS,UAAYA,GAAiB,EAAE,WAAYA,GAAO,CACpE,IAAMzD,EAAUyD,EAAuC,MACvD,GAAI,CAACzD,EAAQ,OAAOzC,EACpB,IAAM4G,EAAO,IAAI,aAAanE,EAAO,MAAM,EAC3C,IAAK,IAAID,EAAI,EAAGA,EAAIC,EAAO,OAAQ,IAAK,EAAKD,GAAKmE,EAAOlE,EAAOD,EAAE,EAClE,MAAO,CAAE,GAAGxC,EAAM,KAAM,CAAE,GAAGkG,EAAM,MAAK,CAAE,CAC5C,CACA,IAAMO,EAAOP,EACPW,EAA4B,CAAC,EACnC,IAAK,IAAIrE,EAAI,EAAGA,EAAIiE,EAAK,OAAQ,IAAK,CACpC,IAAMtE,EAAOsE,EAAKjE,GAClB,GAAI,CAACL,GAAQ,OAAOA,GAAS,UAAY,MAAM,QAAQA,CAAI,EAAG,SAC9D,IAAM2E,EAAI3E,EACV0E,EAAO,KAAK,CACV,GAAGC,EACH,KAAMA,EAAE,MAAQH,EAAO,OAAOG,EAAE,OAAU,SAAWA,EAAE,MAAQ,GAAG,CACpE,CAAC,CACH,CAEA,OADAD,EAAO,MAAM,EAAG,KAAOlC,EAAE,MAAQ,IAAMD,EAAE,MAAQ,EAAE,EAC5C,CAAE,GAAG1E,EAAM,KAAM6G,CAAO,CACjC,CAAC,CACH,EAkEME,EAAS,CACb,kBACA,kBACA,kBACA,iBACA,cACF,EACMC,EAAW,CACf,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EAGaC,EAAgB,GAAsB,CACjD,IAAMzE,EAAIG,EAAI,EACRuE,EAAWF,EAASxE,IAAM,UAC1B2E,EAASJ,EAAOvE,GACtB,OAAO2E,EACH,sBAAsB3E,EAAI,EAAE,QAAQ2E,EAAO,IAAID,EAAS,IACxD,sBAAsB1E,EAAI,EAAE,IAAI0E,EAAS,EAC/C,EAEME,EAAQ,GACZxE,aAAa,KAAOA,EAAE,QAAQ,EAAIA,IAAM,IAAA,GAAY,IAAMA,EAO/CyE,GACX,EACA,EAAwB,CAAC,IACT,CAChB,IAAM3I,EAASR,EAAAA,cAAcsF,EAAQ,MAAM,EACrC8D,EAAQ7I,EAAaC,CAAM,EAC3B6I,EAAOnJ,EAAAA,YAAYM,CAAM,EACzB8I,EAAWhE,EAAQ,UAAY8D,EAAM,MACrCG,EAAejE,EAAQ,cAAgB8D,EAAM,SAC7CI,EAAY,cAAc,KAAKhJ,CAAM,EAAI,IAAM,KAC/CiH,EAAmB,CAAC,EAC1B,IAAK,IAAM9G,KAAK8I,EAAO,CACrB,IAAM/B,EAAI/G,EAAE,OAAS2I,EACjB,CAAC3I,EAAE,WAAa,CAAC8G,EAAO,SAASC,CAAC,GAAGD,EAAO,KAAKC,CAAC,CACxD,CACA,IAAMgC,EAAW,GAAc,CAC7B,IAAMjF,EAAI,KAAK,IAAI,EAAGgD,EAAO,QAAQC,CAAC,CAAC,EACvC,OAAOpC,EAAQ,SAASb,IAAMsE,EAAatE,CAAC,CAC9C,EACMkF,EACJrE,EAAQ,iBACN,GACArF,EAAAA,aAAaO,EAAQ,CACnB,MAAO,UACP,sBAAuB,CACzB,CAAC,CAAC,CAAC,OAAOoJ,CAAK,GACblJ,EAAwB+G,EAAO,IAAK,IAAO,CAC/C,GAAI,SAASC,IACb,KAAMA,EACN,KAAM,MACN,MAAO,QACP,MAAOgC,EAAQhC,CAAC,EAChB,QAAS,GACT,SAAU,IACV,OAAQ,EACR,KAAM+B,EACH,OAAQ,GAAM,CAAC,EAAE,YAAc,EAAE,OAASH,KAAc5B,CAAC,CAAC,CAC1D,IAAK,GAAM,CAEV,IAAMmC,EAAgC,CAAC,EAWvC,OAVIlJ,EAAE,WAAa,IAAA,IACjBkJ,EAAQ,KAAK,CACX,KAAMN,EACN,MAAOI,EAAe,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGhJ,EAAE,QAAQ,CAAC,CAAC,CAC5D,CAAC,EACCA,EAAE,cAAc,QAClBkJ,EAAQ,KAAK,CACX,KAAMvE,EAAQ,kBAAoB+D,EAAK,aACvC,MAAO1I,EAAE,aAAa,KAAK6I,CAAS,CACtC,CAAC,EACI,CACL,EAAG7I,EAAE,KACL,GAAIuI,EAAKvI,EAAE,KAAK,EAChB,EAAGuI,EAAKvI,EAAE,KAAOA,EAAE,KAAK,EACxB,GAAIA,EAAE,MAAQ,CAAE,MAAOA,EAAE,KAAM,EAAI,CAAC,EACpC,GAAIkJ,EAAQ,OAAS,CAAE,SAAQ,EAAI,CAAC,CACtC,CACF,CAAC,CACL,EAAE,EACIC,EAAWL,EAAM,OACpB,GAAM,CAAC9I,EAAE,WAAaA,EAAE,WAAa,IAAA,IAAaA,EAAE,SAAW,CAClE,EACImJ,EAAS,QACXpJ,EAAO,KAAK,CACV,GAAI,iBACJ,KAAM6I,EACN,KAAM,MACN,MAAO,QAEP,QAAS,GAET,MAAO,uCACP,OAAQ,EACR,KAAMO,EAAS,IAAK,GAAM,CACxB,IAAMhE,EAAQoD,EAAKvI,EAAE,KAAK,EACpBoF,EAAMmD,EAAKvI,EAAE,KAAOA,EAAE,KAAK,EAC3BiJ,EAAQ,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGjJ,EAAE,UAAY,CAAC,CAAC,EACtD,MAAO,CACL,EAAGA,EAAE,KACL,GAAImF,EACJ,EAAGA,GAASC,EAAMD,GAAS8D,EAC3B,MAAOD,EAAeC,CAAK,EAC3B,MAAOjJ,EAAE,OAAS+I,EAAQ/I,EAAE,OAAS2I,CAAQ,CAC/C,CACF,CAAC,CACH,CAAC,EAEH,IAAMS,EAAaN,EAAM,OAAQ,GAAM9I,EAAE,SAAS,EAC9CoJ,EAAW,QACbrJ,EAAO,KAAK,CACV,GAAI,mBACJ,KAAM4E,EAAQ,eAAiB8D,EAAM,WACrC,KAAM,UACN,MAAO,6BACP,UAAW,GACX,QAAS,EACT,KAAMW,EAAW,IAAK,IAAO,CAC3B,EAAGpJ,EAAE,KACL,EAAGuI,EAAKvI,EAAE,KAAK,EACf,GAAIA,EAAE,MAAQ,CAAE,MAAOA,EAAE,KAAM,EAAI,CAAC,CACtC,EAAE,CACJ,CAAC,EAEH,IAAImE,EAAK,IACLC,EAAK,KACT,IAAK,IAAMpE,KAAK8I,EACd,IAAK,IAAM/E,IAAK,CAACwE,EAAKvI,EAAE,KAAK,EAAGuI,EAAKvI,EAAE,KAAOA,EAAE,KAAK,CAAC,EAChD+D,EAAII,IAAI,EAAKJ,GACbA,EAAIK,IAAI,EAAKL,GAIrB,IAAMsF,EAAM,OAAO,SAASjF,EAAKD,CAAE,EAAI,KAAK,KAAKC,EAAKD,GAAM,KAAO,CAAC,EAAI,EACxE,MAAO,CACL,SACA,WAAY2E,EAAM,IAAK,GAAM9I,EAAE,IAAI,EACnC,OAAQ,OAAO,SAASmE,CAAE,EAAI,CAACA,EAAKkF,EAAKjF,EAAKiF,CAAG,EAAI,CAAC,EAAG,CAAC,CAC5D,CACF,EAKaC,GACX,EACA,IAEAxJ,EAAeC,EAAQ,OAAQ,IAAA,GAAWK,CAAK,CAAC,CAAC,IAAK,GACpDH,EAAE,OAAS,OAAS,CAAE,GAAGA,EAAG,UAAWA,EAAE,WAAa,GAAI,EAAIA,CAChE"}
1
+ {"version":3,"file":"presets.cjs","names":["localeLabels","tickStep","resolveLocale","numberFormat","chartLabels","require_locale","require_labels","require_scale","PRESET_LABELS","presetLabels","locale","withSeriesType","series","t","s","type","stack","curve","lineSeries","area","extra","areaSeries","barSeries","stacked","labels","scatterSeries","candlestickSeries","heatmapChartOptions","numericX","config","c","numericY","base","sparklineOptions","DEFAULT_QUADRANT_COLORS","DIVIDER","splits","x0","x1","y0","y1","quadrantOf","right","x","xs","y","ys","quadrantCenter","visualRight","corner","quadrantChartOptions","reverseX","color","p","left","rect","xa","xb","ya","yb","position","ends","visualLeft","texts","annotations","showTicks","interaction","item","event","region","sortedFinite","n","i","values","out","k","v","quantileOf","sorted","at","lo","hi","quantiles","ps","SPREAD_SAMPLE","binValues","min","max","options","span","rule","sturges","count","stride","sample","width","start","end","counts","total","edges","histogramSeries","bins","format","formatEdge","value","a","b","boxplotStats","q1","median","q3","sum","whisker","low","high","outliers","reach","from","to","j","upper","boxplotData","groups","g","boxplotSeries","waterfallSeries","up","down","running","data","steps","step","bubbleSeries","minSize","maxSize","valuesOf","list","top","sizeOf","size","points","d","THEMED","FALLBACK","paletteColor","fallback","themed","time","ganttSeries","names","rows","taskName","progressName","separator","idOf","rowOf","byKey","tasks","point","colorOf","formatProgress","share","details","progress","milestones","pad","dependencies","key","rangeAreaSeries"],"sources":["../../../../charts/src/engine/presets.ts"],"sourcesContent":["// Option presets of the chart components, shared by every platform (React,\n// mini-programs, React Native): they turn component props into engine\n// options.\n\nimport {\n localeLabels,\n numberFormat,\n resolveLocale,\n type LabelDictionary,\n} from \"./locale\";\nimport { chartLabels } from \"./labels\";\nimport { tickStep } from \"./scale\";\nimport type {\n ChartAnnotation,\n ChartColorScheme,\n ChartConnectorOptions,\n ChartCurve,\n ChartDependency,\n ChartInteractionOptions,\n ChartOptions,\n ChartPointDatum,\n ChartSeries,\n ChartSeriesType,\n ChartTooltipDetail,\n ChartXValue,\n} from \"./types\";\n\n/** Default series names of the presets */\ninterface PresetLabels {\n value: string;\n values: string;\n count: string;\n change: string;\n tasks: string;\n progress: string;\n milestones: string;\n}\n\nconst PRESET_LABELS: LabelDictionary<PresetLabels> = {\n en: {\n value: \"Value\",\n values: \"Values\",\n count: \"Count\",\n change: \"Change\",\n tasks: \"Tasks\",\n progress: \"Progress\",\n milestones: \"Milestones\",\n },\n zh: {\n value: \"数值\",\n values: \"数值\",\n count: \"数量\",\n change: \"变化\",\n tasks: \"任务\",\n progress: \"进度\",\n milestones: \"里程碑\",\n },\n ja: {\n value: \"値\",\n values: \"値\",\n count: \"件数\",\n change: \"増減\",\n tasks: \"タスク\",\n progress: \"進捗\",\n milestones: \"マイルストーン\",\n },\n fr: {\n value: \"Valeur\",\n values: \"Valeurs\",\n count: \"Effectif\",\n change: \"Variation\",\n tasks: \"Tâches\",\n progress: \"Avancement\",\n milestones: \"Jalons\",\n },\n};\n\n/** Default series names of the presets in a locale (the page language by default) */\nexport const presetLabels = (locale?: string): PresetLabels =>\n localeLabels(PRESET_LABELS, locale);\n\n/** Gives the series without a `type` the type of the component */\nexport const withSeriesType = (\n series: readonly ChartSeries[],\n type: ChartSeriesType,\n stack?: string,\n curve?: ChartCurve,\n): ChartSeries[] =>\n series.map((s) => {\n const t = s.type ?? type;\n return {\n ...s,\n type: t,\n ...(stack !== undefined && t === type ? { stack: s.stack ?? stack } : {}),\n ...(curve !== undefined && (t === \"line\" || t === \"area\")\n ? { curve: s.curve ?? curve }\n : {}),\n };\n });\n\n/** Options of the line-like components */\nexport interface LineSeriesOptions {\n /** Stacks the series on top of each other */\n stacked?: boolean;\n /** Shape of the lines */\n curve?: ChartCurve;\n}\n\n/** Series of a LineChart (`area` fills them) */\nexport const lineSeries = (\n series: readonly ChartSeries[],\n area = false,\n extra: LineSeriesOptions = {},\n) =>\n withSeriesType(\n series,\n area ? \"area\" : \"line\",\n extra.stacked ? \"stack\" : undefined,\n extra.curve,\n );\n\n/** Series of an AreaChart */\nexport const areaSeries = (\n series: readonly ChartSeries[],\n extra: LineSeriesOptions = {},\n) => lineSeries(series, true, extra);\n\n/** Series of a BarChart (`stacked` stacks them, `labels` shows the values) */\nexport const barSeries = (\n series: readonly ChartSeries[],\n stacked = false,\n labels = false,\n) =>\n withSeriesType(series, \"bar\", stacked ? \"stack\" : undefined).map((s) =>\n labels && s.type === \"bar\" ? { ...s, showLabels: s.showLabels ?? true } : s,\n );\n\n/** Series of a ScatterChart */\nexport const scatterSeries = (series: readonly ChartSeries[]) =>\n withSeriesType(series, \"scatter\");\n\n/** Series of a CandlestickChart */\nexport const candlestickSeries = (series: readonly ChartSeries[]) =>\n withSeriesType(series, \"candlestick\");\n\n/** A cell of a HeatmapChart */\nexport interface HeatmapCell {\n /** Column: a category name (or a number on a numeric axis) */\n x: string | number;\n /** Row: a category name (or a number on a numeric axis) */\n y: string | number;\n /** Value mapped to the color scale; `null` leaves the cell empty */\n value: number | null;\n}\n\n/** Settings of a heatmap (the props of HeatmapChart) */\nexport interface HeatmapConfig {\n /** Cells */\n data: readonly HeatmapCell[];\n /** Column names in order (collected from the data when omitted) */\n xCategories?: readonly string[];\n /** Row names from bottom to top (collected from the data when omitted) */\n yCategories?: readonly string[];\n /**\n * Colors from the lowest to the highest value (interpolated in OKLab), or\n * a built-in theme-aware ramp of the first palette color\n * @default \"sequential\"\n */\n colorScale?: readonly string[] | ChartColorScheme;\n /** Values at the ends of the color scale; the data range by default */\n valueRange?: readonly [number, number];\n /**\n * Value at the middle of the color scale (diverging data)\n * @default 0 for `diverging` ramps spanning it, else the middle of the range\n */\n colorMidpoint?: number;\n /** Name of the value in the tooltip */\n name?: string;\n /** Corner radius of the cells, in pixels */\n radius?: number;\n /** Formats the values in the tooltip */\n format?: (value: number) => string;\n}\n\n/** Engine options of a heatmap */\nexport const heatmapChartOptions = (\n config: HeatmapConfig,\n base: Partial<ChartOptions> = {},\n): ChartOptions => {\n const numericX = config.data.some((c) => typeof c.x === \"number\");\n const numericY = config.data.some((c) => typeof c.y === \"number\");\n return {\n ...base,\n series: [\n {\n id: \"heatmap\",\n name: config.name ?? presetLabels(base.locale).value,\n type: \"heatmap\",\n data: config.data.map((c) => ({ x: c.x, y: c.y, value: c.value })),\n colorScale: config.colorScale,\n valueRange: config.valueRange,\n colorMidpoint: config.colorMidpoint,\n radius: config.radius,\n format: config.format,\n },\n ],\n xAxis: {\n ...(numericX\n ? {}\n : { type: \"category\" as const, categories: config.xCategories }),\n grid: false,\n ...base.xAxis,\n },\n yAxis: {\n ...(numericY\n ? {}\n : { type: \"category\" as const, categories: config.yCategories }),\n grid: false,\n ...base.yAxis,\n },\n // the color legend (visual map)\n legend: base.legend ?? true,\n interaction: base.interaction ?? { zoom: false },\n tooltip: base.tooltip ?? { mode: \"nearest\" },\n };\n};\n\n/** Settings of a sparkline (the props of Sparkline) */\nexport interface SparklineConfig {\n /** Values (or `[x, y]` pairs, typed arrays, ...) */\n data: ChartSeries[\"data\"];\n /**\n * How the values are drawn\n * @default \"line\"\n */\n type?: \"line\" | \"area\" | \"bar\";\n /** Color (any CSS color); the first palette color by default */\n color?: string;\n /**\n * Shape of the line\n * @default \"smooth\"\n */\n curve?: ChartCurve;\n /** Name shown in the tooltip */\n name?: string;\n /** Draws a reference line at this value (e.g. a target or the average) */\n reference?: number;\n /** Formats the value in the tooltip */\n format?: (value: number) => string;\n}\n\n/** Engine options of a sparkline: no axes, no legend, a tooltip only */\nexport const sparklineOptions = (\n config: SparklineConfig,\n base: Partial<ChartOptions> = {},\n): ChartOptions => {\n const type = config.type ?? \"line\";\n return {\n ...base,\n series: [\n {\n id: \"sparkline\",\n name: config.name ?? presetLabels(base.locale).value,\n type,\n data: config.data,\n color: config.color,\n curve: type === \"bar\" ? undefined : (config.curve ?? \"smooth\"),\n lineWidth: 1.5,\n opacity: type === \"area\" ? 0.22 : undefined,\n radius: type === \"bar\" ? 1.5 : undefined,\n format: config.format,\n },\n ],\n xAxis: { visible: false, grid: false, ...base.xAxis },\n yAxis: { visible: false, grid: false, nice: false, ...base.yAxis },\n legend: false,\n padding: base.padding ?? { top: 4, right: 4, bottom: 4, left: 4 },\n interaction: base.interaction ?? { zoom: false },\n annotations:\n config.reference !== undefined\n ? [\n ...(base.annotations ?? []),\n {\n type: \"line\",\n axis: \"y\",\n value: config.reference,\n dash: [2, 3],\n },\n ]\n : base.annotations,\n };\n};\n\n/** A point of a QuadrantChart */\nexport interface QuadrantPoint {\n /** Position on the horizontal axis */\n x: number;\n /** Position on the vertical axis */\n y: number;\n /** Text drawn next to the dot and shown in the tooltip */\n label?: string;\n /** Dot color (any CSS color); the color of its quadrant by default */\n color?: string;\n /** Dot diameter in pixels */\n size?: number;\n}\n\n/** Title and color of a quadrant */\nexport interface QuadrantRegion {\n /** Title drawn in the outer corner of the quadrant */\n label?: string;\n /** Background tint and default dot color (any CSS color) */\n color?: string;\n}\n\n/** The four quadrants of a QuadrantChart */\nexport interface QuadrantRegions {\n topLeft?: QuadrantRegion;\n topRight?: QuadrantRegion;\n bottomLeft?: QuadrantRegion;\n bottomRight?: QuadrantRegion;\n}\n\n/** A quadrant, as seen on screen */\nexport type QuadrantCorner = keyof QuadrantRegions;\n\n/** Texts at the four ends of the dividers, inside the plot */\nexport interface QuadrantAxisLabels {\n top?: string;\n bottom?: string;\n left?: string;\n right?: string;\n}\n\n/** Settings of a quadrant matrix (the props of QuadrantChart) */\nexport interface QuadrantConfig {\n /** Points to place */\n points: readonly QuadrantPoint[];\n /**\n * Range of the horizontal axis\n * @default [0, 10]\n */\n xDomain?: [number, number];\n /**\n * Range of the vertical axis\n * @default [0, 10]\n */\n yDomain?: [number, number];\n /** X value of the vertical divider (the middle of `xDomain` by default) */\n xSplit?: number;\n /** Y value of the horizontal divider (the middle of `yDomain` by default) */\n ySplit?: number;\n /** Titles and colors of the quadrants */\n quadrants?: QuadrantRegions;\n /** Title of the horizontal axis */\n xLabel?: string;\n /** Title of the vertical axis */\n yLabel?: string;\n /** Texts at the ends of the dividers, drawn inside the plot (e.g. \"Important\" at the top) */\n axisLabels?: QuadrantAxisLabels;\n /**\n * Shows the numeric ticks of the axes; `false` keeps only the matrix\n * @default true\n */\n showTicks?: boolean;\n /** Reverses the horizontal axis (e.g. \"urgent\" on the left) */\n reverseX?: boolean;\n /**\n * Draws the labels next to the dots (overlapping labels are skipped)\n * @default true\n */\n showLabels?: boolean;\n /**\n * Dot diameter in pixels\n * @default 12\n */\n pointSize?: number;\n /** Name of the points in the tooltip */\n name?: string;\n /** Lets the user drag the dots (`drag` / `drop` events) */\n draggable?: boolean;\n}\n\nexport const DEFAULT_QUADRANT_COLORS: Required<Record<QuadrantCorner, string>> =\n {\n topLeft: \"var(--danger-color, #ef4444)\",\n topRight: \"var(--primary-color, #4f46e5)\",\n bottomLeft: \"var(--warning-color, #f59e0b)\",\n bottomRight: \"var(--text-secondary-color, #64748b)\",\n };\n\nconst DIVIDER = \"var(--border-strong-color, var(--border-color, #cbd5e1))\";\n\nconst splits = (config: QuadrantConfig) => {\n const [x0, x1] = config.xDomain ?? [0, 10];\n const [y0, y1] = config.yDomain ?? [0, 10];\n return {\n x0,\n x1,\n y0,\n y1,\n xs: config.xSplit ?? (x0 + x1) / 2,\n ys: config.ySplit ?? (y0 + y1) / 2,\n };\n};\n\n/** Quadrant of a data position, as seen on screen */\nexport const quadrantOf = (\n config: Pick<\n QuadrantConfig,\n \"xDomain\" | \"yDomain\" | \"xSplit\" | \"ySplit\" | \"reverseX\"\n >,\n x: number,\n y: number,\n): QuadrantCorner => {\n const { xs, ys } = splits(config as QuadrantConfig);\n const right = config.reverseX ? x < xs : x >= xs;\n const top = y >= ys;\n return top\n ? right\n ? \"topRight\"\n : \"topLeft\"\n : right\n ? \"bottomRight\"\n : \"bottomLeft\";\n};\n\n/** Center of a quadrant in data coordinates */\nexport const quadrantCenter = (\n config: Pick<\n QuadrantConfig,\n \"xDomain\" | \"yDomain\" | \"xSplit\" | \"ySplit\" | \"reverseX\"\n >,\n corner: QuadrantCorner,\n): { x: number; y: number } => {\n const { x0, x1, y0, y1, xs, ys } = splits(config as QuadrantConfig);\n const visualRight = corner.endsWith(\"Right\");\n const dataHigh = config.reverseX ? !visualRight : visualRight;\n return {\n x: dataHigh ? (xs + x1) / 2 : (x0 + xs) / 2,\n y: corner.startsWith(\"top\") ? (ys + y1) / 2 : (y0 + ys) / 2,\n };\n};\n\n/** Engine options of a quadrant matrix */\nexport const quadrantChartOptions = (\n config: QuadrantConfig,\n base: Omit<ChartOptions, \"series\"> = {},\n): ChartOptions => {\n const { x0, x1, y0, y1, xs, ys } = splits(config);\n const reverseX = !!config.reverseX;\n const color = (corner: QuadrantCorner) =>\n config.quadrants?.[corner]?.color ?? DEFAULT_QUADRANT_COLORS[corner];\n\n const series: ChartSeries[] = [\n {\n type: \"scatter\",\n name: config.name ?? \"\",\n pointSize: config.pointSize ?? 12,\n showLabels: config.showLabels ?? true,\n opacity: 0.9,\n data: config.points.map((p) => ({\n x: p.x,\n y: p.y,\n label: p.label,\n size: p.size,\n color: p.color ?? color(quadrantOf(config, p.x, p.y)),\n })),\n },\n ];\n\n // visual left / right -> data ranges\n const left: [number, number] = reverseX ? [xs, x1] : [x0, xs];\n const right: [number, number] = reverseX ? [x0, xs] : [xs, x1];\n const rect = (\n corner: QuadrantCorner,\n [xa, xb]: [number, number],\n [ya, yb]: [number, number],\n position: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\",\n ): ChartAnnotation => ({\n type: \"rect\",\n x0: xa,\n x1: xb,\n y0: ya,\n y1: yb,\n color: color(corner),\n opacity: 0.07,\n label: config.quadrants?.[corner]?.label,\n labelPosition: position,\n });\n const ends = config.axisLabels ?? {};\n const visualLeft = reverseX ? x1 : x0;\n const visualRight = reverseX ? x0 : x1;\n const texts: ChartAnnotation[] = [\n ...(ends.top\n ? [{ type: \"text\", x: xs, y: y1, text: ends.top, anchor: \"top\" } as const]\n : []),\n ...(ends.bottom\n ? [\n {\n type: \"text\",\n x: xs,\n y: y0,\n text: ends.bottom,\n anchor: \"bottom\",\n } as const,\n ]\n : []),\n ...(ends.left\n ? [\n {\n type: \"text\",\n x: visualLeft,\n y: ys,\n text: ends.left,\n anchor: \"left\",\n } as const,\n ]\n : []),\n ...(ends.right\n ? [\n {\n type: \"text\",\n x: visualRight,\n y: ys,\n text: ends.right,\n anchor: \"right\",\n } as const,\n ]\n : []),\n ];\n\n const annotations: ChartAnnotation[] = [\n rect(\"topLeft\", left, [ys, y1], \"top-left\"),\n rect(\"topRight\", right, [ys, y1], \"top-right\"),\n rect(\"bottomLeft\", left, [y0, ys], \"bottom-left\"),\n rect(\"bottomRight\", right, [y0, ys], \"bottom-right\"),\n { type: \"line\", axis: \"x\", value: xs, dash: [], color: DIVIDER },\n { type: \"line\", axis: \"y\", value: ys, dash: [], color: DIVIDER },\n ...texts,\n ...(base.annotations ?? []),\n ];\n\n const showTicks = config.showTicks ?? true;\n const interaction: boolean | ChartInteractionOptions =\n base.interaction === false\n ? false\n : {\n zoom: false,\n ...(typeof base.interaction === \"object\" ? base.interaction : {}),\n ...(config.draggable ? { dragPoints: true } : {}),\n };\n\n return {\n ...base,\n series,\n annotations,\n tooltip:\n base.tooltip ??\n (showTicks\n ? undefined\n : {\n render: (event) => {\n const item = event.items[0];\n if (!item) return null;\n const region =\n config.quadrants?.[quadrantOf(config, item.x, item.y)]?.label;\n return [item.label ?? config.name ?? \"\", region ?? \"\"]\n .filter(Boolean)\n .join(\"\\n\");\n },\n }),\n xAxis: {\n min: x0,\n max: x1,\n title: config.xLabel,\n reverse: reverseX,\n nice: false,\n grid: false,\n tickCount: 4,\n visible: showTicks || !!config.xLabel,\n ...(showTicks ? {} : { format: () => \"\" }),\n },\n yAxis: {\n min: y0,\n max: y1,\n title: config.yLabel,\n nice: false,\n grid: false,\n tickCount: 4,\n visible: showTicks || !!config.yLabel,\n ...(showTicks ? {} : { format: () => \"\" }),\n },\n legend: base.legend ?? false,\n padding:\n base.padding ??\n (showTicks ? undefined : { top: 4, right: 4, bottom: 4, left: 4 }),\n interaction,\n };\n};\n\n// ------------------------------------------------------------- statistics\n\n/** Finite values of a list, as a sorted typed array */\nconst sortedFinite = (values: ArrayLike<number>): Float64Array => {\n let n = 0;\n for (let i = 0; i < values.length; i++) if (Number.isFinite(values[i])) n++;\n const out = new Float64Array(n);\n let k = 0;\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (Number.isFinite(v)) out[k++] = v;\n }\n return out.sort();\n};\n\n/** Quantile `p` (0-1) of sorted values, linearly interpolated (NumPy / Excel) */\nconst quantileOf = (sorted: ArrayLike<number>, p: number): number => {\n const n = sorted.length;\n if (!n) return NaN;\n const at = Math.min(1, Math.max(0, p)) * (n - 1);\n const lo = Math.floor(at);\n const hi = Math.min(n - 1, lo + 1);\n return sorted[lo] + (sorted[hi] - sorted[lo]) * (at - lo);\n};\n\n/**\n * Quantiles of values (`[0.5, 0.95, 0.99]` gives the median, p95 and p99),\n * linearly interpolated like NumPy and Excel; non-finite values are ignored\n */\nexport const quantiles = (\n values: ArrayLike<number>,\n ps: readonly number[],\n): number[] => {\n const sorted = sortedFinite(values);\n return ps.map((p) => quantileOf(sorted, p));\n};\n\n/** How the bins of a histogram are chosen: a count, or a rule */\nexport type HistogramBinning =\n number | \"auto\" | \"sturges\" | \"freedman-diaconis\";\n\n/** Options of `binValues` */\nexport interface BinOptions {\n /**\n * Number of bins, or the rule choosing it: `sturges` (log2 n + 1, for\n * small normal-ish samples), `freedman-diaconis` (bin width from the\n * interquartile range, robust to outliers); `auto` uses Freedman-Diaconis\n * and Sturges when the spread is zero\n * @default \"auto\"\n */\n bins?: HistogramBinning;\n /** Range covered by the bins (values outside are not counted); the data range by default */\n domain?: readonly [number, number];\n /**\n * Rounds the bin width to 1, 2 or 5 × 10^k and aligns the edges on it\n * @default true\n */\n nice?: boolean;\n}\n\n/** Bins of a histogram */\nexport interface HistogramBins {\n /** Edges of the bins: one more than the bins */\n edges: number[];\n /** Number of values in every bin */\n counts: number[];\n /** Width of a bin */\n width: number;\n /** Number of values counted (finite, inside the domain) */\n total: number;\n}\n\n/** At most this many values are sorted to estimate the spread (Freedman-Diaconis) */\nconst SPREAD_SAMPLE = 100_000;\n\n/**\n * Counts values into bins of equal width: linear in the number of values\n * (a million samples take a few milliseconds; the spread of large samples\n * is estimated on an even subsample)\n */\nexport const binValues = (\n values: ArrayLike<number>,\n options: BinOptions = {},\n): HistogramBins => {\n let n = 0;\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (!Number.isFinite(v)) continue;\n n++;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n let [lo, hi] = options.domain ?? [min, max];\n if (!n || !Number.isFinite(lo) || !Number.isFinite(hi)) {\n return { edges: [0, 1], counts: [0], width: 1, total: 0 };\n }\n if (lo > hi) [lo, hi] = [hi, lo];\n if (hi === lo) {\n lo -= 0.5;\n hi += 0.5;\n }\n const span = hi - lo;\n const rule = options.bins ?? \"auto\";\n const sturges = Math.ceil(Math.log2(n)) + 1;\n let count: number;\n if (typeof rule === \"number\") {\n count = Math.round(rule);\n } else if (rule === \"sturges\") {\n count = sturges;\n } else {\n // Freedman-Diaconis: width = 2 IQR / n^(1/3)\n const stride = Math.max(1, Math.floor(values.length / SPREAD_SAMPLE));\n const sample: number[] = [];\n for (let i = 0; i < values.length; i += stride) {\n const v = values[i];\n if (Number.isFinite(v)) sample.push(v);\n }\n const sorted = Float64Array.from(sample).sort();\n const iqr = quantileOf(sorted, 0.75) - quantileOf(sorted, 0.25);\n const width = (2 * iqr) / Math.cbrt(n);\n count = width > 0 ? Math.ceil(span / width) : sturges;\n }\n count = Math.max(1, Math.min(1000, count || 1));\n let width = span / count;\n let start = lo;\n if (options.nice ?? true) {\n width = tickStep(lo, hi, count) || width;\n start = Math.floor(lo / width + 1e-9) * width;\n count = Math.max(1, Math.ceil((hi - start) / width - 1e-9));\n }\n const end = start + count * width;\n const counts = new Array<number>(count).fill(0);\n let total = 0;\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (!(v >= start && v <= end)) continue;\n // the last bin includes its right edge\n const k = Math.min(count - 1, Math.floor((v - start) / width));\n counts[k]++;\n total++;\n }\n const edges: number[] = [];\n for (let k = 0; k <= count; k++)\n edges.push(Number((start + k * width).toPrecision(12)));\n return { edges, counts, width, total };\n};\n\n/** Options of `histogramSeries` */\nexport interface HistogramSeriesOptions extends BinOptions {\n /** Name of the series (legend, tooltip) */\n name?: string;\n /** Bar color (any CSS color) */\n color?: string;\n /** Formats the edges of the bins in the tooltip */\n format?: (value: number) => string;\n /** Bins already computed (`binValues`): `values` are then ignored */\n binned?: HistogramBins;\n /**\n * Locale of the default name and of the bin edges\n * @default the page language\n */\n locale?: string;\n}\n\n/** Bar series of a histogram: one touching bar per bin, labelled with its range */\nexport const histogramSeries = (\n values: ArrayLike<number>,\n options: HistogramSeriesOptions = {},\n): ChartSeries => {\n const bins = options.binned ?? binValues(values, options);\n const locale = resolveLocale(options.locale);\n const format =\n options.format ?? ((value: number) => formatEdge(value, locale));\n return {\n id: \"histogram\",\n name: options.name ?? presetLabels(locale).count,\n type: \"bar\",\n color: options.color,\n barWidth: 1,\n radius: 1,\n data: bins.counts.map((count, k) => {\n const a = bins.edges[k] ?? 0;\n const b = bins.edges[k + 1] ?? a;\n return {\n x: (a + b) / 2,\n y: count,\n label: `${format(a)} – ${format(b)}`,\n };\n }),\n };\n};\n\nconst formatEdge = (value: number, locale: string) =>\n numberFormat(locale, { maximumSignificantDigits: 6 }).format(value);\n\n/** Options of `boxplotStats` */\nexport interface BoxplotStatsOptions {\n /**\n * Reach of the whiskers in interquartile ranges beyond the box (Tukey:\n * 1.5); `\"minmax\"` extends them to the extremes (no outliers)\n * @default 1.5\n */\n whisker?: number | \"minmax\";\n}\n\n/** Five-number summary of a sample, with the outliers */\nexport interface BoxplotStats {\n /** Lower whisker: the smallest value within reach */\n low: number;\n /** First quartile */\n q1: number;\n median: number;\n /** Third quartile */\n q3: number;\n /** Upper whisker: the largest value within reach */\n high: number;\n /** Values beyond the whiskers */\n outliers: number[];\n min: number;\n max: number;\n mean: number;\n /** Number of finite values */\n count: number;\n}\n\n/** Quartiles, whiskers (Tukey's 1.5 IQR by default) and outliers of raw values */\nexport const boxplotStats = (\n values: ArrayLike<number>,\n options: BoxplotStatsOptions = {},\n): BoxplotStats => {\n const sorted = sortedFinite(values);\n const n = sorted.length;\n if (!n) {\n return {\n low: NaN,\n q1: NaN,\n median: NaN,\n q3: NaN,\n high: NaN,\n outliers: [],\n min: NaN,\n max: NaN,\n mean: NaN,\n count: 0,\n };\n }\n const q1 = quantileOf(sorted, 0.25);\n const median = quantileOf(sorted, 0.5);\n const q3 = quantileOf(sorted, 0.75);\n const min = sorted[0];\n const max = sorted[n - 1];\n let sum = 0;\n for (let i = 0; i < n; i++) sum += sorted[i];\n const whisker = options.whisker ?? 1.5;\n let low = min;\n let high = max;\n const outliers: number[] = [];\n if (whisker !== \"minmax\") {\n const reach = (q3 - q1) * whisker;\n const from = q1 - reach;\n const to = q3 + reach;\n let i = 0;\n while (i < n && sorted[i] < from) outliers.push(sorted[i++]);\n low = i < n ? sorted[i] : q1;\n let j = n - 1;\n const upper: number[] = [];\n while (j >= 0 && sorted[j] > to) upper.push(sorted[j--]);\n high = j >= 0 ? sorted[j] : q3;\n outliers.push(...upper.reverse());\n }\n return {\n low: Math.min(low, q1),\n q1,\n median,\n q3,\n high: Math.max(high, q3),\n outliers,\n min,\n max,\n mean: sum / n,\n count: n,\n };\n};\n\n/** A sample of a box plot */\nexport interface BoxplotGroup {\n /** Category (or position) of the box */\n x: ChartXValue;\n /** Raw values: their quartiles, whiskers and outliers are computed */\n values: ArrayLike<number>;\n /** Color of the box (any CSS color) */\n color?: string;\n}\n\n/** Box plot data of raw samples (one datum per group) */\nexport const boxplotData = (\n groups: readonly BoxplotGroup[],\n options: BoxplotStatsOptions = {},\n): ChartPointDatum[] =>\n groups.map((g) => {\n const s = boxplotStats(g.values, options);\n return {\n x: g.x,\n y: Number.isFinite(s.median) ? s.median : null,\n low: s.low,\n q1: s.q1,\n q3: s.q3,\n high: s.high,\n outliers: s.outliers,\n ...(g.color ? { color: g.color } : {}),\n };\n });\n\n/** Series of a BoxPlotChart */\nexport const boxplotSeries = (series: readonly ChartSeries[]) =>\n withSeriesType(series, \"boxplot\");\n\n// ---------------------------------------------------------------- waterfall\n\n/** A bar of a waterfall chart */\nexport interface WaterfallStep {\n /** Category name of the bar */\n label: string;\n /** Change (positive or negative); ignored by totals */\n value?: number;\n /**\n * `subtotal` and `total` bars show the running total, from zero\n * @default \"change\"\n */\n kind?: \"change\" | \"subtotal\" | \"total\";\n /** Color of this bar (any CSS color) */\n color?: string;\n}\n\n/** Options of `waterfallSeries` */\nexport interface WaterfallOptions {\n /** Name of the series (tooltip) */\n name?: string;\n /** Color of the increases @default the success color */\n upColor?: string;\n /** Color of the decreases @default the danger color */\n downColor?: string;\n /** Color of the totals and subtotals @default the primary color */\n totalColor?: string;\n /**\n * Value the first change starts from\n * @default 0\n */\n start?: number;\n /**\n * Writes the change (or the total) at the end of every bar\n * @default false\n */\n labels?: boolean;\n /** Formats the values (labels, tooltip) */\n format?: (value: number) => string;\n /**\n * Thin lines from the end of every bar to the next one; an object styles\n * them\n * @default true (dashed, secondary text color)\n */\n connector?: boolean | ChartConnectorOptions;\n /**\n * Locale of the default name\n * @default the page language\n */\n locale?: string;\n}\n\n/**\n * Floating bar series of a waterfall (bridge) chart: every change starts\n * where the previous one ended; totals and subtotals start from zero\n */\nexport const waterfallSeries = (\n steps: readonly WaterfallStep[],\n options: WaterfallOptions = {},\n): ChartSeries => {\n const up = options.upColor ?? \"var(--success-color, #16a34a)\";\n const down = options.downColor ?? \"var(--danger-color, #dc2626)\";\n const total = options.totalColor ?? \"var(--primary-color, #4f46e5)\";\n let running = options.start ?? 0;\n const data: ChartPointDatum[] = steps.map((step) => {\n if (step.kind === \"total\" || step.kind === \"subtotal\") {\n return { x: step.label, y: running, color: step.color ?? total };\n }\n const value = step.value ?? 0;\n const from = running;\n running += value;\n return {\n x: step.label,\n y0: from,\n y: running,\n color: step.color ?? (value >= 0 ? up : down),\n };\n });\n return {\n id: \"waterfall\",\n name: options.name ?? presetLabels(options.locale).change,\n type: \"bar\",\n color: total,\n data,\n showLabels: options.labels ?? false,\n format: options.format,\n connector: options.connector ?? true,\n };\n};\n\n// ------------------------------------------------------------------ bubbles\n\n/** Options of `bubbleSeries` */\nexport interface BubbleOptions {\n /**\n * Diameter in pixels of the smallest bubbles\n * @default 6\n */\n minSize?: number;\n /**\n * Diameter in pixels of the largest value\n * @default 48\n */\n maxSize?: number;\n /** Value drawn with `maxSize` (share a scale between charts); the largest value by default */\n maxValue?: number;\n}\n\n/**\n * Scatter series whose dots are sized by the `value` of their points: the\n * area of a bubble is proportional to its value (diameter ∝ √value), the\n * scale is shared by every series. Points are drawn from the largest to\n * the smallest, so small bubbles stay on top (hover indexes refer to that\n * order).\n */\nexport const bubbleSeries = (\n series: readonly ChartSeries[],\n options: BubbleOptions = {},\n): ChartSeries[] => {\n const minSize = options.minSize ?? 6;\n const maxSize = options.maxSize ?? 48;\n const valuesOf = (data: ChartSeries[\"data\"]): ArrayLike<number> | null => {\n if (typeof data !== \"object\" || data === null) return null;\n if (!(\"length\" in data)) {\n const v = (data as { value?: ArrayLike<number> }).value;\n return v ?? null;\n }\n const list = data as ArrayLike<unknown>;\n const out = new Float64Array(list.length).fill(NaN);\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n if (item && typeof item === \"object\" && !Array.isArray(item)) {\n const v = (item as { value?: unknown }).value;\n if (typeof v === \"number\") out[i] = v;\n }\n }\n return out;\n };\n let top = options.maxValue ?? 0;\n if (options.maxValue === undefined) {\n for (const s of series) {\n const values = valuesOf(s.data);\n if (!values) continue;\n for (let i = 0; i < values.length; i++) {\n const v = Math.abs(values[i]);\n if (v > top) top = v;\n }\n }\n }\n const sizeOf = (v: number) =>\n Number.isFinite(v) && top > 0\n ? Math.max(minSize, maxSize * Math.sqrt(Math.min(1, Math.abs(v) / top)))\n : minSize;\n return series.map((s) => {\n const base: ChartSeries = {\n ...s,\n type: s.type ?? \"scatter\",\n opacity: s.opacity ?? 0.68,\n };\n if (base.type !== \"scatter\") return base;\n const data = s.data;\n if (typeof data === \"object\" && data !== null && !(\"length\" in data)) {\n const values = (data as { value?: ArrayLike<number> }).value;\n if (!values) return base;\n const size = new Float32Array(values.length);\n for (let i = 0; i < values.length; i++) size[i] = sizeOf(values[i]);\n return { ...base, data: { ...data, size } };\n }\n const list = data as ArrayLike<unknown>;\n const points: ChartPointDatum[] = [];\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n if (!item || typeof item !== \"object\" || Array.isArray(item)) continue;\n const d = item as ChartPointDatum;\n points.push({\n ...d,\n size: d.size ?? sizeOf(typeof d.value === \"number\" ? d.value : NaN),\n });\n }\n points.sort((a, b) => (b.size ?? 0) - (a.size ?? 0));\n return { ...base, data: points };\n });\n};\n\n// -------------------------------------------------------------------- gantt\n\n/** A task (or milestone) of a Gantt chart */\nexport interface GanttTask {\n /** Name of the task (tooltip title; the row name when there is no `row`) */\n name: string;\n /**\n * Identifier referenced by the `dependencies` of other tasks; the `name`\n * by default (give ids when several tasks have the same name)\n */\n id?: string;\n /**\n * Row of the task: several tasks can share one (a resource, a lane); the\n * `name` by default, one row per task\n */\n row?: string;\n /** Start (a timestamp or a date) */\n start: number | Date;\n /** End; omitted for milestones */\n end?: number | Date;\n /** Share done, 0-1: drawn as a solid bar over the task */\n progress?: number;\n /** Group (phase, team): a color and a legend entry per group */\n group?: string;\n /** Color of the task (any CSS color); the color of its group by default */\n color?: string;\n /** Draws a dot at `start` instead of a bar */\n milestone?: boolean;\n /**\n * Tasks this one waits for, by `id` (or `name`): tooltip, and arrows from\n * their ends to its start\n */\n dependencies?: readonly string[];\n}\n\n/** Options of `ganttSeries` */\nexport interface GanttOptions {\n /** Colors of the groups in order of appearance (any CSS colors); the chart palette by default */\n colors?: readonly string[];\n /**\n * Name of the tasks without a group\n * @default \"Tasks\" (in the `locale`)\n */\n taskName?: string;\n /**\n * Name of the progress bars (legend, tooltip)\n * @default \"Progress\" (in the `locale`)\n */\n progressName?: string;\n /**\n * Name of the milestones (legend, tooltip)\n * @default \"Milestones\" (in the `locale`)\n */\n milestoneName?: string;\n /** Formats the progress shares (tooltip) @default \"60%\" */\n formatProgress?: (share: number) => string;\n /**\n * Name of the dependencies row of the tooltip\n * @default \"Depends on\" (in the `locale`)\n */\n dependenciesName?: string;\n /**\n * Draws the dependencies as elbow arrows from the end of every\n * predecessor to the start of the task\n * @default true\n */\n dependencyArrows?: boolean;\n /** Color of the dependency arrows (any CSS color); the secondary text color by default */\n dependencyColor?: string;\n /**\n * Locale of the default names and of the progress shares\n * @default the page language\n */\n locale?: string;\n}\n\n/** Series of a Gantt chart and the row names in order */\nexport interface GanttSeries {\n series: ChartSeries[];\n /** Rows from top to bottom (the `categories` of the x axis) */\n categories: string[];\n /** Time range of the tasks with a small margin (the `min` / `max` of the value axis) */\n domain: [number, number];\n /** Arrows of the dependencies between existing tasks (the `dependencies` of the chart) */\n dependencies: ChartDependency[];\n}\n\nconst THEMED = [\n \"--primary-color\",\n \"--success-color\",\n \"--warning-color\",\n \"--danger-color\",\n \"--info-color\",\n];\nconst FALLBACK = [\n \"#4f46e5\",\n \"#10b981\",\n \"#f59e0b\",\n \"#ef4444\",\n \"#0ea5e9\",\n \"#8b5cf6\",\n \"#14b8a6\",\n \"#f97316\",\n];\n\n/** Color `k` of the chart palette as a CSS color (theme variables first) */\nexport const paletteColor = (k: number): string => {\n const i = k % 8;\n const fallback = FALLBACK[i] ?? \"#4f46e5\";\n const themed = THEMED[i];\n return themed\n ? `var(--chart-series-${i + 1}, var(${themed}, ${fallback}))`\n : `var(--chart-series-${i + 1}, ${fallback})`;\n};\n\nconst time = (v: number | Date | undefined) =>\n v instanceof Date ? v.getTime() : v === undefined ? NaN : v;\n\n/**\n * Floating bar series of a Gantt chart (horizontal, on a time axis): a\n * translucent bar per task with its progress drawn over it, one series per\n * group, and the milestones as dots\n */\nexport const ganttSeries = (\n tasks: readonly GanttTask[],\n options: GanttOptions = {},\n): GanttSeries => {\n const locale = resolveLocale(options.locale);\n const names = presetLabels(locale);\n const rows = chartLabels(locale);\n const taskName = options.taskName ?? names.tasks;\n const progressName = options.progressName ?? names.progress;\n const separator = /^(zh|ja)\\b/i.test(locale) ? \"、\" : \", \";\n const idOf = (t: GanttTask) => t.id ?? t.name;\n const rowOf = (t: GanttTask) => t.row ?? t.name;\n // tasks by id, then by name (the first one wins)\n const byKey = new Map<string, GanttTask>();\n for (const t of tasks) if (!byKey.has(idOf(t))) byKey.set(idOf(t), t);\n for (const t of tasks) if (!byKey.has(t.name)) byKey.set(t.name, t);\n // tasks in a shared row: their name is the title of the tooltip\n const point = (t: GanttTask) => ({\n x: rowOf(t),\n id: idOf(t),\n ...(rowOf(t) !== t.name ? { label: t.name } : {}),\n });\n const groups: string[] = [];\n for (const t of tasks) {\n const g = t.group ?? taskName;\n if (!t.milestone && !groups.includes(g)) groups.push(g);\n }\n const colorOf = (g: string) => {\n const k = Math.max(0, groups.indexOf(g));\n return options.colors?.[k] ?? paletteColor(k);\n };\n const formatProgress =\n options.formatProgress ??\n ((share: number) =>\n numberFormat(locale, {\n style: \"percent\",\n maximumFractionDigits: 0,\n }).format(share));\n const series: ChartSeries[] = groups.map((g) => ({\n id: `gantt:${g}`,\n name: g,\n type: \"bar\",\n stack: \"gantt\",\n color: colorOf(g),\n opacity: 0.3,\n barWidth: 0.62,\n radius: 4,\n data: tasks\n .filter((t) => !t.milestone && (t.group ?? taskName) === g)\n .map((t) => {\n // the tooltip of a task: its progress and what it waits for\n const details: ChartTooltipDetail[] = [];\n if (t.progress !== undefined)\n details.push({\n name: progressName,\n value: formatProgress(Math.min(1, Math.max(0, t.progress))),\n });\n if (t.dependencies?.length)\n details.push({\n name: options.dependenciesName ?? rows.dependencies,\n value: t.dependencies\n .map((k) => byKey.get(k)?.name ?? k)\n .join(separator),\n });\n return {\n ...point(t),\n y0: time(t.start),\n y: time(t.end ?? t.start),\n ...(t.color ? { color: t.color } : {}),\n ...(details.length ? { details } : {}),\n };\n }),\n }));\n const progress = tasks.filter(\n (t) => !t.milestone && t.progress !== undefined && t.progress > 0,\n );\n if (progress.length) {\n series.push({\n id: \"gantt:progress\",\n name: progressName,\n type: \"bar\",\n stack: \"gantt\",\n // shown in the tooltip of its task\n tooltip: false,\n // every bar has the color of its task: a neutral legend swatch\n color: \"var(--text-secondary-color, #6b7280)\",\n radius: 4,\n data: progress.map((t) => {\n const start = time(t.start);\n const end = time(t.end ?? t.start);\n const share = Math.min(1, Math.max(0, t.progress ?? 0));\n return {\n x: rowOf(t),\n y0: start,\n y: start + (end - start) * share,\n label: formatProgress(share),\n color: t.color ?? colorOf(t.group ?? taskName),\n };\n }),\n });\n }\n const milestones = tasks.filter((t) => t.milestone);\n if (milestones.length) {\n series.push({\n id: \"gantt:milestones\",\n name: options.milestoneName ?? names.milestones,\n type: \"scatter\",\n color: \"var(--text-color, #1f2937)\",\n pointSize: 13,\n opacity: 1,\n data: milestones.map((t) => ({\n ...point(t),\n y: time(t.start),\n ...(t.color ? { color: t.color } : {}),\n })),\n });\n }\n let lo = Infinity;\n let hi = -Infinity;\n for (const t of tasks) {\n for (const v of [time(t.start), time(t.end ?? t.start)]) {\n if (v < lo) lo = v;\n if (v > hi) hi = v;\n }\n }\n // room for the milestone dots at the ends\n const pad = Number.isFinite(hi - lo) ? Math.max((hi - lo) * 0.025, 1) : 0;\n const dependencies: ChartDependency[] = [];\n if (options.dependencyArrows !== false) {\n for (const t of tasks) {\n for (const key of t.dependencies ?? []) {\n const from = byKey.get(key);\n if (!from || from === t) continue;\n dependencies.push({\n from: idOf(from),\n to: idOf(t),\n ...(options.dependencyColor\n ? { color: options.dependencyColor }\n : {}),\n });\n }\n }\n }\n return {\n series,\n categories: [...new Set(tasks.map(rowOf))],\n domain: Number.isFinite(lo) ? [lo - pad, hi + pad] : [0, 1],\n dependencies,\n };\n};\n\n// -------------------------------------------------------------- range areas\n\n/** Series of a RangeAreaChart: bands between `y0` and `y` (thin edges) */\nexport const rangeAreaSeries = (\n series: readonly ChartSeries[],\n curve?: ChartCurve,\n) =>\n withSeriesType(series, \"area\", undefined, curve).map((s) =>\n s.type === \"area\" ? { ...s, lineWidth: s.lineWidth ?? 1.5 } : s,\n );\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { ChartColorScheme, ChartConnectorOptions, ChartCurve, ChartOptions, ChartPointDatum, ChartSeries, ChartSeriesType, ChartXValue } from './types.cjs';
1
+ import { ChartColorScheme, ChartConnectorOptions, ChartCurve, ChartDependency, ChartOptions, ChartPointDatum, ChartSeries, ChartSeriesType, ChartXValue } from './types.cjs';
2
2
  /** Default series names of the presets */
3
3
  interface PresetLabels {
4
4
  value: string;
@@ -369,8 +369,18 @@ export interface BubbleOptions {
369
369
  export declare const bubbleSeries: (series: readonly ChartSeries[], options?: BubbleOptions) => ChartSeries[];
370
370
  /** A task (or milestone) of a Gantt chart */
371
371
  export interface GanttTask {
372
- /** Row name (unique) */
372
+ /** Name of the task (tooltip title; the row name when there is no `row`) */
373
373
  name: string;
374
+ /**
375
+ * Identifier referenced by the `dependencies` of other tasks; the `name`
376
+ * by default (give ids when several tasks have the same name)
377
+ */
378
+ id?: string;
379
+ /**
380
+ * Row of the task: several tasks can share one (a resource, a lane); the
381
+ * `name` by default, one row per task
382
+ */
383
+ row?: string;
374
384
  /** Start (a timestamp or a date) */
375
385
  start: number | Date;
376
386
  /** End; omitted for milestones */
@@ -383,7 +393,10 @@ export interface GanttTask {
383
393
  color?: string;
384
394
  /** Draws a dot at `start` instead of a bar */
385
395
  milestone?: boolean;
386
- /** Names of the tasks this one waits for (shown in its tooltip) */
396
+ /**
397
+ * Tasks this one waits for, by `id` (or `name`): tooltip, and arrows from
398
+ * their ends to its start
399
+ */
387
400
  dependencies?: readonly string[];
388
401
  }
389
402
  /** Options of `ganttSeries` */
@@ -412,6 +425,14 @@ export interface GanttOptions {
412
425
  * @default "Depends on" (in the `locale`)
413
426
  */
414
427
  dependenciesName?: string;
428
+ /**
429
+ * Draws the dependencies as elbow arrows from the end of every
430
+ * predecessor to the start of the task
431
+ * @default true
432
+ */
433
+ dependencyArrows?: boolean;
434
+ /** Color of the dependency arrows (any CSS color); the secondary text color by default */
435
+ dependencyColor?: string;
415
436
  /**
416
437
  * Locale of the default names and of the progress shares
417
438
  * @default the page language
@@ -421,10 +442,12 @@ export interface GanttOptions {
421
442
  /** Series of a Gantt chart and the row names in order */
422
443
  export interface GanttSeries {
423
444
  series: ChartSeries[];
424
- /** Task names from top to bottom (the `categories` of the x axis) */
445
+ /** Rows from top to bottom (the `categories` of the x axis) */
425
446
  categories: string[];
426
447
  /** Time range of the tasks with a small margin (the `min` / `max` of the value axis) */
427
448
  domain: [number, number];
449
+ /** Arrows of the dependencies between existing tasks (the `dependencies` of the chart) */
450
+ dependencies: ChartDependency[];
428
451
  }
429
452
  /** Color `k` of the chart palette as a CSS color (theme variables first) */
430
453
  export declare const paletteColor: (k: number) => string;
@@ -1,4 +1,4 @@
1
- import { ChartColorScheme, ChartConnectorOptions, ChartCurve, ChartOptions, ChartPointDatum, ChartSeries, ChartSeriesType, ChartXValue } from './types.js';
1
+ import { ChartColorScheme, ChartConnectorOptions, ChartCurve, ChartDependency, ChartOptions, ChartPointDatum, ChartSeries, ChartSeriesType, ChartXValue } from './types.js';
2
2
  /** Default series names of the presets */
3
3
  interface PresetLabels {
4
4
  value: string;
@@ -369,8 +369,18 @@ export interface BubbleOptions {
369
369
  export declare const bubbleSeries: (series: readonly ChartSeries[], options?: BubbleOptions) => ChartSeries[];
370
370
  /** A task (or milestone) of a Gantt chart */
371
371
  export interface GanttTask {
372
- /** Row name (unique) */
372
+ /** Name of the task (tooltip title; the row name when there is no `row`) */
373
373
  name: string;
374
+ /**
375
+ * Identifier referenced by the `dependencies` of other tasks; the `name`
376
+ * by default (give ids when several tasks have the same name)
377
+ */
378
+ id?: string;
379
+ /**
380
+ * Row of the task: several tasks can share one (a resource, a lane); the
381
+ * `name` by default, one row per task
382
+ */
383
+ row?: string;
374
384
  /** Start (a timestamp or a date) */
375
385
  start: number | Date;
376
386
  /** End; omitted for milestones */
@@ -383,7 +393,10 @@ export interface GanttTask {
383
393
  color?: string;
384
394
  /** Draws a dot at `start` instead of a bar */
385
395
  milestone?: boolean;
386
- /** Names of the tasks this one waits for (shown in its tooltip) */
396
+ /**
397
+ * Tasks this one waits for, by `id` (or `name`): tooltip, and arrows from
398
+ * their ends to its start
399
+ */
387
400
  dependencies?: readonly string[];
388
401
  }
389
402
  /** Options of `ganttSeries` */
@@ -412,6 +425,14 @@ export interface GanttOptions {
412
425
  * @default "Depends on" (in the `locale`)
413
426
  */
414
427
  dependenciesName?: string;
428
+ /**
429
+ * Draws the dependencies as elbow arrows from the end of every
430
+ * predecessor to the start of the task
431
+ * @default true
432
+ */
433
+ dependencyArrows?: boolean;
434
+ /** Color of the dependency arrows (any CSS color); the secondary text color by default */
435
+ dependencyColor?: string;
415
436
  /**
416
437
  * Locale of the default names and of the progress shares
417
438
  * @default the page language
@@ -421,10 +442,12 @@ export interface GanttOptions {
421
442
  /** Series of a Gantt chart and the row names in order */
422
443
  export interface GanttSeries {
423
444
  series: ChartSeries[];
424
- /** Task names from top to bottom (the `categories` of the x axis) */
445
+ /** Rows from top to bottom (the `categories` of the x axis) */
425
446
  categories: string[];
426
447
  /** Time range of the tasks with a small margin (the `min` / `max` of the value axis) */
427
448
  domain: [number, number];
449
+ /** Arrows of the dependencies between existing tasks (the `dependencies` of the chart) */
450
+ dependencies: ChartDependency[];
428
451
  }
429
452
  /** Color `k` of the chart palette as a CSS color (theme variables first) */
430
453
  export declare const paletteColor: (k: number) => string;
@@ -504,23 +504,30 @@ var a = {
504
504
  let t = e % 8, n = P[t] ?? "#4f46e5", r = N[t];
505
505
  return r ? `var(--chart-series-${t + 1}, var(${r}, ${n}))` : `var(--chart-series-${t + 1}, ${n})`;
506
506
  }, I = (e) => e instanceof Date ? e.getTime() : e === void 0 ? NaN : e, L = (e, i = {}) => {
507
- let a = n(i.locale), s = o(a), c = r(a), l = i.taskName ?? s.tasks, u = i.progressName ?? s.progress, d = /^(zh|ja)\b/i.test(a) ? "、" : ", ", f = [];
507
+ let a = n(i.locale), s = o(a), c = r(a), l = i.taskName ?? s.tasks, u = i.progressName ?? s.progress, d = /^(zh|ja)\b/i.test(a) ? "、" : ", ", f = (e) => e.id ?? e.name, p = (e) => e.row ?? e.name, m = /* @__PURE__ */ new Map();
508
+ for (let t of e) m.has(f(t)) || m.set(f(t), t);
509
+ for (let t of e) m.has(t.name) || m.set(t.name, t);
510
+ let h = (e) => ({
511
+ x: p(e),
512
+ id: f(e),
513
+ ...p(e) === e.name ? {} : { label: e.name }
514
+ }), g = [];
508
515
  for (let t of e) {
509
516
  let e = t.group ?? l;
510
- !t.milestone && !f.includes(e) && f.push(e);
517
+ !t.milestone && !g.includes(e) && g.push(e);
511
518
  }
512
- let p = (e) => {
513
- let t = Math.max(0, f.indexOf(e));
519
+ let _ = (e) => {
520
+ let t = Math.max(0, g.indexOf(e));
514
521
  return i.colors?.[t] ?? F(t);
515
- }, m = i.formatProgress ?? ((e) => t(a, {
522
+ }, v = i.formatProgress ?? ((e) => t(a, {
516
523
  style: "percent",
517
524
  maximumFractionDigits: 0
518
- }).format(e)), h = f.map((t) => ({
525
+ }).format(e)), y = g.map((t) => ({
519
526
  id: `gantt:${t}`,
520
527
  name: t,
521
528
  type: "bar",
522
529
  stack: "gantt",
523
- color: p(t),
530
+ color: _(t),
524
531
  opacity: .3,
525
532
  barWidth: .62,
526
533
  radius: 4,
@@ -528,20 +535,20 @@ var a = {
528
535
  let t = [];
529
536
  return e.progress !== void 0 && t.push({
530
537
  name: u,
531
- value: m(Math.min(1, Math.max(0, e.progress)))
538
+ value: v(Math.min(1, Math.max(0, e.progress)))
532
539
  }), e.dependencies?.length && t.push({
533
540
  name: i.dependenciesName ?? c.dependencies,
534
- value: e.dependencies.join(d)
541
+ value: e.dependencies.map((e) => m.get(e)?.name ?? e).join(d)
535
542
  }), {
536
- x: e.name,
543
+ ...h(e),
537
544
  y0: I(e.start),
538
545
  y: I(e.end ?? e.start),
539
546
  ...e.color ? { color: e.color } : {},
540
547
  ...t.length ? { details: t } : {}
541
548
  };
542
549
  })
543
- })), g = e.filter((e) => !e.milestone && e.progress !== void 0 && e.progress > 0);
544
- g.length && h.push({
550
+ })), b = e.filter((e) => !e.milestone && e.progress !== void 0 && e.progress > 0);
551
+ b.length && y.push({
545
552
  id: "gantt:progress",
546
553
  name: u,
547
554
  type: "bar",
@@ -549,38 +556,47 @@ var a = {
549
556
  tooltip: !1,
550
557
  color: "var(--text-secondary-color, #6b7280)",
551
558
  radius: 4,
552
- data: g.map((e) => {
559
+ data: b.map((e) => {
553
560
  let t = I(e.start), n = I(e.end ?? e.start), r = Math.min(1, Math.max(0, e.progress ?? 0));
554
561
  return {
555
- x: e.name,
562
+ x: p(e),
556
563
  y0: t,
557
564
  y: t + (n - t) * r,
558
- label: m(r),
559
- color: e.color ?? p(e.group ?? l)
565
+ label: v(r),
566
+ color: e.color ?? _(e.group ?? l)
560
567
  };
561
568
  })
562
569
  });
563
- let _ = e.filter((e) => e.milestone);
564
- _.length && h.push({
570
+ let x = e.filter((e) => e.milestone);
571
+ x.length && y.push({
565
572
  id: "gantt:milestones",
566
573
  name: i.milestoneName ?? s.milestones,
567
574
  type: "scatter",
568
575
  color: "var(--text-color, #1f2937)",
569
576
  pointSize: 13,
570
577
  opacity: 1,
571
- data: _.map((e) => ({
572
- x: e.name,
578
+ data: x.map((e) => ({
579
+ ...h(e),
573
580
  y: I(e.start),
574
581
  ...e.color ? { color: e.color } : {}
575
582
  }))
576
583
  });
577
- let v = Infinity, y = -Infinity;
578
- for (let t of e) for (let e of [I(t.start), I(t.end ?? t.start)]) e < v && (v = e), e > y && (y = e);
579
- let b = Number.isFinite(y - v) ? Math.max((y - v) * .025, 1) : 0;
584
+ let S = Infinity, C = -Infinity;
585
+ for (let t of e) for (let e of [I(t.start), I(t.end ?? t.start)]) e < S && (S = e), e > C && (C = e);
586
+ let w = Number.isFinite(C - S) ? Math.max((C - S) * .025, 1) : 0, T = [];
587
+ if (i.dependencyArrows !== !1) for (let t of e) for (let e of t.dependencies ?? []) {
588
+ let n = m.get(e);
589
+ n && n !== t && T.push({
590
+ from: f(n),
591
+ to: f(t),
592
+ ...i.dependencyColor ? { color: i.dependencyColor } : {}
593
+ });
594
+ }
580
595
  return {
581
- series: h,
582
- categories: e.map((e) => e.name),
583
- domain: Number.isFinite(v) ? [v - b, y + b] : [0, 1]
596
+ series: y,
597
+ categories: [...new Set(e.map(p))],
598
+ domain: Number.isFinite(S) ? [S - w, C + w] : [0, 1],
599
+ dependencies: T
584
600
  };
585
601
  }, R = (e, t) => s(e, "area", void 0, t).map((e) => e.type === "area" ? {
586
602
  ...e,