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":"controller.cjs","names":["createTheme","font","buildModel","clampRange","sameRange","resolveAnnotations","legendShown","colorLegend","legendShape","tooltipContent","layoutChart","collectPointLabels","textBox","rectOf","placeLabels","connectorSegments","crosshairAt","hoverMarks","heatPosition","dotSize","sameHover","hitTest","toData","fromPlotY","zoomRange","createScales","panRange","toScreen","toPlotY","lowerBound","curvePoints","decimateMinMax","toCss","heatCellStyle","screenRect","unpackColor","require_data","require_color","require_curve","require_layout","require_model","require_overlay","require_decimate","require_scene","require_theme","require_viewport","copyView","v","TAP_SLOP","TOUCH_SLOP","DOUBLE_TAP_MS","LEGEND_ROW","createChartController","options","config","themeInput","theme","cache","hidden","listeners","model","view","zoomed","width","height","annotations","scene","sceneDirty","lastPlot","destroyed","hover","pointers","gesture","lastTap","emit","type","listener","event","invalidate","interaction","value","o","measure","text","size","weight","rebuild","base","minSpan","it","setHover","legendLayout","option","named","s","cfg","position","ramp","first","last","barWidth","right","barX","cy","l","entries","x","row","w","legendHeight","tooltipLayout","tooltip","custom","result","content","lines","swatchWidth","line","names","values","boxW","boxH","left","anchorX","top","anchorY","computeScene","legend","legendTop","layout","labels","occupied","labelHeight","a","r","pos","pointLabels","t","next","guide","horizontal","colors","rect","key","getScene","scales","changed","hitAt","sc","y","touch","inPlot","p","dataAt","cx","plot","setViewInternal","notify","zoomAt","at","factor","resetZoom","legendAt","e","toggleSeries","id","startPinch","b","paletteChanged","h","item","i","distance","midX","midY","start","from","to","current","now","hit","set","visibleRange","sorted","count","range","ORDER","toRects","along","out","k","scenePrimitives","maxDots","limits","maxBars","column","xLo","xHi","series","end","curved","bottom","n","points","bottoms","d","nextBottom","j","xv","band","segments","bottomSegments","lowerSegments","run","runBottom","runLower","flush","yv","bv","q","half","rects","merge","lastCol","ya","yb","col","pc","boxPrimitives","up","down","wicks","bodies","wickColors","bodyColors","step","c","open","color","hi","high","lo","low","hw","hh","style","inset","dots","colorOf","visible","screen","cell","cols","owner","lw","boxes","boxColors","lineColors","dotColors","vertical","across","thick","m","q1","q3","before","outliers","prims"],"sources":["../../../../charts/src/engine/controller.ts"],"sourcesContent":["// createChartController: the platform-free chart. It owns the options, the\n// theme, the model, the visible range and the interactions (pointer / touch\n// gestures fed by the host) and describes what to draw (`getScene`). Hosts\n// only draw: createCanvasChart on any 2D context, the React Native charts\n// with views.\n\nimport { toCss, unpackColor } from \"./color\";\nimport { curvePoints } from \"./curve\";\nimport { lowerBound } from \"./data\";\nimport { decimateMinMax } from \"./decimate\";\nimport {\n createScales,\n heatCellStyle,\n screenRect,\n toData,\n toScreen,\n type Rect,\n type Scales,\n} from \"./layout\";\nimport {\n buildModel,\n fromPlotY,\n heatPosition,\n toPlotY,\n type ChartModel,\n type DataCache,\n type SeriesModel,\n} from \"./model\";\nimport {\n font,\n placeLabels,\n rectOf,\n textBox,\n type PointLabel,\n type ResolvedAnnotation,\n} from \"./overlay\";\nimport {\n collectPointLabels,\n colorLegend,\n connectorSegments,\n crosshairAt,\n dotSize,\n hitTest,\n hoverMarks,\n layoutChart,\n legendShape,\n legendShown,\n resolveAnnotations,\n sameHover,\n tooltipContent,\n type ChartLayout,\n type ConnectorSegment,\n type HoverMark,\n type TooltipContent,\n} from \"./scene\";\nimport { createTheme, type ChartTheme, type ChartThemeInput } from \"./theme\";\nimport type {\n ChartEventMap,\n ChartHoverEvent,\n ChartHoverItem,\n ChartOptions,\n ChartPlotClickEvent,\n ChartRect,\n ChartView,\n} from \"./types\";\nimport {\n clampRange,\n panRange,\n sameRange,\n zoomRange,\n type Range,\n} from \"./viewport\";\n\n/** Events of a controller (no renderer events: hosts draw themselves) */\nexport type ChartControllerEventMap = Omit<ChartEventMap, \"renderer\">;\n\nexport interface ChartControllerConfig {\n options: ChartOptions;\n /** Colors and fonts (Minerva variables); light defaults when omitted */\n theme?: ChartThemeInput;\n /** Width in pixels of `text` drawn with the CSS `font` */\n measureText: (text: string, font: string) => number;\n /** Called when the scene changed and must be drawn again */\n onInvalidate?: () => void;\n}\n\nexport interface ChartLegendEntry {\n id: string;\n name: string;\n /** CSS color */\n color: string;\n shape: \"dot\" | \"line\" | \"square\";\n hidden: boolean;\n /** Hit / draw box of the entry, pixels of the chart */\n box: Rect;\n}\n\n/** Visual map of a heatmap: a gradient bar with the values at its ends */\nexport interface ChartColorLegendLayout {\n /** Box of the gradient bar, pixels of the chart */\n bar: Rect;\n /** CSS colors at even steps along the bar, from the lowest value */\n stops: string[];\n /** Value labels: `x` is the anchor, `align` the side of the text it touches */\n labels: { text: string; x: number; y: number; align: \"left\" | \"right\" }[];\n /** X pixels of the ticks on the bar (the middle of diverging ramps) */\n ticks: number[];\n /** X pixel of the hovered value on the bar (`null` when none) */\n caret: number | null;\n}\n\nexport interface ChartLegendLayout {\n /** Series entries (empty when `colors` is set) */\n entries: ChartLegendEntry[];\n /** Color legend of heatmap charts (instead of the entries) */\n colors: ChartColorLegendLayout | null;\n position: \"top\" | \"bottom\";\n /** Whether a tap toggles the series */\n toggle: boolean;\n /** Height taken by the legend */\n height: number;\n}\n\nexport interface ChartTooltipLayout {\n /** Default content (`text` is set instead when `tooltip.render` returns a string) */\n content: TooltipContent;\n /** Lines of a custom string tooltip */\n text: string[] | null;\n /** Box of the tooltip, pixels of the chart */\n box: Rect;\n /** Line height used to lay the box out */\n lineHeight: number;\n padding: number;\n /**\n * Width of the swatch column of the rows (0 when no row has a swatch):\n * the names start after it, the values are right-aligned on the box\n */\n swatchWidth: number;\n}\n\nexport interface ChartHoverLayout {\n event: ChartHoverEvent;\n marks: HoverMark[];\n /** X pixel of the vertical guide line (`null` when hidden) */\n crosshairX: number | null;\n /** Y pixel of the horizontal guide line of horizontal charts (`null` when hidden) */\n crosshairY: number | null;\n tooltip: ChartTooltipLayout | null;\n}\n\n/** Everything a host draws, in CSS pixels of the chart */\nexport interface ChartScene {\n width: number;\n height: number;\n theme: ChartTheme;\n model: ChartModel;\n view: ChartView;\n layout: ChartLayout;\n annotations: ResolvedAnnotation[];\n /** Labels of the dots that found a free slot */\n pointLabels: { label: PointLabel; box: Rect }[];\n legend: ChartLegendLayout | null;\n hover: ChartHoverLayout | null;\n /** Point being dragged (`interaction.dragPoints`) */\n dragging: { x: number; y: number; color: string; size: number } | null;\n /** Lines between consecutive bars (waterfall connectors) */\n connectors: ConnectorSegment[];\n}\n\nexport interface ChartPointerOptions {\n /** Pointer id (touch identifier); 0 by default */\n id?: number;\n /** Touch input: the tooltip follows the finger and stays after a tap */\n touch?: boolean;\n}\n\nexport interface ChartController {\n setOptions(options: ChartOptions): void;\n setTheme(theme: ChartThemeInput | undefined): void;\n /** Size of the chart in CSS pixels */\n setSize(width: number, height: number): void;\n /** What to draw (`null` until the size is known) */\n getScene(): ChartScene | null;\n pointerDown(x: number, y: number, options?: ChartPointerOptions): void;\n pointerMove(x: number, y: number, options?: ChartPointerOptions): void;\n pointerUp(x: number, y: number, options?: ChartPointerOptions): void;\n pointerCancel(options?: ChartPointerOptions): void;\n /** The mouse left the chart */\n pointerLeave(): void;\n /** Zooms around a pixel (factor < 1 zooms in) */\n zoomAt(x: number, y: number, factor: number): void;\n resetZoom(): void;\n getView(): ChartView;\n setView(view: Partial<ChartView>): void;\n /** Shows / hides a series (like a legend click) */\n toggleSeries(id: string): void;\n /** Hides the tooltip */\n clearHover(): void;\n getPlotRect(): ChartRect | null;\n toPixel(x: number, y: number): { x: number; y: number } | null;\n fromPixel(x: number, y: number): { x: number; y: number } | null;\n on<K extends keyof ChartControllerEventMap>(\n type: K,\n listener: (event: ChartControllerEventMap[K]) => void,\n ): () => void;\n destroy(): void;\n}\n\nconst copyView = (v: ChartView): ChartView => ({\n x: [v.x[0], v.x[1]],\n y: [v.y[0], v.y[1]],\n});\n\nconst TAP_SLOP = 6;\nconst TOUCH_SLOP = 10;\nconst DOUBLE_TAP_MS = 320;\nconst LEGEND_ROW = 20;\n\ninterface PointerState {\n x: number;\n y: number;\n startX: number;\n startY: number;\n touch: boolean;\n moved: boolean;\n}\n\nexport const createChartController = (\n config: ChartControllerConfig,\n): ChartController => {\n let options = config.options;\n let themeInput = config.theme;\n let theme = createTheme(themeInput, options.palette);\n const cache: DataCache = new Map();\n const hidden = new Set<string>();\n const listeners: {\n [K in keyof ChartControllerEventMap]?: Set<\n (event: ChartControllerEventMap[K]) => void\n >;\n } = {};\n let model: ChartModel;\n let view: ChartView = { x: [0, 1], y: [0, 1] };\n let zoomed = false;\n let width = 0;\n let height = 0;\n let annotations: ResolvedAnnotation[] = [];\n let scene: ChartScene | null = null;\n let sceneDirty = true;\n let lastPlot = \"\";\n let destroyed = false;\n\n let hover: { event: ChartHoverEvent; x: number; y: number } | null = null;\n const pointers = new Map<number, PointerState>();\n let gesture:\n | { kind: \"pan\"; view: ChartView; x: number; y: number }\n | {\n kind: \"pinch\";\n view: ChartView;\n distance: number;\n midX: number;\n midY: number;\n }\n | { kind: \"point\"; item: ChartHoverItem; x: number; y: number }\n | null = null;\n let lastTap = { time: 0, x: 0, y: 0 };\n\n const emit = <K extends keyof ChartControllerEventMap>(\n type: K,\n event: ChartControllerEventMap[K],\n ) => {\n listeners[type]?.forEach((listener) => listener(event));\n };\n\n const invalidate = () => {\n sceneDirty = true;\n if (!destroyed) config.onInvalidate?.();\n };\n\n const interaction = () => {\n const value = options.interaction;\n if (value === false) return null;\n const o = typeof value === \"object\" ? value : {};\n return {\n pan: o.pan ?? true,\n dragPoints: o.dragPoints ?? false,\n };\n };\n\n const measure = (text: string, size = theme.fontSize, weight = 400) =>\n config.measureText(text, font(theme, size, weight));\n\n const rebuild = () => {\n model = buildModel(options, theme, hidden, cache);\n const { base, minSpan } = model;\n if (!zoomed) {\n view = copyView(base);\n } else {\n view = {\n x: model.zoom.x ? clampRange(view.x, base.x, minSpan.x) : [...base.x],\n y: model.zoom.y ? clampRange(view.y, base.y, minSpan.y) : [...base.y],\n };\n zoomed = !sameRange(view.x, base.x) || !sameRange(view.y, base.y);\n }\n annotations = resolveAnnotations(\n options.annotations,\n theme,\n model.y.type === \"log\" ? Math.log10 : undefined,\n );\n if (hover) {\n const stillThere = hover.event.items.every(\n (it) =>\n model.series[it.seriesIndex] &&\n !model.series[it.seriesIndex].hidden &&\n it.index < model.series[it.seriesIndex].cols.count,\n );\n if (!stillThere) setHover(null);\n }\n invalidate();\n };\n\n // --------------------------------------------------------------- legend\n\n const legendLayout = (): ChartLegendLayout | null => {\n const option = options.legend;\n const named = options.series.filter((s) => s.name).length;\n if (!legendShown(option, model, named)) return null;\n const cfg = typeof option === \"object\" ? option : {};\n const position = cfg.position === \"bottom\" ? \"bottom\" : \"top\";\n const ramp = colorLegend(model);\n if (ramp) {\n // [min] [gradient] [max], on the right\n const first = ramp.labels[0]?.text ?? \"\";\n const last = ramp.labels[ramp.labels.length - 1]?.text ?? \"\";\n const barWidth = Math.max(60, Math.min(160, width * 0.32));\n const right = width - 4 - measure(last, 11) - 8;\n const barX = right - barWidth;\n const rowY = position === \"bottom\" ? height - LEGEND_ROW : 0;\n const cy = rowY + LEGEND_ROW / 2;\n return {\n entries: [],\n colors: {\n bar: { x: barX, y: cy - 4, width: barWidth, height: 8 },\n stops: ramp.stops,\n labels: [\n { text: first, x: barX - 8, y: cy, align: \"right\" },\n { text: last, x: right + 8, y: cy, align: \"left\" },\n ],\n ticks: ramp.labels\n .filter((l) => l.at > 0 && l.at < 1)\n .map((l) => barX + l.at * barWidth),\n caret: null,\n },\n position,\n toggle: false,\n height: LEGEND_ROW + 6,\n };\n }\n const entries: ChartLegendEntry[] = [];\n let x = 4;\n let row = 0;\n for (const s of model.series) {\n const w = 14 + measure(s.name, 12) + 8;\n if (x + w > width - 4 && x > 4) {\n x = 4;\n row++;\n }\n entries.push({\n id: s.id,\n name: s.name,\n color: s.colorCss,\n shape: legendShape(s.type),\n hidden: s.hidden,\n box: { x, y: row * LEGEND_ROW, width: w, height: LEGEND_ROW },\n });\n x += w + 10;\n }\n const legendHeight = (row + 1) * LEGEND_ROW + 6;\n if (position === \"bottom\") {\n for (const e of entries) e.box.y += height - legendHeight + 6;\n }\n return {\n entries,\n colors: null,\n position,\n toggle: cfg.toggle ?? true,\n height: legendHeight,\n };\n };\n\n // ---------------------------------------------------------------- scene\n\n const tooltipLayout = (\n event: ChartHoverEvent,\n anchorX: number,\n anchorY: number,\n ): ChartTooltipLayout | null => {\n const tooltip = options.tooltip;\n if (tooltip === false) return null;\n const custom = typeof tooltip === \"object\" ? tooltip.render : undefined;\n let text: string[] | null = null;\n if (custom) {\n const result = custom(event);\n if (result === null || result === \"\") return null;\n if (typeof result === \"string\") text = result.split(\"\\n\");\n }\n const content = tooltipContent(\n model,\n event,\n scene?.layout.yTicks ?? null,\n scene?.layout.y2Ticks ?? null,\n );\n const lineHeight = 18;\n const padding = 8;\n let w = 0;\n let lines: number;\n const swatchWidth = content.rows.some((row) => row.color) ? 14 : 0;\n if (text) {\n for (const line of text) w = Math.max(w, measure(line, 12));\n lines = text.length;\n } else {\n w = measure(content.title, 12, 600) + (content.titleColor ? 14 : 0);\n if (content.subtitle)\n w = Math.max(\n w,\n measure(content.subtitle, 11) + (content.titleColor ? 14 : 0),\n );\n // a label column and a value column, at least 16px apart\n let names = 0;\n let values = 0;\n for (const row of content.rows) {\n names = Math.max(names, measure(row.name, 12));\n values = Math.max(values, measure(row.value, 12, 600));\n }\n if (content.rows.length)\n w = Math.max(w, swatchWidth + names + 16 + values);\n lines = 1 + (content.subtitle ? 1 : 0) + content.rows.length;\n }\n const boxW = Math.ceil(Math.max(w, 96) + padding * 2 + 4);\n const boxH = lines * lineHeight + padding * 2;\n let left = anchorX + 14;\n if (left + boxW > width - 4) left = anchorX - 14 - boxW;\n left = Math.max(4, Math.min(left, width - boxW - 4));\n const top = Math.max(4, Math.min(anchorY - boxH / 2, height - boxH - 4));\n return {\n content,\n text,\n box: { x: left, y: top, width: boxW, height: boxH },\n lineHeight,\n padding,\n swatchWidth,\n };\n };\n\n const computeScene = (): ChartScene | null => {\n if (width <= 0 || height <= 0) return null;\n const legend = legendLayout();\n const legendTop = legend?.position === \"top\" ? legend.height : 0;\n const layout = layoutChart({\n model,\n view,\n theme,\n width,\n height: height - (legend?.height ?? 0),\n padding: options.padding,\n top: legendTop,\n measure: (text) => measure(text),\n });\n const labels = collectPointLabels(\n model,\n view,\n layout.scales,\n layout.yTicks,\n );\n const occupied: Rect[] = [];\n const labelHeight = theme.fontSize + 4;\n for (const a of annotations) {\n if (a.type === \"text\" && a.text) {\n occupied.push(\n textBox(\n a,\n layout.scales,\n measure(a.text, theme.fontSize, a.weight),\n labelHeight,\n ),\n );\n continue;\n }\n if (a.type !== \"rect\" || !a.label) continue;\n // keep the dot labels off the area titles (drawForeground does the same)\n const r = rectOf(a, layout.scales);\n if (r.width <= 0 || r.height <= 0) continue;\n const w = measure(a.label, theme.fontSize + 1, 600);\n const pos = a.labelPosition;\n occupied.push({\n x: pos.endsWith(\"left\")\n ? r.x + 10\n : pos.endsWith(\"right\")\n ? r.x + r.width - 10 - w\n : r.x + (r.width - w) / 2,\n y: pos.startsWith(\"top\")\n ? r.y + 10\n : pos.startsWith(\"bottom\")\n ? r.y + r.height - 10 - labelHeight\n : r.y + (r.height - labelHeight) / 2,\n width: w,\n height: labelHeight,\n });\n }\n const pointLabels = placeLabels(\n labels,\n layout.plot,\n (t) => measure(t),\n labelHeight - 2,\n occupied,\n );\n const next: ChartScene = {\n width,\n height,\n theme,\n model,\n view: copyView(view),\n layout,\n annotations,\n pointLabels,\n legend,\n hover: null,\n dragging: null,\n connectors: connectorSegments(model, layout.scales),\n };\n scene = next;\n if (hover) {\n const guide = crosshairAt(\n model,\n layout.scales,\n hover.event,\n options.crosshair,\n );\n const horizontal = layout.scales.horizontal;\n next.hover = {\n event: hover.event,\n marks: hoverMarks(model, layout.scales, hover.event),\n crosshairX: horizontal ? null : guide,\n crosshairY: horizontal ? guide : null,\n tooltip:\n gesture?.kind === \"pan\" || gesture?.kind === \"point\"\n ? null\n : tooltipLayout(hover.event, hover.x, hover.y),\n };\n // the hovered value on the color legend\n const colors = legend?.colors;\n const it = hover.event.items[0];\n const s = it ? model.series[it.seriesIndex] : undefined;\n if (colors && it && s?.type === \"heatmap\" && it.value !== undefined)\n colors.caret =\n colors.bar.x + heatPosition(s, it.value) * colors.bar.width;\n }\n if (gesture?.kind === \"point\") {\n const s = model.series[gesture.item.seriesIndex];\n next.dragging = {\n x: gesture.x,\n y: gesture.y,\n color: gesture.item.color,\n size: (s ? dotSize(s, gesture.item.index) : 8) + 6,\n };\n }\n const rect = layout.plot;\n const key = `${rect.x},${rect.y},${rect.width},${rect.height}`;\n if (key !== lastPlot) {\n lastPlot = key;\n emit(\"layout\", { ...rect });\n }\n return next;\n };\n\n const getScene = () => {\n if (sceneDirty || !scene) {\n sceneDirty = false;\n scene = computeScene();\n }\n return scene;\n };\n\n // ---------------------------------------------------------- interaction\n\n const scales = () => getScene()?.layout.scales ?? null;\n\n const setHover = (\n next: { event: ChartHoverEvent; x: number; y: number } | null,\n ) => {\n const changed = !sameHover(hover?.event ?? null, next?.event ?? null);\n hover = next;\n invalidate();\n if (changed) emit(\"hover\", next ? next.event : null);\n };\n\n const hitAt = (x: number, y: number, touch: boolean) => {\n const sc = scales();\n return sc\n ? hitTest(model, sc, scene?.layout.xTicks ?? null, x, y, touch ? 8 : 0)\n : null;\n };\n\n const inPlot = (x: number, y: number) => {\n const p = scales()?.plot;\n return (\n !!p && x >= p.x && x <= p.x + p.width && y >= p.y && y <= p.y + p.height\n );\n };\n\n const dataAt = (x: number, y: number) => {\n const sc = scales();\n if (!sc) return null;\n const { plot } = sc;\n const cx = Math.max(plot.x, Math.min(plot.x + plot.width, x));\n const cy = Math.max(plot.y, Math.min(plot.y + plot.height, y));\n const p = toData(sc, cx, cy);\n // values of the axes (not logarithms)\n return { x: p.x, y: fromPlotY(model, p.y) };\n };\n\n const setViewInternal = (next: ChartView, notify: boolean) => {\n const { base, minSpan } = model;\n view = {\n x: clampRange(next.x, base.x, minSpan.x),\n y: clampRange(next.y, base.y, minSpan.y),\n };\n zoomed = !sameRange(view.x, base.x) || !sameRange(view.y, base.y);\n if (notify) emit(\"zoom\", copyView(view));\n invalidate();\n };\n\n const zoomAt = (x: number, y: number, factor: number) => {\n const sc = scales();\n if (!sc || (!model.zoom.x && !model.zoom.y)) return;\n const next = copyView(view);\n const at = toData(sc, x, y);\n if (model.zoom.x) next.x = zoomRange(view.x, at.x, factor);\n if (model.zoom.y) next.y = zoomRange(view.y, at.y, factor);\n setViewInternal(next, true);\n };\n\n const resetZoom = () => {\n if (!zoomed) return;\n setViewInternal(copyView(model.base), true);\n };\n\n const legendAt = (x: number, y: number) =>\n getScene()?.legend?.entries.find(\n (e) =>\n x >= e.box.x &&\n x <= e.box.x + e.box.width &&\n y >= e.box.y &&\n y <= e.box.y + e.box.height,\n ) ?? null;\n\n const toggleSeries = (id: string) => {\n if (hidden.has(id)) hidden.delete(id);\n else hidden.add(id);\n rebuild();\n };\n\n const startPinch = () => {\n const [a, b] = [...pointers.values()];\n gesture = {\n kind: \"pinch\",\n view: copyView(view),\n distance: Math.max(1, Math.hypot(a.x - b.x, a.y - b.y)),\n midX: (a.x + b.x) / 2,\n midY: (a.y + b.y) / 2,\n };\n setHover(null);\n };\n\n const pointerDown = (x: number, y: number, o: ChartPointerOptions = {}) => {\n if (destroyed) return;\n const id = o.id ?? 0;\n const touch = !!o.touch;\n pointers.set(id, { x, y, startX: x, startY: y, touch, moved: false });\n const it = interaction();\n if (pointers.size === 2) {\n if (it && (model.zoom.x || model.zoom.y) && gesture?.kind !== \"point\")\n startPinch();\n return;\n }\n if (pointers.size > 2 || !it) {\n if (!it && touch) {\n const event = hitAt(x, y, true);\n setHover(event ? { event, x, y } : null);\n }\n return;\n }\n if (it.dragPoints) {\n const item = hitAt(x, y, touch)?.items.find(\n (i) => model.series[i.seriesIndex].type === \"scatter\",\n );\n if (item) {\n gesture = { kind: \"point\", item, x, y };\n return;\n }\n }\n if (zoomed && it.pan && inPlot(x, y)) {\n gesture = { kind: \"pan\", view: copyView(view), x, y };\n return;\n }\n gesture = null;\n if (touch) {\n const event = hitAt(x, y, true);\n setHover(event ? { event, x, y } : null);\n }\n };\n\n const pointerMove = (x: number, y: number, o: ChartPointerOptions = {}) => {\n if (destroyed) return;\n const id = o.id ?? 0;\n const p = pointers.get(id);\n if (p) {\n p.x = x;\n p.y = y;\n if (\n !p.moved &&\n Math.hypot(x - p.startX, y - p.startY) >\n (p.touch ? TOUCH_SLOP : TAP_SLOP)\n )\n p.moved = true;\n }\n if (gesture?.kind === \"pinch\" && pointers.size >= 2) {\n const [a, b] = [...pointers.values()];\n const distance = Math.max(1, Math.hypot(a.x - b.x, a.y - b.y));\n const midX = (a.x + b.x) / 2;\n const midY = (a.y + b.y) / 2;\n const sc = scales();\n if (!sc) return;\n const start = createScales(\n sc.plot,\n gesture.view,\n model.x.reverse,\n model.y.reverse,\n model.horizontal,\n );\n const factor = gesture.distance / distance;\n const next = copyView(gesture.view);\n const from = toData(start, gesture.midX, gesture.midY);\n const to = toData(start, midX, midY);\n // the data under the first midpoint follows the fingers\n if (model.zoom.x) {\n next.x = zoomRange(gesture.view.x, from.x, factor);\n next.x = panRange(next.x, (from.x - to.x) * factor);\n }\n if (model.zoom.y) {\n next.y = zoomRange(gesture.view.y, from.y, factor);\n next.y = panRange(next.y, (from.y - to.y) * factor);\n }\n setViewInternal(next, true);\n return;\n }\n if (gesture?.kind === \"point\" && p) {\n if (!p.moved) return;\n gesture.x = x;\n gesture.y = y;\n const at = dataAt(x, y);\n invalidate();\n if (at) emit(\"drag\", { item: gesture.item, x: at.x, y: at.y });\n return;\n }\n if (gesture?.kind === \"pan\" && p) {\n if (!p.moved) return;\n const sc = scales();\n if (!sc) return;\n const next = copyView(gesture.view);\n const from = toData(sc, gesture.x, gesture.y);\n const to = toData(sc, x, y);\n if (model.zoom.x) next.x = panRange(gesture.view.x, from.x - to.x);\n if (model.zoom.y) next.y = panRange(gesture.view.y, from.y - to.y);\n setViewInternal(next, true);\n return;\n }\n if (pointers.size > 1) return;\n // mouse hover, or a finger scrubbing along the data\n if (!p || p.touch || !o.touch) {\n const event = hitAt(x, y, !!p?.touch || !!o.touch);\n if (event || !p?.touch) setHover(event ? { event, x, y } : null);\n }\n };\n\n const pointerUp = (x: number, y: number, o: ChartPointerOptions = {}) => {\n if (destroyed) return;\n const id = o.id ?? 0;\n const p = pointers.get(id);\n pointers.delete(id);\n const current = gesture;\n if (current?.kind === \"pinch\") {\n if (pointers.size < 2) gesture = null;\n return;\n }\n gesture = null;\n if (!p) return;\n if (current?.kind === \"point\") {\n if (p.moved) {\n const at = dataAt(x, y);\n invalidate();\n if (at) emit(\"drop\", { item: current.item, x: at.x, y: at.y });\n return;\n }\n } else if (current?.kind === \"pan\" && p.moved) {\n invalidate();\n return;\n }\n if (p.moved) {\n if (p.touch) invalidate();\n return;\n }\n // tap / click\n const now = Date.now();\n if (\n p.touch &&\n now - lastTap.time < DOUBLE_TAP_MS &&\n Math.hypot(x - lastTap.x, y - lastTap.y) < 24 &&\n zoomed\n ) {\n lastTap = { time: 0, x, y };\n resetZoom();\n return;\n }\n lastTap = { time: now, x, y };\n const legend = legendAt(x, y);\n if (legend) {\n if (getScene()?.legend?.toggle) toggleSeries(legend.id);\n return;\n }\n const hit = hitAt(x, y, p.touch);\n if (hit) {\n if (p.touch) setHover({ event: hit, x, y });\n emit(\"click\", hit);\n return;\n }\n if (p.touch) setHover(null);\n if (inPlot(x, y)) {\n const at = dataAt(x, y);\n if (at) emit(\"plotClick\", at as ChartPlotClickEvent);\n }\n };\n\n const pointerCancel = (o: ChartPointerOptions = {}) => {\n pointers.delete(o.id ?? 0);\n if (gesture?.kind === \"point\" || pointers.size < 2) gesture = null;\n invalidate();\n };\n\n model = buildModel(options, theme, hidden, cache);\n rebuild();\n\n return {\n setOptions(next) {\n if (destroyed) return;\n const paletteChanged =\n (next.palette ?? []).join() !== (options.palette ?? []).join();\n options = next;\n if (paletteChanged) theme = createTheme(themeInput, options.palette);\n rebuild();\n },\n setTheme(next) {\n if (destroyed) return;\n themeInput = next;\n theme = createTheme(themeInput, options.palette);\n rebuild();\n },\n setSize(w, h) {\n if (w === width && h === height) return;\n width = Math.max(0, w);\n height = Math.max(0, h);\n invalidate();\n },\n getScene,\n pointerDown,\n pointerMove,\n pointerUp,\n pointerCancel,\n pointerLeave() {\n if (!gesture && hover) setHover(null);\n },\n zoomAt,\n resetZoom,\n getView: () => copyView(view),\n setView(next) {\n if (destroyed) return;\n setViewInternal({ x: next.x ?? view.x, y: next.y ?? view.y }, false);\n },\n toggleSeries,\n clearHover() {\n if (hover) setHover(null);\n },\n getPlotRect() {\n const p = getScene()?.layout.plot;\n return p ? { ...p } : null;\n },\n toPixel(x, y) {\n const sc = scales();\n return sc ? toScreen(sc, x, toPlotY(model, y)) : null;\n },\n fromPixel(x, y) {\n const sc = scales();\n if (!sc) return null;\n const p = toData(sc, x, y);\n return { x: p.x, y: fromPlotY(model, p.y) };\n },\n on(type, listener) {\n let set = listeners[type] as Set<typeof listener> | undefined;\n if (!set) {\n set = new Set();\n (listeners as Record<string, unknown>)[type] = set;\n }\n set.add(listener);\n return () => {\n set.delete(listener);\n };\n },\n destroy() {\n destroyed = true;\n pointers.clear();\n for (const key of Object.keys(listeners))\n delete (listeners as Record<string, unknown>)[key];\n },\n };\n};\n\n// ------------------------------------------------------------- primitives\n\n/** A polyline (pixels of the chart): interleaved x, y */\nexport interface ChartLinePrimitive {\n kind: \"line\";\n seriesIndex: number;\n color: string;\n width: number;\n /** Runs of points without gaps */\n segments: number[][];\n}\n\nexport interface ChartAreaPrimitive {\n kind: \"area\";\n seriesIndex: number;\n color: string;\n opacity: number;\n /** Y pixel of the baseline (x pixel when `horizontal`) */\n baseline: number;\n segments: number[][];\n /**\n * Stacked and range areas: y pixel (x pixel when `horizontal`) of the\n * bottom edge under every point of `segments`\n */\n bottoms?: number[][];\n /** Horizontal charts: the area is filled toward the left edge (`baseline` / `bottoms` are x pixels) */\n horizontal?: boolean;\n}\n\nexport interface ChartBarPrimitive {\n kind: \"bars\";\n seriesIndex: number;\n color: string;\n /** Interleaved x, y, width, height */\n rects: number[];\n /** CSS color of every rect (candlesticks, heatmap cells, colored bars); `color` otherwise */\n colors?: string[];\n /** Corner radius in pixels */\n radius?: number;\n /** Opacity of the fill (box plot boxes, translucent bars) */\n opacity?: number;\n}\n\nexport interface ChartDotPrimitive {\n kind: \"dots\";\n seriesIndex: number;\n /** Opacity of the fill (0: rings only) */\n opacity: number;\n /** Interleaved x, y, diameter */\n dots: number[];\n /** CSS color of every dot */\n colors: string[];\n /** Width of a ring of the dot color around every dot, CSS pixels */\n stroke?: number;\n}\n\nexport type ChartPrimitive =\n | ChartLinePrimitive\n | ChartAreaPrimitive\n | ChartBarPrimitive\n | ChartDotPrimitive;\n\nexport interface ChartPrimitiveOptions {\n /**\n * Upper bound of the dots drawn per series: above it the dots are merged\n * into one per occupied cell of their size\n * @default 4000\n */\n maxDots?: number;\n /**\n * Upper bound of the bars drawn per series: above it neighboring bars\n * sharing a pixel column are merged\n * @default 2000\n */\n maxBars?: number;\n /**\n * Width in pixels of the columns lines are decimated to (at most four\n * points per column); larger values mean fewer shapes\n * @default 1\n */\n columnWidth?: number;\n /** Size of the cells dots are merged into (the dot size by default) */\n dotCell?: number;\n}\n\nconst visibleRange = (\n x: Float64Array,\n count: number,\n sorted: boolean,\n range: Range,\n): [number, number] => {\n if (!sorted) return [0, count];\n const [a, b] = range[0] <= range[1] ? range : [range[1], range[0]];\n return [\n Math.max(0, lowerBound(x, count, a) - 1),\n Math.min(count, lowerBound(x, count, b) + 1),\n ];\n};\n\nconst ORDER = {\n heatmap: 0,\n area: 1,\n bar: 2,\n boxplot: 2,\n candlestick: 3,\n line: 4,\n scatter: 5,\n} as const;\n\n/**\n * Rectangles collected along the axes (`x` along the x axis, `y` along the\n * value axis) and turned into screen rects\n */\nconst toRects = (sc: Scales, along: number[]): number[] => {\n if (!sc.horizontal) return along;\n const out = new Array<number>(along.length);\n for (let k = 0; k < along.length; k += 4) {\n out[k] = along[k + 1];\n out[k + 1] = along[k];\n out[k + 2] = along[k + 3];\n out[k + 3] = along[k + 2];\n }\n return out;\n};\n\n/**\n * Data of a scene as simple shapes in pixels of the chart, for hosts\n * without a canvas (React Native views, SVG): lines are decimated to a few\n * points per pixel column and large point sets are merged per cell, so the\n * number of shapes stays bounded by the size of the chart.\n */\nexport const scenePrimitives = (\n scene: ChartScene,\n limits: ChartPrimitiveOptions = {},\n): ChartPrimitive[] => {\n const { model, view, layout } = scene;\n const sc = layout.scales;\n const { plot } = layout;\n const horizontal = sc.horizontal;\n const maxDots = limits.maxDots ?? 4000;\n const maxBars = limits.maxBars ?? 2000;\n const column = Math.max(1, limits.columnWidth ?? 1);\n // the x axis in pixels (along `xToPx`)\n const xLo = horizontal ? plot.y : plot.x;\n const xHi = xLo + (horizontal ? plot.height : plot.width);\n const out: ChartPrimitive[] = [];\n const series = model.series\n .filter((s) => !s.hidden && s.cols.count > 0)\n .sort((a, b) => ORDER[a.type] - ORDER[b.type] || a.index - b.index);\n for (const s of series) {\n const { x, y, count, sorted } = s.cols;\n if (s.type === \"line\" || s.type === \"area\") {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const top = s.stackTop ?? y;\n // curve first (in data space), then decimation; the stacked bottom\n // edge follows the same sampling\n const curved = curvePoints(x, top, start, end, s.curve);\n const bottom = s.stackBase\n ? curvePoints(x, s.stackBase, start, end, s.curve).points\n : null;\n let n = curved.length;\n let points = curved.points;\n let bottoms = bottom;\n if (sorted && n > ((xHi - xLo) * 2) / column) {\n if (bottom) {\n // keep the bottoms aligned with the kept tops (same x)\n const d = decimateMinMax(points, 0, n, (v) => sc.xToPx(v) / column);\n const next = new Float64Array(d.length * 2);\n const nextBottom = new Float64Array(d.length * 2);\n let k = 0;\n let j = 0;\n for (let i = 0; i < d.length; i++) {\n const xv = d.points[i * 2];\n while (j < n - 1 && points[j * 2] < xv) j++;\n next[k * 2] = xv;\n next[k * 2 + 1] = d.points[i * 2 + 1];\n nextBottom[k * 2] = xv;\n nextBottom[k * 2 + 1] = bottom[j * 2 + 1];\n k++;\n }\n points = next;\n bottoms = nextBottom;\n n = k;\n } else {\n const d = decimateMinMax(points, 0, n, (v) => sc.xToPx(v) / column);\n points = d.points;\n n = d.length;\n }\n }\n // range areas: a line on the lower edge too\n const band = s.type === \"area\" && !!s.cols.y0 && !!bottoms;\n const segments: number[][] = [];\n const bottomSegments: number[][] = [];\n const lowerSegments: number[][] = [];\n let run: number[] = [];\n let runBottom: number[] = [];\n let runLower: number[] = [];\n const flush = () => {\n if (run.length) {\n segments.push(run);\n bottomSegments.push(runBottom);\n if (band) lowerSegments.push(runLower);\n }\n run = [];\n runBottom = [];\n runLower = [];\n };\n for (let i = 0; i < n; i++) {\n const xv = points[i * 2];\n const yv = points[i * 2 + 1];\n const bv = bottoms ? bottoms[i * 2 + 1] : 0;\n if (\n !Number.isFinite(xv) ||\n !Number.isFinite(yv) ||\n !Number.isFinite(bv)\n ) {\n flush();\n continue;\n }\n const p = toScreen(sc, xv, yv);\n run.push(p.x, p.y);\n if (bottoms) runBottom.push(sc.yToPx(bv));\n if (band) {\n const q = toScreen(sc, xv, bv);\n runLower.push(q.x, q.y);\n }\n }\n flush();\n if (s.type === \"area\") {\n out.push({\n kind: \"area\",\n seriesIndex: s.index,\n color: s.colorCss,\n opacity: s.opacity,\n baseline: sc.yToPx(model.baseline),\n segments,\n ...(bottoms ? { bottoms: bottomSegments } : {}),\n ...(horizontal ? { horizontal: true } : {}),\n });\n }\n if (s.lineWidth > 0) {\n const width =\n s.type === \"area\" ? Math.min(s.lineWidth, 2) : s.lineWidth;\n out.push({\n kind: \"line\",\n seriesIndex: s.index,\n color: s.colorCss,\n width,\n segments,\n });\n if (band)\n out.push({\n kind: \"line\",\n seriesIndex: s.index,\n color: s.colorCss,\n width,\n segments: lowerSegments,\n });\n }\n continue;\n }\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 0.5);\n const rects: number[] = [];\n const colors: string[] = [];\n const merge = end - start > maxBars;\n let lastCol = NaN;\n for (let i = start; i < end; i++) {\n const a = s.barBase[i];\n const b = s.barTop[i];\n if (!Number.isFinite(a) || !Number.isFinite(b)) continue;\n const cx = sc.xToPx(x[i] + s.barOffset);\n if (cx + half < xLo || cx - half > xHi) continue;\n const ya = sc.yToPx(a);\n const yb = sc.yToPx(b);\n const top = Math.min(ya, yb);\n const h = Math.max(1, Math.abs(ya - yb));\n const col = Math.floor(cx);\n if (merge && col === lastCol && rects.length) {\n // widen the previous bar of the same pixel column along the values\n const k = rects.length - 4;\n const bottom = Math.max(rects[k + 1] + rects[k + 3], top + h);\n rects[k + 1] = Math.min(rects[k + 1], top);\n rects[k + 3] = bottom - rects[k + 1];\n continue;\n }\n lastCol = col;\n rects.push(cx - half, top, half * 2, h);\n const pc = s.pointColors?.[i];\n colors.push(pc ? toCss(pc) : s.colorCss);\n }\n out.push({\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects: toRects(sc, rects),\n ...(s.pointColors ? { colors } : {}),\n radius: s.radius,\n ...(s.opacity < 1 ? { opacity: s.opacity } : {}),\n });\n continue;\n }\n if (s.type === \"boxplot\") {\n out.push(...boxPrimitives(s, sc, view.x, xLo, xHi, maxBars));\n continue;\n }\n if (s.type === \"candlestick\") {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const { open, high, low } = s.cols;\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 1);\n const up = toCss(s.upColor);\n const down = toCss(s.downColor);\n const wicks: number[] = [];\n const bodies: number[] = [];\n const wickColors: string[] = [];\n const bodyColors: string[] = [];\n const step = Math.max(1, Math.ceil((end - start) / maxBars));\n for (let i = start; i < end; i += step) {\n const c = y[i];\n const o = open ? open[i] : c;\n if (!Number.isFinite(c) || !Number.isFinite(o)) continue;\n const cx = sc.xToPx(x[i]);\n if (cx + half < xLo || cx - half > xHi) continue;\n const color = c < o ? down : up;\n const hi = sc.yToPx(high ? high[i] : Math.max(o, c));\n const lo = sc.yToPx(low ? low[i] : Math.min(o, c));\n wicks.push(cx - 0.5, Math.min(hi, lo), 1, Math.abs(lo - hi));\n wickColors.push(color);\n const ya = sc.yToPx(o);\n const yb = sc.yToPx(c);\n bodies.push(\n cx - half,\n Math.min(ya, yb),\n half * 2,\n Math.max(1, Math.abs(ya - yb)),\n );\n bodyColors.push(color);\n }\n out.push(\n {\n kind: \"bars\",\n seriesIndex: s.index,\n color: up,\n rects: toRects(sc, wicks),\n colors: wickColors,\n },\n {\n kind: \"bars\",\n seriesIndex: s.index,\n color: up,\n rects: toRects(sc, bodies),\n colors: bodyColors,\n radius: 1,\n },\n );\n continue;\n }\n if (s.type === \"heatmap\") {\n const hw = Math.abs(s.cellHalf.x / sc.xPerPx);\n const hh = Math.abs(s.cellHalf.y / sc.yPerPx);\n const rects: number[] = [];\n const colors: string[] = [];\n const style = heatCellStyle(hw * 2, hh * 2, s.radius);\n const inset = style.inset;\n for (let i = 0; i < count && rects.length / 4 < maxBars * 4; i++) {\n const c = s.cellColors?.[i];\n if (!c) continue;\n const r = screenRect(\n sc,\n sc.xToPx(x[i]) - hw,\n sc.xToPx(x[i]) + hw,\n sc.yToPx(y[i]) - hh,\n sc.yToPx(y[i]) + hh,\n );\n if (\n r.x + r.width < plot.x ||\n r.x > plot.x + plot.width ||\n r.y + r.height < plot.y ||\n r.y > plot.y + plot.height\n )\n continue;\n rects.push(\n r.x + inset,\n r.y + inset,\n r.width - inset * 2,\n r.height - inset * 2,\n );\n colors.push(toCss(unpackColor(c)));\n }\n out.push({\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects,\n colors,\n radius: style.radius,\n });\n continue;\n }\n // scatter\n const dots: number[] = [];\n const colors: string[] = [];\n const colorOf = (i: number) => {\n const c = s.pointColors?.[i];\n return c ? toCss(c) : s.colorCss;\n };\n const visible: number[] = [];\n const screen: number[] = [];\n for (let i = 0; i < count; i++) {\n const xv = x[i];\n const yv = y[i];\n if (!Number.isFinite(xv) || !Number.isFinite(yv)) continue;\n const p = toScreen(sc, xv, yv);\n if (\n p.x < plot.x ||\n p.x > plot.x + plot.width ||\n p.y < plot.y ||\n p.y > plot.y + plot.height\n )\n continue;\n visible.push(i);\n screen.push(p.x, p.y);\n }\n if (visible.length > maxDots) {\n const cell = Math.max(2, limits.dotCell ?? s.pointSize * 0.8);\n const cols = Math.ceil(plot.width / cell) + 1;\n const owner = new Map<number, number>();\n visible.forEach((i, k) => {\n const cx = Math.floor((screen[k * 2] - plot.x) / cell);\n const cy = Math.floor((screen[k * 2 + 1] - plot.y) / cell);\n owner.set(cy * cols + cx, i);\n });\n for (const [key, i] of owner) {\n dots.push(\n plot.x + ((key % cols) + 0.5) * cell,\n plot.y + (Math.floor(key / cols) + 0.5) * cell,\n cell,\n );\n colors.push(colorOf(i));\n }\n } else {\n visible.forEach((i, k) => {\n dots.push(screen[k * 2], screen[k * 2 + 1], dotSize(s, i));\n colors.push(colorOf(i));\n });\n }\n out.push({\n kind: \"dots\",\n seriesIndex: s.index,\n opacity: s.opacity,\n dots,\n colors,\n });\n }\n return out;\n};\n\n/** Box plot shapes: translucent boxes, then whiskers, caps, edges and medians, then outliers */\nconst boxPrimitives = (\n s: SeriesModel,\n sc: Scales,\n range: Range,\n xLo: number,\n xHi: number,\n maxBars: number,\n): ChartPrimitive[] => {\n const { x, y, count, sorted, high, low, q1, q3, outliers } = s.cols;\n const [start, end] = visibleRange(x, count, sorted, range);\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 1);\n const lw = Math.max(1, s.lineWidth);\n const boxes: number[] = [];\n const lines: number[] = [];\n const boxColors: string[] = [];\n const lineColors: string[] = [];\n const dots: number[] = [];\n const dotColors: string[] = [];\n const step = Math.max(1, Math.ceil((end - start) / maxBars));\n /** A line along the values (a whisker or a side) */\n const vertical = (cx: number, a: number, b: number) => {\n lines.push(cx - lw / 2, Math.min(a, b), lw, Math.abs(a - b));\n };\n /** A line across the box (an edge, a cap or the median) */\n const across = (cx: number, h: number, at: number, thick = lw) => {\n lines.push(cx - h, at - thick / 2, h * 2, thick);\n };\n for (let i = start; i < end; i += step) {\n const m = y[i];\n if (!Number.isFinite(m)) continue;\n const cx = sc.xToPx(x[i] + s.barOffset);\n if (cx + half < xLo || cx - half > xHi) continue;\n const pc = s.pointColors?.[i];\n const color = pc ? toCss(pc) : s.colorCss;\n const lo = sc.yToPx(low && Number.isFinite(low[i]) ? low[i] : m);\n const hi = sc.yToPx(high && Number.isFinite(high[i]) ? high[i] : m);\n const a = sc.yToPx(q1 && Number.isFinite(q1[i]) ? q1[i] : m);\n const b = sc.yToPx(q3 && Number.isFinite(q3[i]) ? q3[i] : m);\n const before = lines.length;\n boxes.push(cx - half, Math.min(a, b), half * 2, Math.abs(a - b));\n boxColors.push(color);\n vertical(cx, lo, a);\n vertical(cx, b, hi);\n vertical(cx - half, a, b);\n vertical(cx + half, a, b);\n across(cx, half / 2, lo);\n across(cx, half / 2, hi);\n across(cx, half, a);\n across(cx, half, b);\n across(cx, half, sc.yToPx(m), Math.max(2, lw * 1.6));\n for (let k = before; k < lines.length; k += 4) lineColors.push(color);\n const out = outliers?.[i];\n if (out) {\n for (const v of out) {\n const p = sc.horizontal\n ? { x: sc.yToPx(v), y: cx }\n : { x: cx, y: sc.yToPx(v) };\n dots.push(p.x, p.y, s.outlierSize);\n dotColors.push(color);\n }\n }\n }\n const prims: ChartPrimitive[] = [\n {\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects: toRects(sc, boxes),\n colors: boxColors,\n opacity: s.opacity,\n },\n {\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects: toRects(sc, lines),\n colors: lineColors,\n },\n ];\n if (dots.length)\n prims.push({\n kind: \"dots\",\n seriesIndex: s.index,\n // rings of the series color, or filled dots\n opacity: s.outlierShape === \"hollow\" ? 0 : 0.85,\n dots,\n colors: dotColors,\n stroke: 1.25,\n });\n return prims;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"controller.cjs","names":["createTheme","font","buildModel","clampRange","sameRange","resolveAnnotations","resolveDependencies","legendShown","colorLegend","legendShape","tooltipContent","layoutChart","collectPointLabels","textBox","rectOf","placeLabels","connectorSegments","dependencyArrows","crosshairAt","hoverMarks","heatPosition","dotSize","sameHover","hitTest","toData","fromPlotX","fromPlotY","viewToValues","zoomRange","createScales","panRange","viewFromValues","toScreen","toPlotX","toPlotY","lowerBound","curvePoints","decimateMinMax","toCss","heatCellStyle","screenRect","unpackColor","require_data","require_color","require_curve","require_layout","require_model","require_overlay","require_decimate","require_scene","require_theme","require_viewport","copyView","v","TAP_SLOP","TOUCH_SLOP","DOUBLE_TAP_MS","LEGEND_ROW","createChartController","options","config","themeInput","theme","cache","hidden","listeners","model","view","zoomed","width","height","annotations","dependencies","scene","sceneDirty","lastPlot","destroyed","hover","pointers","gesture","lastTap","emit","type","listener","event","invalidate","interaction","value","o","measure","text","size","weight","rebuild","base","minSpan","it","setHover","legendLayout","option","named","s","cfg","position","ramp","first","last","barWidth","right","barX","cy","l","entries","x","row","w","legendHeight","tooltipLayout","tooltip","custom","result","content","lines","swatchWidth","line","names","values","boxW","boxH","left","anchorX","top","anchorY","computeScene","legend","legendTop","layout","labels","occupied","labelHeight","a","r","pos","pointLabels","t","next","guide","horizontal","colors","rect","key","getScene","scales","changed","hitAt","sc","y","touch","inPlot","p","dataAt","cx","plot","setViewInternal","notify","zoomAt","at","factor","resetZoom","legendAt","e","toggleSeries","id","startPinch","b","paletteChanged","h","item","i","distance","midX","midY","start","from","to","current","now","hit","set","visibleRange","sorted","count","range","ORDER","toRects","along","out","k","scenePrimitives","maxDots","limits","maxBars","column","xLo","xHi","series","end","curved","bottom","n","points","bottoms","d","nextBottom","j","xv","band","segments","bottomSegments","lowerSegments","run","runBottom","runLower","flush","yv","bv","q","half","rects","merge","lastCol","ya","yb","col","pc","boxPrimitives","up","down","wicks","bodies","wickColors","bodyColors","step","c","open","color","hi","high","lo","low","hw","hh","style","inset","dots","colorOf","visible","screen","cell","cols","owner","lw","boxes","boxColors","lineColors","dotColors","vertical","across","thick","m","q1","q3","before","outliers","prims"],"sources":["../../../../charts/src/engine/controller.ts"],"sourcesContent":["// createChartController: the platform-free chart. It owns the options, the\n// theme, the model, the visible range and the interactions (pointer / touch\n// gestures fed by the host) and describes what to draw (`getScene`). Hosts\n// only draw: createCanvasChart on any 2D context, the React Native charts\n// with views.\n\nimport { toCss, unpackColor } from \"./color\";\nimport { curvePoints } from \"./curve\";\nimport { lowerBound } from \"./data\";\nimport { decimateMinMax } from \"./decimate\";\nimport {\n createScales,\n heatCellStyle,\n screenRect,\n toData,\n toScreen,\n type Rect,\n type Scales,\n} from \"./layout\";\nimport {\n buildModel,\n fromPlotX,\n fromPlotY,\n heatPosition,\n toPlotX,\n toPlotY,\n viewFromValues,\n viewToValues,\n type ChartModel,\n type DataCache,\n type SeriesModel,\n} from \"./model\";\nimport {\n font,\n placeLabels,\n rectOf,\n textBox,\n type PointLabel,\n type ResolvedAnnotation,\n} from \"./overlay\";\nimport {\n collectPointLabels,\n colorLegend,\n connectorSegments,\n crosshairAt,\n dependencyArrows,\n dotSize,\n hitTest,\n hoverMarks,\n layoutChart,\n legendShape,\n legendShown,\n resolveAnnotations,\n resolveDependencies,\n sameHover,\n tooltipContent,\n type ChartLayout,\n type ConnectorSegment,\n type DependencyArrow,\n type ResolvedDependency,\n type HoverMark,\n type TooltipContent,\n} from \"./scene\";\nimport { createTheme, type ChartTheme, type ChartThemeInput } from \"./theme\";\nimport type {\n ChartEventMap,\n ChartHoverEvent,\n ChartHoverItem,\n ChartOptions,\n ChartPlotClickEvent,\n ChartRect,\n ChartView,\n} from \"./types\";\nimport {\n clampRange,\n panRange,\n sameRange,\n zoomRange,\n type Range,\n} from \"./viewport\";\n\n/** Events of a controller (no renderer events: hosts draw themselves) */\nexport type ChartControllerEventMap = Omit<ChartEventMap, \"renderer\">;\n\nexport interface ChartControllerConfig {\n options: ChartOptions;\n /** Colors and fonts (Minerva variables); light defaults when omitted */\n theme?: ChartThemeInput;\n /** Width in pixels of `text` drawn with the CSS `font` */\n measureText: (text: string, font: string) => number;\n /** Called when the scene changed and must be drawn again */\n onInvalidate?: () => void;\n}\n\nexport interface ChartLegendEntry {\n id: string;\n name: string;\n /** CSS color */\n color: string;\n shape: \"dot\" | \"line\" | \"square\";\n hidden: boolean;\n /** Hit / draw box of the entry, pixels of the chart */\n box: Rect;\n}\n\n/** Visual map of a heatmap: a gradient bar with the values at its ends */\nexport interface ChartColorLegendLayout {\n /** Box of the gradient bar, pixels of the chart */\n bar: Rect;\n /** CSS colors at even steps along the bar, from the lowest value */\n stops: string[];\n /** Value labels: `x` is the anchor, `align` the side of the text it touches */\n labels: { text: string; x: number; y: number; align: \"left\" | \"right\" }[];\n /** X pixels of the ticks on the bar (the middle of diverging ramps) */\n ticks: number[];\n /** X pixel of the hovered value on the bar (`null` when none) */\n caret: number | null;\n}\n\nexport interface ChartLegendLayout {\n /** Series entries (empty when `colors` is set) */\n entries: ChartLegendEntry[];\n /** Color legend of heatmap charts (instead of the entries) */\n colors: ChartColorLegendLayout | null;\n position: \"top\" | \"bottom\";\n /** Whether a tap toggles the series */\n toggle: boolean;\n /** Height taken by the legend */\n height: number;\n}\n\nexport interface ChartTooltipLayout {\n /** Default content (`text` is set instead when `tooltip.render` returns a string) */\n content: TooltipContent;\n /** Lines of a custom string tooltip */\n text: string[] | null;\n /** Box of the tooltip, pixels of the chart */\n box: Rect;\n /** Line height used to lay the box out */\n lineHeight: number;\n padding: number;\n /**\n * Width of the swatch column of the rows (0 when no row has a swatch):\n * the names start after it, the values are right-aligned on the box\n */\n swatchWidth: number;\n}\n\nexport interface ChartHoverLayout {\n event: ChartHoverEvent;\n marks: HoverMark[];\n /** X pixel of the vertical guide line (`null` when hidden) */\n crosshairX: number | null;\n /** Y pixel of the horizontal guide line of horizontal charts (`null` when hidden) */\n crosshairY: number | null;\n tooltip: ChartTooltipLayout | null;\n}\n\n/** Everything a host draws, in CSS pixels of the chart */\nexport interface ChartScene {\n width: number;\n height: number;\n theme: ChartTheme;\n model: ChartModel;\n view: ChartView;\n layout: ChartLayout;\n annotations: ResolvedAnnotation[];\n /** Labels of the dots that found a free slot */\n pointLabels: { label: PointLabel; box: Rect }[];\n legend: ChartLegendLayout | null;\n hover: ChartHoverLayout | null;\n /** Point being dragged (`interaction.dragPoints`) */\n dragging: { x: number; y: number; color: string; size: number } | null;\n /** Lines between consecutive bars (waterfall connectors) */\n connectors: ConnectorSegment[];\n /** Elbow arrows between bars (`dependencies`, Gantt charts) */\n arrows: DependencyArrow[];\n}\n\nexport interface ChartPointerOptions {\n /** Pointer id (touch identifier); 0 by default */\n id?: number;\n /** Touch input: the tooltip follows the finger and stays after a tap */\n touch?: boolean;\n}\n\nexport interface ChartController {\n setOptions(options: ChartOptions): void;\n setTheme(theme: ChartThemeInput | undefined): void;\n /** Size of the chart in CSS pixels */\n setSize(width: number, height: number): void;\n /** What to draw (`null` until the size is known) */\n getScene(): ChartScene | null;\n pointerDown(x: number, y: number, options?: ChartPointerOptions): void;\n pointerMove(x: number, y: number, options?: ChartPointerOptions): void;\n pointerUp(x: number, y: number, options?: ChartPointerOptions): void;\n pointerCancel(options?: ChartPointerOptions): void;\n /** The mouse left the chart */\n pointerLeave(): void;\n /** Zooms around a pixel (factor < 1 zooms in) */\n zoomAt(x: number, y: number, factor: number): void;\n resetZoom(): void;\n getView(): ChartView;\n setView(view: Partial<ChartView>): void;\n /** Shows / hides a series (like a legend click) */\n toggleSeries(id: string): void;\n /** Hides the tooltip */\n clearHover(): void;\n getPlotRect(): ChartRect | null;\n toPixel(x: number, y: number): { x: number; y: number } | null;\n fromPixel(x: number, y: number): { x: number; y: number } | null;\n on<K extends keyof ChartControllerEventMap>(\n type: K,\n listener: (event: ChartControllerEventMap[K]) => void,\n ): () => void;\n destroy(): void;\n}\n\nconst copyView = (v: ChartView): ChartView => ({\n x: [v.x[0], v.x[1]],\n y: [v.y[0], v.y[1]],\n});\n\nconst TAP_SLOP = 6;\nconst TOUCH_SLOP = 10;\nconst DOUBLE_TAP_MS = 320;\nconst LEGEND_ROW = 20;\n\ninterface PointerState {\n x: number;\n y: number;\n startX: number;\n startY: number;\n touch: boolean;\n moved: boolean;\n}\n\nexport const createChartController = (\n config: ChartControllerConfig,\n): ChartController => {\n let options = config.options;\n let themeInput = config.theme;\n let theme = createTheme(themeInput, options.palette);\n const cache: DataCache = new Map();\n const hidden = new Set<string>();\n const listeners: {\n [K in keyof ChartControllerEventMap]?: Set<\n (event: ChartControllerEventMap[K]) => void\n >;\n } = {};\n let model: ChartModel;\n let view: ChartView = { x: [0, 1], y: [0, 1] };\n let zoomed = false;\n let width = 0;\n let height = 0;\n let annotations: ResolvedAnnotation[] = [];\n let dependencies: ResolvedDependency[] = [];\n let scene: ChartScene | null = null;\n let sceneDirty = true;\n let lastPlot = \"\";\n let destroyed = false;\n\n let hover: { event: ChartHoverEvent; x: number; y: number } | null = null;\n const pointers = new Map<number, PointerState>();\n let gesture:\n | { kind: \"pan\"; view: ChartView; x: number; y: number }\n | {\n kind: \"pinch\";\n view: ChartView;\n distance: number;\n midX: number;\n midY: number;\n }\n | { kind: \"point\"; item: ChartHoverItem; x: number; y: number }\n | null = null;\n let lastTap = { time: 0, x: 0, y: 0 };\n\n const emit = <K extends keyof ChartControllerEventMap>(\n type: K,\n event: ChartControllerEventMap[K],\n ) => {\n listeners[type]?.forEach((listener) => listener(event));\n };\n\n const invalidate = () => {\n sceneDirty = true;\n if (!destroyed) config.onInvalidate?.();\n };\n\n const interaction = () => {\n const value = options.interaction;\n if (value === false) return null;\n const o = typeof value === \"object\" ? value : {};\n return {\n pan: o.pan ?? true,\n dragPoints: o.dragPoints ?? false,\n };\n };\n\n const measure = (text: string, size = theme.fontSize, weight = 400) =>\n config.measureText(text, font(theme, size, weight));\n\n const rebuild = () => {\n model = buildModel(options, theme, hidden, cache);\n const { base, minSpan } = model;\n if (!zoomed) {\n view = copyView(base);\n } else {\n view = {\n x: model.zoom.x ? clampRange(view.x, base.x, minSpan.x) : [...base.x],\n y: model.zoom.y ? clampRange(view.y, base.y, minSpan.y) : [...base.y],\n };\n zoomed = !sameRange(view.x, base.x) || !sameRange(view.y, base.y);\n }\n annotations = resolveAnnotations(\n options.annotations,\n theme,\n model.y.type === \"log\" ? Math.log10 : undefined,\n model.x.type === \"log\" ? Math.log10 : undefined,\n );\n dependencies = resolveDependencies(options.dependencies, theme);\n if (hover) {\n const stillThere = hover.event.items.every(\n (it) =>\n model.series[it.seriesIndex] &&\n !model.series[it.seriesIndex].hidden &&\n it.index < model.series[it.seriesIndex].cols.count,\n );\n if (!stillThere) setHover(null);\n }\n invalidate();\n };\n\n // --------------------------------------------------------------- legend\n\n const legendLayout = (): ChartLegendLayout | null => {\n const option = options.legend;\n const named = options.series.filter((s) => s.name).length;\n if (!legendShown(option, model, named)) return null;\n const cfg = typeof option === \"object\" ? option : {};\n const position = cfg.position === \"bottom\" ? \"bottom\" : \"top\";\n const ramp = colorLegend(model);\n if (ramp) {\n // [min] [gradient] [max], on the right\n const first = ramp.labels[0]?.text ?? \"\";\n const last = ramp.labels[ramp.labels.length - 1]?.text ?? \"\";\n const barWidth = Math.max(60, Math.min(160, width * 0.32));\n const right = width - 4 - measure(last, 11) - 8;\n const barX = right - barWidth;\n const rowY = position === \"bottom\" ? height - LEGEND_ROW : 0;\n const cy = rowY + LEGEND_ROW / 2;\n return {\n entries: [],\n colors: {\n bar: { x: barX, y: cy - 4, width: barWidth, height: 8 },\n stops: ramp.stops,\n labels: [\n { text: first, x: barX - 8, y: cy, align: \"right\" },\n { text: last, x: right + 8, y: cy, align: \"left\" },\n ],\n ticks: ramp.labels\n .filter((l) => l.at > 0 && l.at < 1)\n .map((l) => barX + l.at * barWidth),\n caret: null,\n },\n position,\n toggle: false,\n height: LEGEND_ROW + 6,\n };\n }\n const entries: ChartLegendEntry[] = [];\n let x = 4;\n let row = 0;\n for (const s of model.series) {\n const w = 14 + measure(s.name, 12) + 8;\n if (x + w > width - 4 && x > 4) {\n x = 4;\n row++;\n }\n entries.push({\n id: s.id,\n name: s.name,\n color: s.colorCss,\n shape: legendShape(s.type),\n hidden: s.hidden,\n box: { x, y: row * LEGEND_ROW, width: w, height: LEGEND_ROW },\n });\n x += w + 10;\n }\n const legendHeight = (row + 1) * LEGEND_ROW + 6;\n if (position === \"bottom\") {\n for (const e of entries) e.box.y += height - legendHeight + 6;\n }\n return {\n entries,\n colors: null,\n position,\n toggle: cfg.toggle ?? true,\n height: legendHeight,\n };\n };\n\n // ---------------------------------------------------------------- scene\n\n const tooltipLayout = (\n event: ChartHoverEvent,\n anchorX: number,\n anchorY: number,\n ): ChartTooltipLayout | null => {\n const tooltip = options.tooltip;\n if (tooltip === false) return null;\n const custom = typeof tooltip === \"object\" ? tooltip.render : undefined;\n let text: string[] | null = null;\n if (custom) {\n const result = custom(event);\n if (result === null || result === \"\") return null;\n if (typeof result === \"string\") text = result.split(\"\\n\");\n }\n const content = tooltipContent(\n model,\n event,\n scene?.layout.yTicks ?? null,\n scene?.layout.y2Ticks ?? null,\n );\n const lineHeight = 18;\n const padding = 8;\n let w = 0;\n let lines: number;\n const swatchWidth = content.rows.some((row) => row.color) ? 14 : 0;\n if (text) {\n for (const line of text) w = Math.max(w, measure(line, 12));\n lines = text.length;\n } else {\n w = measure(content.title, 12, 600) + (content.titleColor ? 14 : 0);\n if (content.subtitle)\n w = Math.max(\n w,\n measure(content.subtitle, 11) + (content.titleColor ? 14 : 0),\n );\n // a label column and a value column, at least 16px apart\n let names = 0;\n let values = 0;\n for (const row of content.rows) {\n names = Math.max(names, measure(row.name, 12));\n values = Math.max(values, measure(row.value, 12, 600));\n }\n if (content.rows.length)\n w = Math.max(w, swatchWidth + names + 16 + values);\n lines = 1 + (content.subtitle ? 1 : 0) + content.rows.length;\n }\n const boxW = Math.ceil(Math.max(w, 96) + padding * 2 + 4);\n const boxH = lines * lineHeight + padding * 2;\n let left = anchorX + 14;\n if (left + boxW > width - 4) left = anchorX - 14 - boxW;\n left = Math.max(4, Math.min(left, width - boxW - 4));\n const top = Math.max(4, Math.min(anchorY - boxH / 2, height - boxH - 4));\n return {\n content,\n text,\n box: { x: left, y: top, width: boxW, height: boxH },\n lineHeight,\n padding,\n swatchWidth,\n };\n };\n\n const computeScene = (): ChartScene | null => {\n if (width <= 0 || height <= 0) return null;\n const legend = legendLayout();\n const legendTop = legend?.position === \"top\" ? legend.height : 0;\n const layout = layoutChart({\n model,\n view,\n theme,\n width,\n height: height - (legend?.height ?? 0),\n padding: options.padding,\n top: legendTop,\n measure: (text) => measure(text),\n });\n const labels = collectPointLabels(\n model,\n view,\n layout.scales,\n layout.yTicks,\n );\n const occupied: Rect[] = [];\n const labelHeight = theme.fontSize + 4;\n for (const a of annotations) {\n if (a.type === \"text\" && a.text) {\n occupied.push(\n textBox(\n a,\n layout.scales,\n measure(a.text, theme.fontSize, a.weight),\n labelHeight,\n ),\n );\n continue;\n }\n if (a.type !== \"rect\" || !a.label) continue;\n // keep the dot labels off the area titles (drawForeground does the same)\n const r = rectOf(a, layout.scales);\n if (r.width <= 0 || r.height <= 0) continue;\n const w = measure(a.label, theme.fontSize + 1, 600);\n const pos = a.labelPosition;\n occupied.push({\n x: pos.endsWith(\"left\")\n ? r.x + 10\n : pos.endsWith(\"right\")\n ? r.x + r.width - 10 - w\n : r.x + (r.width - w) / 2,\n y: pos.startsWith(\"top\")\n ? r.y + 10\n : pos.startsWith(\"bottom\")\n ? r.y + r.height - 10 - labelHeight\n : r.y + (r.height - labelHeight) / 2,\n width: w,\n height: labelHeight,\n });\n }\n const pointLabels = placeLabels(\n labels,\n layout.plot,\n (t) => measure(t),\n labelHeight - 2,\n occupied,\n );\n const next: ChartScene = {\n width,\n height,\n theme,\n model,\n view: copyView(view),\n layout,\n annotations,\n pointLabels,\n legend,\n hover: null,\n dragging: null,\n connectors: connectorSegments(model, layout.scales),\n arrows: dependencyArrows(model, layout.scales, dependencies),\n };\n scene = next;\n if (hover) {\n const guide = crosshairAt(\n model,\n layout.scales,\n hover.event,\n options.crosshair,\n );\n const horizontal = layout.scales.horizontal;\n next.hover = {\n event: hover.event,\n marks: hoverMarks(model, layout.scales, hover.event),\n crosshairX: horizontal ? null : guide,\n crosshairY: horizontal ? guide : null,\n tooltip:\n gesture?.kind === \"pan\" || gesture?.kind === \"point\"\n ? null\n : tooltipLayout(hover.event, hover.x, hover.y),\n };\n // the hovered value on the color legend\n const colors = legend?.colors;\n const it = hover.event.items[0];\n const s = it ? model.series[it.seriesIndex] : undefined;\n if (colors && it && s?.type === \"heatmap\" && it.value !== undefined)\n colors.caret =\n colors.bar.x + heatPosition(s, it.value) * colors.bar.width;\n }\n if (gesture?.kind === \"point\") {\n const s = model.series[gesture.item.seriesIndex];\n next.dragging = {\n x: gesture.x,\n y: gesture.y,\n color: gesture.item.color,\n size: (s ? dotSize(s, gesture.item.index) : 8) + 6,\n };\n }\n const rect = layout.plot;\n const key = `${rect.x},${rect.y},${rect.width},${rect.height}`;\n if (key !== lastPlot) {\n lastPlot = key;\n emit(\"layout\", { ...rect });\n }\n return next;\n };\n\n const getScene = () => {\n if (sceneDirty || !scene) {\n sceneDirty = false;\n scene = computeScene();\n }\n return scene;\n };\n\n // ---------------------------------------------------------- interaction\n\n const scales = () => getScene()?.layout.scales ?? null;\n\n const setHover = (\n next: { event: ChartHoverEvent; x: number; y: number } | null,\n ) => {\n const changed = !sameHover(hover?.event ?? null, next?.event ?? null);\n hover = next;\n invalidate();\n if (changed) emit(\"hover\", next ? next.event : null);\n };\n\n const hitAt = (x: number, y: number, touch: boolean) => {\n const sc = scales();\n return sc\n ? hitTest(model, sc, scene?.layout.xTicks ?? null, x, y, touch ? 8 : 0)\n : null;\n };\n\n const inPlot = (x: number, y: number) => {\n const p = scales()?.plot;\n return (\n !!p && x >= p.x && x <= p.x + p.width && y >= p.y && y <= p.y + p.height\n );\n };\n\n const dataAt = (x: number, y: number) => {\n const sc = scales();\n if (!sc) return null;\n const { plot } = sc;\n const cx = Math.max(plot.x, Math.min(plot.x + plot.width, x));\n const cy = Math.max(plot.y, Math.min(plot.y + plot.height, y));\n const p = toData(sc, cx, cy);\n // values of the axes (not logarithms)\n return { x: fromPlotX(model, p.x), y: fromPlotY(model, p.y) };\n };\n\n const setViewInternal = (next: ChartView, notify: boolean) => {\n const { base, minSpan } = model;\n view = {\n x: clampRange(next.x, base.x, minSpan.x),\n y: clampRange(next.y, base.y, minSpan.y),\n };\n zoomed = !sameRange(view.x, base.x) || !sameRange(view.y, base.y);\n if (notify) emit(\"zoom\", viewToValues(model, view));\n invalidate();\n };\n\n const zoomAt = (x: number, y: number, factor: number) => {\n const sc = scales();\n if (!sc || (!model.zoom.x && !model.zoom.y)) return;\n const next = copyView(view);\n const at = toData(sc, x, y);\n if (model.zoom.x) next.x = zoomRange(view.x, at.x, factor);\n if (model.zoom.y) next.y = zoomRange(view.y, at.y, factor);\n setViewInternal(next, true);\n };\n\n const resetZoom = () => {\n if (!zoomed) return;\n setViewInternal(copyView(model.base), true);\n };\n\n const legendAt = (x: number, y: number) =>\n getScene()?.legend?.entries.find(\n (e) =>\n x >= e.box.x &&\n x <= e.box.x + e.box.width &&\n y >= e.box.y &&\n y <= e.box.y + e.box.height,\n ) ?? null;\n\n const toggleSeries = (id: string) => {\n if (hidden.has(id)) hidden.delete(id);\n else hidden.add(id);\n rebuild();\n };\n\n const startPinch = () => {\n const [a, b] = [...pointers.values()];\n gesture = {\n kind: \"pinch\",\n view: copyView(view),\n distance: Math.max(1, Math.hypot(a.x - b.x, a.y - b.y)),\n midX: (a.x + b.x) / 2,\n midY: (a.y + b.y) / 2,\n };\n setHover(null);\n };\n\n const pointerDown = (x: number, y: number, o: ChartPointerOptions = {}) => {\n if (destroyed) return;\n const id = o.id ?? 0;\n const touch = !!o.touch;\n pointers.set(id, { x, y, startX: x, startY: y, touch, moved: false });\n const it = interaction();\n if (pointers.size === 2) {\n if (it && (model.zoom.x || model.zoom.y) && gesture?.kind !== \"point\")\n startPinch();\n return;\n }\n if (pointers.size > 2 || !it) {\n if (!it && touch) {\n const event = hitAt(x, y, true);\n setHover(event ? { event, x, y } : null);\n }\n return;\n }\n if (it.dragPoints) {\n const item = hitAt(x, y, touch)?.items.find(\n (i) => model.series[i.seriesIndex].type === \"scatter\",\n );\n if (item) {\n gesture = { kind: \"point\", item, x, y };\n return;\n }\n }\n if (zoomed && it.pan && inPlot(x, y)) {\n gesture = { kind: \"pan\", view: copyView(view), x, y };\n return;\n }\n gesture = null;\n if (touch) {\n const event = hitAt(x, y, true);\n setHover(event ? { event, x, y } : null);\n }\n };\n\n const pointerMove = (x: number, y: number, o: ChartPointerOptions = {}) => {\n if (destroyed) return;\n const id = o.id ?? 0;\n const p = pointers.get(id);\n if (p) {\n p.x = x;\n p.y = y;\n if (\n !p.moved &&\n Math.hypot(x - p.startX, y - p.startY) >\n (p.touch ? TOUCH_SLOP : TAP_SLOP)\n )\n p.moved = true;\n }\n if (gesture?.kind === \"pinch\" && pointers.size >= 2) {\n const [a, b] = [...pointers.values()];\n const distance = Math.max(1, Math.hypot(a.x - b.x, a.y - b.y));\n const midX = (a.x + b.x) / 2;\n const midY = (a.y + b.y) / 2;\n const sc = scales();\n if (!sc) return;\n const start = createScales(\n sc.plot,\n gesture.view,\n model.x.reverse,\n model.y.reverse,\n model.horizontal,\n );\n const factor = gesture.distance / distance;\n const next = copyView(gesture.view);\n const from = toData(start, gesture.midX, gesture.midY);\n const to = toData(start, midX, midY);\n // the data under the first midpoint follows the fingers\n if (model.zoom.x) {\n next.x = zoomRange(gesture.view.x, from.x, factor);\n next.x = panRange(next.x, (from.x - to.x) * factor);\n }\n if (model.zoom.y) {\n next.y = zoomRange(gesture.view.y, from.y, factor);\n next.y = panRange(next.y, (from.y - to.y) * factor);\n }\n setViewInternal(next, true);\n return;\n }\n if (gesture?.kind === \"point\" && p) {\n if (!p.moved) return;\n gesture.x = x;\n gesture.y = y;\n const at = dataAt(x, y);\n invalidate();\n if (at) emit(\"drag\", { item: gesture.item, x: at.x, y: at.y });\n return;\n }\n if (gesture?.kind === \"pan\" && p) {\n if (!p.moved) return;\n const sc = scales();\n if (!sc) return;\n const next = copyView(gesture.view);\n const from = toData(sc, gesture.x, gesture.y);\n const to = toData(sc, x, y);\n if (model.zoom.x) next.x = panRange(gesture.view.x, from.x - to.x);\n if (model.zoom.y) next.y = panRange(gesture.view.y, from.y - to.y);\n setViewInternal(next, true);\n return;\n }\n if (pointers.size > 1) return;\n // mouse hover, or a finger scrubbing along the data\n if (!p || p.touch || !o.touch) {\n const event = hitAt(x, y, !!p?.touch || !!o.touch);\n if (event || !p?.touch) setHover(event ? { event, x, y } : null);\n }\n };\n\n const pointerUp = (x: number, y: number, o: ChartPointerOptions = {}) => {\n if (destroyed) return;\n const id = o.id ?? 0;\n const p = pointers.get(id);\n pointers.delete(id);\n const current = gesture;\n if (current?.kind === \"pinch\") {\n if (pointers.size < 2) gesture = null;\n return;\n }\n gesture = null;\n if (!p) return;\n if (current?.kind === \"point\") {\n if (p.moved) {\n const at = dataAt(x, y);\n invalidate();\n if (at) emit(\"drop\", { item: current.item, x: at.x, y: at.y });\n return;\n }\n } else if (current?.kind === \"pan\" && p.moved) {\n invalidate();\n return;\n }\n if (p.moved) {\n if (p.touch) invalidate();\n return;\n }\n // tap / click\n const now = Date.now();\n if (\n p.touch &&\n now - lastTap.time < DOUBLE_TAP_MS &&\n Math.hypot(x - lastTap.x, y - lastTap.y) < 24 &&\n zoomed\n ) {\n lastTap = { time: 0, x, y };\n resetZoom();\n return;\n }\n lastTap = { time: now, x, y };\n const legend = legendAt(x, y);\n if (legend) {\n if (getScene()?.legend?.toggle) toggleSeries(legend.id);\n return;\n }\n const hit = hitAt(x, y, p.touch);\n if (hit) {\n if (p.touch) setHover({ event: hit, x, y });\n emit(\"click\", hit);\n return;\n }\n if (p.touch) setHover(null);\n if (inPlot(x, y)) {\n const at = dataAt(x, y);\n if (at) emit(\"plotClick\", at as ChartPlotClickEvent);\n }\n };\n\n const pointerCancel = (o: ChartPointerOptions = {}) => {\n pointers.delete(o.id ?? 0);\n if (gesture?.kind === \"point\" || pointers.size < 2) gesture = null;\n invalidate();\n };\n\n model = buildModel(options, theme, hidden, cache);\n rebuild();\n\n return {\n setOptions(next) {\n if (destroyed) return;\n const paletteChanged =\n (next.palette ?? []).join() !== (options.palette ?? []).join();\n options = next;\n if (paletteChanged) theme = createTheme(themeInput, options.palette);\n rebuild();\n },\n setTheme(next) {\n if (destroyed) return;\n themeInput = next;\n theme = createTheme(themeInput, options.palette);\n rebuild();\n },\n setSize(w, h) {\n if (w === width && h === height) return;\n width = Math.max(0, w);\n height = Math.max(0, h);\n invalidate();\n },\n getScene,\n pointerDown,\n pointerMove,\n pointerUp,\n pointerCancel,\n pointerLeave() {\n if (!gesture && hover) setHover(null);\n },\n zoomAt,\n resetZoom,\n getView: () => viewToValues(model, view),\n setView(next) {\n if (destroyed) return;\n setViewInternal(viewFromValues(model, next, view), false);\n },\n toggleSeries,\n clearHover() {\n if (hover) setHover(null);\n },\n getPlotRect() {\n const p = getScene()?.layout.plot;\n return p ? { ...p } : null;\n },\n toPixel(x, y) {\n const sc = scales();\n return sc ? toScreen(sc, toPlotX(model, x), toPlotY(model, y)) : null;\n },\n fromPixel(x, y) {\n const sc = scales();\n if (!sc) return null;\n const p = toData(sc, x, y);\n return { x: fromPlotX(model, p.x), y: fromPlotY(model, p.y) };\n },\n on(type, listener) {\n let set = listeners[type] as Set<typeof listener> | undefined;\n if (!set) {\n set = new Set();\n (listeners as Record<string, unknown>)[type] = set;\n }\n set.add(listener);\n return () => {\n set.delete(listener);\n };\n },\n destroy() {\n destroyed = true;\n pointers.clear();\n for (const key of Object.keys(listeners))\n delete (listeners as Record<string, unknown>)[key];\n },\n };\n};\n\n// ------------------------------------------------------------- primitives\n\n/** A polyline (pixels of the chart): interleaved x, y */\nexport interface ChartLinePrimitive {\n kind: \"line\";\n seriesIndex: number;\n color: string;\n width: number;\n /** Runs of points without gaps */\n segments: number[][];\n}\n\nexport interface ChartAreaPrimitive {\n kind: \"area\";\n seriesIndex: number;\n color: string;\n opacity: number;\n /** Y pixel of the baseline (x pixel when `horizontal`) */\n baseline: number;\n segments: number[][];\n /**\n * Stacked and range areas: y pixel (x pixel when `horizontal`) of the\n * bottom edge under every point of `segments`\n */\n bottoms?: number[][];\n /** Horizontal charts: the area is filled toward the left edge (`baseline` / `bottoms` are x pixels) */\n horizontal?: boolean;\n}\n\nexport interface ChartBarPrimitive {\n kind: \"bars\";\n seriesIndex: number;\n color: string;\n /** Interleaved x, y, width, height */\n rects: number[];\n /** CSS color of every rect (candlesticks, heatmap cells, colored bars); `color` otherwise */\n colors?: string[];\n /** Corner radius in pixels */\n radius?: number;\n /** Opacity of the fill (box plot boxes, translucent bars) */\n opacity?: number;\n}\n\nexport interface ChartDotPrimitive {\n kind: \"dots\";\n seriesIndex: number;\n /** Opacity of the fill (0: rings only) */\n opacity: number;\n /** Interleaved x, y, diameter */\n dots: number[];\n /** CSS color of every dot */\n colors: string[];\n /** Width of a ring of the dot color around every dot, CSS pixels */\n stroke?: number;\n}\n\nexport type ChartPrimitive =\n | ChartLinePrimitive\n | ChartAreaPrimitive\n | ChartBarPrimitive\n | ChartDotPrimitive;\n\nexport interface ChartPrimitiveOptions {\n /**\n * Upper bound of the dots drawn per series: above it the dots are merged\n * into one per occupied cell of their size\n * @default 4000\n */\n maxDots?: number;\n /**\n * Upper bound of the bars drawn per series: above it neighboring bars\n * sharing a pixel column are merged\n * @default 2000\n */\n maxBars?: number;\n /**\n * Width in pixels of the columns lines are decimated to (at most four\n * points per column); larger values mean fewer shapes\n * @default 1\n */\n columnWidth?: number;\n /** Size of the cells dots are merged into (the dot size by default) */\n dotCell?: number;\n}\n\nconst visibleRange = (\n x: Float64Array,\n count: number,\n sorted: boolean,\n range: Range,\n): [number, number] => {\n if (!sorted) return [0, count];\n const [a, b] = range[0] <= range[1] ? range : [range[1], range[0]];\n return [\n Math.max(0, lowerBound(x, count, a) - 1),\n Math.min(count, lowerBound(x, count, b) + 1),\n ];\n};\n\nconst ORDER = {\n heatmap: 0,\n area: 1,\n bar: 2,\n boxplot: 2,\n candlestick: 3,\n line: 4,\n scatter: 5,\n} as const;\n\n/**\n * Rectangles collected along the axes (`x` along the x axis, `y` along the\n * value axis) and turned into screen rects\n */\nconst toRects = (sc: Scales, along: number[]): number[] => {\n if (!sc.horizontal) return along;\n const out = new Array<number>(along.length);\n for (let k = 0; k < along.length; k += 4) {\n out[k] = along[k + 1];\n out[k + 1] = along[k];\n out[k + 2] = along[k + 3];\n out[k + 3] = along[k + 2];\n }\n return out;\n};\n\n/**\n * Data of a scene as simple shapes in pixels of the chart, for hosts\n * without a canvas (React Native views, SVG): lines are decimated to a few\n * points per pixel column and large point sets are merged per cell, so the\n * number of shapes stays bounded by the size of the chart.\n */\nexport const scenePrimitives = (\n scene: ChartScene,\n limits: ChartPrimitiveOptions = {},\n): ChartPrimitive[] => {\n const { model, view, layout } = scene;\n const sc = layout.scales;\n const { plot } = layout;\n const horizontal = sc.horizontal;\n const maxDots = limits.maxDots ?? 4000;\n const maxBars = limits.maxBars ?? 2000;\n const column = Math.max(1, limits.columnWidth ?? 1);\n // the x axis in pixels (along `xToPx`)\n const xLo = horizontal ? plot.y : plot.x;\n const xHi = xLo + (horizontal ? plot.height : plot.width);\n const out: ChartPrimitive[] = [];\n const series = model.series\n .filter((s) => !s.hidden && s.cols.count > 0)\n .sort((a, b) => ORDER[a.type] - ORDER[b.type] || a.index - b.index);\n for (const s of series) {\n const { x, y, count, sorted } = s.cols;\n if (s.type === \"line\" || s.type === \"area\") {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const top = s.stackTop ?? y;\n // curve first (in data space), then decimation; the stacked bottom\n // edge follows the same sampling\n const curved = curvePoints(x, top, start, end, s.curve);\n const bottom = s.stackBase\n ? curvePoints(x, s.stackBase, start, end, s.curve).points\n : null;\n let n = curved.length;\n let points = curved.points;\n let bottoms = bottom;\n if (sorted && n > ((xHi - xLo) * 2) / column) {\n if (bottom) {\n // keep the bottoms aligned with the kept tops (same x)\n const d = decimateMinMax(points, 0, n, (v) => sc.xToPx(v) / column);\n const next = new Float64Array(d.length * 2);\n const nextBottom = new Float64Array(d.length * 2);\n let k = 0;\n let j = 0;\n for (let i = 0; i < d.length; i++) {\n const xv = d.points[i * 2];\n while (j < n - 1 && points[j * 2] < xv) j++;\n next[k * 2] = xv;\n next[k * 2 + 1] = d.points[i * 2 + 1];\n nextBottom[k * 2] = xv;\n nextBottom[k * 2 + 1] = bottom[j * 2 + 1];\n k++;\n }\n points = next;\n bottoms = nextBottom;\n n = k;\n } else {\n const d = decimateMinMax(points, 0, n, (v) => sc.xToPx(v) / column);\n points = d.points;\n n = d.length;\n }\n }\n // range areas: a line on the lower edge too\n const band = s.type === \"area\" && !!s.cols.y0 && !!bottoms;\n const segments: number[][] = [];\n const bottomSegments: number[][] = [];\n const lowerSegments: number[][] = [];\n let run: number[] = [];\n let runBottom: number[] = [];\n let runLower: number[] = [];\n const flush = () => {\n if (run.length) {\n segments.push(run);\n bottomSegments.push(runBottom);\n if (band) lowerSegments.push(runLower);\n }\n run = [];\n runBottom = [];\n runLower = [];\n };\n for (let i = 0; i < n; i++) {\n const xv = points[i * 2];\n const yv = points[i * 2 + 1];\n const bv = bottoms ? bottoms[i * 2 + 1] : 0;\n if (\n !Number.isFinite(xv) ||\n !Number.isFinite(yv) ||\n !Number.isFinite(bv)\n ) {\n flush();\n continue;\n }\n const p = toScreen(sc, xv, yv);\n run.push(p.x, p.y);\n if (bottoms) runBottom.push(sc.yToPx(bv));\n if (band) {\n const q = toScreen(sc, xv, bv);\n runLower.push(q.x, q.y);\n }\n }\n flush();\n if (s.type === \"area\") {\n out.push({\n kind: \"area\",\n seriesIndex: s.index,\n color: s.colorCss,\n opacity: s.opacity,\n baseline: sc.yToPx(model.baseline),\n segments,\n ...(bottoms ? { bottoms: bottomSegments } : {}),\n ...(horizontal ? { horizontal: true } : {}),\n });\n }\n if (s.lineWidth > 0) {\n const width =\n s.type === \"area\" ? Math.min(s.lineWidth, 2) : s.lineWidth;\n out.push({\n kind: \"line\",\n seriesIndex: s.index,\n color: s.colorCss,\n width,\n segments,\n });\n if (band)\n out.push({\n kind: \"line\",\n seriesIndex: s.index,\n color: s.colorCss,\n width,\n segments: lowerSegments,\n });\n }\n continue;\n }\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 0.5);\n const rects: number[] = [];\n const colors: string[] = [];\n const merge = end - start > maxBars;\n let lastCol = NaN;\n for (let i = start; i < end; i++) {\n const a = s.barBase[i];\n const b = s.barTop[i];\n if (!Number.isFinite(a) || !Number.isFinite(b)) continue;\n const cx = sc.xToPx(x[i] + s.barOffset);\n if (cx + half < xLo || cx - half > xHi) continue;\n const ya = sc.yToPx(a);\n const yb = sc.yToPx(b);\n const top = Math.min(ya, yb);\n const h = Math.max(1, Math.abs(ya - yb));\n const col = Math.floor(cx);\n if (merge && col === lastCol && rects.length) {\n // widen the previous bar of the same pixel column along the values\n const k = rects.length - 4;\n const bottom = Math.max(rects[k + 1] + rects[k + 3], top + h);\n rects[k + 1] = Math.min(rects[k + 1], top);\n rects[k + 3] = bottom - rects[k + 1];\n continue;\n }\n lastCol = col;\n rects.push(cx - half, top, half * 2, h);\n const pc = s.pointColors?.[i];\n colors.push(pc ? toCss(pc) : s.colorCss);\n }\n out.push({\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects: toRects(sc, rects),\n ...(s.pointColors ? { colors } : {}),\n radius: s.radius,\n ...(s.opacity < 1 ? { opacity: s.opacity } : {}),\n });\n continue;\n }\n if (s.type === \"boxplot\") {\n out.push(...boxPrimitives(s, sc, view.x, xLo, xHi, maxBars));\n continue;\n }\n if (s.type === \"candlestick\") {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const { open, high, low } = s.cols;\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 1);\n const up = toCss(s.upColor);\n const down = toCss(s.downColor);\n const wicks: number[] = [];\n const bodies: number[] = [];\n const wickColors: string[] = [];\n const bodyColors: string[] = [];\n const step = Math.max(1, Math.ceil((end - start) / maxBars));\n for (let i = start; i < end; i += step) {\n const c = y[i];\n const o = open ? open[i] : c;\n if (!Number.isFinite(c) || !Number.isFinite(o)) continue;\n const cx = sc.xToPx(x[i]);\n if (cx + half < xLo || cx - half > xHi) continue;\n const color = c < o ? down : up;\n const hi = sc.yToPx(high ? high[i] : Math.max(o, c));\n const lo = sc.yToPx(low ? low[i] : Math.min(o, c));\n wicks.push(cx - 0.5, Math.min(hi, lo), 1, Math.abs(lo - hi));\n wickColors.push(color);\n const ya = sc.yToPx(o);\n const yb = sc.yToPx(c);\n bodies.push(\n cx - half,\n Math.min(ya, yb),\n half * 2,\n Math.max(1, Math.abs(ya - yb)),\n );\n bodyColors.push(color);\n }\n out.push(\n {\n kind: \"bars\",\n seriesIndex: s.index,\n color: up,\n rects: toRects(sc, wicks),\n colors: wickColors,\n },\n {\n kind: \"bars\",\n seriesIndex: s.index,\n color: up,\n rects: toRects(sc, bodies),\n colors: bodyColors,\n radius: 1,\n },\n );\n continue;\n }\n if (s.type === \"heatmap\") {\n const hw = Math.abs(s.cellHalf.x / sc.xPerPx);\n const hh = Math.abs(s.cellHalf.y / sc.yPerPx);\n const rects: number[] = [];\n const colors: string[] = [];\n const style = heatCellStyle(hw * 2, hh * 2, s.radius);\n const inset = style.inset;\n for (let i = 0; i < count && rects.length / 4 < maxBars * 4; i++) {\n const c = s.cellColors?.[i];\n if (!c) continue;\n const r = screenRect(\n sc,\n sc.xToPx(x[i]) - hw,\n sc.xToPx(x[i]) + hw,\n sc.yToPx(y[i]) - hh,\n sc.yToPx(y[i]) + hh,\n );\n if (\n r.x + r.width < plot.x ||\n r.x > plot.x + plot.width ||\n r.y + r.height < plot.y ||\n r.y > plot.y + plot.height\n )\n continue;\n rects.push(\n r.x + inset,\n r.y + inset,\n r.width - inset * 2,\n r.height - inset * 2,\n );\n colors.push(toCss(unpackColor(c)));\n }\n out.push({\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects,\n colors,\n radius: style.radius,\n });\n continue;\n }\n // scatter\n const dots: number[] = [];\n const colors: string[] = [];\n const colorOf = (i: number) => {\n const c = s.pointColors?.[i];\n return c ? toCss(c) : s.colorCss;\n };\n const visible: number[] = [];\n const screen: number[] = [];\n for (let i = 0; i < count; i++) {\n const xv = x[i];\n const yv = y[i];\n if (!Number.isFinite(xv) || !Number.isFinite(yv)) continue;\n const p = toScreen(sc, xv, yv);\n if (\n p.x < plot.x ||\n p.x > plot.x + plot.width ||\n p.y < plot.y ||\n p.y > plot.y + plot.height\n )\n continue;\n visible.push(i);\n screen.push(p.x, p.y);\n }\n if (visible.length > maxDots) {\n const cell = Math.max(2, limits.dotCell ?? s.pointSize * 0.8);\n const cols = Math.ceil(plot.width / cell) + 1;\n const owner = new Map<number, number>();\n visible.forEach((i, k) => {\n const cx = Math.floor((screen[k * 2] - plot.x) / cell);\n const cy = Math.floor((screen[k * 2 + 1] - plot.y) / cell);\n owner.set(cy * cols + cx, i);\n });\n for (const [key, i] of owner) {\n dots.push(\n plot.x + ((key % cols) + 0.5) * cell,\n plot.y + (Math.floor(key / cols) + 0.5) * cell,\n cell,\n );\n colors.push(colorOf(i));\n }\n } else {\n visible.forEach((i, k) => {\n dots.push(screen[k * 2], screen[k * 2 + 1], dotSize(s, i));\n colors.push(colorOf(i));\n });\n }\n out.push({\n kind: \"dots\",\n seriesIndex: s.index,\n opacity: s.opacity,\n dots,\n colors,\n });\n }\n return out;\n};\n\n/** Box plot shapes: translucent boxes, then whiskers, caps, edges and medians, then outliers */\nconst boxPrimitives = (\n s: SeriesModel,\n sc: Scales,\n range: Range,\n xLo: number,\n xHi: number,\n maxBars: number,\n): ChartPrimitive[] => {\n const { x, y, count, sorted, high, low, q1, q3, outliers } = s.cols;\n const [start, end] = visibleRange(x, count, sorted, range);\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 1);\n const lw = Math.max(1, s.lineWidth);\n const boxes: number[] = [];\n const lines: number[] = [];\n const boxColors: string[] = [];\n const lineColors: string[] = [];\n const dots: number[] = [];\n const dotColors: string[] = [];\n const step = Math.max(1, Math.ceil((end - start) / maxBars));\n /** A line along the values (a whisker or a side) */\n const vertical = (cx: number, a: number, b: number) => {\n lines.push(cx - lw / 2, Math.min(a, b), lw, Math.abs(a - b));\n };\n /** A line across the box (an edge, a cap or the median) */\n const across = (cx: number, h: number, at: number, thick = lw) => {\n lines.push(cx - h, at - thick / 2, h * 2, thick);\n };\n for (let i = start; i < end; i += step) {\n const m = y[i];\n if (!Number.isFinite(m)) continue;\n const cx = sc.xToPx(x[i] + s.barOffset);\n if (cx + half < xLo || cx - half > xHi) continue;\n const pc = s.pointColors?.[i];\n const color = pc ? toCss(pc) : s.colorCss;\n const lo = sc.yToPx(low && Number.isFinite(low[i]) ? low[i] : m);\n const hi = sc.yToPx(high && Number.isFinite(high[i]) ? high[i] : m);\n const a = sc.yToPx(q1 && Number.isFinite(q1[i]) ? q1[i] : m);\n const b = sc.yToPx(q3 && Number.isFinite(q3[i]) ? q3[i] : m);\n const before = lines.length;\n boxes.push(cx - half, Math.min(a, b), half * 2, Math.abs(a - b));\n boxColors.push(color);\n vertical(cx, lo, a);\n vertical(cx, b, hi);\n vertical(cx - half, a, b);\n vertical(cx + half, a, b);\n across(cx, half / 2, lo);\n across(cx, half / 2, hi);\n across(cx, half, a);\n across(cx, half, b);\n across(cx, half, sc.yToPx(m), Math.max(2, lw * 1.6));\n for (let k = before; k < lines.length; k += 4) lineColors.push(color);\n const out = outliers?.[i];\n if (out) {\n for (const v of out) {\n const p = sc.horizontal\n ? { x: sc.yToPx(v), y: cx }\n : { x: cx, y: sc.yToPx(v) };\n dots.push(p.x, p.y, s.outlierSize);\n dotColors.push(color);\n }\n }\n }\n const prims: ChartPrimitive[] = [\n {\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects: toRects(sc, boxes),\n colors: boxColors,\n opacity: s.opacity,\n },\n {\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects: toRects(sc, lines),\n colors: lineColors,\n },\n ];\n if (dots.length)\n prims.push({\n kind: \"dots\",\n seriesIndex: s.index,\n // rings of the series color, or filled dots\n opacity: s.outlierShape === \"hollow\" ? 0 : 0.85,\n dots,\n colors: dotColors,\n stroke: 1.25,\n });\n return prims;\n};\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { Rect } from './layout.cjs';
2
2
  import { ChartModel } from './model.cjs';
