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
- const e=require("./engine/color.cjs");require("./engine/layout.cjs"),require("./engine/format.cjs");const t=require("./engine/labels.cjs"),n=require("./engine/overlay.cjs"),r=require("./engine/controller.cjs");require("./engine/canvas.cjs");const i=require("./engine/presets.cjs");require("./engine/shapes/draw.cjs");const a=require("./engine/shapes/calendar.cjs"),o=require("./engine/shapes/canvas.cjs");exports.annotationLine=n.lineOf,exports.annotationRect=n.rectOf,exports.annotationTextBox=n.textBox,exports.areaSeries=i.areaSeries,exports.barSeries=i.barSeries,exports.boxplotData=i.boxplotData,exports.boxplotSeries=i.boxplotSeries,exports.bubbleSeries=i.bubbleSeries,exports.calendarStrips=a.calendarStrips,exports.candlestickSeries=i.candlestickSeries,exports.chartAriaLabel=t.chartAriaLabel,exports.createCanvasShapeChart=o.createCanvasShapeChart,exports.createChartController=r.createChartController,exports.ganttSeries=i.ganttSeries,exports.heatmapChartOptions=i.heatmapChartOptions,exports.histogramSeries=i.histogramSeries,exports.lineSeries=i.lineSeries,exports.quadrantChartOptions=i.quadrantChartOptions,exports.quadrantOf=i.quadrantOf,exports.rangeAreaSeries=i.rangeAreaSeries,exports.scatterSeries=i.scatterSeries,exports.scenePrimitives=r.scenePrimitives,exports.sparklineOptions=i.sparklineOptions,exports.toCss=e.toCss,exports.waterfallSeries=i.waterfallSeries;
1
+ const e=require("./engine/color.cjs");require("./engine/layout.cjs"),require("./engine/format.cjs");const t=require("./engine/labels.cjs"),n=require("./engine/overlay.cjs"),r=require("./engine/controller.cjs");require("./engine/canvas.cjs");const i=require("./engine/presets.cjs");require("./engine/shapes/draw.cjs");const a=require("./engine/shapes/calendar.cjs"),o=require("./engine/shapes/layout.cjs"),s=require("./engine/shapes/canvas.cjs");exports.annotationLine=n.lineOf,exports.annotationRect=n.rectOf,exports.annotationTextBox=n.textBox,exports.areaSeries=i.areaSeries,exports.barSeries=i.barSeries,exports.boxplotData=i.boxplotData,exports.boxplotSeries=i.boxplotSeries,exports.bubbleSeries=i.bubbleSeries,exports.calendarStrips=a.calendarStrips,exports.candlestickSeries=i.candlestickSeries,exports.createCanvasShapeChart=s.createCanvasShapeChart,exports.createChartController=r.createChartController,exports.describeChart=t.describeChart,exports.describeShapeChart=o.describeChart,exports.ganttSeries=i.ganttSeries,exports.heatmapChartOptions=i.heatmapChartOptions,exports.histogramSeries=i.histogramSeries,exports.lineSeries=i.lineSeries,exports.quadrantChartOptions=i.quadrantChartOptions,exports.quadrantOf=i.quadrantOf,exports.rangeAreaSeries=i.rangeAreaSeries,exports.scatterSeries=i.scatterSeries,exports.scenePrimitives=r.scenePrimitives,exports.sparklineOptions=i.sparklineOptions,exports.toCss=e.toCss,exports.waterfallSeries=i.waterfallSeries;
@@ -1,12 +1,13 @@
1
1
  import { toCss as e } from "./engine/color.js";
2
2
  import "./engine/layout.js";
3
3
  import "./engine/format.js";
4
- import { chartAriaLabel as t } from "./engine/labels.js";
4
+ import { describeChart as t } from "./engine/labels.js";
5
5
  import { lineOf as n, rectOf as r, textBox as i } from "./engine/overlay.js";
6
6
  import { createChartController as a, scenePrimitives as o } from "./engine/controller.js";
7
7
  import "./engine/canvas.js";
8
8
  import { areaSeries as s, barSeries as c, boxplotData as l, boxplotSeries as u, bubbleSeries as d, candlestickSeries as f, ganttSeries as p, heatmapChartOptions as m, histogramSeries as h, lineSeries as g, quadrantChartOptions as _, quadrantOf as v, rangeAreaSeries as y, scatterSeries as b, sparklineOptions as x, waterfallSeries as S } from "./engine/presets.js";
9
9
  import "./engine/shapes/draw.js";
10
10
  import { calendarStrips as C } from "./engine/shapes/calendar.js";
