minerva-design 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (670) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +21 -21
  3. package/custom-elements.json +4047 -1703
  4. package/dist/angular/fesm2022/minerva-angular.mjs +1436 -5
  5. package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
  6. package/dist/angular/types/minerva-angular.d.ts +573 -4
  7. package/dist/charts/canvas.d.cts +2 -2
  8. package/dist/charts/canvas.d.ts +2 -2
  9. package/dist/charts/core.cjs +1 -1
  10. package/dist/charts/core.d.cts +6 -4
  11. package/dist/charts/core.d.ts +6 -4
  12. package/dist/charts/core.js +24 -16
  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 +42 -19
  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.js +154 -127
  20. package/dist/charts/engine/canvas.js.map +1 -1
  21. package/dist/charts/engine/chart.cjs +1 -1
  22. package/dist/charts/engine/chart.cjs.map +1 -1
  23. package/dist/charts/engine/chart.js +365 -251
  24. package/dist/charts/engine/chart.js.map +1 -1
  25. package/dist/charts/engine/color.cjs +1 -1
  26. package/dist/charts/engine/color.cjs.map +1 -1
  27. package/dist/charts/engine/color.d.cts +18 -0
  28. package/dist/charts/engine/color.d.ts +18 -0
  29. package/dist/charts/engine/color.js +48 -2
  30. package/dist/charts/engine/color.js.map +1 -1
  31. package/dist/charts/engine/controller.cjs +2 -2
  32. package/dist/charts/engine/controller.cjs.map +1 -1
  33. package/dist/charts/engine/controller.d.cts +32 -1
  34. package/dist/charts/engine/controller.d.ts +32 -1
  35. package/dist/charts/engine/controller.js +310 -263
  36. package/dist/charts/engine/controller.js.map +1 -1
  37. package/dist/charts/engine/data.cjs +1 -1
  38. package/dist/charts/engine/data.cjs.map +1 -1
  39. package/dist/charts/engine/data.d.cts +3 -1
  40. package/dist/charts/engine/data.d.ts +3 -1
  41. package/dist/charts/engine/data.js +6 -4
  42. package/dist/charts/engine/data.js.map +1 -1
  43. package/dist/charts/engine/defaults.cjs +2 -0
  44. package/dist/charts/engine/defaults.cjs.map +1 -0
  45. package/dist/charts/engine/defaults.d.cts +20 -0
  46. package/dist/charts/engine/defaults.d.ts +20 -0
  47. package/dist/charts/engine/defaults.js +35 -0
  48. package/dist/charts/engine/defaults.js.map +1 -0
  49. package/dist/charts/engine/format.cjs +1 -1
  50. package/dist/charts/engine/format.cjs.map +1 -1
  51. package/dist/charts/engine/format.d.cts +6 -0
  52. package/dist/charts/engine/format.d.ts +6 -0
  53. package/dist/charts/engine/format.js +15 -2
  54. package/dist/charts/engine/format.js.map +1 -1
  55. package/dist/charts/engine/graph/chart.cjs +2 -0
  56. package/dist/charts/engine/graph/chart.cjs.map +1 -0
  57. package/dist/charts/engine/graph/chart.d.cts +3 -0
  58. package/dist/charts/engine/graph/chart.d.ts +3 -0
  59. package/dist/charts/engine/graph/chart.js +1565 -0
  60. package/dist/charts/engine/graph/chart.js.map +1 -0
  61. package/dist/charts/engine/graph/circular.cjs +2 -0
  62. package/dist/charts/engine/graph/circular.cjs.map +1 -0
  63. package/dist/charts/engine/graph/circular.d.cts +16 -0
  64. package/dist/charts/engine/graph/circular.d.ts +16 -0
  65. package/dist/charts/engine/graph/circular.js +62 -0
  66. package/dist/charts/engine/graph/circular.js.map +1 -0
  67. package/dist/charts/engine/graph/dag.cjs +2 -0
  68. package/dist/charts/engine/graph/dag.cjs.map +1 -0
  69. package/dist/charts/engine/graph/dag.d.cts +34 -0
  70. package/dist/charts/engine/graph/dag.d.ts +34 -0
  71. package/dist/charts/engine/graph/dag.js +314 -0
  72. package/dist/charts/engine/graph/dag.js.map +1 -0
  73. package/dist/charts/engine/graph/dom.cjs +2 -0
  74. package/dist/charts/engine/graph/dom.cjs.map +1 -0
  75. package/dist/charts/engine/graph/dom.d.cts +23 -0
  76. package/dist/charts/engine/graph/dom.d.ts +23 -0
  77. package/dist/charts/engine/graph/dom.js +158 -0
  78. package/dist/charts/engine/graph/dom.js.map +1 -0
  79. package/dist/charts/engine/graph/force.cjs +2 -0
  80. package/dist/charts/engine/graph/force.cjs.map +1 -0
  81. package/dist/charts/engine/graph/force.d.cts +67 -0
  82. package/dist/charts/engine/graph/force.d.ts +67 -0
  83. package/dist/charts/engine/graph/force.js +325 -0
  84. package/dist/charts/engine/graph/force.js.map +1 -0
  85. package/dist/charts/engine/graph/geometry.cjs +2 -0
  86. package/dist/charts/engine/graph/geometry.cjs.map +1 -0
  87. package/dist/charts/engine/graph/geometry.d.cts +37 -0
  88. package/dist/charts/engine/graph/geometry.d.ts +37 -0
  89. package/dist/charts/engine/graph/geometry.js +144 -0
  90. package/dist/charts/engine/graph/geometry.js.map +1 -0
  91. package/dist/charts/engine/graph/index.cjs +1 -0
  92. package/dist/charts/engine/graph/index.d.cts +6 -0
  93. package/dist/charts/engine/graph/index.d.ts +6 -0
  94. package/dist/charts/engine/graph/index.js +6 -0
  95. package/dist/charts/engine/graph/labels.cjs +2 -0
  96. package/dist/charts/engine/graph/labels.cjs.map +1 -0
  97. package/dist/charts/engine/graph/labels.d.cts +12 -0
  98. package/dist/charts/engine/graph/labels.d.ts +12 -0
  99. package/dist/charts/engine/graph/labels.js +128 -0
  100. package/dist/charts/engine/graph/labels.js.map +1 -0
  101. package/dist/charts/engine/graph/model.cjs +2 -0
  102. package/dist/charts/engine/graph/model.cjs.map +1 -0
  103. package/dist/charts/engine/graph/model.d.cts +43 -0
  104. package/dist/charts/engine/graph/model.d.ts +43 -0
  105. package/dist/charts/engine/graph/model.js +88 -0
  106. package/dist/charts/engine/graph/model.js.map +1 -0
  107. package/dist/charts/engine/graph/sizing.cjs +2 -0
  108. package/dist/charts/engine/graph/sizing.cjs.map +1 -0
  109. package/dist/charts/engine/graph/sizing.d.cts +33 -0
  110. package/dist/charts/engine/graph/sizing.d.ts +33 -0
  111. package/dist/charts/engine/graph/sizing.js +60 -0
  112. package/dist/charts/engine/graph/sizing.js.map +1 -0
  113. package/dist/charts/engine/graph/tree.cjs +2 -0
  114. package/dist/charts/engine/graph/tree.cjs.map +1 -0
  115. package/dist/charts/engine/graph/tree.d.cts +30 -0
  116. package/dist/charts/engine/graph/tree.d.ts +30 -0
  117. package/dist/charts/engine/graph/tree.js +218 -0
  118. package/dist/charts/engine/graph/tree.js.map +1 -0
  119. package/dist/charts/engine/graph/types.d.cts +626 -0
  120. package/dist/charts/engine/graph/types.d.ts +626 -0
  121. package/dist/charts/engine/graph/worker.cjs +46 -0
  122. package/dist/charts/engine/graph/worker.cjs.map +1 -0
  123. package/dist/charts/engine/graph/worker.d.cts +36 -0
  124. package/dist/charts/engine/graph/worker.d.ts +36 -0
  125. package/dist/charts/engine/graph/worker.js +129 -0
  126. package/dist/charts/engine/graph/worker.js.map +1 -0
  127. package/dist/charts/engine/items.cjs +1 -1
  128. package/dist/charts/engine/items.cjs.map +1 -1
  129. package/dist/charts/engine/items.d.cts +15 -2
  130. package/dist/charts/engine/items.d.ts +15 -2
  131. package/dist/charts/engine/items.js +131 -112
  132. package/dist/charts/engine/items.js.map +1 -1
  133. package/dist/charts/engine/labels.cjs +1 -1
  134. package/dist/charts/engine/labels.cjs.map +1 -1
  135. package/dist/charts/engine/labels.js +28 -4
  136. package/dist/charts/engine/labels.js.map +1 -1
  137. package/dist/charts/engine/layout.cjs +1 -1
  138. package/dist/charts/engine/layout.cjs.map +1 -1
  139. package/dist/charts/engine/layout.d.cts +9 -0
  140. package/dist/charts/engine/layout.d.ts +9 -0
  141. package/dist/charts/engine/layout.js +11 -2
  142. package/dist/charts/engine/layout.js.map +1 -1
  143. package/dist/charts/engine/model.cjs +1 -1
  144. package/dist/charts/engine/model.cjs.map +1 -1
  145. package/dist/charts/engine/model.d.cts +40 -3
  146. package/dist/charts/engine/model.d.ts +40 -3
  147. package/dist/charts/engine/model.js +246 -165
  148. package/dist/charts/engine/model.js.map +1 -1
  149. package/dist/charts/engine/orderbook/format.cjs +1 -1
  150. package/dist/charts/engine/orderbook/format.cjs.map +1 -1
  151. package/dist/charts/engine/orderbook/format.d.cts +3 -2
  152. package/dist/charts/engine/orderbook/format.d.ts +3 -2
  153. package/dist/charts/engine/orderbook/format.js +5 -5
  154. package/dist/charts/engine/orderbook/format.js.map +1 -1
  155. package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
  156. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
  157. package/dist/charts/engine/orderbook/heatmap.js +527 -408
  158. package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
  159. package/dist/charts/engine/orderbook/layout.cjs +2 -0
  160. package/dist/charts/engine/orderbook/layout.cjs.map +1 -0
  161. package/dist/charts/engine/orderbook/layout.d.cts +37 -0
  162. package/dist/charts/engine/orderbook/layout.d.ts +37 -0
  163. package/dist/charts/engine/orderbook/layout.js +70 -0
  164. package/dist/charts/engine/orderbook/layout.js.map +1 -0
  165. package/dist/charts/engine/orderbook/tape.cjs +1 -1
  166. package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
  167. package/dist/charts/engine/orderbook/tape.js +1 -1
  168. package/dist/charts/engine/orderbook/tape.js.map +1 -1
  169. package/dist/charts/engine/orderbook/types.d.cts +18 -2
  170. package/dist/charts/engine/orderbook/types.d.ts +18 -2
  171. package/dist/charts/engine/overlay.cjs +1 -1
  172. package/dist/charts/engine/overlay.cjs.map +1 -1
  173. package/dist/charts/engine/overlay.d.cts +10 -0
  174. package/dist/charts/engine/overlay.d.ts +10 -0
  175. package/dist/charts/engine/overlay.js +6 -0
  176. package/dist/charts/engine/overlay.js.map +1 -1
  177. package/dist/charts/engine/presets.cjs +2 -2
  178. package/dist/charts/engine/presets.cjs.map +1 -1
  179. package/dist/charts/engine/presets.d.cts +25 -3
  180. package/dist/charts/engine/presets.d.ts +25 -3
  181. package/dist/charts/engine/presets.js +115 -101
  182. package/dist/charts/engine/presets.js.map +1 -1
  183. package/dist/charts/engine/renderers/detect.cjs +1 -1
  184. package/dist/charts/engine/renderers/detect.cjs.map +1 -1
  185. package/dist/charts/engine/renderers/detect.d.cts +2 -1
  186. package/dist/charts/engine/renderers/detect.d.ts +2 -1
  187. package/dist/charts/engine/renderers/detect.js +23 -21
  188. package/dist/charts/engine/renderers/detect.js.map +1 -1
  189. package/dist/charts/engine/scene.cjs +1 -1
  190. package/dist/charts/engine/scene.cjs.map +1 -1
  191. package/dist/charts/engine/scene.d.cts +57 -4
  192. package/dist/charts/engine/scene.d.ts +57 -4
  193. package/dist/charts/engine/scene.js +335 -182
  194. package/dist/charts/engine/scene.js.map +1 -1
  195. package/dist/charts/engine/shapes/bullet.cjs +1 -1
  196. package/dist/charts/engine/shapes/bullet.cjs.map +1 -1
  197. package/dist/charts/engine/shapes/bullet.js +110 -110
  198. package/dist/charts/engine/shapes/bullet.js.map +1 -1
  199. package/dist/charts/engine/shapes/chart.cjs +1 -1
  200. package/dist/charts/engine/shapes/chart.cjs.map +1 -1
  201. package/dist/charts/engine/shapes/chart.js +4 -1
  202. package/dist/charts/engine/shapes/chart.js.map +1 -1
  203. package/dist/charts/engine/shapes/chord.cjs +2 -0
  204. package/dist/charts/engine/shapes/chord.cjs.map +1 -0
  205. package/dist/charts/engine/shapes/chord.d.cts +18 -0
  206. package/dist/charts/engine/shapes/chord.d.ts +18 -0
  207. package/dist/charts/engine/shapes/chord.js +414 -0
  208. package/dist/charts/engine/shapes/chord.js.map +1 -0
  209. package/dist/charts/engine/shapes/draw.cjs +1 -1
  210. package/dist/charts/engine/shapes/draw.cjs.map +1 -1
  211. package/dist/charts/engine/shapes/draw.d.cts +5 -1
  212. package/dist/charts/engine/shapes/draw.d.ts +5 -1
  213. package/dist/charts/engine/shapes/draw.js +47 -17
  214. package/dist/charts/engine/shapes/draw.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 +75 -46
  220. package/dist/charts/engine/shapes/hit.js.map +1 -1
  221. package/dist/charts/engine/shapes/index.d.cts +3 -2
  222. package/dist/charts/engine/shapes/index.d.ts +3 -2
  223. package/dist/charts/engine/shapes/labels.cjs +1 -1
  224. package/dist/charts/engine/shapes/labels.cjs.map +1 -1
  225. package/dist/charts/engine/shapes/labels.js +12 -4
  226. package/dist/charts/engine/shapes/labels.js.map +1 -1
  227. package/dist/charts/engine/shapes/layout.cjs +2 -2
  228. package/dist/charts/engine/shapes/layout.cjs.map +1 -1
  229. package/dist/charts/engine/shapes/layout.d.cts +3 -1
  230. package/dist/charts/engine/shapes/layout.d.ts +3 -1
  231. package/dist/charts/engine/shapes/layout.js +106 -78
  232. package/dist/charts/engine/shapes/layout.js.map +1 -1
  233. package/dist/charts/engine/shapes/scene.cjs +1 -1
  234. package/dist/charts/engine/shapes/scene.cjs.map +1 -1
  235. package/dist/charts/engine/shapes/scene.d.cts +33 -3
  236. package/dist/charts/engine/shapes/scene.d.ts +33 -3
  237. package/dist/charts/engine/shapes/scene.js +62 -19
  238. package/dist/charts/engine/shapes/scene.js.map +1 -1
  239. package/dist/charts/engine/shapes/types.d.cts +119 -8
  240. package/dist/charts/engine/shapes/types.d.ts +119 -8
  241. package/dist/charts/engine/signature.cjs +1 -1
  242. package/dist/charts/engine/signature.cjs.map +1 -1
  243. package/dist/charts/engine/signature.js +1 -1
  244. package/dist/charts/engine/signature.js.map +1 -1
  245. package/dist/charts/engine/three-d/canvas2d.cjs +1 -1
  246. package/dist/charts/engine/three-d/canvas2d.cjs.map +1 -1
  247. package/dist/charts/engine/three-d/canvas2d.d.cts +5 -2
  248. package/dist/charts/engine/three-d/canvas2d.d.ts +5 -2
  249. package/dist/charts/engine/three-d/canvas2d.js +89 -65
  250. package/dist/charts/engine/three-d/canvas2d.js.map +1 -1
  251. package/dist/charts/engine/three-d/detect.cjs +1 -1
  252. package/dist/charts/engine/three-d/detect.cjs.map +1 -1
  253. package/dist/charts/engine/three-d/detect.d.cts +3 -2
  254. package/dist/charts/engine/three-d/detect.d.ts +3 -2
  255. package/dist/charts/engine/three-d/detect.js +22 -20
  256. package/dist/charts/engine/three-d/detect.js.map +1 -1
  257. package/dist/charts/engine/three-d/geometry.cjs +1 -1
  258. package/dist/charts/engine/three-d/geometry.cjs.map +1 -1
  259. package/dist/charts/engine/three-d/geometry.d.cts +6 -0
  260. package/dist/charts/engine/three-d/geometry.d.ts +6 -0
  261. package/dist/charts/engine/three-d/geometry.js +106 -90
  262. package/dist/charts/engine/three-d/geometry.js.map +1 -1
  263. package/dist/charts/engine/three-d/model.cjs +1 -1
  264. package/dist/charts/engine/three-d/model.cjs.map +1 -1
  265. package/dist/charts/engine/three-d/model.d.cts +2 -0
  266. package/dist/charts/engine/three-d/model.d.ts +2 -0
  267. package/dist/charts/engine/three-d/model.js +2 -0
  268. package/dist/charts/engine/three-d/model.js.map +1 -1
  269. package/dist/charts/engine/three-d/overlay.cjs +1 -1
  270. package/dist/charts/engine/three-d/overlay.cjs.map +1 -1
  271. package/dist/charts/engine/three-d/overlay.js +43 -36
  272. package/dist/charts/engine/three-d/overlay.js.map +1 -1
  273. package/dist/charts/engine/three-d/render-types.cjs +1 -1
  274. package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
  275. package/dist/charts/engine/three-d/render-types.d.cts +24 -3
  276. package/dist/charts/engine/three-d/render-types.d.ts +24 -3
  277. package/dist/charts/engine/three-d/render-types.js +6 -7
  278. package/dist/charts/engine/three-d/render-types.js.map +1 -1
  279. package/dist/charts/engine/three-d/shaders.cjs +63 -28
  280. package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
  281. package/dist/charts/engine/three-d/shaders.d.cts +2 -3
  282. package/dist/charts/engine/three-d/shaders.d.ts +2 -3
  283. package/dist/charts/engine/three-d/shaders.js +41 -22
  284. package/dist/charts/engine/three-d/shaders.js.map +1 -1
  285. package/dist/charts/engine/three-d/sort.cjs +1 -1
  286. package/dist/charts/engine/three-d/sort.cjs.map +1 -1
  287. package/dist/charts/engine/three-d/sort.d.cts +15 -4
  288. package/dist/charts/engine/three-d/sort.d.ts +15 -4
  289. package/dist/charts/engine/three-d/sort.js +117 -43
  290. package/dist/charts/engine/three-d/sort.js.map +1 -1
  291. package/dist/charts/engine/three-d/types.d.cts +27 -0
  292. package/dist/charts/engine/three-d/types.d.ts +27 -0
  293. package/dist/charts/engine/three-d/webgl.cjs +1 -1
  294. package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
  295. package/dist/charts/engine/three-d/webgl.js +15 -13
  296. package/dist/charts/engine/three-d/webgl.js.map +1 -1
  297. package/dist/charts/engine/three-d/webgpu.cjs +1 -1
  298. package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
  299. package/dist/charts/engine/three-d/webgpu.js +50 -39
  300. package/dist/charts/engine/three-d/webgpu.js.map +1 -1
  301. package/dist/charts/engine/trading/chart.cjs +1 -1
  302. package/dist/charts/engine/trading/chart.cjs.map +1 -1
  303. package/dist/charts/engine/trading/chart.d.cts +10 -0
  304. package/dist/charts/engine/trading/chart.d.ts +10 -0
  305. package/dist/charts/engine/trading/chart.js +1475 -776
  306. package/dist/charts/engine/trading/chart.js.map +1 -1
  307. package/dist/charts/engine/trading/drawings.cjs +2 -1
  308. package/dist/charts/engine/trading/drawings.cjs.map +1 -1
  309. package/dist/charts/engine/trading/drawings.d.cts +47 -9
  310. package/dist/charts/engine/trading/drawings.d.ts +47 -9
  311. package/dist/charts/engine/trading/drawings.js +338 -75
  312. package/dist/charts/engine/trading/drawings.js.map +1 -1
  313. package/dist/charts/engine/trading/format.cjs +1 -1
  314. package/dist/charts/engine/trading/format.cjs.map +1 -1
  315. package/dist/charts/engine/trading/format.d.cts +13 -0
  316. package/dist/charts/engine/trading/format.d.ts +13 -0
  317. package/dist/charts/engine/trading/format.js +51 -19
  318. package/dist/charts/engine/trading/format.js.map +1 -1
  319. package/dist/charts/engine/trading/index.cjs +1 -1
  320. package/dist/charts/engine/trading/index.d.cts +2 -1
  321. package/dist/charts/engine/trading/index.d.ts +2 -1
  322. package/dist/charts/engine/trading/index.js +4 -3
  323. package/dist/charts/engine/trading/indicators.cjs +1 -1
  324. package/dist/charts/engine/trading/indicators.cjs.map +1 -1
  325. package/dist/charts/engine/trading/indicators.d.cts +180 -10
  326. package/dist/charts/engine/trading/indicators.d.ts +180 -10
  327. package/dist/charts/engine/trading/indicators.js +449 -173
  328. package/dist/charts/engine/trading/indicators.js.map +1 -1
  329. package/dist/charts/engine/trading/labels.cjs +1 -1
  330. package/dist/charts/engine/trading/labels.cjs.map +1 -1
  331. package/dist/charts/engine/trading/labels.js +84 -4
  332. package/dist/charts/engine/trading/labels.js.map +1 -1
  333. package/dist/charts/engine/trading/store.cjs +1 -1
  334. package/dist/charts/engine/trading/store.cjs.map +1 -1
  335. package/dist/charts/engine/trading/store.d.cts +21 -0
  336. package/dist/charts/engine/trading/store.d.ts +21 -0
  337. package/dist/charts/engine/trading/store.js +22 -1
  338. package/dist/charts/engine/trading/store.js.map +1 -1
  339. package/dist/charts/engine/trading/studies.cjs +1 -1
  340. package/dist/charts/engine/trading/studies.cjs.map +1 -1
  341. package/dist/charts/engine/trading/studies.d.cts +41 -8
  342. package/dist/charts/engine/trading/studies.d.ts +41 -8
  343. package/dist/charts/engine/trading/studies.js +349 -93
  344. package/dist/charts/engine/trading/studies.js.map +1 -1
  345. package/dist/charts/engine/trading/sync.cjs +2 -0
  346. package/dist/charts/engine/trading/sync.cjs.map +1 -0
  347. package/dist/charts/engine/trading/sync.d.cts +8 -0
  348. package/dist/charts/engine/trading/sync.d.ts +8 -0
  349. package/dist/charts/engine/trading/sync.js +25 -0
  350. package/dist/charts/engine/trading/sync.js.map +1 -0
  351. package/dist/charts/engine/trading/types.d.cts +484 -9
  352. package/dist/charts/engine/trading/types.d.ts +484 -9
  353. package/dist/charts/engine/types.d.cts +82 -8
  354. package/dist/charts/engine/types.d.ts +82 -8
  355. package/dist/charts/index.cjs +1 -1
  356. package/dist/charts/index.d.cts +3 -2
  357. package/dist/charts/index.d.ts +3 -2
  358. package/dist/charts/index.js +30 -22
  359. package/dist/charts/react/charts.cjs +1 -1
  360. package/dist/charts/react/charts.cjs.map +1 -1
  361. package/dist/charts/react/charts.js +46 -34
  362. package/dist/charts/react/charts.js.map +1 -1
  363. package/dist/charts/react/graph.cjs +2 -0
  364. package/dist/charts/react/graph.cjs.map +1 -0
  365. package/dist/charts/react/graph.d.cts +213 -0
  366. package/dist/charts/react/graph.d.ts +213 -0
  367. package/dist/charts/react/graph.js +159 -0
  368. package/dist/charts/react/graph.js.map +1 -0
  369. package/dist/charts/react/shapes.cjs +1 -1
  370. package/dist/charts/react/shapes.cjs.map +1 -1
  371. package/dist/charts/react/shapes.d.cts +87 -4
  372. package/dist/charts/react/shapes.d.ts +87 -4
  373. package/dist/charts/react/shapes.js +55 -12
  374. package/dist/charts/react/shapes.js.map +1 -1
  375. package/dist/charts/react/trading.cjs +1 -1
  376. package/dist/charts/react/trading.cjs.map +1 -1
  377. package/dist/charts/react/trading.d.cts +53 -1
  378. package/dist/charts/react/trading.d.ts +53 -1
  379. package/dist/charts/react/trading.js +68 -37
  380. package/dist/charts/react/trading.js.map +1 -1
  381. package/dist/charts/react/types.d.cts +11 -0
  382. package/dist/charts/react/types.d.ts +11 -0
  383. package/dist/core/contracts.cjs +1 -1
  384. package/dist/core/contracts.cjs.map +1 -1
  385. package/dist/core/contracts.js +1 -1
  386. package/dist/core/contracts.js.map +1 -1
  387. package/dist/native/charts/src/canvas.cjs +1 -1
  388. package/dist/native/charts/src/canvas.js +3 -3
  389. package/dist/native/charts/src/engine/axis.cjs +1 -1
  390. package/dist/native/charts/src/engine/axis.cjs.map +1 -1
  391. package/dist/native/charts/src/engine/axis.js +42 -19
  392. package/dist/native/charts/src/engine/axis.js.map +1 -1
  393. package/dist/native/charts/src/engine/color.cjs +1 -1
  394. package/dist/native/charts/src/engine/color.cjs.map +1 -1
  395. package/dist/native/charts/src/engine/color.js +47 -5
  396. package/dist/native/charts/src/engine/color.js.map +1 -1
  397. package/dist/native/charts/src/engine/controller.cjs +2 -2
  398. package/dist/native/charts/src/engine/controller.cjs.map +1 -1
  399. package/dist/native/charts/src/engine/controller.js +300 -253
  400. package/dist/native/charts/src/engine/controller.js.map +1 -1
  401. package/dist/native/charts/src/engine/data.cjs +1 -1
  402. package/dist/native/charts/src/engine/data.cjs.map +1 -1
  403. package/dist/native/charts/src/engine/data.js +6 -4
  404. package/dist/native/charts/src/engine/data.js.map +1 -1
  405. package/dist/native/charts/src/engine/format.cjs +1 -1
  406. package/dist/native/charts/src/engine/format.cjs.map +1 -1
  407. package/dist/native/charts/src/engine/format.js +15 -2
  408. package/dist/native/charts/src/engine/format.js.map +1 -1
  409. package/dist/native/charts/src/engine/labels.cjs +1 -1
  410. package/dist/native/charts/src/engine/labels.cjs.map +1 -1
  411. package/dist/native/charts/src/engine/labels.js +28 -4
  412. package/dist/native/charts/src/engine/labels.js.map +1 -1
  413. package/dist/native/charts/src/engine/layout.cjs +1 -1
  414. package/dist/native/charts/src/engine/layout.cjs.map +1 -1
  415. package/dist/native/charts/src/engine/layout.js +11 -2
  416. package/dist/native/charts/src/engine/layout.js.map +1 -1
  417. package/dist/native/charts/src/engine/model.cjs +1 -1
  418. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  419. package/dist/native/charts/src/engine/model.js +252 -171
  420. package/dist/native/charts/src/engine/model.js.map +1 -1
  421. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  422. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  423. package/dist/native/charts/src/engine/presets.cjs +2 -2
  424. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  425. package/dist/native/charts/src/engine/presets.js +104 -90
  426. package/dist/native/charts/src/engine/presets.js.map +1 -1
  427. package/dist/native/charts/src/engine/scene.cjs +1 -1
  428. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  429. package/dist/native/charts/src/engine/scene.js +341 -188
  430. package/dist/native/charts/src/engine/scene.js.map +1 -1
  431. package/dist/native/charts/src/engine/shapes/bullet.cjs +1 -1
  432. package/dist/native/charts/src/engine/shapes/bullet.cjs.map +1 -1
  433. package/dist/native/charts/src/engine/shapes/bullet.js +110 -110
  434. package/dist/native/charts/src/engine/shapes/bullet.js.map +1 -1
  435. package/dist/native/charts/src/engine/shapes/calendar.cjs +1 -1
  436. package/dist/native/charts/src/engine/shapes/calendar.cjs.map +1 -1
  437. package/dist/native/charts/src/engine/shapes/calendar.js +21 -16
  438. package/dist/native/charts/src/engine/shapes/calendar.js.map +1 -1
  439. package/dist/native/charts/src/engine/shapes/chord.cjs +2 -0
  440. package/dist/native/charts/src/engine/shapes/chord.cjs.map +1 -0
  441. package/dist/native/charts/src/engine/shapes/chord.js +414 -0
  442. package/dist/native/charts/src/engine/shapes/chord.js.map +1 -0
  443. package/dist/native/charts/src/engine/shapes/draw.cjs +1 -1
  444. package/dist/native/charts/src/engine/shapes/draw.cjs.map +1 -1
  445. package/dist/native/charts/src/engine/shapes/draw.js +47 -17
  446. package/dist/native/charts/src/engine/shapes/draw.js.map +1 -1
  447. package/dist/native/charts/src/engine/shapes/hit.cjs +1 -1
  448. package/dist/native/charts/src/engine/shapes/hit.cjs.map +1 -1
  449. package/dist/native/charts/src/engine/shapes/hit.js +73 -44
  450. package/dist/native/charts/src/engine/shapes/hit.js.map +1 -1
  451. package/dist/native/charts/src/engine/shapes/labels.cjs +1 -1
  452. package/dist/native/charts/src/engine/shapes/labels.cjs.map +1 -1
  453. package/dist/native/charts/src/engine/shapes/labels.js +12 -4
  454. package/dist/native/charts/src/engine/shapes/labels.js.map +1 -1
  455. package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
  456. package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
  457. package/dist/native/charts/src/engine/shapes/layout.js +117 -90
  458. package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
  459. package/dist/native/charts/src/engine/shapes/scene.cjs +1 -1
  460. package/dist/native/charts/src/engine/shapes/scene.cjs.map +1 -1
  461. package/dist/native/charts/src/engine/shapes/scene.js +62 -19
  462. package/dist/native/charts/src/engine/shapes/scene.js.map +1 -1
  463. package/dist/native/components/Chart/scene.cjs +1 -1
  464. package/dist/native/components/Chart/scene.cjs.map +1 -1
  465. package/dist/native/components/Chart/scene.js +140 -71
  466. package/dist/native/components/Chart/scene.js.map +1 -1
  467. package/dist/native/components/Charts/charts.cjs +1 -1
  468. package/dist/native/components/Charts/charts.cjs.map +1 -1
  469. package/dist/native/components/Charts/charts.js +54 -42
  470. package/dist/native/components/Charts/charts.js.map +1 -1
  471. package/dist/native/components/Charts/types.d.cts +11 -0
  472. package/dist/native/components/Charts/types.d.ts +11 -0
  473. package/dist/native/components/ShapeChart/ShapeChartBase.cjs +1 -1
  474. package/dist/native/components/ShapeChart/ShapeChartBase.cjs.map +1 -1
  475. package/dist/native/components/ShapeChart/ShapeChartBase.js +1 -0
  476. package/dist/native/components/ShapeChart/ShapeChartBase.js.map +1 -1
  477. package/dist/native/components/ShapeChart/charts.cjs +1 -1
  478. package/dist/native/components/ShapeChart/charts.cjs.map +1 -1
  479. package/dist/native/components/ShapeChart/charts.d.cts +6 -1
  480. package/dist/native/components/ShapeChart/charts.d.ts +6 -1
  481. package/dist/native/components/ShapeChart/charts.js +138 -96
  482. package/dist/native/components/ShapeChart/charts.js.map +1 -1
  483. package/dist/native/components/ShapeChart/draw.cjs +1 -1
  484. package/dist/native/components/ShapeChart/draw.cjs.map +1 -1
  485. package/dist/native/components/ShapeChart/draw.d.cts +1 -1
  486. package/dist/native/components/ShapeChart/draw.d.ts +1 -1
  487. package/dist/native/components/ShapeChart/draw.js +26 -17
  488. package/dist/native/components/ShapeChart/draw.js.map +1 -1
  489. package/dist/native/components/ShapeChart/geometry.cjs +1 -1
  490. package/dist/native/components/ShapeChart/geometry.cjs.map +1 -1
  491. package/dist/native/components/ShapeChart/geometry.js +138 -59
  492. package/dist/native/components/ShapeChart/geometry.js.map +1 -1
  493. package/dist/native/components/ShapeChart/index.cjs +1 -1
  494. package/dist/native/components/ShapeChart/index.d.cts +1 -1
  495. package/dist/native/components/ShapeChart/index.d.ts +1 -1
  496. package/dist/native/components/ShapeChart/index.js +2 -2
  497. package/dist/native/components/ShapeChart/recorder.cjs +1 -1
  498. package/dist/native/components/ShapeChart/recorder.cjs.map +1 -1
  499. package/dist/native/components/ShapeChart/recorder.d.cts +10 -1
  500. package/dist/native/components/ShapeChart/recorder.d.ts +10 -1
  501. package/dist/native/components/ShapeChart/recorder.js +19 -10
  502. package/dist/native/components/ShapeChart/recorder.js.map +1 -1
  503. package/dist/native/components/ShapeChart/types.d.cts +92 -7
  504. package/dist/native/components/ShapeChart/types.d.ts +92 -7
  505. package/dist/native/index.cjs +1 -1
  506. package/dist/native/index.js +2 -2
  507. package/dist/native/source/components/Chart/scene.tsx +158 -14
  508. package/dist/native/source/components/Charts/charts.tsx +30 -2
  509. package/dist/native/source/components/Charts/types.ts +11 -0
  510. package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +2 -0
  511. package/dist/native/source/components/ShapeChart/charts.tsx +91 -35
  512. package/dist/native/source/components/ShapeChart/draw.tsx +39 -8
  513. package/dist/native/source/components/ShapeChart/geometry.ts +189 -8
  514. package/dist/native/source/components/ShapeChart/index.ts +1 -0
  515. package/dist/native/source/components/ShapeChart/recorder.ts +20 -5
  516. package/dist/native/source/components/ShapeChart/types.ts +96 -5
  517. package/dist/native/source/manifest.ts +1 -0
  518. package/dist/taro/charts.d.ts +25 -5
  519. package/dist/taro/index.js +3900 -2836
  520. package/dist/taro/shape-charts.d.ts +96 -4
  521. package/dist/uni/AreaChart.vue.d.ts +5 -1
  522. package/dist/uni/Badge.vue.d.ts +1 -1
  523. package/dist/uni/BarChart.vue.d.ts +5 -1
  524. package/dist/uni/BoxPlotChart.vue.d.ts +8 -0
  525. package/dist/uni/BubbleChart.vue.d.ts +4 -0
  526. package/dist/uni/BulletChart.vue.d.ts +4 -0
  527. package/dist/uni/CalendarHeatmap.vue.d.ts +2 -0
  528. package/dist/uni/CandlestickChart.vue.d.ts +4 -0
  529. package/dist/uni/Chart.vue.d.ts +4 -0
  530. package/dist/uni/ChordChart.vue +93 -0
  531. package/dist/uni/ChordChart.vue.d.ts +136 -0
  532. package/dist/uni/DonutChart.vue.d.ts +4 -0
  533. package/dist/uni/FunnelChart.vue.d.ts +4 -0
  534. package/dist/uni/GanttChart.vue.d.ts +4 -0
  535. package/dist/uni/GaugeChart.vue.d.ts +4 -0
  536. package/dist/uni/HeatmapChart.vue.d.ts +8 -2
  537. package/dist/uni/HistogramChart.vue.d.ts +4 -0
  538. package/dist/uni/HorizontalBarChart.vue.d.ts +3 -1
  539. package/dist/uni/LineChart.vue.d.ts +4 -0
  540. package/dist/uni/MixedChart.vue.d.ts +4 -0
  541. package/dist/uni/PieChart.vue.d.ts +4 -0
  542. package/dist/uni/QuadrantChart.vue.d.ts +4 -0
  543. package/dist/uni/RadarChart.vue.d.ts +4 -0
  544. package/dist/uni/RadialBarChart.vue.d.ts +4 -0
  545. package/dist/uni/RangeAreaChart.vue.d.ts +4 -0
  546. package/dist/uni/SankeyChart.vue.d.ts +4 -0
  547. package/dist/uni/ScatterChart.vue.d.ts +4 -0
  548. package/dist/uni/Sparkline.vue.d.ts +4 -0
  549. package/dist/uni/SunburstChart.vue.d.ts +4 -0
  550. package/dist/uni/ToastProvider.vue.d.ts +1 -1
  551. package/dist/uni/TreemapChart.vue.d.ts +4 -0
  552. package/dist/uni/WaterfallChart.vue.d.ts +9 -0
  553. package/dist/uni/chart-canvas.d.ts +3 -0
  554. package/dist/uni/chart-canvas.js +4 -0
  555. package/dist/uni/chart-types.d.ts +28 -4
  556. package/dist/uni/chart-types.js +26 -2
  557. package/dist/uni/charts-canvas.js +1 -1
  558. package/dist/uni/index.d.ts +2 -1
  559. package/dist/uni/index.js +1 -0
  560. package/dist/uni/manifest.d.ts +7 -0
  561. package/dist/uni/manifest.js +10 -0
  562. package/dist/uni/named-chart-options.d.ts +9 -2
  563. package/dist/uni/named-chart-options.js +18 -1
  564. package/dist/uni/shape-chart-canvas.d.ts +3 -1
  565. package/dist/uni/shape-chart-canvas.js +15 -24
  566. package/dist/uni/shape-chart-types.d.ts +52 -2
  567. package/dist/uni/shape-chart-types.js +44 -0
  568. package/dist/vue/charts-global.d.ts +48 -0
  569. package/dist/vue/charts.d.ts +18 -0
  570. package/dist/vue/charts.js +56 -0
  571. package/dist/vue/charts.js.map +1 -0
  572. package/dist/vue/components/Chart/BoxPlotChart.vue.d.ts +8 -0
  573. package/dist/vue/components/Chart/BoxPlotChart.vue.js.map +1 -1
  574. package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js +8 -2
  575. package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  576. package/dist/vue/components/Chart/ChordChart.vue.d.ts +153 -0
  577. package/dist/vue/components/Chart/ChordChart.vue.js +7 -0
  578. package/dist/vue/components/Chart/ChordChart.vue.js.map +1 -0
  579. package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js +81 -0
  580. package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  581. package/dist/vue/components/Chart/DependencyGraph.vue.d.ts +179 -0
  582. package/dist/vue/components/Chart/DependencyGraph.vue.js +7 -0
  583. package/dist/vue/components/Chart/DependencyGraph.vue.js.map +1 -0
  584. package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js +65 -0
  585. package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js.map +1 -0
  586. package/dist/vue/components/Chart/GanttChart.vue.d.ts +4 -0
  587. package/dist/vue/components/Chart/GanttChart.vue.js.map +1 -1
  588. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js +4 -1
  589. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  590. package/dist/vue/components/Chart/GraphChart.vue.d.ts +184 -0
  591. package/dist/vue/components/Chart/GraphChart.vue.js +7 -0
  592. package/dist/vue/components/Chart/GraphChart.vue.js.map +1 -0
  593. package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js +62 -0
  594. package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  595. package/dist/vue/components/Chart/HeatmapChart.vue.d.ts +9 -5
  596. package/dist/vue/components/Chart/HeatmapChart.vue.js.map +1 -1
  597. package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js +3 -1
  598. package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  599. package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +2 -0
  600. package/dist/vue/components/Chart/TimeAndSales.vue.d.ts +2 -0
  601. package/dist/vue/components/Chart/TradingChart.vue.d.ts +49 -1
  602. package/dist/vue/components/Chart/TradingChart.vue.js.map +1 -1
  603. package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js +31 -0
  604. package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  605. package/dist/vue/components/Chart/TreeChart.vue.d.ts +172 -0
  606. package/dist/vue/components/Chart/TreeChart.vue.js +7 -0
  607. package/dist/vue/components/Chart/TreeChart.vue.js.map +1 -0
  608. package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js +56 -0
  609. package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  610. package/dist/vue/components/Chart/WaterfallChart.vue.d.ts +12 -1
  611. package/dist/vue/components/Chart/WaterfallChart.vue.js.map +1 -1
  612. package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js +8 -2
  613. package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  614. package/dist/vue/components/Chart/graph.d.ts +153 -0
  615. package/dist/vue/components/Chart/graph.js +135 -0
  616. package/dist/vue/components/Chart/graph.js.map +1 -0
  617. package/dist/vue/components/Chart/index.d.ts +5 -1
  618. package/dist/vue/components/Chart/index.js +5 -1
  619. package/dist/vue/components/Chart/orderbook.d.ts +5 -1
  620. package/dist/vue/components/Chart/orderbook.js +2 -0
  621. package/dist/vue/components/Chart/orderbook.js.map +1 -1
  622. package/dist/vue/components/Chart/trading.d.ts +24 -2
  623. package/dist/vue/components/Chart/trading.js +8 -0
  624. package/dist/vue/components/Chart/trading.js.map +1 -1
  625. package/dist/vue/components/Chart/types.d.ts +74 -2
  626. package/dist/vue/global.d.ts +2 -38
  627. package/dist/vue/groups/charts.js +10 -2
  628. package/dist/vue/groups/charts.js.map +1 -1
  629. package/dist/vue/index.js +6 -2
  630. package/dist/vue/internal/register.d.ts +7 -0
  631. package/dist/vue/internal/register.js +14 -0
  632. package/dist/vue/internal/register.js.map +1 -0
  633. package/dist/vue/plugin.d.ts +9 -4
  634. package/dist/vue/plugin.js +6 -11
  635. package/dist/vue/plugin.js.map +1 -1
  636. package/dist/weapp/charts/canvas.js +1687 -147
  637. package/dist/weapp/charts/core.js +1 -0
  638. package/dist/weapp/chord-chart/index.js +1 -0
  639. package/dist/weapp/chord-chart/index.json +1 -0
  640. package/dist/weapp/chord-chart/index.wxml +1 -0
  641. package/dist/weapp/chord-chart/index.wxss +1 -0
  642. package/dist/weapp/controls.js +92 -32
  643. package/dist/weapp/types.d.ts +87 -4
  644. package/dist/web-components/components/chart/charts.d.ts +4 -2
  645. package/dist/web-components/components/chart/charts.js +8 -1
  646. package/dist/web-components/components/chart/charts.js.map +1 -1
  647. package/dist/web-components/components/chart/extended.d.ts +17 -7
  648. package/dist/web-components/components/chart/extended.js +23 -9
  649. package/dist/web-components/components/chart/extended.js.map +1 -1
  650. package/dist/web-components/components/chart/shapes-extended.d.ts +37 -1
  651. package/dist/web-components/components/chart/shapes-extended.js +27 -1
  652. package/dist/web-components/components/chart/shapes-extended.js.map +1 -1
  653. package/dist/web-components/components/graph/graph.d.ts +154 -0
  654. package/dist/web-components/components/graph/graph.js +149 -0
  655. package/dist/web-components/components/graph/graph.js.map +1 -0
  656. package/dist/web-components/components/trading-chart/trading-chart.d.ts +49 -2
  657. package/dist/web-components/components/trading-chart/trading-chart.js +62 -0
  658. package/dist/web-components/components/trading-chart/trading-chart.js.map +1 -1
  659. package/dist/web-components/elements/chart.d.ts +1 -1
  660. package/dist/web-components/elements/chart.js +6 -5
  661. package/dist/web-components/elements/chart.js.map +1 -1
  662. package/dist/web-components/elements/graph.d.ts +2 -0
  663. package/dist/web-components/elements/graph.js +12 -0
  664. package/dist/web-components/elements/graph.js.map +1 -0
  665. package/dist/web-components/html-custom-data.json +273 -4
  666. package/dist/web-components/types/react.d.ts +63 -4
  667. package/dist/web-components/types/solid.d.ts +55 -8
  668. package/dist/web-components/types/svelte.d.ts +55 -8
  669. package/dist/web-components/types/vue.d.ts +55 -4
  670. package/package.json +16 -1
