minerva-design 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1166) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +21 -21
  3. package/custom-elements.json +13630 -4757
  4. package/dist/angular/fesm2022/minerva-angular.mjs +6872 -172
  5. package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
  6. package/dist/angular/types/minerva-angular.d.ts +2240 -0
  7. package/dist/charts/canvas.d.cts +7 -2
  8. package/dist/charts/canvas.d.ts +7 -2
  9. package/dist/charts/core.cjs +1 -1
  10. package/dist/charts/core.d.cts +7 -4
  11. package/dist/charts/core.d.ts +7 -4
  12. package/dist/charts/core.js +19 -8
  13. package/dist/charts/engine/axis.cjs +1 -1
  14. package/dist/charts/engine/axis.cjs.map +1 -1
  15. package/dist/charts/engine/axis.js +6 -6
  16. package/dist/charts/engine/axis.js.map +1 -1
  17. package/dist/charts/engine/canvas.cjs +1 -1
  18. package/dist/charts/engine/canvas.cjs.map +1 -1
  19. package/dist/charts/engine/canvas.d.cts +11 -1
  20. package/dist/charts/engine/canvas.d.ts +11 -1
  21. package/dist/charts/engine/canvas.js +118 -68
  22. package/dist/charts/engine/canvas.js.map +1 -1
  23. package/dist/charts/engine/chart.cjs +1 -1
  24. package/dist/charts/engine/chart.cjs.map +1 -1
  25. package/dist/charts/engine/chart.d.cts +1 -1
  26. package/dist/charts/engine/chart.d.ts +1 -1
  27. package/dist/charts/engine/chart.js +307 -285
  28. package/dist/charts/engine/chart.js.map +1 -1
  29. package/dist/charts/engine/color.cjs +1 -1
  30. package/dist/charts/engine/color.cjs.map +1 -1
  31. package/dist/charts/engine/color.js +2 -2
  32. package/dist/charts/engine/color.js.map +1 -1
  33. package/dist/charts/engine/controller.cjs +1 -1
  34. package/dist/charts/engine/controller.cjs.map +1 -1
  35. package/dist/charts/engine/controller.d.cts +12 -3
  36. package/dist/charts/engine/controller.d.ts +12 -3
  37. package/dist/charts/engine/controller.js +359 -299
  38. package/dist/charts/engine/controller.js.map +1 -1
  39. package/dist/charts/engine/data.cjs +1 -1
  40. package/dist/charts/engine/data.cjs.map +1 -1
  41. package/dist/charts/engine/data.d.cts +6 -0
  42. package/dist/charts/engine/data.d.ts +6 -0
  43. package/dist/charts/engine/data.js +63 -49
  44. package/dist/charts/engine/data.js.map +1 -1
  45. package/dist/charts/engine/format.cjs +1 -1
  46. package/dist/charts/engine/format.cjs.map +1 -1
  47. package/dist/charts/engine/format.d.cts +21 -6
  48. package/dist/charts/engine/format.d.ts +21 -6
  49. package/dist/charts/engine/format.js +46 -21
  50. package/dist/charts/engine/format.js.map +1 -1
  51. package/dist/charts/engine/items.cjs +1 -1
  52. package/dist/charts/engine/items.cjs.map +1 -1
  53. package/dist/charts/engine/items.js +211 -54
  54. package/dist/charts/engine/items.js.map +1 -1
  55. package/dist/charts/engine/labels.cjs +2 -0
  56. package/dist/charts/engine/labels.cjs.map +1 -0
  57. package/dist/charts/engine/labels.d.cts +13 -0
  58. package/dist/charts/engine/labels.d.ts +13 -0
  59. package/dist/charts/engine/labels.js +74 -0
  60. package/dist/charts/engine/labels.js.map +1 -0
  61. package/dist/charts/engine/layout.cjs +1 -1
  62. package/dist/charts/engine/layout.cjs.map +1 -1
  63. package/dist/charts/engine/layout.d.cts +34 -2
  64. package/dist/charts/engine/layout.d.ts +34 -2
  65. package/dist/charts/engine/layout.js +53 -12
  66. package/dist/charts/engine/layout.js.map +1 -1
  67. package/dist/charts/engine/locale.cjs +2 -0
  68. package/dist/charts/engine/locale.cjs.map +1 -0
  69. package/dist/charts/engine/locale.d.cts +33 -0
  70. package/dist/charts/engine/locale.d.ts +33 -0
  71. package/dist/charts/engine/locale.js +68 -0
  72. package/dist/charts/engine/locale.js.map +1 -0
  73. package/dist/charts/engine/model.cjs +1 -1
  74. package/dist/charts/engine/model.cjs.map +1 -1
  75. package/dist/charts/engine/model.d.cts +39 -1
  76. package/dist/charts/engine/model.d.ts +39 -1
  77. package/dist/charts/engine/model.js +212 -105
  78. package/dist/charts/engine/model.js.map +1 -1
  79. package/dist/charts/engine/orderbook/book.cjs +2 -0
  80. package/dist/charts/engine/orderbook/book.cjs.map +1 -0
  81. package/dist/charts/engine/orderbook/book.d.cts +28 -0
  82. package/dist/charts/engine/orderbook/book.d.ts +28 -0
  83. package/dist/charts/engine/orderbook/book.js +134 -0
  84. package/dist/charts/engine/orderbook/book.js.map +1 -0
  85. package/dist/charts/engine/orderbook/depth.cjs +2 -0
  86. package/dist/charts/engine/orderbook/depth.cjs.map +1 -0
  87. package/dist/charts/engine/orderbook/depth.d.cts +7 -0
  88. package/dist/charts/engine/orderbook/depth.d.ts +7 -0
  89. package/dist/charts/engine/orderbook/depth.js +413 -0
  90. package/dist/charts/engine/orderbook/depth.js.map +1 -0
  91. package/dist/charts/engine/orderbook/format.cjs +2 -0
  92. package/dist/charts/engine/orderbook/format.cjs.map +1 -0
  93. package/dist/charts/engine/orderbook/format.d.cts +48 -0
  94. package/dist/charts/engine/orderbook/format.d.ts +48 -0
  95. package/dist/charts/engine/orderbook/format.js +65 -0
  96. package/dist/charts/engine/orderbook/format.js.map +1 -0
  97. package/dist/charts/engine/orderbook/heatmap.cjs +2 -0
  98. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -0
  99. package/dist/charts/engine/orderbook/heatmap.d.cts +9 -0
  100. package/dist/charts/engine/orderbook/heatmap.d.ts +9 -0
  101. package/dist/charts/engine/orderbook/heatmap.js +703 -0
  102. package/dist/charts/engine/orderbook/heatmap.js.map +1 -0
  103. package/dist/charts/engine/orderbook/host.cjs +2 -0
  104. package/dist/charts/engine/orderbook/host.cjs.map +1 -0
  105. package/dist/charts/engine/orderbook/host.d.cts +50 -0
  106. package/dist/charts/engine/orderbook/host.d.ts +50 -0
  107. package/dist/charts/engine/orderbook/host.js +161 -0
  108. package/dist/charts/engine/orderbook/host.js.map +1 -0
  109. package/dist/charts/engine/orderbook/index.cjs +1 -0
  110. package/dist/charts/engine/orderbook/index.d.cts +6 -0
  111. package/dist/charts/engine/orderbook/index.d.ts +6 -0
  112. package/dist/charts/engine/orderbook/index.js +6 -0
  113. package/dist/charts/engine/orderbook/ladder.cjs +2 -0
  114. package/dist/charts/engine/orderbook/ladder.cjs.map +1 -0
  115. package/dist/charts/engine/orderbook/ladder.d.cts +6 -0
  116. package/dist/charts/engine/orderbook/ladder.d.ts +6 -0
  117. package/dist/charts/engine/orderbook/ladder.js +341 -0
  118. package/dist/charts/engine/orderbook/ladder.js.map +1 -0
  119. package/dist/charts/engine/orderbook/tape.cjs +2 -0
  120. package/dist/charts/engine/orderbook/tape.cjs.map +1 -0
  121. package/dist/charts/engine/orderbook/tape.d.cts +6 -0
  122. package/dist/charts/engine/orderbook/tape.d.ts +6 -0
  123. package/dist/charts/engine/orderbook/tape.js +450 -0
  124. package/dist/charts/engine/orderbook/tape.js.map +1 -0
  125. package/dist/charts/engine/orderbook/types.d.cts +735 -0
  126. package/dist/charts/engine/orderbook/types.d.ts +735 -0
  127. package/dist/charts/engine/overlay.cjs +1 -1
  128. package/dist/charts/engine/overlay.cjs.map +1 -1
  129. package/dist/charts/engine/overlay.d.cts +18 -2
  130. package/dist/charts/engine/overlay.d.ts +18 -2
  131. package/dist/charts/engine/overlay.js +132 -96
  132. package/dist/charts/engine/overlay.js.map +1 -1
  133. package/dist/charts/engine/presets.cjs +2 -2
  134. package/dist/charts/engine/presets.cjs.map +1 -1
  135. package/dist/charts/engine/presets.d.cts +249 -1
  136. package/dist/charts/engine/presets.d.ts +249 -1
  137. package/dist/charts/engine/presets.js +367 -29
  138. package/dist/charts/engine/presets.js.map +1 -1
  139. package/dist/charts/engine/renderers/detect.cjs +1 -1
  140. package/dist/charts/engine/renderers/detect.cjs.map +1 -1
  141. package/dist/charts/engine/renderers/detect.js +18 -15
  142. package/dist/charts/engine/renderers/detect.js.map +1 -1
  143. package/dist/charts/engine/renderers/gl.cjs +2 -0
  144. package/dist/charts/engine/renderers/gl.cjs.map +1 -0
  145. package/dist/charts/engine/renderers/gl.d.cts +21 -0
  146. package/dist/charts/engine/renderers/gl.d.ts +21 -0
  147. package/dist/charts/engine/renderers/gl.js +56 -0
  148. package/dist/charts/engine/renderers/gl.js.map +1 -0
  149. package/dist/charts/engine/renderers/shaders.cjs +143 -1
  150. package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
  151. package/dist/charts/engine/renderers/shaders.d.cts +16 -0
  152. package/dist/charts/engine/renderers/shaders.d.ts +16 -0
  153. package/dist/charts/engine/renderers/shaders.js +139 -1
  154. package/dist/charts/engine/renderers/shaders.js.map +1 -1
  155. package/dist/charts/engine/renderers/webgl.cjs +2 -0
  156. package/dist/charts/engine/renderers/webgl.cjs.map +1 -0
  157. package/dist/charts/engine/renderers/webgl.d.cts +4 -0
  158. package/dist/charts/engine/renderers/webgl.d.ts +4 -0
  159. package/dist/charts/engine/renderers/webgl.js +133 -0
  160. package/dist/charts/engine/renderers/webgl.js.map +1 -0
  161. package/dist/charts/engine/renderers/webgl2.cjs +1 -1
  162. package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
  163. package/dist/charts/engine/renderers/webgl2.d.cts +0 -1
  164. package/dist/charts/engine/renderers/webgl2.d.ts +0 -1
  165. package/dist/charts/engine/renderers/webgl2.js +59 -108
  166. package/dist/charts/engine/renderers/webgl2.js.map +1 -1
  167. package/dist/charts/engine/scale.cjs +1 -1
  168. package/dist/charts/engine/scale.cjs.map +1 -1
  169. package/dist/charts/engine/scale.js +1 -1
  170. package/dist/charts/engine/scale.js.map +1 -1
  171. package/dist/charts/engine/scene.cjs +1 -1
  172. package/dist/charts/engine/scene.cjs.map +1 -1
  173. package/dist/charts/engine/scene.d.cts +14 -4
  174. package/dist/charts/engine/scene.d.ts +14 -4
  175. package/dist/charts/engine/scene.js +292 -163
  176. package/dist/charts/engine/scene.js.map +1 -1
  177. package/dist/charts/engine/shapes/bullet.cjs +2 -0
  178. package/dist/charts/engine/shapes/bullet.cjs.map +1 -0
  179. package/dist/charts/engine/shapes/bullet.d.cts +6 -0
  180. package/dist/charts/engine/shapes/bullet.d.ts +6 -0
  181. package/dist/charts/engine/shapes/bullet.js +255 -0
  182. package/dist/charts/engine/shapes/bullet.js.map +1 -0
  183. package/dist/charts/engine/shapes/calendar.cjs +2 -0
  184. package/dist/charts/engine/shapes/calendar.cjs.map +1 -0
  185. package/dist/charts/engine/shapes/calendar.d.cts +38 -0
  186. package/dist/charts/engine/shapes/calendar.d.ts +38 -0
  187. package/dist/charts/engine/shapes/calendar.js +369 -0
  188. package/dist/charts/engine/shapes/calendar.js.map +1 -0
  189. package/dist/charts/engine/shapes/canvas.cjs +1 -1
  190. package/dist/charts/engine/shapes/canvas.cjs.map +1 -1
  191. package/dist/charts/engine/shapes/canvas.d.cts +7 -0
  192. package/dist/charts/engine/shapes/canvas.d.ts +7 -0
  193. package/dist/charts/engine/shapes/canvas.js +22 -13
  194. package/dist/charts/engine/shapes/canvas.js.map +1 -1
  195. package/dist/charts/engine/shapes/chart.cjs +1 -1
  196. package/dist/charts/engine/shapes/chart.cjs.map +1 -1
  197. package/dist/charts/engine/shapes/chart.d.cts +3 -2
  198. package/dist/charts/engine/shapes/chart.d.ts +3 -2
  199. package/dist/charts/engine/shapes/chart.js +45 -26
  200. package/dist/charts/engine/shapes/chart.js.map +1 -1
  201. package/dist/charts/engine/shapes/draw.cjs +1 -1
  202. package/dist/charts/engine/shapes/draw.cjs.map +1 -1
  203. package/dist/charts/engine/shapes/draw.d.cts +3 -1
  204. package/dist/charts/engine/shapes/draw.d.ts +3 -1
  205. package/dist/charts/engine/shapes/draw.js +31 -18
  206. package/dist/charts/engine/shapes/draw.js.map +1 -1
  207. package/dist/charts/engine/shapes/funnel.cjs +1 -1
  208. package/dist/charts/engine/shapes/funnel.cjs.map +1 -1
  209. package/dist/charts/engine/shapes/funnel.js +3 -3
  210. package/dist/charts/engine/shapes/funnel.js.map +1 -1
  211. package/dist/charts/engine/shapes/gauge.cjs +1 -1
  212. package/dist/charts/engine/shapes/gauge.cjs.map +1 -1
  213. package/dist/charts/engine/shapes/gauge.js +132 -95
  214. package/dist/charts/engine/shapes/gauge.js.map +1 -1
  215. package/dist/charts/engine/shapes/hit.cjs +1 -1
  216. package/dist/charts/engine/shapes/hit.cjs.map +1 -1
  217. package/dist/charts/engine/shapes/hit.d.cts +3 -1
  218. package/dist/charts/engine/shapes/hit.d.ts +3 -1
  219. package/dist/charts/engine/shapes/hit.js +29 -8
  220. package/dist/charts/engine/shapes/hit.js.map +1 -1
  221. package/dist/charts/engine/shapes/index.d.cts +4 -1
  222. package/dist/charts/engine/shapes/index.d.ts +4 -1
  223. package/dist/charts/engine/shapes/labels.cjs +2 -0
  224. package/dist/charts/engine/shapes/labels.cjs.map +1 -0
  225. package/dist/charts/engine/shapes/labels.d.cts +14 -0
  226. package/dist/charts/engine/shapes/labels.d.ts +14 -0
  227. package/dist/charts/engine/shapes/labels.js +146 -0
  228. package/dist/charts/engine/shapes/labels.js.map +1 -0
  229. package/dist/charts/engine/shapes/layout.cjs +2 -2
  230. package/dist/charts/engine/shapes/layout.cjs.map +1 -1
  231. package/dist/charts/engine/shapes/layout.d.cts +8 -3
  232. package/dist/charts/engine/shapes/layout.d.ts +8 -3
  233. package/dist/charts/engine/shapes/layout.js +200 -113
  234. package/dist/charts/engine/shapes/layout.js.map +1 -1
  235. package/dist/charts/engine/shapes/pie.cjs +1 -1
  236. package/dist/charts/engine/shapes/pie.cjs.map +1 -1
  237. package/dist/charts/engine/shapes/pie.js +2 -2
  238. package/dist/charts/engine/shapes/pie.js.map +1 -1
  239. package/dist/charts/engine/shapes/radar.cjs +1 -1
  240. package/dist/charts/engine/shapes/radar.cjs.map +1 -1
  241. package/dist/charts/engine/shapes/radar.d.cts +2 -2
  242. package/dist/charts/engine/shapes/radar.d.ts +2 -2
  243. package/dist/charts/engine/shapes/radar.js +50 -49
  244. package/dist/charts/engine/shapes/radar.js.map +1 -1
  245. package/dist/charts/engine/shapes/radialBar.cjs +2 -0
  246. package/dist/charts/engine/shapes/radialBar.cjs.map +1 -0
  247. package/dist/charts/engine/shapes/radialBar.d.cts +8 -0
  248. package/dist/charts/engine/shapes/radialBar.d.ts +8 -0
  249. package/dist/charts/engine/shapes/radialBar.js +155 -0
  250. package/dist/charts/engine/shapes/radialBar.js.map +1 -0
  251. package/dist/charts/engine/shapes/runtime.cjs +1 -1
  252. package/dist/charts/engine/shapes/runtime.cjs.map +1 -1
  253. package/dist/charts/engine/shapes/runtime.d.cts +9 -2
  254. package/dist/charts/engine/shapes/runtime.d.ts +9 -2
  255. package/dist/charts/engine/shapes/runtime.js +61 -51
  256. package/dist/charts/engine/shapes/runtime.js.map +1 -1
  257. package/dist/charts/engine/shapes/sankey.cjs +2 -0
  258. package/dist/charts/engine/shapes/sankey.cjs.map +1 -0
  259. package/dist/charts/engine/shapes/sankey.d.cts +29 -0
  260. package/dist/charts/engine/shapes/sankey.d.ts +29 -0
  261. package/dist/charts/engine/shapes/sankey.js +372 -0
  262. package/dist/charts/engine/shapes/sankey.js.map +1 -0
  263. package/dist/charts/engine/shapes/scene.cjs +1 -1
  264. package/dist/charts/engine/shapes/scene.cjs.map +1 -1
  265. package/dist/charts/engine/shapes/scene.d.cts +62 -8
  266. package/dist/charts/engine/shapes/scene.d.ts +62 -8
  267. package/dist/charts/engine/shapes/scene.js +33 -31
  268. package/dist/charts/engine/shapes/scene.js.map +1 -1
  269. package/dist/charts/engine/shapes/sunburst.cjs +2 -0
  270. package/dist/charts/engine/shapes/sunburst.cjs.map +1 -0
  271. package/dist/charts/engine/shapes/sunburst.d.cts +6 -0
  272. package/dist/charts/engine/shapes/sunburst.d.ts +6 -0
  273. package/dist/charts/engine/shapes/sunburst.js +261 -0
  274. package/dist/charts/engine/shapes/sunburst.js.map +1 -0
  275. package/dist/charts/engine/shapes/treemap.cjs +1 -1
  276. package/dist/charts/engine/shapes/treemap.cjs.map +1 -1
  277. package/dist/charts/engine/shapes/treemap.js +2 -2
  278. package/dist/charts/engine/shapes/treemap.js.map +1 -1
  279. package/dist/charts/engine/shapes/types.d.cts +439 -12
  280. package/dist/charts/engine/shapes/types.d.ts +439 -12
  281. package/dist/charts/engine/three-d/canvas2d.cjs +2 -0
  282. package/dist/charts/engine/three-d/canvas2d.cjs.map +1 -0
  283. package/dist/charts/engine/three-d/canvas2d.d.cts +4 -0
  284. package/dist/charts/engine/three-d/canvas2d.d.ts +4 -0
  285. package/dist/charts/engine/three-d/canvas2d.js +104 -0
  286. package/dist/charts/engine/three-d/canvas2d.js.map +1 -0
  287. package/dist/charts/engine/three-d/chart.cjs +2 -0
  288. package/dist/charts/engine/three-d/chart.cjs.map +1 -0
  289. package/dist/charts/engine/three-d/chart.d.cts +15 -0
  290. package/dist/charts/engine/three-d/chart.d.ts +15 -0
  291. package/dist/charts/engine/three-d/chart.js +621 -0
  292. package/dist/charts/engine/three-d/chart.js.map +1 -0
  293. package/dist/charts/engine/three-d/colormap.cjs +2 -0
  294. package/dist/charts/engine/three-d/colormap.cjs.map +1 -0
  295. package/dist/charts/engine/three-d/colormap.d.cts +16 -0
  296. package/dist/charts/engine/three-d/colormap.d.ts +16 -0
  297. package/dist/charts/engine/three-d/colormap.js +166 -0
  298. package/dist/charts/engine/three-d/colormap.js.map +1 -0
  299. package/dist/charts/engine/three-d/contours.cjs +2 -0
  300. package/dist/charts/engine/three-d/contours.cjs.map +1 -0
  301. package/dist/charts/engine/three-d/contours.d.cts +7 -0
  302. package/dist/charts/engine/three-d/contours.d.ts +7 -0
  303. package/dist/charts/engine/three-d/contours.js +47 -0
  304. package/dist/charts/engine/three-d/contours.js.map +1 -0
  305. package/dist/charts/engine/three-d/detect.cjs +2 -0
  306. package/dist/charts/engine/three-d/detect.cjs.map +1 -0
  307. package/dist/charts/engine/three-d/detect.d.cts +11 -0
  308. package/dist/charts/engine/three-d/detect.d.ts +11 -0
  309. package/dist/charts/engine/three-d/detect.js +35 -0
  310. package/dist/charts/engine/three-d/detect.js.map +1 -0
  311. package/dist/charts/engine/three-d/dom.cjs +2 -0
  312. package/dist/charts/engine/three-d/dom.cjs.map +1 -0
  313. package/dist/charts/engine/three-d/dom.d.cts +21 -0
  314. package/dist/charts/engine/three-d/dom.d.ts +21 -0
  315. package/dist/charts/engine/three-d/dom.js +98 -0
  316. package/dist/charts/engine/three-d/dom.js.map +1 -0
  317. package/dist/charts/engine/three-d/geometry.cjs +2 -0
  318. package/dist/charts/engine/three-d/geometry.cjs.map +1 -0
  319. package/dist/charts/engine/three-d/geometry.d.cts +76 -0
  320. package/dist/charts/engine/three-d/geometry.d.ts +76 -0
  321. package/dist/charts/engine/three-d/geometry.js +529 -0
  322. package/dist/charts/engine/three-d/geometry.js.map +1 -0
  323. package/dist/charts/engine/three-d/hover.cjs +2 -0
  324. package/dist/charts/engine/three-d/hover.cjs.map +1 -0
  325. package/dist/charts/engine/three-d/hover.d.cts +25 -0
  326. package/dist/charts/engine/three-d/hover.d.ts +25 -0
  327. package/dist/charts/engine/three-d/hover.js +131 -0
  328. package/dist/charts/engine/three-d/hover.js.map +1 -0
  329. package/dist/charts/engine/three-d/index.cjs +1 -0
  330. package/dist/charts/engine/three-d/index.d.cts +2 -0
  331. package/dist/charts/engine/three-d/index.d.ts +2 -0
  332. package/dist/charts/engine/three-d/index.js +2 -0
  333. package/dist/charts/engine/three-d/labels.cjs +2 -0
  334. package/dist/charts/engine/three-d/labels.cjs.map +1 -0
  335. package/dist/charts/engine/three-d/labels.d.cts +23 -0
  336. package/dist/charts/engine/three-d/labels.d.ts +23 -0
  337. package/dist/charts/engine/three-d/labels.js +136 -0
  338. package/dist/charts/engine/three-d/labels.js.map +1 -0
  339. package/dist/charts/engine/three-d/math.cjs +2 -0
  340. package/dist/charts/engine/three-d/math.cjs.map +1 -0
  341. package/dist/charts/engine/three-d/math.d.cts +84 -0
  342. package/dist/charts/engine/three-d/math.d.ts +84 -0
  343. package/dist/charts/engine/three-d/math.js +150 -0
  344. package/dist/charts/engine/three-d/math.js.map +1 -0
  345. package/dist/charts/engine/three-d/model.cjs +2 -0
  346. package/dist/charts/engine/three-d/model.cjs.map +1 -0
  347. package/dist/charts/engine/three-d/model.d.cts +130 -0
  348. package/dist/charts/engine/three-d/model.d.ts +130 -0
  349. package/dist/charts/engine/three-d/model.js +277 -0
  350. package/dist/charts/engine/three-d/model.js.map +1 -0
  351. package/dist/charts/engine/three-d/overlay.cjs +2 -0
  352. package/dist/charts/engine/three-d/overlay.cjs.map +1 -0
  353. package/dist/charts/engine/three-d/overlay.d.cts +72 -0
  354. package/dist/charts/engine/three-d/overlay.d.ts +72 -0
  355. package/dist/charts/engine/three-d/overlay.js +197 -0
  356. package/dist/charts/engine/three-d/overlay.js.map +1 -0
  357. package/dist/charts/engine/three-d/pick.cjs +2 -0
  358. package/dist/charts/engine/three-d/pick.cjs.map +1 -0
  359. package/dist/charts/engine/three-d/pick.d.cts +52 -0
  360. package/dist/charts/engine/three-d/pick.d.ts +52 -0
  361. package/dist/charts/engine/three-d/pick.js +220 -0
  362. package/dist/charts/engine/three-d/pick.js.map +1 -0
  363. package/dist/charts/engine/three-d/render-types.cjs +2 -0
  364. package/dist/charts/engine/three-d/render-types.cjs.map +1 -0
  365. package/dist/charts/engine/three-d/render-types.d.cts +82 -0
  366. package/dist/charts/engine/three-d/render-types.d.ts +82 -0
  367. package/dist/charts/engine/three-d/render-types.js +13 -0
  368. package/dist/charts/engine/three-d/render-types.js.map +1 -0
  369. package/dist/charts/engine/three-d/shaders.cjs +276 -0
  370. package/dist/charts/engine/three-d/shaders.cjs.map +1 -0
  371. package/dist/charts/engine/three-d/shaders.d.cts +26 -0
  372. package/dist/charts/engine/three-d/shaders.d.ts +26 -0
  373. package/dist/charts/engine/three-d/shaders.js +191 -0
  374. package/dist/charts/engine/three-d/shaders.js.map +1 -0
  375. package/dist/charts/engine/three-d/sort.cjs +2 -0
  376. package/dist/charts/engine/three-d/sort.cjs.map +1 -0
  377. package/dist/charts/engine/three-d/sort.d.cts +18 -0
  378. package/dist/charts/engine/three-d/sort.d.ts +18 -0
  379. package/dist/charts/engine/three-d/sort.js +71 -0
  380. package/dist/charts/engine/three-d/sort.js.map +1 -0
  381. package/dist/charts/engine/three-d/types.d.cts +588 -0
  382. package/dist/charts/engine/three-d/types.d.ts +588 -0
  383. package/dist/charts/engine/three-d/webgl.cjs +2 -0
  384. package/dist/charts/engine/three-d/webgl.cjs.map +1 -0
  385. package/dist/charts/engine/three-d/webgl.d.cts +10 -0
  386. package/dist/charts/engine/three-d/webgl.d.ts +10 -0
  387. package/dist/charts/engine/three-d/webgl.js +130 -0
  388. package/dist/charts/engine/three-d/webgl.js.map +1 -0
  389. package/dist/charts/engine/three-d/webgpu.cjs +2 -0
  390. package/dist/charts/engine/three-d/webgpu.cjs.map +1 -0
  391. package/dist/charts/engine/three-d/webgpu.d.cts +5 -0
  392. package/dist/charts/engine/three-d/webgpu.d.ts +5 -0
  393. package/dist/charts/engine/three-d/webgpu.js +249 -0
  394. package/dist/charts/engine/three-d/webgpu.js.map +1 -0
  395. package/dist/charts/engine/time.cjs +1 -1
  396. package/dist/charts/engine/time.cjs.map +1 -1
  397. package/dist/charts/engine/time.d.cts +13 -4
  398. package/dist/charts/engine/time.d.ts +13 -4
  399. package/dist/charts/engine/time.js +156 -91
  400. package/dist/charts/engine/time.js.map +1 -1
  401. package/dist/charts/engine/trading/chart.cjs +2 -0
  402. package/dist/charts/engine/trading/chart.cjs.map +1 -0
  403. package/dist/charts/engine/trading/chart.d.cts +3 -0
  404. package/dist/charts/engine/trading/chart.d.ts +3 -0
  405. package/dist/charts/engine/trading/chart.js +1507 -0
  406. package/dist/charts/engine/trading/chart.js.map +1 -0
  407. package/dist/charts/engine/trading/drawings.cjs +2 -0
  408. package/dist/charts/engine/trading/drawings.cjs.map +1 -0
  409. package/dist/charts/engine/trading/drawings.d.cts +57 -0
  410. package/dist/charts/engine/trading/drawings.d.ts +57 -0
  411. package/dist/charts/engine/trading/drawings.js +160 -0
  412. package/dist/charts/engine/trading/drawings.js.map +1 -0
  413. package/dist/charts/engine/trading/format.cjs +2 -0
  414. package/dist/charts/engine/trading/format.cjs.map +1 -0
  415. package/dist/charts/engine/trading/format.d.cts +60 -0
  416. package/dist/charts/engine/trading/format.d.ts +60 -0
  417. package/dist/charts/engine/trading/format.js +131 -0
  418. package/dist/charts/engine/trading/format.js.map +1 -0
  419. package/dist/charts/engine/trading/geometry.cjs +2 -0
  420. package/dist/charts/engine/trading/geometry.cjs.map +1 -0
  421. package/dist/charts/engine/trading/geometry.d.cts +55 -0
  422. package/dist/charts/engine/trading/geometry.d.ts +55 -0
  423. package/dist/charts/engine/trading/geometry.js +131 -0
  424. package/dist/charts/engine/trading/geometry.js.map +1 -0
  425. package/dist/charts/engine/trading/index.cjs +1 -0
  426. package/dist/charts/engine/trading/index.d.cts +3 -0
  427. package/dist/charts/engine/trading/index.d.ts +3 -0
  428. package/dist/charts/engine/trading/index.js +3 -0
  429. package/dist/charts/engine/trading/indicators.cjs +2 -0
  430. package/dist/charts/engine/trading/indicators.cjs.map +1 -0
  431. package/dist/charts/engine/trading/indicators.d.cts +105 -0
  432. package/dist/charts/engine/trading/indicators.d.ts +105 -0
  433. package/dist/charts/engine/trading/indicators.js +268 -0
  434. package/dist/charts/engine/trading/indicators.js.map +1 -0
  435. package/dist/charts/engine/trading/labels.cjs +2 -0
  436. package/dist/charts/engine/trading/labels.cjs.map +1 -0
  437. package/dist/charts/engine/trading/labels.d.cts +7 -0
  438. package/dist/charts/engine/trading/labels.d.ts +7 -0
  439. package/dist/charts/engine/trading/labels.js +91 -0
  440. package/dist/charts/engine/trading/labels.js.map +1 -0
  441. package/dist/charts/engine/trading/scale.cjs +2 -0
  442. package/dist/charts/engine/trading/scale.cjs.map +1 -0
  443. package/dist/charts/engine/trading/scale.d.cts +46 -0
  444. package/dist/charts/engine/trading/scale.d.ts +46 -0
  445. package/dist/charts/engine/trading/scale.js +100 -0
  446. package/dist/charts/engine/trading/scale.js.map +1 -0
  447. package/dist/charts/engine/trading/store.cjs +2 -0
  448. package/dist/charts/engine/trading/store.cjs.map +1 -0
  449. package/dist/charts/engine/trading/store.d.cts +62 -0
  450. package/dist/charts/engine/trading/store.d.ts +62 -0
  451. package/dist/charts/engine/trading/store.js +129 -0
  452. package/dist/charts/engine/trading/store.js.map +1 -0
  453. package/dist/charts/engine/trading/studies.cjs +2 -0
  454. package/dist/charts/engine/trading/studies.cjs.map +1 -0
  455. package/dist/charts/engine/trading/studies.d.cts +52 -0
  456. package/dist/charts/engine/trading/studies.d.ts +52 -0
  457. package/dist/charts/engine/trading/studies.js +254 -0
  458. package/dist/charts/engine/trading/studies.js.map +1 -0
  459. package/dist/charts/engine/trading/types.d.cts +656 -0
  460. package/dist/charts/engine/trading/types.d.ts +656 -0
  461. package/dist/charts/engine/types.d.cts +165 -14
  462. package/dist/charts/engine/types.d.ts +165 -14
  463. package/dist/charts/index.cjs +1 -1
  464. package/dist/charts/index.d.cts +7 -4
  465. package/dist/charts/index.d.ts +7 -4
  466. package/dist/charts/index.js +22 -11
  467. package/dist/charts/react/Chart.cjs +1 -1
  468. package/dist/charts/react/Chart.cjs.map +1 -1
  469. package/dist/charts/react/Chart.d.cts +4 -4
  470. package/dist/charts/react/Chart.d.ts +4 -4
  471. package/dist/charts/react/Chart.js +5 -1
  472. package/dist/charts/react/Chart.js.map +1 -1
  473. package/dist/charts/react/charts.cjs +1 -1
  474. package/dist/charts/react/charts.cjs.map +1 -1
  475. package/dist/charts/react/charts.d.cts +39 -1
  476. package/dist/charts/react/charts.d.ts +39 -1
  477. package/dist/charts/react/charts.js +303 -131
  478. package/dist/charts/react/charts.js.map +1 -1
  479. package/dist/charts/react/orderbook.cjs +2 -0
  480. package/dist/charts/react/orderbook.cjs.map +1 -0
  481. package/dist/charts/react/orderbook.d.cts +142 -0
  482. package/dist/charts/react/orderbook.d.ts +142 -0
  483. package/dist/charts/react/orderbook.js +182 -0
  484. package/dist/charts/react/orderbook.js.map +1 -0
  485. package/dist/charts/react/shapes.cjs +1 -1
  486. package/dist/charts/react/shapes.cjs.map +1 -1
  487. package/dist/charts/react/shapes.d.cts +291 -9
  488. package/dist/charts/react/shapes.d.ts +291 -9
  489. package/dist/charts/react/shapes.js +280 -93
  490. package/dist/charts/react/shapes.js.map +1 -1
  491. package/dist/charts/react/three-d.cjs +2 -0
  492. package/dist/charts/react/three-d.cjs.map +1 -0
  493. package/dist/charts/react/three-d.d.cts +151 -0
  494. package/dist/charts/react/three-d.d.ts +151 -0
  495. package/dist/charts/react/three-d.js +154 -0
  496. package/dist/charts/react/three-d.js.map +1 -0
  497. package/dist/charts/react/trading.cjs +2 -0
  498. package/dist/charts/react/trading.cjs.map +1 -0
  499. package/dist/charts/react/trading.d.cts +93 -0
  500. package/dist/charts/react/trading.d.ts +93 -0
  501. package/dist/charts/react/trading.js +95 -0
  502. package/dist/charts/react/trading.js.map +1 -0
  503. package/dist/charts/react/types.d.cts +132 -8
  504. package/dist/charts/react/types.d.ts +132 -8
  505. package/dist/core/contracts.cjs +1 -1
  506. package/dist/core/contracts.cjs.map +1 -1
  507. package/dist/core/contracts.js +1 -1
  508. package/dist/core/contracts.js.map +1 -1
  509. package/dist/native/charts/src/canvas.cjs +1 -1
  510. package/dist/native/charts/src/canvas.js +9 -3
  511. package/dist/native/charts/src/engine/axis.cjs +1 -1
  512. package/dist/native/charts/src/engine/axis.cjs.map +1 -1
  513. package/dist/native/charts/src/engine/axis.js +6 -6
  514. package/dist/native/charts/src/engine/axis.js.map +1 -1
  515. package/dist/native/charts/src/engine/controller.cjs +1 -1
  516. package/dist/native/charts/src/engine/controller.cjs.map +1 -1
  517. package/dist/native/charts/src/engine/controller.js +352 -292
  518. package/dist/native/charts/src/engine/controller.js.map +1 -1
  519. package/dist/native/charts/src/engine/data.cjs +1 -1
  520. package/dist/native/charts/src/engine/data.cjs.map +1 -1
  521. package/dist/native/charts/src/engine/data.js +63 -49
  522. package/dist/native/charts/src/engine/data.js.map +1 -1
  523. package/dist/native/charts/src/engine/format.cjs +1 -1
  524. package/dist/native/charts/src/engine/format.cjs.map +1 -1
  525. package/dist/native/charts/src/engine/format.js +46 -21
  526. package/dist/native/charts/src/engine/format.js.map +1 -1
  527. package/dist/native/charts/src/engine/labels.cjs +2 -0
  528. package/dist/native/charts/src/engine/labels.cjs.map +1 -0
  529. package/dist/native/charts/src/engine/labels.js +74 -0
  530. package/dist/native/charts/src/engine/labels.js.map +1 -0
  531. package/dist/native/charts/src/engine/layout.cjs +1 -1
  532. package/dist/native/charts/src/engine/layout.cjs.map +1 -1
  533. package/dist/native/charts/src/engine/layout.js +53 -12
  534. package/dist/native/charts/src/engine/layout.js.map +1 -1
  535. package/dist/native/charts/src/engine/locale.cjs +2 -0
  536. package/dist/native/charts/src/engine/locale.cjs.map +1 -0
  537. package/dist/native/charts/src/engine/locale.js +60 -0
  538. package/dist/native/charts/src/engine/locale.js.map +1 -0
  539. package/dist/native/charts/src/engine/model.cjs +1 -1
  540. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  541. package/dist/native/charts/src/engine/model.js +223 -116
  542. package/dist/native/charts/src/engine/model.js.map +1 -1
  543. package/dist/native/charts/src/engine/overlay.cjs +1 -1
  544. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  545. package/dist/native/charts/src/engine/overlay.js +46 -23
  546. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  547. package/dist/native/charts/src/engine/presets.cjs +2 -2
  548. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  549. package/dist/native/charts/src/engine/presets.js +448 -33
  550. package/dist/native/charts/src/engine/presets.js.map +1 -1
  551. package/dist/native/charts/src/engine/scale.cjs +1 -1
  552. package/dist/native/charts/src/engine/scale.cjs.map +1 -1
  553. package/dist/native/charts/src/engine/scale.js +1 -1
  554. package/dist/native/charts/src/engine/scale.js.map +1 -1
  555. package/dist/native/charts/src/engine/scene.cjs +1 -1
  556. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  557. package/dist/native/charts/src/engine/scene.js +296 -167
  558. package/dist/native/charts/src/engine/scene.js.map +1 -1
  559. package/dist/native/charts/src/engine/shapes/bullet.cjs +2 -0
  560. package/dist/native/charts/src/engine/shapes/bullet.cjs.map +1 -0
  561. package/dist/native/charts/src/engine/shapes/bullet.js +255 -0
  562. package/dist/native/charts/src/engine/shapes/bullet.js.map +1 -0
  563. package/dist/native/charts/src/engine/shapes/calendar.cjs +2 -0
  564. package/dist/native/charts/src/engine/shapes/calendar.cjs.map +1 -0
  565. package/dist/native/charts/src/engine/shapes/calendar.js +364 -0
  566. package/dist/native/charts/src/engine/shapes/calendar.js.map +1 -0
  567. package/dist/native/charts/src/engine/shapes/canvas.cjs +2 -0
  568. package/dist/native/charts/src/engine/shapes/canvas.cjs.map +1 -0
  569. package/dist/native/charts/src/engine/shapes/canvas.js +168 -0
  570. package/dist/native/charts/src/engine/shapes/canvas.js.map +1 -0
  571. package/dist/native/charts/src/engine/shapes/draw.cjs +2 -0
  572. package/dist/native/charts/src/engine/shapes/draw.cjs.map +1 -0
  573. package/dist/native/charts/src/engine/shapes/draw.js +165 -0
  574. package/dist/native/charts/src/engine/shapes/draw.js.map +1 -0
  575. package/dist/native/charts/src/engine/shapes/funnel.cjs +2 -0
  576. package/dist/native/charts/src/engine/shapes/funnel.cjs.map +1 -0
  577. package/dist/native/charts/src/engine/shapes/funnel.js +149 -0
  578. package/dist/native/charts/src/engine/shapes/funnel.js.map +1 -0
  579. package/dist/native/charts/src/engine/shapes/gauge.cjs +2 -0
  580. package/dist/native/charts/src/engine/shapes/gauge.cjs.map +1 -0
  581. package/dist/native/charts/src/engine/shapes/gauge.js +210 -0
  582. package/dist/native/charts/src/engine/shapes/gauge.js.map +1 -0
  583. package/dist/native/charts/src/engine/shapes/hit.cjs +2 -0
  584. package/dist/native/charts/src/engine/shapes/hit.cjs.map +1 -0
  585. package/dist/native/charts/src/engine/shapes/hit.js +106 -0
  586. package/dist/native/charts/src/engine/shapes/hit.js.map +1 -0
  587. package/dist/native/charts/src/engine/shapes/labels.cjs +2 -0
  588. package/dist/native/charts/src/engine/shapes/labels.cjs.map +1 -0
  589. package/dist/native/charts/src/engine/shapes/labels.js +146 -0
  590. package/dist/native/charts/src/engine/shapes/labels.js.map +1 -0
  591. package/dist/native/charts/src/engine/shapes/layout.cjs +3 -0
  592. package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -0
  593. package/dist/native/charts/src/engine/shapes/layout.js +331 -0
  594. package/dist/native/charts/src/engine/shapes/layout.js.map +1 -0
  595. package/dist/native/charts/src/engine/shapes/pie.cjs +2 -0
  596. package/dist/native/charts/src/engine/shapes/pie.cjs.map +1 -0
  597. package/dist/native/charts/src/engine/shapes/pie.js +302 -0
  598. package/dist/native/charts/src/engine/shapes/pie.js.map +1 -0
  599. package/dist/native/charts/src/engine/shapes/radar.cjs +2 -0
  600. package/dist/native/charts/src/engine/shapes/radar.cjs.map +1 -0
  601. package/dist/native/charts/src/engine/shapes/radar.js +198 -0
  602. package/dist/native/charts/src/engine/shapes/radar.js.map +1 -0
  603. package/dist/native/charts/src/engine/shapes/radialBar.cjs +2 -0
  604. package/dist/native/charts/src/engine/shapes/radialBar.cjs.map +1 -0
  605. package/dist/native/charts/src/engine/shapes/radialBar.js +155 -0
  606. package/dist/native/charts/src/engine/shapes/radialBar.js.map +1 -0
  607. package/dist/native/charts/src/engine/shapes/runtime.cjs +2 -0
  608. package/dist/native/charts/src/engine/shapes/runtime.cjs.map +1 -0
  609. package/dist/native/charts/src/engine/shapes/runtime.js +107 -0
  610. package/dist/native/charts/src/engine/shapes/runtime.js.map +1 -0
  611. package/dist/native/charts/src/engine/shapes/sankey.cjs +2 -0
  612. package/dist/native/charts/src/engine/shapes/sankey.cjs.map +1 -0
  613. package/dist/native/charts/src/engine/shapes/sankey.js +372 -0
  614. package/dist/native/charts/src/engine/shapes/sankey.js.map +1 -0
  615. package/dist/native/charts/src/engine/shapes/scene.cjs +2 -0
  616. package/dist/native/charts/src/engine/shapes/scene.cjs.map +1 -0
  617. package/dist/native/charts/src/engine/shapes/scene.js +125 -0
  618. package/dist/native/charts/src/engine/shapes/scene.js.map +1 -0
  619. package/dist/native/charts/src/engine/shapes/sunburst.cjs +2 -0
  620. package/dist/native/charts/src/engine/shapes/sunburst.cjs.map +1 -0
  621. package/dist/native/charts/src/engine/shapes/sunburst.js +261 -0
  622. package/dist/native/charts/src/engine/shapes/sunburst.js.map +1 -0
  623. package/dist/native/charts/src/engine/shapes/treemap.cjs +2 -0
  624. package/dist/native/charts/src/engine/shapes/treemap.cjs.map +1 -0
  625. package/dist/native/charts/src/engine/shapes/treemap.js +213 -0
  626. package/dist/native/charts/src/engine/shapes/treemap.js.map +1 -0
  627. package/dist/native/charts/src/engine/time.cjs +1 -1
  628. package/dist/native/charts/src/engine/time.cjs.map +1 -1
  629. package/dist/native/charts/src/engine/time.js +156 -91
  630. package/dist/native/charts/src/engine/time.js.map +1 -1
  631. package/dist/native/components/Chart/ChartBase.cjs +1 -1
  632. package/dist/native/components/Chart/ChartBase.cjs.map +1 -1
  633. package/dist/native/components/Chart/ChartBase.d.cts +1 -1
  634. package/dist/native/components/Chart/ChartBase.d.ts +1 -1
  635. package/dist/native/components/Chart/ChartBase.js +110 -107
  636. package/dist/native/components/Chart/ChartBase.js.map +1 -1
  637. package/dist/native/components/Chart/charts.cjs +1 -1
  638. package/dist/native/components/Chart/charts.cjs.map +1 -1
  639. package/dist/native/components/Chart/charts.d.cts +6 -1
  640. package/dist/native/components/Chart/charts.d.ts +6 -1
  641. package/dist/native/components/Chart/charts.js +53 -29
  642. package/dist/native/components/Chart/charts.js.map +1 -1
  643. package/dist/native/components/Chart/index.cjs +1 -1
  644. package/dist/native/components/Chart/index.d.cts +1 -1
  645. package/dist/native/components/Chart/index.d.ts +1 -1
  646. package/dist/native/components/Chart/index.js +2 -2
  647. package/dist/native/components/Chart/scene.cjs +1 -1
  648. package/dist/native/components/Chart/scene.cjs.map +1 -1
  649. package/dist/native/components/Chart/scene.js +234 -217
  650. package/dist/native/components/Chart/scene.js.map +1 -1
  651. package/dist/native/components/Chart/types.d.cts +26 -3
  652. package/dist/native/components/Chart/types.d.ts +26 -3
  653. package/dist/native/components/Charts/charts.cjs +2 -0
  654. package/dist/native/components/Charts/charts.cjs.map +1 -0
  655. package/dist/native/components/Charts/charts.d.cts +41 -0
  656. package/dist/native/components/Charts/charts.d.ts +41 -0
  657. package/dist/native/components/Charts/charts.js +338 -0
  658. package/dist/native/components/Charts/charts.js.map +1 -0
  659. package/dist/native/components/Charts/index.cjs +1 -0
  660. package/dist/native/components/Charts/index.d.cts +2 -0
  661. package/dist/native/components/Charts/index.d.ts +2 -0
  662. package/dist/native/components/Charts/index.js +2 -0
  663. package/dist/native/components/Charts/types.d.cts +144 -0
  664. package/dist/native/components/Charts/types.d.ts +144 -0
  665. package/dist/native/components/ShapeChart/ShapeChartBase.cjs +2 -0
  666. package/dist/native/components/ShapeChart/ShapeChartBase.cjs.map +1 -0
  667. package/dist/native/components/ShapeChart/ShapeChartBase.d.cts +24 -0
  668. package/dist/native/components/ShapeChart/ShapeChartBase.d.ts +24 -0
  669. package/dist/native/components/ShapeChart/ShapeChartBase.js +271 -0
  670. package/dist/native/components/ShapeChart/ShapeChartBase.js.map +1 -0
  671. package/dist/native/components/ShapeChart/charts.cjs +2 -0
  672. package/dist/native/components/ShapeChart/charts.cjs.map +1 -0
  673. package/dist/native/components/ShapeChart/charts.d.cts +38 -0
  674. package/dist/native/components/ShapeChart/charts.d.ts +38 -0
  675. package/dist/native/components/ShapeChart/charts.js +387 -0
  676. package/dist/native/components/ShapeChart/charts.js.map +1 -0
  677. package/dist/native/components/ShapeChart/draw.cjs +2 -0
  678. package/dist/native/components/ShapeChart/draw.cjs.map +1 -0
  679. package/dist/native/components/ShapeChart/draw.d.cts +4 -0
  680. package/dist/native/components/ShapeChart/draw.d.ts +4 -0
  681. package/dist/native/components/ShapeChart/draw.js +104 -0
  682. package/dist/native/components/ShapeChart/draw.js.map +1 -0
  683. package/dist/native/components/ShapeChart/geometry.cjs +2 -0
  684. package/dist/native/components/ShapeChart/geometry.cjs.map +1 -0
  685. package/dist/native/components/ShapeChart/geometry.d.cts +71 -0
  686. package/dist/native/components/ShapeChart/geometry.d.ts +71 -0
  687. package/dist/native/components/ShapeChart/geometry.js +602 -0
  688. package/dist/native/components/ShapeChart/geometry.js.map +1 -0
  689. package/dist/native/components/ShapeChart/index.cjs +1 -0
  690. package/dist/native/components/ShapeChart/index.d.cts +2 -0
  691. package/dist/native/components/ShapeChart/index.d.ts +2 -0
  692. package/dist/native/components/ShapeChart/index.js +2 -0
  693. package/dist/native/components/ShapeChart/recorder.cjs +2 -0
  694. package/dist/native/components/ShapeChart/recorder.cjs.map +1 -0
  695. package/dist/native/components/ShapeChart/recorder.d.cts +106 -0
  696. package/dist/native/components/ShapeChart/recorder.d.ts +106 -0
  697. package/dist/native/components/ShapeChart/recorder.js +574 -0
  698. package/dist/native/components/ShapeChart/recorder.js.map +1 -0
  699. package/dist/native/components/ShapeChart/types.d.cts +509 -0
  700. package/dist/native/components/ShapeChart/types.d.ts +509 -0
  701. package/dist/native/index.cjs +1 -1
  702. package/dist/native/index.d.cts +2 -0
  703. package/dist/native/index.d.ts +2 -0
  704. package/dist/native/index.js +14 -10
  705. package/dist/native/manifest.d.cts +6 -4
  706. package/dist/native/manifest.d.ts +6 -4
  707. package/dist/native/source/components/Chart/ChartBase.tsx +8 -1
  708. package/dist/native/source/components/Chart/charts.tsx +42 -6
  709. package/dist/native/source/components/Chart/index.ts +1 -0
  710. package/dist/native/source/components/Chart/scene.tsx +154 -84
  711. package/dist/native/source/components/Chart/types.ts +31 -1
  712. package/dist/native/source/components/Charts/charts.tsx +493 -0
  713. package/dist/native/source/components/Charts/index.ts +14 -0
  714. package/dist/native/source/components/Charts/types.ts +207 -0
  715. package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +484 -0
  716. package/dist/native/source/components/ShapeChart/charts.tsx +605 -0
  717. package/dist/native/source/components/ShapeChart/draw.tsx +170 -0
  718. package/dist/native/source/components/ShapeChart/geometry.ts +1185 -0
  719. package/dist/native/source/components/ShapeChart/index.ts +15 -0
  720. package/dist/native/source/components/ShapeChart/recorder.ts +830 -0
  721. package/dist/native/source/components/ShapeChart/types.ts +564 -0
  722. package/dist/native/source/index.ts +2 -0
  723. package/dist/native/source/manifest.ts +30 -4
  724. package/dist/taro/charts.d.ts +209 -4
  725. package/dist/taro/index.d.ts +1 -0
  726. package/dist/taro/index.js +7517 -1856
  727. package/dist/taro/manifest.d.ts +1 -0
  728. package/dist/taro/shape-charts.d.ts +537 -0
  729. package/dist/uni/AreaChart.vue +68 -0
  730. package/dist/uni/AreaChart.vue.d.ts +120 -0
  731. package/dist/uni/Badge.vue.d.ts +1 -1
  732. package/dist/uni/BoxPlotChart.vue +66 -0
  733. package/dist/uni/BoxPlotChart.vue.d.ts +102 -0
  734. package/dist/uni/BubbleChart.vue +68 -0
  735. package/dist/uni/BubbleChart.vue.d.ts +106 -0
  736. package/dist/uni/BulletChart.vue +86 -0
  737. package/dist/uni/BulletChart.vue.d.ts +110 -0
  738. package/dist/uni/CalendarHeatmap.vue +92 -0
  739. package/dist/uni/CalendarHeatmap.vue.d.ts +129 -0
  740. package/dist/uni/CandlestickChart.vue +66 -0
  741. package/dist/uni/CandlestickChart.vue.d.ts +100 -0
  742. package/dist/uni/DonutChart.vue +72 -0
  743. package/dist/uni/DonutChart.vue.d.ts +114 -0
  744. package/dist/uni/FunnelChart.vue +67 -0
  745. package/dist/uni/FunnelChart.vue.d.ts +104 -0
  746. package/dist/uni/GanttChart.vue +67 -0
  747. package/dist/uni/GanttChart.vue.d.ts +123 -0
  748. package/dist/uni/GaugeChart.vue +77 -0
  749. package/dist/uni/GaugeChart.vue.d.ts +123 -0
  750. package/dist/uni/HeatmapChart.vue +66 -0
  751. package/dist/uni/HeatmapChart.vue.d.ts +114 -0
  752. package/dist/uni/HistogramChart.vue +66 -0
  753. package/dist/uni/HistogramChart.vue.d.ts +121 -0
  754. package/dist/uni/HorizontalBarChart.vue +68 -0
  755. package/dist/uni/HorizontalBarChart.vue.d.ts +127 -0
  756. package/dist/uni/Input.vue.d.ts +1 -1
  757. package/dist/uni/MixedChart.vue +68 -0
  758. package/dist/uni/MixedChart.vue.d.ts +106 -0
  759. package/dist/uni/NumberInput.vue.d.ts +1 -1
  760. package/dist/uni/PieChart.vue +72 -0
  761. package/dist/uni/PieChart.vue.d.ts +114 -0
  762. package/dist/uni/RadarChart.vue +67 -0
  763. package/dist/uni/RadarChart.vue.d.ts +110 -0
  764. package/dist/uni/RadialBarChart.vue +90 -0
  765. package/dist/uni/RadialBarChart.vue.d.ts +132 -0
  766. package/dist/uni/RangeAreaChart.vue +68 -0
  767. package/dist/uni/RangeAreaChart.vue.d.ts +102 -0
  768. package/dist/uni/ResponsiveGrid.vue.d.ts +1 -1
  769. package/dist/uni/SankeyChart.vue +88 -0
  770. package/dist/uni/SankeyChart.vue.d.ts +121 -0
  771. package/dist/uni/ShapeChart.vue +73 -0
  772. package/dist/uni/ShapeChart.vue.d.ts +54 -0
  773. package/dist/uni/Sparkline.vue +58 -0
  774. package/dist/uni/Sparkline.vue.d.ts +77 -0
  775. package/dist/uni/SunburstChart.vue +90 -0
  776. package/dist/uni/SunburstChart.vue.d.ts +114 -0
  777. package/dist/uni/Textarea.vue.d.ts +1 -1
  778. package/dist/uni/TimePicker.vue.d.ts +1 -1
  779. package/dist/uni/TreemapChart.vue +65 -0
  780. package/dist/uni/TreemapChart.vue.d.ts +100 -0
  781. package/dist/uni/WaterfallChart.vue +66 -0
  782. package/dist/uni/WaterfallChart.vue.d.ts +125 -0
  783. package/dist/uni/chart-types.d.ts +216 -2
  784. package/dist/uni/chart-types.js +174 -0
  785. package/dist/uni/charts-canvas.js +8 -3
  786. package/dist/uni/index.d.ts +26 -1
  787. package/dist/uni/index.js +26 -1
  788. package/dist/uni/manifest.d.ts +272 -0
  789. package/dist/uni/manifest.js +387 -0
  790. package/dist/uni/named-chart-options.d.ts +88 -0
  791. package/dist/uni/named-chart-options.js +156 -0
  792. package/dist/uni/shape-chart-canvas.d.ts +51 -0
  793. package/dist/uni/shape-chart-canvas.js +342 -0
  794. package/dist/uni/shape-chart-types.d.ts +381 -0
  795. package/dist/uni/shape-chart-types.js +261 -0
  796. package/dist/vue/components/Chart/AreaChart.vue.d.ts +124 -0
  797. package/dist/vue/components/Chart/AreaChart.vue.js +7 -0
  798. package/dist/vue/components/Chart/AreaChart.vue.js.map +1 -0
  799. package/dist/vue/components/Chart/AreaChart.vue_vue_type_script_setup_true_lang.js +49 -0
  800. package/dist/vue/components/Chart/AreaChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  801. package/dist/vue/components/Chart/Bar3DChart.vue.d.ts +132 -0
  802. package/dist/vue/components/Chart/Bar3DChart.vue.js +7 -0
  803. package/dist/vue/components/Chart/Bar3DChart.vue.js.map +1 -0
  804. package/dist/vue/components/Chart/Bar3DChart.vue_vue_type_script_setup_true_lang.js +55 -0
  805. package/dist/vue/components/Chart/Bar3DChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  806. package/dist/vue/components/Chart/BarChart.vue.d.ts +123 -0
  807. package/dist/vue/components/Chart/BarChart.vue.js +7 -0
  808. package/dist/vue/components/Chart/BarChart.vue.js.map +1 -0
  809. package/dist/vue/components/Chart/BarChart.vue_vue_type_script_setup_true_lang.js +53 -0
  810. package/dist/vue/components/Chart/BarChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  811. package/dist/vue/components/Chart/BoxPlotChart.vue.d.ts +112 -0
  812. package/dist/vue/components/Chart/BoxPlotChart.vue.js +7 -0
  813. package/dist/vue/components/Chart/BoxPlotChart.vue.js.map +1 -0
  814. package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js +57 -0
  815. package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  816. package/dist/vue/components/Chart/BubbleChart.vue.d.ts +106 -0
  817. package/dist/vue/components/Chart/BubbleChart.vue.js +7 -0
  818. package/dist/vue/components/Chart/BubbleChart.vue.js.map +1 -0
  819. package/dist/vue/components/Chart/BubbleChart.vue_vue_type_script_setup_true_lang.js +52 -0
  820. package/dist/vue/components/Chart/BubbleChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  821. package/dist/vue/components/Chart/BulletChart.vue.d.ts +117 -0
  822. package/dist/vue/components/Chart/BulletChart.vue.js +7 -0
  823. package/dist/vue/components/Chart/BulletChart.vue.js.map +1 -0
  824. package/dist/vue/components/Chart/BulletChart.vue_vue_type_script_setup_true_lang.js +64 -0
  825. package/dist/vue/components/Chart/BulletChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  826. package/dist/vue/components/Chart/CalendarHeatmap.vue.d.ts +144 -0
  827. package/dist/vue/components/Chart/CalendarHeatmap.vue.js +7 -0
  828. package/dist/vue/components/Chart/CalendarHeatmap.vue.js.map +1 -0
  829. package/dist/vue/components/Chart/CalendarHeatmap.vue_vue_type_script_setup_true_lang.js +77 -0
  830. package/dist/vue/components/Chart/CalendarHeatmap.vue_vue_type_script_setup_true_lang.js.map +1 -0
  831. package/dist/vue/components/Chart/CandlestickChart.vue.d.ts +94 -0
  832. package/dist/vue/components/Chart/CandlestickChart.vue.js +7 -0
  833. package/dist/vue/components/Chart/CandlestickChart.vue.js.map +1 -0
  834. package/dist/vue/components/Chart/CandlestickChart.vue_vue_type_script_setup_true_lang.js +44 -0
  835. package/dist/vue/components/Chart/CandlestickChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  836. package/dist/vue/components/Chart/Chart.vue.d.ts +103 -0
  837. package/dist/vue/components/Chart/Chart.vue.js +7 -0
  838. package/dist/vue/components/Chart/Chart.vue.js.map +1 -0
  839. package/dist/vue/components/Chart/Chart.vue_vue_type_script_setup_true_lang.js +47 -0
  840. package/dist/vue/components/Chart/Chart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  841. package/dist/vue/components/Chart/DepthChart.vue.d.ts +139 -0
  842. package/dist/vue/components/Chart/DepthChart.vue.js +7 -0
  843. package/dist/vue/components/Chart/DepthChart.vue.js.map +1 -0
  844. package/dist/vue/components/Chart/DepthChart.vue_vue_type_script_setup_true_lang.js +42 -0
  845. package/dist/vue/components/Chart/DepthChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  846. package/dist/vue/components/Chart/DonutChart.vue.d.ts +104 -0
  847. package/dist/vue/components/Chart/DonutChart.vue.js +7 -0
  848. package/dist/vue/components/Chart/DonutChart.vue.js.map +1 -0
  849. package/dist/vue/components/Chart/DonutChart.vue_vue_type_script_setup_true_lang.js +53 -0
  850. package/dist/vue/components/Chart/DonutChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  851. package/dist/vue/components/Chart/FunnelChart.vue.d.ts +105 -0
  852. package/dist/vue/components/Chart/FunnelChart.vue.js +7 -0
  853. package/dist/vue/components/Chart/FunnelChart.vue.js.map +1 -0
  854. package/dist/vue/components/Chart/FunnelChart.vue_vue_type_script_setup_true_lang.js +58 -0
  855. package/dist/vue/components/Chart/FunnelChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  856. package/dist/vue/components/Chart/GanttChart.vue.d.ts +132 -0
  857. package/dist/vue/components/Chart/GanttChart.vue.js +7 -0
  858. package/dist/vue/components/Chart/GanttChart.vue.js.map +1 -0
  859. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js +98 -0
  860. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  861. package/dist/vue/components/Chart/GaugeChart.vue.d.ts +132 -0
  862. package/dist/vue/components/Chart/GaugeChart.vue.js +7 -0
  863. package/dist/vue/components/Chart/GaugeChart.vue.js.map +1 -0
  864. package/dist/vue/components/Chart/GaugeChart.vue_vue_type_script_setup_true_lang.js +71 -0
  865. package/dist/vue/components/Chart/GaugeChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  866. package/dist/vue/components/Chart/HeatmapChart.vue.d.ts +125 -0
  867. package/dist/vue/components/Chart/HeatmapChart.vue.js +7 -0
  868. package/dist/vue/components/Chart/HeatmapChart.vue.js.map +1 -0
  869. package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js +65 -0
  870. package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  871. package/dist/vue/components/Chart/HistogramChart.vue.d.ts +132 -0
  872. package/dist/vue/components/Chart/HistogramChart.vue.js +7 -0
  873. package/dist/vue/components/Chart/HistogramChart.vue.js.map +1 -0
  874. package/dist/vue/components/Chart/HistogramChart.vue_vue_type_script_setup_true_lang.js +66 -0
  875. package/dist/vue/components/Chart/HistogramChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  876. package/dist/vue/components/Chart/HorizontalBarChart.vue.d.ts +121 -0
  877. package/dist/vue/components/Chart/HorizontalBarChart.vue.js +7 -0
  878. package/dist/vue/components/Chart/HorizontalBarChart.vue.js.map +1 -0
  879. package/dist/vue/components/Chart/HorizontalBarChart.vue_vue_type_script_setup_true_lang.js +55 -0
  880. package/dist/vue/components/Chart/HorizontalBarChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  881. package/dist/vue/components/Chart/Line3DChart.vue.d.ts +121 -0
  882. package/dist/vue/components/Chart/Line3DChart.vue.js +7 -0
  883. package/dist/vue/components/Chart/Line3DChart.vue.js.map +1 -0
  884. package/dist/vue/components/Chart/Line3DChart.vue_vue_type_script_setup_true_lang.js +47 -0
  885. package/dist/vue/components/Chart/Line3DChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  886. package/dist/vue/components/Chart/LineChart.vue.d.ts +125 -0
  887. package/dist/vue/components/Chart/LineChart.vue.js +7 -0
  888. package/dist/vue/components/Chart/LineChart.vue.js.map +1 -0
  889. package/dist/vue/components/Chart/LineChart.vue_vue_type_script_setup_true_lang.js +50 -0
  890. package/dist/vue/components/Chart/LineChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  891. package/dist/vue/components/Chart/MixedChart.vue.d.ts +103 -0
  892. package/dist/vue/components/Chart/MixedChart.vue.js +7 -0
  893. package/dist/vue/components/Chart/MixedChart.vue.js.map +1 -0
  894. package/dist/vue/components/Chart/MixedChart.vue_vue_type_script_setup_true_lang.js +47 -0
  895. package/dist/vue/components/Chart/MixedChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  896. package/dist/vue/components/Chart/OrderBook.vue.d.ts +125 -0
  897. package/dist/vue/components/Chart/OrderBook.vue.js +7 -0
  898. package/dist/vue/components/Chart/OrderBook.vue.js.map +1 -0
  899. package/dist/vue/components/Chart/OrderBook.vue_vue_type_script_setup_true_lang.js +38 -0
  900. package/dist/vue/components/Chart/OrderBook.vue_vue_type_script_setup_true_lang.js.map +1 -0
  901. package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +128 -0
  902. package/dist/vue/components/Chart/OrderBookHeatmap.vue.js +7 -0
  903. package/dist/vue/components/Chart/OrderBookHeatmap.vue.js.map +1 -0
  904. package/dist/vue/components/Chart/OrderBookHeatmap.vue_vue_type_script_setup_true_lang.js +46 -0
  905. package/dist/vue/components/Chart/OrderBookHeatmap.vue_vue_type_script_setup_true_lang.js.map +1 -0
  906. package/dist/vue/components/Chart/PieChart.vue.d.ts +104 -0
  907. package/dist/vue/components/Chart/PieChart.vue.js +7 -0
  908. package/dist/vue/components/Chart/PieChart.vue.js.map +1 -0
  909. package/dist/vue/components/Chart/PieChart.vue_vue_type_script_setup_true_lang.js +53 -0
  910. package/dist/vue/components/Chart/PieChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  911. package/dist/vue/components/Chart/QuadrantChart.vue.d.ts +186 -0
  912. package/dist/vue/components/Chart/QuadrantChart.vue.js +7 -0
  913. package/dist/vue/components/Chart/QuadrantChart.vue.js.map +1 -0
  914. package/dist/vue/components/Chart/QuadrantChart.vue_vue_type_script_setup_true_lang.js +107 -0
  915. package/dist/vue/components/Chart/QuadrantChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  916. package/dist/vue/components/Chart/RadarChart.vue.d.ts +111 -0
  917. package/dist/vue/components/Chart/RadarChart.vue.js +7 -0
  918. package/dist/vue/components/Chart/RadarChart.vue.js.map +1 -0
  919. package/dist/vue/components/Chart/RadarChart.vue_vue_type_script_setup_true_lang.js +61 -0
  920. package/dist/vue/components/Chart/RadarChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  921. package/dist/vue/components/Chart/RadialBarChart.vue.d.ts +147 -0
  922. package/dist/vue/components/Chart/RadialBarChart.vue.js +7 -0
  923. package/dist/vue/components/Chart/RadialBarChart.vue.js.map +1 -0
  924. package/dist/vue/components/Chart/RadialBarChart.vue_vue_type_script_setup_true_lang.js +78 -0
  925. package/dist/vue/components/Chart/RadialBarChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  926. package/dist/vue/components/Chart/RangeAreaChart.vue.d.ts +106 -0
  927. package/dist/vue/components/Chart/RangeAreaChart.vue.js +7 -0
  928. package/dist/vue/components/Chart/RangeAreaChart.vue.js.map +1 -0
  929. package/dist/vue/components/Chart/RangeAreaChart.vue_vue_type_script_setup_true_lang.js +51 -0
  930. package/dist/vue/components/Chart/RangeAreaChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  931. package/dist/vue/components/Chart/SankeyChart.vue.d.ts +132 -0
  932. package/dist/vue/components/Chart/SankeyChart.vue.js +7 -0
  933. package/dist/vue/components/Chart/SankeyChart.vue.js.map +1 -0
  934. package/dist/vue/components/Chart/SankeyChart.vue_vue_type_script_setup_true_lang.js +71 -0
  935. package/dist/vue/components/Chart/SankeyChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  936. package/dist/vue/components/Chart/Scatter3DChart.vue.d.ts +121 -0
  937. package/dist/vue/components/Chart/Scatter3DChart.vue.js +7 -0
  938. package/dist/vue/components/Chart/Scatter3DChart.vue.js.map +1 -0
  939. package/dist/vue/components/Chart/Scatter3DChart.vue_vue_type_script_setup_true_lang.js +47 -0
  940. package/dist/vue/components/Chart/Scatter3DChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  941. package/dist/vue/components/Chart/ScatterChart.vue.d.ts +94 -0
  942. package/dist/vue/components/Chart/ScatterChart.vue.js +7 -0
  943. package/dist/vue/components/Chart/ScatterChart.vue.js.map +1 -0
  944. package/dist/vue/components/Chart/ScatterChart.vue_vue_type_script_setup_true_lang.js +44 -0
  945. package/dist/vue/components/Chart/ScatterChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  946. package/dist/vue/components/Chart/ShapeChart.vue.d.ts +39 -0
  947. package/dist/vue/components/Chart/ShapeChart.vue.js +7 -0
  948. package/dist/vue/components/Chart/ShapeChart.vue.js.map +1 -0
  949. package/dist/vue/components/Chart/ShapeChart.vue_vue_type_script_setup_true_lang.js +43 -0
  950. package/dist/vue/components/Chart/ShapeChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  951. package/dist/vue/components/Chart/Sparkline.vue.d.ts +90 -0
  952. package/dist/vue/components/Chart/Sparkline.vue.js +7 -0
  953. package/dist/vue/components/Chart/Sparkline.vue.js.map +1 -0
  954. package/dist/vue/components/Chart/Sparkline.vue_vue_type_script_setup_true_lang.js +66 -0
  955. package/dist/vue/components/Chart/Sparkline.vue_vue_type_script_setup_true_lang.js.map +1 -0
  956. package/dist/vue/components/Chart/SunburstChart.vue.d.ts +123 -0
  957. package/dist/vue/components/Chart/SunburstChart.vue.js +7 -0
  958. package/dist/vue/components/Chart/SunburstChart.vue.js.map +1 -0
  959. package/dist/vue/components/Chart/SunburstChart.vue_vue_type_script_setup_true_lang.js +68 -0
  960. package/dist/vue/components/Chart/SunburstChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  961. package/dist/vue/components/Chart/Surface3DChart.vue.d.ts +143 -0
  962. package/dist/vue/components/Chart/Surface3DChart.vue.js +7 -0
  963. package/dist/vue/components/Chart/Surface3DChart.vue.js.map +1 -0
  964. package/dist/vue/components/Chart/Surface3DChart.vue_vue_type_script_setup_true_lang.js +60 -0
  965. package/dist/vue/components/Chart/Surface3DChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  966. package/dist/vue/components/Chart/TimeAndSales.vue.d.ts +114 -0
  967. package/dist/vue/components/Chart/TimeAndSales.vue.js +7 -0
  968. package/dist/vue/components/Chart/TimeAndSales.vue.js.map +1 -0
  969. package/dist/vue/components/Chart/TimeAndSales.vue_vue_type_script_setup_true_lang.js +46 -0
  970. package/dist/vue/components/Chart/TimeAndSales.vue_vue_type_script_setup_true_lang.js.map +1 -0
  971. package/dist/vue/components/Chart/TradingChart.vue.d.ts +160 -0
  972. package/dist/vue/components/Chart/TradingChart.vue.js +7 -0
  973. package/dist/vue/components/Chart/TradingChart.vue.js.map +1 -0
  974. package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js +70 -0
  975. package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  976. package/dist/vue/components/Chart/TreemapChart.vue.d.ts +97 -0
  977. package/dist/vue/components/Chart/TreemapChart.vue.js +7 -0
  978. package/dist/vue/components/Chart/TreemapChart.vue.js.map +1 -0
  979. package/dist/vue/components/Chart/TreemapChart.vue_vue_type_script_setup_true_lang.js +54 -0
  980. package/dist/vue/components/Chart/TreemapChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  981. package/dist/vue/components/Chart/WaterfallChart.vue.d.ts +132 -0
  982. package/dist/vue/components/Chart/WaterfallChart.vue.js +7 -0
  983. package/dist/vue/components/Chart/WaterfallChart.vue.js.map +1 -0
  984. package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js +68 -0
  985. package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  986. package/dist/vue/components/Chart/cartesian.d.ts +47 -0
  987. package/dist/vue/components/Chart/cartesian.js +56 -0
  988. package/dist/vue/components/Chart/cartesian.js.map +1 -0
  989. package/dist/vue/components/Chart/engine.d.ts +35 -0
  990. package/dist/vue/components/Chart/engine.js +35 -0
  991. package/dist/vue/components/Chart/engine.js.map +1 -0
  992. package/dist/vue/components/Chart/index.d.ts +41 -0
  993. package/dist/vue/components/Chart/index.js +40 -0
  994. package/dist/vue/components/Chart/orderbook.d.ts +359 -0
  995. package/dist/vue/components/Chart/orderbook.js +126 -0
  996. package/dist/vue/components/Chart/orderbook.js.map +1 -0
  997. package/dist/vue/components/Chart/props.d.ts +188 -0
  998. package/dist/vue/components/Chart/props.js +92 -0
  999. package/dist/vue/components/Chart/props.js.map +1 -0
  1000. package/dist/vue/components/Chart/shape.d.ts +41 -0
  1001. package/dist/vue/components/Chart/shape.js +42 -0
  1002. package/dist/vue/components/Chart/shape.js.map +1 -0
  1003. package/dist/vue/components/Chart/three-d.d.ts +106 -0
  1004. package/dist/vue/components/Chart/three-d.js +88 -0
  1005. package/dist/vue/components/Chart/three-d.js.map +1 -0
  1006. package/dist/vue/components/Chart/trading.d.ts +105 -0
  1007. package/dist/vue/components/Chart/trading.js +55 -0
  1008. package/dist/vue/components/Chart/trading.js.map +1 -0
  1009. package/dist/vue/components/Chart/types.d.ts +137 -0
  1010. package/dist/vue/global.d.ts +38 -0
  1011. package/dist/vue/groups/charts.d.ts +1 -0
  1012. package/dist/vue/groups/charts.js +87 -0
  1013. package/dist/vue/groups/charts.js.map +1 -0
  1014. package/dist/vue/index.d.ts +1 -0
  1015. package/dist/vue/index.js +63 -23
  1016. package/dist/vue/plugin.js +12 -10
  1017. package/dist/vue/plugin.js.map +1 -1
  1018. package/dist/weapp/area-chart/index.js +1 -0
  1019. package/dist/weapp/area-chart/index.json +1 -0
  1020. package/dist/weapp/area-chart/index.wxml +1 -0
  1021. package/dist/weapp/area-chart/index.wxss +1 -0
  1022. package/dist/weapp/box-plot-chart/index.js +1 -0
  1023. package/dist/weapp/box-plot-chart/index.json +1 -0
  1024. package/dist/weapp/box-plot-chart/index.wxml +1 -0
  1025. package/dist/weapp/box-plot-chart/index.wxss +1 -0
  1026. package/dist/weapp/bubble-chart/index.js +1 -0
  1027. package/dist/weapp/bubble-chart/index.json +1 -0
  1028. package/dist/weapp/bubble-chart/index.wxml +1 -0
  1029. package/dist/weapp/bubble-chart/index.wxss +1 -0
  1030. package/dist/weapp/bullet-chart/index.js +1 -0
  1031. package/dist/weapp/bullet-chart/index.json +1 -0
  1032. package/dist/weapp/bullet-chart/index.wxml +1 -0
  1033. package/dist/weapp/bullet-chart/index.wxss +1 -0
  1034. package/dist/weapp/calendar-heatmap/index.js +1 -0
  1035. package/dist/weapp/calendar-heatmap/index.json +1 -0
  1036. package/dist/weapp/calendar-heatmap/index.wxml +1 -0
  1037. package/dist/weapp/calendar-heatmap/index.wxss +1 -0
  1038. package/dist/weapp/candlestick-chart/index.js +1 -0
  1039. package/dist/weapp/candlestick-chart/index.json +1 -0
  1040. package/dist/weapp/candlestick-chart/index.wxml +1 -0
  1041. package/dist/weapp/candlestick-chart/index.wxss +1 -0
  1042. package/dist/weapp/charts/canvas.js +11436 -0
  1043. package/dist/weapp/charts/core.d.ts +2 -0
  1044. package/dist/weapp/charts/core.js +41 -0
  1045. package/dist/weapp/controls.js +1433 -4478
  1046. package/dist/weapp/donut-chart/index.js +1 -0
  1047. package/dist/weapp/donut-chart/index.json +1 -0
  1048. package/dist/weapp/donut-chart/index.wxml +1 -0
  1049. package/dist/weapp/donut-chart/index.wxss +1 -0
  1050. package/dist/weapp/funnel-chart/index.js +1 -0
  1051. package/dist/weapp/funnel-chart/index.json +1 -0
  1052. package/dist/weapp/funnel-chart/index.wxml +1 -0
  1053. package/dist/weapp/funnel-chart/index.wxss +1 -0
  1054. package/dist/weapp/gantt-chart/index.js +1 -0
  1055. package/dist/weapp/gantt-chart/index.json +1 -0
  1056. package/dist/weapp/gantt-chart/index.wxml +1 -0
  1057. package/dist/weapp/gantt-chart/index.wxss +1 -0
  1058. package/dist/weapp/gauge-chart/index.js +1 -0
  1059. package/dist/weapp/gauge-chart/index.json +1 -0
  1060. package/dist/weapp/gauge-chart/index.wxml +1 -0
  1061. package/dist/weapp/gauge-chart/index.wxss +1 -0
  1062. package/dist/weapp/heatmap-chart/index.js +1 -0
  1063. package/dist/weapp/heatmap-chart/index.json +1 -0
  1064. package/dist/weapp/heatmap-chart/index.wxml +1 -0
  1065. package/dist/weapp/heatmap-chart/index.wxss +1 -0
  1066. package/dist/weapp/histogram-chart/index.js +1 -0
  1067. package/dist/weapp/histogram-chart/index.json +1 -0
  1068. package/dist/weapp/histogram-chart/index.wxml +1 -0
  1069. package/dist/weapp/histogram-chart/index.wxss +1 -0
  1070. package/dist/weapp/horizontal-bar-chart/index.js +1 -0
  1071. package/dist/weapp/horizontal-bar-chart/index.json +1 -0
  1072. package/dist/weapp/horizontal-bar-chart/index.wxml +1 -0
  1073. package/dist/weapp/horizontal-bar-chart/index.wxss +1 -0
  1074. package/dist/weapp/mixed-chart/index.js +1 -0
  1075. package/dist/weapp/mixed-chart/index.json +1 -0
  1076. package/dist/weapp/mixed-chart/index.wxml +1 -0
  1077. package/dist/weapp/mixed-chart/index.wxss +1 -0
  1078. package/dist/weapp/pie-chart/index.js +1 -0
  1079. package/dist/weapp/pie-chart/index.json +1 -0
  1080. package/dist/weapp/pie-chart/index.wxml +1 -0
  1081. package/dist/weapp/pie-chart/index.wxss +1 -0
  1082. package/dist/weapp/radar-chart/index.js +1 -0
  1083. package/dist/weapp/radar-chart/index.json +1 -0
  1084. package/dist/weapp/radar-chart/index.wxml +1 -0
  1085. package/dist/weapp/radar-chart/index.wxss +1 -0
  1086. package/dist/weapp/radial-bar-chart/index.js +1 -0
  1087. package/dist/weapp/radial-bar-chart/index.json +1 -0
  1088. package/dist/weapp/radial-bar-chart/index.wxml +1 -0
  1089. package/dist/weapp/radial-bar-chart/index.wxss +1 -0
  1090. package/dist/weapp/range-area-chart/index.js +1 -0
  1091. package/dist/weapp/range-area-chart/index.json +1 -0
  1092. package/dist/weapp/range-area-chart/index.wxml +1 -0
  1093. package/dist/weapp/range-area-chart/index.wxss +1 -0
  1094. package/dist/weapp/sankey-chart/index.js +1 -0
  1095. package/dist/weapp/sankey-chart/index.json +1 -0
  1096. package/dist/weapp/sankey-chart/index.wxml +1 -0
  1097. package/dist/weapp/sankey-chart/index.wxss +1 -0
  1098. package/dist/weapp/shape-chart/index.js +1 -0
  1099. package/dist/weapp/shape-chart/index.json +1 -0
  1100. package/dist/weapp/shape-chart/index.wxml +1 -0
  1101. package/dist/weapp/shape-chart/index.wxss +1 -0
  1102. package/dist/weapp/sparkline/index.js +1 -0
  1103. package/dist/weapp/sparkline/index.json +1 -0
  1104. package/dist/weapp/sparkline/index.wxml +1 -0
  1105. package/dist/weapp/sparkline/index.wxss +1 -0
  1106. package/dist/weapp/sunburst-chart/index.js +1 -0
  1107. package/dist/weapp/sunburst-chart/index.json +1 -0
  1108. package/dist/weapp/sunburst-chart/index.wxml +1 -0
  1109. package/dist/weapp/sunburst-chart/index.wxss +1 -0
  1110. package/dist/weapp/treemap-chart/index.js +1 -0
  1111. package/dist/weapp/treemap-chart/index.json +1 -0
  1112. package/dist/weapp/treemap-chart/index.wxml +1 -0
  1113. package/dist/weapp/treemap-chart/index.wxss +1 -0
  1114. package/dist/weapp/types.d.ts +466 -0
  1115. package/dist/weapp/waterfall-chart/index.js +1 -0
  1116. package/dist/weapp/waterfall-chart/index.json +1 -0
  1117. package/dist/weapp/waterfall-chart/index.wxml +1 -0
  1118. package/dist/weapp/waterfall-chart/index.wxss +1 -0
  1119. package/dist/web-components/components/chart/chart.d.ts +58 -0
  1120. package/dist/web-components/components/chart/chart.js +55 -0
  1121. package/dist/web-components/components/chart/chart.js.map +1 -0
  1122. package/dist/web-components/components/chart/charts.d.ts +252 -0
  1123. package/dist/web-components/components/chart/charts.js +201 -0
  1124. package/dist/web-components/components/chart/charts.js.map +1 -0
  1125. package/dist/web-components/components/chart/engine-element.d.ts +53 -0
  1126. package/dist/web-components/components/chart/engine-element.js +77 -0
  1127. package/dist/web-components/components/chart/engine-element.js.map +1 -0
  1128. package/dist/web-components/components/chart/extended.d.ts +224 -0
  1129. package/dist/web-components/components/chart/extended.js +183 -0
  1130. package/dist/web-components/components/chart/extended.js.map +1 -0
  1131. package/dist/web-components/components/chart/series.d.ts +7 -0
  1132. package/dist/web-components/components/chart/series.js +14 -0
  1133. package/dist/web-components/components/chart/series.js.map +1 -0
  1134. package/dist/web-components/components/chart/shape-chart.d.ts +199 -0
  1135. package/dist/web-components/components/chart/shape-chart.js +161 -0
  1136. package/dist/web-components/components/chart/shape-chart.js.map +1 -0
  1137. package/dist/web-components/components/chart/shapes-extended.d.ts +162 -0
  1138. package/dist/web-components/components/chart/shapes-extended.js +156 -0
  1139. package/dist/web-components/components/chart/shapes-extended.js.map +1 -0
  1140. package/dist/web-components/components/chart-3d/chart-3d.d.ts +111 -0
  1141. package/dist/web-components/components/chart-3d/chart-3d.js +97 -0
  1142. package/dist/web-components/components/chart-3d/chart-3d.js.map +1 -0
  1143. package/dist/web-components/components/order-book/order-book.d.ts +165 -0
  1144. package/dist/web-components/components/order-book/order-book.js +174 -0
  1145. package/dist/web-components/components/order-book/order-book.js.map +1 -0
  1146. package/dist/web-components/components/trading-chart/trading-chart.d.ts +96 -0
  1147. package/dist/web-components/components/trading-chart/trading-chart.js +96 -0
  1148. package/dist/web-components/components/trading-chart/trading-chart.js.map +1 -0
  1149. package/dist/web-components/elements/chart-3d.d.ts +2 -0
  1150. package/dist/web-components/elements/chart-3d.js +13 -0
  1151. package/dist/web-components/elements/chart-3d.js.map +1 -0
  1152. package/dist/web-components/elements/chart.d.ts +7 -0
  1153. package/dist/web-components/elements/chart.js +43 -0
  1154. package/dist/web-components/elements/chart.js.map +1 -0
  1155. package/dist/web-components/elements/order-book.d.ts +2 -0
  1156. package/dist/web-components/elements/order-book.js +13 -0
  1157. package/dist/web-components/elements/order-book.js.map +1 -0
  1158. package/dist/web-components/elements/trading-chart.d.ts +2 -0
  1159. package/dist/web-components/elements/trading-chart.js +8 -0
  1160. package/dist/web-components/elements/trading-chart.js.map +1 -0
  1161. package/dist/web-components/html-custom-data.json +1192 -29
  1162. package/dist/web-components/types/react.d.ts +435 -0
  1163. package/dist/web-components/types/solid.d.ts +321 -0
  1164. package/dist/web-components/types/svelte.d.ts +321 -0
  1165. package/dist/web-components/types/vue.d.ts +359 -0
  1166. package/package.json +113 -1
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","names":["firstX","data","xs","list","i","item","detectXType","datas","x","axisModel","options","gridDefault","extent","min","max","values","v","smallestStep","step","columns","sorted","k","d","bandOf","category","axis","s","stackValues","totals","percent","byX","stack","count","y","t","running","members","base","top","valid","sums","total","b","DEFAULT_UP","DEFAULT_DOWN","buildModel","resolve","resolver","theme","resolveStaticColor","value","fallback","input","xType","categories","collectCategories","categoryMap","c","resolveX","xResolver","name","yOpts","heatmapData","yCategories","collectYCategories","yType","yCategoryMap","resolveY","resolverKey","usedKeys","series","key","index","entry","cache","normalizeData","type","paletteColor","color","cols","pointColors","resolved","rgba","colorScale","valueRange","cellColors","mix","lo","hi","span","packColor","rampColor","id","toCss","hidden","visible","allScatter","bars","band","slots","stackId","group","slotWidth","stacked","percentStacked","p","slot","stackedLines","candles","candleBand","heatmaps","cx","cy","xOpts","xRange","pad","ensureSpan","pointsOnly","niceDomain","yRange","yValues","filled","zoomOption","zoomAxes","tooltip","yFormat","plottedY","grids","gridOf","grid","GridIndex"],"sources":["../../../../../../charts/src/engine/model.ts"],"sourcesContent":["// Options -> chart model: normalized data, colors, bar layout, stacks and\n// the full ranges of the axes. Pure (colors go through the theme's resolver).\n\nimport {\n mix,\n packColor,\n rampColor,\n resolveStaticColor,\n toCss,\n type ColorResolver,\n type Rgba,\n} from \"./color\";\nimport {\n collectCategories,\n collectYCategories,\n normalizeData,\n xResolver,\n type SeriesColumns,\n type YResolver,\n} from \"./data\";\nimport { ensureSpan, niceDomain } from \"./scale\";\nimport { GridIndex } from \"./spatial\";\nimport type { ChartTheme } from \"./theme\";\nimport type {\n ChartAxisOptions,\n ChartAxisType,\n ChartCurve,\n ChartOptions,\n ChartSeries,\n ChartSeriesData,\n ChartSeriesType,\n} from \"./types\";\nimport type { Range } from \"./viewport\";\n\nexport interface AxisModel {\n type: ChartAxisType;\n reverse: boolean;\n categories: string[];\n title?: string;\n format?: (value: number) => string;\n grid: boolean;\n visible: boolean;\n tickCount?: number;\n}\n\nexport interface SeriesModel {\n index: number;\n /** Key of the GPU resources and of the data cache */\n key: string;\n id: string;\n name: string;\n type: ChartSeriesType;\n color: Rgba;\n colorCss: string;\n lineWidth: number;\n pointSize: number;\n opacity: number;\n hidden: boolean;\n showLabels: boolean;\n curve: ChartCurve;\n cols: SeriesColumns;\n /** Bars / candlesticks: x offset of the series inside a group and half of the bar width */\n barOffset: number;\n barHalfWidth: number;\n /** Bars: bottom / top of every bar (stacks included) */\n barBase: Float64Array | null;\n barTop: Float64Array | null;\n /** Stacked lines / areas: bottom / top of every point */\n stackBase: Float64Array | null;\n stackTop: Float64Array | null;\n /** Scatter / bar: resolved per-point colors */\n pointColors: (Rgba | undefined)[] | null;\n /** Candlesticks: colors of the rising / falling candles */\n upColor: Rgba;\n downColor: Rgba;\n /** Heatmaps: packed color of every cell (0 = no cell) and half of a cell, in data units */\n cellColors: Uint32Array | null;\n cellHalf: { x: number; y: number };\n /** Heatmaps: ramp of the colors and the values at its ends */\n colorScale: Rgba[];\n valueRange: Range;\n /** Corner radius in CSS pixels (bars, heatmap cells) */\n radius: number;\n /** Tooltip format of the values */\n format?: (value: number) => string;\n}\n\nexport interface ChartModel {\n series: SeriesModel[];\n x: AxisModel;\n y: AxisModel;\n /** Full ranges (zoomed out) */\n base: { x: Range; y: Range };\n /** Every series is a scatter (or a heatmap): nearest tooltips, xy zoom */\n allScatter: boolean;\n zoom: { x: boolean; y: boolean };\n tooltipMode: \"nearest\" | \"axis\";\n /** Y value the areas are filled to */\n baseline: number;\n /** Smallest zoomed spans */\n minSpan: { x: number; y: number };\n /** Stacks are scaled to 100% */\n percent: boolean;\n /** Stack id of every series (`null` when not stacked) */\n stacks: (string | null)[];\n}\n\nexport interface DataCacheEntry {\n data: ChartSeriesData;\n resolverKey: string;\n cols: SeriesColumns;\n}\n\nexport type DataCache = Map<string, DataCacheEntry>;\n\nconst firstX = (data: ChartSeriesData): unknown => {\n if (typeof data === \"object\" && data !== null && !(\"length\" in data)) {\n const xs = (data as { x?: ArrayLike<unknown> }).x;\n return xs && xs.length ? xs[0] : undefined;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < Math.min(list.length, 8); i++) {\n const item = list[i];\n if (Array.isArray(item)) return item[0];\n if (item && typeof item === \"object\") return (item as { x?: unknown }).x;\n }\n return undefined;\n};\n\n/** Axis type when not given: dates -> time, strings -> category */\nexport const detectXType = (\n datas: readonly ChartSeriesData[],\n): ChartAxisType => {\n for (const data of datas) {\n const x = firstX(data);\n if (x instanceof Date) return \"time\";\n if (typeof x === \"string\") return \"category\";\n }\n return \"linear\";\n};\n\nconst axisModel = (\n options: ChartAxisOptions | undefined,\n type: ChartAxisType,\n categories: string[],\n gridDefault: boolean,\n): AxisModel => ({\n type,\n reverse: !!options?.reverse,\n categories,\n title: options?.title,\n format: options?.format,\n grid: options?.grid ?? gridDefault,\n visible: options?.visible ?? true,\n tickCount: options?.tickCount,\n});\n\nconst extent = (values: ArrayLike<number>): Range => {\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 if (v < min) min = v;\n if (v > max) max = v;\n }\n return [min, max];\n};\n\n/** Smallest positive gap between consecutive values (bar width on numeric axes) */\nconst smallestStep = (columns: ArrayLike<number>[], sorted: boolean[]) => {\n let step = Infinity;\n columns.forEach((values, k) => {\n const xs = sorted[k] ? values : Float64Array.from(values).sort();\n for (let i = 1; i < xs.length; i++) {\n const d = xs[i] - xs[i - 1];\n if (d > 0 && d < step) step = d;\n }\n });\n return step;\n};\n\nconst bandOf = (list: SeriesModel[], axis: \"x\" | \"y\", category: boolean) => {\n if (category) return 1;\n const step = smallestStep(\n list.map((s) => (axis === \"x\" ? s.cols.x : s.cols.y)),\n list.map((s) => axis === \"x\" && s.cols.sorted),\n );\n return Number.isFinite(step) ? step : 1;\n};\n\n/**\n * Stacks the y values of series sharing a stack id (positive and negative\n * values separately); `percent` scales every stack to 100 at each x\n */\nconst stackValues = (\n list: { s: SeriesModel; stack: string }[],\n percent: boolean,\n): { base: Float64Array; top: Float64Array }[] => {\n const totals = new Map<string, Map<number, [number, number]>>();\n if (percent) {\n for (const { s, stack } of list) {\n let byX = totals.get(stack);\n if (!byX) totals.set(stack, (byX = new Map()));\n const { x, y, count } = s.cols;\n for (let i = 0; i < count; i++) {\n const v = y[i];\n if (!Number.isFinite(v)) continue;\n const t = byX.get(x[i]) ?? [0, 0];\n if (v >= 0) t[0] += v;\n else t[1] -= v;\n byX.set(x[i], t);\n }\n }\n }\n const running = new Map<string, Map<number, [number, number]>>();\n const members = new Map<string, number>();\n for (const { stack } of list)\n members.set(stack, (members.get(stack) ?? 0) + 1);\n return list.map(({ s, stack }) => {\n const { x, y, count } = s.cols;\n if (!percent && members.get(stack) === 1) {\n // alone in its stack (e.g. grouped bars): from zero, no bookkeeping\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n const v = y[i];\n const valid = Number.isFinite(v);\n base[i] = valid ? 0 : NaN;\n top[i] = valid ? v : NaN;\n }\n return { base, top };\n }\n let byX = running.get(stack);\n if (!byX) running.set(stack, (byX = new Map()));\n const sums = totals.get(stack);\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n let v = y[i];\n if (!Number.isFinite(v)) {\n base[i] = NaN;\n top[i] = NaN;\n continue;\n }\n if (sums) {\n const t = sums.get(x[i]);\n const total = t ? (v >= 0 ? t[0] : t[1]) : 0;\n v = total > 0 ? (v / total) * 100 : 0;\n }\n const t = byX.get(x[i]) ?? [0, 0];\n const b = v >= 0 ? t[0] : t[1];\n base[i] = b;\n top[i] = b + v;\n if (v >= 0) t[0] += v;\n else t[1] += v;\n byX.set(x[i], t);\n }\n return { base, top };\n });\n};\n\nconst DEFAULT_UP = \"var(--success-color, #16a34a)\";\nconst DEFAULT_DOWN = \"var(--danger-color, #dc2626)\";\n\nexport const buildModel = (\n options: ChartOptions,\n theme: ChartTheme,\n hidden: ReadonlySet<string>,\n cache: DataCache,\n resolver: ColorResolver | null = null,\n): ChartModel => {\n const resolve: ColorResolver =\n resolver ??\n theme.resolve ??\n ((value, fallback) => resolveStaticColor(value, {}, fallback));\n const input = options.series;\n const datas = input.map((s) => s.data);\n const xType = options.xAxis?.type ?? detectXType(datas);\n const categories =\n xType === \"category\"\n ? [...(options.xAxis?.categories ?? collectCategories(datas))]\n : [];\n const categoryMap = new Map(categories.map((c, i) => [c, i]));\n const resolveX = xResolver(xType, (name) => categoryMap.get(name) ?? NaN);\n\n // category y axis (heatmap rows): explicit, or detected from string y values\n const yOpts = options.yAxis;\n const heatmapData = input\n .filter((s) => s.type === \"heatmap\")\n .map((s) => s.data);\n const yCategories =\n yOpts?.type === \"category\" || (!yOpts?.type && heatmapData.length)\n ? [...(yOpts?.categories ?? collectYCategories(heatmapData))]\n : [];\n const yType: ChartAxisType =\n yOpts?.type === \"category\" || yCategories.length\n ? \"category\"\n : yOpts?.type === \"time\"\n ? \"time\"\n : \"linear\";\n const yCategoryMap = new Map(yCategories.map((c, i) => [c, i]));\n const resolveY: YResolver = (v) =>\n typeof v === \"number\"\n ? v\n : typeof v === \"string\"\n ? yType === \"category\"\n ? (yCategoryMap.get(v) ?? NaN)\n : Number(v)\n : NaN;\n const resolverKey = `${xType}|${categories.join(\"\\u0001\")}|${yType}|${yCategories.join(\"\\u0001\")}`;\n const percent = options.stackMode === \"percent\";\n\n const usedKeys = new Set<string>();\n const series: SeriesModel[] = input.map((s: ChartSeries, index) => {\n let key = s.id ?? `#${index}`;\n while (usedKeys.has(key)) key += \"'\";\n usedKeys.add(key);\n let entry = cache.get(key);\n if (!entry || entry.data !== s.data || entry.resolverKey !== resolverKey) {\n entry = {\n data: s.data,\n resolverKey,\n cols: normalizeData(s.data, resolveX, resolveY),\n };\n cache.set(key, entry);\n }\n const type = s.type ?? \"line\";\n const paletteColor = theme.palette[index % theme.palette.length];\n const color = s.color ? resolve(s.color, paletteColor) : paletteColor;\n const cols = entry.cols;\n let pointColors: (Rgba | undefined)[] | null = null;\n if ((type === \"scatter\" || type === \"bar\") && cols.colors) {\n const resolved = new Map<string, Rgba>();\n pointColors = cols.colors.map((c) => {\n if (c === undefined) return undefined;\n let rgba = resolved.get(c);\n if (!rgba) resolved.set(c, (rgba = resolve(c, color)));\n return rgba;\n });\n }\n let colorScale: Rgba[] = [];\n let valueRange: Range = [0, 1];\n let cellColors: Uint32Array | null = null;\n if (type === \"heatmap\") {\n colorScale =\n s.colorScale && s.colorScale.length\n ? s.colorScale.map((c) => resolve(c, color))\n : [mix(theme.background, color, 0.08), color];\n valueRange = s.valueRange\n ? [s.valueRange[0], s.valueRange[1]]\n : [cols.valueMin, cols.valueMax];\n if (!Number.isFinite(valueRange[0])) valueRange = [0, 1];\n const values = cols.value ?? cols.y;\n const [lo, hi] = valueRange;\n const span = hi - lo || 1;\n cellColors = new Uint32Array(cols.count);\n for (let i = 0; i < cols.count; i++) {\n const v = values[i];\n if (!Number.isFinite(v) || !Number.isFinite(cols.y[i])) continue;\n // 0 means \"no cell\": a fully transparent color packs to 0 as well\n cellColors[i] = packColor(rampColor(colorScale, (v - lo) / span));\n }\n }\n const id = s.id ?? String(index);\n return {\n index,\n key,\n id,\n name: s.name ?? `Series ${index + 1}`,\n type,\n color,\n colorCss: toCss(color),\n lineWidth: s.lineWidth ?? (type === \"candlestick\" ? 1 : 2),\n pointSize: s.pointSize ?? 8,\n opacity:\n s.opacity ?? (type === \"area\" ? 0.28 : type === \"scatter\" ? 0.78 : 1),\n hidden: !!s.hidden || hidden.has(id),\n showLabels: !!s.showLabels,\n curve: s.curve ?? \"linear\",\n cols,\n barOffset: 0,\n barHalfWidth: 0,\n barBase: null,\n barTop: null,\n stackBase: null,\n stackTop: null,\n pointColors,\n upColor:\n type === \"candlestick\"\n ? resolve(s.upColor ?? DEFAULT_UP, [0.09, 0.64, 0.29, 1])\n : color,\n downColor:\n type === \"candlestick\"\n ? resolve(s.downColor ?? DEFAULT_DOWN, [0.86, 0.15, 0.15, 1])\n : color,\n cellColors,\n cellHalf: { x: 0.5, y: 0.5 },\n colorScale,\n valueRange,\n radius: s.radius ?? (type === \"heatmap\" ? 2 : 3),\n format: s.format,\n };\n });\n\n const visible = series.filter((s) => !s.hidden);\n const allScatter =\n series.length > 0 &&\n series.every((s) => s.type === \"scatter\" || s.type === \"heatmap\");\n\n // Bars: groups (one slot per stack) and stacking\n const bars = visible.filter((s) => s.type === \"bar\");\n const band = bandOf(bars, \"x\", xType === \"category\");\n if (bars.length) {\n const slots = new Map<string, number>();\n const stackId = (s: SeriesModel) =>\n input[s.index].stack ?? `\\u0000${s.key}`;\n for (const s of bars) {\n if (!slots.has(stackId(s))) slots.set(stackId(s), slots.size);\n }\n const group = band * (slots.size > 1 ? 0.78 : 0.62);\n const slotWidth = group / slots.size;\n const stacked = stackValues(\n bars.map((s) => ({ s, stack: stackId(s) })),\n false,\n );\n const percentStacked = percent\n ? stackValues(\n bars\n .filter((s) => input[s.index].stack !== undefined)\n .map((s) => ({ s, stack: stackId(s) })),\n true,\n )\n : [];\n let p = 0;\n bars.forEach((s, k) => {\n const slot = slots.get(stackId(s)) ?? 0;\n s.barOffset = -group / 2 + slotWidth * (slot + 0.5);\n s.barHalfWidth = (slotWidth / 2) * (slots.size > 1 ? 0.86 : 1);\n const values =\n percent && input[s.index].stack !== undefined\n ? percentStacked[p++]\n : stacked[k];\n s.barBase = values.base;\n s.barTop = values.top;\n });\n }\n\n // Stacked lines / areas\n const stackedLines = visible.filter(\n (s) =>\n (s.type === \"line\" || s.type === \"area\") &&\n input[s.index].stack !== undefined,\n );\n if (stackedLines.length) {\n const values = stackValues(\n stackedLines.map((s) => ({ s, stack: input[s.index].stack ?? \"\" })),\n percent,\n );\n stackedLines.forEach((s, k) => {\n s.stackBase = values[k].base;\n s.stackTop = values[k].top;\n });\n }\n\n // Candlesticks: one band per x, bodies of 60%\n const candles = visible.filter((s) => s.type === \"candlestick\");\n const candleBand = bandOf(candles, \"x\", xType === \"category\");\n for (const s of candles) s.barHalfWidth = candleBand * 0.3;\n\n // Heatmaps: cells of the size of the smallest step\n const heatmaps = visible.filter((s) => s.type === \"heatmap\");\n if (heatmaps.length) {\n const cx = bandOf(heatmaps, \"x\", xType === \"category\") / 2;\n const cy = bandOf(heatmaps, \"y\", yType === \"category\") / 2;\n for (const s of heatmaps) s.cellHalf = { x: cx, y: cy };\n }\n\n // X range\n const xOpts = options.xAxis;\n let xRange: Range;\n if (xType === \"category\") {\n xRange = [-0.5, Math.max(1, categories.length) - 0.5];\n } else {\n const values: number[] = [];\n for (const s of visible) {\n values.push(s.cols.xMin, s.cols.xMax);\n const pad =\n s.type === \"bar\"\n ? band / 2\n : s.type === \"candlestick\"\n ? candleBand / 2\n : s.type === \"heatmap\"\n ? s.cellHalf.x\n : 0;\n if (pad) values.push(s.cols.xMin - pad, s.cols.xMax + pad);\n }\n xRange = ensureSpan(\n ...extent(values),\n xType === \"time\" ? [Date.now() - 86400000, Date.now()] : [0, 1],\n );\n const pointsOnly = series.every((s) => s.type === \"scatter\");\n if (pointsOnly) {\n const pad = (xRange[1] - xRange[0]) * 0.04;\n xRange = [xRange[0] - pad, xRange[1] + pad];\n }\n const nice = xOpts?.nice ?? (pointsOnly && xType === \"linear\");\n if (nice && xType === \"linear\") {\n xRange = niceDomain(xRange[0], xRange[1], xOpts?.tickCount ?? 6);\n }\n }\n if (xOpts?.min !== undefined) xRange[0] = xOpts.min;\n if (xOpts?.max !== undefined) xRange[1] = xOpts.max;\n xRange = ensureSpan(xRange[0], xRange[1]);\n\n // Y range\n let yRange: Range;\n if (yType === \"category\") {\n yRange = [-0.5, Math.max(1, yCategories.length) - 0.5];\n } else {\n const yValues: number[] = [];\n for (const s of visible) {\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n yValues.push(...extent(s.barBase), ...extent(s.barTop));\n } else if (s.stackBase && s.stackTop) {\n yValues.push(...extent(s.stackBase), ...extent(s.stackTop));\n } else if (s.type === \"heatmap\") {\n yValues.push(s.cols.yMin - s.cellHalf.y, s.cols.yMax + s.cellHalf.y);\n } else {\n yValues.push(s.cols.yMin, s.cols.yMax);\n }\n }\n const filled = bars.length > 0 || visible.some((s) => s.type === \"area\");\n if (bars.length || yOpts?.zero) yValues.push(0);\n if (bars.some((s) => s.showLabels)) {\n // room for the value labels above the tallest bar\n const [lo, hi] = extent(yValues);\n if (hi > 0) yValues.push(hi + (hi - Math.min(0, lo)) * 0.1);\n if (lo < 0) yValues.push(lo - (Math.max(0, hi) - lo) * 0.1);\n }\n yRange = ensureSpan(...extent(yValues));\n if (series.every((s) => s.type === \"scatter\")) {\n const pad = (yRange[1] - yRange[0]) * 0.06;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n } else if (candles.length && !bars.length) {\n // room above / below the wicks\n const pad = (yRange[1] - yRange[0]) * 0.04;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n }\n if ((yOpts?.nice ?? !heatmaps.length) && yType === \"linear\") {\n yRange = niceDomain(yRange[0], yRange[1], yOpts?.tickCount ?? 5);\n }\n if (percent && (bars.length || stackedLines.length)) {\n // 100% stacks: exactly 0-100 (or -100-100)\n yRange = [extent(yValues)[0] < 0 ? -100 : 0, 100];\n }\n if (filled && !yOpts?.zero) {\n // bars start at zero: no padding below / above it\n if (yRange[0] < 0 && extent(yValues)[0] >= 0) yRange[0] = 0;\n }\n }\n if (yOpts?.min !== undefined) yRange[0] = yOpts.min;\n if (yOpts?.max !== undefined) yRange[1] = yOpts.max;\n yRange = ensureSpan(yRange[0], yRange[1]);\n\n const zoomOption =\n options.interaction === false\n ? false\n : options.interaction === true || options.interaction === undefined\n ? true\n : (options.interaction.zoom ?? true);\n const zoomAxes =\n zoomOption === false\n ? { x: false, y: false }\n : zoomOption === true\n ? { x: true, y: allScatter }\n : { x: zoomOption.includes(\"x\"), y: zoomOption.includes(\"y\") };\n\n const tooltip =\n typeof options.tooltip === \"object\" ? options.tooltip : undefined;\n\n const yFormat =\n yOpts?.format ??\n (percent && (bars.length || stackedLines.length)\n ? (v: number) => `${+v.toFixed(1)}%`\n : undefined);\n\n return {\n series,\n x: axisModel(xOpts, xType, categories, false),\n y: {\n ...axisModel(yOpts, yType, yCategories, yType !== \"category\"),\n format: yFormat,\n },\n base: { x: xRange, y: yRange },\n allScatter,\n zoom: zoomAxes,\n tooltipMode: tooltip?.mode ?? (allScatter ? \"nearest\" : \"axis\"),\n baseline: Math.min(Math.max(0, yRange[0]), yRange[1]),\n minSpan: {\n x: xType === \"category\" ? 1 : (xRange[1] - xRange[0]) * 1e-7,\n y: yType === \"category\" ? 1 : (yRange[1] - yRange[0]) * 1e-7,\n },\n percent,\n stacks: input.map((s) =>\n s.stack !== undefined &&\n (s.type === \"bar\" || s.type === \"line\" || s.type === \"area\" || !s.type)\n ? `${s.type === \"bar\" ? \"bar\" : \"line\"}:${s.stack}`\n : null,\n ),\n };\n};\n\n/** Y value drawn for a point: its stacked top for stacks, the close for candles */\nexport const plottedY = (s: SeriesModel, i: number): number =>\n s.barTop ? s.barTop[i] : s.stackTop ? s.stackTop[i] : s.cols.y[i];\n\nconst grids = new WeakMap<SeriesColumns, GridIndex>();\n\n/** Spatial index of a scatter series, built on first use and kept with its data */\nexport const gridOf = (s: SeriesModel): GridIndex => {\n let grid = grids.get(s.cols);\n if (!grid) {\n grid = new GridIndex(s.cols.x, s.cols.y, s.cols.count);\n grids.set(s.cols, grid);\n }\n return grid;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"model.js","names":["firstX","data","xs","list","i","item","detectXType","datas","x","axisModel","options","gridDefault","definedEntries","out","value","key","extent","min","max","values","v","smallestStep","step","columns","sorted","k","d","bandOf","category","axis","s","stackValues","totals","percent","byX","stack","count","y","t","running","members","base","top","valid","sums","total","b","DEFAULT_UP","DEFAULT_DOWN","hasDateY","precise","nextStep","power","f","alignedDomain","a0","a1","left","stepL","tickStep","n","lo","hi","ensureSpan","niceDomain","start","mapped","mapColumns","map","hit","raw","column","a","cols","buildModel","resolve","resolver","theme","resolveStaticColor","fallback","input","locale","resolveLocale","tooltipOptions","labels","chartLabels","xType","categories","collectCategories","categoryMap","c","resolveX","xResolver","name","yOpts","heatmapData","yCategories","collectYCategories","yType","yCategoryMap","resolveY","resolverKey","horizontal","usedKeys","series","index","entry","cache","normalizeData","type","paletteColor","color","pointColors","resolved","rgba","colorScale","valueRange","cellColors","mix","span","packColor","rampColor","id","toCss","hidden","visible","allScatter","slotted","bars","band","slots","stackId","share","w","group","slotWidth","slot","stackedBars","stacked","percentStacked","p","y0","stackedLines","candles","candleBand","heatmaps","cx","cy","xOpts","xRange","pad","pointsOnly","valuesOf","listBars","zero","leftVisible","leftSeries","leftBars","yRange","yValues","filled","y2Opts","y2","y2Map","rightSeries","domain","scale","rawBase","zoomOption","zoomAxes","yFormat","formatPercent","valueFormatter","plottedY","grids","gridOf","grid","GridIndex"],"sources":["../../../../../../charts/src/engine/model.ts"],"sourcesContent":["// Options -> chart model: normalized data, colors, bar layout, stacks and\n// the full ranges of the axes. Pure (colors go through the theme's resolver).\n\nimport {\n mix,\n packColor,\n rampColor,\n resolveStaticColor,\n toCss,\n type ColorResolver,\n type Rgba,\n} from \"./color\";\nimport {\n collectCategories,\n collectYCategories,\n normalizeData,\n xResolver,\n type SeriesColumns,\n type YResolver,\n} from \"./data\";\nimport { formatPercent, valueFormatter } from \"./format\";\nimport { chartLabels } from \"./labels\";\nimport { resolveLocale } from \"./locale\";\nimport { ensureSpan, niceDomain, tickStep } from \"./scale\";\nimport { GridIndex } from \"./spatial\";\nimport type { ChartTheme } from \"./theme\";\nimport type {\n ChartAxisOptions,\n ChartAxisType,\n ChartCurve,\n ChartOptions,\n ChartSeries,\n ChartSeriesData,\n ChartLabels,\n ChartSeriesType,\n ChartTimeZone,\n} from \"./types\";\nimport type { Range } from \"./viewport\";\n\nexport interface AxisModel {\n type: ChartAxisType;\n reverse: boolean;\n categories: string[];\n title?: string;\n format?: (value: number) => string;\n grid: boolean;\n visible: boolean;\n tickCount?: number;\n /** Locale of the tick and tooltip labels (historical English texts when omitted) */\n locale?: string;\n /** Calendar of a time axis */\n timeZone?: ChartTimeZone;\n}\n\nexport interface SeriesModel {\n index: number;\n /** Key of the GPU resources and of the data cache */\n key: string;\n id: string;\n name: string;\n type: ChartSeriesType;\n color: Rgba;\n colorCss: string;\n lineWidth: number;\n pointSize: number;\n opacity: number;\n hidden: boolean;\n showLabels: boolean;\n curve: ChartCurve;\n /**\n * Plotted columns: the data, mapped onto the left axis for the series of\n * the right axis (`raw` keeps the values of the data)\n */\n cols: SeriesColumns;\n /** Columns of the data (shown in tooltips and labels) */\n raw: SeriesColumns;\n /** Value axis of the series */\n yAxis: \"left\" | \"right\";\n /** Bars with a start (`y0`): drawn from it, never stacked */\n floating: boolean;\n /** Bars / candlesticks: x offset of the series inside a group and half of the bar width */\n barOffset: number;\n barHalfWidth: number;\n /** Bars: bottom / top of every bar (stacks included) */\n barBase: Float64Array | null;\n barTop: Float64Array | null;\n /** Stacked lines / areas: bottom / top of every point */\n stackBase: Float64Array | null;\n stackTop: Float64Array | null;\n /** Scatter / bar: resolved per-point colors */\n pointColors: (Rgba | undefined)[] | null;\n /** Candlesticks: colors of the rising / falling candles */\n upColor: Rgba;\n downColor: Rgba;\n /** Heatmaps: packed color of every cell (0 = no cell) and half of a cell, in data units */\n cellColors: Uint32Array | null;\n cellHalf: { x: number; y: number };\n /** Heatmaps: ramp of the colors and the values at its ends */\n colorScale: Rgba[];\n valueRange: Range;\n /** Corner radius in CSS pixels (bars, heatmap cells) */\n radius: number;\n /** Tooltip format of the values */\n format?: (value: number) => string;\n /** Scatter: name of the `value` of the points */\n valueName?: string;\n}\n\n/** Linear map of the right axis onto the left one: `left = right * scale + offset` */\nexport interface AxisMap {\n scale: number;\n offset: number;\n}\n\nexport interface ChartModel {\n series: SeriesModel[];\n x: AxisModel;\n y: AxisModel;\n /** Right value axis (`yAxis2`), `null` when no series uses it */\n y2: AxisModel | null;\n /** Right axis values -> left axis values */\n y2Map: AxisMap | null;\n /** The x axis runs down the left side, the values along the bottom */\n horizontal: boolean;\n /** Resolved locale (`locale` option, else the page language) */\n locale: string;\n /** Texts of the locale with the `labels` overrides */\n labels: ChartLabels;\n /** Tooltip value of the locale (series without `format`) */\n formatValue: (value: number) => string;\n /** Full ranges (zoomed out) */\n base: { x: Range; y: Range };\n /** Every series is a scatter (or a heatmap): nearest tooltips, xy zoom */\n allScatter: boolean;\n zoom: { x: boolean; y: boolean };\n tooltipMode: \"nearest\" | \"axis\";\n /** Y value the areas are filled to */\n baseline: number;\n /** Smallest zoomed spans */\n minSpan: { x: number; y: number };\n /** Stacks are scaled to 100% */\n percent: boolean;\n /** Stack id of every series (`null` when not stacked) */\n stacks: (string | null)[];\n}\n\nexport interface DataCacheEntry {\n data: ChartSeriesData;\n resolverKey: string;\n cols: SeriesColumns;\n}\n\nexport type DataCache = Map<string, DataCacheEntry>;\n\nconst firstX = (data: ChartSeriesData): unknown => {\n if (typeof data === \"object\" && data !== null && !(\"length\" in data)) {\n const xs = (data as { x?: ArrayLike<unknown> }).x;\n return xs && xs.length ? xs[0] : undefined;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < Math.min(list.length, 8); i++) {\n const item = list[i];\n if (Array.isArray(item)) return item[0];\n if (item && typeof item === \"object\") return (item as { x?: unknown }).x;\n }\n return undefined;\n};\n\n/** Axis type when not given: dates -> time, strings -> category */\nexport const detectXType = (\n datas: readonly ChartSeriesData[],\n): ChartAxisType => {\n for (const data of datas) {\n const x = firstX(data);\n if (x instanceof Date) return \"time\";\n if (typeof x === \"string\") return \"category\";\n }\n return \"linear\";\n};\n\nconst axisModel = (\n options: ChartAxisOptions | undefined,\n type: ChartAxisType,\n categories: string[],\n gridDefault: boolean,\n locale: string,\n): AxisModel => ({\n type,\n reverse: !!options?.reverse,\n categories,\n title: options?.title,\n format: options?.format,\n grid: options?.grid ?? gridDefault,\n visible: options?.visible ?? true,\n tickCount: options?.tickCount,\n locale,\n timeZone: options?.timeZone ?? \"local\",\n});\n\n/** Defined entries only (`{ open: undefined }` keeps the built-in text) */\nconst definedEntries = <T extends object>(value: T | undefined): Partial<T> => {\n const out: Partial<T> = {};\n if (!value) return out;\n for (const key of Object.keys(value) as (keyof T)[]) {\n if (value[key] !== undefined) out[key] = value[key];\n }\n return out;\n};\n\nconst extent = (values: ArrayLike<number>): Range => {\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 if (v < min) min = v;\n if (v > max) max = v;\n }\n return [min, max];\n};\n\n/** Smallest positive gap between consecutive values (bar width on numeric axes) */\nconst smallestStep = (columns: ArrayLike<number>[], sorted: boolean[]) => {\n let step = Infinity;\n columns.forEach((values, k) => {\n const xs = sorted[k] ? values : Float64Array.from(values).sort();\n for (let i = 1; i < xs.length; i++) {\n const d = xs[i] - xs[i - 1];\n if (d > 0 && d < step) step = d;\n }\n });\n return step;\n};\n\nconst bandOf = (list: SeriesModel[], axis: \"x\" | \"y\", category: boolean) => {\n if (category) return 1;\n const step = smallestStep(\n list.map((s) => (axis === \"x\" ? s.cols.x : s.cols.y)),\n list.map((s) => axis === \"x\" && s.cols.sorted),\n );\n return Number.isFinite(step) ? step : 1;\n};\n\n/**\n * Stacks the y values of series sharing a stack id (positive and negative\n * values separately); `percent` scales every stack to 100 at each x\n */\nconst stackValues = (\n list: { s: SeriesModel; stack: string }[],\n percent: boolean,\n): { base: Float64Array; top: Float64Array }[] => {\n const totals = new Map<string, Map<number, [number, number]>>();\n if (percent) {\n for (const { s, stack } of list) {\n let byX = totals.get(stack);\n if (!byX) totals.set(stack, (byX = new Map()));\n const { x, y, count } = s.cols;\n for (let i = 0; i < count; i++) {\n const v = y[i];\n if (!Number.isFinite(v)) continue;\n const t = byX.get(x[i]) ?? [0, 0];\n if (v >= 0) t[0] += v;\n else t[1] -= v;\n byX.set(x[i], t);\n }\n }\n }\n const running = new Map<string, Map<number, [number, number]>>();\n const members = new Map<string, number>();\n for (const { stack } of list)\n members.set(stack, (members.get(stack) ?? 0) + 1);\n return list.map(({ s, stack }) => {\n const { x, y, count } = s.cols;\n if (!percent && members.get(stack) === 1) {\n // alone in its stack (e.g. grouped bars): from zero, no bookkeeping\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n const v = y[i];\n const valid = Number.isFinite(v);\n base[i] = valid ? 0 : NaN;\n top[i] = valid ? v : NaN;\n }\n return { base, top };\n }\n let byX = running.get(stack);\n if (!byX) running.set(stack, (byX = new Map()));\n const sums = totals.get(stack);\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n let v = y[i];\n if (!Number.isFinite(v)) {\n base[i] = NaN;\n top[i] = NaN;\n continue;\n }\n if (sums) {\n const t = sums.get(x[i]);\n const total = t ? (v >= 0 ? t[0] : t[1]) : 0;\n v = total > 0 ? (v / total) * 100 : 0;\n }\n const t = byX.get(x[i]) ?? [0, 0];\n const b = v >= 0 ? t[0] : t[1];\n base[i] = b;\n top[i] = b + v;\n if (v >= 0) t[0] += v;\n else t[1] += v;\n byX.set(x[i], t);\n }\n return { base, top };\n });\n};\n\nconst DEFAULT_UP = \"var(--success-color, #16a34a)\";\nconst DEFAULT_DOWN = \"var(--danger-color, #dc2626)\";\n\n/** Dates in the y values (or starts) of objects: a time value axis */\nconst hasDateY = (datas: readonly ChartSeriesData[]): boolean => {\n for (const data of datas) {\n if (typeof data !== \"object\" || data === null || !(\"length\" in data))\n continue;\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < Math.min(list.length, 8); i++) {\n const item = list[i];\n if (item && typeof item === \"object\" && !Array.isArray(item)) {\n const d = item as { y?: unknown; y0?: unknown };\n if (d.y instanceof Date || d.y0 instanceof Date) return true;\n }\n }\n }\n return false;\n};\n\nconst precise = (v: number) => Number(v.toPrecision(12));\n\n/** Next step of the 1, 2, 5 × 10^k sequence */\nconst nextStep = (step: number) => {\n const power = 10 ** Math.floor(Math.log10(step) + 1e-9);\n const f = step / power;\n return (f < 1.5 ? 2 : f < 3.5 ? 5 : 10) * power;\n};\n\n/**\n * Range of the right axis covering [lo, hi] with as many tick intervals as\n * the left range has (its ticks then line up with the left grid)\n */\nexport const alignedDomain = (\n lo: number,\n hi: number,\n left: Range,\n count: number,\n): Range => {\n const [a0, a1] = left;\n const stepL = tickStep(a0, a1, count);\n const n = stepL > 0 ? Math.round((a1 - a0) / stepL) : 0;\n [lo, hi] = ensureSpan(lo, hi);\n if (n < 1 || Math.abs(n * stepL - (a1 - a0)) > stepL * 1e-6) {\n return niceDomain(lo, hi, count);\n }\n let step = tickStep(lo, hi, n);\n for (let k = 0; k < 40 && step > 0; k++) {\n const start = Math.floor(lo / step + 1e-9) * step;\n if (start + n * step >= hi - step * 1e-9) {\n return [precise(start), precise(start + n * step)];\n }\n step = nextStep(step);\n }\n return niceDomain(lo, hi, count);\n};\n\nconst mapped = new WeakMap<\n SeriesColumns,\n { key: string; cols: SeriesColumns }\n>();\n\n/** Columns of a right-axis series in left axis units (cached with the data) */\nconst mapColumns = (raw: SeriesColumns, map: AxisMap): SeriesColumns => {\n const key = `${map.scale},${map.offset}`;\n const hit = mapped.get(raw);\n if (hit && hit.key === key) return hit.cols;\n const f = (v: number) => v * map.scale + map.offset;\n const column = (a: Float64Array | null) => (a ? a.map(f) : null);\n const lo = f(raw.yMin);\n const hi = f(raw.yMax);\n const cols: SeriesColumns = {\n ...raw,\n y: raw.y.map(f),\n open: column(raw.open),\n high: column(raw.high),\n low: column(raw.low),\n y0: column(raw.y0),\n q1: column(raw.q1),\n q3: column(raw.q3),\n outliers: raw.outliers ? raw.outliers.map((list) => list?.map(f)) : null,\n yMin: Math.min(lo, hi),\n yMax: Math.max(lo, hi),\n };\n mapped.set(raw, { key, cols });\n return cols;\n};\n\nexport const buildModel = (\n options: ChartOptions,\n theme: ChartTheme,\n hidden: ReadonlySet<string>,\n cache: DataCache,\n resolver: ColorResolver | null = null,\n): ChartModel => {\n const resolve: ColorResolver =\n resolver ??\n theme.resolve ??\n ((value, fallback) => resolveStaticColor(value, {}, fallback));\n const input = options.series;\n // resolved at every build: a page language switch shows on the next update\n const locale = resolveLocale(options.locale);\n const tooltipOptions =\n typeof options.tooltip === \"object\" ? options.tooltip : undefined;\n const labels = chartLabels(locale, {\n ...definedEntries(tooltipOptions?.labels),\n ...definedEntries(options.labels),\n });\n const datas = input.map((s) => s.data);\n const xType = options.xAxis?.type ?? detectXType(datas);\n const categories =\n xType === \"category\"\n ? [...(options.xAxis?.categories ?? collectCategories(datas))]\n : [];\n const categoryMap = new Map(categories.map((c, i) => [c, i]));\n const resolveX = xResolver(xType, (name) => categoryMap.get(name) ?? NaN);\n\n // category y axis (heatmap rows): explicit, or detected from string y values\n const yOpts = options.yAxis;\n const heatmapData = input\n .filter((s) => s.type === \"heatmap\")\n .map((s) => s.data);\n const yCategories =\n yOpts?.type === \"category\" || (!yOpts?.type && heatmapData.length)\n ? [...(yOpts?.categories ?? collectYCategories(heatmapData))]\n : [];\n const yType: ChartAxisType =\n yOpts?.type === \"category\" || yCategories.length\n ? \"category\"\n : yOpts?.type === \"time\" || (!yOpts?.type && hasDateY(datas))\n ? \"time\"\n : \"linear\";\n const yCategoryMap = new Map(yCategories.map((c, i) => [c, i]));\n const resolveY: YResolver = (v) =>\n typeof v === \"number\"\n ? v\n : typeof v === \"string\"\n ? yType === \"category\"\n ? (yCategoryMap.get(v) ?? NaN)\n : yType === \"time\"\n ? Date.parse(v)\n : Number(v)\n : v instanceof Date\n ? v.getTime()\n : NaN;\n const resolverKey = `${xType}|${categories.join(\"\\u0001\")}|${yType}|${yCategories.join(\"\\u0001\")}`;\n const percent = options.stackMode === \"percent\";\n const horizontal = options.orientation === \"horizontal\";\n\n const usedKeys = new Set<string>();\n const series: SeriesModel[] = input.map((s: ChartSeries, index) => {\n let key = s.id ?? `#${index}`;\n while (usedKeys.has(key)) key += \"'\";\n usedKeys.add(key);\n let entry = cache.get(key);\n if (!entry || entry.data !== s.data || entry.resolverKey !== resolverKey) {\n entry = {\n data: s.data,\n resolverKey,\n cols: normalizeData(s.data, resolveX, resolveY),\n };\n cache.set(key, entry);\n }\n const type = s.type ?? \"line\";\n const paletteColor = theme.palette[index % theme.palette.length];\n const color = s.color ? resolve(s.color, paletteColor) : paletteColor;\n const cols = entry.cols;\n let pointColors: (Rgba | undefined)[] | null = null;\n if (\n (type === \"scatter\" || type === \"bar\" || type === \"boxplot\") &&\n cols.colors\n ) {\n const resolved = new Map<string, Rgba>();\n pointColors = cols.colors.map((c) => {\n if (c === undefined) return undefined;\n let rgba = resolved.get(c);\n if (!rgba) resolved.set(c, (rgba = resolve(c, color)));\n return rgba;\n });\n }\n let colorScale: Rgba[] = [];\n let valueRange: Range = [0, 1];\n let cellColors: Uint32Array | null = null;\n if (type === \"heatmap\") {\n colorScale =\n s.colorScale && s.colorScale.length\n ? s.colorScale.map((c) => resolve(c, color))\n : [mix(theme.background, color, 0.08), color];\n valueRange = s.valueRange\n ? [s.valueRange[0], s.valueRange[1]]\n : [cols.valueMin, cols.valueMax];\n if (!Number.isFinite(valueRange[0])) valueRange = [0, 1];\n const values = cols.value ?? cols.y;\n const [lo, hi] = valueRange;\n const span = hi - lo || 1;\n cellColors = new Uint32Array(cols.count);\n for (let i = 0; i < cols.count; i++) {\n const v = values[i];\n if (!Number.isFinite(v) || !Number.isFinite(cols.y[i])) continue;\n // 0 means \"no cell\": a fully transparent color packs to 0 as well\n cellColors[i] = packColor(rampColor(colorScale, (v - lo) / span));\n }\n }\n const id = s.id ?? String(index);\n return {\n index,\n key,\n id,\n name: s.name ?? `${labels.series} ${index + 1}`,\n type,\n color,\n colorCss: toCss(color),\n lineWidth:\n s.lineWidth ??\n (type === \"candlestick\" ? 1 : type === \"boxplot\" ? 1.5 : 2),\n pointSize: s.pointSize ?? (type === \"boxplot\" ? 6 : 8),\n opacity:\n s.opacity ??\n (type === \"area\"\n ? 0.28\n : type === \"scatter\"\n ? 0.78\n : type === \"boxplot\"\n ? 0.22\n : 1),\n hidden: !!s.hidden || hidden.has(id),\n showLabels: !!s.showLabels,\n curve: s.curve ?? \"linear\",\n cols,\n raw: cols,\n yAxis: s.yAxis === \"right\" && !horizontal ? \"right\" : \"left\",\n floating: type === \"bar\" && !!cols.y0,\n barOffset: 0,\n barHalfWidth: 0,\n barBase: null,\n barTop: null,\n stackBase: null,\n stackTop: null,\n pointColors,\n upColor:\n type === \"candlestick\"\n ? resolve(s.upColor ?? DEFAULT_UP, [0.09, 0.64, 0.29, 1])\n : color,\n downColor:\n type === \"candlestick\"\n ? resolve(s.downColor ?? DEFAULT_DOWN, [0.86, 0.15, 0.15, 1])\n : color,\n cellColors,\n cellHalf: { x: 0.5, y: 0.5 },\n colorScale,\n valueRange,\n radius: s.radius ?? (type === \"heatmap\" ? 2 : type === \"boxplot\" ? 0 : 3),\n format: s.format,\n valueName: s.valueName,\n };\n });\n\n const visible = series.filter((s) => !s.hidden);\n const allScatter =\n series.length > 0 &&\n series.every((s) => s.type === \"scatter\" || s.type === \"heatmap\");\n\n // Bars and box plots: groups (one slot per stack) and stacking; floating\n // bars (with starts) are drawn from their starts\n const slotted = visible.filter(\n (s) => s.type === \"bar\" || s.type === \"boxplot\",\n );\n const bars = visible.filter((s) => s.type === \"bar\");\n const band = bandOf(slotted, \"x\", xType === \"category\");\n if (slotted.length) {\n const slots = new Map<string, number>();\n const stackId = (s: SeriesModel) =>\n input[s.index].stack ?? `\\u0000${s.key}`;\n for (const s of slotted) {\n if (!slots.has(stackId(s))) slots.set(stackId(s), slots.size);\n }\n let share = 0;\n for (const s of slotted) {\n const w = input[s.index].barWidth;\n if (w !== undefined && w > share) share = Math.min(1, w);\n }\n const group = band * (share || (slots.size > 1 ? 0.78 : 0.62));\n const slotWidth = group / slots.size;\n for (const s of slotted) {\n const slot = slots.get(stackId(s)) ?? 0;\n s.barOffset = -group / 2 + slotWidth * (slot + 0.5);\n s.barHalfWidth = (slotWidth / 2) * (slots.size > 1 ? 0.86 : 1);\n }\n const stackedBars = bars.filter((s) => !s.floating);\n const stacked = stackValues(\n stackedBars.map((s) => ({ s, stack: stackId(s) })),\n false,\n );\n const percentStacked = percent\n ? stackValues(\n stackedBars\n .filter((s) => input[s.index].stack !== undefined)\n .map((s) => ({ s, stack: stackId(s) })),\n true,\n )\n : [];\n let p = 0;\n stackedBars.forEach((s, k) => {\n const values =\n percent && input[s.index].stack !== undefined\n ? percentStacked[p++]\n : stacked[k];\n s.barBase = values.base;\n s.barTop = values.top;\n });\n for (const s of bars) {\n const { y, y0, count } = s.cols;\n if (!s.floating || !y0) continue;\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n const valid = Number.isFinite(y[i]);\n base[i] = valid ? (Number.isFinite(y0[i]) ? y0[i] : 0) : NaN;\n top[i] = valid ? y[i] : NaN;\n }\n s.barBase = base;\n s.barTop = top;\n }\n }\n\n // Range areas: filled down to their lower edges\n for (const s of visible) {\n if (s.type === \"area\" && s.cols.y0 && input[s.index].stack === undefined)\n s.stackBase = s.cols.y0;\n }\n\n // Stacked lines / areas\n const stackedLines = visible.filter(\n (s) =>\n (s.type === \"line\" || s.type === \"area\") &&\n input[s.index].stack !== undefined,\n );\n if (stackedLines.length) {\n const values = stackValues(\n stackedLines.map((s) => ({ s, stack: input[s.index].stack ?? \"\" })),\n percent,\n );\n stackedLines.forEach((s, k) => {\n s.stackBase = values[k].base;\n s.stackTop = values[k].top;\n });\n }\n\n // Candlesticks: one band per x, bodies of 60%\n const candles = visible.filter((s) => s.type === \"candlestick\");\n const candleBand = bandOf(candles, \"x\", xType === \"category\");\n for (const s of candles) s.barHalfWidth = candleBand * 0.3;\n\n // Heatmaps: cells of the size of the smallest step\n const heatmaps = visible.filter((s) => s.type === \"heatmap\");\n if (heatmaps.length) {\n const cx = bandOf(heatmaps, \"x\", xType === \"category\") / 2;\n const cy = bandOf(heatmaps, \"y\", yType === \"category\") / 2;\n for (const s of heatmaps) s.cellHalf = { x: cx, y: cy };\n }\n\n // X range\n const xOpts = options.xAxis;\n let xRange: Range;\n if (xType === \"category\") {\n xRange = [-0.5, Math.max(1, categories.length) - 0.5];\n } else {\n const values: number[] = [];\n for (const s of visible) {\n values.push(s.cols.xMin, s.cols.xMax);\n const pad =\n s.type === \"bar\" || s.type === \"boxplot\"\n ? band / 2\n : s.type === \"candlestick\"\n ? candleBand / 2\n : s.type === \"heatmap\"\n ? s.cellHalf.x\n : 0;\n if (pad) values.push(s.cols.xMin - pad, s.cols.xMax + pad);\n }\n xRange = ensureSpan(\n ...extent(values),\n xType === \"time\" ? [Date.now() - 86400000, Date.now()] : [0, 1],\n );\n const pointsOnly = series.every((s) => s.type === \"scatter\");\n if (pointsOnly) {\n const pad = (xRange[1] - xRange[0]) * 0.04;\n xRange = [xRange[0] - pad, xRange[1] + pad];\n }\n const nice = xOpts?.nice ?? (pointsOnly && xType === \"linear\");\n if (nice && xType === \"linear\") {\n xRange = niceDomain(xRange[0], xRange[1], xOpts?.tickCount ?? 6);\n }\n }\n if (xOpts?.min !== undefined) xRange[0] = xOpts.min;\n if (xOpts?.max !== undefined) xRange[1] = xOpts.max;\n xRange = ensureSpan(xRange[0], xRange[1]);\n\n // Y range (left axis: the series of the right axis are mapped onto it)\n const valuesOf = (list: SeriesModel[], zero: boolean | undefined) => {\n const values: number[] = [];\n for (const s of list) {\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n values.push(...extent(s.barBase), ...extent(s.barTop));\n } else if (s.stackBase && s.stackTop) {\n values.push(...extent(s.stackBase), ...extent(s.stackTop));\n } else if (s.type === \"heatmap\") {\n values.push(s.cols.yMin - s.cellHalf.y, s.cols.yMax + s.cellHalf.y);\n } else {\n values.push(s.cols.yMin, s.cols.yMax);\n }\n }\n const listBars = list.filter((s) => s.type === \"bar\");\n if (listBars.some((s) => !s.floating) || zero) values.push(0);\n if (listBars.some((s) => s.showLabels)) {\n // room for the value labels above the tallest bar\n const [lo, hi] = extent(values);\n if (hi > 0) values.push(hi + (hi - Math.min(0, lo)) * 0.1);\n if (lo < 0) values.push(lo - (Math.max(0, hi) - lo) * 0.1);\n }\n return values;\n };\n const leftVisible = visible.filter((s) => s.yAxis === \"left\");\n const leftSeries = leftVisible.length ? leftVisible : visible;\n const leftBars = leftSeries.filter((s) => s.type === \"bar\");\n let yRange: Range;\n if (yType === \"category\") {\n yRange = [-0.5, Math.max(1, yCategories.length) - 0.5];\n } else {\n const yValues = valuesOf(leftSeries, yOpts?.zero);\n const filled =\n leftBars.length > 0 || leftSeries.some((s) => s.type === \"area\");\n yRange = ensureSpan(...extent(yValues));\n if (series.every((s) => s.type === \"scatter\")) {\n const pad = (yRange[1] - yRange[0]) * 0.06;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n } else if (\n (candles.length || leftSeries.some((s) => s.type === \"boxplot\")) &&\n !leftBars.length\n ) {\n // room above / below the wicks and the outliers\n const pad = (yRange[1] - yRange[0]) * 0.04;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n }\n if ((yOpts?.nice ?? !heatmaps.length) && yType === \"linear\") {\n yRange = niceDomain(yRange[0], yRange[1], yOpts?.tickCount ?? 5);\n }\n if (percent && (bars.length || stackedLines.length)) {\n // 100% stacks: exactly 0-100 (or -100-100)\n yRange = [extent(yValues)[0] < 0 ? -100 : 0, 100];\n }\n if (filled && !yOpts?.zero) {\n // bars start at zero: no padding below / above it\n if (yRange[0] < 0 && extent(yValues)[0] >= 0) yRange[0] = 0;\n }\n }\n if (yOpts?.min !== undefined) yRange[0] = yOpts.min;\n if (yOpts?.max !== undefined) yRange[1] = yOpts.max;\n yRange = ensureSpan(yRange[0], yRange[1]);\n\n // Right axis: a range aligned on the left ticks; its series are mapped\n // onto the left axis\n const y2Opts = options.yAxis2;\n let y2: AxisModel | null = null;\n let y2Map: AxisMap | null = null;\n const rightSeries = series.filter((s) => s.yAxis === \"right\");\n if (rightSeries.length && yType !== \"category\") {\n const rightVisible = rightSeries.filter((s) => !s.hidden);\n const values = valuesOf(rightVisible, y2Opts?.zero);\n const [lo, hi] = ensureSpan(...extent(values));\n let domain: Range =\n y2Opts?.nice === false\n ? [lo, hi]\n : alignedDomain(lo, hi, yRange, yOpts?.tickCount ?? 5);\n if (y2Opts?.min !== undefined) domain[0] = y2Opts.min;\n if (y2Opts?.max !== undefined) domain[1] = y2Opts.max;\n domain = ensureSpan(domain[0], domain[1]);\n const scale = (yRange[1] - yRange[0]) / (domain[1] - domain[0]);\n const map: AxisMap = { scale, offset: yRange[0] - domain[0] * scale };\n y2Map = map;\n const f = (v: number) => v * map.scale + map.offset;\n const column = (a: Float64Array | null) => (a ? a.map(f) : null);\n const zero = f(Math.min(Math.max(0, domain[0]), domain[1]));\n for (const s of rightSeries) {\n const rawBase = s.stackBase;\n s.cols = mapColumns(s.raw, map);\n s.barBase = column(s.barBase);\n s.barTop = column(s.barTop);\n s.stackTop = column(s.stackTop);\n s.stackBase =\n rawBase && rawBase === s.raw.y0\n ? s.cols.y0\n : rawBase\n ? column(rawBase)\n : s.type === \"area\"\n ? new Float64Array(s.cols.count).fill(zero)\n : null;\n }\n y2 = axisModel(y2Opts, \"linear\", [], false, locale);\n }\n\n const zoomOption =\n options.interaction === false\n ? false\n : options.interaction === true || options.interaction === undefined\n ? true\n : (options.interaction.zoom ?? true);\n const zoomAxes =\n zoomOption === false\n ? { x: false, y: false }\n : zoomOption === true\n ? { x: true, y: allScatter }\n : { x: zoomOption.includes(\"x\"), y: zoomOption.includes(\"y\") };\n\n const yFormat =\n yOpts?.format ??\n (percent && (bars.length || stackedLines.length)\n ? (v: number) => formatPercent(v, locale)\n : undefined);\n\n return {\n series,\n x: axisModel(xOpts, xType, categories, false, locale),\n y: {\n ...axisModel(yOpts, yType, yCategories, yType !== \"category\", locale),\n format: yFormat,\n },\n y2,\n y2Map,\n horizontal,\n locale,\n labels,\n formatValue: valueFormatter(locale),\n base: { x: xRange, y: yRange },\n allScatter,\n zoom: zoomAxes,\n tooltipMode: tooltipOptions?.mode ?? (allScatter ? \"nearest\" : \"axis\"),\n baseline: Math.min(Math.max(0, yRange[0]), yRange[1]),\n minSpan: {\n x: xType === \"category\" ? 1 : (xRange[1] - xRange[0]) * 1e-7,\n y: yType === \"category\" ? 1 : (yRange[1] - yRange[0]) * 1e-7,\n },\n percent,\n stacks: input.map((s) =>\n s.stack !== undefined &&\n (s.type === \"bar\" || s.type === \"line\" || s.type === \"area\" || !s.type)\n ? `${s.type === \"bar\" ? \"bar\" : \"line\"}:${s.stack}`\n : null,\n ),\n };\n};\n\n/** Y value drawn for a point: its stacked top for stacks, the close for candles */\nexport const plottedY = (s: SeriesModel, i: number): number =>\n s.barTop ? s.barTop[i] : s.stackTop ? s.stackTop[i] : s.cols.y[i];\n\nconst grids = new WeakMap<SeriesColumns, GridIndex>();\n\n/** Spatial index of a scatter series, built on first use and kept with its data */\nexport const gridOf = (s: SeriesModel): GridIndex => {\n let grid = grids.get(s.cols);\n if (!grid) {\n grid = new GridIndex(s.cols.x, s.cols.y, s.cols.count);\n grids.set(s.cols, grid);\n }\n return grid;\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- var e=(e,t=e.fontSize,n=400)=>`${n} ${t}px ${e.fontFamily}`,t=(e,t,n,r)=>{let{plot:i}=t,a=e.x===void 0?i.x+i.width/2:t.xToPx(e.x),o=e.y===void 0?i.y+i.height/2:t.yToPx(e.y),s=a-n/2,c=o-r/2;return e.anchor===`top`?c=o+6:e.anchor===`bottom`?c=o-6-r:e.anchor===`left`?s=a+6:e.anchor===`right`&&(s=a-6-n),s=Math.max(i.x+6,Math.min(s,i.x+i.width-6-n)),c=Math.max(i.y+2,Math.min(c,i.y+i.height-2-r)),{x:s,y:c,width:n,height:r}},n=(e,t)=>e.x<t.x+t.width&&t.x<e.x+e.width&&e.y<t.y+t.height&&t.y<e.y+e.height,r=(e,t)=>e.x>=t.x&&e.y>=t.y&&e.x+e.width<=t.x+t.width&&e.y+e.height<=t.y+t.height,i=(e,t,i,a,o=[])=>{let s=[];for(let c of e){let e=i(c.text),l=c.r+4,u={x:c.x-e/2,y:c.y-l-a,width:e,height:a},d={x:c.x-e/2,y:c.y+l,width:e,height:a},f=(c.placement===`above`?[u]:c.placement===`below`?[d]:[{x:c.x+l,y:c.y-a/2,width:e,height:a},{x:c.x-l-e,y:c.y-a/2,width:e,height:a},u,d]).find(e=>r(e,t)&&!o.some(t=>n(t,e)));f&&(o.push(f),s.push({label:c,box:f}))}return s};exports.font=e,exports.placeLabels=i,exports.textBox=t;
1
+ const e=require("./layout.cjs");var t=(e,t=e.fontSize,n=400)=>`${n} ${t}px ${e.fontFamily}`,n=(t,n,r,i)=>{let{plot:a}=n,o=e.toScreen(n,t.x??0,t.y??0),s=n.horizontal?{x:t.y===void 0,y:t.x===void 0}:{x:t.x===void 0,y:t.y===void 0},c=s.x?a.x+a.width/2:o.x,l=s.y?a.y+a.height/2:o.y,u=c-r/2,d=l-i/2;return t.anchor===`top`?d=l+6:t.anchor===`bottom`?d=l-6-i:t.anchor===`left`?u=c+6:t.anchor===`right`&&(u=c-6-r),u=Math.max(a.x+6,Math.min(u,a.x+a.width-6-r)),d=Math.max(a.y+2,Math.min(d,a.y+a.height-2-i)),{x:u,y:d,width:r,height:i}},r=(t,n)=>{let{plot:r}=n,[i,a]=n.horizontal?[r.y,r.y+r.height]:[r.x,r.x+r.width],[o,s]=n.horizontal?[r.x,r.x+r.width]:[r.y,r.y+r.height],c=(e,t,n)=>e<t?t:e>n?n:e;return e.screenRect(n,c(n.xToPx(t.x0??-1/0),i,a),c(n.xToPx(t.x1??1/0),i,a),c(n.yToPx(t.y0??-1/0),o,s),c(n.yToPx(t.y1??1/0),o,s))},i=(e,t)=>({vertical:e.axis===`x`!==t.horizontal,at:e.axis===`x`?t.xToPx(e.value):t.yToPx(e.value)}),a=(e,t)=>e.x<t.x+t.width&&t.x<e.x+e.width&&e.y<t.y+t.height&&t.y<e.y+e.height,o=(e,t)=>e.x>=t.x&&e.y>=t.y&&e.x+e.width<=t.x+t.width&&e.y+e.height<=t.y+t.height,s=(e,t,n,r,i=[])=>{let s=[];for(let c of e){let e=n(c.text),l=c.r+4,u={x:c.x-e/2,y:c.y-l-r,width:e,height:r},d={x:c.x-e/2,y:c.y+l,width:e,height:r},f={x:c.x+l,y:c.y-r/2,width:e,height:r},p={x:c.x-l-e,y:c.y-r/2,width:e,height:r},m=(c.placement===`above`?[u]:c.placement===`below`?[d]:c.placement===`right`?[f,p]:c.placement===`left`?[p,f]:[{x:c.x+l,y:c.y-r/2,width:e,height:r},{x:c.x-l-e,y:c.y-r/2,width:e,height:r},u,d]).find(e=>o(e,t)&&!i.some(t=>a(t,e)));m&&(i.push(m),s.push({label:c,box:m}))}return s};exports.font=t,exports.lineOf=i,exports.placeLabels=s,exports.rectOf=r,exports.textBox=n;
2
2
  //# sourceMappingURL=overlay.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.cjs","names":["font","theme","weight","size","textBox","s","px","a","plot","py","x","width","y","height","overlaps","b","inside","r","placeLabels","placed","label","labels","w","measure","gap","above","below","box","c","occupied","o"],"sources":["../../../../../../charts/src/engine/overlay.ts"],"sourcesContent":["// Canvas2D layers around the data: background (areas, grid, axes, tick\n// labels) and foreground (reference lines, annotation and point labels).\n\nimport { toCss, type Rgba } from \"./color\";\nimport type { AxisTicks } from \"./axis\";\nimport type { Rect, Scales } from \"./layout\";\nimport type { AxisModel } from \"./model\";\nimport type { ChartTheme } from \"./theme\";\nimport type { ChartLabelPosition } from \"./types\";\n\nexport interface ResolvedRect {\n type: \"rect\";\n x0?: number;\n x1?: number;\n y0?: number;\n y1?: number;\n color: Rgba;\n opacity: number;\n label?: string;\n labelPosition: ChartLabelPosition;\n labelColor: Rgba;\n}\n\nexport interface ResolvedLine {\n type: \"line\";\n axis: \"x\" | \"y\";\n value: number;\n color: Rgba;\n width: number;\n dash: number[];\n label?: string;\n}\n\nexport interface ResolvedText {\n type: \"text\";\n x?: number;\n y?: number;\n text: string;\n anchor: \"center\" | \"top\" | \"bottom\" | \"left\" | \"right\";\n color: Rgba;\n weight: number;\n}\n\nexport type ResolvedAnnotation = ResolvedRect | ResolvedLine | ResolvedText;\n\nexport interface PointLabel {\n x: number;\n y: number;\n /** Radius of the dot */\n r: number;\n text: string;\n /** Fixed side (bar values); any free side around the dot otherwise */\n placement?: \"above\" | \"below\";\n}\n\nexport const font = (theme: ChartTheme, size = theme.fontSize, weight = 400) =>\n `${weight} ${size}px ${theme.fontFamily}`;\n\nconst crisp = (v: number) => Math.round(v) + 0.5;\n\n/** Box of a text annotation, kept inside the plot */\nexport const textBox = (\n a: ResolvedText,\n s: Scales,\n width: number,\n height: number,\n): Rect => {\n const { plot } = s;\n const px = a.x === undefined ? plot.x + plot.width / 2 : s.xToPx(a.x);\n const py = a.y === undefined ? plot.y + plot.height / 2 : s.yToPx(a.y);\n const gap = 6;\n let x = px - width / 2;\n let y = py - height / 2;\n if (a.anchor === \"top\") y = py + gap;\n else if (a.anchor === \"bottom\") y = py - gap - height;\n else if (a.anchor === \"left\") x = px + gap;\n else if (a.anchor === \"right\") x = px - gap - width;\n x = Math.max(plot.x + gap, Math.min(x, plot.x + plot.width - gap - width));\n y = Math.max(plot.y + 2, Math.min(y, plot.y + plot.height - 2 - height));\n return { x, y, width, height };\n};\n\nconst rectOf = (a: ResolvedRect, s: Scales): Rect => {\n const { plot } = s;\n const xa = a.x0 === undefined ? -Infinity : s.xToPx(a.x0);\n const xb = a.x1 === undefined ? Infinity : s.xToPx(a.x1);\n const ya = a.y0 === undefined ? Infinity : s.yToPx(a.y0);\n const yb = a.y1 === undefined ? -Infinity : s.yToPx(a.y1);\n const left = Math.max(plot.x, Math.min(xa, xb));\n const right = Math.min(plot.x + plot.width, Math.max(xa, xb));\n const top = Math.max(plot.y, Math.min(ya, yb));\n const bottom = Math.min(plot.y + plot.height, Math.max(ya, yb));\n return { x: left, y: top, width: right - left, height: bottom - top };\n};\n\nexport interface BackgroundInput {\n width: number;\n height: number;\n scales: Scales;\n x: AxisModel;\n y: AxisModel;\n xTicks: AxisTicks;\n yTicks: AxisTicks;\n theme: ChartTheme;\n annotations: readonly ResolvedAnnotation[];\n}\n\nexport const drawBackground = (\n ctx: CanvasRenderingContext2D,\n input: BackgroundInput,\n) => {\n const { scales, theme, x, y, xTicks, yTicks } = input;\n const { plot } = scales;\n ctx.clearRect(0, 0, input.width, input.height);\n\n // areas\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n for (const a of input.annotations) {\n if (a.type !== \"rect\") continue;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) continue;\n ctx.fillStyle = toCss(a.color, a.opacity);\n ctx.fillRect(r.x, r.y, r.width, r.height);\n }\n ctx.restore();\n\n // grid\n ctx.lineWidth = 1;\n ctx.strokeStyle = toCss(theme.grid);\n ctx.beginPath();\n if (y.grid) {\n for (const v of yTicks.values) {\n const py = crisp(scales.yToPx(v));\n if (py < plot.y - 1 || py > plot.y + plot.height + 1) continue;\n ctx.moveTo(plot.x, py);\n ctx.lineTo(plot.x + plot.width, py);\n }\n }\n if (x.grid) {\n for (const v of xTicks.values) {\n const px = crisp(scales.xToPx(v));\n if (px < plot.x - 1 || px > plot.x + plot.width + 1) continue;\n ctx.moveTo(px, plot.y);\n ctx.lineTo(px, plot.y + plot.height);\n }\n }\n ctx.stroke();\n\n const line = Math.ceil(theme.fontSize * 1.4);\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n\n // x axis\n if (x.visible) {\n ctx.strokeStyle = toCss(theme.axis);\n ctx.beginPath();\n const base = crisp(plot.y + plot.height);\n ctx.moveTo(plot.x, base);\n ctx.lineTo(plot.x + plot.width, base);\n ctx.stroke();\n ctx.textBaseline = \"top\";\n ctx.textAlign = \"center\";\n let lastRight = -Infinity;\n // left to right (reversed axes list their ticks right to left)\n const order = xTicks.values\n .map((v, i) => ({ px: scales.xToPx(v), text: xTicks.labels[i] }))\n .sort((a, b) => a.px - b.px);\n for (const { px, text } of order) {\n if (px < plot.x - 0.5 || px > plot.x + plot.width + 0.5) continue;\n const w = ctx.measureText(text).width;\n const left = Math.max(0, Math.min(input.width - w, px - w / 2));\n if (left < lastRight + 6) continue;\n lastRight = left + w;\n ctx.fillText(text, left + w / 2, plot.y + plot.height + 7);\n }\n if (x.title) {\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.fillText(\n x.title,\n plot.x + plot.width / 2,\n plot.y + plot.height + line + 10,\n );\n }\n }\n\n // y axis\n if (y.visible) {\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n yTicks.values.forEach((v, i) => {\n const py = scales.yToPx(v);\n if (py < plot.y - 0.5 || py > plot.y + plot.height + 0.5) return;\n ctx.fillText(yTicks.labels[i], plot.x - 8, py);\n });\n if (y.title) {\n ctx.save();\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.translate(line / 2 + 4, plot.y + plot.height / 2);\n ctx.rotate(-Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.fillText(y.title, 0, 0);\n ctx.restore();\n }\n }\n};\n\nconst overlaps = (a: Rect, b: Rect) =>\n a.x < b.x + b.width &&\n b.x < a.x + a.width &&\n a.y < b.y + b.height &&\n b.y < a.y + a.height;\n\nconst inside = (r: Rect, plot: Rect) =>\n r.x >= plot.x &&\n r.y >= plot.y &&\n r.x + r.width <= plot.x + plot.width &&\n r.y + r.height <= plot.y + plot.height;\n\n/** Text with a halo in the background color (readable over data) */\nconst haloText = (\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n color: string,\n halo: string,\n) => {\n ctx.lineWidth = 3;\n ctx.lineJoin = \"round\";\n ctx.strokeStyle = halo;\n ctx.strokeText(text, x, y);\n ctx.fillStyle = color;\n ctx.fillText(text, x, y);\n};\n\n/** Greedy placement: right, left, above, below the dot; skipped when no slot is free */\nexport const placeLabels = (\n labels: readonly PointLabel[],\n plot: Rect,\n measure: (text: string) => number,\n height: number,\n occupied: Rect[] = [],\n): { label: PointLabel; box: Rect }[] => {\n const placed: { label: PointLabel; box: Rect }[] = [];\n for (const label of labels) {\n const w = measure(label.text);\n const gap = label.r + 4;\n const above = {\n x: label.x - w / 2,\n y: label.y - gap - height,\n width: w,\n height,\n };\n const below = { x: label.x - w / 2, y: label.y + gap, width: w, height };\n const candidates: Rect[] =\n label.placement === \"above\"\n ? [above]\n : label.placement === \"below\"\n ? [below]\n : [\n { x: label.x + gap, y: label.y - height / 2, width: w, height },\n {\n x: label.x - gap - w,\n y: label.y - height / 2,\n width: w,\n height,\n },\n above,\n below,\n ];\n const box = candidates.find(\n (c) => inside(c, plot) && !occupied.some((o) => overlaps(o, c)),\n );\n if (!box) continue;\n occupied.push(box);\n placed.push({ label, box });\n }\n return placed;\n};\n\nexport interface ForegroundInput {\n width: number;\n height: number;\n scales: Scales;\n theme: ChartTheme;\n annotations: readonly ResolvedAnnotation[];\n pointLabels: readonly PointLabel[];\n /**\n * Clears the canvas first (off when the layers share one canvas)\n * @default true\n */\n clear?: boolean;\n}\n\nexport const drawForeground = (\n ctx: CanvasRenderingContext2D,\n input: ForegroundInput,\n) => {\n const { scales, theme } = input;\n const { plot } = scales;\n if (input.clear !== false) ctx.clearRect(0, 0, input.width, input.height);\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n\n const halo = toCss(theme.background, 0.9);\n const occupied: Rect[] = [];\n const labelHeight = theme.fontSize + 4;\n\n for (const a of input.annotations) {\n if (a.type !== \"line\") continue;\n const color = toCss(a.color);\n ctx.strokeStyle = color;\n ctx.lineWidth = a.width;\n ctx.setLineDash(a.dash);\n ctx.beginPath();\n if (a.axis === \"y\") {\n const py = crisp(scales.yToPx(a.value));\n ctx.moveTo(plot.x, py);\n ctx.lineTo(plot.x + plot.width, py);\n ctx.stroke();\n if (a.label) {\n ctx.setLineDash([]);\n ctx.font = font(theme, theme.fontSize, 500);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"bottom\";\n haloText(ctx, a.label, plot.x + plot.width - 6, py - 3, color, halo);\n }\n } else {\n const px = crisp(scales.xToPx(a.value));\n ctx.moveTo(px, plot.y);\n ctx.lineTo(px, plot.y + plot.height);\n ctx.stroke();\n if (a.label) {\n ctx.setLineDash([]);\n ctx.font = font(theme, theme.fontSize, 500);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n haloText(ctx, a.label, px + 5, plot.y + 5, color, halo);\n }\n }\n }\n ctx.setLineDash([]);\n\n // labels of areas\n ctx.font = font(theme, theme.fontSize + 1, 600);\n for (const a of input.annotations) {\n if (a.type !== \"rect\" || !a.label) continue;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) continue;\n const pad = 10;\n const w = ctx.measureText(a.label).width;\n const pos = a.labelPosition;\n const tx = pos.endsWith(\"left\")\n ? r.x + pad\n : pos.endsWith(\"right\")\n ? r.x + r.width - pad - w\n : r.x + (r.width - w) / 2;\n const ty = pos.startsWith(\"top\")\n ? r.y + pad\n : pos.startsWith(\"bottom\")\n ? r.y + r.height - pad - labelHeight\n : r.y + (r.height - labelHeight) / 2;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n ctx.fillStyle = toCss(a.labelColor);\n ctx.fillText(a.label, tx, ty);\n occupied.push({ x: tx, y: ty, width: w, height: labelHeight });\n }\n\n // free texts\n for (const a of input.annotations) {\n if (a.type !== \"text\" || !a.text) continue;\n ctx.font = font(theme, theme.fontSize, a.weight);\n const box = textBox(a, scales, ctx.measureText(a.text).width, labelHeight);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n haloText(ctx, a.text, box.x, box.y + box.height / 2, toCss(a.color), halo);\n occupied.push(box);\n }\n\n // point labels\n if (input.pointLabels.length) {\n ctx.font = font(theme);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n const textColor = toCss(theme.text, 0.85);\n const placed = placeLabels(\n input.pointLabels,\n plot,\n (t) => ctx.measureText(t).width,\n labelHeight - 2,\n occupied,\n );\n for (const { label, box } of placed) {\n haloText(ctx, label.text, box.x, box.y + box.height / 2, textColor, halo);\n }\n }\n ctx.restore();\n};\n"],"mappings":"AAuDA,IAAaA,GAAQ,EAAmB,EAAOC,EAAM,SAAU,EAAS,MACtE,GAAGC,EAAO,GAAGC,EAAK,KAAKF,EAAM,aAKlBG,GACX,EACA,EACA,EACA,IACS,CACT,GAAM,CAAE,QAASC,EACXC,EAAKC,EAAE,IAAM,IAAA,GAAYC,EAAK,EAAIA,EAAK,MAAQ,EAAIH,EAAE,MAAME,EAAE,CAAC,EAC9DE,EAAKF,EAAE,IAAM,IAAA,GAAYC,EAAK,EAAIA,EAAK,OAAS,EAAIH,EAAE,MAAME,EAAE,CAAC,EAEjEG,EAAIJ,EAAKK,EAAQ,EACjBC,EAAIH,EAAKI,EAAS,EAOtB,OANIN,EAAE,SAAW,MAAO,EAAIE,EAAK,EACxBF,EAAE,SAAW,SAAU,EAAIE,EAAK,EAAMI,EACtCN,EAAE,SAAW,OAAQ,EAAID,EAAK,EAC9BC,EAAE,SAAW,UAAS,EAAID,EAAK,EAAMK,GAC9C,EAAI,KAAK,IAAIH,EAAK,EAAI,EAAK,KAAK,IAAIE,EAAGF,EAAK,EAAIA,EAAK,MAAQ,EAAMG,CAAK,CAAC,EACzE,EAAI,KAAK,IAAIH,EAAK,EAAI,EAAG,KAAK,IAAII,EAAGJ,EAAK,EAAIA,EAAK,OAAS,EAAIK,CAAM,CAAC,EAChE,CAAE,IAAG,IAAG,QAAO,QAAO,CAC/B,EAqIMC,GAAY,EAAS,IACzBP,EAAE,EAAIQ,EAAE,EAAIA,EAAE,OACdA,EAAE,EAAIR,EAAE,EAAIA,EAAE,OACdA,EAAE,EAAIQ,EAAE,EAAIA,EAAE,QACdA,EAAE,EAAIR,EAAE,EAAIA,EAAE,OAEVS,GAAU,EAAS,IACvBC,EAAE,GAAKT,EAAK,GACZS,EAAE,GAAKT,EAAK,GACZS,EAAE,EAAIA,EAAE,OAAST,EAAK,EAAIA,EAAK,OAC/BS,EAAE,EAAIA,EAAE,QAAUT,EAAK,EAAIA,EAAK,OAoBrBU,GACX,EACA,EACA,EACA,EACA,EAAmB,CAAC,IACmB,CACvC,IAAMC,EAA6C,CAAC,EACpD,IAAK,IAAMC,KAASC,EAAQ,CAC1B,IAAMC,EAAIC,EAAQH,EAAM,IAAI,EACtBI,EAAMJ,EAAM,EAAI,EAChBK,EAAQ,CACZ,EAAGL,EAAM,EAAIE,EAAI,EACjB,EAAGF,EAAM,EAAII,EAAMX,EACnB,MAAOS,EACP,QACF,EACMI,EAAQ,CAAE,EAAGN,EAAM,EAAIE,EAAI,EAAG,EAAGF,EAAM,EAAII,EAAK,MAAOF,EAAG,QAAO,EAiBjEK,GAfJP,EAAM,YAAc,QAChB,CAACK,CAAK,EACNL,EAAM,YAAc,QAClB,CAACM,CAAK,EACN,CACE,CAAE,EAAGN,EAAM,EAAII,EAAK,EAAGJ,EAAM,EAAIP,EAAS,EAAG,MAAOS,EAAG,QAAO,EAC9D,CACE,EAAGF,EAAM,EAAII,EAAMF,EACnB,EAAGF,EAAM,EAAIP,EAAS,EACtB,MAAOS,EACP,QACF,EACAG,EACAC,CACF,EAAA,CACe,KACpB,GAAMV,EAAOY,EAAGpB,CAAI,GAAK,CAACqB,EAAS,KAAM,GAAMf,EAASgB,EAAGF,CAAC,CAAC,CAChE,EACKD,IACLE,EAAS,KAAKF,CAAG,EACjBR,EAAO,KAAK,CAAE,QAAO,KAAI,CAAC,EAC5B,CACA,OAAOA,CACT"}