3
3
  import { PointLabel, ResolvedAnnotation } from './overlay.cjs';
4
- import { ChartLayout, ConnectorSegment, HoverMark, TooltipContent } from './scene.cjs';
4
+ import { ChartLayout, ConnectorSegment, DependencyArrow, HoverMark, TooltipContent } from './scene.cjs';
5
5
  import { ChartTheme, ChartThemeInput } from './theme.cjs';
6
6
  import { ChartEventMap, ChartHoverEvent, ChartOptions, ChartRect, ChartView } from './types.cjs';
7
7
  /** Events of a controller (no renderer events: hosts draw themselves) */
@@ -104,6 +104,8 @@ export interface ChartScene {
104
104
  } | null;
105
105
  /** Lines between consecutive bars (waterfall connectors) */
106
106
  connectors: ConnectorSegment[];
107
+ /** Elbow arrows between bars (`dependencies`, Gantt charts) */
108
+ arrows: DependencyArrow[];
107
109
  }
108
110
  export interface ChartPointerOptions {
109
111
  /** Pointer id (touch identifier); 0 by default */
@@ -1,7 +1,7 @@
1
1
  import { Rect } from './layout.js';
2
2
  import { ChartModel } from './model.js';
3
3
  import { PointLabel, ResolvedAnnotation } from './overlay.js';
4
- import { ChartLayout, ConnectorSegment, HoverMark, TooltipContent } from './scene.js';
4
+ import { ChartLayout, ConnectorSegment, DependencyArrow, HoverMark, TooltipContent } from './scene.js';
5
5
  import { ChartTheme, ChartThemeInput } from './theme.js';
6
6
  import { ChartEventMap, ChartHoverEvent, ChartOptions, ChartRect, ChartView } from './types.js';
7
7
  /** Events of a controller (no renderer events: hosts draw themselves) */
@@ -104,6 +104,8 @@ export interface ChartScene {
104
104
  } | null;
105
105
  /** Lines between consecutive bars (waterfall connectors) */
106
106
  connectors: ConnectorSegment[];
107
+ /** Elbow arrows between bars (`dependencies`, Gantt charts) */
108
+ arrows: DependencyArrow[];
107
109
  }
108
110
  export interface ChartPointerOptions {
109
111
  /** Pointer id (touch identifier); 0 by default */