minerva-design 1.5.0 → 1.6.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 (457) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/custom-elements.json +122 -5
  3. package/dist/angular/fesm2022/minerva-angular.mjs +55 -0
  4. package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
  5. package/dist/angular/types/minerva-angular.d.ts +23 -2
  6. package/dist/charts/canvas.d.cts +2 -1
  7. package/dist/charts/canvas.d.ts +2 -1
  8. package/dist/charts/core.d.cts +1 -1
  9. package/dist/charts/core.d.ts +1 -1
  10. package/dist/charts/engine/canvas.cjs +1 -1
  11. package/dist/charts/engine/canvas.cjs.map +1 -1
  12. package/dist/charts/engine/canvas.js +2 -1
  13. package/dist/charts/engine/canvas.js.map +1 -1
  14. package/dist/charts/engine/chart.cjs +1 -1
  15. package/dist/charts/engine/chart.cjs.map +1 -1
  16. package/dist/charts/engine/chart.js +144 -143
  17. package/dist/charts/engine/chart.js.map +1 -1
  18. package/dist/charts/engine/controller.cjs +2 -2
  19. package/dist/charts/engine/controller.cjs.map +1 -1
  20. package/dist/charts/engine/controller.d.cts +3 -1
  21. package/dist/charts/engine/controller.d.ts +3 -1
  22. package/dist/charts/engine/controller.js +130 -132
  23. package/dist/charts/engine/controller.js.map +1 -1
  24. package/dist/charts/engine/defaults.cjs.map +1 -1
  25. package/dist/charts/engine/defaults.d.cts +4 -4
  26. package/dist/charts/engine/defaults.d.ts +4 -4
  27. package/dist/charts/engine/defaults.js.map +1 -1
  28. package/dist/charts/engine/graph/chart.cjs +1 -1
  29. package/dist/charts/engine/graph/chart.cjs.map +1 -1
  30. package/dist/charts/engine/graph/chart.js +740 -597
  31. package/dist/charts/engine/graph/chart.js.map +1 -1
  32. package/dist/charts/engine/graph/dag.cjs +1 -1
  33. package/dist/charts/engine/graph/dag.cjs.map +1 -1
  34. package/dist/charts/engine/graph/dag.js +191 -166
  35. package/dist/charts/engine/graph/dag.js.map +1 -1
  36. package/dist/charts/engine/graph/force.cjs +1 -1
  37. package/dist/charts/engine/graph/force.cjs.map +1 -1
  38. package/dist/charts/engine/graph/force.d.cts +9 -0
  39. package/dist/charts/engine/graph/force.d.ts +9 -0
  40. package/dist/charts/engine/graph/force.js +279 -181
  41. package/dist/charts/engine/graph/force.js.map +1 -1
  42. package/dist/charts/engine/graph/geometry.cjs +1 -1
  43. package/dist/charts/engine/graph/geometry.cjs.map +1 -1
  44. package/dist/charts/engine/graph/geometry.d.cts +14 -1
  45. package/dist/charts/engine/graph/geometry.d.ts +14 -1
  46. package/dist/charts/engine/graph/geometry.js +77 -24
  47. package/dist/charts/engine/graph/geometry.js.map +1 -1
  48. package/dist/charts/engine/graph/model.cjs +1 -1
  49. package/dist/charts/engine/graph/model.cjs.map +1 -1
  50. package/dist/charts/engine/graph/model.d.cts +9 -0
  51. package/dist/charts/engine/graph/model.d.ts +9 -0
  52. package/dist/charts/engine/graph/model.js +63 -43
  53. package/dist/charts/engine/graph/model.js.map +1 -1
  54. package/dist/charts/engine/graph/types.d.cts +14 -0
  55. package/dist/charts/engine/graph/types.d.ts +14 -0
  56. package/dist/charts/engine/graph/worker.cjs +12 -6
  57. package/dist/charts/engine/graph/worker.cjs.map +1 -1
  58. package/dist/charts/engine/graph/worker.js +12 -6
  59. package/dist/charts/engine/graph/worker.js.map +1 -1
  60. package/dist/charts/engine/labels.cjs.map +1 -1
  61. package/dist/charts/engine/labels.d.cts +17 -0
  62. package/dist/charts/engine/labels.d.ts +17 -0
  63. package/dist/charts/engine/labels.js.map +1 -1
  64. package/dist/charts/engine/model.cjs +1 -1
  65. package/dist/charts/engine/model.cjs.map +1 -1
  66. package/dist/charts/engine/model.d.cts +33 -0
  67. package/dist/charts/engine/model.d.ts +33 -0
  68. package/dist/charts/engine/model.js +149 -126
  69. package/dist/charts/engine/model.js.map +1 -1
  70. package/dist/charts/engine/orderbook/field.cjs +37 -0
  71. package/dist/charts/engine/orderbook/field.cjs.map +1 -0
  72. package/dist/charts/engine/orderbook/field.d.cts +92 -0
  73. package/dist/charts/engine/orderbook/field.d.ts +92 -0
  74. package/dist/charts/engine/orderbook/field.js +297 -0
  75. package/dist/charts/engine/orderbook/field.js.map +1 -0
  76. package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
  77. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
  78. package/dist/charts/engine/orderbook/heatmap.js +413 -441
  79. package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
  80. package/dist/charts/engine/orderbook/host.cjs +1 -1
  81. package/dist/charts/engine/orderbook/host.cjs.map +1 -1
  82. package/dist/charts/engine/orderbook/host.d.cts +8 -1
  83. package/dist/charts/engine/orderbook/host.d.ts +8 -1
  84. package/dist/charts/engine/orderbook/host.js +27 -5
  85. package/dist/charts/engine/orderbook/host.js.map +1 -1
  86. package/dist/charts/engine/orderbook/ladder.cjs +1 -1
  87. package/dist/charts/engine/orderbook/ladder.cjs.map +1 -1
  88. package/dist/charts/engine/orderbook/ladder.js +1 -1
  89. package/dist/charts/engine/orderbook/ladder.js.map +1 -1
  90. package/dist/charts/engine/orderbook/layout.cjs +1 -1
  91. package/dist/charts/engine/orderbook/layout.cjs.map +1 -1
  92. package/dist/charts/engine/orderbook/layout.d.cts +5 -0
  93. package/dist/charts/engine/orderbook/layout.d.ts +5 -0
  94. package/dist/charts/engine/orderbook/layout.js +8 -2
  95. package/dist/charts/engine/orderbook/layout.js.map +1 -1
  96. package/dist/charts/engine/orderbook/tape.cjs +1 -1
  97. package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
  98. package/dist/charts/engine/orderbook/tape.js +3 -3
  99. package/dist/charts/engine/orderbook/tape.js.map +1 -1
  100. package/dist/charts/engine/orderbook/types.d.cts +12 -4
  101. package/dist/charts/engine/orderbook/types.d.ts +12 -4
  102. package/dist/charts/engine/overlay.cjs +1 -1
  103. package/dist/charts/engine/overlay.cjs.map +1 -1
  104. package/dist/charts/engine/overlay.d.cts +17 -0
  105. package/dist/charts/engine/overlay.d.ts +17 -0
  106. package/dist/charts/engine/overlay.js +29 -13
  107. package/dist/charts/engine/overlay.js.map +1 -1
  108. package/dist/charts/engine/presets.cjs +1 -1
  109. package/dist/charts/engine/presets.cjs.map +1 -1
  110. package/dist/charts/engine/presets.d.cts +12 -2
  111. package/dist/charts/engine/presets.d.ts +12 -2
  112. package/dist/charts/engine/presets.js +8 -2
  113. package/dist/charts/engine/presets.js.map +1 -1
  114. package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
  115. package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
  116. package/dist/charts/engine/renderers/canvas2d.js +13 -9
  117. package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
  118. package/dist/charts/engine/renderers/follow.cjs +2 -0
  119. package/dist/charts/engine/renderers/follow.cjs.map +1 -0
  120. package/dist/charts/engine/renderers/follow.d.cts +8 -0
  121. package/dist/charts/engine/renderers/follow.d.ts +8 -0
  122. package/dist/charts/engine/renderers/follow.js +10 -0
  123. package/dist/charts/engine/renderers/follow.js.map +1 -0
  124. package/dist/charts/engine/renderers/gl-budget.cjs +2 -0
  125. package/dist/charts/engine/renderers/gl-budget.cjs.map +1 -0
  126. package/dist/charts/engine/renderers/gl-budget.d.cts +32 -0
  127. package/dist/charts/engine/renderers/gl-budget.d.ts +32 -0
  128. package/dist/charts/engine/renderers/gl-budget.js +95 -0
  129. package/dist/charts/engine/renderers/gl-budget.js.map +1 -0
  130. package/dist/charts/engine/renderers/gl.cjs +1 -1
  131. package/dist/charts/engine/renderers/gl.cjs.map +1 -1
  132. package/dist/charts/engine/renderers/gl.js +1 -1
  133. package/dist/charts/engine/renderers/gl.js.map +1 -1
  134. package/dist/charts/engine/renderers/shaders.cjs +9 -6
  135. package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
  136. package/dist/charts/engine/renderers/shaders.d.cts +1 -1
  137. package/dist/charts/engine/renderers/shaders.d.ts +1 -1
  138. package/dist/charts/engine/renderers/shaders.js +9 -6
  139. package/dist/charts/engine/renderers/shaders.js.map +1 -1
  140. package/dist/charts/engine/renderers/types.cjs.map +1 -1
  141. package/dist/charts/engine/renderers/types.d.cts +2 -0
  142. package/dist/charts/engine/renderers/types.d.ts +2 -0
  143. package/dist/charts/engine/renderers/types.js.map +1 -1
  144. package/dist/charts/engine/renderers/webgl.cjs +1 -1
  145. package/dist/charts/engine/renderers/webgl.cjs.map +1 -1
  146. package/dist/charts/engine/renderers/webgl.js +85 -64
  147. package/dist/charts/engine/renderers/webgl.js.map +1 -1
  148. package/dist/charts/engine/renderers/webgl2.cjs +1 -1
  149. package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
  150. package/dist/charts/engine/renderers/webgl2.js +72 -58
  151. package/dist/charts/engine/renderers/webgl2.js.map +1 -1
  152. package/dist/charts/engine/renderers/webgpu.cjs +1 -1
  153. package/dist/charts/engine/renderers/webgpu.cjs.map +1 -1
  154. package/dist/charts/engine/renderers/webgpu.js +1 -1
  155. package/dist/charts/engine/renderers/webgpu.js.map +1 -1
  156. package/dist/charts/engine/scene.cjs +1 -1
  157. package/dist/charts/engine/scene.cjs.map +1 -1
  158. package/dist/charts/engine/scene.d.cts +51 -4
  159. package/dist/charts/engine/scene.d.ts +51 -4
  160. package/dist/charts/engine/scene.js +188 -122
  161. package/dist/charts/engine/scene.js.map +1 -1
  162. package/dist/charts/engine/shapes/chord.cjs +1 -1
  163. package/dist/charts/engine/shapes/chord.cjs.map +1 -1
  164. package/dist/charts/engine/shapes/chord.js +108 -103
  165. package/dist/charts/engine/shapes/chord.js.map +1 -1
  166. package/dist/charts/engine/shapes/types.d.cts +5 -3
  167. package/dist/charts/engine/shapes/types.d.ts +5 -3
  168. package/dist/charts/engine/three-d/canvas2d.cjs +1 -1
  169. package/dist/charts/engine/three-d/canvas2d.cjs.map +1 -1
  170. package/dist/charts/engine/three-d/canvas2d.d.cts +36 -1
  171. package/dist/charts/engine/three-d/canvas2d.d.ts +36 -1
  172. package/dist/charts/engine/three-d/canvas2d.js +155 -80
  173. package/dist/charts/engine/three-d/canvas2d.js.map +1 -1
  174. package/dist/charts/engine/three-d/chart.cjs +1 -1
  175. package/dist/charts/engine/three-d/chart.cjs.map +1 -1
  176. package/dist/charts/engine/three-d/chart.js +219 -215
  177. package/dist/charts/engine/three-d/chart.js.map +1 -1
  178. package/dist/charts/engine/three-d/oit.cjs +109 -0
  179. package/dist/charts/engine/three-d/oit.cjs.map +1 -0
  180. package/dist/charts/engine/three-d/oit.d.cts +34 -0
  181. package/dist/charts/engine/three-d/oit.d.ts +34 -0
  182. package/dist/charts/engine/three-d/oit.js +111 -0
  183. package/dist/charts/engine/three-d/oit.js.map +1 -0
  184. package/dist/charts/engine/three-d/render-types.cjs +1 -1
  185. package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
  186. package/dist/charts/engine/three-d/render-types.d.cts +16 -3
  187. package/dist/charts/engine/three-d/render-types.d.ts +16 -3
  188. package/dist/charts/engine/three-d/render-types.js +6 -9
  189. package/dist/charts/engine/three-d/render-types.js.map +1 -1
  190. package/dist/charts/engine/three-d/shaders.cjs +52 -26
  191. package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
  192. package/dist/charts/engine/three-d/shaders.d.cts +11 -3
  193. package/dist/charts/engine/three-d/shaders.d.ts +11 -3
  194. package/dist/charts/engine/three-d/shaders.js +84 -40
  195. package/dist/charts/engine/three-d/shaders.js.map +1 -1
  196. package/dist/charts/engine/three-d/sort.cjs +1 -1
  197. package/dist/charts/engine/three-d/sort.cjs.map +1 -1
  198. package/dist/charts/engine/three-d/sort.d.cts +6 -4
  199. package/dist/charts/engine/three-d/sort.d.ts +6 -4
  200. package/dist/charts/engine/three-d/sort.js +51 -39
  201. package/dist/charts/engine/three-d/sort.js.map +1 -1
  202. package/dist/charts/engine/three-d/types.d.cts +9 -0
  203. package/dist/charts/engine/three-d/types.d.ts +9 -0
  204. package/dist/charts/engine/three-d/webgl.cjs +1 -1
  205. package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
  206. package/dist/charts/engine/three-d/webgl.d.cts +9 -0
  207. package/dist/charts/engine/three-d/webgl.d.ts +9 -0
  208. package/dist/charts/engine/three-d/webgl.js +199 -76
  209. package/dist/charts/engine/three-d/webgl.js.map +1 -1
  210. package/dist/charts/engine/three-d/webgpu.cjs +1 -1
  211. package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
  212. package/dist/charts/engine/three-d/webgpu.js +225 -99
  213. package/dist/charts/engine/three-d/webgpu.js.map +1 -1
  214. package/dist/charts/engine/trading/chart.cjs +1 -1
  215. package/dist/charts/engine/trading/chart.cjs.map +1 -1
  216. package/dist/charts/engine/trading/chart.d.cts +0 -1
  217. package/dist/charts/engine/trading/chart.d.ts +0 -1
  218. package/dist/charts/engine/trading/chart.js +1048 -883
  219. package/dist/charts/engine/trading/chart.js.map +1 -1
  220. package/dist/charts/engine/trading/drawings.cjs +2 -2
  221. package/dist/charts/engine/trading/drawings.cjs.map +1 -1
  222. package/dist/charts/engine/trading/drawings.d.cts +6 -0
  223. package/dist/charts/engine/trading/drawings.d.ts +6 -0
  224. package/dist/charts/engine/trading/drawings.js +100 -88
  225. package/dist/charts/engine/trading/drawings.js.map +1 -1
  226. package/dist/charts/engine/trading/format.cjs +1 -1
  227. package/dist/charts/engine/trading/format.cjs.map +1 -1
  228. package/dist/charts/engine/trading/format.d.cts +6 -0
  229. package/dist/charts/engine/trading/format.d.ts +6 -0
  230. package/dist/charts/engine/trading/format.js +42 -30
  231. package/dist/charts/engine/trading/format.js.map +1 -1
  232. package/dist/charts/engine/trading/geometry.cjs +1 -1
  233. package/dist/charts/engine/trading/geometry.cjs.map +1 -1
  234. package/dist/charts/engine/trading/geometry.d.cts +16 -0
  235. package/dist/charts/engine/trading/geometry.d.ts +16 -0
  236. package/dist/charts/engine/trading/geometry.js +19 -4
  237. package/dist/charts/engine/trading/geometry.js.map +1 -1
  238. package/dist/charts/engine/trading/labels.cjs +1 -1
  239. package/dist/charts/engine/trading/labels.cjs.map +1 -1
  240. package/dist/charts/engine/trading/labels.js +24 -4
  241. package/dist/charts/engine/trading/labels.js.map +1 -1
  242. package/dist/charts/engine/trading/studies.cjs +1 -1
  243. package/dist/charts/engine/trading/studies.cjs.map +1 -1
  244. package/dist/charts/engine/trading/studies.d.cts +8 -0
  245. package/dist/charts/engine/trading/studies.d.ts +8 -0
  246. package/dist/charts/engine/trading/studies.js +4 -1
  247. package/dist/charts/engine/trading/studies.js.map +1 -1
  248. package/dist/charts/engine/trading/types.d.cts +34 -11
  249. package/dist/charts/engine/trading/types.d.ts +34 -11
  250. package/dist/charts/engine/types.d.cts +25 -4
  251. package/dist/charts/engine/types.d.ts +25 -4
  252. package/dist/charts/react/charts.cjs +1 -1
  253. package/dist/charts/react/charts.cjs.map +1 -1
  254. package/dist/charts/react/charts.js +20 -15
  255. package/dist/charts/react/charts.js.map +1 -1
  256. package/dist/charts/react/graph.cjs +1 -1
  257. package/dist/charts/react/graph.cjs.map +1 -1
  258. package/dist/charts/react/graph.d.cts +6 -0
  259. package/dist/charts/react/graph.d.ts +6 -0
  260. package/dist/charts/react/graph.js +28 -27
  261. package/dist/charts/react/graph.js.map +1 -1
  262. package/dist/charts/react/orderbook.cjs +1 -1
  263. package/dist/charts/react/orderbook.cjs.map +1 -1
  264. package/dist/charts/react/orderbook.d.cts +3 -1
  265. package/dist/charts/react/orderbook.d.ts +3 -1
  266. package/dist/charts/react/orderbook.js +1 -0
  267. package/dist/charts/react/orderbook.js.map +1 -1
  268. package/dist/charts/react/shapes.cjs.map +1 -1
  269. package/dist/charts/react/shapes.d.cts +4 -3
  270. package/dist/charts/react/shapes.d.ts +4 -3
  271. package/dist/charts/react/shapes.js.map +1 -1
  272. package/dist/charts/react/three-d.cjs +1 -1
  273. package/dist/charts/react/three-d.cjs.map +1 -1
  274. package/dist/charts/react/three-d.d.cts +7 -0
  275. package/dist/charts/react/three-d.d.ts +7 -0
  276. package/dist/charts/react/three-d.js +14 -13
  277. package/dist/charts/react/three-d.js.map +1 -1
  278. package/dist/charts/react/trading.cjs.map +1 -1
  279. package/dist/charts/react/trading.d.cts +3 -3
  280. package/dist/charts/react/trading.d.ts +3 -3
  281. package/dist/charts/react/trading.js.map +1 -1
  282. package/dist/core/contracts.cjs +1 -1
  283. package/dist/core/contracts.cjs.map +1 -1
  284. package/dist/core/contracts.js +1 -1
  285. package/dist/core/contracts.js.map +1 -1
  286. package/dist/native/charts/src/canvas.cjs +1 -1
  287. package/dist/native/charts/src/canvas.js +4 -3
  288. package/dist/native/charts/src/engine/controller.cjs +2 -2
  289. package/dist/native/charts/src/engine/controller.cjs.map +1 -1
  290. package/dist/native/charts/src/engine/controller.js +102 -104
  291. package/dist/native/charts/src/engine/controller.js.map +1 -1
  292. package/dist/native/charts/src/engine/labels.cjs +1 -1
  293. package/dist/native/charts/src/engine/labels.cjs.map +1 -1
  294. package/dist/native/charts/src/engine/labels.js +14 -1
  295. package/dist/native/charts/src/engine/labels.js.map +1 -1
  296. package/dist/native/charts/src/engine/model.cjs +1 -1
  297. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  298. package/dist/native/charts/src/engine/model.js +180 -157
  299. package/dist/native/charts/src/engine/model.js.map +1 -1
  300. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  301. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  302. package/dist/native/charts/src/engine/presets.cjs +1 -1
  303. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  304. package/dist/native/charts/src/engine/presets.js +8 -2
  305. package/dist/native/charts/src/engine/presets.js.map +1 -1
  306. package/dist/native/charts/src/engine/scene.cjs +1 -1
  307. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  308. package/dist/native/charts/src/engine/scene.js +188 -122
  309. package/dist/native/charts/src/engine/scene.js.map +1 -1
  310. package/dist/native/charts/src/engine/shapes/chord.cjs +1 -1
  311. package/dist/native/charts/src/engine/shapes/chord.cjs.map +1 -1
  312. package/dist/native/charts/src/engine/shapes/chord.js +108 -103
  313. package/dist/native/charts/src/engine/shapes/chord.js.map +1 -1
  314. package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
  315. package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
  316. package/dist/native/charts/src/engine/shapes/layout.js +88 -73
  317. package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
  318. package/dist/native/components/Chart/ChartBase.cjs +1 -1
  319. package/dist/native/components/Chart/ChartBase.cjs.map +1 -1
  320. package/dist/native/components/Chart/ChartBase.js +127 -115
  321. package/dist/native/components/Chart/ChartBase.js.map +1 -1
  322. package/dist/native/components/Chart/charts.cjs +1 -1
  323. package/dist/native/components/Chart/charts.cjs.map +1 -1
  324. package/dist/native/components/Chart/charts.js +8 -5
  325. package/dist/native/components/Chart/charts.js.map +1 -1
  326. package/dist/native/components/Chart/scene.cjs +1 -1
  327. package/dist/native/components/Chart/scene.cjs.map +1 -1
  328. package/dist/native/components/Chart/scene.d.cts +6 -1
  329. package/dist/native/components/Chart/scene.d.ts +6 -1
  330. package/dist/native/components/Chart/scene.js +99 -50
  331. package/dist/native/components/Chart/scene.js.map +1 -1
  332. package/dist/native/components/Chart/types.d.cts +7 -1
  333. package/dist/native/components/Chart/types.d.ts +7 -1
  334. package/dist/native/components/Charts/charts.cjs +1 -1
  335. package/dist/native/components/Charts/charts.cjs.map +1 -1
  336. package/dist/native/components/Charts/charts.js +23 -18
  337. package/dist/native/components/Charts/charts.js.map +1 -1
  338. package/dist/native/components/ShapeChart/ShapeChartBase.cjs +1 -1
  339. package/dist/native/components/ShapeChart/ShapeChartBase.cjs.map +1 -1
  340. package/dist/native/components/ShapeChart/ShapeChartBase.d.cts +1 -1
  341. package/dist/native/components/ShapeChart/ShapeChartBase.d.ts +1 -1
  342. package/dist/native/components/ShapeChart/ShapeChartBase.js +97 -107
  343. package/dist/native/components/ShapeChart/ShapeChartBase.js.map +1 -1
  344. package/dist/native/components/ShapeChart/geometry.cjs +1 -1
  345. package/dist/native/components/ShapeChart/geometry.cjs.map +1 -1
  346. package/dist/native/components/ShapeChart/geometry.js +120 -36
  347. package/dist/native/components/ShapeChart/geometry.js.map +1 -1
  348. package/dist/native/components/ShapeChart/types.d.cts +6 -4
  349. package/dist/native/components/ShapeChart/types.d.ts +6 -4
  350. package/dist/native/source/components/Chart/ChartBase.tsx +19 -6
  351. package/dist/native/source/components/Chart/charts.tsx +10 -3
  352. package/dist/native/source/components/Chart/scene.tsx +85 -0
  353. package/dist/native/source/components/Chart/types.ts +7 -0
  354. package/dist/native/source/components/Charts/charts.tsx +7 -0
  355. package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +10 -36
  356. package/dist/native/source/components/ShapeChart/geometry.ts +188 -18
  357. package/dist/native/source/components/ShapeChart/types.ts +6 -4
  358. package/dist/taro/chart-a11y.d.ts +7 -0
  359. package/dist/taro/charts.d.ts +4 -1
  360. package/dist/taro/index.js +3212 -3049
  361. package/dist/taro/shape-charts.d.ts +6 -4
  362. package/dist/uni/AreaChart.vue +2 -1
  363. package/dist/uni/AreaChart.vue.d.ts +1 -1
  364. package/dist/uni/BarChart.vue +2 -1
  365. package/dist/uni/BarChart.vue.d.ts +1 -1
  366. package/dist/uni/BoxPlotChart.vue +2 -1
  367. package/dist/uni/BubbleChart.vue +2 -1
  368. package/dist/uni/CandlestickChart.vue +2 -1
  369. package/dist/uni/Chart.vue +2 -1
  370. package/dist/uni/Divider.vue.d.ts +1 -1
  371. package/dist/uni/DonutChart.vue.d.ts +1 -1
  372. package/dist/uni/GanttChart.vue +2 -1
  373. package/dist/uni/GanttChart.vue.d.ts +11 -0
  374. package/dist/uni/GaugeChart.vue.d.ts +1 -1
  375. package/dist/uni/HeatmapChart.vue +2 -1
  376. package/dist/uni/HistogramChart.vue +2 -1
  377. package/dist/uni/HorizontalBarChart.vue +2 -1
  378. package/dist/uni/HorizontalBarChart.vue.d.ts +1 -1
  379. package/dist/uni/LineChart.vue +2 -1
  380. package/dist/uni/MixedChart.vue +2 -1
  381. package/dist/uni/PieChart.vue.d.ts +1 -1
  382. package/dist/uni/QuadrantChart.vue +2 -1
  383. package/dist/uni/RangeAreaChart.vue +2 -1
  384. package/dist/uni/ScatterChart.vue +2 -1
  385. package/dist/uni/Sparkline.vue +2 -1
  386. package/dist/uni/WaterfallChart.vue +2 -1
  387. package/dist/uni/chart-a11y.d.ts +7 -0
  388. package/dist/uni/chart-a11y.js +29 -0
  389. package/dist/uni/chart-canvas.d.ts +9 -0
  390. package/dist/uni/chart-canvas.js +11 -1
  391. package/dist/uni/chart-types.d.ts +8 -1
  392. package/dist/uni/chart-types.js +5 -1
  393. package/dist/uni/charts-canvas.js +2 -1
  394. package/dist/uni/named-chart-options.d.ts +2 -0
  395. package/dist/uni/named-chart-options.js +3 -0
  396. package/dist/uni/shape-chart-canvas.d.ts +0 -2
  397. package/dist/uni/shape-chart-canvas.js +4 -36
  398. package/dist/uni/shape-chart-types.d.ts +2 -2
  399. package/dist/uni/shape-chart-types.js +2 -2
  400. package/dist/vue/components/Chart/Bar3DChart.vue.d.ts +2 -0
  401. package/dist/vue/components/Chart/DependencyGraph.vue.d.ts +2 -0
  402. package/dist/vue/components/Chart/GanttChart.vue.d.ts +15 -0
  403. package/dist/vue/components/Chart/GanttChart.vue.js.map +1 -1
  404. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js +8 -0
  405. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  406. package/dist/vue/components/Chart/GraphChart.vue.d.ts +2 -0
  407. package/dist/vue/components/Chart/Line3DChart.vue.d.ts +2 -0
  408. package/dist/vue/components/Chart/Scatter3DChart.vue.d.ts +2 -0
  409. package/dist/vue/components/Chart/Surface3DChart.vue.d.ts +2 -0
  410. package/dist/vue/components/Chart/TradingChart.vue.d.ts +9 -0
  411. package/dist/vue/components/Chart/TreeChart.vue.d.ts +2 -0
  412. package/dist/vue/components/Chart/graph.d.ts +3 -0
  413. package/dist/vue/components/Chart/graph.js +2 -0
  414. package/dist/vue/components/Chart/graph.js.map +1 -1
  415. package/dist/vue/components/Chart/three-d.d.ts +3 -0
  416. package/dist/vue/components/Chart/three-d.js +2 -0
  417. package/dist/vue/components/Chart/three-d.js.map +1 -1
  418. package/dist/vue/components/Chart/trading.d.ts +7 -2
  419. package/dist/vue/components/Chart/trading.js +1 -0
  420. package/dist/vue/components/Chart/trading.js.map +1 -1
  421. package/dist/weapp/area-chart/index.wxml +1 -1
  422. package/dist/weapp/bar-chart/index.wxml +1 -1
  423. package/dist/weapp/box-plot-chart/index.wxml +1 -1
  424. package/dist/weapp/bubble-chart/index.wxml +1 -1
  425. package/dist/weapp/candlestick-chart/index.wxml +1 -1
  426. package/dist/weapp/chart/index.wxml +1 -1
  427. package/dist/weapp/charts/canvas.js +326 -54
  428. package/dist/weapp/charts/core.js +2 -0
  429. package/dist/weapp/controls.js +58 -27
  430. package/dist/weapp/gantt-chart/index.wxml +1 -1
  431. package/dist/weapp/heatmap-chart/index.wxml +1 -1
  432. package/dist/weapp/histogram-chart/index.wxml +1 -1
  433. package/dist/weapp/horizontal-bar-chart/index.wxml +1 -1
  434. package/dist/weapp/line-chart/index.wxml +1 -1
  435. package/dist/weapp/mixed-chart/index.wxml +1 -1
  436. package/dist/weapp/quadrant-chart/index.wxml +1 -1
  437. package/dist/weapp/range-area-chart/index.wxml +1 -1
  438. package/dist/weapp/scatter-chart/index.wxml +1 -1
  439. package/dist/weapp/sparkline/index.wxml +1 -1
  440. package/dist/weapp/types.d.ts +11 -2
  441. package/dist/weapp/waterfall-chart/index.wxml +1 -1
  442. package/dist/web-components/components/chart/extended.d.ts +4 -0
  443. package/dist/web-components/components/chart/extended.js +8 -2
  444. package/dist/web-components/components/chart/extended.js.map +1 -1
  445. package/dist/web-components/components/chart-3d/chart-3d.d.ts +1 -1
  446. package/dist/web-components/components/chart-3d/chart-3d.js.map +1 -1
  447. package/dist/web-components/components/graph/graph.d.ts +2 -0
  448. package/dist/web-components/components/graph/graph.js +3 -2
  449. package/dist/web-components/components/graph/graph.js.map +1 -1
  450. package/dist/web-components/components/trading-chart/trading-chart.d.ts +1 -1
  451. package/dist/web-components/components/trading-chart/trading-chart.js.map +1 -1
  452. package/dist/web-components/html-custom-data.json +45 -0
  453. package/dist/web-components/types/react.d.ts +4 -4
  454. package/dist/web-components/types/solid.d.ts +8 -8
  455. package/dist/web-components/types/svelte.d.ts +8 -8
  456. package/dist/web-components/types/vue.d.ts +4 -4
  457. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"scene.js","names":["DEFAULT_PADDING","fallbackResolve","fallback","resolveAnnotations","resolve","theme","y","mapY","v","annotations","a","color","mix","layoutChart","input","model","layoutHorizontal","yCount","height","yTicks","axisTicks","view","yLabelWidth","label","measure","y2Ticks","rightTicks","y2LabelWidth","categoryWidth","step","i","padding","plot","computePlot","xCount","xTicks","createScales","axis","map","b","ticks","count","raw","maxAbs","tick","tickFormatter","rows","xLabelWidth","names","name","collectPointLabels","labels","axisFormat","series","format","texts","top","x0","x1","xv","x","reversed","p","toScreen","s","y0","delta","text","xi","yi","d","size","slotOffset","pointOf","sc","plottedY","onColumn","pa","pb","ax","center","half","ay","candidateOf","alongX","px","py","alongY","inside","high","low","outlierAt","list","reach","slop","best","bestDist","k","dotSize","maxSizes","maxDot","sizes","max","nearestScatter","radius","at","toData","rx","ry","gridOf","cellAt","hx","hy","found","yv","nearestX","sorted","nearestIndex","bestD","hoverItemOf","pc","index","toCss","extra","o","open","value","packed","unpackColor","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","formatDuration","yName","valueRow","rowOf","binTitle","change","numberFormat","ohlc","stats","totals","stack","stackIdOf","total","row","formatPercent","seriesIndex","hoverMarks","marks","bandLo","bandHi","plottedOutlier","cx","cy","hw","hh","cell","screenRect","style","heatCellStyle","bottom","left","right","fill","contrastRing","rgba","pad","lo","hi","luminance","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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"}