@@ -1 +1 @@
1
- {"version":3,"file":"scene.cjs","names":["mix","axisTicks","computePlot","createScales","tickFormatter","toScreen","plottedY","alongX","alongY","toData","nearestIndex","toCss","unpackColor","numberFormat","formatPercent","screenRect","require_data","require_color","require_locale","require_layout","require_format","require_model","require_axis","DEFAULT_PADDING","fallbackResolve","fallback","resolveAnnotations","resolve","theme","annotations","a","color","layoutChart","input","model","layoutHorizontal","yCount","height","yTicks","view","yLabelWidth","label","measure","y2Ticks","rightTicks","y2LabelWidth","categoryWidth","step","i","padding","plot","xCount","xTicks","axis","map","raw","v","maxAbs","tick","rows","xLabelWidth","names","name","collectPointLabels","labels","axisFormat","series","format","texts","top","x0","x1","count","xv","x","y","reversed","p","s","y0","delta","text","xi","yi","d","size","slotOffset","pointOf","sc","onColumn","pa","pb","b","ax","center","half","ay","candidateOf","px","py","inside","high","low","dotSize","maxSizes","maxDot","sizes","max","nearestScatter","radius","slop","at","rx","ry","best","bestDist","cellAt","hx","hy","found","yv","nearestX","sorted","bestD","hoverItemOf","pc","index","extra","o","open","value","packed","q1","q3","out","outliers","eventOf","candidates","items","c","hitTest","margin","scatter","others","all","bestDx","bandPx","aligned","first","event","sameHover","it","CHANGE_PERCENT","tooltipContent","yFormat","formatOf","firstSeries","yName","valueRow","rowOf","binTitle","change","ohlc","stats","totals","stack","stackIdOf","total","row","k","seriesIndex","hoverMarks","marks","bandLo","bandHi","cx","cy","hw","hh","rgba","pad","lo","hi","legendShape","type","showsCrosshair","crosshair","crosshairAt"],"sources":["../../../../charts/src/engine/scene.ts"],"sourcesContent":["// The DOM-free half of a chart: annotations, layout, point labels, hit\n// testing and tooltip content. Shared by createChart (DOM + GPU),\n// createCanvasChart (any 2D context) and the React Native views.\n\nimport { axisTicks, type AxisTicks } from \"./axis\";\nimport { mix, toCss, unpackColor, type Rgba } from \"./color\";\nimport { nearestIndex } from \"./data\";\nimport { formatPercent, tickFormatter } from \"./format\";\nimport { numberFormat } from \"./locale\";\nimport {\n alongX,\n alongY,\n computePlot,\n createScales,\n screenRect,\n toData,\n toScreen,\n type Rect,\n type Scales,\n} from \"./layout\";\nimport { gridOf, plottedY, type ChartModel, type SeriesModel } from \"./model\";\nimport type { PointLabel, ResolvedAnnotation } from \"./overlay\";\nimport type { ChartTheme } from \"./theme\";\nimport type {\n ChartAnnotation,\n ChartHoverEvent,\n ChartHoverItem,\n ChartPadding,\n ChartView,\n} from \"./types\";\n\nexport const MAX_POINT_LABELS = 300;\nexport const DEFAULT_PADDING = { top: 12, right: 16, bottom: 4, left: 4 };\n\nexport const fallbackResolve = (_value: string, fallback: Rgba) => fallback;\n\n/** Annotation colors resolved against the theme */\nexport const resolveAnnotations = (\n annotations: readonly ChartAnnotation[] | undefined,\n theme: ChartTheme,\n): ResolvedAnnotation[] => {\n const resolve = theme.resolve ?? fallbackResolve;\n return (annotations ?? []).map((a) => {\n if (a.type === \"rect\") {\n const color = a.color ? resolve(a.color, theme.primary) : theme.primary;\n return {\n type: \"rect\",\n x0: a.x0,\n x1: a.x1,\n y0: a.y0,\n y1: a.y1,\n color,\n opacity: a.opacity ?? 0.08,\n label: a.label,\n labelPosition: a.labelPosition ?? \"top-left\",\n labelColor: a.labelColor\n ? resolve(a.labelColor, color)\n : mix(color, theme.text, 0.2),\n };\n }\n if (a.type === \"text\") {\n return {\n type: \"text\",\n x: a.x,\n y: a.y,\n text: a.text,\n anchor: a.anchor ?? \"center\",\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n weight: a.weight ?? 500,\n };\n }\n return {\n type: \"line\",\n axis: a.axis,\n value: a.value,\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n width: a.width ?? 1,\n dash: [...(a.dash ?? [4, 4])],\n label: a.label,\n };\n });\n};\n\nexport interface ChartLayout {\n plot: Rect;\n scales: Scales;\n xTicks: AxisTicks;\n yTicks: AxisTicks;\n /** Ticks of the right axis: at the left tick positions, labelled in right axis units */\n y2Ticks: AxisTicks | null;\n}\n\nexport interface LayoutInput {\n model: ChartModel;\n view: ChartView;\n theme: ChartTheme;\n /** Size of the drawing area (legend excluded), CSS pixels */\n width: number;\n height: number;\n padding?: ChartPadding;\n /** Offset of the drawing area (e.g. below a legend) */\n top?: number;\n /** Width of a tick label in the theme font */\n measure: (text: string) => number;\n}\n\n/** Ticks, room for the axes and the plot rectangle */\nexport const layoutChart = (input: LayoutInput): ChartLayout => {\n const { model, view, theme, width, height, measure } = input;\n if (model.horizontal) return layoutHorizontal(input);\n // same count as the nice range of the model (its ends are then ticks),\n // fewer on short charts; category rows get a label each when they fit\n const yCount =\n model.y.tickCount ??\n (model.y.type === \"category\"\n ? Math.max(1, Math.floor((height - 40) / (theme.fontSize + 5)))\n : height >= 220\n ? 5\n : Math.max(2, Math.round((height - 48) / 52)));\n const yTicks = axisTicks(model.y, view.y, yCount);\n let yLabelWidth = 0;\n if (model.y.visible) {\n for (const label of yTicks.labels)\n yLabelWidth = Math.max(yLabelWidth, measure(label));\n }\n const y2Ticks = rightTicks(model, yTicks);\n let y2LabelWidth = 0;\n if (y2Ticks && model.y2?.visible) {\n for (const label of y2Ticks.labels)\n y2LabelWidth = Math.max(y2LabelWidth, measure(label));\n }\n let categoryWidth = 48;\n if (model.x.type === \"category\") {\n categoryWidth = 0;\n const step = Math.max(1, Math.floor(model.x.categories.length / 200));\n for (let i = 0; i < model.x.categories.length; i += step) {\n categoryWidth = Math.max(categoryWidth, measure(model.x.categories[i]));\n }\n }\n const padding = { ...DEFAULT_PADDING, ...input.padding };\n const plot = computePlot({\n width,\n height,\n padding,\n yLabelWidth: model.y.visible ? Math.ceil(yLabelWidth) : 0,\n y2LabelWidth: Math.ceil(y2LabelWidth),\n y2Title: !!model.y2?.title && !!model.y2.visible,\n xAxisVisible: model.x.visible,\n xTitle: !!model.x.title && model.x.visible,\n yTitle: !!model.y.title && model.y.visible,\n fontSize: theme.fontSize,\n });\n if (input.top) plot.y += input.top;\n const xCount =\n model.x.type === \"category\"\n ? Math.max(1, Math.floor(plot.width / (categoryWidth + 14)))\n : (model.x.tickCount ?? Math.max(3, Math.floor(plot.width / 88)));\n const xTicks = axisTicks(model.x, view.x, xCount);\n const scales = createScales(plot, view, model.x.reverse, model.y.reverse);\n return { plot, scales, xTicks, yTicks, y2Ticks };\n};\n\n/** Right axis ticks: the left ticks labelled in right axis units */\nconst rightTicks = (model: ChartModel, yTicks: AxisTicks): AxisTicks | null => {\n const axis = model.y2;\n const map = model.y2Map;\n if (!axis || !map || !map.scale) return null;\n const raw = yTicks.values.map((v) => (v - map.offset) / map.scale);\n const step = raw.length > 1 ? Math.abs(raw[1] - raw[0]) : 1;\n let maxAbs = 0;\n for (const v of raw) maxAbs = Math.max(maxAbs, Math.abs(v));\n const tick = axis.format ?? tickFormatter(step, maxAbs, model.locale);\n return {\n values: yTicks.values,\n labels: raw.map(tick),\n formatValue: axis.format ?? model.formatValue,\n };\n};\n\n/** Horizontal charts: the x axis on the left, the values along the bottom */\nconst layoutHorizontal = (input: LayoutInput): ChartLayout => {\n const { model, view, theme, width, height, measure } = input;\n const rows = Math.max(1, Math.floor((height - 40) / (theme.fontSize + 5)));\n const xCount =\n model.x.tickCount ??\n (model.x.type === \"category\"\n ? rows\n : height >= 220\n ? 5\n : Math.max(2, Math.round((height - 48) / 52)));\n const xTicks = axisTicks(model.x, view.x, xCount);\n let xLabelWidth = 0;\n if (model.x.visible) {\n if (model.x.type === \"category\") {\n // every name (the visible ones change when zooming)\n const names = model.x.categories;\n const step = Math.max(1, Math.floor(names.length / 200));\n for (let i = 0; i < names.length; i += step) {\n const name = model.x.format ? model.x.format(i) : names[i];\n xLabelWidth = Math.max(xLabelWidth, measure(name));\n }\n } else {\n for (const label of xTicks.labels)\n xLabelWidth = Math.max(xLabelWidth, measure(label));\n }\n }\n const padding = { ...DEFAULT_PADDING, ...input.padding };\n const plot = computePlot({\n width,\n height,\n padding,\n yLabelWidth: model.x.visible ? Math.ceil(xLabelWidth) : 0,\n xAxisVisible: model.y.visible,\n xTitle: !!model.y.title && model.y.visible,\n yTitle: !!model.x.title && model.x.visible,\n fontSize: theme.fontSize,\n });\n if (input.top) plot.y += input.top;\n const yCount =\n model.y.tickCount ??\n (model.y.type === \"category\"\n ? Math.max(1, Math.floor(plot.width / 60))\n : Math.max(3, Math.min(8, Math.floor(plot.width / 88))));\n const yTicks = axisTicks(model.y, view.y, yCount);\n const scales = createScales(\n plot,\n view,\n model.x.reverse,\n model.y.reverse,\n true,\n );\n return { plot, scales, xTicks, yTicks, y2Ticks: null };\n};\n\n/** Labels of the visible scatter points and bar values (`showLabels`) */\nexport const collectPointLabels = (\n model: ChartModel,\n view: ChartView,\n s: Scales,\n yTicks?: AxisTicks | null,\n): PointLabel[] => {\n const labels: PointLabel[] = [];\n // 100% stacks: the axis shows percents, the labels the actual values\n const axisFormat = model.percent\n ? model.formatValue\n : (yTicks?.formatValue ?? model.formatValue);\n for (const series of model.series) {\n if (series.hidden || !series.showLabels) continue;\n if (series.type === \"bar\" && series.barTop) {\n // 100% stacks and right axis series: the values of the data\n const format =\n series.format ??\n (series.yAxis === \"right\"\n ? (model.y2?.format ?? model.formatValue)\n : axisFormat);\n const { x, count } = series.cols;\n const { y, y0, labels: texts } = series.raw;\n const top = series.barTop;\n const [x0, x1] = view.x[0] <= view.x[1] ? view.x : [view.x[1], view.x[0]];\n for (let i = 0; i < count && labels.length < MAX_POINT_LABELS; i++) {\n const xv = x[i] + series.barOffset;\n if (!Number.isFinite(y[i]) || xv < x0 || xv > x1) continue;\n // the end away from the base (the top, or the bottom of negative bars)\n const negative = top[i] < (series.barBase?.[i] ?? 0);\n const reversed = negative !== model.y.reverse;\n const p = toScreen(s, xv, top[i]);\n const step = series.floating && y0 && Number.isFinite(y0[i]);\n // ranges on a time axis (Gantt tasks) have no value to write\n if (step && model.y.type === \"time\" && !texts?.[i]) continue;\n const delta = step ? y[i] - (y0?.[i] ?? 0) : 0;\n labels.push({\n x: p.x,\n y: p.y,\n r: 0,\n text:\n texts?.[i] ??\n (step ? `${delta > 0 ? \"+\" : \"\"}${format(delta)}` : format(y[i])),\n placement: s.horizontal\n ? reversed\n ? \"left\"\n : \"right\"\n : reversed\n ? \"below\"\n : \"above\",\n });\n }\n continue;\n }\n if (series.type !== \"scatter\") continue;\n const { x, y, count, labels: texts, size } = series.cols;\n if (!texts) continue;\n for (let i = 0; i < count && labels.length < MAX_POINT_LABELS; i++) {\n const text = texts[i];\n if (!text) continue;\n const xi = x[i];\n const yi = y[i];\n if (xi < view.x[0] || xi > view.x[1] || yi < view.y[0] || yi > view.y[1])\n continue;\n const d = size && size[i] > 0 ? size[i] : series.pointSize;\n const p = toScreen(s, xi, yi);\n labels.push({ x: p.x, y: p.y, r: d / 2, text });\n }\n }\n return labels;\n};\n\n// ---------------------------------------------------------------- hit tests\n\ninterface Candidate {\n series: SeriesModel;\n index: number;\n /** Pixel position of the point */\n px: number;\n py: number;\n /** Distance along the x axis */\n dx: number;\n dist: number;\n inside: boolean;\n}\n\n/** Bars and box plots sit in a slot of their category */\nconst slotOffset = (s: SeriesModel) =>\n s.type === \"bar\" || s.type === \"boxplot\" ? s.barOffset : 0;\n\n/**\n * Screen position of a point (the end of a bar or stack, the close of a\n * candle, the median of a box)\n */\nexport const pointOf = (s: SeriesModel, i: number, sc: Scales) => {\n const p = toScreen(sc, s.cols.x[i] + slotOffset(s), plottedY(s, i));\n return { px: p.x, py: p.y };\n};\n\n/** Whether a pixel (along x, along y) is on a column from `a` to `b` */\nconst onColumn = (\n sc: Scales,\n center: number,\n half: number,\n a: number,\n b: number,\n ax: number,\n ay: number,\n) => {\n const pa = sc.yToPx(a);\n const pb = sc.yToPx(b);\n return (\n Math.abs(ax - center) <= half &&\n ay >= Math.min(pa, pb) - 2 &&\n ay <= Math.max(pa, pb) + 2\n );\n};\n\nconst candidateOf = (\n s: SeriesModel,\n i: number,\n px: number,\n py: number,\n sc: Scales,\n): Candidate => {\n const p = pointOf(s, i, sc);\n const ax = alongX(sc, px, py);\n const ay = alongY(sc, px, py);\n const center = sc.xToPx(s.cols.x[i] + slotOffset(s));\n let inside = false;\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n const half = s.barHalfWidth / Math.abs(sc.xPerPx);\n inside = onColumn(sc, center, half, s.barBase[i], s.barTop[i], ax, ay);\n } else if (s.type === \"candlestick\" || s.type === \"boxplot\") {\n const { high, low, y } = s.cols;\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 3);\n const a = high ? high[i] : y[i];\n const b = low ? low[i] : y[i];\n inside = onColumn(sc, center, half, a, b, ax, ay);\n }\n return {\n series: s,\n index: i,\n px: p.px,\n py: p.py,\n dx: Math.abs(sc.xToPx(s.cols.x[i]) - ax),\n dist: inside ? 0 : Math.hypot(p.px - px, p.py - py),\n inside,\n };\n};\n\n/** Diameter of a scatter dot */\nexport const dotSize = (s: SeriesModel, i: number) =>\n s.cols.size && s.cols.size[i] > 0 ? s.cols.size[i] : s.pointSize;\n\nconst maxSizes = new WeakMap<Float32Array, number>();\n\n/** Largest dot of a series (bubbles reach further than plain dots) */\nconst maxDot = (s: SeriesModel) => {\n const sizes = s.cols.size;\n if (!sizes) return s.pointSize;\n let max = maxSizes.get(sizes);\n if (max === undefined) {\n max = s.pointSize;\n for (let i = 0; i < sizes.length; i++) if (sizes[i] > max) max = sizes[i];\n maxSizes.set(sizes, max);\n }\n return max;\n};\n\nconst nearestScatter = (\n s: SeriesModel,\n px: number,\n py: number,\n sc: Scales,\n slop: number,\n) => {\n const radius = Math.max(maxDot(s) / 2 + 6, 10) + slop;\n const at = toData(sc, px, py);\n const rx = radius * Math.abs(sc.xPerPx);\n const ry = radius * Math.abs(sc.yPerPx);\n let best = -1;\n let bestDist = Infinity;\n const { x, y } = s.cols;\n gridOf(s).query(at.x - rx, at.x + rx, at.y - ry, at.y + ry, (i) => {\n const p = toScreen(sc, x[i], y[i]);\n const d = Math.hypot(p.x - px, p.y - py);\n const reach = Math.max(dotSize(s, i) / 2 + 4, 8) + slop;\n if (d <= reach && d <= bestDist) {\n bestDist = d;\n best = i;\n }\n });\n return best;\n};\n\n/** Heatmap cell containing a data position, -1 if none */\nconst cellAt = (s: SeriesModel, xv: number, yv: number) => {\n const { x: hx, y: hy } = s.cellHalf;\n const { x, y } = s.cols;\n let found = -1;\n gridOf(s).query(xv - hx, xv + hx, yv - hy, yv + hy, (i) => {\n if (\n s.cellColors?.[i] &&\n Math.abs(x[i] - xv) <= hx &&\n Math.abs(y[i] - yv) <= hy\n ) {\n found = i;\n }\n });\n return found;\n};\n\nconst nearestX = (s: SeriesModel, xv: number) => {\n const { x, y, count, sorted } = s.cols;\n if (sorted) return nearestIndex(x, y, count, xv);\n let best = -1;\n let bestD = Infinity;\n for (let i = 0; i < count; i++) {\n if (!Number.isFinite(y[i])) continue;\n const d = Math.abs(x[i] - xv);\n if (d < bestD) {\n bestD = d;\n best = i;\n }\n }\n return best;\n};\n\n/** Hover payload item of a point (values of the data, right axis included) */\nexport const hoverItemOf = (s: SeriesModel, index: number): ChartHoverItem => {\n const pc = s.pointColors?.[index];\n const { open, high, low, value, y0, q1, q3, outliers, labels } = s.raw;\n const label = labels?.[index];\n let color = pc ? toCss(pc) : s.colorCss;\n const extra: Partial<ChartHoverItem> = {};\n if (s.type === \"candlestick\") {\n const o = open ? open[index] : NaN;\n if (Number.isFinite(o)) extra.open = o;\n if (high && Number.isFinite(high[index])) extra.high = high[index];\n if (low && Number.isFinite(low[index])) extra.low = low[index];\n color = toCss(s.raw.y[index] < o ? s.downColor : s.upColor);\n } else if (s.type === \"heatmap\") {\n const v = value ? value[index] : s.raw.y[index];\n if (Number.isFinite(v)) extra.value = v;\n const packed = s.cellColors?.[index];\n if (packed) color = toCss(unpackColor(packed));\n } else if (s.type === \"boxplot\") {\n if (high && Number.isFinite(high[index])) extra.high = high[index];\n if (low && Number.isFinite(low[index])) extra.low = low[index];\n if (q1 && Number.isFinite(q1[index])) extra.q1 = q1[index];\n if (q3 && Number.isFinite(q3[index])) extra.q3 = q3[index];\n const out = outliers?.[index];\n if (out) extra.outliers = out.length;\n } else {\n if (y0 && Number.isFinite(y0[index])) extra.y0 = y0[index];\n if (s.type === \"scatter\" && value && Number.isFinite(value[index]))\n extra.value = value[index];\n }\n return {\n seriesIndex: s.index,\n seriesId: s.id,\n seriesName: s.name,\n index,\n x: s.raw.x[index],\n y: s.raw.y[index],\n color,\n ...(label !== undefined ? { label } : {}),\n ...extra,\n };\n};\n\nconst eventOf = (\n candidates: Candidate[],\n xTicks: AxisTicks | null,\n): ChartHoverEvent | null => {\n if (!candidates.length) return null;\n candidates.sort((a, b) => a.series.index - b.series.index);\n const items = candidates.map((c) => hoverItemOf(c.series, c.index));\n const x = items[0].x;\n return { items, x, xLabel: xTicks?.formatValue(x) ?? String(x) };\n};\n\n/**\n * Points under a pixel of the stage: the nearest point (scatter / `nearest`\n * tooltips) or every series at the nearest x (`axis` tooltips).\n * `slop` widens the reach of the dots (touch screens).\n */\nexport const hitTest = (\n model: ChartModel,\n sc: Scales,\n xTicks: AxisTicks | null,\n px: number,\n py: number,\n slop = 0,\n): ChartHoverEvent | null => {\n const { plot } = sc;\n const margin = 6 + slop;\n if (\n px < plot.x - margin ||\n px > plot.x + plot.width + margin ||\n py < plot.y - margin ||\n py > plot.y + plot.height + margin\n ) {\n return null;\n }\n const at = toData(sc, px, py);\n const scatter: Candidate[] = [];\n const others: Candidate[] = [];\n for (const s of model.series) {\n if (s.hidden || s.cols.count === 0) continue;\n if (s.type === \"scatter\") {\n const i = nearestScatter(s, px, py, sc, slop);\n if (i >= 0) scatter.push(candidateOf(s, i, px, py, sc));\n } else if (s.type === \"heatmap\") {\n const i = cellAt(s, at.x, at.y);\n if (i >= 0) {\n const c = candidateOf(s, i, px, py, sc);\n c.inside = true;\n c.dist = 0;\n scatter.push(c);\n }\n } else {\n const i = nearestX(s, at.x);\n if (i >= 0) others.push(candidateOf(s, i, px, py, sc));\n }\n }\n if (model.tooltipMode === \"nearest\") {\n const all = [...scatter, ...others].filter(\n (c) => c.inside || c.series.type === \"scatter\" || c.dist <= 32 + slop,\n );\n if (!all.length) return null;\n const best = all.reduce((a, b) => (b.dist <= a.dist ? b : a));\n return eventOf([best], xTicks);\n }\n if (!others.length) {\n if (!scatter.length) return null;\n return eventOf(\n [scatter.reduce((a, b) => (b.dist <= a.dist ? b : a))],\n xTicks,\n );\n }\n const bestDx = Math.min(...others.map((c) => c.dx));\n const bandPx = model.x.type === \"category\" ? 0.5 / Math.abs(sc.xPerPx) : 0;\n const aligned = others.filter((c) => c.dx <= bestDx + Math.max(1, bandPx));\n const first = aligned.reduce((a, b) => (b.dx < a.dx ? b : a));\n const ordered = [first, ...aligned.filter((c) => c !== first), ...scatter];\n const event = eventOf(ordered, xTicks);\n if (event) {\n event.x = hoverItemOf(first.series, first.index).x;\n event.xLabel = xTicks?.formatValue(event.x) ?? String(event.x);\n }\n return event;\n};\n\n/** Whether two hover payloads point at the same points */\nexport const sameHover = (\n a: ChartHoverEvent | null,\n b: ChartHoverEvent | null,\n): boolean =>\n a === b ||\n (!!a &&\n !!b &&\n a.items.length === b.items.length &&\n a.items.every(\n (it, i) =>\n it.index === b.items[i].index &&\n it.seriesIndex === b.items[i].seriesIndex,\n ));\n\n// ------------------------------------------------------------------ tooltip\n\n/** Change of a candlestick: `+1.25%` */\nconst CHANGE_PERCENT: Intl.NumberFormatOptions = {\n style: \"percent\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n};\n\nexport interface TooltipRow {\n /** Swatch color (CSS) */\n color: string | null;\n name: string;\n value: string;\n}\n\nexport interface TooltipContent {\n title: string;\n /** Swatch of the title (single scatter point) */\n titleColor: string | null;\n rows: TooltipRow[];\n}\n\n/**\n * Default tooltip content of a hover payload; `y2Ticks` formats the values\n * of the right axis series\n */\nexport const tooltipContent = (\n model: ChartModel,\n event: ChartHoverEvent,\n yTicks: AxisTicks | null,\n y2Ticks: AxisTicks | null = null,\n): TooltipContent => {\n const yFormat = yTicks?.formatValue ?? String;\n const formatOf = (s: SeriesModel) =>\n s.format ??\n (s.yAxis === \"right\"\n ? (y2Ticks?.formatValue ?? model.y2?.format ?? model.formatValue)\n : yFormat);\n const names = model.labels;\n const first = event.items[0];\n const firstSeries = first ? model.series[first.seriesIndex] : null;\n if (event.items.length === 1 && firstSeries?.type === \"heatmap\") {\n const yName =\n model.y.type === \"category\"\n ? (model.y.categories[Math.round(first.y)] ?? yFormat(first.y))\n : yFormat(first.y);\n return {\n title: `${event.xLabel} · ${yName}`,\n titleColor: null,\n rows: [\n {\n color: first.color,\n name: first.label ?? firstSeries.name,\n value:\n first.value === undefined\n ? \"–\"\n : (firstSeries.format ?? model.formatValue)(first.value),\n },\n ],\n };\n }\n const scatterOnly = event.items.every(\n (it) => model.series[it.seriesIndex].type === \"scatter\",\n );\n if (scatterOnly && event.items.length === 1) {\n const it = event.items[0];\n const s = model.series[it.seriesIndex];\n const valueRow: TooltipRow[] =\n it.value !== undefined\n ? [\n {\n color: null,\n name: s.valueName ?? names.value,\n value: (s.format ?? model.formatValue)(it.value),\n },\n ]\n : [];\n if (model.x.type === \"category\") {\n // a dot on a category (Gantt milestones, dot plots)\n return {\n title: it.label ?? event.xLabel,\n titleColor: null,\n rows: [\n { color: it.color, name: it.seriesName, value: formatOf(s)(it.y) },\n ...valueRow,\n ],\n };\n }\n const rows: TooltipRow[] = [\n { color: null, name: model.x.title ?? names.x, value: event.xLabel },\n {\n color: null,\n name:\n (s.yAxis === \"right\" ? model.y2?.title : model.y.title) ?? names.y,\n value: formatOf(s)(it.y),\n },\n ...valueRow,\n ];\n if (it.label !== undefined && model.series.length > 1)\n rows.push({ color: null, name: \"\", value: it.seriesName });\n return { title: it.label ?? it.seriesName, titleColor: it.color, rows };\n }\n const rows: TooltipRow[] = [];\n /** Row of every item */\n const rowOf: number[] = [];\n // one labelled bar on a numeric axis (a histogram bin): the label is the title\n const binTitle =\n event.items.length === 1 &&\n firstSeries?.type === \"bar\" &&\n model.x.type !== \"category\" &&\n first?.label !== undefined\n ? first.label\n : null;\n for (const it of event.items) {\n const s = model.series[it.seriesIndex];\n const format = formatOf(s);\n rowOf.push(rows.length);\n if (s.type === \"candlestick\") {\n const change =\n it.open !== undefined && it.open !== 0\n ? ((it.y - it.open) / Math.abs(it.open)) * 100\n : NaN;\n rows.push({\n color: it.color,\n name: s.name,\n value: Number.isFinite(change)\n ? `${change >= 0 ? \"+\" : \"\"}${numberFormat(model.locale, CHANGE_PERCENT).format(change / 100)}`\n : \"\",\n });\n const ohlc: [string, number | undefined][] = [\n [names.open, it.open],\n [names.high, it.high],\n [names.low, it.low],\n [names.close, it.y],\n ];\n for (const [name, v] of ohlc) {\n if (v !== undefined && Number.isFinite(v))\n rows.push({ color: null, name, value: format(v) });\n }\n continue;\n }\n if (s.type === \"boxplot\") {\n rows.push({\n color: it.color,\n name: it.label ? `${it.seriesName} · ${it.label}` : it.seriesName,\n value: \"\",\n });\n const stats: [string, number | undefined][] = [\n [names.max, it.high],\n [names.q3, it.q3],\n [names.median, it.y],\n [names.q1, it.q1],\n [names.min, it.low],\n ];\n for (const [name, v] of stats) {\n if (v !== undefined && Number.isFinite(v))\n rows.push({ color: null, name, value: format(v) });\n }\n if (it.outliers)\n rows.push({\n color: null,\n name: names.outliers,\n value: String(it.outliers),\n });\n continue;\n }\n let value = format(it.y);\n if (it.y0 !== undefined) {\n // waterfall steps: the change; time ranges and bands: both ends\n const delta = it.y - it.y0;\n value =\n s.type === \"bar\" && model.y.type !== \"time\"\n ? `${delta > 0 ? \"+\" : \"\"}${format(delta)}`\n : `${format(it.y0)} – ${format(it.y)}`;\n }\n rows.push({\n color: it.color,\n name:\n it.label && binTitle === null\n ? `${it.seriesName} · ${it.label}`\n : it.seriesName,\n value,\n });\n }\n if (model.percent) {\n // 100% stacks: the share of every value next to it\n const totals = new Map<string, number>();\n for (const it of event.items) {\n const stack = stackIdOf(model, it.seriesIndex);\n if (stack !== null && Number.isFinite(it.y))\n totals.set(stack, (totals.get(stack) ?? 0) + Math.abs(it.y));\n }\n event.items.forEach((it, k) => {\n const stack = stackIdOf(model, it.seriesIndex);\n const total = stack !== null ? totals.get(stack) : undefined;\n const row = rows[rowOf[k]];\n if (total && row && Number.isFinite(it.y)) {\n const format = model.series[it.seriesIndex].format ?? model.formatValue;\n row.value = `${format(it.y)} · ${formatPercent((Math.abs(it.y) / total) * 100, model.locale, true)}`;\n }\n });\n }\n return { title: binTitle ?? event.xLabel, titleColor: null, rows };\n};\n\n/** Stack of a series in a 100% chart (`null` when it is not stacked) */\nconst stackIdOf = (model: ChartModel, seriesIndex: number): string | null =>\n model.series[seriesIndex].hidden ? null : model.stacks[seriesIndex];\n\n/**\n * Shape of the hover marker of an item: a dot with a soft halo on a point,\n * a band behind the hovered bar group / candle, or the outline of a cell\n */\nexport type HoverMark =\n | {\n kind: \"dot\";\n x: number;\n y: number;\n size: number;\n color: string;\n /** Translucent series color of the halo around the dot */\n halo: string;\n }\n | { kind: \"band\"; x: number; y: number; width: number; height: number }\n | { kind: \"cell\"; x: number; y: number; width: number; height: number };\n\n/** Markers of the hovered points (pixels of the stage); bands come first */\nexport const hoverMarks = (\n model: ChartModel,\n sc: Scales,\n event: ChartHoverEvent,\n): HoverMark[] => {\n const marks: HoverMark[] = [];\n const { plot } = sc;\n let bandLo = Infinity;\n let bandHi = -Infinity;\n for (const it of event.items) {\n const s = model.series[it.seriesIndex];\n if (s.type === \"bar\" || s.type === \"candlestick\" || s.type === \"boxplot\") {\n const c = sc.xToPx(it.x + slotOffset(s));\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 1);\n bandLo = Math.min(bandLo, c - half);\n bandHi = Math.max(bandHi, c + half);\n continue;\n }\n if (s.type === \"heatmap\") {\n const cx = sc.xToPx(it.x);\n const cy = sc.yToPx(it.y);\n const hw = Math.abs(s.cellHalf.x / sc.xPerPx);\n const hh = Math.abs(s.cellHalf.y / sc.yPerPx);\n marks.push({\n kind: \"cell\",\n ...screenRect(sc, cx - hw, cx + hw, cy - hh, cy + hh),\n });\n continue;\n }\n const { px, py } = pointOf(s, it.index, sc);\n if (\n px < plot.x - 1 ||\n px > plot.x + plot.width + 1 ||\n py < plot.y - 1 ||\n py > plot.y + plot.height + 1\n ) {\n continue;\n }\n const size =\n s.type === \"scatter\"\n ? dotSize(s, it.index) + 4\n : Math.max(9, s.lineWidth * 2 + 5);\n const rgba = s.pointColors?.[it.index] ?? s.color;\n marks.push({\n kind: \"dot\",\n x: px,\n y: py,\n size,\n color: it.color,\n halo: toCss(rgba, 0.2),\n });\n }\n if (bandHi > bandLo) {\n // the group of bars plus a margin, clipped to the plot\n const pad = Math.max(4, (bandHi - bandLo) * 0.14);\n const lo = sc.horizontal ? plot.y : plot.x;\n const hi = lo + (sc.horizontal ? plot.height : plot.width);\n const a = Math.max(lo, bandLo - pad);\n const b = Math.min(hi, bandHi + pad);\n if (b > a) {\n marks.unshift({\n kind: \"band\",\n ...(sc.horizontal\n ? { x: plot.x, y: a, width: plot.width, height: b - a }\n : { x: a, y: plot.y, width: b - a, height: plot.height }),\n });\n }\n }\n return marks;\n};\n\n/** Swatch of a series in the legend */\nexport const legendShape = (\n type: SeriesModel[\"type\"],\n): \"dot\" | \"line\" | \"square\" =>\n type === \"scatter\" ? \"dot\" : type === \"line\" ? \"line\" : \"square\";\n\n/** Whether the guide line follows the pointer */\nexport const showsCrosshair = (\n model: ChartModel,\n event: ChartHoverEvent,\n crosshair: boolean | undefined,\n) =>\n crosshair ??\n (model.tooltipMode === \"axis\" &&\n event.items.some((it) => {\n const type = model.series[it.seriesIndex].type;\n return type === \"line\" || type === \"area\";\n }) &&\n // bars get a band instead\n !event.items.some((it) => {\n const type = model.series[it.seriesIndex].type;\n return type === \"bar\" || type === \"candlestick\" || type === \"boxplot\";\n }));\n\n/** Pixel of the guide line along the x axis (`null` when hidden / outside the plot) */\nexport const crosshairAt = (\n model: ChartModel,\n sc: Scales,\n event: ChartHoverEvent,\n crosshair: boolean | undefined,\n): number | null => {\n if (!showsCrosshair(model, event, crosshair)) return null;\n const c = sc.xToPx(event.items[0].x);\n const lo = sc.horizontal ? sc.plot.y : sc.plot.x;\n const hi = lo + (sc.horizontal ? sc.plot.height : sc.plot.width);\n return c >= lo && c <= hi ? c : null;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"scene.cjs","names":["mix","axisTicks","computePlot","createScales","tickFormatter","toScreen","plottedY","alongX","alongY","toData","nearestIndex","toCss","unpackColor","formatDuration","numberFormat","formatPercent","screenRect","heatCellStyle","luminance","require_data","require_color","require_layout","require_locale","require_format","require_model","require_axis","DEFAULT_PADDING","fallbackResolve","fallback","resolveAnnotations","resolve","theme","y","mapY","v","annotations","a","color","layoutChart","input","model","layoutHorizontal","yCount","height","yTicks","view","yLabelWidth","label","measure","y2Ticks","rightTicks","y2LabelWidth","categoryWidth","step","i","padding","plot","xCount","xTicks","axis","map","b","ticks","count","raw","maxAbs","tick","rows","xLabelWidth","names","name","collectPointLabels","labels","axisFormat","series","format","texts","top","x0","x1","xv","x","reversed","p","s","y0","delta","text","xi","yi","d","size","slotOffset","pointOf","sc","onColumn","pa","pb","ax","center","half","ay","candidateOf","px","py","inside","high","low","outlierAt","list","reach","slop","best","bestDist","k","dotSize","maxSizes","maxDot","sizes","max","nearestScatter","radius","at","rx","ry","cellAt","hx","hy","found","yv","nearestX","sorted","bestD","hoverItemOf","pc","index","extra","o","open","value","packed","q1","q3","out","outliers","eventOf","candidates","items","item","c","hitTest","margin","scatter","others","all","bestDx","bandPx","aligned","first","event","sameHover","it","CHANGE_PERCENT","detailRows","tooltipContent","yFormat","formatOf","firstSeries","yName","valueRow","rowOf","binTitle","change","ohlc","stats","totals","stack","stackIdOf","total","row","seriesIndex","hoverMarks","marks","bandLo","bandHi","plottedOutlier","cx","cy","hw","hh","cell","style","bottom","left","right","fill","contrastRing","rgba","pad","lo","hi","connectorSegments","v0","v1","prev","COLOR_STOPS","colorLegend","lut","stops","mid","legendShown","option","named","legendShape","type","showsCrosshair","crosshair","crosshairAt"],"sources":["../../../../charts/src/engine/scene.ts"],"sourcesContent":["// The DOM-free half of a chart: annotations, layout, point labels, hit\n// testing and tooltip content. Shared by createChart (DOM + GPU),\n// createCanvasChart (any 2D context) and the React Native views.\n\nimport { axisTicks, type AxisTicks } from \"./axis\";\nimport { luminance, mix, toCss, unpackColor, type Rgba } from \"./color\";\nimport { nearestIndex } from \"./data\";\nimport { formatDuration, formatPercent, tickFormatter } from \"./format\";\nimport { numberFormat } from \"./locale\";\nimport {\n alongX,\n alongY,\n computePlot,\n createScales,\n heatCellStyle,\n screenRect,\n toData,\n toScreen,\n type Rect,\n type Scales,\n} from \"./layout\";\nimport { gridOf, plottedY, type ChartModel, type SeriesModel } from \"./model\";\nimport type { PointLabel, ResolvedAnnotation } from \"./overlay\";\nimport type { ChartTheme } from \"./theme\";\nimport type { Range } from \"./viewport\";\nimport type {\n ChartAnnotation,\n ChartHoverEvent,\n ChartHoverItem,\n ChartOptions,\n ChartPadding,\n ChartView,\n} from \"./types\";\n\nexport const MAX_POINT_LABELS = 300;\nexport const DEFAULT_PADDING = { top: 12, right: 16, bottom: 4, left: 4 };\n\nexport const fallbackResolve = (_value: string, fallback: Rgba) => fallback;\n\n/**\n * Annotation colors resolved against the theme; `mapY` turns y values into\n * plotted units (log axes)\n */\nexport const resolveAnnotations = (\n annotations: readonly ChartAnnotation[] | undefined,\n theme: ChartTheme,\n mapY?: (value: number) => number,\n): ResolvedAnnotation[] => {\n const resolve = theme.resolve ?? fallbackResolve;\n const y = <T extends number | undefined>(v: T): T =>\n (mapY && v !== undefined ? mapY(v) : v) as T;\n return (annotations ?? []).map((a) => {\n if (a.type === \"rect\") {\n const color = a.color ? resolve(a.color, theme.primary) : theme.primary;\n return {\n type: \"rect\",\n x0: a.x0,\n x1: a.x1,\n y0: y(a.y0),\n y1: y(a.y1),\n color,\n opacity: a.opacity ?? 0.08,\n label: a.label,\n labelPosition: a.labelPosition ?? \"top-left\",\n labelColor: a.labelColor\n ? resolve(a.labelColor, color)\n : mix(color, theme.text, 0.2),\n };\n }\n if (a.type === \"text\") {\n return {\n type: \"text\",\n x: a.x,\n y: y(a.y),\n text: a.text,\n anchor: a.anchor ?? \"center\",\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n weight: a.weight ?? 500,\n };\n }\n return {\n type: \"line\",\n axis: a.axis,\n value: a.axis === \"y\" ? y(a.value) : a.value,\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n width: a.width ?? 1,\n dash: [...(a.dash ?? [4, 4])],\n label: a.label,\n };\n });\n};\n\nexport interface ChartLayout {\n plot: Rect;\n scales: Scales;\n xTicks: AxisTicks;\n yTicks: AxisTicks;\n /** Ticks of the right axis: at the left tick positions, labelled in right axis units */\n y2Ticks: AxisTicks | null;\n}\n\nexport interface LayoutInput {\n model: ChartModel;\n view: ChartView;\n theme: ChartTheme;\n /** Size of the drawing area (legend excluded), CSS pixels */\n width: number;\n height: number;\n padding?: ChartPadding;\n /** Offset of the drawing area (e.g. below a legend) */\n top?: number;\n /** Width of a tick label in the theme font */\n measure: (text: string) => number;\n}\n\n/** Ticks, room for the axes and the plot rectangle */\nexport const layoutChart = (input: LayoutInput): ChartLayout => {\n const { model, view, theme, width, height, measure } = input;\n if (model.horizontal) return layoutHorizontal(input);\n // same count as the nice range of the model (its ends are then ticks),\n // fewer on short charts; category rows get a label each when they fit\n const yCount =\n model.y.tickCount ??\n (model.y.type === \"category\"\n ? Math.max(1, Math.floor((height - 40) / (theme.fontSize + 5)))\n : height >= 220\n ? 5\n : Math.max(2, Math.round((height - 48) / 52)));\n const yTicks = axisTicks(model.y, view.y, yCount);\n let yLabelWidth = 0;\n if (model.y.visible) {\n for (const label of yTicks.labels)\n yLabelWidth = Math.max(yLabelWidth, measure(label));\n }\n const y2Ticks = rightTicks(model, yTicks, view.y, yCount);\n let y2LabelWidth = 0;\n if (y2Ticks && model.y2?.visible) {\n for (const label of y2Ticks.labels)\n y2LabelWidth = Math.max(y2LabelWidth, measure(label));\n }\n let categoryWidth = 48;\n if (model.x.type === \"category\") {\n categoryWidth = 0;\n const step = Math.max(1, Math.floor(model.x.categories.length / 200));\n for (let i = 0; i < model.x.categories.length; i += step) {\n categoryWidth = Math.max(categoryWidth, measure(model.x.categories[i]));\n }\n }\n const padding = { ...DEFAULT_PADDING, ...input.padding };\n const plot = computePlot({\n width,\n height,\n padding,\n yLabelWidth: model.y.visible ? Math.ceil(yLabelWidth) : 0,\n y2LabelWidth: Math.ceil(y2LabelWidth),\n y2Title: !!model.y2?.title && !!model.y2.visible,\n xAxisVisible: model.x.visible,\n xTitle: !!model.x.title && model.x.visible,\n yTitle: !!model.y.title && model.y.visible,\n fontSize: theme.fontSize,\n });\n if (input.top) plot.y += input.top;\n const xCount =\n model.x.type === \"category\"\n ? Math.max(1, Math.floor(plot.width / (categoryWidth + 14)))\n : (model.x.tickCount ?? Math.max(3, Math.floor(plot.width / 88)));\n const xTicks = axisTicks(model.x, view.x, xCount);\n const scales = createScales(plot, view, model.x.reverse, model.y.reverse);\n return { plot, scales, xTicks, yTicks, y2Ticks };\n};\n\n/**\n * Right axis ticks: the left ticks labelled in right axis units; log axes\n * get their own decades\n */\nconst rightTicks = (\n model: ChartModel,\n yTicks: AxisTicks,\n view: Range,\n count: number,\n): AxisTicks | null => {\n const axis = model.y2;\n const map = model.y2Map;\n if (!axis || !map || !map.scale) return null;\n if (map.log) {\n const a = (view[0] - map.offset) / map.scale;\n const b = (view[1] - map.offset) / map.scale;\n const ticks = axisTicks(axis, [Math.min(a, b), Math.max(a, b)], count);\n return {\n ...ticks,\n values: ticks.values.map((e) => e * map.scale + map.offset),\n };\n }\n const raw = yTicks.values.map((v) => (v - map.offset) / map.scale);\n const step = raw.length > 1 ? Math.abs(raw[1] - raw[0]) : 1;\n let maxAbs = 0;\n for (const v of raw) maxAbs = Math.max(maxAbs, Math.abs(v));\n const tick = axis.format ?? tickFormatter(step, maxAbs, model.locale);\n return {\n values: yTicks.values,\n labels: raw.map(tick),\n formatValue: axis.format ?? model.formatValue,\n };\n};\n\n/** Horizontal charts: the x axis on the left, the values along the bottom */\nconst layoutHorizontal = (input: LayoutInput): ChartLayout => {\n const { model, view, theme, width, height, measure } = input;\n const rows = Math.max(1, Math.floor((height - 40) / (theme.fontSize + 5)));\n const xCount =\n model.x.tickCount ??\n (model.x.type === \"category\"\n ? rows\n : height >= 220\n ? 5\n : Math.max(2, Math.round((height - 48) / 52)));\n const xTicks = axisTicks(model.x, view.x, xCount);\n let xLabelWidth = 0;\n if (model.x.visible) {\n if (model.x.type === \"category\") {\n // every name (the visible ones change when zooming)\n const names = model.x.categories;\n const step = Math.max(1, Math.floor(names.length / 200));\n for (let i = 0; i < names.length; i += step) {\n const name = model.x.format ? model.x.format(i) : names[i];\n xLabelWidth = Math.max(xLabelWidth, measure(name));\n }\n } else {\n for (const label of xTicks.labels)\n xLabelWidth = Math.max(xLabelWidth, measure(label));\n }\n }\n const padding = { ...DEFAULT_PADDING, ...input.padding };\n const plot = computePlot({\n width,\n height,\n padding,\n yLabelWidth: model.x.visible ? Math.ceil(xLabelWidth) : 0,\n xAxisVisible: model.y.visible,\n xTitle: !!model.y.title && model.y.visible,\n yTitle: !!model.x.title && model.x.visible,\n fontSize: theme.fontSize,\n });\n if (input.top) plot.y += input.top;\n const yCount =\n model.y.tickCount ??\n (model.y.type === \"category\"\n ? Math.max(1, Math.floor(plot.width / 60))\n : Math.max(3, Math.min(8, Math.floor(plot.width / 88))));\n const yTicks = axisTicks(model.y, view.y, yCount);\n const scales = createScales(\n plot,\n view,\n model.x.reverse,\n model.y.reverse,\n true,\n );\n return { plot, scales, xTicks, yTicks, y2Ticks: null };\n};\n\n/** Labels of the visible scatter points and bar values (`showLabels`) */\nexport const collectPointLabels = (\n model: ChartModel,\n view: ChartView,\n s: Scales,\n yTicks?: AxisTicks | null,\n): PointLabel[] => {\n const labels: PointLabel[] = [];\n // 100% stacks: the axis shows percents, the labels the actual values\n const axisFormat = model.percent\n ? model.formatValue\n : (yTicks?.formatValue ?? model.formatValue);\n for (const series of model.series) {\n if (series.hidden || !series.showLabels) continue;\n if (series.type === \"bar\" && series.barTop) {\n // 100% stacks and right axis series: the values of the data\n const format =\n series.format ??\n (series.yAxis === \"right\"\n ? (model.y2?.format ?? model.formatValue)\n : axisFormat);\n const { x, count } = series.cols;\n const { y, y0, labels: texts } = series.raw;\n const top = series.barTop;\n const [x0, x1] = view.x[0] <= view.x[1] ? view.x : [view.x[1], view.x[0]];\n for (let i = 0; i < count && labels.length < MAX_POINT_LABELS; i++) {\n const xv = x[i] + series.barOffset;\n if (!Number.isFinite(y[i]) || xv < x0 || xv > x1) continue;\n // the end away from the base (the top, or the bottom of negative bars)\n const negative = top[i] < (series.barBase?.[i] ?? 0);\n const reversed = negative !== model.y.reverse;\n const p = toScreen(s, xv, top[i]);\n const step = series.floating && y0 && Number.isFinite(y0[i]);\n // ranges on a time axis (Gantt tasks) have no value to write\n if (step && model.y.type === \"time\" && !texts?.[i]) continue;\n const delta = step ? y[i] - (y0?.[i] ?? 0) : 0;\n labels.push({\n x: p.x,\n y: p.y,\n r: 0,\n text:\n texts?.[i] ??\n (step ? `${delta > 0 ? \"+\" : \"\"}${format(delta)}` : format(y[i])),\n placement: s.horizontal\n ? reversed\n ? \"left\"\n : \"right\"\n : reversed\n ? \"below\"\n : \"above\",\n });\n }\n continue;\n }\n if (series.type !== \"scatter\") continue;\n const { x, y, count, labels: texts, size } = series.cols;\n if (!texts) continue;\n for (let i = 0; i < count && labels.length < MAX_POINT_LABELS; i++) {\n const text = texts[i];\n if (!text) continue;\n const xi = x[i];\n const yi = y[i];\n if (xi < view.x[0] || xi > view.x[1] || yi < view.y[0] || yi > view.y[1])\n continue;\n const d = size && size[i] > 0 ? size[i] : series.pointSize;\n const p = toScreen(s, xi, yi);\n labels.push({ x: p.x, y: p.y, r: d / 2, text });\n }\n }\n return labels;\n};\n\n// ---------------------------------------------------------------- hit tests\n\ninterface Candidate {\n series: SeriesModel;\n index: number;\n /** Pixel position of the point */\n px: number;\n py: number;\n /** Distance along the x axis */\n dx: number;\n dist: number;\n inside: boolean;\n /** Box plots: value of the outlier under the pointer */\n outlier?: number;\n}\n\n/** Bars and box plots sit in a slot of their category */\nconst slotOffset = (s: SeriesModel) =>\n s.type === \"bar\" || s.type === \"boxplot\" ? s.barOffset : 0;\n\n/**\n * Screen position of a point (the end of a bar or stack, the close of a\n * candle, the median of a box)\n */\nexport const pointOf = (s: SeriesModel, i: number, sc: Scales) => {\n const p = toScreen(sc, s.cols.x[i] + slotOffset(s), plottedY(s, i));\n return { px: p.x, py: p.y };\n};\n\n/** Whether a pixel (along x, along y) is on a column from `a` to `b` */\nconst onColumn = (\n sc: Scales,\n center: number,\n half: number,\n a: number,\n b: number,\n ax: number,\n ay: number,\n) => {\n const pa = sc.yToPx(a);\n const pb = sc.yToPx(b);\n return (\n Math.abs(ax - center) <= half &&\n ay >= Math.min(pa, pb) - 2 &&\n ay <= Math.max(pa, pb) + 2\n );\n};\n\nconst candidateOf = (\n s: SeriesModel,\n i: number,\n px: number,\n py: number,\n sc: Scales,\n): Candidate => {\n const p = pointOf(s, i, sc);\n const ax = alongX(sc, px, py);\n const ay = alongY(sc, px, py);\n const center = sc.xToPx(s.cols.x[i] + slotOffset(s));\n let inside = false;\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n const half = s.barHalfWidth / Math.abs(sc.xPerPx);\n inside = onColumn(sc, center, half, s.barBase[i], s.barTop[i], ax, ay);\n } else if (s.type === \"candlestick\" || s.type === \"boxplot\") {\n const { high, low, y } = s.cols;\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 3);\n const a = high ? high[i] : y[i];\n const b = low ? low[i] : y[i];\n inside = onColumn(sc, center, half, a, b, ax, ay);\n }\n return {\n series: s,\n index: i,\n px: p.px,\n py: p.py,\n dx: Math.abs(sc.xToPx(s.cols.x[i]) - ax),\n dist: inside ? 0 : Math.hypot(p.px - px, p.py - py),\n inside,\n };\n};\n\n/** Outlier of a box under a pixel (`undefined` when none is in reach) */\nconst outlierAt = (\n s: SeriesModel,\n i: number,\n px: number,\n py: number,\n sc: Scales,\n slop: number,\n): number | undefined => {\n const list = s.cols.outliers?.[i];\n if (!list) return undefined;\n const center = sc.xToPx(s.cols.x[i] + slotOffset(s));\n const ax = alongX(sc, px, py) - center;\n const ay = alongY(sc, px, py);\n const reach = s.outlierSize / 2 + 4 + slop;\n let best: number | undefined;\n let bestDist = reach;\n list.forEach((v, k) => {\n const d = Math.hypot(ax, sc.yToPx(v) - ay);\n if (d <= bestDist) {\n bestDist = d;\n // the value of the data (right axis series are mapped)\n best = s.raw.outliers?.[i]?.[k] ?? v;\n }\n });\n return best;\n};\n\n/** Diameter of a scatter dot */\nexport const dotSize = (s: SeriesModel, i: number) =>\n s.cols.size && s.cols.size[i] > 0 ? s.cols.size[i] : s.pointSize;\n\nconst maxSizes = new WeakMap<Float32Array, number>();\n\n/** Largest dot of a series (bubbles reach further than plain dots) */\nconst maxDot = (s: SeriesModel) => {\n const sizes = s.cols.size;\n if (!sizes) return s.pointSize;\n let max = maxSizes.get(sizes);\n if (max === undefined) {\n max = s.pointSize;\n for (let i = 0; i < sizes.length; i++) if (sizes[i] > max) max = sizes[i];\n maxSizes.set(sizes, max);\n }\n return max;\n};\n\nconst nearestScatter = (\n s: SeriesModel,\n px: number,\n py: number,\n sc: Scales,\n slop: number,\n) => {\n const radius = Math.max(maxDot(s) / 2 + 6, 10) + slop;\n const at = toData(sc, px, py);\n const rx = radius * Math.abs(sc.xPerPx);\n const ry = radius * Math.abs(sc.yPerPx);\n let best = -1;\n let bestDist = Infinity;\n const { x, y } = s.cols;\n gridOf(s).query(at.x - rx, at.x + rx, at.y - ry, at.y + ry, (i) => {\n const p = toScreen(sc, x[i], y[i]);\n const d = Math.hypot(p.x - px, p.y - py);\n const reach = Math.max(dotSize(s, i) / 2 + 4, 8) + slop;\n if (d <= reach && d <= bestDist) {\n bestDist = d;\n best = i;\n }\n });\n return best;\n};\n\n/** Heatmap cell containing a data position, -1 if none */\nconst cellAt = (s: SeriesModel, xv: number, yv: number) => {\n const { x: hx, y: hy } = s.cellHalf;\n const { x, y } = s.cols;\n let found = -1;\n gridOf(s).query(xv - hx, xv + hx, yv - hy, yv + hy, (i) => {\n if (\n s.cellColors?.[i] &&\n Math.abs(x[i] - xv) <= hx &&\n Math.abs(y[i] - yv) <= hy\n ) {\n found = i;\n }\n });\n return found;\n};\n\nconst nearestX = (s: SeriesModel, xv: number) => {\n const { x, y, count, sorted } = s.cols;\n if (sorted) return nearestIndex(x, y, count, xv);\n let best = -1;\n let bestD = Infinity;\n for (let i = 0; i < count; i++) {\n if (!Number.isFinite(y[i])) continue;\n const d = Math.abs(x[i] - xv);\n if (d < bestD) {\n bestD = d;\n best = i;\n }\n }\n return best;\n};\n\n/** Hover payload item of a point (values of the data, right axis included) */\nexport const hoverItemOf = (s: SeriesModel, index: number): ChartHoverItem => {\n const pc = s.pointColors?.[index];\n const { open, high, low, value, y0, q1, q3, outliers, labels } = s.raw;\n const label = labels?.[index];\n let color = pc ? toCss(pc) : s.colorCss;\n const extra: Partial<ChartHoverItem> = {};\n if (s.type === \"candlestick\") {\n const o = open ? open[index] : NaN;\n if (Number.isFinite(o)) extra.open = o;\n if (high && Number.isFinite(high[index])) extra.high = high[index];\n if (low && Number.isFinite(low[index])) extra.low = low[index];\n color = toCss(s.raw.y[index] < o ? s.downColor : s.upColor);\n } else if (s.type === \"heatmap\") {\n const v = value ? value[index] : s.raw.y[index];\n if (Number.isFinite(v)) extra.value = v;\n const packed = s.cellColors?.[index];\n if (packed) color = toCss(unpackColor(packed));\n } else if (s.type === \"boxplot\") {\n if (high && Number.isFinite(high[index])) extra.high = high[index];\n if (low && Number.isFinite(low[index])) extra.low = low[index];\n if (q1 && Number.isFinite(q1[index])) extra.q1 = q1[index];\n if (q3 && Number.isFinite(q3[index])) extra.q3 = q3[index];\n const out = outliers?.[index];\n if (out) extra.outliers = out.length;\n } else {\n if (y0 && Number.isFinite(y0[index])) extra.y0 = y0[index];\n if (s.type === \"scatter\" && value && Number.isFinite(value[index]))\n extra.value = value[index];\n }\n return {\n seriesIndex: s.index,\n seriesId: s.id,\n seriesName: s.name,\n index,\n x: s.raw.x[index],\n y: s.raw.y[index],\n color,\n ...(label !== undefined ? { label } : {}),\n ...extra,\n };\n};\n\nconst eventOf = (\n candidates: Candidate[],\n xTicks: AxisTicks | null,\n): ChartHoverEvent | null => {\n if (!candidates.length) return null;\n candidates.sort((a, b) => a.series.index - b.series.index);\n const items = candidates.map((c) => {\n const item = hoverItemOf(c.series, c.index);\n if (c.outlier !== undefined) item.outlier = c.outlier;\n return item;\n });\n const x = items[0].x;\n return { items, x, xLabel: xTicks?.formatValue(x) ?? String(x) };\n};\n\n/**\n * Points under a pixel of the stage: the nearest point (scatter / `nearest`\n * tooltips) or every series at the nearest x (`axis` tooltips).\n * `slop` widens the reach of the dots (touch screens).\n */\nexport const hitTest = (\n model: ChartModel,\n sc: Scales,\n xTicks: AxisTicks | null,\n px: number,\n py: number,\n slop = 0,\n): ChartHoverEvent | null => {\n const { plot } = sc;\n const margin = 6 + slop;\n if (\n px < plot.x - margin ||\n px > plot.x + plot.width + margin ||\n py < plot.y - margin ||\n py > plot.y + plot.height + margin\n ) {\n return null;\n }\n const at = toData(sc, px, py);\n const scatter: Candidate[] = [];\n const others: Candidate[] = [];\n for (const s of model.series) {\n if (s.hidden || !s.tooltip || s.cols.count === 0) continue;\n if (s.type === \"scatter\") {\n const i = nearestScatter(s, px, py, sc, slop);\n if (i >= 0) scatter.push(candidateOf(s, i, px, py, sc));\n } else if (s.type === \"heatmap\") {\n const i = cellAt(s, at.x, at.y);\n if (i >= 0) {\n const c = candidateOf(s, i, px, py, sc);\n c.inside = true;\n c.dist = 0;\n scatter.push(c);\n }\n } else {\n const i = nearestX(s, at.x);\n if (i < 0) continue;\n const c = candidateOf(s, i, px, py, sc);\n if (s.type === \"boxplot\") {\n c.outlier = outlierAt(s, i, px, py, sc, slop);\n if (c.outlier !== undefined) {\n c.inside = true;\n c.dist = 0;\n }\n }\n others.push(c);\n }\n }\n if (model.tooltipMode === \"item\") {\n // the shape under the pointer only: bars, boxes, cells, dots in reach\n // and lines within a few pixels; the last drawn wins\n const all = [...scatter, ...others].filter(\n (c) =>\n c.inside ||\n c.series.type === \"scatter\" ||\n ((c.series.type === \"line\" || c.series.type === \"area\") &&\n c.dist <= 8 + slop),\n );\n if (!all.length) return null;\n const best = all.reduce((a, b) =>\n b.dist < a.dist || (b.dist === a.dist && b.series.index > a.series.index)\n ? b\n : a,\n );\n return eventOf([best], xTicks);\n }\n if (model.tooltipMode === \"nearest\") {\n const all = [...scatter, ...others].filter(\n (c) => c.inside || c.series.type === \"scatter\" || c.dist <= 32 + slop,\n );\n if (!all.length) return null;\n const best = all.reduce((a, b) => (b.dist <= a.dist ? b : a));\n return eventOf([best], xTicks);\n }\n if (!others.length) {\n if (!scatter.length) return null;\n return eventOf(\n [scatter.reduce((a, b) => (b.dist <= a.dist ? b : a))],\n xTicks,\n );\n }\n const bestDx = Math.min(...others.map((c) => c.dx));\n const bandPx = model.x.type === \"category\" ? 0.5 / Math.abs(sc.xPerPx) : 0;\n const aligned = others.filter((c) => c.dx <= bestDx + Math.max(1, bandPx));\n const first = aligned.reduce((a, b) => (b.dx < a.dx ? b : a));\n const ordered = [first, ...aligned.filter((c) => c !== first), ...scatter];\n const event = eventOf(ordered, xTicks);\n if (event) {\n event.x = hoverItemOf(first.series, first.index).x;\n event.xLabel = xTicks?.formatValue(event.x) ?? String(event.x);\n }\n return event;\n};\n\n/** Whether two hover payloads point at the same points */\nexport const sameHover = (\n a: ChartHoverEvent | null,\n b: ChartHoverEvent | null,\n): boolean =>\n a === b ||\n (!!a &&\n !!b &&\n a.items.length === b.items.length &&\n a.items.every(\n (it, i) =>\n it.index === b.items[i].index &&\n it.seriesIndex === b.items[i].seriesIndex,\n ));\n\n// ------------------------------------------------------------------ tooltip\n\n/** Change of a candlestick: `+1.25%` */\nconst CHANGE_PERCENT: Intl.NumberFormatOptions = {\n style: \"percent\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n};\n\nexport interface TooltipRow {\n /** Swatch color (CSS) */\n color: string | null;\n name: string;\n value: string;\n}\n\nexport interface TooltipContent {\n title: string;\n /** Swatch of the title (single scatter point, Gantt task) */\n titleColor: string | null;\n /** Muted line below the title (the group of a Gantt task) */\n subtitle?: string;\n rows: TooltipRow[];\n}\n\n/** Extra rows of a point (`details` of its datum) */\nconst detailRows = (s: SeriesModel, index: number): TooltipRow[] =>\n s.raw.details?.[index]?.map((d) => ({\n color: null,\n name: d.name,\n value: d.value,\n })) ?? [];\n\n/**\n * Default tooltip content of a hover payload; `y2Ticks` formats the values\n * of the right axis series\n */\nexport const tooltipContent = (\n model: ChartModel,\n event: ChartHoverEvent,\n yTicks: AxisTicks | null,\n y2Ticks: AxisTicks | null = null,\n): TooltipContent => {\n const yFormat = yTicks?.formatValue ?? String;\n const formatOf = (s: SeriesModel) =>\n s.format ??\n (s.yAxis === \"right\"\n ? (y2Ticks?.formatValue ?? model.y2?.format ?? model.formatValue)\n : yFormat);\n const names = model.labels;\n const first = event.items[0];\n const firstSeries = first ? model.series[first.seriesIndex] : null;\n if (\n event.items.length === 1 &&\n first &&\n firstSeries?.type === \"bar\" &&\n first.y0 !== undefined &&\n model.y.type === \"time\"\n ) {\n // a task of a Gantt chart / timeline: its dates and its length\n const format = formatOf(firstSeries);\n const title = first.label ?? event.xLabel;\n return {\n title,\n titleColor: first.color,\n subtitle:\n first.label !== undefined\n ? `${event.xLabel} · ${firstSeries.name}`\n : firstSeries.name,\n rows: [\n { color: null, name: names.start, value: format(first.y0) },\n { color: null, name: names.end, value: format(first.y) },\n {\n color: null,\n name: names.duration,\n value: formatDuration(first.y - first.y0, model.locale),\n },\n ...detailRows(firstSeries, first.index),\n ],\n };\n }\n if (event.items.length === 1 && firstSeries?.type === \"heatmap\") {\n const yName =\n model.y.type === \"category\"\n ? (model.y.categories[Math.round(first.y)] ?? yFormat(first.y))\n : yFormat(first.y);\n return {\n title: `${event.xLabel} · ${yName}`,\n titleColor: null,\n rows: [\n {\n color: first.color,\n name: first.label ?? firstSeries.name,\n value:\n first.value === undefined\n ? \"–\"\n : (firstSeries.format ?? model.formatValue)(first.value),\n },\n ...detailRows(firstSeries, first.index),\n ],\n };\n }\n const scatterOnly = event.items.every(\n (it) => model.series[it.seriesIndex].type === \"scatter\",\n );\n if (scatterOnly && event.items.length === 1) {\n const it = event.items[0];\n const s = model.series[it.seriesIndex];\n const valueRow: TooltipRow[] =\n it.value !== undefined\n ? [\n {\n color: null,\n name: s.valueName ?? names.value,\n value: (s.format ?? model.formatValue)(it.value),\n },\n ]\n : [];\n if (model.x.type === \"category\") {\n // a dot on a category (Gantt milestones, dot plots)\n return {\n title: it.label ?? event.xLabel,\n titleColor: null,\n rows: [\n { color: it.color, name: it.seriesName, value: formatOf(s)(it.y) },\n ...valueRow,\n ...detailRows(s, it.index),\n ],\n };\n }\n const rows: TooltipRow[] = [\n { color: null, name: model.x.title ?? names.x, value: event.xLabel },\n {\n color: null,\n name:\n (s.yAxis === \"right\" ? model.y2?.title : model.y.title) ?? names.y,\n value: formatOf(s)(it.y),\n },\n ...valueRow,\n ...detailRows(s, it.index),\n ];\n if (it.label !== undefined && model.series.length > 1)\n rows.push({ color: null, name: \"\", value: it.seriesName });\n return { title: it.label ?? it.seriesName, titleColor: it.color, rows };\n }\n const rows: TooltipRow[] = [];\n /** Row of every item */\n const rowOf: number[] = [];\n // one labelled bar on a numeric axis (a histogram bin): the label is the title\n const binTitle =\n event.items.length === 1 &&\n firstSeries?.type === \"bar\" &&\n model.x.type !== \"category\" &&\n first?.label !== undefined\n ? first.label\n : null;\n for (const it of event.items) {\n const s = model.series[it.seriesIndex];\n const format = formatOf(s);\n rowOf.push(rows.length);\n if (s.type === \"candlestick\") {\n const change =\n it.open !== undefined && it.open !== 0\n ? ((it.y - it.open) / Math.abs(it.open)) * 100\n : NaN;\n rows.push({\n color: it.color,\n name: s.name,\n value: Number.isFinite(change)\n ? `${change >= 0 ? \"+\" : \"\"}${numberFormat(model.locale, CHANGE_PERCENT).format(change / 100)}`\n : \"\",\n });\n const ohlc: [string, number | undefined][] = [\n [names.open, it.open],\n [names.high, it.high],\n [names.low, it.low],\n [names.close, it.y],\n ];\n for (const [name, v] of ohlc) {\n if (v !== undefined && Number.isFinite(v))\n rows.push({ color: null, name, value: format(v) });\n }\n continue;\n }\n if (s.type === \"boxplot\") {\n if (it.outlier !== undefined) {\n // an outlier: its value and its group\n rows.push(\n {\n color: it.color,\n name: it.label ? `${it.seriesName} · ${it.label}` : it.seriesName,\n value: \"\",\n },\n { color: null, name: names.outlier, value: format(it.outlier) },\n );\n continue;\n }\n rows.push({\n color: it.color,\n name: it.label ? `${it.seriesName} · ${it.label}` : it.seriesName,\n value: \"\",\n });\n const stats: [string, number | undefined][] = [\n [names.max, it.high],\n [names.q3, it.q3],\n [names.median, it.y],\n [names.q1, it.q1],\n [names.min, it.low],\n ];\n for (const [name, v] of stats) {\n if (v !== undefined && Number.isFinite(v))\n rows.push({ color: null, name, value: format(v) });\n }\n if (it.outliers)\n rows.push({\n color: null,\n name: names.outliers,\n value: String(it.outliers),\n });\n continue;\n }\n let value = format(it.y);\n if (it.y0 !== undefined) {\n // waterfall steps: the change; time ranges and bands: both ends\n const delta = it.y - it.y0;\n value =\n s.type === \"bar\" && model.y.type !== \"time\"\n ? `${delta > 0 ? \"+\" : \"\"}${format(delta)}`\n : `${format(it.y0)} – ${format(it.y)}`;\n }\n rows.push({\n color: it.color,\n name:\n it.label && binTitle === null\n ? `${it.seriesName} · ${it.label}`\n : it.seriesName,\n value,\n });\n rows.push(...detailRows(s, it.index));\n }\n if (model.percent) {\n // 100% stacks: the share of every value next to it\n const totals = new Map<string, number>();\n for (const it of event.items) {\n const stack = stackIdOf(model, it.seriesIndex);\n if (stack !== null && Number.isFinite(it.y))\n totals.set(stack, (totals.get(stack) ?? 0) + Math.abs(it.y));\n }\n event.items.forEach((it, k) => {\n const stack = stackIdOf(model, it.seriesIndex);\n const total = stack !== null ? totals.get(stack) : undefined;\n const row = rows[rowOf[k]];\n if (total && row && Number.isFinite(it.y)) {\n const format = model.series[it.seriesIndex].format ?? model.formatValue;\n row.value = `${format(it.y)} · ${formatPercent((Math.abs(it.y) / total) * 100, model.locale, true)}`;\n }\n });\n }\n return { title: binTitle ?? event.xLabel, titleColor: null, rows };\n};\n\n/** Stack of a series in a 100% chart (`null` when it is not stacked) */\nconst stackIdOf = (model: ChartModel, seriesIndex: number): string | null =>\n model.series[seriesIndex].hidden ? null : model.stacks[seriesIndex];\n\n/**\n * Shape of the hover marker of an item: a dot with a soft halo on a point,\n * a band behind the hovered bar group / candle, or the outline of a cell\n */\nexport type HoverMark =\n | {\n kind: \"dot\";\n x: number;\n y: number;\n size: number;\n color: string;\n /** Translucent series color of the halo around the dot */\n halo: string;\n }\n | { kind: \"band\"; x: number; y: number; width: number; height: number }\n | {\n /** Soft band over the row / column of a hovered cell (above the data) */\n kind: \"guide\";\n x: number;\n y: number;\n width: number;\n height: number;\n }\n | {\n /** The hovered cell, lifted, with a ring inside its edge */\n kind: \"cell\";\n x: number;\n y: number;\n width: number;\n height: number;\n /** Fill of the cell (CSS) */\n color: string;\n /** Ring color (CSS), contrasting with the fill */\n ring: string;\n radius: number;\n };\n\n/** Markers of the hovered points (pixels of the stage); bands come first */\nexport const hoverMarks = (\n model: ChartModel,\n sc: Scales,\n event: ChartHoverEvent,\n): HoverMark[] => {\n const marks: HoverMark[] = [];\n const { plot } = sc;\n let bandLo = Infinity;\n let bandHi = -Infinity;\n for (const it of event.items) {\n const s = model.series[it.seriesIndex];\n if (s.type === \"boxplot\" && it.outlier !== undefined) {\n const p = toScreen(sc, it.x + slotOffset(s), plottedOutlier(s, it));\n marks.push({\n kind: \"dot\",\n x: p.x,\n y: p.y,\n size: s.outlierSize + 3,\n color: it.color,\n halo: toCss(s.pointColors?.[it.index] ?? s.color, 0.2),\n });\n continue;\n }\n if (s.type === \"bar\" || s.type === \"candlestick\" || s.type === \"boxplot\") {\n const c = sc.xToPx(it.x + slotOffset(s));\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 1);\n bandLo = Math.min(bandLo, c - half);\n bandHi = Math.max(bandHi, c + half);\n continue;\n }\n if (s.type === \"heatmap\") {\n const cx = sc.xToPx(it.x);\n const cy = sc.yToPx(it.y);\n const hw = Math.abs(s.cellHalf.x / sc.xPerPx);\n const hh = Math.abs(s.cellHalf.y / sc.yPerPx);\n const cell = screenRect(sc, cx - hw, cx + hw, cy - hh, cy + hh);\n const style = heatCellStyle(cell.width, cell.height, s.radius);\n // the row and the column, clipped to the plot\n const top = Math.max(plot.y, cell.y);\n const bottom = Math.min(plot.y + plot.height, cell.y + cell.height);\n const left = Math.max(plot.x, cell.x);\n const right = Math.min(plot.x + plot.width, cell.x + cell.width);\n if (bottom > top)\n marks.push({\n kind: \"guide\",\n x: plot.x,\n y: top,\n width: plot.width,\n height: bottom - top,\n });\n if (right > left)\n marks.push({\n kind: \"guide\",\n x: left,\n y: plot.y,\n width: right - left,\n height: plot.height,\n });\n const packed = s.cellColors?.[it.index];\n const fill = packed ? unpackColor(packed) : s.color;\n marks.push({\n kind: \"cell\",\n x: cell.x + style.inset,\n y: cell.y + style.inset,\n width: Math.max(1, cell.width - style.inset * 2),\n height: Math.max(1, cell.height - style.inset * 2),\n color: it.color,\n ring: contrastRing(fill),\n radius: style.radius,\n });\n continue;\n }\n const { px, py } = pointOf(s, it.index, sc);\n if (\n px < plot.x - 1 ||\n px > plot.x + plot.width + 1 ||\n py < plot.y - 1 ||\n py > plot.y + plot.height + 1\n ) {\n continue;\n }\n const size =\n s.type === \"scatter\"\n ? dotSize(s, it.index) + 4\n : Math.max(9, s.lineWidth * 2 + 5);\n const rgba = s.pointColors?.[it.index] ?? s.color;\n marks.push({\n kind: \"dot\",\n x: px,\n y: py,\n size,\n color: it.color,\n halo: toCss(rgba, 0.2),\n });\n }\n if (bandHi > bandLo) {\n // the group of bars plus a margin, clipped to the plot\n const pad = Math.max(4, (bandHi - bandLo) * 0.14);\n const lo = sc.horizontal ? plot.y : plot.x;\n const hi = lo + (sc.horizontal ? plot.height : plot.width);\n const a = Math.max(lo, bandLo - pad);\n const b = Math.min(hi, bandHi + pad);\n if (b > a) {\n marks.unshift({\n kind: \"band\",\n ...(sc.horizontal\n ? { x: plot.x, y: a, width: plot.width, height: b - a }\n : { x: a, y: plot.y, width: b - a, height: plot.height }),\n });\n }\n }\n return marks;\n};\n\n/** Ring of a hovered cell: light on dark fills, dark on light ones */\nexport const contrastRing = (fill: Rgba): string =>\n luminance(fill) > 0.45\n ? \"rgba(15, 23, 42, 0.78)\"\n : \"rgba(255, 255, 255, 0.9)\";\n\n/** Plotted value of the hovered outlier of a box */\nconst plottedOutlier = (s: SeriesModel, it: ChartHoverItem): number => {\n const raw = s.raw.outliers?.[it.index];\n const k = raw ? raw.indexOf(it.outlier ?? NaN) : -1;\n return (\n (k >= 0 ? s.cols.outliers?.[it.index]?.[k] : undefined) ?? it.outlier ?? 0\n );\n};\n\n/** A line from the end of a bar to the next bar, pixels of the stage */\nexport interface ConnectorSegment {\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n color: string;\n width: number;\n dash: number[];\n}\n\n/**\n * Connectors of the bar series (`connector`, waterfalls): from the end of\n * every bar to the next bar, at the value where the next one starts\n */\nexport const connectorSegments = (\n model: ChartModel,\n sc: Scales,\n): ConnectorSegment[] => {\n const out: ConnectorSegment[] = [];\n for (const s of model.series) {\n const c = s.connector;\n if (!c || s.hidden || s.type !== \"bar\" || !s.barTop) continue;\n const { x, count } = s.cols;\n const top = s.barTop;\n const half = s.barHalfWidth;\n const [v0, v1] =\n sc.view.x[0] <= sc.view.x[1] ? sc.view.x : [sc.view.x[1], sc.view.x[0]];\n const color = toCss(c.color, 0.75);\n let prev = -1;\n for (let i = 0; i < count && out.length < MAX_POINT_LABELS * 4; i++) {\n if (!Number.isFinite(top[i]) || !Number.isFinite(x[i])) continue;\n if (prev >= 0 && x[i] + half >= v0 && x[prev] - half <= v1) {\n const a = toScreen(sc, x[prev] + s.barOffset + half, top[prev]);\n const b = toScreen(sc, x[i] + s.barOffset - half, top[prev]);\n out.push({\n x0: a.x,\n y0: a.y,\n x1: b.x,\n y1: b.y,\n color,\n width: c.width,\n dash: c.dash,\n });\n }\n prev = i;\n }\n }\n return out;\n};\n\n/** Visual map of a heatmap: its color ramp and the values at the ends */\nexport interface ColorLegend {\n seriesIndex: number;\n /** CSS colors at even steps from the lowest to the highest value */\n stops: string[];\n /** Labels along the ramp (`at`: 0-1): the ends, and the middle of diverging ramps */\n labels: { at: number; text: string }[];\n}\n\nconst COLOR_STOPS = 12;\n\n/**\n * Color legend of a heatmap chart (every series is a heatmap; the first\n * visible one), `null` otherwise\n */\nexport const colorLegend = (model: ChartModel): ColorLegend | null => {\n if (!model.series.length || model.series.some((s) => s.type !== \"heatmap\"))\n return null;\n const s = model.series.find((it) => !it.hidden && it.colorLut);\n const lut = s?.colorLut;\n if (!s || !lut) return null;\n const stops: string[] = [];\n for (let k = 0; k < COLOR_STOPS; k++) {\n const packed = lut[Math.round((k / (COLOR_STOPS - 1)) * (lut.length - 1))];\n stops.push(toCss(unpackColor(packed ?? 0)));\n }\n const format = s.format ?? model.formatValue;\n const [lo, hi] = s.valueRange;\n const labels = [\n { at: 0, text: format(lo) },\n { at: 1, text: format(hi) },\n ];\n const mid = s.colorMidpoint;\n if (mid !== null && mid > lo && mid < hi)\n labels.splice(1, 0, { at: 0.5, text: format(mid) });\n return { seriesIndex: s.index, stops, labels };\n};\n\n/** Whether the legend shows (`legend` option; heatmaps get their color legend) */\nexport const legendShown = (\n option: ChartOptions[\"legend\"],\n model: ChartModel,\n named: number,\n): boolean =>\n option === undefined ? named > 1 || colorLegend(model) !== null : !!option;\n\n/** Swatch of a series in the legend */\nexport const legendShape = (\n type: SeriesModel[\"type\"],\n): \"dot\" | \"line\" | \"square\" =>\n type === \"scatter\" ? \"dot\" : type === \"line\" ? \"line\" : \"square\";\n\n/** Whether the guide line follows the pointer */\nexport const showsCrosshair = (\n model: ChartModel,\n event: ChartHoverEvent,\n crosshair: boolean | undefined,\n) =>\n crosshair ??\n (model.tooltipMode === \"axis\" &&\n event.items.some((it) => {\n const type = model.series[it.seriesIndex].type;\n return type === \"line\" || type === \"area\";\n }) &&\n // bars get a band instead\n !event.items.some((it) => {\n const type = model.series[it.seriesIndex].type;\n return type === \"bar\" || type === \"candlestick\" || type === \"boxplot\";\n }));\n\n/** Pixel of the guide line along the x axis (`null` when hidden / outside the plot) */\nexport const crosshairAt = (\n model: ChartModel,\n sc: Scales,\n event: ChartHoverEvent,\n crosshair: boolean | undefined,\n): number | null => {\n if (!showsCrosshair(model, event, crosshair)) return null;\n const c = sc.xToPx(event.items[0].x);\n const lo = sc.horizontal ? sc.plot.y : sc.plot.x;\n const hi = lo + (sc.horizontal ? sc.plot.height : sc.plot.width);\n return c >= lo && c <= hi ? c : null;\n};\n"],"mappings":"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"}
@@ -4,7 +4,7 @@ import { Rect, Scales } from './layout.cjs';
4
4
  import { ChartModel, SeriesModel } from './model.cjs';
5
5
  import { PointLabel, ResolvedAnnotation } from './overlay.cjs';
6
6
  import { ChartTheme } from './theme.cjs';
7
- import { ChartAnnotation, ChartHoverEvent, ChartHoverItem, ChartPadding, ChartView } from './types.cjs';
7
+ import { ChartAnnotation, ChartHoverEvent, ChartHoverItem, ChartOptions, ChartPadding, ChartView } from './types.cjs';
8
8
  export declare const MAX_POINT_LABELS = 300;
9
9
  export declare const DEFAULT_PADDING: {
10
10
  top: number;
@@ -13,8 +13,11 @@ export declare const DEFAULT_PADDING: {
13
13
  left: number;
14
14
  };
15
15
  export declare const fallbackResolve: (_value: string, fallback: Rgba) => Rgba;
16
- /** Annotation colors resolved against the theme */
17
- export declare const resolveAnnotations: (annotations: readonly ChartAnnotation[] | undefined, theme: ChartTheme) => ResolvedAnnotation[];
16
+ /**
17
+ * Annotation colors resolved against the theme; `mapY` turns y values into
18
+ * plotted units (log axes)
19
+ */
20
+ export declare const resolveAnnotations: (annotations: readonly ChartAnnotation[] | undefined, theme: ChartTheme, mapY?: (value: number) => number) => ResolvedAnnotation[];
18
21
  export interface ChartLayout {
19
22
  plot: Rect;
20
23
  scales: Scales;
@@ -68,8 +71,10 @@ export interface TooltipRow {
68
71
  }
69
72
  export interface TooltipContent {
70
73
  title: string;
71
- /** Swatch of the title (single scatter point) */
74
+ /** Swatch of the title (single scatter point, Gantt task) */
72
75
  titleColor: string | null;
76
+ /** Muted line below the title (the group of a Gantt task) */
77
+ subtitle?: string;
73
78
  rows: TooltipRow[];
74
79
  }
75
80
  /**
@@ -96,14 +101,62 @@ export type HoverMark = {
96
101
  width: number;
97
102
  height: number;
98
103
  } | {
104
+ /** Soft band over the row / column of a hovered cell (above the data) */
105
+ kind: "guide";
106
+ x: number;
107
+ y: number;
108
+ width: number;
109
+ height: number;
110
+ } | {
111
+ /** The hovered cell, lifted, with a ring inside its edge */
99
112
  kind: "cell";
100
113
  x: number;
101
114
  y: number;
102
115
  width: number;
103
116
  height: number;
117
+ /** Fill of the cell (CSS) */
118
+ color: string;
119
+ /** Ring color (CSS), contrasting with the fill */
120
+ ring: string;
121
+ radius: number;
104
122
  };
105
123
  /** Markers of the hovered points (pixels of the stage); bands come first */
106
124
  export declare const hoverMarks: (model: ChartModel, sc: Scales, event: ChartHoverEvent) => HoverMark[];
125
+ /** Ring of a hovered cell: light on dark fills, dark on light ones */
126
+ export declare const contrastRing: (fill: Rgba) => string;
127
+ /** A line from the end of a bar to the next bar, pixels of the stage */
128
+ export interface ConnectorSegment {
129
+ x0: number;
130
+ y0: number;
131
+ x1: number;
132
+ y1: number;
133
+ color: string;
134
+ width: number;
135
+ dash: number[];
136
+ }
137
+ /**
138
+ * Connectors of the bar series (`connector`, waterfalls): from the end of
139
+ * every bar to the next bar, at the value where the next one starts
140
+ */
141
+ export declare const connectorSegments: (model: ChartModel, sc: Scales) => ConnectorSegment[];
142
+ /** Visual map of a heatmap: its color ramp and the values at the ends */
143
+ export interface ColorLegend {
144
+ seriesIndex: number;
145
+ /** CSS colors at even steps from the lowest to the highest value */
146
+ stops: string[];
147
+ /** Labels along the ramp (`at`: 0-1): the ends, and the middle of diverging ramps */
148
+ labels: {
149
+ at: number;
150
+ text: string;
151
+ }[];
152
+ }
153
+ /**
154
+ * Color legend of a heatmap chart (every series is a heatmap; the first
155
+ * visible one), `null` otherwise
156
+ */
157
+ export declare const colorLegend: (model: ChartModel) => ColorLegend | null;
158
+ /** Whether the legend shows (`legend` option; heatmaps get their color legend) */
159
+ export declare const legendShown: (option: ChartOptions["legend"], model: ChartModel, named: number) => boolean;
107
160
  /** Swatch of a series in the legend */
108
161
  export declare const legendShape: (type: SeriesModel["type"]) => "dot" | "line" | "square";
109
162
  /** Whether the guide line follows the pointer */
@@ -4,7 +4,7 @@ import { Rect, Scales } from './layout.js';
4
4
  import { ChartModel, SeriesModel } from './model.js';
5
5
  import { PointLabel, ResolvedAnnotation } from './overlay.js';
6
6
  import { ChartTheme } from './theme.js';
7
- import { ChartAnnotation, ChartHoverEvent, ChartHoverItem, ChartPadding, ChartView } from './types.js';
7
+ import { ChartAnnotation, ChartHoverEvent, ChartHoverItem, ChartOptions, ChartPadding, ChartView } from './types.js';
8
8
  export declare const MAX_POINT_LABELS = 300;
9
9
  export declare const DEFAULT_PADDING: {
10
10
  top: number;
@@ -13,8 +13,11 @@ export declare const DEFAULT_PADDING: {
13
13
  left: number;
14
14
  };
15
15
  export declare const fallbackResolve: (_value: string, fallback: Rgba) => Rgba;
16
- /** Annotation colors resolved against the theme */
17
- export declare const resolveAnnotations: (annotations: readonly ChartAnnotation[] | undefined, theme: ChartTheme) => ResolvedAnnotation[];
16
+ /**
17
+ * Annotation colors resolved against the theme; `mapY` turns y values into
18
+ * plotted units (log axes)
19
+ */
20
+ export declare const resolveAnnotations: (annotations: readonly ChartAnnotation[] | undefined, theme: ChartTheme, mapY?: (value: number) => number) => ResolvedAnnotation[];
18
21
  export interface ChartLayout {
19
22
  plot: Rect;
20
23
  scales: Scales;
@@ -68,8 +71,10 @@ export interface TooltipRow {
68
71
  }
69
72
  export interface TooltipContent {
70
73
  title: string;
71
- /** Swatch of the title (single scatter point) */
74
+ /** Swatch of the title (single scatter point, Gantt task) */
72
75
  titleColor: string | null;
76
+ /** Muted line below the title (the group of a Gantt task) */
77
+ subtitle?: string;
73
78
  rows: TooltipRow[];
74
79
  }
75
80
  /**
@@ -96,14 +101,62 @@ export type HoverMark = {
96
101
  width: number;
97
102
  height: number;
98
103
  } | {
104
+ /** Soft band over the row / column of a hovered cell (above the data) */
105
+ kind: "guide";
106
+ x: number;
107
+ y: number;
108
+ width: number;
109
+ height: number;
110
+ } | {
111
+ /** The hovered cell, lifted, with a ring inside its edge */
99
112
  kind: "cell";
100
113
  x: number;
101
114
  y: number;
102
115
  width: number;
103
116
  height: number;
117
+ /** Fill of the cell (CSS) */
118
+ color: string;
119
+ /** Ring color (CSS), contrasting with the fill */
120
+ ring: string;
121
+ radius: number;
104
122
  };
105
123
  /** Markers of the hovered points (pixels of the stage); bands come first */
106
124
  export declare const hoverMarks: (model: ChartModel, sc: Scales, event: ChartHoverEvent) => HoverMark[];
125
+ /** Ring of a hovered cell: light on dark fills, dark on light ones */
126
+ export declare const contrastRing: (fill: Rgba) => string;
127
+ /** A line from the end of a bar to the next bar, pixels of the stage */
128
+ export interface ConnectorSegment {
129
+ x0: number;
130
+ y0: number;
131
+ x1: number;
132
+ y1: number;
133
+ color: string;
134
+ width: number;
135
+ dash: number[];
136
+ }
137
+ /**
138
+ * Connectors of the bar series (`connector`, waterfalls): from the end of
139
+ * every bar to the next bar, at the value where the next one starts
140
+ */
141
+ export declare const connectorSegments: (model: ChartModel, sc: Scales) => ConnectorSegment[];
142
+ /** Visual map of a heatmap: its color ramp and the values at the ends */
143
+ export interface ColorLegend {
144
+ seriesIndex: number;
145
+ /** CSS colors at even steps from the lowest to the highest value */
146
+ stops: string[];
147
+ /** Labels along the ramp (`at`: 0-1): the ends, and the middle of diverging ramps */
148
+ labels: {
149
+ at: number;
150
+ text: string;
151
+ }[];
152
+ }
153
+ /**
154
+ * Color legend of a heatmap chart (every series is a heatmap; the first
155
+ * visible one), `null` otherwise
156
+ */
157
+ export declare const colorLegend: (model: ChartModel) => ColorLegend | null;
158
+ /** Whether the legend shows (`legend` option; heatmaps get their color legend) */
159
+ export declare const legendShown: (option: ChartOptions["legend"], model: ChartModel, named: number) => boolean;
107
160
  /** Swatch of a series in the legend */
108
161
  export declare const legendShape: (type: SeriesModel["type"]) => "dot" | "line" | "square";
109
162
  /** Whether the guide line follows the pointer */