1
+ {"version":3,"file":"overlay.cjs","names":["toScreen","screenRect","require_layout","font","theme","weight","size","textBox","s","at","a","free","px","plot","py","x","width","y","height","rectOf","xLo","xHi","yLo","yHi","along","lo","hi","lineOf","overlaps","b","inside","r","placeLabels","placed","label","labels","w","measure","gap","above","below","right","left","box","c","occupied","o"],"sources":["../../../../../../charts/src/engine/overlay.ts"],"sourcesContent":["// Canvas2D layers around the data: background (areas, grid, axes, tick\n// labels) and foreground (reference lines, annotation and point labels).\n\nimport { toCss, type Rgba } from \"./color\";\nimport type { AxisTicks } from \"./axis\";\nimport { screenRect, toScreen, type Rect, type Scales } from \"./layout\";\nimport type { AxisModel } from \"./model\";\nimport type { ChartTheme } from \"./theme\";\nimport type { ChartLabelPosition } from \"./types\";\n\nexport interface ResolvedRect {\n type: \"rect\";\n x0?: number;\n x1?: number;\n y0?: number;\n y1?: number;\n color: Rgba;\n opacity: number;\n label?: string;\n labelPosition: ChartLabelPosition;\n labelColor: Rgba;\n}\n\nexport interface ResolvedLine {\n type: \"line\";\n axis: \"x\" | \"y\";\n value: number;\n color: Rgba;\n width: number;\n dash: number[];\n label?: string;\n}\n\nexport interface ResolvedText {\n type: \"text\";\n x?: number;\n y?: number;\n text: string;\n anchor: \"center\" | \"top\" | \"bottom\" | \"left\" | \"right\";\n color: Rgba;\n weight: number;\n}\n\nexport type ResolvedAnnotation = ResolvedRect | ResolvedLine | ResolvedText;\n\nexport interface PointLabel {\n x: number;\n y: number;\n /** Radius of the dot */\n r: number;\n text: string;\n /**\n * Fixed side (bar values: above / below, left / right of horizontal\n * bars); any free side around the dot otherwise\n */\n placement?: \"above\" | \"below\" | \"left\" | \"right\";\n}\n\nexport const font = (theme: ChartTheme, size = theme.fontSize, weight = 400) =>\n `${weight} ${size}px ${theme.fontFamily}`;\n\nconst crisp = (v: number) => Math.round(v) + 0.5;\n\n/** Box of a text annotation, kept inside the plot */\nexport const textBox = (\n a: ResolvedText,\n s: Scales,\n width: number,\n height: number,\n): Rect => {\n const { plot } = s;\n const at = toScreen(s, a.x ?? 0, a.y ?? 0);\n const free = s.horizontal\n ? { x: a.y === undefined, y: a.x === undefined }\n : { x: a.x === undefined, y: a.y === undefined };\n const px = free.x ? plot.x + plot.width / 2 : at.x;\n const py = free.y ? plot.y + plot.height / 2 : at.y;\n const gap = 6;\n let x = px - width / 2;\n let y = py - height / 2;\n if (a.anchor === \"top\") y = py + gap;\n else if (a.anchor === \"bottom\") y = py - gap - height;\n else if (a.anchor === \"left\") x = px + gap;\n else if (a.anchor === \"right\") x = px - gap - width;\n x = Math.max(plot.x + gap, Math.min(x, plot.x + plot.width - gap - width));\n y = Math.max(plot.y + 2, Math.min(y, plot.y + plot.height - 2 - height));\n return { x, y, width, height };\n};\n\n/** Screen box of an area annotation, clipped to the plot */\nexport const rectOf = (a: ResolvedRect, s: Scales): Rect => {\n const { plot } = s;\n // clamp every edge to the plot first: an open edge maps to ±Infinity and\n // `Infinity - Infinity` would make the size NaN (nothing drawn)\n const [xLo, xHi] = s.horizontal\n ? [plot.y, plot.y + plot.height]\n : [plot.x, plot.x + plot.width];\n const [yLo, yHi] = s.horizontal\n ? [plot.x, plot.x + plot.width]\n : [plot.y, plot.y + plot.height];\n const along = (px: number, lo: number, hi: number) =>\n px < lo ? lo : px > hi ? hi : px;\n return screenRect(\n s,\n along(s.xToPx(a.x0 ?? -Infinity), xLo, xHi),\n along(s.xToPx(a.x1 ?? Infinity), xLo, xHi),\n along(s.yToPx(a.y0 ?? -Infinity), yLo, yHi),\n along(s.yToPx(a.y1 ?? Infinity), yLo, yHi),\n );\n};\n\n/**\n * Where a reference line goes: `vertical` lines run at screen x `at`,\n * horizontal ones at screen y `at`\n */\nexport const lineOf = (\n a: ResolvedLine,\n s: Scales,\n): { vertical: boolean; at: number } => {\n const vertical = (a.axis === \"x\") !== s.horizontal;\n return {\n vertical,\n at: a.axis === \"x\" ? s.xToPx(a.value) : s.yToPx(a.value),\n };\n};\n\nexport interface BackgroundInput {\n width: number;\n height: number;\n scales: Scales;\n x: AxisModel;\n y: AxisModel;\n xTicks: AxisTicks;\n yTicks: AxisTicks;\n /** Right axis (dual axis charts) */\n y2?: AxisModel | null;\n y2Ticks?: AxisTicks | null;\n theme: ChartTheme;\n annotations: readonly ResolvedAnnotation[];\n}\n\nexport const drawBackground = (\n ctx: CanvasRenderingContext2D,\n input: BackgroundInput,\n) => {\n const { scales, theme, xTicks, yTicks } = input;\n const { plot } = scales;\n // horizontal charts: the value axis along the bottom, the x axis on the left\n const x = scales.horizontal ? input.y : input.x;\n const y = scales.horizontal ? input.x : input.y;\n const bottomTicks = scales.horizontal ? yTicks : xTicks;\n const leftTicks = scales.horizontal ? xTicks : yTicks;\n const bottomPx = scales.horizontal ? scales.yToPx : scales.xToPx;\n const leftPx = scales.horizontal ? scales.xToPx : scales.yToPx;\n ctx.clearRect(0, 0, input.width, input.height);\n\n // areas\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n for (const a of input.annotations) {\n if (a.type !== \"rect\") continue;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) continue;\n ctx.fillStyle = toCss(a.color, a.opacity);\n ctx.fillRect(r.x, r.y, r.width, r.height);\n }\n ctx.restore();\n\n // grid\n ctx.lineWidth = 1;\n ctx.strokeStyle = toCss(theme.grid);\n ctx.beginPath();\n if (y.grid) {\n for (const v of leftTicks.values) {\n const py = crisp(leftPx(v));\n if (py < plot.y - 1 || py > plot.y + plot.height + 1) continue;\n ctx.moveTo(plot.x, py);\n ctx.lineTo(plot.x + plot.width, py);\n }\n }\n if (x.grid) {\n for (const v of bottomTicks.values) {\n const px = crisp(bottomPx(v));\n if (px < plot.x - 1 || px > plot.x + plot.width + 1) continue;\n ctx.moveTo(px, plot.y);\n ctx.lineTo(px, plot.y + plot.height);\n }\n }\n ctx.stroke();\n\n const line = Math.ceil(theme.fontSize * 1.4);\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n\n // x axis\n if (x.visible) {\n ctx.strokeStyle = toCss(theme.axis);\n ctx.beginPath();\n const base = crisp(plot.y + plot.height);\n ctx.moveTo(plot.x, base);\n ctx.lineTo(plot.x + plot.width, base);\n ctx.stroke();\n ctx.textBaseline = \"top\";\n ctx.textAlign = \"center\";\n let lastRight = -Infinity;\n // left to right (reversed axes list their ticks right to left)\n const order = bottomTicks.values\n .map((v, i) => ({ px: bottomPx(v), text: bottomTicks.labels[i] }))\n .sort((a, b) => a.px - b.px);\n for (const { px, text } of order) {\n if (px < plot.x - 0.5 || px > plot.x + plot.width + 0.5) continue;\n const w = ctx.measureText(text).width;\n const left = Math.max(0, Math.min(input.width - w, px - w / 2));\n if (left < lastRight + 6) continue;\n lastRight = left + w;\n ctx.fillText(text, left + w / 2, plot.y + plot.height + 7);\n }\n if (x.title) {\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.fillText(\n x.title,\n plot.x + plot.width / 2,\n plot.y + plot.height + line + 10,\n );\n }\n }\n\n // y axis\n if (y.visible) {\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n let lastBottom = -Infinity;\n // top to bottom: category rows of horizontal charts never overlap\n const rows = leftTicks.values\n .map((v, i) => ({ py: leftPx(v), text: leftTicks.labels[i] }))\n .sort((a, b) => a.py - b.py);\n const rowHeight = theme.fontSize + 2;\n for (const { py, text } of rows) {\n if (py < plot.y - 0.5 || py > plot.y + plot.height + 0.5) continue;\n if (scales.horizontal) {\n if (py - rowHeight / 2 < lastBottom) continue;\n lastBottom = py + rowHeight / 2;\n }\n ctx.fillText(text, plot.x - 8, py);\n }\n if (y.title) {\n ctx.save();\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.translate(line / 2 + 4, plot.y + plot.height / 2);\n ctx.rotate(-Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.fillText(y.title, 0, 0);\n ctx.restore();\n }\n }\n\n // right axis\n const y2 = scales.horizontal ? null : input.y2;\n const y2Ticks = input.y2Ticks;\n if (y2 && y2Ticks && y2.visible) {\n const right = plot.x + plot.width;\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n y2Ticks.values.forEach((v, i) => {\n const py = scales.yToPx(v);\n if (py < plot.y - 0.5 || py > plot.y + plot.height + 0.5) return;\n ctx.fillText(y2Ticks.labels[i], right + 8, py);\n });\n if (y2.title) {\n ctx.save();\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.translate(input.width - line / 2 - 4, plot.y + plot.height / 2);\n ctx.rotate(Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.fillText(y2.title, 0, 0);\n ctx.restore();\n }\n }\n};\n\nconst overlaps = (a: Rect, b: Rect) =>\n a.x < b.x + b.width &&\n b.x < a.x + a.width &&\n a.y < b.y + b.height &&\n b.y < a.y + a.height;\n\nconst inside = (r: Rect, plot: Rect) =>\n r.x >= plot.x &&\n r.y >= plot.y &&\n r.x + r.width <= plot.x + plot.width &&\n r.y + r.height <= plot.y + plot.height;\n\n/** Text with a halo in the background color (readable over data) */\nconst haloText = (\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n color: string,\n halo: string,\n) => {\n ctx.lineWidth = 3;\n ctx.lineJoin = \"round\";\n ctx.strokeStyle = halo;\n ctx.strokeText(text, x, y);\n ctx.fillStyle = color;\n ctx.fillText(text, x, y);\n};\n\n/** Greedy placement: right, left, above, below the dot; skipped when no slot is free */\nexport const placeLabels = (\n labels: readonly PointLabel[],\n plot: Rect,\n measure: (text: string) => number,\n height: number,\n occupied: Rect[] = [],\n): { label: PointLabel; box: Rect }[] => {\n const placed: { label: PointLabel; box: Rect }[] = [];\n for (const label of labels) {\n const w = measure(label.text);\n const gap = label.r + 4;\n const above = {\n x: label.x - w / 2,\n y: label.y - gap - height,\n width: w,\n height,\n };\n const below = { x: label.x - w / 2, y: label.y + gap, width: w, height };\n const right = {\n x: label.x + gap,\n y: label.y - height / 2,\n width: w,\n height,\n };\n const left = {\n x: label.x - gap - w,\n y: label.y - height / 2,\n width: w,\n height,\n };\n const candidates: Rect[] =\n label.placement === \"above\"\n ? [above]\n : label.placement === \"below\"\n ? [below]\n : label.placement === \"right\"\n ? [right, left]\n : label.placement === \"left\"\n ? [left, right]\n : [\n {\n x: label.x + gap,\n y: label.y - height / 2,\n width: w,\n height,\n },\n {\n x: label.x - gap - w,\n y: label.y - height / 2,\n width: w,\n height,\n },\n above,\n below,\n ];\n const box = candidates.find(\n (c) => inside(c, plot) && !occupied.some((o) => overlaps(o, c)),\n );\n if (!box) continue;\n occupied.push(box);\n placed.push({ label, box });\n }\n return placed;\n};\n\nexport interface ForegroundInput {\n width: number;\n height: number;\n scales: Scales;\n theme: ChartTheme;\n annotations: readonly ResolvedAnnotation[];\n pointLabels: readonly PointLabel[];\n /**\n * Clears the canvas first (off when the layers share one canvas)\n * @default true\n */\n clear?: boolean;\n}\n\nexport const drawForeground = (\n ctx: CanvasRenderingContext2D,\n input: ForegroundInput,\n) => {\n const { scales, theme } = input;\n const { plot } = scales;\n if (input.clear !== false) ctx.clearRect(0, 0, input.width, input.height);\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n\n const halo = toCss(theme.background, 0.9);\n const occupied: Rect[] = [];\n const labelHeight = theme.fontSize + 4;\n\n for (const a of input.annotations) {\n if (a.type !== \"line\") continue;\n const color = toCss(a.color);\n ctx.strokeStyle = color;\n ctx.lineWidth = a.width;\n ctx.setLineDash(a.dash);\n ctx.beginPath();\n const where = lineOf(a, scales);\n if (!where.vertical) {\n const py = crisp(where.at);\n ctx.moveTo(plot.x, py);\n ctx.lineTo(plot.x + plot.width, py);\n ctx.stroke();\n if (a.label) {\n ctx.setLineDash([]);\n ctx.font = font(theme, theme.fontSize, 500);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"bottom\";\n haloText(ctx, a.label, plot.x + plot.width - 6, py - 3, color, halo);\n }\n } else {\n const px = crisp(where.at);\n ctx.moveTo(px, plot.y);\n ctx.lineTo(px, plot.y + plot.height);\n ctx.stroke();\n if (a.label) {\n ctx.setLineDash([]);\n ctx.font = font(theme, theme.fontSize, 500);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n haloText(ctx, a.label, px + 5, plot.y + 5, color, halo);\n }\n }\n }\n ctx.setLineDash([]);\n\n // labels of areas\n ctx.font = font(theme, theme.fontSize + 1, 600);\n for (const a of input.annotations) {\n if (a.type !== \"rect\" || !a.label) continue;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) continue;\n const pad = 10;\n const w = ctx.measureText(a.label).width;\n const pos = a.labelPosition;\n const tx = pos.endsWith(\"left\")\n ? r.x + pad\n : pos.endsWith(\"right\")\n ? r.x + r.width - pad - w\n : r.x + (r.width - w) / 2;\n const ty = pos.startsWith(\"top\")\n ? r.y + pad\n : pos.startsWith(\"bottom\")\n ? r.y + r.height - pad - labelHeight\n : r.y + (r.height - labelHeight) / 2;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n ctx.fillStyle = toCss(a.labelColor);\n ctx.fillText(a.label, tx, ty);\n occupied.push({ x: tx, y: ty, width: w, height: labelHeight });\n }\n\n // free texts\n for (const a of input.annotations) {\n if (a.type !== \"text\" || !a.text) continue;\n ctx.font = font(theme, theme.fontSize, a.weight);\n const box = textBox(a, scales, ctx.measureText(a.text).width, labelHeight);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n haloText(ctx, a.text, box.x, box.y + box.height / 2, toCss(a.color), halo);\n occupied.push(box);\n }\n\n // point labels\n if (input.pointLabels.length) {\n ctx.font = font(theme);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n const textColor = toCss(theme.text, 0.85);\n const placed = placeLabels(\n input.pointLabels,\n plot,\n (t) => ctx.measureText(t).width,\n labelHeight - 2,\n occupied,\n );\n for (const { label, box } of placed) {\n haloText(ctx, label.text, box.x, box.y + box.height / 2, textColor, halo);\n }\n }\n ctx.restore();\n};\n"],"mappings":"gCA0DA,IAAaG,GAAQ,EAAmB,EAAOC,EAAM,SAAU,EAAS,MACtE,GAAGC,EAAO,GAAGC,EAAK,KAAKF,EAAM,aAKlBG,GACX,EACA,EACA,EACA,IACS,CACT,GAAM,CAAE,QAASC,EACXC,EAAKT,EAAAA,SAASQ,EAAGE,EAAE,GAAK,EAAGA,EAAE,GAAK,CAAC,EACnCC,EAAOH,EAAE,WACX,CAAE,EAAGE,EAAE,IAAM,IAAA,GAAW,EAAGA,EAAE,IAAM,IAAA,EAAU,EAC7C,CAAE,EAAGA,EAAE,IAAM,IAAA,GAAW,EAAGA,EAAE,IAAM,IAAA,EAAU,EAC3CE,EAAKD,EAAK,EAAIE,EAAK,EAAIA,EAAK,MAAQ,EAAIJ,EAAG,EAC3CK,EAAKH,EAAK,EAAIE,EAAK,EAAIA,EAAK,OAAS,EAAIJ,EAAG,EAE9CM,EAAIH,EAAKI,EAAQ,EACjBC,EAAIH,EAAKI,EAAS,EAOtB,OANIR,EAAE,SAAW,MAAO,EAAII,EAAK,EACxBJ,EAAE,SAAW,SAAU,EAAII,EAAK,EAAMI,EACtCR,EAAE,SAAW,OAAQ,EAAIE,EAAK,EAC9BF,EAAE,SAAW,UAAS,EAAIE,EAAK,EAAMI,GAC9C,EAAI,KAAK,IAAIH,EAAK,EAAI,EAAK,KAAK,IAAIE,EAAGF,EAAK,EAAIA,EAAK,MAAQ,EAAMG,CAAK,CAAC,EACzE,EAAI,KAAK,IAAIH,EAAK,EAAI,EAAG,KAAK,IAAII,EAAGJ,EAAK,EAAIA,EAAK,OAAS,EAAIK,CAAM,CAAC,EAChE,CAAE,IAAG,IAAG,QAAO,QAAO,CAC/B,EAGaC,GAAU,EAAiB,IAAoB,CAC1D,GAAM,CAAE,QAASX,EAGX,CAACY,EAAKC,GAAOb,EAAE,WACjB,CAACK,EAAK,EAAGA,EAAK,EAAIA,EAAK,MAAM,EAC7B,CAACA,EAAK,EAAGA,EAAK,EAAIA,EAAK,KAAK,EAC1B,CAACS,EAAKC,GAAOf,EAAE,WACjB,CAACK,EAAK,EAAGA,EAAK,EAAIA,EAAK,KAAK,EAC5B,CAACA,EAAK,EAAGA,EAAK,EAAIA,EAAK,MAAM,EAC3BW,GAAS,EAAY,EAAY,IACrCZ,EAAKa,EAAKA,EAAKb,EAAKc,EAAKA,EAAKd,EAChC,OAAOX,EAAAA,WACLO,EACAgB,EAAMhB,EAAE,MAAME,EAAE,IAAM,IAAS,EAAGU,EAAKC,CAAG,EAC1CG,EAAMhB,EAAE,MAAME,EAAE,IAAM,GAAQ,EAAGU,EAAKC,CAAG,EACzCG,EAAMhB,EAAE,MAAME,EAAE,IAAM,IAAS,EAAGY,EAAKC,CAAG,EAC1CC,EAAMhB,EAAE,MAAME,EAAE,IAAM,GAAQ,EAAGY,EAAKC,CAAG,CAC3C,CACF,EAMaI,GACX,EACA,KAGO,CACL,SAFgBjB,EAAE,OAAS,MAASF,EAAE,WAGtC,GAAIE,EAAE,OAAS,IAAMF,EAAE,MAAME,EAAE,KAAK,EAAIF,EAAE,MAAME,EAAE,KAAK,CACzD,GAsKIkB,GAAY,EAAS,IACzBlB,EAAE,EAAImB,EAAE,EAAIA,EAAE,OACdA,EAAE,EAAInB,EAAE,EAAIA,EAAE,OACdA,EAAE,EAAImB,EAAE,EAAIA,EAAE,QACdA,EAAE,EAAInB,EAAE,EAAIA,EAAE,OAEVoB,GAAU,EAAS,IACvBC,EAAE,GAAKlB,EAAK,GACZkB,EAAE,GAAKlB,EAAK,GACZkB,EAAE,EAAIA,EAAE,OAASlB,EAAK,EAAIA,EAAK,OAC/BkB,EAAE,EAAIA,EAAE,QAAUlB,EAAK,EAAIA,EAAK,OAoBrBmB,GACX,EACA,EACA,EACA,EACA,EAAmB,CAAC,IACmB,CACvC,IAAMC,EAA6C,CAAC,EACpD,IAAK,IAAMC,KAASC,EAAQ,CAC1B,IAAMC,EAAIC,EAAQH,EAAM,IAAI,EACtBI,EAAMJ,EAAM,EAAI,EAChBK,EAAQ,CACZ,EAAGL,EAAM,EAAIE,EAAI,EACjB,EAAGF,EAAM,EAAII,EAAMpB,EACnB,MAAOkB,EACP,QACF,EACMI,EAAQ,CAAE,EAAGN,EAAM,EAAIE,EAAI,EAAG,EAAGF,EAAM,EAAII,EAAK,MAAOF,EAAG,QAAO,EACjEK,EAAQ,CACZ,EAAGP,EAAM,EAAII,EACb,EAAGJ,EAAM,EAAIhB,EAAS,EACtB,MAAOkB,EACP,QACF,EACMM,EAAO,CACX,EAAGR,EAAM,EAAII,EAAMF,EACnB,EAAGF,EAAM,EAAIhB,EAAS,EACtB,MAAOkB,EACP,QACF,EA0BMO,GAxBJT,EAAM,YAAc,QAChB,CAACK,CAAK,EACNL,EAAM,YAAc,QAClB,CAACM,CAAK,EACNN,EAAM,YAAc,QAClB,CAACO,EAAOC,CAAI,EACZR,EAAM,YAAc,OAClB,CAACQ,EAAMD,CAAK,EACZ,CACE,CACE,EAAGP,EAAM,EAAII,EACb,EAAGJ,EAAM,EAAIhB,EAAS,EACtB,MAAOkB,EACP,QACF,EACA,CACE,EAAGF,EAAM,EAAII,EAAMF,EACnB,EAAGF,EAAM,EAAIhB,EAAS,EACtB,MAAOkB,EACP,QACF,EACAG,EACAC,CACF,EAAA,CACW,KACpB,GAAMV,EAAOc,EAAG/B,CAAI,GAAK,CAACgC,EAAS,KAAM,GAAMjB,EAASkB,EAAGF,CAAC,CAAC,CAChE,EACKD,IACLE,EAAS,KAAKF,CAAG,EACjBV,EAAO,KAAK,CAAE,QAAO,KAAI,CAAC,EAC5B,CACA,OAAOA,CACT"}
@@ -1,49 +1,72 @@
1
+ import { screenRect as e, toScreen as t } from "./layout.js";
1
2
  //#region ../charts/src/engine/overlay.ts