1
+ {"version":3,"file":"scene.js","names":["DEFAULT_PADDING","fallbackResolve","fallback","resolveAnnotations","resolve","theme","y","mapY","v","x","mapX","annotations","a","color","mix","layoutChart","input","model","layoutHorizontal","yCount","height","yTicks","axisTicks","view","yLabelWidth","label","measure","y2Ticks","rightTicks","y2LabelWidth","categoryWidth","step","i","padding","plot","computePlot","xCount","xTicks","createScales","axis","map","b","ticks","count","raw","maxAbs","tick","tickFormatter","rows","xLabelWidth","names","name","collectPointLabels","labels","axisFormat","series","format","texts","top","x0","x1","xv","reversed","p","toScreen","s","y0","delta","text","xi","yi","d","size","slotOffset","pointOf","sc","plottedY","onColumn","pa","pb","ax","center","half","ay","candidateOf","alongX","px","py","alongY","inside","high","low","outlierAt","list","reach","slop","best","bestDist","k","dotSize","maxSizes","maxDot","sizes","max","nearestScatter","radius","at","toData","rx","ry","gridOf","cellAt","hx","hy","found","yv","nearestX","sorted","nearestIndex","bestD","hoverItemOf","pc","index","toCss","extra","o","open","value","packed","unpackColor","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","formatDuration","yName","valueRow","yAxisFormat","rowOf","binTitle","change","numberFormat","ohlc","stats","totals","stack","stackIdOf","total","row","formatPercent","seriesIndex","hoverMarks","marks","bandLo","bandHi","itX","plottedOutlier","cx","cy","hw","hh","cell","screenRect","style","heatCellStyle","bottom","left","right","fill","contrastRing","rgba","pad","lo","hi","luminance","connectorSegments","v0","v1","prev","resolveDependencies","muted","dependencies","ARROW_HEAD","rowSpans","bar","start","end","dependencyArrows","horizontal","pt","valuePx","categoryPx","dir","rowPx","ev","ca","sv","cb","base","length","points","exit","between","back","COLOR_STOPS","colorLegend","lut","stops","mid","legendShown","option","named","legendShape","type","showsCrosshair","crosshair","crosshairAt","toPlotX"],"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 {\n gridOf,\n plottedY,\n toPlotX,\n type ChartModel,\n type SeriesModel,\n} from \"./model\";\nimport type { PointLabel, ResolvedAnnotation } from \"./overlay\";\nimport type { ChartTheme } from \"./theme\";\nimport type { Range } from \"./viewport\";\nimport type {\n ChartAnnotation,\n ChartDependency,\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` / `mapX` turn values\n * into plotted units (log axes)\n */\nexport const resolveAnnotations = (\n annotations: readonly ChartAnnotation[] | undefined,\n theme: ChartTheme,\n mapY?: (value: number) => number,\n mapX?: (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 const x = <T extends number | undefined>(v: T): T =>\n (mapX && v !== undefined ? mapX(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: x(a.x0),\n x1: x(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: 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) : x(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 yAxisFormat =\n s.yAxis === \"right\"\n ? (y2Ticks?.formatValue ?? model.y2?.format ?? model.formatValue)\n : yFormat;\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 // bubbles: `format` is the one of their value, y keeps the axis one\n value: (it.value !== undefined ? yAxisFormat : formatOf(s))(it.y),\n },\n ...valueRow,\n ...detailRows(s, it.index),\n ];\n return {\n title: it.label ?? it.seriesName,\n titleColor: it.color,\n // a named point of a group: the group under its name\n ...(it.label !== undefined && model.series.length > 1\n ? { subtitle: it.seriesName }\n : {}),\n rows,\n };\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 // plotted x (the logarithm on log x axes)\n const itX = s.cols.x[it.index] ?? it.x;\n if (s.type === \"boxplot\" && it.outlier !== undefined) {\n const p = toScreen(sc, itX + 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(itX + 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(itX);\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/** A dependency with its color resolved against the theme */\nexport interface ResolvedDependency {\n from: string;\n to: string;\n color: string;\n}\n\n/** Colors of the dependency arrows (resolved once per options / theme) */\nexport const resolveDependencies = (\n dependencies: readonly ChartDependency[] | undefined,\n theme: ChartTheme,\n): ResolvedDependency[] => {\n const resolve = theme.resolve ?? fallbackResolve;\n const muted = toCss(theme.textMuted, 0.85);\n return (dependencies ?? []).map((d) => ({\n from: d.from,\n to: d.to,\n color: d.color ? toCss(resolve(d.color, theme.textMuted)) : muted,\n }));\n};\n\n/**\n * Elbow arrow between two bars, pixels of the stage: an axis-aligned\n * polyline ending at the base of a filled triangular head\n */\nexport interface DependencyArrow {\n /** Corners of the line, from the end of the predecessor to the base of the head */\n points: { x: number; y: number }[];\n /** Tip and the two base corners of the arrowhead */\n head: [\n { x: number; y: number },\n { x: number; y: number },\n { x: number; y: number },\n ];\n color: string;\n width: number;\n}\n\n/** Length and half width of the arrowheads, in CSS pixels */\nexport const ARROW_HEAD = { length: 6, half: 3.5 };\n\ninterface RowSpan {\n /** Category position of the bar center */\n at: number;\n start: number;\n end: number;\n /** Half thickness of the bar / radius of the dot in pixels */\n half: number;\n /** A dot (milestone): the arrows stop at its edge */\n dot: boolean;\n}\n\n/** Bars (or dots) of every category, the first visible one per category */\nconst rowSpans = (model: ChartModel, sc: Scales): Map<number, RowSpan> => {\n const rows = new Map<number, RowSpan>();\n for (const s of model.series) {\n if (s.hidden || !s.tooltip) continue;\n if (s.type !== \"bar\" && s.type !== \"scatter\") continue;\n const { x, y, count } = s.cols;\n const bar = s.type === \"bar\" && s.barBase && s.barTop;\n const half = bar ? s.barHalfWidth / Math.abs(sc.xPerPx) : dotSize(s, 0) / 2;\n for (let i = 0; i < count; i++) {\n const k = Math.round(x[i]);\n if (rows.has(k)) continue;\n const start = bar ? s.barBase![i] : y[i];\n const end = bar ? s.barTop![i] : y[i];\n if (!Number.isFinite(start) || !Number.isFinite(end)) continue;\n rows.set(k, {\n at: x[i] + slotOffset(s),\n start: Math.min(start, end),\n end: Math.max(start, end),\n half,\n dot: !bar,\n });\n }\n }\n return rows;\n};\n\n/**\n * Dependency arrows (`dependencies`, Gantt charts): from the end of the\n * predecessor to the start of the successor; when the successor starts\n * too early the line turns around between the rows\n */\nexport const dependencyArrows = (\n model: ChartModel,\n sc: Scales,\n dependencies: readonly ResolvedDependency[],\n): DependencyArrow[] => {\n if (!dependencies.length || model.x.type !== \"category\") return [];\n const rows = rowSpans(model, sc);\n const index = new Map<string, number>();\n model.x.categories.forEach((c, i) => {\n if (!index.has(c)) index.set(c, i);\n });\n // (value pixel, category pixel) -> stage pixels\n const horizontal = sc.horizontal;\n const pt = (v: number, c: number) =>\n horizontal ? { x: v, y: c } : { x: c, y: v };\n const valuePx = (value: number) => {\n const p = toScreen(sc, 0, value);\n return horizontal ? p.x : p.y;\n };\n const categoryPx = (at: number) => {\n const p = toScreen(sc, at, 0);\n return horizontal ? p.y : p.x;\n };\n const dir = Math.sign(valuePx(sc.view.y[1]) - valuePx(sc.view.y[0])) || 1;\n const rowPx = Math.abs(categoryPx(1) - categoryPx(0));\n const { length, half } = ARROW_HEAD;\n const gap = 8;\n const out: DependencyArrow[] = [];\n for (const d of dependencies) {\n const a = rows.get(index.get(d.from) ?? NaN);\n const b = rows.get(index.get(d.to) ?? NaN);\n if (!a || !b || a === b) continue;\n const ev = valuePx(a.end) + (a.dot ? dir * a.half : 0);\n const ca = categoryPx(a.at);\n const sv = valuePx(b.start) - dir * (b.dot ? b.half + 1 : 1);\n const cb = categoryPx(b.at);\n const base = sv - dir * length;\n const points = [pt(ev, ca)];\n const exit = ev + dir * gap;\n if (dir * (base - exit) >= 0) {\n // room before the successor: out, across the rows, in\n points.push(pt(exit, ca), pt(exit, cb), pt(base, cb));\n } else {\n // around: out, to the gap between the rows, back, across, in\n const side = Math.sign(cb - ca) || 1;\n const between = ca + side * Math.max(a.half + 3, rowPx / 2);\n const back = base - dir * gap;\n points.push(\n pt(exit, ca),\n pt(exit, between),\n pt(back, between),\n pt(back, cb),\n pt(base, cb),\n );\n }\n out.push({\n points,\n head: [pt(sv, cb), pt(base, cb - half), pt(base, cb + half)],\n color: d.color,\n width: 1.25,\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 first = event.items[0];\n const c = sc.xToPx(\n model.series[first.seriesIndex]?.cols.x[first.index] ??\n toPlotX(model, first.x),\n );\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,2 +1,2 @@
1
- const e=require("../color.cjs"),t=require("../overlay.cjs"),n=require("./labels.cjs"),r=require("./scene.cjs");var i=e=>{let t=[],n=[],i=new Map;for(let r of e.groups??[]){let e=typeof r==`string`?{name:r}:r;e&&typeof e.name==`string`&&(i.has(e.name)||i.set(e.name,t.length),t.push(e.name),n.push(e.color))}let a=new Map;if(e.links){let o=t.length,s=e=>{if(typeof e==`number`)return Number.isInteger(e)&&e>=0&&e<o?e:-1;if(typeof e!=`string`)return-1;let r=i.get(e);return r===void 0?(i.set(e,t.length),t.push(e),n.push(void 0),t.length-1):r},c=[];for(let t of e.links){if(!t)continue;let e=s(t.source),n=s(t.target);e<0||n<0||c.push([e,n,r.positive(t.value),t.color])}let l=t.length,u=t.map(()=>Array(l).fill(0));for(let[e,t,n,r]of c)u[e][t]+=n,r&&a.set(e*l+t,r);return{names:t,colors:n,matrix:u,cellColors:a}}let o=e.matrix??[],s=Math.max(t.length,o.length);for(let e=t.length;e<s;e++)t.push(String(e+1)),n.push(void 0);return{names:t,colors:n,matrix:t.map((e,n)=>t.map((e,t)=>r.positive(o[n]?.[t]))),cellColors:a}},a=e=>{let t=r.uniqueKeys(e.names);return{group:e=>`~${t[e]}`,cell:(e,n)=>`${t[e]}\u2192${t[n]}`}},o=(e,t,n,r)=>e.matrix[n][r]>0&&!(t&&n===r),s=(e,t,n)=>{let r=i(e),s=a(r),c=!!e.directed;r.names.forEach((e,i)=>{n.set(s.group(i),+!t.has(i)),r.names.forEach((e,a)=>{o(r,c,i,a)&&n.set(s.cell(i,a),t.has(i)||t.has(a)?0:r.matrix[i][a])})})},c=(e,t)=>{let n=e.length,r=Array(n).fill(0),i=Array(n).fill(0);for(let a=0;a<n;a++)for(let o=0;o<n;o++)t&&a===o||(r[a]+=e[a][o],i[o]+=e[a][o]);return{out:r,inc:i,value:r.map((e,n)=>t?e+i[n]:e)}},l=e=>{if(!(e>0)||!Number.isFinite(e))return 0;let t=10**Math.floor(Math.log10(e));for(let n of[1,2,5,10])if(n*t>=e*(1-1e-9))return n*t;return 10*t},u=12,d=22,f=(s,f)=>{let{theme:p,area:m,measure:h,hidden:g}=f,_=i(s),{names:v,matrix:y}=_,b=v.length;if(!b)return r.emptyLayout(f);let x=!!s.directed,ee=a(_),S=(e,t)=>o(_,x,e,t),te=y.map((e,t)=>e.map((e,n)=>S(t,n)?Math.max(0,f.value(ee.cell(t,n),g.has(t)||g.has(n)?0:e)):0)),C=y.map((e,t)=>e.map((e,n)=>S(t,n)&&!g.has(t)&&!g.has(n)?e:0)),w=c(te,x),T=c(C,x),ne=T.value.reduce((e,t)=>e+t,0),E=v.map((e,t)=>T.value[t]>0||w.value[t]>1e-9?r.clamp(f.value(ee.group(t),+!g.has(t)),0,1):0),D=w.value.reduce((e,t)=>e+t,0);if(D<=1e-12)return r.emptyLayout(f);let O=c(y.map((e,t)=>e.map((e,n)=>S(t,n)?e:0)),x).value,k=v.map((e,t)=>t);if(s.sortGroups===`ascending`||s.sortGroups===`descending`){let e=s.sortGroups===`ascending`?1:-1;k.sort((t,n)=>e*(O[t]-O[n])||t-n)}let A=Array(b);k.forEach((e,t)=>A[e]=t);let j=m.x+m.width/2,M=m.y+m.height/2,N=Math.min(m.width,m.height)/2,P=s.labels??`auto`,F=t.font(p,u,500),re=t.font(p,10),I=s.ticks,ie=I===!1?!1:typeof I==`number`?I>0:N>=150,L=ie?d:0,R=r.clamp(r.finite(s.padAngle,2),0,45)*(Math.PI/180),z=R*E.reduce((e,t)=>e+t,0),B=z>r.TAU*.5?r.TAU*.5/z:1,V=(r.TAU-z*B)/D,ae=-Math.PI/2+r.finite(s.startAngle)*Math.PI/180,H=Array(b);{let e=ae+R*B*(E[k[0]]??0)/2;for(let t of k){let n=e,r=n+w.value[t]*V;H[t]={a0:n,a1:r},e=r+R*B*E[t]}}let U=e=>H[e].a1-H[e].a0>1e-6,oe=v.map(e=>h(e,F)),se=e=>k.every(t=>!U(t)||oe[t]+6<=(H[t].a1-H[t].a0+R*B*.8)*e),W=P===`none`?`none`:P===`radial`?`radial`:`tangential`;P===`auto`&&!se(Math.max(1,N-12))&&(W=`radial`);let ce=e=>{let t=Math.abs(Math.cos(e)),n=Math.abs(Math.sin(e));return Math.min(t>1e-6?(m.width/2-2)/t:1/0,n>1e-6?(m.height/2-u/2-1)/n:1/0)},le=e=>(H[e].a0+H[e].a1)/2,ue=e=>Math.abs(Math.sin(e))>.92,G;if(W===`radial`){G=N-L-8;for(let e of k)if(U(e)&&E[e]>.5){let t=le(e),n=ue(t)?14:oe[e];G=Math.min(G,ce(t)-n-L-10)}G=Math.max(N*.5,G)}else G=N-L-(W===`none`?0:22)-2;G=Math.max(16,G);let de=r.clamp(r.finite(s.arcWidth,r.clamp(G*.06,8,18)),2,G*.5),fe=G-de,K=Math.max(4,fe-2),q=v.map(()=>[]);for(let e=0;e<b;e++)for(let t=0;t<b;t++)x?S(e,t)&&(q[e].push({j:t,dir:`out`,raw:y[e][t],a0:0,a1:0}),q[t].push({j:e,dir:`in`,raw:y[e][t],a0:0,a1:0})):(S(e,t)||S(t,e))&&q[e].push({j:t,dir:`out`,raw:y[e][t],a0:0,a1:0});let J=s.sortSubgroups??`auto`;q.forEach((e,t)=>{let n=e=>{let n=(A[e]-A[t]+b)%b;return n===0?b/2:n};e.sort((e,t)=>{let r=Number(e.dir===`in`)-Number(t.dir===`in`);return J===`ascending`||J===`descending`?(J===`ascending`?1:-1)*(e.raw-t.raw)||A[e.j]-A[t.j]||r:J===`none`?A[e.j]-A[t.j]||r:n(t.j)-n(e.j)||r});let r=H[t].a0;for(let n of e){let e=n.dir===`out`?te[t][n.j]:te[n.j][t];n.a0=r,n.a1=r+e*V,r=n.a1}});let Y=(e,t,n)=>q[e].find(e=>e.j===t&&e.dir===n),X=v.map((e,t)=>f.color(_.colors[t],t)).map(t=>e.toCss(t)),pe=e.toCss(e.mix(p.grid,p.textMuted,.45)),me=s.ribbonColor??`gradient`,he=r.clamp(r.finite(s.ribbonOpacity,.65),.02,1),ge=Math.min(1,he+.25),_e=s.arrows??x?r.clamp(K*.07,5,12):0,Z=[],ve=(e,t)=>b+e*b+t;for(let e=0;e<b;e++)for(let t=x?0:e;t<b;t++)if(x){if(!S(e,t))continue;let n=Y(e,t,`out`),r=Y(t,e,`in`);n&&r&&Z.push({index:ve(e,t),s:e,t,src:n,tgt:r})}else{if(!S(e,t)&&!S(t,e))continue;let[n,r]=y[t][e]>y[e][t]?[t,e]:[e,t],i=Y(n,r,`out`),a=Y(r,n,`out`);i&&a&&Z.push({index:ve(n,r),s:n,t:r,src:i,tgt:a})}let Q=v.map(()=>[]);for(let e of Z)Q[e.s].push(e.index),e.t!==e.s&&Q[e.t].push(e.index);let $=[],ye=e=>e.src.a1-e.src.a0+(e.tgt.a1-e.tgt.a0);for(let t of Z.slice().sort((e,t)=>ye(t)-ye(e))){if(ye(t)<=1e-6)continue;let n=_.cellColors.get(t.s*b+t.t)??(x?void 0:_.cellColors.get(t.t*b+t.s)),r,i;n?r=i=e.toCss(f.color(n,t.s)):me===`source`?r=i=X[t.s]:me===`target`?r=i=X[t.t]:me===`neutral`?r=i=pe:(r=X[t.s],i=X[t.t]),$.push({kind:`ribbon`,cx:j,cy:M,r:K,s0:t.src.a0,s1:t.src.a1,t0:t.tgt.a0,t1:t.tgt.a1,head:t.s===t.t?0:_e,color0:r,color1:i,alpha:he,activeAlpha:ge,hit:t.index,also:t.s===t.t?[t.s]:[t.s,t.t]})}for(let e of k)U(e)&&$.push({kind:`sector`,cx:j,cy:M,r0:fe,r1:G,a0:H[e].a0,a1:H[e].a1,pad:0,corner:Math.min(2,de/4),fill:X[e],hit:e,also:Q[e],alpha:E[e]});let be=e.toCss(p.textMuted),xe=e.toCss(p.textMuted,.7);if(ie){let e=V*G,t=s.tickFormat??n.localeFormat(f.locale),i=h(t(Math.max(...O)),re)+14,a=typeof I==`number`?I:l(i/Math.max(e,1e-12)),o=D/Math.max(a,1e-12);(!(a>0)||o>240)&&(a=l(D/240));let c=a/5*e>=5?a/5:a/2*e>=5?a/2:a,u=Math.round(a/c),d=G+2,p=G+15,m=-1/0,g=null;for(let n of k){if(!U(n))continue;let{a0:i,a1:a}=H[n],o=Q[n];for(let s=0;;s++){let l=i+s*c*V;if(l>a+1e-9)break;let f=s%u===0,_=f?5:3;if((e*c>=3||f)&&$.push({kind:`line`,points:[j+d*Math.cos(l),M+d*Math.sin(l),j+(d+_)*Math.cos(l),M+(d+_)*Math.sin(l)],color:xe,width:1,hit:n,also:o}),!f)continue;let v=t(s*c),y=(h(v,re)/2+3)/p;l-y<m||g!==null&&l+y>g+r.TAU||(g===null&&(g=l-y),m=l+y,$.push({kind:`text`,x:j+p*Math.cos(l),y:M+p*Math.sin(l),text:v,font:re,color:be,align:`center`,baseline:`middle`,rotate:r.upright(l+Math.PI/2),hit:n,also:o}))}}}if(W!==`none`){let t=G+L+6,n=e.toCss(p.text),i=[],a=(e,t,n,r,i)=>{let a=[],o=Math.max(1,Math.ceil(i/6));for(let s=0;s<=o;s++)a.push([e+n*i*s/o,t+r*i*s/o]);return a},o=e=>i.some(t=>t.some(([t,n])=>e.some(([e,r])=>Math.hypot(t-e,n-r)<15))),s=k.filter(e=>U(e)&&E[e]>.5).sort((e,t)=>w.value[t]-w.value[e]);for(let e of s){let{a0:s,a1:c}=H[e],l=(s+c)/2;if(W===`tangential`){let i=(c-s+R*B*.8)*(t+6)-6,a=r.ellipsize(v[e],i,F,h);if(!a)continue;$.push({kind:`text`,x:j+(t+6)*Math.cos(l),y:M+(t+6)*Math.sin(l),text:a,font:F,color:n,align:`center`,baseline:`middle`,rotate:r.upright(l+Math.PI/2),hit:e,also:Q[e]});continue}let u=j+t*Math.cos(l),d=M+t*Math.sin(l);if(ue(l)){let s=d+Math.sign(Math.sin(l))*7,c=Math.cos(l)>=0?`left`:`right`,f=[`center`,c,c===`left`?`right`:`left`],p=e=>e.every(([e,n])=>Math.hypot(e-j,n-M)>=t+2);for(let t of f){let c=t===`center`?2*Math.min(u-m.x,m.x+m.width-u)-4:t===`left`?m.x+m.width-u-2:u-m.x-2,l=r.ellipsize(v[e],c,F,h);if(!l)continue;let d=h(l,F),f=a(t===`left`?u:t===`right`?u-d:u-d/2,s,1,0,d);if(p(f)&&!o(f)){i.push(f),$.push({kind:`text`,x:u,y:s,text:l,font:F,color:n,align:t,baseline:`middle`,hit:e,also:Q[e]});break}}continue}let f=r.ellipsize(v[e],ce(l)-t-2,F,h);if(!f)continue;let p=a(u,d,Math.cos(l),Math.sin(l),h(f,F));if(o(p))continue;i.push(p);let g=Math.cos(l)>=0;$.push({kind:`text`,x:u,y:d,text:f,font:F,color:n,align:g?`left`:`right`,baseline:`middle`,rotate:g?l:l+Math.PI,hit:e,also:Q[e]})}}let Se=[],Ce=x||y.some((e,t)=>e.some((e,n)=>Math.abs(e-y[n][t])>1e-12));for(let e of k){let t=T.value[e];if(!(t>0)||g.has(e))continue;let n=ne>0?t/ne:0,r=(H[e].a0+H[e].a1)/2;Se.push({index:e,name:v[e],value:t,percent:n,share:f.percent(n),color:X[e],x:j+G*Math.cos(r),y:M+G*Math.sin(r),rows:[...x||!Ce?[{name:f.labels.value,value:f.format(t)}]:[],...Ce?[{name:f.labels.outgoing,value:f.format(T.out[e])},{name:f.labels.incoming,value:f.format(T.inc[e])}]:[],{name:f.labels.share,value:f.percent(n)}]})}let we=C.reduce((e,t)=>e+t.reduce((e,t)=>e+t,0),0),Te=Z.filter(e=>C[e.s][e.t]>0||C[e.t][e.s]>0).sort((e,t)=>A[e.s]-A[t.s]||e.src.a0-t.src.a0||A[e.t]-A[t.t]);for(let e of Te){let t=C[e.s][e.t],n=e.s!==e.t&&C[e.s][e.t]+C[e.t][e.s]>0?y[e.t][e.s]:0,r=we>0?t/we:0,i=v[e.s],a=v[e.t],o=(e.src.a0+e.src.a1)/2,s=(e.tgt.a0+e.tgt.a1)/2,c=e.s===e.t?j+K*.7*Math.cos(o):.25*(j+K*Math.cos(o))+.5*j+.25*(j+K*Math.cos(s)),l=e.s===e.t?M+K*.7*Math.sin(o):.25*(M+K*Math.sin(o))+.5*M+.25*(M+K*Math.sin(s));Se.push({index:e.index,name:e.s===e.t?i:`${i} \u2192 ${a}`,value:t,percent:r,share:f.percent(r),color:X[e.s],x:c,y:l,rows:[{name:f.labels.value,value:f.format(t)},...e.s!==e.t&&(!x||n>0)?[{name:f.labels.reverse,value:f.format(n)}]:[],{name:f.labels.share,value:f.percent(r)}],event:{source:i,target:a,reverseValue:n}})}let Ee=r.clamp(f.enter,0,1);return{nodes:$,items:Se,dim:.25,empty:!1,...Ee<1?{enter:{alpha:Ee,scale:.94+.06*Ee,cx:j,cy:M}}:{}}};exports.chordValues=s,exports.layoutChord=f,exports.resolveChord=i;
1
+ const e=require("../color.cjs"),t=require("../overlay.cjs"),n=require("./labels.cjs"),r=require("./scene.cjs");var i=e=>{let t=[],n=[],i=new Map;for(let r of e.groups??[]){let e=typeof r==`string`?{name:r}:r;e&&typeof e.name==`string`&&(i.has(e.name)||i.set(e.name,t.length),t.push(e.name),n.push(e.color))}let a=new Map;if(e.links){let o=t.length,s=e=>{if(typeof e==`number`)return Number.isInteger(e)&&e>=0&&e<o?e:-1;if(typeof e!=`string`)return-1;let r=i.get(e);return r===void 0?(i.set(e,t.length),t.push(e),n.push(void 0),t.length-1):r},c=[];for(let t of e.links){if(!t)continue;let e=s(t.source),n=s(t.target);e<0||n<0||c.push([e,n,r.positive(t.value),t.color])}let l=t.length,u=t.map(()=>Array(l).fill(0));for(let[e,t,n,r]of c)u[e][t]+=n,r&&a.set(e*l+t,r);return{names:t,colors:n,matrix:u,cellColors:a}}let o=e.matrix??[],s=Math.max(t.length,o.length);for(let e=t.length;e<s;e++)t.push(String(e+1)),n.push(void 0);return{names:t,colors:n,matrix:t.map((e,n)=>t.map((e,t)=>r.positive(o[n]?.[t]))),cellColors:a}},a=e=>{let t=r.uniqueKeys(e.names);return{group:e=>`~${t[e]}`,cell:(e,n)=>`${t[e]}\u2192${t[n]}`}},o=(e,t,n,r)=>e.matrix[n][r]>0&&!(t&&n===r),s=(e,t,n)=>{let r=i(e),s=a(r),c=!!e.directed;r.names.forEach((e,i)=>{n.set(s.group(i),+!t.has(i)),r.names.forEach((e,a)=>{o(r,c,i,a)&&n.set(s.cell(i,a),t.has(i)||t.has(a)?0:r.matrix[i][a])})})},c=e=>e.every((t,n)=>t.every((t,r)=>{let i=e[r]?.[n]??0;return Math.abs(t-i)<=1e-9*Math.max(1,Math.abs(t),Math.abs(i))})),l=(e,t,n,r)=>n===r||t?e[n][r]:e[n][r]+e[r][n],u=(e,t,n)=>{let r=e.length,i=Array(r).fill(0),a=Array(r).fill(0);for(let n=0;n<r;n++)for(let o=0;o<r;o++)t&&n===o||(i[n]+=e[n][o],a[o]+=e[n][o]);return{out:i,inc:a,value:i.map((r,i)=>t?r+a[i]:n?r:Math.max(0,r+a[i]-e[i][i]))}},d=e=>{if(!(e>0)||!Number.isFinite(e))return 0;let t=10**Math.floor(Math.log10(e));for(let n of[1,2,5,10])if(n*t>=e*(1-1e-9))return n*t;return 10*t},f=12,p=22,m=(s,m)=>{let{theme:h,area:g,measure:_,hidden:v}=m,y=i(s),{names:b,matrix:x}=y,S=b.length;if(!S)return r.emptyLayout(m);let C=!!s.directed,ee=a(y),w=(e,t)=>o(y,C,e,t),T=x.map((e,t)=>e.map((e,n)=>w(t,n)?Math.max(0,m.value(ee.cell(t,n),v.has(t)||v.has(n)?0:e)):0)),E=x.map((e,t)=>e.map((e,n)=>w(t,n)&&!v.has(t)&&!v.has(n)?e:0)),D=!C&&c(x.map((e,t)=>e.map((e,n)=>w(t,n)?e:0))),te=(e,t,n)=>l(e,D,t,n),O=u(T,C,D),k=u(E,C,D),ne=k.value.reduce((e,t)=>e+t,0),A=b.map((e,t)=>k.value[t]>0||O.value[t]>1e-9?r.clamp(m.value(ee.group(t),+!v.has(t)),0,1):0),j=O.value.reduce((e,t)=>e+t,0);if(j<=1e-12)return r.emptyLayout(m);let re=u(x.map((e,t)=>e.map((e,n)=>w(t,n)?e:0)),C,D).value,M=b.map((e,t)=>t);if(s.sortGroups===`ascending`||s.sortGroups===`descending`){let e=s.sortGroups===`ascending`?1:-1;M.sort((t,n)=>e*(re[t]-re[n])||t-n)}let N=Array(S);M.forEach((e,t)=>N[e]=t);let P=g.x+g.width/2,F=g.y+g.height/2,I=Math.min(g.width,g.height)/2,ie=s.labels??`auto`,L=t.font(h,f,500),ae=t.font(h,10),R=s.ticks,oe=R===!1?!1:typeof R==`number`?R>0:I>=150,z=oe?p:0,B=r.clamp(r.finite(s.padAngle,2),0,45)*(Math.PI/180),se=B*A.reduce((e,t)=>e+t,0),V=se>r.TAU*.5?r.TAU*.5/se:1,H=(r.TAU-se*V)/j,ce=-Math.PI/2+r.finite(s.startAngle)*Math.PI/180,U=Array(S);{let e=ce+B*V*(A[M[0]]??0)/2;for(let t of M){let n=e,r=n+O.value[t]*H;U[t]={a0:n,a1:r},e=r+B*V*A[t]}}let W=e=>U[e].a1-U[e].a0>1e-6,le=b.map(e=>_(e,L)),ue=e=>M.every(t=>!W(t)||le[t]+6<=(U[t].a1-U[t].a0+B*V*.8)*e),G=ie===`none`?`none`:ie===`radial`?`radial`:`tangential`;ie===`auto`&&!ue(Math.max(1,I-12))&&(G=`radial`);let de=e=>{let t=Math.abs(Math.cos(e)),n=Math.abs(Math.sin(e));return Math.min(t>1e-6?(g.width/2-2)/t:1/0,n>1e-6?(g.height/2-f/2-1)/n:1/0)},fe=e=>(U[e].a0+U[e].a1)/2,pe=e=>Math.abs(Math.sin(e))>.92,K;if(G===`radial`){K=I-z-8;for(let e of M)if(W(e)&&A[e]>.5){let t=fe(e),n=pe(t)?14:le[e];K=Math.min(K,de(t)-n-z-10)}K=Math.max(I*.5,K)}else K=I-z-(G===`none`?0:22)-2;K=Math.max(16,K);let me=r.clamp(r.finite(s.arcWidth,r.clamp(K*.06,8,18)),2,K*.5),he=K-me,q=Math.max(4,he-2),J=b.map(()=>[]);for(let e=0;e<S;e++)for(let t=0;t<S;t++)C?w(e,t)&&(J[e].push({j:t,dir:`out`,raw:x[e][t],a0:0,a1:0}),J[t].push({j:e,dir:`in`,raw:x[e][t],a0:0,a1:0})):(w(e,t)||w(t,e))&&J[e].push({j:t,dir:`out`,raw:x[e][t],a0:0,a1:0});let Y=s.sortSubgroups??`auto`;J.forEach((e,t)=>{let n=e=>{let n=(N[e]-N[t]+S)%S;return n===0?S/2:n};e.sort((e,t)=>{let r=Number(e.dir===`in`)-Number(t.dir===`in`);return Y===`ascending`||Y===`descending`?(Y===`ascending`?1:-1)*(e.raw-t.raw)||N[e.j]-N[t.j]||r:Y===`none`?N[e.j]-N[t.j]||r:n(t.j)-n(e.j)||r});let r=U[t].a0;for(let n of e){let e=C?n.dir===`out`?T[t][n.j]:T[n.j][t]:te(T,t,n.j);n.a0=r,n.a1=r+e*H,r=n.a1}});let ge=(e,t,n)=>J[e].find(e=>e.j===t&&e.dir===n),X=b.map((e,t)=>m.color(y.colors[t],t)).map(t=>e.toCss(t)),_e=e.toCss(e.mix(h.grid,h.textMuted,.45)),ve=s.ribbonColor??`gradient`,ye=r.clamp(r.finite(s.ribbonOpacity,.65),.02,1),be=Math.min(1,ye+.25),xe=s.arrows??C?r.clamp(q*.07,5,12):0,Z=[],Se=(e,t)=>S+e*S+t;for(let e=0;e<S;e++)for(let t=C?0:e;t<S;t++)if(C){if(!w(e,t))continue;let n=ge(e,t,`out`),r=ge(t,e,`in`);n&&r&&Z.push({index:Se(e,t),s:e,t,src:n,tgt:r})}else{if(!w(e,t)&&!w(t,e))continue;let[n,r]=x[t][e]>x[e][t]?[t,e]:[e,t],i=ge(n,r,`out`),a=ge(r,n,`out`);i&&a&&Z.push({index:Se(n,r),s:n,t:r,src:i,tgt:a})}let Q=b.map(()=>[]);for(let e of Z)Q[e.s].push(e.index),e.t!==e.s&&Q[e.t].push(e.index);let $=[],Ce=e=>e.src.a1-e.src.a0+(e.tgt.a1-e.tgt.a0);for(let t of Z.slice().sort((e,t)=>Ce(t)-Ce(e))){if(Ce(t)<=1e-6)continue;let n=y.cellColors.get(t.s*S+t.t)??(C?void 0:y.cellColors.get(t.t*S+t.s)),r,i;n?r=i=e.toCss(m.color(n,t.s)):ve===`source`?r=i=X[t.s]:ve===`target`?r=i=X[t.t]:ve===`neutral`?r=i=_e:(r=X[t.s],i=X[t.t]),$.push({kind:`ribbon`,cx:P,cy:F,r:q,s0:t.src.a0,s1:t.src.a1,t0:t.tgt.a0,t1:t.tgt.a1,head:t.s===t.t?0:xe,color0:r,color1:i,alpha:ye,activeAlpha:be,hit:t.index,also:t.s===t.t?[t.s]:[t.s,t.t]})}for(let e of M)W(e)&&$.push({kind:`sector`,cx:P,cy:F,r0:he,r1:K,a0:U[e].a0,a1:U[e].a1,pad:0,corner:Math.min(2,me/4),fill:X[e],hit:e,also:Q[e],alpha:A[e]});let we=e.toCss(h.textMuted),Te=e.toCss(h.textMuted,.7);if(oe){let e=H*K,t=s.tickFormat??n.localeFormat(m.locale),i=_(t(Math.max(...re)),ae)+14,a=typeof R==`number`?R:d(i/Math.max(e,1e-12)),o=j/Math.max(a,1e-12);(!(a>0)||o>240)&&(a=d(j/240));let c=a/5*e>=5?a/5:a/2*e>=5?a/2:a,l=Math.round(a/c),u=K+2,f=K+15,p=-1/0,h=null;for(let n of M){if(!W(n))continue;let{a0:i,a1:a}=U[n],o=Q[n];for(let s=0;;s++){let d=i+s*c*H;if(d>a+1e-9)break;let m=s%l===0,g=m?5:3;if((e*c>=3||m)&&$.push({kind:`line`,points:[P+u*Math.cos(d),F+u*Math.sin(d),P+(u+g)*Math.cos(d),F+(u+g)*Math.sin(d)],color:Te,width:1,hit:n,also:o}),!m)continue;let v=t(s*c),y=(_(v,ae)/2+3)/f;d-y<p||h!==null&&d+y>h+r.TAU||(h===null&&(h=d-y),p=d+y,$.push({kind:`text`,x:P+f*Math.cos(d),y:F+f*Math.sin(d),text:v,font:ae,color:we,align:`center`,baseline:`middle`,rotate:r.upright(d+Math.PI/2),hit:n,also:o}))}}}if(G!==`none`){let t=K+z+6,n=e.toCss(h.text),i=[],a=(e,t,n,r,i)=>{let a=[],o=Math.max(1,Math.ceil(i/6));for(let s=0;s<=o;s++)a.push([e+n*i*s/o,t+r*i*s/o]);return a},o=e=>i.some(t=>t.some(([t,n])=>e.some(([e,r])=>Math.hypot(t-e,n-r)<15))),s=M.filter(e=>W(e)&&A[e]>.5).sort((e,t)=>O.value[t]-O.value[e]);for(let e of s){let{a0:s,a1:c}=U[e],l=(s+c)/2;if(G===`tangential`){let i=(c-s+B*V*.8)*(t+6)-6,a=r.ellipsize(b[e],i,L,_);if(!a)continue;$.push({kind:`text`,x:P+(t+6)*Math.cos(l),y:F+(t+6)*Math.sin(l),text:a,font:L,color:n,align:`center`,baseline:`middle`,rotate:r.upright(l+Math.PI/2),hit:e,also:Q[e]});continue}let u=P+t*Math.cos(l),d=F+t*Math.sin(l);if(pe(l)){let s=d+Math.sign(Math.sin(l))*7,c=Math.cos(l)>=0?`left`:`right`,f=[`center`,c,c===`left`?`right`:`left`],p=e=>e.every(([e,n])=>Math.hypot(e-P,n-F)>=t+2);for(let t of f){let c=t===`center`?2*Math.min(u-g.x,g.x+g.width-u)-4:t===`left`?g.x+g.width-u-2:u-g.x-2,l=r.ellipsize(b[e],c,L,_);if(!l)continue;let d=_(l,L),f=a(t===`left`?u:t===`right`?u-d:u-d/2,s,1,0,d);if(p(f)&&!o(f)){i.push(f),$.push({kind:`text`,x:u,y:s,text:l,font:L,color:n,align:t,baseline:`middle`,hit:e,also:Q[e]});break}}continue}let f=r.ellipsize(b[e],de(l)-t-2,L,_);if(!f)continue;let p=a(u,d,Math.cos(l),Math.sin(l),_(f,L));if(o(p))continue;i.push(p);let m=Math.cos(l)>=0;$.push({kind:`text`,x:u,y:d,text:f,font:L,color:n,align:m?`left`:`right`,baseline:`middle`,rotate:m?l:l+Math.PI,hit:e,also:Q[e]})}}let Ee=[];for(let e of M){let t=k.value[e];if(!(t>0)||v.has(e))continue;let n=ne>0?t/ne:0,r=(U[e].a0+U[e].a1)/2;Ee.push({index:e,name:b[e],value:t,percent:n,share:m.percent(n),color:X[e],x:P+K*Math.cos(r),y:F+K*Math.sin(r),rows:[{name:m.labels.value,value:m.format(t)},...D?[]:[{name:m.labels.outgoing,value:m.format(k.out[e])},{name:m.labels.incoming,value:m.format(k.inc[e])}],{name:m.labels.share,value:m.percent(n)}]})}let De=(e,t)=>C?E[e][t]:te(E,e,t),Oe=0;for(let e=0;e<S;e++)for(let t=C?0:e;t<S;t++)Oe+=De(e,t);let ke=Z.filter(e=>E[e.s][e.t]>0||E[e.t][e.s]>0).sort((e,t)=>N[e.s]-N[t.s]||e.src.a0-t.src.a0||N[e.t]-N[t.t]);for(let e of ke){let t=E[e.s][e.t],n=e.s!==e.t&&E[e.s][e.t]+E[e.t][e.s]>0?x[e.t][e.s]:0,r=Oe>0?De(e.s,e.t)/Oe:0,i=b[e.s],a=b[e.t],o=(e.src.a0+e.src.a1)/2,s=(e.tgt.a0+e.tgt.a1)/2,c=e.s===e.t?P+q*.7*Math.cos(o):.25*(P+q*Math.cos(o))+.5*P+.25*(P+q*Math.cos(s)),l=e.s===e.t?F+q*.7*Math.sin(o):.25*(F+q*Math.sin(o))+.5*F+.25*(F+q*Math.sin(s));Ee.push({index:e.index,name:e.s===e.t?i:`${i} \u2192 ${a}`,value:t,percent:r,share:m.percent(r),color:X[e.s],x:c,y:l,rows:[{name:m.labels.value,value:m.format(t)},...e.s!==e.t&&(C?n>0:!D)?[{name:m.labels.reverse,value:m.format(n)}]:[],{name:m.labels.share,value:m.percent(r)}],event:{source:i,target:a,reverseValue:n}})}let Ae=r.clamp(m.enter,0,1);return{nodes:$,items:Ee,dim:.25,empty:!1,...Ae<1?{enter:{alpha:Ae,scale:.94+.06*Ae,cx:P,cy:F}}:{}}};exports.chordValues=s,exports.layoutChord=m,exports.resolveChord=i;
2
2
  //# sourceMappingURL=chord.cjs.map