11
- import { createCanvasShapeChart as w } from "./engine/shapes/canvas.js";
12
- export { n as annotationLine, r as annotationRect, i as annotationTextBox, s as areaSeries, c as barSeries, l as boxplotData, u as boxplotSeries, d as bubbleSeries, C as calendarStrips, f as candlestickSeries, t as chartAriaLabel, w as createCanvasShapeChart, a as createChartController, p as ganttSeries, m as heatmapChartOptions, h as histogramSeries, g as lineSeries, _ as quadrantChartOptions, v as quadrantOf, y as rangeAreaSeries, b as scatterSeries, o as scenePrimitives, x as sparklineOptions, e as toCss, S as waterfallSeries };
11
+ import { describeChart as w } from "./engine/shapes/layout.js";
12
+ import { createCanvasShapeChart as T } from "./engine/shapes/canvas.js";
13
+ export { n as annotationLine, r as annotationRect, i as annotationTextBox, s as areaSeries, c as barSeries, l as boxplotData, u as boxplotSeries, d as bubbleSeries, C as calendarStrips, f as candlestickSeries, T as createCanvasShapeChart, a as createChartController, t as describeChart, w as describeShapeChart, p as ganttSeries, m as heatmapChartOptions, h as histogramSeries, g as lineSeries, _ as quadrantChartOptions, v as quadrantOf, y as rangeAreaSeries, b as scatterSeries, o as scenePrimitives, x as sparklineOptions, e as toCss, S as waterfallSeries };
@@ -1,3 +1,3 @@
1
- const e=require("./color.cjs"),t=require("./curve.cjs"),n=require("./data.cjs"),r=require("./decimate.cjs"),i=require("./layout.cjs"),a=require("./model.cjs"),o=require("./overlay.cjs"),s=require("./scene.cjs"),c=require("./theme.cjs"),l=require("./viewport.cjs");var u=e=>({x:[e.x[0],e.x[1]],y:[e.y[0],e.y[1]]}),d=6,f=10,p=320,m=20,h=e=>{let t=e.options,n=e.theme,r=c.createTheme(n,t.palette),h=new Map,g=new Set,_={},v,y={x:[0,1],y:[0,1]},b=!1,x=0,S=0,C=[],w=null,T=!0,E=``,D=!1,O=null,k=new Map,A=null,j={time:0,x:0,y:0},M=(e,t)=>{_[e]?.forEach(e=>e(t))},N=()=>{T=!0,D||e.onInvalidate?.()},P=()=>{let e=t.interaction;if(e===!1)return null;let n=typeof e==`object`?e:{};return{pan:n.pan??!0,dragPoints:n.dragPoints??!1}},F=(t,n=r.fontSize,i=400)=>e.measureText(t,o.font(r,n,i)),I=()=>{v=a.buildModel(t,r,g,h);let{base:e,minSpan:n}=v;b?(y={x:v.zoom.x?l.clampRange(y.x,e.x,n.x):[...e.x],y:v.zoom.y?l.clampRange(y.y,e.y,n.y):[...e.y]},b=!l.sameRange(y.x,e.x)||!l.sameRange(y.y,e.y)):y=u(e),C=s.resolveAnnotations(t.annotations,r,v.y.type===`log`?Math.log10:void 0),O&&(O.event.items.every(e=>v.series[e.seriesIndex]&&!v.series[e.seriesIndex].hidden&&e.index<v.series[e.seriesIndex].cols.count)||H(null)),N()},L=()=>{let e=t.legend,n=t.series.filter(e=>e.name).length;if(!s.legendShown(e,v,n))return null;let r=typeof e==`object`?e:{},i=r.position===`bottom`?`bottom`:`top`,a=s.colorLegend(v);if(a){let e=a.labels[0]?.text??``,t=a.labels[a.labels.length-1]?.text??``,n=Math.max(60,Math.min(160,x*.32)),r=x-4-F(t,11)-8,o=r-n,s=(i===`bottom`?S-m:0)+m/2;return{entries:[],colors:{bar:{x:o,y:s-4,width:n,height:8},stops:a.stops,labels:[{text:e,x:o-8,y:s,align:`right`},{text:t,x:r+8,y:s,align:`left`}],ticks:a.labels.filter(e=>e.at>0&&e.at<1).map(e=>o+e.at*n),caret:null},position:i,toggle:!1,height:26}}let o=[],c=4,l=0;for(let e of v.series){let t=14+F(e.name,12)+8;c+t>x-4&&c>4&&(c=4,l++),o.push({id:e.id,name:e.name,color:e.colorCss,shape:s.legendShape(e.type),hidden:e.hidden,box:{x:c,y:l*m,width:t,height:m}}),c+=t+10}let u=(l+1)*m+6;if(i===`bottom`)for(let e of o)e.box.y+=S-u+6;return{entries:o,colors:null,position:i,toggle:r.toggle??!0,height:u}},R=(e,n,r)=>{let i=t.tooltip;if(i===!1)return null;let a=typeof i==`object`?i.render:void 0,o=null;if(a){let t=a(e);if(t===null||t===``)return null;typeof t==`string`&&(o=t.split(`
2
- `))}let c=s.tooltipContent(v,e,w?.layout.yTicks??null,w?.layout.y2Ticks??null),l=0,u,d=c.rows.some(e=>e.color)?14:0;if(o){for(let e of o)l=Math.max(l,F(e,12));u=o.length}else{l=F(c.title,12,600)+(c.titleColor?14:0),c.subtitle&&(l=Math.max(l,F(c.subtitle,11)+(c.titleColor?14:0)));let e=0,t=0;for(let n of c.rows)e=Math.max(e,F(n.name,12)),t=Math.max(t,F(n.value,12,600));c.rows.length&&(l=Math.max(l,d+e+16+t)),u=1+ +!!c.subtitle+c.rows.length}let f=Math.ceil(Math.max(l,96)+16+4),p=u*18+16,m=n+14;m+f>x-4&&(m=n-14-f),m=Math.max(4,Math.min(m,x-f-4));let h=Math.max(4,Math.min(r-p/2,S-p-4));return{content:c,text:o,box:{x:m,y:h,width:f,height:p},lineHeight:18,padding:8,swatchWidth:d}},z=()=>{if(x<=0||S<=0)return null;let e=L(),n=e?.position===`top`?e.height:0,i=s.layoutChart({model:v,view:y,theme:r,width:x,height:S-(e?.height??0),padding:t.padding,top:n,measure:e=>F(e)}),c=s.collectPointLabels(v,y,i.scales,i.yTicks),l=[],d=r.fontSize+4;for(let e of C){if(e.type===`text`&&e.text){l.push(o.textBox(e,i.scales,F(e.text,r.fontSize,e.weight),d));continue}if(e.type!==`rect`||!e.label)continue;let t=o.rectOf(e,i.scales);if(t.width<=0||t.height<=0)continue;let n=F(e.label,r.fontSize+1,600),a=e.labelPosition;l.push({x:a.endsWith(`left`)?t.x+10:a.endsWith(`right`)?t.x+t.width-10-n:t.x+(t.width-n)/2,y:a.startsWith(`top`)?t.y+10:a.startsWith(`bottom`)?t.y+t.height-10-d:t.y+(t.height-d)/2,width:n,height:d})}let f=o.placeLabels(c,i.plot,e=>F(e),d-2,l),p={width:x,height:S,theme:r,model:v,view:u(y),layout:i,annotations:C,pointLabels:f,legend:e,hover:null,dragging:null,connectors:s.connectorSegments(v,i.scales)};if(w=p,O){let n=s.crosshairAt(v,i.scales,O.event,t.crosshair),r=i.scales.horizontal;p.hover={event:O.event,marks:s.hoverMarks(v,i.scales,O.event),crosshairX:r?null:n,crosshairY:r?n:null,tooltip:A?.kind===`pan`||A?.kind===`point`?null:R(O.event,O.x,O.y)};let o=e?.colors,c=O.event.items[0],l=c?v.series[c.seriesIndex]:void 0;o&&c&&l?.type===`heatmap`&&c.value!==void 0&&(o.caret=o.bar.x+a.heatPosition(l,c.value)*o.bar.width)}if(A?.kind===`point`){let e=v.series[A.item.seriesIndex];p.dragging={x:A.x,y:A.y,color:A.item.color,size:(e?s.dotSize(e,A.item.index):8)+6}}let m=i.plot,h=`${m.x},${m.y},${m.width},${m.height}`;return h!==E&&(E=h,M(`layout`,{...m})),p},B=()=>((T||!w)&&(T=!1,w=z()),w),V=()=>B()?.layout.scales??null,H=e=>{let t=!s.sameHover(O?.event??null,e?.event??null);O=e,N(),t&&M(`hover`,e?e.event:null)},U=(e,t,n)=>{let r=V();return r?s.hitTest(v,r,w?.layout.xTicks??null,e,t,n?8:0):null},W=(e,t)=>{let n=V()?.plot;return!!n&&e>=n.x&&e<=n.x+n.width&&t>=n.y&&t<=n.y+n.height},G=(e,t)=>{let n=V();if(!n)return null;let{plot:r}=n,o=Math.max(r.x,Math.min(r.x+r.width,e)),s=Math.max(r.y,Math.min(r.y+r.height,t)),c=i.toData(n,o,s);return{x:c.x,y:a.fromPlotY(v,c.y)}},K=(e,t)=>{let{base:n,minSpan:r}=v;y={x:l.clampRange(e.x,n.x,r.x),y:l.clampRange(e.y,n.y,r.y)},b=!l.sameRange(y.x,n.x)||!l.sameRange(y.y,n.y),t&&M(`zoom`,u(y)),N()},q=(e,t,n)=>{let r=V();if(!r||!v.zoom.x&&!v.zoom.y)return;let a=u(y),o=i.toData(r,e,t);v.zoom.x&&(a.x=l.zoomRange(y.x,o.x,n)),v.zoom.y&&(a.y=l.zoomRange(y.y,o.y,n)),K(a,!0)},J=()=>{b&&K(u(v.base),!0)},Y=(e,t)=>B()?.legend?.entries.find(n=>e>=n.box.x&&e<=n.box.x+n.box.width&&t>=n.box.y&&t<=n.box.y+n.box.height)??null,X=e=>{g.has(e)?g.delete(e):g.add(e),I()},Z=()=>{let[e,t]=[...k.values()];A={kind:`pinch`,view:u(y),distance:Math.max(1,Math.hypot(e.x-t.x,e.y-t.y)),midX:(e.x+t.x)/2,midY:(e.y+t.y)/2},H(null)};return v=a.buildModel(t,r,g,h),I(),{setOptions(e){if(D)return;let i=(e.palette??[]).join()!==(t.palette??[]).join();t=e,i&&(r=c.createTheme(n,t.palette)),I()},setTheme(e){D||(n=e,r=c.createTheme(n,t.palette),I())},setSize(e,t){(e!==x||t!==S)&&(x=Math.max(0,e),S=Math.max(0,t),N())},getScene:B,pointerDown:(e,t,n={})=>{if(D)return;let r=n.id??0,i=!!n.touch;k.set(r,{x:e,y:t,startX:e,startY:t,touch:i,moved:!1});let a=P();if(k.size===2){a&&(v.zoom.x||v.zoom.y)&&A?.kind!==`point`&&Z();return}if(k.size>2||!a){if(!a&&i){let n=U(e,t,!0);H(n?{event:n,x:e,y:t}:null)}return}if(a.dragPoints){let n=U(e,t,i)?.items.find(e=>v.series[e.seriesIndex].type===`scatter`);if(n){A={kind:`point`,item:n,x:e,y:t};return}}if(b&&a.pan&&W(e,t)){A={kind:`pan`,view:u(y),x:e,y:t};return}if(A=null,i){let n=U(e,t,!0);H(n?{event:n,x:e,y:t}:null)}},pointerMove:(e,t,n={})=>{if(D)return;let r=n.id??0,a=k.get(r);if(a&&(a.x=e,a.y=t,!a.moved&&Math.hypot(e-a.startX,t-a.startY)>(a.touch?f:d)&&(a.moved=!0)),A?.kind===`pinch`&&k.size>=2){let[e,t]=[...k.values()],n=Math.max(1,Math.hypot(e.x-t.x,e.y-t.y)),r=(e.x+t.x)/2,a=(e.y+t.y)/2,o=V();if(!o)return;let s=i.createScales(o.plot,A.view,v.x.reverse,v.y.reverse,v.horizontal),c=A.distance/n,d=u(A.view),f=i.toData(s,A.midX,A.midY),p=i.toData(s,r,a);v.zoom.x&&(d.x=l.zoomRange(A.view.x,f.x,c),d.x=l.panRange(d.x,(f.x-p.x)*c)),v.zoom.y&&(d.y=l.zoomRange(A.view.y,f.y,c),d.y=l.panRange(d.y,(f.y-p.y)*c)),K(d,!0);return}if(A?.kind===`point`&&a){if(!a.moved)return;A.x=e,A.y=t;let n=G(e,t);N(),n&&M(`drag`,{item:A.item,x:n.x,y:n.y});return}if(A?.kind===`pan`&&a){if(!a.moved)return;let n=V();if(!n)return;let r=u(A.view),o=i.toData(n,A.x,A.y),s=i.toData(n,e,t);v.zoom.x&&(r.x=l.panRange(A.view.x,o.x-s.x)),v.zoom.y&&(r.y=l.panRange(A.view.y,o.y-s.y)),K(r,!0);return}if(!(k.size>1)&&(!a||a.touch||!n.touch)){let r=U(e,t,!!a?.touch||!!n.touch);(r||!a?.touch)&&H(r?{event:r,x:e,y:t}:null)}},pointerUp:(e,t,n={})=>{if(D)return;let r=n.id??0,i=k.get(r);k.delete(r);let a=A;if(a?.kind===`pinch`){k.size<2&&(A=null);return}if(A=null,!i)return;if(a?.kind===`point`){if(i.moved){let n=G(e,t);N(),n&&M(`drop`,{item:a.item,x:n.x,y:n.y});return}}else if(a?.kind===`pan`&&i.moved){N();return}if(i.moved){i.touch&&N();return}let o=Date.now();if(i.touch&&o-j.time<p&&Math.hypot(e-j.x,t-j.y)<24&&b){j={time:0,x:e,y:t},J();return}j={time:o,x:e,y:t};let s=Y(e,t);if(s){B()?.legend?.toggle&&X(s.id);return}let c=U(e,t,i.touch);if(c){i.touch&&H({event:c,x:e,y:t}),M(`click`,c);return}if(i.touch&&H(null),W(e,t)){let n=G(e,t);n&&M(`plotClick`,n)}},pointerCancel:(e={})=>{k.delete(e.id??0),(A?.kind===`point`||k.size<2)&&(A=null),N()},pointerLeave(){!A&&O&&H(null)},zoomAt:q,resetZoom:J,getView:()=>u(y),setView(e){D||K({x:e.x??y.x,y:e.y??y.y},!1)},toggleSeries:X,clearHover(){O&&H(null)},getPlotRect(){let e=B()?.layout.plot;return e?{...e}:null},toPixel(e,t){let n=V();return n?i.toScreen(n,e,a.toPlotY(v,t)):null},fromPixel(e,t){let n=V();if(!n)return null;let r=i.toData(n,e,t);return{x:r.x,y:a.fromPlotY(v,r.y)}},on(e,t){let n=_[e];return n||(n=new Set,_[e]=n),n.add(t),()=>{n.delete(t)}},destroy(){D=!0,k.clear();for(let e of Object.keys(_))delete _[e]}}},g=(e,t,r,i)=>{if(!r)return[0,t];let[a,o]=i[0]<=i[1]?i:[i[1],i[0]];return[Math.max(0,n.lowerBound(e,t,a)-1),Math.min(t,n.lowerBound(e,t,o)+1)]},_={heatmap:0,area:1,bar:2,boxplot:2,candlestick:3,line:4,scatter:5},v=(e,t)=>{if(!e.horizontal)return t;let n=Array(t.length);for(let e=0;e<t.length;e+=4)n[e]=t[e+1],n[e+1]=t[e],n[e+2]=t[e+3],n[e+3]=t[e+2];return n},y=(n,a={})=>{let{model:o,view:c,layout:l}=n,u=l.scales,{plot:d}=l,f=u.horizontal,p=a.maxDots??4e3,m=a.maxBars??2e3,h=Math.max(1,a.columnWidth??1),y=f?d.y:d.x,x=y+(f?d.height:d.width),S=[],C=o.series.filter(e=>!e.hidden&&e.cols.count>0).sort((e,t)=>_[e.type]-_[t.type]||e.index-t.index);for(let n of C){let{x:l,y:_,count:C,sorted:w}=n.cols;if(n.type===`line`||n.type===`area`){let[e,a]=g(l,C,w,c.x),s=n.stackTop??_,d=t.curvePoints(l,s,e,a,n.curve),p=n.stackBase?t.curvePoints(l,n.stackBase,e,a,n.curve).points:null,m=d.length,v=d.points,b=p;if(w&&m>(x-y)*2/h){if(p){let e=r.decimateMinMax(v,0,m,e=>u.xToPx(e)/h),t=new Float64Array(e.length*2),n=new Float64Array(e.length*2),i=0,a=0;for(let r=0;r<e.length;r++){let o=e.points[r*2];for(;a<m-1&&v[a*2]<o;)a++;t[i*2]=o,t[i*2+1]=e.points[r*2+1],n[i*2]=o,n[i*2+1]=p[a*2+1],i++}v=t,b=n,m=i}else{let e=r.decimateMinMax(v,0,m,e=>u.xToPx(e)/h);v=e.points,m=e.length}}let T=n.type===`area`&&!!n.cols.y0&&!!b,E=[],D=[],O=[],k=[],A=[],j=[],M=()=>{k.length&&(E.push(k),D.push(A),T&&O.push(j)),k=[],A=[],j=[]};for(let e=0;e<m;e++){let t=v[e*2],n=v[e*2+1],r=b?b[e*2+1]:0;if(!Number.isFinite(t)||!Number.isFinite(n)||!Number.isFinite(r)){M();continue}let a=i.toScreen(u,t,n);if(k.push(a.x,a.y),b&&A.push(u.yToPx(r)),T){let e=i.toScreen(u,t,r);j.push(e.x,e.y)}}if(M(),n.type===`area`&&S.push({kind:`area`,seriesIndex:n.index,color:n.colorCss,opacity:n.opacity,baseline:u.yToPx(o.baseline),segments:E,...b?{bottoms:D}:{},...f?{horizontal:!0}:{}}),n.lineWidth>0){let e=n.type===`area`?Math.min(n.lineWidth,2):n.lineWidth;S.push({kind:`line`,seriesIndex:n.index,color:n.colorCss,width:e,segments:E}),T&&S.push({kind:`line`,seriesIndex:n.index,color:n.colorCss,width:e,segments:O})}continue}if(n.type===`bar`&&n.barBase&&n.barTop){let[t,r]=g(l,C,w,c.x),i=Math.max(n.barHalfWidth/Math.abs(u.xPerPx),.5),a=[],o=[],s=r-t>m,d=NaN;for(let c=t;c<r;c++){let t=n.barBase[c],r=n.barTop[c];if(!Number.isFinite(t)||!Number.isFinite(r))continue;let f=u.xToPx(l[c]+n.barOffset);if(f+i<y||f-i>x)continue;let p=u.yToPx(t),m=u.yToPx(r),h=Math.min(p,m),g=Math.max(1,Math.abs(p-m)),_=Math.floor(f);if(s&&_===d&&a.length){let e=a.length-4,t=Math.max(a[e+1]+a[e+3],h+g);a[e+1]=Math.min(a[e+1],h),a[e+3]=t-a[e+1];continue}d=_,a.push(f-i,h,i*2,g);let v=n.pointColors?.[c];o.push(v?e.toCss(v):n.colorCss)}S.push({kind:`bars`,seriesIndex:n.index,color:n.colorCss,rects:v(u,a),...n.pointColors?{colors:o}:{},radius:n.radius,...n.opacity<1?{opacity:n.opacity}:{}});continue}if(n.type===`boxplot`){S.push(...b(n,u,c.x,y,x,m));continue}if(n.type===`candlestick`){let[t,r]=g(l,C,w,c.x),{open:i,high:a,low:o}=n.cols,s=Math.max(n.barHalfWidth/Math.abs(u.xPerPx),1),d=e.toCss(n.upColor),f=e.toCss(n.downColor),p=[],h=[],b=[],T=[],E=Math.max(1,Math.ceil((r-t)/m));for(let e=t;e<r;e+=E){let t=_[e],n=i?i[e]:t;if(!Number.isFinite(t)||!Number.isFinite(n))continue;let r=u.xToPx(l[e]);if(r+s<y||r-s>x)continue;let c=t<n?f:d,m=u.yToPx(a?a[e]:Math.max(n,t)),g=u.yToPx(o?o[e]:Math.min(n,t));p.push(r-.5,Math.min(m,g),1,Math.abs(g-m)),b.push(c);let v=u.yToPx(n),S=u.yToPx(t);h.push(r-s,Math.min(v,S),s*2,Math.max(1,Math.abs(v-S))),T.push(c)}S.push({kind:`bars`,seriesIndex:n.index,color:d,rects:v(u,p),colors:b},{kind:`bars`,seriesIndex:n.index,color:d,rects:v(u,h),colors:T,radius:1});continue}if(n.type===`heatmap`){let t=Math.abs(n.cellHalf.x/u.xPerPx),r=Math.abs(n.cellHalf.y/u.yPerPx),a=[],o=[],s=i.heatCellStyle(t*2,r*2,n.radius),c=s.inset;for(let s=0;s<C&&a.length/4<m*4;s++){let f=n.cellColors?.[s];if(!f)continue;let p=i.screenRect(u,u.xToPx(l[s])-t,u.xToPx(l[s])+t,u.yToPx(_[s])-r,u.yToPx(_[s])+r);p.x+p.width<d.x||p.x>d.x+d.width||p.y+p.height<d.y||p.y>d.y+d.height||(a.push(p.x+c,p.y+c,p.width-c*2,p.height-c*2),o.push(e.toCss(e.unpackColor(f))))}S.push({kind:`bars`,seriesIndex:n.index,color:n.colorCss,rects:a,colors:o,radius:s.radius});continue}let T=[],E=[],D=t=>{let r=n.pointColors?.[t];return r?e.toCss(r):n.colorCss},O=[],k=[];for(let e=0;e<C;e++){let t=l[e],n=_[e];if(!Number.isFinite(t)||!Number.isFinite(n))continue;let r=i.toScreen(u,t,n);r.x<d.x||r.x>d.x+d.width||r.y<d.y||r.y>d.y+d.height||(O.push(e),k.push(r.x,r.y))}if(O.length>p){let e=Math.max(2,a.dotCell??n.pointSize*.8),t=Math.ceil(d.width/e)+1,r=new Map;O.forEach((n,i)=>{let a=Math.floor((k[i*2]-d.x)/e),o=Math.floor((k[i*2+1]-d.y)/e);r.set(o*t+a,n)});for(let[n,i]of r)T.push(d.x+(n%t+.5)*e,d.y+(Math.floor(n/t)+.5)*e,e),E.push(D(i))}else O.forEach((e,t)=>{T.push(k[t*2],k[t*2+1],s.dotSize(n,e)),E.push(D(e))});S.push({kind:`dots`,seriesIndex:n.index,opacity:n.opacity,dots:T,colors:E})}return S},b=(t,n,r,i,a,o)=>{let{x:s,y:c,count:l,sorted:u,high:d,low:f,q1:p,q3:m,outliers:h}=t.cols,[_,y]=g(s,l,u,r),b=Math.max(t.barHalfWidth/Math.abs(n.xPerPx),1),x=Math.max(1,t.lineWidth),S=[],C=[],w=[],T=[],E=[],D=[],O=Math.max(1,Math.ceil((y-_)/o)),k=(e,t,n)=>{C.push(e-x/2,Math.min(t,n),x,Math.abs(t-n))},A=(e,t,n,r=x)=>{C.push(e-t,n-r/2,t*2,r)};for(let r=_;r<y;r+=O){let o=c[r];if(!Number.isFinite(o))continue;let l=n.xToPx(s[r]+t.barOffset);if(l+b<i||l-b>a)continue;let u=t.pointColors?.[r],g=u?e.toCss(u):t.colorCss,_=n.yToPx(f&&Number.isFinite(f[r])?f[r]:o),v=n.yToPx(d&&Number.isFinite(d[r])?d[r]:o),y=n.yToPx(p&&Number.isFinite(p[r])?p[r]:o),O=n.yToPx(m&&Number.isFinite(m[r])?m[r]:o),j=C.length;S.push(l-b,Math.min(y,O),b*2,Math.abs(y-O)),w.push(g),k(l,_,y),k(l,O,v),k(l-b,y,O),k(l+b,y,O),A(l,b/2,_),A(l,b/2,v),A(l,b,y),A(l,b,O),A(l,b,n.yToPx(o),Math.max(2,x*1.6));for(let e=j;e<C.length;e+=4)T.push(g);let M=h?.[r];if(M)for(let e of M){let r=n.horizontal?{x:n.yToPx(e),y:l}:{x:l,y:n.yToPx(e)};E.push(r.x,r.y,t.outlierSize),D.push(g)}}let j=[{kind:`bars`,seriesIndex:t.index,color:t.colorCss,rects:v(n,S),colors:w,opacity:t.opacity},{kind:`bars`,seriesIndex:t.index,color:t.colorCss,rects:v(n,C),colors:T}];return E.length&&j.push({kind:`dots`,seriesIndex:t.index,opacity:t.outlierShape===`hollow`?0:.85,dots:E,colors:D,stroke:1.25}),j};exports.createChartController=h,exports.scenePrimitives=y;
1
+ const e=require("./color.cjs"),t=require("./curve.cjs"),n=require("./data.cjs"),r=require("./decimate.cjs"),i=require("./layout.cjs"),a=require("./model.cjs"),o=require("./overlay.cjs"),s=require("./scene.cjs"),c=require("./theme.cjs"),l=require("./viewport.cjs");var u=e=>({x:[e.x[0],e.x[1]],y:[e.y[0],e.y[1]]}),d=6,f=10,p=320,m=20,h=e=>{let t=e.options,n=e.theme,r=c.createTheme(n,t.palette),h=new Map,g=new Set,_={},v,y={x:[0,1],y:[0,1]},b=!1,x=0,S=0,C=[],w=[],T=null,E=!0,D=``,O=!1,k=null,A=new Map,j=null,M={time:0,x:0,y:0},N=(e,t)=>{_[e]?.forEach(e=>e(t))},P=()=>{E=!0,O||e.onInvalidate?.()},F=()=>{let e=t.interaction;if(e===!1)return null;let n=typeof e==`object`?e:{};return{pan:n.pan??!0,dragPoints:n.dragPoints??!1}},I=(t,n=r.fontSize,i=400)=>e.measureText(t,o.font(r,n,i)),L=()=>{v=a.buildModel(t,r,g,h);let{base:e,minSpan:n}=v;b?(y={x:v.zoom.x?l.clampRange(y.x,e.x,n.x):[...e.x],y:v.zoom.y?l.clampRange(y.y,e.y,n.y):[...e.y]},b=!l.sameRange(y.x,e.x)||!l.sameRange(y.y,e.y)):y=u(e),C=s.resolveAnnotations(t.annotations,r,v.y.type===`log`?Math.log10:void 0,v.x.type===`log`?Math.log10:void 0),w=s.resolveDependencies(t.dependencies,r),k&&(k.event.items.every(e=>v.series[e.seriesIndex]&&!v.series[e.seriesIndex].hidden&&e.index<v.series[e.seriesIndex].cols.count)||U(null)),P()},R=()=>{let e=t.legend,n=t.series.filter(e=>e.name).length;if(!s.legendShown(e,v,n))return null;let r=typeof e==`object`?e:{},i=r.position===`bottom`?`bottom`:`top`,a=s.colorLegend(v);if(a){let e=a.labels[0]?.text??``,t=a.labels[a.labels.length-1]?.text??``,n=Math.max(60,Math.min(160,x*.32)),r=x-4-I(t,11)-8,o=r-n,s=(i===`bottom`?S-m:0)+m/2;return{entries:[],colors:{bar:{x:o,y:s-4,width:n,height:8},stops:a.stops,labels:[{text:e,x:o-8,y:s,align:`right`},{text:t,x:r+8,y:s,align:`left`}],ticks:a.labels.filter(e=>e.at>0&&e.at<1).map(e=>o+e.at*n),caret:null},position:i,toggle:!1,height:26}}let o=[],c=4,l=0;for(let e of v.series){let t=14+I(e.name,12)+8;c+t>x-4&&c>4&&(c=4,l++),o.push({id:e.id,name:e.name,color:e.colorCss,shape:s.legendShape(e.type),hidden:e.hidden,box:{x:c,y:l*m,width:t,height:m}}),c+=t+10}let u=(l+1)*m+6;if(i===`bottom`)for(let e of o)e.box.y+=S-u+6;return{entries:o,colors:null,position:i,toggle:r.toggle??!0,height:u}},z=(e,n,r)=>{let i=t.tooltip;if(i===!1)return null;let a=typeof i==`object`?i.render:void 0,o=null;if(a){let t=a(e);if(t===null||t===``)return null;typeof t==`string`&&(o=t.split(`
2
+ `))}let c=s.tooltipContent(v,e,T?.layout.yTicks??null,T?.layout.y2Ticks??null),l=0,u,d=c.rows.some(e=>e.color)?14:0;if(o){for(let e of o)l=Math.max(l,I(e,12));u=o.length}else{l=I(c.title,12,600)+(c.titleColor?14:0),c.subtitle&&(l=Math.max(l,I(c.subtitle,11)+(c.titleColor?14:0)));let e=0,t=0;for(let n of c.rows)e=Math.max(e,I(n.name,12)),t=Math.max(t,I(n.value,12,600));c.rows.length&&(l=Math.max(l,d+e+16+t)),u=1+ +!!c.subtitle+c.rows.length}let f=Math.ceil(Math.max(l,96)+16+4),p=u*18+16,m=n+14;m+f>x-4&&(m=n-14-f),m=Math.max(4,Math.min(m,x-f-4));let h=Math.max(4,Math.min(r-p/2,S-p-4));return{content:c,text:o,box:{x:m,y:h,width:f,height:p},lineHeight:18,padding:8,swatchWidth:d}},B=()=>{if(x<=0||S<=0)return null;let e=R(),n=e?.position===`top`?e.height:0,i=s.layoutChart({model:v,view:y,theme:r,width:x,height:S-(e?.height??0),padding:t.padding,top:n,measure:e=>I(e)}),c=s.collectPointLabels(v,y,i.scales,i.yTicks),l=[],d=r.fontSize+4;for(let e of C){if(e.type===`text`&&e.text){l.push(o.textBox(e,i.scales,I(e.text,r.fontSize,e.weight),d));continue}if(e.type!==`rect`||!e.label)continue;let t=o.rectOf(e,i.scales);if(t.width<=0||t.height<=0)continue;let n=I(e.label,r.fontSize+1,600),a=e.labelPosition;l.push({x:a.endsWith(`left`)?t.x+10:a.endsWith(`right`)?t.x+t.width-10-n:t.x+(t.width-n)/2,y:a.startsWith(`top`)?t.y+10:a.startsWith(`bottom`)?t.y+t.height-10-d:t.y+(t.height-d)/2,width:n,height:d})}let f=o.placeLabels(c,i.plot,e=>I(e),d-2,l),p={width:x,height:S,theme:r,model:v,view:u(y),layout:i,annotations:C,pointLabels:f,legend:e,hover:null,dragging:null,connectors:s.connectorSegments(v,i.scales),arrows:s.dependencyArrows(v,i.scales,w)};if(T=p,k){let n=s.crosshairAt(v,i.scales,k.event,t.crosshair),r=i.scales.horizontal;p.hover={event:k.event,marks:s.hoverMarks(v,i.scales,k.event),crosshairX:r?null:n,crosshairY:r?n:null,tooltip:j?.kind===`pan`||j?.kind===`point`?null:z(k.event,k.x,k.y)};let o=e?.colors,c=k.event.items[0],l=c?v.series[c.seriesIndex]:void 0;o&&c&&l?.type===`heatmap`&&c.value!==void 0&&(o.caret=o.bar.x+a.heatPosition(l,c.value)*o.bar.width)}if(j?.kind===`point`){let e=v.series[j.item.seriesIndex];p.dragging={x:j.x,y:j.y,color:j.item.color,size:(e?s.dotSize(e,j.item.index):8)+6}}let m=i.plot,h=`${m.x},${m.y},${m.width},${m.height}`;return h!==D&&(D=h,N(`layout`,{...m})),p},V=()=>((E||!T)&&(E=!1,T=B()),T),H=()=>V()?.layout.scales??null,U=e=>{let t=!s.sameHover(k?.event??null,e?.event??null);k=e,P(),t&&N(`hover`,e?e.event:null)},W=(e,t,n)=>{let r=H();return r?s.hitTest(v,r,T?.layout.xTicks??null,e,t,n?8:0):null},G=(e,t)=>{let n=H()?.plot;return!!n&&e>=n.x&&e<=n.x+n.width&&t>=n.y&&t<=n.y+n.height},K=(e,t)=>{let n=H();if(!n)return null;let{plot:r}=n,o=Math.max(r.x,Math.min(r.x+r.width,e)),s=Math.max(r.y,Math.min(r.y+r.height,t)),c=i.toData(n,o,s);return{x:a.fromPlotX(v,c.x),y:a.fromPlotY(v,c.y)}},q=(e,t)=>{let{base:n,minSpan:r}=v;y={x:l.clampRange(e.x,n.x,r.x),y:l.clampRange(e.y,n.y,r.y)},b=!l.sameRange(y.x,n.x)||!l.sameRange(y.y,n.y),t&&N(`zoom`,a.viewToValues(v,y)),P()},J=(e,t,n)=>{let r=H();if(!r||!v.zoom.x&&!v.zoom.y)return;let a=u(y),o=i.toData(r,e,t);v.zoom.x&&(a.x=l.zoomRange(y.x,o.x,n)),v.zoom.y&&(a.y=l.zoomRange(y.y,o.y,n)),q(a,!0)},Y=()=>{b&&q(u(v.base),!0)},X=(e,t)=>V()?.legend?.entries.find(n=>e>=n.box.x&&e<=n.box.x+n.box.width&&t>=n.box.y&&t<=n.box.y+n.box.height)??null,Z=e=>{g.has(e)?g.delete(e):g.add(e),L()},Q=()=>{let[e,t]=[...A.values()];j={kind:`pinch`,view:u(y),distance:Math.max(1,Math.hypot(e.x-t.x,e.y-t.y)),midX:(e.x+t.x)/2,midY:(e.y+t.y)/2},U(null)};return v=a.buildModel(t,r,g,h),L(),{setOptions(e){if(O)return;let i=(e.palette??[]).join()!==(t.palette??[]).join();t=e,i&&(r=c.createTheme(n,t.palette)),L()},setTheme(e){O||(n=e,r=c.createTheme(n,t.palette),L())},setSize(e,t){(e!==x||t!==S)&&(x=Math.max(0,e),S=Math.max(0,t),P())},getScene:V,pointerDown:(e,t,n={})=>{if(O)return;let r=n.id??0,i=!!n.touch;A.set(r,{x:e,y:t,startX:e,startY:t,touch:i,moved:!1});let a=F();if(A.size===2){a&&(v.zoom.x||v.zoom.y)&&j?.kind!==`point`&&Q();return}if(A.size>2||!a){if(!a&&i){let n=W(e,t,!0);U(n?{event:n,x:e,y:t}:null)}return}if(a.dragPoints){let n=W(e,t,i)?.items.find(e=>v.series[e.seriesIndex].type===`scatter`);if(n){j={kind:`point`,item:n,x:e,y:t};return}}if(b&&a.pan&&G(e,t)){j={kind:`pan`,view:u(y),x:e,y:t};return}if(j=null,i){let n=W(e,t,!0);U(n?{event:n,x:e,y:t}:null)}},pointerMove:(e,t,n={})=>{if(O)return;let r=n.id??0,a=A.get(r);if(a&&(a.x=e,a.y=t,!a.moved&&Math.hypot(e-a.startX,t-a.startY)>(a.touch?f:d)&&(a.moved=!0)),j?.kind===`pinch`&&A.size>=2){let[e,t]=[...A.values()],n=Math.max(1,Math.hypot(e.x-t.x,e.y-t.y)),r=(e.x+t.x)/2,a=(e.y+t.y)/2,o=H();if(!o)return;let s=i.createScales(o.plot,j.view,v.x.reverse,v.y.reverse,v.horizontal),c=j.distance/n,d=u(j.view),f=i.toData(s,j.midX,j.midY),p=i.toData(s,r,a);v.zoom.x&&(d.x=l.zoomRange(j.view.x,f.x,c),d.x=l.panRange(d.x,(f.x-p.x)*c)),v.zoom.y&&(d.y=l.zoomRange(j.view.y,f.y,c),d.y=l.panRange(d.y,(f.y-p.y)*c)),q(d,!0);return}if(j?.kind===`point`&&a){if(!a.moved)return;j.x=e,j.y=t;let n=K(e,t);P(),n&&N(`drag`,{item:j.item,x:n.x,y:n.y});return}if(j?.kind===`pan`&&a){if(!a.moved)return;let n=H();if(!n)return;let r=u(j.view),o=i.toData(n,j.x,j.y),s=i.toData(n,e,t);v.zoom.x&&(r.x=l.panRange(j.view.x,o.x-s.x)),v.zoom.y&&(r.y=l.panRange(j.view.y,o.y-s.y)),q(r,!0);return}if(!(A.size>1)&&(!a||a.touch||!n.touch)){let r=W(e,t,!!a?.touch||!!n.touch);(r||!a?.touch)&&U(r?{event:r,x:e,y:t}:null)}},pointerUp:(e,t,n={})=>{if(O)return;let r=n.id??0,i=A.get(r);A.delete(r);let a=j;if(a?.kind===`pinch`){A.size<2&&(j=null);return}if(j=null,!i)return;if(a?.kind===`point`){if(i.moved){let n=K(e,t);P(),n&&N(`drop`,{item:a.item,x:n.x,y:n.y});return}}else if(a?.kind===`pan`&&i.moved){P();return}if(i.moved){i.touch&&P();return}let o=Date.now();if(i.touch&&o-M.time<p&&Math.hypot(e-M.x,t-M.y)<24&&b){M={time:0,x:e,y:t},Y();return}M={time:o,x:e,y:t};let s=X(e,t);if(s){V()?.legend?.toggle&&Z(s.id);return}let c=W(e,t,i.touch);if(c){i.touch&&U({event:c,x:e,y:t}),N(`click`,c);return}if(i.touch&&U(null),G(e,t)){let n=K(e,t);n&&N(`plotClick`,n)}},pointerCancel:(e={})=>{A.delete(e.id??0),(j?.kind===`point`||A.size<2)&&(j=null),P()},pointerLeave(){!j&&k&&U(null)},zoomAt:J,resetZoom:Y,getView:()=>a.viewToValues(v,y),setView(e){O||q(a.viewFromValues(v,e,y),!1)},toggleSeries:Z,clearHover(){k&&U(null)},getPlotRect(){let e=V()?.layout.plot;return e?{...e}:null},toPixel(e,t){let n=H();return n?i.toScreen(n,a.toPlotX(v,e),a.toPlotY(v,t)):null},fromPixel(e,t){let n=H();if(!n)return null;let r=i.toData(n,e,t);return{x:a.fromPlotX(v,r.x),y:a.fromPlotY(v,r.y)}},on(e,t){let n=_[e];return n||(n=new Set,_[e]=n),n.add(t),()=>{n.delete(t)}},destroy(){O=!0,A.clear();for(let e of Object.keys(_))delete _[e]}}},g=(e,t,r,i)=>{if(!r)return[0,t];let[a,o]=i[0]<=i[1]?i:[i[1],i[0]];return[Math.max(0,n.lowerBound(e,t,a)-1),Math.min(t,n.lowerBound(e,t,o)+1)]},_={heatmap:0,area:1,bar:2,boxplot:2,candlestick:3,line:4,scatter:5},v=(e,t)=>{if(!e.horizontal)return t;let n=Array(t.length);for(let e=0;e<t.length;e+=4)n[e]=t[e+1],n[e+1]=t[e],n[e+2]=t[e+3],n[e+3]=t[e+2];return n},y=(n,a={})=>{let{model:o,view:c,layout:l}=n,u=l.scales,{plot:d}=l,f=u.horizontal,p=a.maxDots??4e3,m=a.maxBars??2e3,h=Math.max(1,a.columnWidth??1),y=f?d.y:d.x,x=y+(f?d.height:d.width),S=[],C=o.series.filter(e=>!e.hidden&&e.cols.count>0).sort((e,t)=>_[e.type]-_[t.type]||e.index-t.index);for(let n of C){let{x:l,y:_,count:C,sorted:w}=n.cols;if(n.type===`line`||n.type===`area`){let[e,a]=g(l,C,w,c.x),s=n.stackTop??_,d=t.curvePoints(l,s,e,a,n.curve),p=n.stackBase?t.curvePoints(l,n.stackBase,e,a,n.curve).points:null,m=d.length,v=d.points,b=p;if(w&&m>(x-y)*2/h){if(p){let e=r.decimateMinMax(v,0,m,e=>u.xToPx(e)/h),t=new Float64Array(e.length*2),n=new Float64Array(e.length*2),i=0,a=0;for(let r=0;r<e.length;r++){let o=e.points[r*2];for(;a<m-1&&v[a*2]<o;)a++;t[i*2]=o,t[i*2+1]=e.points[r*2+1],n[i*2]=o,n[i*2+1]=p[a*2+1],i++}v=t,b=n,m=i}else{let e=r.decimateMinMax(v,0,m,e=>u.xToPx(e)/h);v=e.points,m=e.length}}let T=n.type===`area`&&!!n.cols.y0&&!!b,E=[],D=[],O=[],k=[],A=[],j=[],M=()=>{k.length&&(E.push(k),D.push(A),T&&O.push(j)),k=[],A=[],j=[]};for(let e=0;e<m;e++){let t=v[e*2],n=v[e*2+1],r=b?b[e*2+1]:0;if(!Number.isFinite(t)||!Number.isFinite(n)||!Number.isFinite(r)){M();continue}let a=i.toScreen(u,t,n);if(k.push(a.x,a.y),b&&A.push(u.yToPx(r)),T){let e=i.toScreen(u,t,r);j.push(e.x,e.y)}}if(M(),n.type===`area`&&S.push({kind:`area`,seriesIndex:n.index,color:n.colorCss,opacity:n.opacity,baseline:u.yToPx(o.baseline),segments:E,...b?{bottoms:D}:{},...f?{horizontal:!0}:{}}),n.lineWidth>0){let e=n.type===`area`?Math.min(n.lineWidth,2):n.lineWidth;S.push({kind:`line`,seriesIndex:n.index,color:n.colorCss,width:e,segments:E}),T&&S.push({kind:`line`,seriesIndex:n.index,color:n.colorCss,width:e,segments:O})}continue}if(n.type===`bar`&&n.barBase&&n.barTop){let[t,r]=g(l,C,w,c.x),i=Math.max(n.barHalfWidth/Math.abs(u.xPerPx),.5),a=[],o=[],s=r-t>m,d=NaN;for(let c=t;c<r;c++){let t=n.barBase[c],r=n.barTop[c];if(!Number.isFinite(t)||!Number.isFinite(r))continue;let f=u.xToPx(l[c]+n.barOffset);if(f+i<y||f-i>x)continue;let p=u.yToPx(t),m=u.yToPx(r),h=Math.min(p,m),g=Math.max(1,Math.abs(p-m)),_=Math.floor(f);if(s&&_===d&&a.length){let e=a.length-4,t=Math.max(a[e+1]+a[e+3],h+g);a[e+1]=Math.min(a[e+1],h),a[e+3]=t-a[e+1];continue}d=_,a.push(f-i,h,i*2,g);let v=n.pointColors?.[c];o.push(v?e.toCss(v):n.colorCss)}S.push({kind:`bars`,seriesIndex:n.index,color:n.colorCss,rects:v(u,a),...n.pointColors?{colors:o}:{},radius:n.radius,...n.opacity<1?{opacity:n.opacity}:{}});continue}if(n.type===`boxplot`){S.push(...b(n,u,c.x,y,x,m));continue}if(n.type===`candlestick`){let[t,r]=g(l,C,w,c.x),{open:i,high:a,low:o}=n.cols,s=Math.max(n.barHalfWidth/Math.abs(u.xPerPx),1),d=e.toCss(n.upColor),f=e.toCss(n.downColor),p=[],h=[],b=[],T=[],E=Math.max(1,Math.ceil((r-t)/m));for(let e=t;e<r;e+=E){let t=_[e],n=i?i[e]:t;if(!Number.isFinite(t)||!Number.isFinite(n))continue;let r=u.xToPx(l[e]);if(r+s<y||r-s>x)continue;let c=t<n?f:d,m=u.yToPx(a?a[e]:Math.max(n,t)),g=u.yToPx(o?o[e]:Math.min(n,t));p.push(r-.5,Math.min(m,g),1,Math.abs(g-m)),b.push(c);let v=u.yToPx(n),S=u.yToPx(t);h.push(r-s,Math.min(v,S),s*2,Math.max(1,Math.abs(v-S))),T.push(c)}S.push({kind:`bars`,seriesIndex:n.index,color:d,rects:v(u,p),colors:b},{kind:`bars`,seriesIndex:n.index,color:d,rects:v(u,h),colors:T,radius:1});continue}if(n.type===`heatmap`){let t=Math.abs(n.cellHalf.x/u.xPerPx),r=Math.abs(n.cellHalf.y/u.yPerPx),a=[],o=[],s=i.heatCellStyle(t*2,r*2,n.radius),c=s.inset;for(let s=0;s<C&&a.length/4<m*4;s++){let f=n.cellColors?.[s];if(!f)continue;let p=i.screenRect(u,u.xToPx(l[s])-t,u.xToPx(l[s])+t,u.yToPx(_[s])-r,u.yToPx(_[s])+r);p.x+p.width<d.x||p.x>d.x+d.width||p.y+p.height<d.y||p.y>d.y+d.height||(a.push(p.x+c,p.y+c,p.width-c*2,p.height-c*2),o.push(e.toCss(e.unpackColor(f))))}S.push({kind:`bars`,seriesIndex:n.index,color:n.colorCss,rects:a,colors:o,radius:s.radius});continue}let T=[],E=[],D=t=>{let r=n.pointColors?.[t];return r?e.toCss(r):n.colorCss},O=[],k=[];for(let e=0;e<C;e++){let t=l[e],n=_[e];if(!Number.isFinite(t)||!Number.isFinite(n))continue;let r=i.toScreen(u,t,n);r.x<d.x||r.x>d.x+d.width||r.y<d.y||r.y>d.y+d.height||(O.push(e),k.push(r.x,r.y))}if(O.length>p){let e=Math.max(2,a.dotCell??n.pointSize*.8),t=Math.ceil(d.width/e)+1,r=new Map;O.forEach((n,i)=>{let a=Math.floor((k[i*2]-d.x)/e),o=Math.floor((k[i*2+1]-d.y)/e);r.set(o*t+a,n)});for(let[n,i]of r)T.push(d.x+(n%t+.5)*e,d.y+(Math.floor(n/t)+.5)*e,e),E.push(D(i))}else O.forEach((e,t)=>{T.push(k[t*2],k[t*2+1],s.dotSize(n,e)),E.push(D(e))});S.push({kind:`dots`,seriesIndex:n.index,opacity:n.opacity,dots:T,colors:E})}return S},b=(t,n,r,i,a,o)=>{let{x:s,y:c,count:l,sorted:u,high:d,low:f,q1:p,q3:m,outliers:h}=t.cols,[_,y]=g(s,l,u,r),b=Math.max(t.barHalfWidth/Math.abs(n.xPerPx),1),x=Math.max(1,t.lineWidth),S=[],C=[],w=[],T=[],E=[],D=[],O=Math.max(1,Math.ceil((y-_)/o)),k=(e,t,n)=>{C.push(e-x/2,Math.min(t,n),x,Math.abs(t-n))},A=(e,t,n,r=x)=>{C.push(e-t,n-r/2,t*2,r)};for(let r=_;r<y;r+=O){let o=c[r];if(!Number.isFinite(o))continue;let l=n.xToPx(s[r]+t.barOffset);if(l+b<i||l-b>a)continue;let u=t.pointColors?.[r],g=u?e.toCss(u):t.colorCss,_=n.yToPx(f&&Number.isFinite(f[r])?f[r]:o),v=n.yToPx(d&&Number.isFinite(d[r])?d[r]:o),y=n.yToPx(p&&Number.isFinite(p[r])?p[r]:o),O=n.yToPx(m&&Number.isFinite(m[r])?m[r]:o),j=C.length;S.push(l-b,Math.min(y,O),b*2,Math.abs(y-O)),w.push(g),k(l,_,y),k(l,O,v),k(l-b,y,O),k(l+b,y,O),A(l,b/2,_),A(l,b/2,v),A(l,b,y),A(l,b,O),A(l,b,n.yToPx(o),Math.max(2,x*1.6));for(let e=j;e<C.length;e+=4)T.push(g);let M=h?.[r];if(M)for(let e of M){let r=n.horizontal?{x:n.yToPx(e),y:l}:{x:l,y:n.yToPx(e)};E.push(r.x,r.y,t.outlierSize),D.push(g)}}let j=[{kind:`bars`,seriesIndex:t.index,color:t.colorCss,rects:v(n,S),colors:w,opacity:t.opacity},{kind:`bars`,seriesIndex:t.index,color:t.colorCss,rects:v(n,C),colors:T}];return E.length&&j.push({kind:`dots`,seriesIndex:t.index,opacity:t.outlierShape===`hollow`?0:.85,dots:E,colors:D,stroke:1.25}),j};exports.createChartController=h,exports.scenePrimitives=y;
3
3
  //# sourceMappingURL=controller.cjs.map
@@ -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_color","require_curve","require_data","require_decimate","require_layout","require_model","require_overlay","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_color","require_curve","require_data","require_decimate","require_layout","require_model","require_overlay","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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"}