2
- var e = (e, t = e.fontSize, n = 400) => `${n} ${t}px ${e.fontFamily}`, t = (e, t, n, r) => {
3
- let { plot: i } = t, a = e.x === void 0 ? i.x + i.width / 2 : t.xToPx(e.x), o = e.y === void 0 ? i.y + i.height / 2 : t.yToPx(e.y), s = a - n / 2, c = o - r / 2;
4
- return e.anchor === "top" ? c = o + 6 : e.anchor === "bottom" ? c = o - 6 - r : e.anchor === "left" ? s = a + 6 : e.anchor === "right" && (s = a - 6 - n), s = Math.max(i.x + 6, Math.min(s, i.x + i.width - 6 - n)), c = Math.max(i.y + 2, Math.min(c, i.y + i.height - 2 - r)), {
5
- x: s,
6
- y: c,
7
- width: n,
8
- height: r
3
+ var n = (e, t = e.fontSize, n = 400) => `${n} ${t}px ${e.fontFamily}`, r = (e, n, r, i) => {
4
+ let { plot: a } = n, o = t(n, e.x ?? 0, e.y ?? 0), s = n.horizontal ? {
5
+ x: e.y === void 0,
6
+ y: e.x === void 0
7
+ } : {
8
+ x: e.x === void 0,
9
+ y: e.y === void 0
10
+ }, c = s.x ? a.x + a.width / 2 : o.x, l = s.y ? a.y + a.height / 2 : o.y, u = c - r / 2, d = l - i / 2;
11
+ return e.anchor === "top" ? d = l + 6 : e.anchor === "bottom" ? d = l - 6 - i : e.anchor === "left" ? u = c + 6 : e.anchor === "right" && (u = c - 6 - r), u = Math.max(a.x + 6, Math.min(u, a.x + a.width - 6 - r)), d = Math.max(a.y + 2, Math.min(d, a.y + a.height - 2 - i)), {
12
+ x: u,
13
+ y: d,
14
+ width: r,
15
+ height: i
9
16
  };
10
- }, n = (e, t) => e.x < t.x + t.width && t.x < e.x + e.width && e.y < t.y + t.height && t.y < e.y + e.height, r = (e, t) => e.x >= t.x && e.y >= t.y && e.x + e.width <= t.x + t.width && e.y + e.height <= t.y + t.height, i = (e, t, i, a, o = []) => {
11
- let s = [];
17
+ }, i = (t, n) => {
18
+ let { plot: r } = n, [i, a] = n.horizontal ? [r.y, r.y + r.height] : [r.x, r.x + r.width], [o, s] = n.horizontal ? [r.x, r.x + r.width] : [r.y, r.y + r.height], c = (e, t, n) => e < t ? t : e > n ? n : e;
19
+ return e(n, c(n.xToPx(t.x0 ?? -Infinity), i, a), c(n.xToPx(t.x1 ?? Infinity), i, a), c(n.yToPx(t.y0 ?? -Infinity), o, s), c(n.yToPx(t.y1 ?? Infinity), o, s));
20
+ }, a = (e, t) => ({
21
+ vertical: e.axis === "x" !== t.horizontal,
22
+ at: e.axis === "x" ? t.xToPx(e.value) : t.yToPx(e.value)
23
+ }), o = (e, t) => e.x < t.x + t.width && t.x < e.x + e.width && e.y < t.y + t.height && t.y < e.y + e.height, s = (e, t) => e.x >= t.x && e.y >= t.y && e.x + e.width <= t.x + t.width && e.y + e.height <= t.y + t.height, c = (e, t, n, r, i = []) => {
24
+ let a = [];
12
25
  for (let c of e) {
13
- let e = i(c.text), l = c.r + 4, u = {
26
+ let e = n(c.text), l = c.r + 4, u = {
14
27
  x: c.x - e / 2,
15
- y: c.y - l - a,
28
+ y: c.y - l - r,
16
29
  width: e,
17
- height: a
30
+ height: r
18
31
  }, d = {
19
32
  x: c.x - e / 2,
20
33
  y: c.y + l,
21
34
  width: e,
22
- height: a
23
- }, f = (c.placement === "above" ? [u] : c.placement === "below" ? [d] : [
35
+ height: r
36
+ }, f = {
37
+ x: c.x + l,
38
+ y: c.y - r / 2,
39
+ width: e,
40
+ height: r
41
+ }, p = {
42
+ x: c.x - l - e,
43
+ y: c.y - r / 2,
44
+ width: e,
45
+ height: r
46
+ }, m = (c.placement === "above" ? [u] : c.placement === "below" ? [d] : c.placement === "right" ? [f, p] : c.placement === "left" ? [p, f] : [
24
47
  {
25
48
  x: c.x + l,
26
- y: c.y - a / 2,
49
+ y: c.y - r / 2,
27
50
  width: e,
28
- height: a
51
+ height: r
29
52
  },
30
53
  {
31
54
  x: c.x - l - e,
32
- y: c.y - a / 2,
55
+ y: c.y - r / 2,
33
56
  width: e,
34
- height: a
57
+ height: r
35
58
  },
36
59
  u,
37
60
  d
38
- ]).find((e) => r(e, t) && !o.some((t) => n(t, e)));
39
- f && (o.push(f), s.push({
61
+ ]).find((e) => s(e, t) && !i.some((t) => o(t, e)));
62
+ m && (i.push(m), a.push({
40
63
  label: c,
41
- box: f
64
+ box: m
42
65
  }));
43
66
  }
44
- return s;
67
+ return a;
45
68
  };
46
69
  //#endregion
47
- export { e as font, i as placeLabels, t as textBox };
70
+ export { n as font, a as lineOf, c as placeLabels, i as rectOf, r as textBox };
48
71
 
49
72
  //# sourceMappingURL=overlay.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.js","names":["font","theme","weight","size","textBox","s","px","a","plot","py","x","width","y","height","overlaps","b","inside","r","placeLabels","placed","label","labels","w","measure","gap","above","below","box","c","occupied","o"],"sources":["../../../../../../charts/src/engine/overlay.ts"],"sourcesContent":["// Canvas2D layers around the data: background (areas, grid, axes, tick\n// labels) and foreground (reference lines, annotation and point labels).\n\nimport { toCss, type Rgba } from \"./color\";\nimport type { AxisTicks } from \"./axis\";\nimport type { Rect, Scales } from \"./layout\";\nimport type { AxisModel } from \"./model\";\nimport type { ChartTheme } from \"./theme\";\nimport type { ChartLabelPosition } from \"./types\";\n\nexport interface ResolvedRect {\n type: \"rect\";\n x0?: number;\n x1?: number;\n y0?: number;\n y1?: number;\n color: Rgba;\n opacity: number;\n label?: string;\n labelPosition: ChartLabelPosition;\n labelColor: Rgba;\n}\n\nexport interface ResolvedLine {\n type: \"line\";\n axis: \"x\" | \"y\";\n value: number;\n color: Rgba;\n width: number;\n dash: number[];\n label?: string;\n}\n\nexport interface ResolvedText {\n type: \"text\";\n x?: number;\n y?: number;\n text: string;\n anchor: \"center\" | \"top\" | \"bottom\" | \"left\" | \"right\";\n color: Rgba;\n weight: number;\n}\n\nexport type ResolvedAnnotation = ResolvedRect | ResolvedLine | ResolvedText;\n\nexport interface PointLabel {\n x: number;\n y: number;\n /** Radius of the dot */\n r: number;\n text: string;\n /** Fixed side (bar values); any free side around the dot otherwise */\n placement?: \"above\" | \"below\";\n}\n\nexport const font = (theme: ChartTheme, size = theme.fontSize, weight = 400) =>\n `${weight} ${size}px ${theme.fontFamily}`;\n\nconst crisp = (v: number) => Math.round(v) + 0.5;\n\n/** Box of a text annotation, kept inside the plot */\nexport const textBox = (\n a: ResolvedText,\n s: Scales,\n width: number,\n height: number,\n): Rect => {\n const { plot } = s;\n const px = a.x === undefined ? plot.x + plot.width / 2 : s.xToPx(a.x);\n const py = a.y === undefined ? plot.y + plot.height / 2 : s.yToPx(a.y);\n const gap = 6;\n let x = px - width / 2;\n let y = py - height / 2;\n if (a.anchor === \"top\") y = py + gap;\n else if (a.anchor === \"bottom\") y = py - gap - height;\n else if (a.anchor === \"left\") x = px + gap;\n else if (a.anchor === \"right\") x = px - gap - width;\n x = Math.max(plot.x + gap, Math.min(x, plot.x + plot.width - gap - width));\n y = Math.max(plot.y + 2, Math.min(y, plot.y + plot.height - 2 - height));\n return { x, y, width, height };\n};\n\nconst rectOf = (a: ResolvedRect, s: Scales): Rect => {\n const { plot } = s;\n const xa = a.x0 === undefined ? -Infinity : s.xToPx(a.x0);\n const xb = a.x1 === undefined ? Infinity : s.xToPx(a.x1);\n const ya = a.y0 === undefined ? Infinity : s.yToPx(a.y0);\n const yb = a.y1 === undefined ? -Infinity : s.yToPx(a.y1);\n const left = Math.max(plot.x, Math.min(xa, xb));\n const right = Math.min(plot.x + plot.width, Math.max(xa, xb));\n const top = Math.max(plot.y, Math.min(ya, yb));\n const bottom = Math.min(plot.y + plot.height, Math.max(ya, yb));\n return { x: left, y: top, width: right - left, height: bottom - top };\n};\n\nexport interface BackgroundInput {\n width: number;\n height: number;\n scales: Scales;\n x: AxisModel;\n y: AxisModel;\n xTicks: AxisTicks;\n yTicks: AxisTicks;\n theme: ChartTheme;\n annotations: readonly ResolvedAnnotation[];\n}\n\nexport const drawBackground = (\n ctx: CanvasRenderingContext2D,\n input: BackgroundInput,\n) => {\n const { scales, theme, x, y, xTicks, yTicks } = input;\n const { plot } = scales;\n ctx.clearRect(0, 0, input.width, input.height);\n\n // areas\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n for (const a of input.annotations) {\n if (a.type !== \"rect\") continue;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) continue;\n ctx.fillStyle = toCss(a.color, a.opacity);\n ctx.fillRect(r.x, r.y, r.width, r.height);\n }\n ctx.restore();\n\n // grid\n ctx.lineWidth = 1;\n ctx.strokeStyle = toCss(theme.grid);\n ctx.beginPath();\n if (y.grid) {\n for (const v of yTicks.values) {\n const py = crisp(scales.yToPx(v));\n if (py < plot.y - 1 || py > plot.y + plot.height + 1) continue;\n ctx.moveTo(plot.x, py);\n ctx.lineTo(plot.x + plot.width, py);\n }\n }\n if (x.grid) {\n for (const v of xTicks.values) {\n const px = crisp(scales.xToPx(v));\n if (px < plot.x - 1 || px > plot.x + plot.width + 1) continue;\n ctx.moveTo(px, plot.y);\n ctx.lineTo(px, plot.y + plot.height);\n }\n }\n ctx.stroke();\n\n const line = Math.ceil(theme.fontSize * 1.4);\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n\n // x axis\n if (x.visible) {\n ctx.strokeStyle = toCss(theme.axis);\n ctx.beginPath();\n const base = crisp(plot.y + plot.height);\n ctx.moveTo(plot.x, base);\n ctx.lineTo(plot.x + plot.width, base);\n ctx.stroke();\n ctx.textBaseline = \"top\";\n ctx.textAlign = \"center\";\n let lastRight = -Infinity;\n // left to right (reversed axes list their ticks right to left)\n const order = xTicks.values\n .map((v, i) => ({ px: scales.xToPx(v), text: xTicks.labels[i] }))\n .sort((a, b) => a.px - b.px);\n for (const { px, text } of order) {\n if (px < plot.x - 0.5 || px > plot.x + plot.width + 0.5) continue;\n const w = ctx.measureText(text).width;\n const left = Math.max(0, Math.min(input.width - w, px - w / 2));\n if (left < lastRight + 6) continue;\n lastRight = left + w;\n ctx.fillText(text, left + w / 2, plot.y + plot.height + 7);\n }\n if (x.title) {\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.fillText(\n x.title,\n plot.x + plot.width / 2,\n plot.y + plot.height + line + 10,\n );\n }\n }\n\n // y axis\n if (y.visible) {\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n yTicks.values.forEach((v, i) => {\n const py = scales.yToPx(v);\n if (py < plot.y - 0.5 || py > plot.y + plot.height + 0.5) return;\n ctx.fillText(yTicks.labels[i], plot.x - 8, py);\n });\n if (y.title) {\n ctx.save();\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.translate(line / 2 + 4, plot.y + plot.height / 2);\n ctx.rotate(-Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.fillText(y.title, 0, 0);\n ctx.restore();\n }\n }\n};\n\nconst overlaps = (a: Rect, b: Rect) =>\n a.x < b.x + b.width &&\n b.x < a.x + a.width &&\n a.y < b.y + b.height &&\n b.y < a.y + a.height;\n\nconst inside = (r: Rect, plot: Rect) =>\n r.x >= plot.x &&\n r.y >= plot.y &&\n r.x + r.width <= plot.x + plot.width &&\n r.y + r.height <= plot.y + plot.height;\n\n/** Text with a halo in the background color (readable over data) */\nconst haloText = (\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n color: string,\n halo: string,\n) => {\n ctx.lineWidth = 3;\n ctx.lineJoin = \"round\";\n ctx.strokeStyle = halo;\n ctx.strokeText(text, x, y);\n ctx.fillStyle = color;\n ctx.fillText(text, x, y);\n};\n\n/** Greedy placement: right, left, above, below the dot; skipped when no slot is free */\nexport const placeLabels = (\n labels: readonly PointLabel[],\n plot: Rect,\n measure: (text: string) => number,\n height: number,\n occupied: Rect[] = [],\n): { label: PointLabel; box: Rect }[] => {\n const placed: { label: PointLabel; box: Rect }[] = [];\n for (const label of labels) {\n const w = measure(label.text);\n const gap = label.r + 4;\n const above = {\n x: label.x - w / 2,\n y: label.y - gap - height,\n width: w,\n height,\n };\n const below = { x: label.x - w / 2, y: label.y + gap, width: w, height };\n const candidates: Rect[] =\n label.placement === \"above\"\n ? [above]\n : label.placement === \"below\"\n ? [below]\n : [\n { x: label.x + gap, y: label.y - height / 2, width: w, height },\n {\n x: label.x - gap - w,\n y: label.y - height / 2,\n width: w,\n height,\n },\n above,\n below,\n ];\n const box = candidates.find(\n (c) => inside(c, plot) && !occupied.some((o) => overlaps(o, c)),\n );\n if (!box) continue;\n occupied.push(box);\n placed.push({ label, box });\n }\n return placed;\n};\n\nexport interface ForegroundInput {\n width: number;\n height: number;\n scales: Scales;\n theme: ChartTheme;\n annotations: readonly ResolvedAnnotation[];\n pointLabels: readonly PointLabel[];\n /**\n * Clears the canvas first (off when the layers share one canvas)\n * @default true\n */\n clear?: boolean;\n}\n\nexport const drawForeground = (\n ctx: CanvasRenderingContext2D,\n input: ForegroundInput,\n) => {\n const { scales, theme } = input;\n const { plot } = scales;\n if (input.clear !== false) ctx.clearRect(0, 0, input.width, input.height);\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n\n const halo = toCss(theme.background, 0.9);\n const occupied: Rect[] = [];\n const labelHeight = theme.fontSize + 4;\n\n for (const a of input.annotations) {\n if (a.type !== \"line\") continue;\n const color = toCss(a.color);\n ctx.strokeStyle = color;\n ctx.lineWidth = a.width;\n ctx.setLineDash(a.dash);\n ctx.beginPath();\n if (a.axis === \"y\") {\n const py = crisp(scales.yToPx(a.value));\n ctx.moveTo(plot.x, py);\n ctx.lineTo(plot.x + plot.width, py);\n ctx.stroke();\n if (a.label) {\n ctx.setLineDash([]);\n ctx.font = font(theme, theme.fontSize, 500);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"bottom\";\n haloText(ctx, a.label, plot.x + plot.width - 6, py - 3, color, halo);\n }\n } else {\n const px = crisp(scales.xToPx(a.value));\n ctx.moveTo(px, plot.y);\n ctx.lineTo(px, plot.y + plot.height);\n ctx.stroke();\n if (a.label) {\n ctx.setLineDash([]);\n ctx.font = font(theme, theme.fontSize, 500);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n haloText(ctx, a.label, px + 5, plot.y + 5, color, halo);\n }\n }\n }\n ctx.setLineDash([]);\n\n // labels of areas\n ctx.font = font(theme, theme.fontSize + 1, 600);\n for (const a of input.annotations) {\n if (a.type !== \"rect\" || !a.label) continue;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) continue;\n const pad = 10;\n const w = ctx.measureText(a.label).width;\n const pos = a.labelPosition;\n const tx = pos.endsWith(\"left\")\n ? r.x + pad\n : pos.endsWith(\"right\")\n ? r.x + r.width - pad - w\n : r.x + (r.width - w) / 2;\n const ty = pos.startsWith(\"top\")\n ? r.y + pad\n : pos.startsWith(\"bottom\")\n ? r.y + r.height - pad - labelHeight\n : r.y + (r.height - labelHeight) / 2;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n ctx.fillStyle = toCss(a.labelColor);\n ctx.fillText(a.label, tx, ty);\n occupied.push({ x: tx, y: ty, width: w, height: labelHeight });\n }\n\n // free texts\n for (const a of input.annotations) {\n if (a.type !== \"text\" || !a.text) continue;\n ctx.font = font(theme, theme.fontSize, a.weight);\n const box = textBox(a, scales, ctx.measureText(a.text).width, labelHeight);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n haloText(ctx, a.text, box.x, box.y + box.height / 2, toCss(a.color), halo);\n occupied.push(box);\n }\n\n // point labels\n if (input.pointLabels.length) {\n ctx.font = font(theme);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n const textColor = toCss(theme.text, 0.85);\n const placed = placeLabels(\n input.pointLabels,\n plot,\n (t) => ctx.measureText(t).width,\n labelHeight - 2,\n occupied,\n );\n for (const { label, box } of placed) {\n haloText(ctx, label.text, box.x, box.y + box.height / 2, textColor, halo);\n }\n }\n ctx.restore();\n};\n"],"mappings":";AAuDA,IAAaA,KAAQ,GAAmB,IAAOC,EAAM,UAAU,IAAS,QACtE,GAAGC,EAAO,GAAGC,EAAK,KAAKF,EAAM,cAKlBG,KACX,GACA,GACA,GACA,MACS;CACT,IAAM,EAAE,YAASC,GACXC,IAAKC,EAAE,MAAM,KAAA,IAAYC,EAAK,IAAIA,EAAK,QAAQ,IAAIH,EAAE,MAAME,EAAE,CAAC,GAC9DE,IAAKF,EAAE,MAAM,KAAA,IAAYC,EAAK,IAAIA,EAAK,SAAS,IAAIH,EAAE,MAAME,EAAE,CAAC,GAEjEG,IAAIJ,IAAKK,IAAQ,GACjBC,IAAIH,IAAKI,IAAS;CAOtB,OANIN,EAAE,WAAW,QAAO,IAAIE,IAAK,IACxBF,EAAE,WAAW,WAAU,IAAIE,IAAK,IAAMI,IACtCN,EAAE,WAAW,SAAQ,IAAID,IAAK,IAC9BC,EAAE,WAAW,YAAS,IAAID,IAAK,IAAMK,IAC9C,IAAI,KAAK,IAAIH,EAAK,IAAI,GAAK,KAAK,IAAIE,GAAGF,EAAK,IAAIA,EAAK,QAAQ,IAAMG,CAAK,CAAC,GACzE,IAAI,KAAK,IAAIH,EAAK,IAAI,GAAG,KAAK,IAAII,GAAGJ,EAAK,IAAIA,EAAK,SAAS,IAAIK,CAAM,CAAC,GAChE;EAAE;EAAG;EAAG;EAAO;CAAO;AAC/B,GAqIMC,KAAY,GAAS,MACzBP,EAAE,IAAIQ,EAAE,IAAIA,EAAE,SACdA,EAAE,IAAIR,EAAE,IAAIA,EAAE,SACdA,EAAE,IAAIQ,EAAE,IAAIA,EAAE,UACdA,EAAE,IAAIR,EAAE,IAAIA,EAAE,QAEVS,KAAU,GAAS,MACvBC,EAAE,KAAKT,EAAK,KACZS,EAAE,KAAKT,EAAK,KACZS,EAAE,IAAIA,EAAE,SAAST,EAAK,IAAIA,EAAK,SAC/BS,EAAE,IAAIA,EAAE,UAAUT,EAAK,IAAIA,EAAK,QAoBrBU,KACX,GACA,GACA,GACA,GACA,IAAmB,CAAC,MACmB;CACvC,IAAMC,IAA6C,CAAC;CACpD,KAAK,IAAMC,KAASC,GAAQ;EAC1B,IAAMC,IAAIC,EAAQH,EAAM,IAAI,GACtBI,IAAMJ,EAAM,IAAI,GAChBK,IAAQ;GACZ,GAAGL,EAAM,IAAIE,IAAI;GACjB,GAAGF,EAAM,IAAII,IAAMX;GACnB,OAAOS;GACP;EACF,GACMI,IAAQ;GAAE,GAAGN,EAAM,IAAIE,IAAI;GAAG,GAAGF,EAAM,IAAII;GAAK,OAAOF;GAAG;EAAO,GAiBjEK,KAfJP,EAAM,cAAc,UAChB,CAACK,CAAK,IACNL,EAAM,cAAc,UAClB,CAACM,CAAK,IACN;GACE;IAAE,GAAGN,EAAM,IAAII;IAAK,GAAGJ,EAAM,IAAIP,IAAS;IAAG,OAAOS;IAAG;GAAO;GAC9D;IACE,GAAGF,EAAM,IAAII,IAAMF;IACnB,GAAGF,EAAM,IAAIP,IAAS;IACtB,OAAOS;IACP;GACF;GACAG;GACAC;EACF,EAAA,CACe,MACpB,MAAMV,EAAOY,GAAGpB,CAAI,KAAK,CAACqB,EAAS,MAAM,MAAMf,EAASgB,GAAGF,CAAC,CAAC,CAChE;EACA,AAAKD,MACLE,EAAS,KAAKF,CAAG,GACjBR,EAAO,KAAK;GAAE;GAAO;EAAI,CAAC;CAC5B;CACA,OAAOA;AACT"}
1
+ {"version":3,"file":"overlay.js","names":["font","theme","weight","size","textBox","s","at","toScreen","a","free","px","plot","py","x","width","y","height","rectOf","xLo","xHi","yLo","yHi","along","lo","hi","screenRect","lineOf","overlaps","b","inside","r","placeLabels","placed","label","labels","w","measure","gap","above","below","right","left","box","c","occupied","o"],"sources":["../../../../../../charts/src/engine/overlay.ts"],"sourcesContent":["// Canvas2D layers around the data: background (areas, grid, axes, tick\n// labels) and foreground (reference lines, annotation and point labels).\n\nimport { toCss, type Rgba } from \"./color\";\nimport type { AxisTicks } from \"./axis\";\nimport { screenRect, toScreen, type Rect, type Scales } from \"./layout\";\nimport type { AxisModel } from \"./model\";\nimport type { ChartTheme } from \"./theme\";\nimport type { ChartLabelPosition } from \"./types\";\n\nexport interface ResolvedRect {\n type: \"rect\";\n x0?: number;\n x1?: number;\n y0?: number;\n y1?: number;\n color: Rgba;\n opacity: number;\n label?: string;\n labelPosition: ChartLabelPosition;\n labelColor: Rgba;\n}\n\nexport interface ResolvedLine {\n type: \"line\";\n axis: \"x\" | \"y\";\n value: number;\n color: Rgba;\n width: number;\n dash: number[];\n label?: string;\n}\n\nexport interface ResolvedText {\n type: \"text\";\n x?: number;\n y?: number;\n text: string;\n anchor: \"center\" | \"top\" | \"bottom\" | \"left\" | \"right\";\n color: Rgba;\n weight: number;\n}\n\nexport type ResolvedAnnotation = ResolvedRect | ResolvedLine | ResolvedText;\n\nexport interface PointLabel {\n x: number;\n y: number;\n /** Radius of the dot */\n r: number;\n text: string;\n /**\n * Fixed side (bar values: above / below, left / right of horizontal\n * bars); any free side around the dot otherwise\n */\n placement?: \"above\" | \"below\" | \"left\" | \"right\";\n}\n\nexport const font = (theme: ChartTheme, size = theme.fontSize, weight = 400) =>\n `${weight} ${size}px ${theme.fontFamily}`;\n\nconst crisp = (v: number) => Math.round(v) + 0.5;\n\n/** Box of a text annotation, kept inside the plot */\nexport const textBox = (\n a: ResolvedText,\n s: Scales,\n width: number,\n height: number,\n): Rect => {\n const { plot } = s;\n const at = toScreen(s, a.x ?? 0, a.y ?? 0);\n const free = s.horizontal\n ? { x: a.y === undefined, y: a.x === undefined }\n : { x: a.x === undefined, y: a.y === undefined };\n const px = free.x ? plot.x + plot.width / 2 : at.x;\n const py = free.y ? plot.y + plot.height / 2 : at.y;\n const gap = 6;\n let x = px - width / 2;\n let y = py - height / 2;\n if (a.anchor === \"top\") y = py + gap;\n else if (a.anchor === \"bottom\") y = py - gap - height;\n else if (a.anchor === \"left\") x = px + gap;\n else if (a.anchor === \"right\") x = px - gap - width;\n x = Math.max(plot.x + gap, Math.min(x, plot.x + plot.width - gap - width));\n y = Math.max(plot.y + 2, Math.min(y, plot.y + plot.height - 2 - height));\n return { x, y, width, height };\n};\n\n/** Screen box of an area annotation, clipped to the plot */\nexport const rectOf = (a: ResolvedRect, s: Scales): Rect => {\n const { plot } = s;\n // clamp every edge to the plot first: an open edge maps to ±Infinity and\n // `Infinity - Infinity` would make the size NaN (nothing drawn)\n const [xLo, xHi] = s.horizontal\n ? [plot.y, plot.y + plot.height]\n : [plot.x, plot.x + plot.width];\n const [yLo, yHi] = s.horizontal\n ? [plot.x, plot.x + plot.width]\n : [plot.y, plot.y + plot.height];\n const along = (px: number, lo: number, hi: number) =>\n px < lo ? lo : px > hi ? hi : px;\n return screenRect(\n s,\n along(s.xToPx(a.x0 ?? -Infinity), xLo, xHi),\n along(s.xToPx(a.x1 ?? Infinity), xLo, xHi),\n along(s.yToPx(a.y0 ?? -Infinity), yLo, yHi),\n along(s.yToPx(a.y1 ?? Infinity), yLo, yHi),\n );\n};\n\n/**\n * Where a reference line goes: `vertical` lines run at screen x `at`,\n * horizontal ones at screen y `at`\n */\nexport const lineOf = (\n a: ResolvedLine,\n s: Scales,\n): { vertical: boolean; at: number } => {\n const vertical = (a.axis === \"x\") !== s.horizontal;\n return {\n vertical,\n at: a.axis === \"x\" ? s.xToPx(a.value) : s.yToPx(a.value),\n };\n};\n\nexport interface BackgroundInput {\n width: number;\n height: number;\n scales: Scales;\n x: AxisModel;\n y: AxisModel;\n xTicks: AxisTicks;\n yTicks: AxisTicks;\n /** Right axis (dual axis charts) */\n y2?: AxisModel | null;\n y2Ticks?: AxisTicks | null;\n theme: ChartTheme;\n annotations: readonly ResolvedAnnotation[];\n}\n\nexport const drawBackground = (\n ctx: CanvasRenderingContext2D,\n input: BackgroundInput,\n) => {\n const { scales, theme, xTicks, yTicks } = input;\n const { plot } = scales;\n // horizontal charts: the value axis along the bottom, the x axis on the left\n const x = scales.horizontal ? input.y : input.x;\n const y = scales.horizontal ? input.x : input.y;\n const bottomTicks = scales.horizontal ? yTicks : xTicks;\n const leftTicks = scales.horizontal ? xTicks : yTicks;\n const bottomPx = scales.horizontal ? scales.yToPx : scales.xToPx;\n const leftPx = scales.horizontal ? scales.xToPx : scales.yToPx;\n ctx.clearRect(0, 0, input.width, input.height);\n\n // areas\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n for (const a of input.annotations) {\n if (a.type !== \"rect\") continue;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) continue;\n ctx.fillStyle = toCss(a.color, a.opacity);\n ctx.fillRect(r.x, r.y, r.width, r.height);\n }\n ctx.restore();\n\n // grid\n ctx.lineWidth = 1;\n ctx.strokeStyle = toCss(theme.grid);\n ctx.beginPath();\n if (y.grid) {\n for (const v of leftTicks.values) {\n const py = crisp(leftPx(v));\n if (py < plot.y - 1 || py > plot.y + plot.height + 1) continue;\n ctx.moveTo(plot.x, py);\n ctx.lineTo(plot.x + plot.width, py);\n }\n }\n if (x.grid) {\n for (const v of bottomTicks.values) {\n const px = crisp(bottomPx(v));\n if (px < plot.x - 1 || px > plot.x + plot.width + 1) continue;\n ctx.moveTo(px, plot.y);\n ctx.lineTo(px, plot.y + plot.height);\n }\n }\n ctx.stroke();\n\n const line = Math.ceil(theme.fontSize * 1.4);\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n\n // x axis\n if (x.visible) {\n ctx.strokeStyle = toCss(theme.axis);\n ctx.beginPath();\n const base = crisp(plot.y + plot.height);\n ctx.moveTo(plot.x, base);\n ctx.lineTo(plot.x + plot.width, base);\n ctx.stroke();\n ctx.textBaseline = \"top\";\n ctx.textAlign = \"center\";\n let lastRight = -Infinity;\n // left to right (reversed axes list their ticks right to left)\n const order = bottomTicks.values\n .map((v, i) => ({ px: bottomPx(v), text: bottomTicks.labels[i] }))\n .sort((a, b) => a.px - b.px);\n for (const { px, text } of order) {\n if (px < plot.x - 0.5 || px > plot.x + plot.width + 0.5) continue;\n const w = ctx.measureText(text).width;\n const left = Math.max(0, Math.min(input.width - w, px - w / 2));\n if (left < lastRight + 6) continue;\n lastRight = left + w;\n ctx.fillText(text, left + w / 2, plot.y + plot.height + 7);\n }\n if (x.title) {\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.fillText(\n x.title,\n plot.x + plot.width / 2,\n plot.y + plot.height + line + 10,\n );\n }\n }\n\n // y axis\n if (y.visible) {\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n let lastBottom = -Infinity;\n // top to bottom: category rows of horizontal charts never overlap\n const rows = leftTicks.values\n .map((v, i) => ({ py: leftPx(v), text: leftTicks.labels[i] }))\n .sort((a, b) => a.py - b.py);\n const rowHeight = theme.fontSize + 2;\n for (const { py, text } of rows) {\n if (py < plot.y - 0.5 || py > plot.y + plot.height + 0.5) continue;\n if (scales.horizontal) {\n if (py - rowHeight / 2 < lastBottom) continue;\n lastBottom = py + rowHeight / 2;\n }\n ctx.fillText(text, plot.x - 8, py);\n }\n if (y.title) {\n ctx.save();\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.translate(line / 2 + 4, plot.y + plot.height / 2);\n ctx.rotate(-Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.fillText(y.title, 0, 0);\n ctx.restore();\n }\n }\n\n // right axis\n const y2 = scales.horizontal ? null : input.y2;\n const y2Ticks = input.y2Ticks;\n if (y2 && y2Ticks && y2.visible) {\n const right = plot.x + plot.width;\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n y2Ticks.values.forEach((v, i) => {\n const py = scales.yToPx(v);\n if (py < plot.y - 0.5 || py > plot.y + plot.height + 0.5) return;\n ctx.fillText(y2Ticks.labels[i], right + 8, py);\n });\n if (y2.title) {\n ctx.save();\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.translate(input.width - line / 2 - 4, plot.y + plot.height / 2);\n ctx.rotate(Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.fillText(y2.title, 0, 0);\n ctx.restore();\n }\n }\n};\n\nconst overlaps = (a: Rect, b: Rect) =>\n a.x < b.x + b.width &&\n b.x < a.x + a.width &&\n a.y < b.y + b.height &&\n b.y < a.y + a.height;\n\nconst inside = (r: Rect, plot: Rect) =>\n r.x >= plot.x &&\n r.y >= plot.y &&\n r.x + r.width <= plot.x + plot.width &&\n r.y + r.height <= plot.y + plot.height;\n\n/** Text with a halo in the background color (readable over data) */\nconst haloText = (\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n color: string,\n halo: string,\n) => {\n ctx.lineWidth = 3;\n ctx.lineJoin = \"round\";\n ctx.strokeStyle = halo;\n ctx.strokeText(text, x, y);\n ctx.fillStyle = color;\n ctx.fillText(text, x, y);\n};\n\n/** Greedy placement: right, left, above, below the dot; skipped when no slot is free */\nexport const placeLabels = (\n labels: readonly PointLabel[],\n plot: Rect,\n measure: (text: string) => number,\n height: number,\n occupied: Rect[] = [],\n): { label: PointLabel; box: Rect }[] => {\n const placed: { label: PointLabel; box: Rect }[] = [];\n for (const label of labels) {\n const w = measure(label.text);\n const gap = label.r + 4;\n const above = {\n x: label.x - w / 2,\n y: label.y - gap - height,\n width: w,\n height,\n };\n const below = { x: label.x - w / 2, y: label.y + gap, width: w, height };\n const right = {\n x: label.x + gap,\n y: label.y - height / 2,\n width: w,\n height,\n };\n const left = {\n x: label.x - gap - w,\n y: label.y - height / 2,\n width: w,\n height,\n };\n const candidates: Rect[] =\n label.placement === \"above\"\n ? [above]\n : label.placement === \"below\"\n ? [below]\n : label.placement === \"right\"\n ? [right, left]\n : label.placement === \"left\"\n ? [left, right]\n : [\n {\n x: label.x + gap,\n y: label.y - height / 2,\n width: w,\n height,\n },\n {\n x: label.x - gap - w,\n y: label.y - height / 2,\n width: w,\n height,\n },\n above,\n below,\n ];\n const box = candidates.find(\n (c) => inside(c, plot) && !occupied.some((o) => overlaps(o, c)),\n );\n if (!box) continue;\n occupied.push(box);\n placed.push({ label, box });\n }\n return placed;\n};\n\nexport interface ForegroundInput {\n width: number;\n height: number;\n scales: Scales;\n theme: ChartTheme;\n annotations: readonly ResolvedAnnotation[];\n pointLabels: readonly PointLabel[];\n /**\n * Clears the canvas first (off when the layers share one canvas)\n * @default true\n */\n clear?: boolean;\n}\n\nexport const drawForeground = (\n ctx: CanvasRenderingContext2D,\n input: ForegroundInput,\n) => {\n const { scales, theme } = input;\n const { plot } = scales;\n if (input.clear !== false) ctx.clearRect(0, 0, input.width, input.height);\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n\n const halo = toCss(theme.background, 0.9);\n const occupied: Rect[] = [];\n const labelHeight = theme.fontSize + 4;\n\n for (const a of input.annotations) {\n if (a.type !== \"line\") continue;\n const color = toCss(a.color);\n ctx.strokeStyle = color;\n ctx.lineWidth = a.width;\n ctx.setLineDash(a.dash);\n ctx.beginPath();\n const where = lineOf(a, scales);\n if (!where.vertical) {\n const py = crisp(where.at);\n ctx.moveTo(plot.x, py);\n ctx.lineTo(plot.x + plot.width, py);\n ctx.stroke();\n if (a.label) {\n ctx.setLineDash([]);\n ctx.font = font(theme, theme.fontSize, 500);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"bottom\";\n haloText(ctx, a.label, plot.x + plot.width - 6, py - 3, color, halo);\n }\n } else {\n const px = crisp(where.at);\n ctx.moveTo(px, plot.y);\n ctx.lineTo(px, plot.y + plot.height);\n ctx.stroke();\n if (a.label) {\n ctx.setLineDash([]);\n ctx.font = font(theme, theme.fontSize, 500);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n haloText(ctx, a.label, px + 5, plot.y + 5, color, halo);\n }\n }\n }\n ctx.setLineDash([]);\n\n // labels of areas\n ctx.font = font(theme, theme.fontSize + 1, 600);\n for (const a of input.annotations) {\n if (a.type !== \"rect\" || !a.label) continue;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) continue;\n const pad = 10;\n const w = ctx.measureText(a.label).width;\n const pos = a.labelPosition;\n const tx = pos.endsWith(\"left\")\n ? r.x + pad\n : pos.endsWith(\"right\")\n ? r.x + r.width - pad - w\n : r.x + (r.width - w) / 2;\n const ty = pos.startsWith(\"top\")\n ? r.y + pad\n : pos.startsWith(\"bottom\")\n ? r.y + r.height - pad - labelHeight\n : r.y + (r.height - labelHeight) / 2;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n ctx.fillStyle = toCss(a.labelColor);\n ctx.fillText(a.label, tx, ty);\n occupied.push({ x: tx, y: ty, width: w, height: labelHeight });\n }\n\n // free texts\n for (const a of input.annotations) {\n if (a.type !== \"text\" || !a.text) continue;\n ctx.font = font(theme, theme.fontSize, a.weight);\n const box = textBox(a, scales, ctx.measureText(a.text).width, labelHeight);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n haloText(ctx, a.text, box.x, box.y + box.height / 2, toCss(a.color), halo);\n occupied.push(box);\n }\n\n // point labels\n if (input.pointLabels.length) {\n ctx.font = font(theme);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n const textColor = toCss(theme.text, 0.85);\n const placed = placeLabels(\n input.pointLabels,\n plot,\n (t) => ctx.measureText(t).width,\n labelHeight - 2,\n occupied,\n );\n for (const { label, box } of placed) {\n haloText(ctx, label.text, box.x, box.y + box.height / 2, textColor, halo);\n }\n }\n ctx.restore();\n};\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- var e=(e,t,n,r)=>e.map(e=>{let i=e.type??t;return{...e,type:i,...n!==void 0&&i===t?{stack:e.stack??n}:{},...r!==void 0&&(i===`line`||i===`area`)?{curve:e.curve??r}:{}}}),t=(t,n=!1,r={})=>e(t,n?`area`:`line`,r.stacked?`stack`:void 0,r.curve),n=(t,n=!1,r=!1)=>e(t,`bar`,n?`stack`:void 0).map(e=>r&&e.type===`bar`?{...e,showLabels:e.showLabels??!0}:e),r=t=>e(t,`scatter`),i={topLeft:`var(--danger-color, #ef4444)`,topRight:`var(--primary-color, #4f46e5)`,bottomLeft:`var(--warning-color, #f59e0b)`,bottomRight:`var(--text-secondary-color, #64748b)`},a=`var(--border-strong-color, var(--border-color, #cbd5e1))`,o=e=>{let[t,n]=e.xDomain??[0,10],[r,i]=e.yDomain??[0,10];return{x0:t,x1:n,y0:r,y1:i,xs:e.xSplit??(t+n)/2,ys:e.ySplit??(r+i)/2}},s=(e,t,n)=>{let{xs:r,ys:i}=o(e),a=e.reverseX?t<r:t>=r;return n>=i?a?`topRight`:`topLeft`:a?`bottomRight`:`bottomLeft`},c=(e,t={})=>{let{x0:n,x1:r,y0:c,y1:l,xs:u,ys:d}=o(e),f=!!e.reverseX,p=t=>e.quadrants?.[t]?.color??i[t],m=[{type:`scatter`,name:e.name??``,pointSize:e.pointSize??12,showLabels:e.showLabels??!0,opacity:.9,data:e.points.map(t=>({x:t.x,y:t.y,label:t.label,size:t.size,color:t.color??p(s(e,t.x,t.y))}))}],h=f?[u,r]:[n,u],g=f?[n,u]:[u,r],_=(t,[n,r],[i,a],o)=>({type:`rect`,x0:n,x1:r,y0:i,y1:a,color:p(t),opacity:.07,label:e.quadrants?.[t]?.label,labelPosition:o}),v=e.axisLabels??{},y=f?r:n,b=f?n:r,x=[...v.top?[{type:`text`,x:u,y:l,text:v.top,anchor:`top`}]:[],...v.bottom?[{type:`text`,x:u,y:c,text:v.bottom,anchor:`bottom`}]:[],...v.left?[{type:`text`,x:y,y:d,text:v.left,anchor:`left`}]:[],...v.right?[{type:`text`,x:b,y:d,text:v.right,anchor:`right`}]:[]],S=[_(`topLeft`,h,[d,l],`top-left`),_(`topRight`,g,[d,l],`top-right`),_(`bottomLeft`,h,[c,d],`bottom-left`),_(`bottomRight`,g,[c,d],`bottom-right`),{type:`line`,axis:`x`,value:u,dash:[],color:a},{type:`line`,axis:`y`,value:d,dash:[],color:a},...x,...t.annotations??[]],C=e.showTicks??!0,w=t.interaction!==!1&&{zoom:!1,...typeof t.interaction==`object`?t.interaction:{},...e.draggable?{dragPoints:!0}:{}};return{...t,series:m,annotations:S,tooltip:t.tooltip??(C?void 0:{render:t=>{let n=t.items[0];if(!n)return null;let r=e.quadrants?.[s(e,n.x,n.y)]?.label;return[n.label??e.name??``,r??``].filter(Boolean).join(`
2
- `)}}),xAxis:{min:n,max:r,title:e.xLabel,reverse:f,nice:!1,grid:!1,tickCount:4,visible:C||!!e.xLabel,...C?{}:{format:()=>``}},yAxis:{min:c,max:l,title:e.yLabel,nice:!1,grid:!1,tickCount:4,visible:C||!!e.yLabel,...C?{}:{format:()=>``}},legend:t.legend??!1,padding:t.padding??(C?void 0:{top:4,right:4,bottom:4,left:4}),interaction:w}};exports.DEFAULT_QUADRANT_COLORS=i,exports.barSeries=n,exports.lineSeries=t,exports.quadrantChartOptions=c,exports.quadrantOf=s,exports.scatterSeries=r,exports.withSeriesType=e;
1
+ const e=require("./locale.cjs"),t=require("./scale.cjs");var n={en:{value:`Value`,values:`Values`,count:`Count`,change:`Change`,tasks:`Tasks`,progress:`Progress`,milestones:`Milestones`},zh:{value:`数值`,values:`数值`,count:`数量`,change:`变化`,tasks:`任务`,progress:`进度`,milestones:`里程碑`},ja:{value:`値`,values:`値`,count:`件数`,change:`増減`,tasks:`タスク`,progress:`進捗`,milestones:`マイルストーン`},fr:{value:`Valeur`,values:`Valeurs`,count:`Effectif`,change:`Variation`,tasks:`Tâches`,progress:`Avancement`,milestones:`Jalons`}},r=t=>e.localeLabels(n,t),i=(e,t,n,r)=>e.map(e=>{let i=e.type??t;return{...e,type:i,...n!==void 0&&i===t?{stack:e.stack??n}:{},...r!==void 0&&(i===`line`||i===`area`)?{curve:e.curve??r}:{}}}),a=(e,t=!1,n={})=>i(e,t?`area`:`line`,n.stacked?`stack`:void 0,n.curve),o=(e,t={})=>a(e,!0,t),s=(e,t=!1,n=!1)=>i(e,`bar`,t?`stack`:void 0).map(e=>n&&e.type===`bar`?{...e,showLabels:e.showLabels??!0}:e),c=e=>i(e,`scatter`),l=e=>i(e,`candlestick`),u=(e,t={})=>{let n=e.data.some(e=>typeof e.x==`number`),i=e.data.some(e=>typeof e.y==`number`);return{...t,series:[{id:`heatmap`,name:e.name??r(t.locale).value,type:`heatmap`,data:e.data.map(e=>({x:e.x,y:e.y,value:e.value})),colorScale:e.colorScale,valueRange:e.valueRange,radius:e.radius,format:e.format}],xAxis:{...n?{}:{type:`category`,categories:e.xCategories},grid:!1,...t.xAxis},yAxis:{...i?{}:{type:`category`,categories:e.yCategories},grid:!1,...t.yAxis},legend:t.legend??!1,interaction:t.interaction??{zoom:!1},tooltip:t.tooltip??{mode:`nearest`}}},d=(e,t={})=>{let n=e.type??`line`;return{...t,series:[{id:`sparkline`,name:e.name??r(t.locale).value,type:n,data:e.data,color:e.color,curve:n===`bar`?void 0:e.curve??`smooth`,lineWidth:1.5,opacity:n===`area`?.22:void 0,radius:n===`bar`?1.5:void 0,format:e.format}],xAxis:{visible:!1,grid:!1,...t.xAxis},yAxis:{visible:!1,grid:!1,nice:!1,...t.yAxis},legend:!1,padding:t.padding??{top:4,right:4,bottom:4,left:4},interaction:t.interaction??{zoom:!1},annotations:e.reference===void 0?t.annotations:[...t.annotations??[],{type:`line`,axis:`y`,value:e.reference,dash:[2,3]}]}},f={topLeft:`var(--danger-color, #ef4444)`,topRight:`var(--primary-color, #4f46e5)`,bottomLeft:`var(--warning-color, #f59e0b)`,bottomRight:`var(--text-secondary-color, #64748b)`},p=`var(--border-strong-color, var(--border-color, #cbd5e1))`,m=e=>{let[t,n]=e.xDomain??[0,10],[r,i]=e.yDomain??[0,10];return{x0:t,x1:n,y0:r,y1:i,xs:e.xSplit??(t+n)/2,ys:e.ySplit??(r+i)/2}},h=(e,t,n)=>{let{xs:r,ys:i}=m(e),a=e.reverseX?t<r:t>=r;return n>=i?a?`topRight`:`topLeft`:a?`bottomRight`:`bottomLeft`},g=(e,t={})=>{let{x0:n,x1:r,y0:i,y1:a,xs:o,ys:s}=m(e),c=!!e.reverseX,l=t=>e.quadrants?.[t]?.color??f[t],u=[{type:`scatter`,name:e.name??``,pointSize:e.pointSize??12,showLabels:e.showLabels??!0,opacity:.9,data:e.points.map(t=>({x:t.x,y:t.y,label:t.label,size:t.size,color:t.color??l(h(e,t.x,t.y))}))}],d=c?[o,r]:[n,o],g=c?[n,o]:[o,r],_=(t,[n,r],[i,a],o)=>({type:`rect`,x0:n,x1:r,y0:i,y1:a,color:l(t),opacity:.07,label:e.quadrants?.[t]?.label,labelPosition:o}),v=e.axisLabels??{},y=c?r:n,b=c?n:r,x=[...v.top?[{type:`text`,x:o,y:a,text:v.top,anchor:`top`}]:[],...v.bottom?[{type:`text`,x:o,y:i,text:v.bottom,anchor:`bottom`}]:[],...v.left?[{type:`text`,x:y,y:s,text:v.left,anchor:`left`}]:[],...v.right?[{type:`text`,x:b,y:s,text:v.right,anchor:`right`}]:[]],S=[_(`topLeft`,d,[s,a],`top-left`),_(`topRight`,g,[s,a],`top-right`),_(`bottomLeft`,d,[i,s],`bottom-left`),_(`bottomRight`,g,[i,s],`bottom-right`),{type:`line`,axis:`x`,value:o,dash:[],color:p},{type:`line`,axis:`y`,value:s,dash:[],color:p},...x,...t.annotations??[]],C=e.showTicks??!0,w=t.interaction!==!1&&{zoom:!1,...typeof t.interaction==`object`?t.interaction:{},...e.draggable?{dragPoints:!0}:{}};return{...t,series:u,annotations:S,tooltip:t.tooltip??(C?void 0:{render:t=>{let n=t.items[0];if(!n)return null;let r=e.quadrants?.[h(e,n.x,n.y)]?.label;return[n.label??e.name??``,r??``].filter(Boolean).join(`
2
+ `)}}),xAxis:{min:n,max:r,title:e.xLabel,reverse:c,nice:!1,grid:!1,tickCount:4,visible:C||!!e.xLabel,...C?{}:{format:()=>``}},yAxis:{min:i,max:a,title:e.yLabel,nice:!1,grid:!1,tickCount:4,visible:C||!!e.yLabel,...C?{}:{format:()=>``}},legend:t.legend??!1,padding:t.padding??(C?void 0:{top:4,right:4,bottom:4,left:4}),interaction:w}},_=e=>{let t=0;for(let n=0;n<e.length;n++)Number.isFinite(e[n])&&t++;let n=new Float64Array(t),r=0;for(let t=0;t<e.length;t++){let i=e[t];Number.isFinite(i)&&(n[r++]=i)}return n.sort()},v=(e,t)=>{let n=e.length;if(!n)return NaN;let r=Math.min(1,Math.max(0,t))*(n-1),i=Math.floor(r),a=Math.min(n-1,i+1);return e[i]+(e[a]-e[i])*(r-i)},y=1e5,b=(e,n={})=>{let r=0,i=1/0,a=-1/0;for(let t=0;t<e.length;t++){let n=e[t];Number.isFinite(n)&&(r++,n<i&&(i=n),n>a&&(a=n))}let[o,s]=n.domain??[i,a];if(!r||!Number.isFinite(o)||!Number.isFinite(s))return{edges:[0,1],counts:[0],width:1,total:0};o>s&&([o,s]=[s,o]),s===o&&(o-=.5,s+=.5);let c=s-o,l=n.bins??`auto`,u=Math.ceil(Math.log2(r))+1,d;if(typeof l==`number`)d=Math.round(l);else if(l===`sturges`)d=u;else{let t=Math.max(1,Math.floor(e.length/y)),n=[];for(let r=0;r<e.length;r+=t){let t=e[r];Number.isFinite(t)&&n.push(t)}let i=Float64Array.from(n).sort(),a=2*(v(i,.75)-v(i,.25))/Math.cbrt(r);d=a>0?Math.ceil(c/a):u}d=Math.max(1,Math.min(1e3,d||1));let f=c/d,p=o;(n.nice??!0)&&(f=t.tickStep(o,s,d)||f,p=Math.floor(o/f+1e-9)*f,d=Math.max(1,Math.ceil((s-p)/f-1e-9)));let m=p+d*f,h=Array(d).fill(0),g=0;for(let t=0;t<e.length;t++){let n=e[t];if(!(n>=p&&n<=m))continue;let r=Math.min(d-1,Math.floor((n-p)/f));h[r]++,g++}let _=[];for(let e=0;e<=d;e++)_.push(Number((p+e*f).toPrecision(12)));return{edges:_,counts:h,width:f,total:g}},x=(t,n={})=>{let i=n.binned??b(t,n),a=e.resolveLocale(n.locale),o=n.format??(e=>S(e,a));return{id:`histogram`,name:n.name??r(a).count,type:`bar`,color:n.color,barWidth:1,radius:1,data:i.counts.map((e,t)=>{let n=i.edges[t]??0,r=i.edges[t+1]??n;return{x:(n+r)/2,y:e,label:`${o(n)} – ${o(r)}`}})}},S=(t,n)=>e.numberFormat(n,{maximumSignificantDigits:6}).format(t),C=(e,t={})=>{let n=_(e),r=n.length;if(!r)return{low:NaN,q1:NaN,median:NaN,q3:NaN,high:NaN,outliers:[],min:NaN,max:NaN,mean:NaN,count:0};let i=v(n,.25),a=v(n,.5),o=v(n,.75),s=n[0],c=n[r-1],l=0;for(let e=0;e<r;e++)l+=n[e];let u=t.whisker??1.5,d=s,f=c,p=[];if(u!==`minmax`){let e=(o-i)*u,t=i-e,a=o+e,s=0;for(;s<r&&n[s]<t;)p.push(n[s++]);d=s<r?n[s]:i;let c=r-1,l=[];for(;c>=0&&n[c]>a;)l.push(n[c--]);f=c>=0?n[c]:o,p.push(...l.reverse())}return{low:Math.min(d,i),q1:i,median:a,q3:o,high:Math.max(f,o),outliers:p,min:s,max:c,mean:l/r,count:r}},w=(e,t={})=>e.map(e=>{let n=C(e.values,t);return{x:e.x,y:Number.isFinite(n.median)?n.median:null,low:n.low,q1:n.q1,q3:n.q3,high:n.high,outliers:n.outliers,...e.color?{color:e.color}:{}}}),T=e=>i(e,`boxplot`),E=(e,t={})=>{let n=t.upColor??`var(--success-color, #16a34a)`,i=t.downColor??`var(--danger-color, #dc2626)`,a=t.totalColor??`var(--primary-color, #4f46e5)`,o=t.start??0,s=e.map(e=>{if(e.kind===`total`||e.kind===`subtotal`)return{x:e.label,y:o,color:e.color??a};let t=e.value??0,r=o;return o+=t,{x:e.label,y0:r,y:o,color:e.color??(t>=0?n:i)}});return{id:`waterfall`,name:t.name??r(t.locale).change,type:`bar`,color:a,data:s,showLabels:t.labels??!1,format:t.format}},D=(e,t={})=>{let n=t.minSize??6,r=t.maxSize??48,i=e=>{if(typeof e!=`object`||!e)return null;if(!(`length`in e))return e.value??null;let t=e,n=new Float64Array(t.length).fill(NaN);for(let e=0;e<t.length;e++){let r=t[e];if(r&&typeof r==`object`&&!Array.isArray(r)){let t=r.value;typeof t==`number`&&(n[e]=t)}}return n},a=t.maxValue??0;if(t.maxValue===void 0)for(let t of e){let e=i(t.data);if(e)for(let t=0;t<e.length;t++){let n=Math.abs(e[t]);n>a&&(a=n)}}let o=e=>Number.isFinite(e)&&a>0?Math.max(n,r*Math.sqrt(Math.min(1,Math.abs(e)/a))):n;return e.map(e=>{let t={...e,type:e.type??`scatter`,opacity:e.opacity??.68};if(t.type!==`scatter`)return t;let n=e.data;if(typeof n==`object`&&n&&!(`length`in n)){let e=n.value;if(!e)return t;let r=new Float32Array(e.length);for(let t=0;t<e.length;t++)r[t]=o(e[t]);return{...t,data:{...n,size:r}}}let r=n,i=[];for(let e=0;e<r.length;e++){let t=r[e];if(!t||typeof t!=`object`||Array.isArray(t))continue;let n=t;i.push({...n,size:n.size??o(typeof n.value==`number`?n.value:NaN)})}return i.sort((e,t)=>(t.size??0)-(e.size??0)),{...t,data:i}})},O=[`--primary-color`,`--success-color`,`--warning-color`,`--danger-color`,`--info-color`],k=[`#4f46e5`,`#10b981`,`#f59e0b`,`#ef4444`,`#0ea5e9`,`#8b5cf6`,`#14b8a6`,`#f97316`],A=e=>{let t=e%8,n=k[t]??`#4f46e5`,r=O[t];return r?`var(--chart-series-${t+1}, var(${r}, ${n}))`:`var(--chart-series-${t+1}, ${n})`},j=e=>e instanceof Date?e.getTime():e===void 0?NaN:e,M=(t,n={})=>{let i=e.resolveLocale(n.locale),a=r(i),o=n.taskName??a.tasks,s=[];for(let e of t){let t=e.group??o;!e.milestone&&!s.includes(t)&&s.push(t)}let c=e=>{let t=Math.max(0,s.indexOf(e));return n.colors?.[t]??A(t)},l=n.formatProgress??(t=>e.numberFormat(i,{style:`percent`,maximumFractionDigits:0}).format(t)),u=s.map(e=>({id:`gantt:${e}`,name:e,type:`bar`,stack:`gantt`,color:c(e),opacity:.3,barWidth:.62,radius:4,data:t.filter(t=>!t.milestone&&(t.group??o)===e).map(e=>({x:e.name,y0:j(e.start),y:j(e.end??e.start),...e.color?{color:e.color}:{}}))})),d=t.filter(e=>!e.milestone&&e.progress!==void 0&&e.progress>0);d.length&&u.push({id:`gantt:progress`,name:n.progressName??a.progress,type:`bar`,stack:`gantt`,color:`var(--text-secondary-color, #6b7280)`,radius:4,data:d.map(e=>{let t=j(e.start),n=j(e.end??e.start),r=Math.min(1,Math.max(0,e.progress??0));return{x:e.name,y0:t,y:t+(n-t)*r,label:l(r),color:e.color??c(e.group??o)}})});let f=t.filter(e=>e.milestone);f.length&&u.push({id:`gantt:milestones`,name:n.milestoneName??a.milestones,type:`scatter`,color:`var(--text-color, #1f2937)`,pointSize:13,opacity:1,data:f.map(e=>({x:e.name,y:j(e.start),...e.color?{color:e.color}:{}}))});let p=1/0,m=-1/0;for(let e of t)for(let t of[j(e.start),j(e.end??e.start)])t<p&&(p=t),t>m&&(m=t);let h=Number.isFinite(m-p)?Math.max((m-p)*.025,1):0;return{series:u,categories:t.map(e=>e.name),domain:Number.isFinite(p)?[p-h,m+h]:[0,1]}},N=(e,t)=>i(e,`area`,void 0,t).map(e=>e.type===`area`?{...e,lineWidth:e.lineWidth??1.5}:e);exports.DEFAULT_QUADRANT_COLORS=f,exports.areaSeries=o,exports.barSeries=s,exports.binValues=b,exports.boxplotData=w,exports.boxplotSeries=T,exports.boxplotStats=C,exports.bubbleSeries=D,exports.candlestickSeries=l,exports.ganttSeries=M,exports.heatmapChartOptions=u,exports.histogramSeries=x,exports.lineSeries=a,exports.paletteColor=A,exports.presetLabels=r,exports.quadrantChartOptions=g,exports.quadrantOf=h,exports.rangeAreaSeries=N,exports.scatterSeries=c,exports.sparklineOptions=d,exports.waterfallSeries=E,exports.withSeriesType=i;
3
3
  //# sourceMappingURL=presets.cjs.map