minerva-design 1.4.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 (824) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +21 -21
  3. package/custom-elements.json +3072 -611
  4. package/dist/angular/fesm2022/minerva-angular.mjs +1491 -5
  5. package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
  6. package/dist/angular/types/minerva-angular.d.ts +595 -5
  7. package/dist/charts/canvas.d.cts +4 -3
  8. package/dist/charts/canvas.d.ts +4 -3
  9. package/dist/charts/core.cjs +1 -1
  10. package/dist/charts/core.d.cts +6 -4
  11. package/dist/charts/core.d.ts +6 -4
  12. package/dist/charts/core.js +24 -16
  13. package/dist/charts/engine/axis.cjs +1 -1
  14. package/dist/charts/engine/axis.cjs.map +1 -1
  15. package/dist/charts/engine/axis.js +42 -19
  16. package/dist/charts/engine/axis.js.map +1 -1
  17. package/dist/charts/engine/canvas.cjs +1 -1
  18. package/dist/charts/engine/canvas.cjs.map +1 -1
  19. package/dist/charts/engine/canvas.js +155 -127
  20. package/dist/charts/engine/canvas.js.map +1 -1
  21. package/dist/charts/engine/chart.cjs +1 -1
  22. package/dist/charts/engine/chart.cjs.map +1 -1
  23. package/dist/charts/engine/chart.js +370 -255
  24. package/dist/charts/engine/chart.js.map +1 -1
  25. package/dist/charts/engine/color.cjs +1 -1
  26. package/dist/charts/engine/color.cjs.map +1 -1
  27. package/dist/charts/engine/color.d.cts +18 -0
  28. package/dist/charts/engine/color.d.ts +18 -0
  29. package/dist/charts/engine/color.js +48 -2
  30. package/dist/charts/engine/color.js.map +1 -1
  31. package/dist/charts/engine/controller.cjs +2 -2
  32. package/dist/charts/engine/controller.cjs.map +1 -1
  33. package/dist/charts/engine/controller.d.cts +34 -1
  34. package/dist/charts/engine/controller.d.ts +34 -1
  35. package/dist/charts/engine/controller.js +318 -273
  36. package/dist/charts/engine/controller.js.map +1 -1
  37. package/dist/charts/engine/data.cjs +1 -1
  38. package/dist/charts/engine/data.cjs.map +1 -1
  39. package/dist/charts/engine/data.d.cts +3 -1
  40. package/dist/charts/engine/data.d.ts +3 -1
  41. package/dist/charts/engine/data.js +6 -4
  42. package/dist/charts/engine/data.js.map +1 -1
  43. package/dist/charts/engine/defaults.cjs +2 -0
  44. package/dist/charts/engine/defaults.cjs.map +1 -0
  45. package/dist/charts/engine/defaults.d.cts +20 -0
  46. package/dist/charts/engine/defaults.d.ts +20 -0
  47. package/dist/charts/engine/defaults.js +35 -0
  48. package/dist/charts/engine/defaults.js.map +1 -0
  49. package/dist/charts/engine/format.cjs +1 -1
  50. package/dist/charts/engine/format.cjs.map +1 -1
  51. package/dist/charts/engine/format.d.cts +6 -0
  52. package/dist/charts/engine/format.d.ts +6 -0
  53. package/dist/charts/engine/format.js +15 -2
  54. package/dist/charts/engine/format.js.map +1 -1
  55. package/dist/charts/engine/graph/chart.cjs +2 -0
  56. package/dist/charts/engine/graph/chart.cjs.map +1 -0
  57. package/dist/charts/engine/graph/chart.d.cts +3 -0
  58. package/dist/charts/engine/graph/chart.d.ts +3 -0
  59. package/dist/charts/engine/graph/chart.js +1708 -0
  60. package/dist/charts/engine/graph/chart.js.map +1 -0
  61. package/dist/charts/engine/graph/circular.cjs +2 -0
  62. package/dist/charts/engine/graph/circular.cjs.map +1 -0
  63. package/dist/charts/engine/graph/circular.d.cts +16 -0
  64. package/dist/charts/engine/graph/circular.d.ts +16 -0
  65. package/dist/charts/engine/graph/circular.js +62 -0
  66. package/dist/charts/engine/graph/circular.js.map +1 -0
  67. package/dist/charts/engine/graph/dag.cjs +2 -0
  68. package/dist/charts/engine/graph/dag.cjs.map +1 -0
  69. package/dist/charts/engine/graph/dag.d.cts +34 -0
  70. package/dist/charts/engine/graph/dag.d.ts +34 -0
  71. package/dist/charts/engine/graph/dag.js +339 -0
  72. package/dist/charts/engine/graph/dag.js.map +1 -0
  73. package/dist/charts/engine/graph/dom.cjs +2 -0
  74. package/dist/charts/engine/graph/dom.cjs.map +1 -0
  75. package/dist/charts/engine/graph/dom.d.cts +23 -0
  76. package/dist/charts/engine/graph/dom.d.ts +23 -0
  77. package/dist/charts/engine/graph/dom.js +158 -0
  78. package/dist/charts/engine/graph/dom.js.map +1 -0
  79. package/dist/charts/engine/graph/force.cjs +2 -0
  80. package/dist/charts/engine/graph/force.cjs.map +1 -0
  81. package/dist/charts/engine/graph/force.d.cts +76 -0
  82. package/dist/charts/engine/graph/force.d.ts +76 -0
  83. package/dist/charts/engine/graph/force.js +423 -0
  84. package/dist/charts/engine/graph/force.js.map +1 -0
  85. package/dist/charts/engine/graph/geometry.cjs +2 -0
  86. package/dist/charts/engine/graph/geometry.cjs.map +1 -0
  87. package/dist/charts/engine/graph/geometry.d.cts +50 -0
  88. package/dist/charts/engine/graph/geometry.d.ts +50 -0
  89. package/dist/charts/engine/graph/geometry.js +197 -0
  90. package/dist/charts/engine/graph/geometry.js.map +1 -0
  91. package/dist/charts/engine/graph/index.cjs +1 -0
  92. package/dist/charts/engine/graph/index.d.cts +6 -0
  93. package/dist/charts/engine/graph/index.d.ts +6 -0
  94. package/dist/charts/engine/graph/index.js +6 -0
  95. package/dist/charts/engine/graph/labels.cjs +2 -0
  96. package/dist/charts/engine/graph/labels.cjs.map +1 -0
  97. package/dist/charts/engine/graph/labels.d.cts +12 -0
  98. package/dist/charts/engine/graph/labels.d.ts +12 -0
  99. package/dist/charts/engine/graph/labels.js +128 -0
  100. package/dist/charts/engine/graph/labels.js.map +1 -0
  101. package/dist/charts/engine/graph/model.cjs +2 -0
  102. package/dist/charts/engine/graph/model.cjs.map +1 -0
  103. package/dist/charts/engine/graph/model.d.cts +52 -0
  104. package/dist/charts/engine/graph/model.d.ts +52 -0
  105. package/dist/charts/engine/graph/model.js +108 -0
  106. package/dist/charts/engine/graph/model.js.map +1 -0
  107. package/dist/charts/engine/graph/sizing.cjs +2 -0
  108. package/dist/charts/engine/graph/sizing.cjs.map +1 -0
  109. package/dist/charts/engine/graph/sizing.d.cts +33 -0
  110. package/dist/charts/engine/graph/sizing.d.ts +33 -0
  111. package/dist/charts/engine/graph/sizing.js +60 -0
  112. package/dist/charts/engine/graph/sizing.js.map +1 -0
  113. package/dist/charts/engine/graph/tree.cjs +2 -0
  114. package/dist/charts/engine/graph/tree.cjs.map +1 -0
  115. package/dist/charts/engine/graph/tree.d.cts +30 -0
  116. package/dist/charts/engine/graph/tree.d.ts +30 -0
  117. package/dist/charts/engine/graph/tree.js +218 -0
  118. package/dist/charts/engine/graph/tree.js.map +1 -0
  119. package/dist/charts/engine/graph/types.d.cts +640 -0
  120. package/dist/charts/engine/graph/types.d.ts +640 -0
  121. package/dist/charts/engine/graph/worker.cjs +52 -0
  122. package/dist/charts/engine/graph/worker.cjs.map +1 -0
  123. package/dist/charts/engine/graph/worker.d.cts +36 -0
  124. package/dist/charts/engine/graph/worker.d.ts +36 -0
  125. package/dist/charts/engine/graph/worker.js +135 -0
  126. package/dist/charts/engine/graph/worker.js.map +1 -0
  127. package/dist/charts/engine/items.cjs +1 -1
  128. package/dist/charts/engine/items.cjs.map +1 -1
  129. package/dist/charts/engine/items.d.cts +15 -2
  130. package/dist/charts/engine/items.d.ts +15 -2
  131. package/dist/charts/engine/items.js +131 -112
  132. package/dist/charts/engine/items.js.map +1 -1
  133. package/dist/charts/engine/labels.cjs +1 -1
  134. package/dist/charts/engine/labels.cjs.map +1 -1
  135. package/dist/charts/engine/labels.d.cts +17 -0
  136. package/dist/charts/engine/labels.d.ts +17 -0
  137. package/dist/charts/engine/labels.js +28 -4
  138. package/dist/charts/engine/labels.js.map +1 -1
  139. package/dist/charts/engine/layout.cjs +1 -1
  140. package/dist/charts/engine/layout.cjs.map +1 -1
  141. package/dist/charts/engine/layout.d.cts +9 -0
  142. package/dist/charts/engine/layout.d.ts +9 -0
  143. package/dist/charts/engine/layout.js +11 -2
  144. package/dist/charts/engine/layout.js.map +1 -1
  145. package/dist/charts/engine/model.cjs +1 -1
  146. package/dist/charts/engine/model.cjs.map +1 -1
  147. package/dist/charts/engine/model.d.cts +73 -3
  148. package/dist/charts/engine/model.d.ts +73 -3
  149. package/dist/charts/engine/model.js +258 -154
  150. package/dist/charts/engine/model.js.map +1 -1
  151. package/dist/charts/engine/orderbook/field.cjs +37 -0
  152. package/dist/charts/engine/orderbook/field.cjs.map +1 -0
  153. package/dist/charts/engine/orderbook/field.d.cts +92 -0
  154. package/dist/charts/engine/orderbook/field.d.ts +92 -0
  155. package/dist/charts/engine/orderbook/field.js +297 -0
  156. package/dist/charts/engine/orderbook/field.js.map +1 -0
  157. package/dist/charts/engine/orderbook/format.cjs +1 -1
  158. package/dist/charts/engine/orderbook/format.cjs.map +1 -1
  159. package/dist/charts/engine/orderbook/format.d.cts +3 -2
  160. package/dist/charts/engine/orderbook/format.d.ts +3 -2
  161. package/dist/charts/engine/orderbook/format.js +5 -5
  162. package/dist/charts/engine/orderbook/format.js.map +1 -1
  163. package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
  164. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
  165. package/dist/charts/engine/orderbook/heatmap.js +566 -475
  166. package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
  167. package/dist/charts/engine/orderbook/host.cjs +1 -1
  168. package/dist/charts/engine/orderbook/host.cjs.map +1 -1
  169. package/dist/charts/engine/orderbook/host.d.cts +8 -1
  170. package/dist/charts/engine/orderbook/host.d.ts +8 -1
  171. package/dist/charts/engine/orderbook/host.js +27 -5
  172. package/dist/charts/engine/orderbook/host.js.map +1 -1
  173. package/dist/charts/engine/orderbook/ladder.cjs +1 -1
  174. package/dist/charts/engine/orderbook/ladder.cjs.map +1 -1
  175. package/dist/charts/engine/orderbook/ladder.js +1 -1
  176. package/dist/charts/engine/orderbook/ladder.js.map +1 -1
  177. package/dist/charts/engine/orderbook/layout.cjs +2 -0
  178. package/dist/charts/engine/orderbook/layout.cjs.map +1 -0
  179. package/dist/charts/engine/orderbook/layout.d.cts +42 -0
  180. package/dist/charts/engine/orderbook/layout.d.ts +42 -0
  181. package/dist/charts/engine/orderbook/layout.js +76 -0
  182. package/dist/charts/engine/orderbook/layout.js.map +1 -0
  183. package/dist/charts/engine/orderbook/tape.cjs +1 -1
  184. package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
  185. package/dist/charts/engine/orderbook/tape.js +4 -4
  186. package/dist/charts/engine/orderbook/tape.js.map +1 -1
  187. package/dist/charts/engine/orderbook/types.d.cts +27 -3
  188. package/dist/charts/engine/orderbook/types.d.ts +27 -3
  189. package/dist/charts/engine/overlay.cjs +1 -1
  190. package/dist/charts/engine/overlay.cjs.map +1 -1
  191. package/dist/charts/engine/overlay.d.cts +27 -0
  192. package/dist/charts/engine/overlay.d.ts +27 -0
  193. package/dist/charts/engine/overlay.js +34 -12
  194. package/dist/charts/engine/overlay.js.map +1 -1
  195. package/dist/charts/engine/presets.cjs +2 -2
  196. package/dist/charts/engine/presets.cjs.map +1 -1
  197. package/dist/charts/engine/presets.d.cts +35 -3
  198. package/dist/charts/engine/presets.d.ts +35 -3
  199. package/dist/charts/engine/presets.js +121 -101
  200. package/dist/charts/engine/presets.js.map +1 -1
  201. package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
  202. package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
  203. package/dist/charts/engine/renderers/canvas2d.js +13 -9
  204. package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
  205. package/dist/charts/engine/renderers/detect.cjs +1 -1
  206. package/dist/charts/engine/renderers/detect.cjs.map +1 -1
  207. package/dist/charts/engine/renderers/detect.d.cts +2 -1
  208. package/dist/charts/engine/renderers/detect.d.ts +2 -1
  209. package/dist/charts/engine/renderers/detect.js +23 -21
  210. package/dist/charts/engine/renderers/detect.js.map +1 -1
  211. package/dist/charts/engine/renderers/follow.cjs +2 -0
  212. package/dist/charts/engine/renderers/follow.cjs.map +1 -0
  213. package/dist/charts/engine/renderers/follow.d.cts +8 -0
  214. package/dist/charts/engine/renderers/follow.d.ts +8 -0
  215. package/dist/charts/engine/renderers/follow.js +10 -0
  216. package/dist/charts/engine/renderers/follow.js.map +1 -0
  217. package/dist/charts/engine/renderers/gl-budget.cjs +2 -0
  218. package/dist/charts/engine/renderers/gl-budget.cjs.map +1 -0
  219. package/dist/charts/engine/renderers/gl-budget.d.cts +32 -0
  220. package/dist/charts/engine/renderers/gl-budget.d.ts +32 -0
  221. package/dist/charts/engine/renderers/gl-budget.js +95 -0
  222. package/dist/charts/engine/renderers/gl-budget.js.map +1 -0
  223. package/dist/charts/engine/renderers/gl.cjs +1 -1
  224. package/dist/charts/engine/renderers/gl.cjs.map +1 -1
  225. package/dist/charts/engine/renderers/gl.js +1 -1
  226. package/dist/charts/engine/renderers/gl.js.map +1 -1
  227. package/dist/charts/engine/renderers/shaders.cjs +9 -6
  228. package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
  229. package/dist/charts/engine/renderers/shaders.d.cts +1 -1
  230. package/dist/charts/engine/renderers/shaders.d.ts +1 -1
  231. package/dist/charts/engine/renderers/shaders.js +9 -6
  232. package/dist/charts/engine/renderers/shaders.js.map +1 -1
  233. package/dist/charts/engine/renderers/types.cjs.map +1 -1
  234. package/dist/charts/engine/renderers/types.d.cts +2 -0
  235. package/dist/charts/engine/renderers/types.d.ts +2 -0
  236. package/dist/charts/engine/renderers/types.js.map +1 -1
  237. package/dist/charts/engine/renderers/webgl.cjs +1 -1
  238. package/dist/charts/engine/renderers/webgl.cjs.map +1 -1
  239. package/dist/charts/engine/renderers/webgl.js +85 -64
  240. package/dist/charts/engine/renderers/webgl.js.map +1 -1
  241. package/dist/charts/engine/renderers/webgl2.cjs +1 -1
  242. package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
  243. package/dist/charts/engine/renderers/webgl2.js +72 -58
  244. package/dist/charts/engine/renderers/webgl2.js.map +1 -1
  245. package/dist/charts/engine/renderers/webgpu.cjs +1 -1
  246. package/dist/charts/engine/renderers/webgpu.cjs.map +1 -1
  247. package/dist/charts/engine/renderers/webgpu.js +1 -1
  248. package/dist/charts/engine/renderers/webgpu.js.map +1 -1
  249. package/dist/charts/engine/scene.cjs +1 -1
  250. package/dist/charts/engine/scene.cjs.map +1 -1
  251. package/dist/charts/engine/scene.d.cts +104 -4
  252. package/dist/charts/engine/scene.d.ts +104 -4
  253. package/dist/charts/engine/scene.js +412 -193
  254. package/dist/charts/engine/scene.js.map +1 -1
  255. package/dist/charts/engine/shapes/bullet.cjs +1 -1
  256. package/dist/charts/engine/shapes/bullet.cjs.map +1 -1
  257. package/dist/charts/engine/shapes/bullet.js +110 -110
  258. package/dist/charts/engine/shapes/bullet.js.map +1 -1
  259. package/dist/charts/engine/shapes/chart.cjs +1 -1
  260. package/dist/charts/engine/shapes/chart.cjs.map +1 -1
  261. package/dist/charts/engine/shapes/chart.js +4 -1
  262. package/dist/charts/engine/shapes/chart.js.map +1 -1
  263. package/dist/charts/engine/shapes/chord.cjs +2 -0
  264. package/dist/charts/engine/shapes/chord.cjs.map +1 -0
  265. package/dist/charts/engine/shapes/chord.d.cts +18 -0
  266. package/dist/charts/engine/shapes/chord.d.ts +18 -0
  267. package/dist/charts/engine/shapes/chord.js +419 -0
  268. package/dist/charts/engine/shapes/chord.js.map +1 -0
  269. package/dist/charts/engine/shapes/draw.cjs +1 -1
  270. package/dist/charts/engine/shapes/draw.cjs.map +1 -1
  271. package/dist/charts/engine/shapes/draw.d.cts +5 -1
  272. package/dist/charts/engine/shapes/draw.d.ts +5 -1
  273. package/dist/charts/engine/shapes/draw.js +47 -17
  274. package/dist/charts/engine/shapes/draw.js.map +1 -1
  275. package/dist/charts/engine/shapes/hit.cjs +1 -1
  276. package/dist/charts/engine/shapes/hit.cjs.map +1 -1
  277. package/dist/charts/engine/shapes/hit.d.cts +3 -1
  278. package/dist/charts/engine/shapes/hit.d.ts +3 -1
  279. package/dist/charts/engine/shapes/hit.js +75 -46
  280. package/dist/charts/engine/shapes/hit.js.map +1 -1
  281. package/dist/charts/engine/shapes/index.d.cts +3 -2
  282. package/dist/charts/engine/shapes/index.d.ts +3 -2
  283. package/dist/charts/engine/shapes/labels.cjs +1 -1
  284. package/dist/charts/engine/shapes/labels.cjs.map +1 -1
  285. package/dist/charts/engine/shapes/labels.js +12 -4
  286. package/dist/charts/engine/shapes/labels.js.map +1 -1
  287. package/dist/charts/engine/shapes/layout.cjs +2 -2
  288. package/dist/charts/engine/shapes/layout.cjs.map +1 -1
  289. package/dist/charts/engine/shapes/layout.d.cts +3 -1
  290. package/dist/charts/engine/shapes/layout.d.ts +3 -1
  291. package/dist/charts/engine/shapes/layout.js +106 -78
  292. package/dist/charts/engine/shapes/layout.js.map +1 -1
  293. package/dist/charts/engine/shapes/scene.cjs +1 -1
  294. package/dist/charts/engine/shapes/scene.cjs.map +1 -1
  295. package/dist/charts/engine/shapes/scene.d.cts +33 -3
  296. package/dist/charts/engine/shapes/scene.d.ts +33 -3
  297. package/dist/charts/engine/shapes/scene.js +62 -19
  298. package/dist/charts/engine/shapes/scene.js.map +1 -1
  299. package/dist/charts/engine/shapes/types.d.cts +121 -8
  300. package/dist/charts/engine/shapes/types.d.ts +121 -8
  301. package/dist/charts/engine/signature.cjs +1 -1
  302. package/dist/charts/engine/signature.cjs.map +1 -1
  303. package/dist/charts/engine/signature.js +1 -1
  304. package/dist/charts/engine/signature.js.map +1 -1
  305. package/dist/charts/engine/three-d/canvas2d.cjs +1 -1
  306. package/dist/charts/engine/three-d/canvas2d.cjs.map +1 -1
  307. package/dist/charts/engine/three-d/canvas2d.d.cts +41 -3
  308. package/dist/charts/engine/three-d/canvas2d.d.ts +41 -3
  309. package/dist/charts/engine/three-d/canvas2d.js +166 -67
  310. package/dist/charts/engine/three-d/canvas2d.js.map +1 -1
  311. package/dist/charts/engine/three-d/chart.cjs +1 -1
  312. package/dist/charts/engine/three-d/chart.cjs.map +1 -1
  313. package/dist/charts/engine/three-d/chart.js +219 -215
  314. package/dist/charts/engine/three-d/chart.js.map +1 -1
  315. package/dist/charts/engine/three-d/detect.cjs +1 -1
  316. package/dist/charts/engine/three-d/detect.cjs.map +1 -1
  317. package/dist/charts/engine/three-d/detect.d.cts +3 -2
  318. package/dist/charts/engine/three-d/detect.d.ts +3 -2
  319. package/dist/charts/engine/three-d/detect.js +22 -20
  320. package/dist/charts/engine/three-d/detect.js.map +1 -1
  321. package/dist/charts/engine/three-d/geometry.cjs +1 -1
  322. package/dist/charts/engine/three-d/geometry.cjs.map +1 -1
  323. package/dist/charts/engine/three-d/geometry.d.cts +6 -0
  324. package/dist/charts/engine/three-d/geometry.d.ts +6 -0
  325. package/dist/charts/engine/three-d/geometry.js +106 -90
  326. package/dist/charts/engine/three-d/geometry.js.map +1 -1
  327. package/dist/charts/engine/three-d/model.cjs +1 -1
  328. package/dist/charts/engine/three-d/model.cjs.map +1 -1
  329. package/dist/charts/engine/three-d/model.d.cts +2 -0
  330. package/dist/charts/engine/three-d/model.d.ts +2 -0
  331. package/dist/charts/engine/three-d/model.js +2 -0
  332. package/dist/charts/engine/three-d/model.js.map +1 -1
  333. package/dist/charts/engine/three-d/oit.cjs +109 -0
  334. package/dist/charts/engine/three-d/oit.cjs.map +1 -0
  335. package/dist/charts/engine/three-d/oit.d.cts +34 -0
  336. package/dist/charts/engine/three-d/oit.d.ts +34 -0
  337. package/dist/charts/engine/three-d/oit.js +111 -0
  338. package/dist/charts/engine/three-d/oit.js.map +1 -0
  339. package/dist/charts/engine/three-d/overlay.cjs +1 -1
  340. package/dist/charts/engine/three-d/overlay.cjs.map +1 -1
  341. package/dist/charts/engine/three-d/overlay.js +43 -36
  342. package/dist/charts/engine/three-d/overlay.js.map +1 -1
  343. package/dist/charts/engine/three-d/render-types.cjs +1 -1
  344. package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
  345. package/dist/charts/engine/three-d/render-types.d.cts +37 -3
  346. package/dist/charts/engine/three-d/render-types.d.ts +37 -3
  347. package/dist/charts/engine/three-d/render-types.js +6 -10
  348. package/dist/charts/engine/three-d/render-types.js.map +1 -1
  349. package/dist/charts/engine/three-d/shaders.cjs +109 -48
  350. package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
  351. package/dist/charts/engine/three-d/shaders.d.cts +12 -5
  352. package/dist/charts/engine/three-d/shaders.d.ts +12 -5
  353. package/dist/charts/engine/three-d/shaders.js +118 -55
  354. package/dist/charts/engine/three-d/shaders.js.map +1 -1
  355. package/dist/charts/engine/three-d/sort.cjs +1 -1
  356. package/dist/charts/engine/three-d/sort.cjs.map +1 -1
  357. package/dist/charts/engine/three-d/sort.d.cts +18 -5
  358. package/dist/charts/engine/three-d/sort.d.ts +18 -5
  359. package/dist/charts/engine/three-d/sort.js +129 -43
  360. package/dist/charts/engine/three-d/sort.js.map +1 -1
  361. package/dist/charts/engine/three-d/types.d.cts +36 -0
  362. package/dist/charts/engine/three-d/types.d.ts +36 -0
  363. package/dist/charts/engine/three-d/webgl.cjs +1 -1
  364. package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
  365. package/dist/charts/engine/three-d/webgl.d.cts +9 -0
  366. package/dist/charts/engine/three-d/webgl.d.ts +9 -0
  367. package/dist/charts/engine/three-d/webgl.js +199 -74
  368. package/dist/charts/engine/three-d/webgl.js.map +1 -1
  369. package/dist/charts/engine/three-d/webgpu.cjs +1 -1
  370. package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
  371. package/dist/charts/engine/three-d/webgpu.js +231 -94
  372. package/dist/charts/engine/three-d/webgpu.js.map +1 -1
  373. package/dist/charts/engine/trading/chart.cjs +1 -1
  374. package/dist/charts/engine/trading/chart.cjs.map +1 -1
  375. package/dist/charts/engine/trading/chart.d.cts +10 -1
  376. package/dist/charts/engine/trading/chart.d.ts +10 -1
  377. package/dist/charts/engine/trading/chart.js +1677 -813
  378. package/dist/charts/engine/trading/chart.js.map +1 -1
  379. package/dist/charts/engine/trading/drawings.cjs +2 -1
  380. package/dist/charts/engine/trading/drawings.cjs.map +1 -1
  381. package/dist/charts/engine/trading/drawings.d.cts +53 -9
  382. package/dist/charts/engine/trading/drawings.d.ts +53 -9
  383. package/dist/charts/engine/trading/drawings.js +346 -71
  384. package/dist/charts/engine/trading/drawings.js.map +1 -1
  385. package/dist/charts/engine/trading/format.cjs +1 -1
  386. package/dist/charts/engine/trading/format.cjs.map +1 -1
  387. package/dist/charts/engine/trading/format.d.cts +19 -0
  388. package/dist/charts/engine/trading/format.d.ts +19 -0
  389. package/dist/charts/engine/trading/format.js +65 -21
  390. package/dist/charts/engine/trading/format.js.map +1 -1
  391. package/dist/charts/engine/trading/geometry.cjs +1 -1
  392. package/dist/charts/engine/trading/geometry.cjs.map +1 -1
  393. package/dist/charts/engine/trading/geometry.d.cts +16 -0
  394. package/dist/charts/engine/trading/geometry.d.ts +16 -0
  395. package/dist/charts/engine/trading/geometry.js +19 -4
  396. package/dist/charts/engine/trading/geometry.js.map +1 -1
  397. package/dist/charts/engine/trading/index.cjs +1 -1
  398. package/dist/charts/engine/trading/index.d.cts +2 -1
  399. package/dist/charts/engine/trading/index.d.ts +2 -1
  400. package/dist/charts/engine/trading/index.js +4 -3
  401. package/dist/charts/engine/trading/indicators.cjs +1 -1
  402. package/dist/charts/engine/trading/indicators.cjs.map +1 -1
  403. package/dist/charts/engine/trading/indicators.d.cts +180 -10
  404. package/dist/charts/engine/trading/indicators.d.ts +180 -10
  405. package/dist/charts/engine/trading/indicators.js +449 -173
  406. package/dist/charts/engine/trading/indicators.js.map +1 -1
  407. package/dist/charts/engine/trading/labels.cjs +1 -1
  408. package/dist/charts/engine/trading/labels.cjs.map +1 -1
  409. package/dist/charts/engine/trading/labels.js +104 -4
  410. package/dist/charts/engine/trading/labels.js.map +1 -1
  411. package/dist/charts/engine/trading/store.cjs +1 -1
  412. package/dist/charts/engine/trading/store.cjs.map +1 -1
  413. package/dist/charts/engine/trading/store.d.cts +21 -0
  414. package/dist/charts/engine/trading/store.d.ts +21 -0
  415. package/dist/charts/engine/trading/store.js +22 -1
  416. package/dist/charts/engine/trading/store.js.map +1 -1
  417. package/dist/charts/engine/trading/studies.cjs +1 -1
  418. package/dist/charts/engine/trading/studies.cjs.map +1 -1
  419. package/dist/charts/engine/trading/studies.d.cts +49 -8
  420. package/dist/charts/engine/trading/studies.d.ts +49 -8
  421. package/dist/charts/engine/trading/studies.js +352 -93
  422. package/dist/charts/engine/trading/studies.js.map +1 -1
  423. package/dist/charts/engine/trading/sync.cjs +2 -0
  424. package/dist/charts/engine/trading/sync.cjs.map +1 -0
  425. package/dist/charts/engine/trading/sync.d.cts +8 -0
  426. package/dist/charts/engine/trading/sync.d.ts +8 -0
  427. package/dist/charts/engine/trading/sync.js +25 -0
  428. package/dist/charts/engine/trading/sync.js.map +1 -0
  429. package/dist/charts/engine/trading/types.d.cts +514 -16
  430. package/dist/charts/engine/trading/types.d.ts +514 -16
  431. package/dist/charts/engine/types.d.cts +106 -11
  432. package/dist/charts/engine/types.d.ts +106 -11
  433. package/dist/charts/index.cjs +1 -1
  434. package/dist/charts/index.d.cts +3 -2
  435. package/dist/charts/index.d.ts +3 -2
  436. package/dist/charts/index.js +30 -22
  437. package/dist/charts/react/charts.cjs +1 -1
  438. package/dist/charts/react/charts.cjs.map +1 -1
  439. package/dist/charts/react/charts.js +51 -34
  440. package/dist/charts/react/charts.js.map +1 -1
  441. package/dist/charts/react/graph.cjs +2 -0
  442. package/dist/charts/react/graph.cjs.map +1 -0
  443. package/dist/charts/react/graph.d.cts +219 -0
  444. package/dist/charts/react/graph.d.ts +219 -0
  445. package/dist/charts/react/graph.js +160 -0
  446. package/dist/charts/react/graph.js.map +1 -0
  447. package/dist/charts/react/orderbook.cjs +1 -1
  448. package/dist/charts/react/orderbook.cjs.map +1 -1
  449. package/dist/charts/react/orderbook.d.cts +3 -1
  450. package/dist/charts/react/orderbook.d.ts +3 -1
  451. package/dist/charts/react/orderbook.js +1 -0
  452. package/dist/charts/react/orderbook.js.map +1 -1
  453. package/dist/charts/react/shapes.cjs +1 -1
  454. package/dist/charts/react/shapes.cjs.map +1 -1
  455. package/dist/charts/react/shapes.d.cts +88 -4
  456. package/dist/charts/react/shapes.d.ts +88 -4
  457. package/dist/charts/react/shapes.js +55 -12
  458. package/dist/charts/react/shapes.js.map +1 -1
  459. package/dist/charts/react/three-d.cjs +1 -1
  460. package/dist/charts/react/three-d.cjs.map +1 -1
  461. package/dist/charts/react/three-d.d.cts +7 -0
  462. package/dist/charts/react/three-d.d.ts +7 -0
  463. package/dist/charts/react/three-d.js +14 -13
  464. package/dist/charts/react/three-d.js.map +1 -1
  465. package/dist/charts/react/trading.cjs +1 -1
  466. package/dist/charts/react/trading.cjs.map +1 -1
  467. package/dist/charts/react/trading.d.cts +54 -2
  468. package/dist/charts/react/trading.d.ts +54 -2
  469. package/dist/charts/react/trading.js +68 -37
  470. package/dist/charts/react/trading.js.map +1 -1
  471. package/dist/charts/react/types.d.cts +11 -0
  472. package/dist/charts/react/types.d.ts +11 -0
  473. package/dist/core/contracts.cjs +1 -1
  474. package/dist/core/contracts.cjs.map +1 -1
  475. package/dist/core/contracts.js +1 -1
  476. package/dist/core/contracts.js.map +1 -1
  477. package/dist/native/charts/src/canvas.cjs +1 -1
  478. package/dist/native/charts/src/canvas.js +5 -4
  479. package/dist/native/charts/src/engine/axis.cjs +1 -1
  480. package/dist/native/charts/src/engine/axis.cjs.map +1 -1
  481. package/dist/native/charts/src/engine/axis.js +42 -19
  482. package/dist/native/charts/src/engine/axis.js.map +1 -1
  483. package/dist/native/charts/src/engine/color.cjs +1 -1
  484. package/dist/native/charts/src/engine/color.cjs.map +1 -1
  485. package/dist/native/charts/src/engine/color.js +47 -5
  486. package/dist/native/charts/src/engine/color.js.map +1 -1
  487. package/dist/native/charts/src/engine/controller.cjs +2 -2
  488. package/dist/native/charts/src/engine/controller.cjs.map +1 -1
  489. package/dist/native/charts/src/engine/controller.js +296 -251
  490. package/dist/native/charts/src/engine/controller.js.map +1 -1
  491. package/dist/native/charts/src/engine/data.cjs +1 -1
  492. package/dist/native/charts/src/engine/data.cjs.map +1 -1
  493. package/dist/native/charts/src/engine/data.js +6 -4
  494. package/dist/native/charts/src/engine/data.js.map +1 -1
  495. package/dist/native/charts/src/engine/format.cjs +1 -1
  496. package/dist/native/charts/src/engine/format.cjs.map +1 -1
  497. package/dist/native/charts/src/engine/format.js +15 -2
  498. package/dist/native/charts/src/engine/format.js.map +1 -1
  499. package/dist/native/charts/src/engine/labels.cjs +1 -1
  500. package/dist/native/charts/src/engine/labels.cjs.map +1 -1
  501. package/dist/native/charts/src/engine/labels.js +42 -5
  502. package/dist/native/charts/src/engine/labels.js.map +1 -1
  503. package/dist/native/charts/src/engine/layout.cjs +1 -1
  504. package/dist/native/charts/src/engine/layout.cjs.map +1 -1
  505. package/dist/native/charts/src/engine/layout.js +11 -2
  506. package/dist/native/charts/src/engine/layout.js.map +1 -1
  507. package/dist/native/charts/src/engine/model.cjs +1 -1
  508. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  509. package/dist/native/charts/src/engine/model.js +278 -174
  510. package/dist/native/charts/src/engine/model.js.map +1 -1
  511. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  512. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  513. package/dist/native/charts/src/engine/presets.cjs +2 -2
  514. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  515. package/dist/native/charts/src/engine/presets.js +110 -90
  516. package/dist/native/charts/src/engine/presets.js.map +1 -1
  517. package/dist/native/charts/src/engine/scene.cjs +1 -1
  518. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  519. package/dist/native/charts/src/engine/scene.js +421 -202
  520. package/dist/native/charts/src/engine/scene.js.map +1 -1
  521. package/dist/native/charts/src/engine/shapes/bullet.cjs +1 -1
  522. package/dist/native/charts/src/engine/shapes/bullet.cjs.map +1 -1
  523. package/dist/native/charts/src/engine/shapes/bullet.js +110 -110
  524. package/dist/native/charts/src/engine/shapes/bullet.js.map +1 -1
  525. package/dist/native/charts/src/engine/shapes/calendar.cjs +1 -1
  526. package/dist/native/charts/src/engine/shapes/calendar.cjs.map +1 -1
  527. package/dist/native/charts/src/engine/shapes/calendar.js +21 -16
  528. package/dist/native/charts/src/engine/shapes/calendar.js.map +1 -1
  529. package/dist/native/charts/src/engine/shapes/chord.cjs +2 -0
  530. package/dist/native/charts/src/engine/shapes/chord.cjs.map +1 -0
  531. package/dist/native/charts/src/engine/shapes/chord.js +419 -0
  532. package/dist/native/charts/src/engine/shapes/chord.js.map +1 -0
  533. package/dist/native/charts/src/engine/shapes/draw.cjs +1 -1
  534. package/dist/native/charts/src/engine/shapes/draw.cjs.map +1 -1
  535. package/dist/native/charts/src/engine/shapes/draw.js +47 -17
  536. package/dist/native/charts/src/engine/shapes/draw.js.map +1 -1
  537. package/dist/native/charts/src/engine/shapes/hit.cjs +1 -1
  538. package/dist/native/charts/src/engine/shapes/hit.cjs.map +1 -1
  539. package/dist/native/charts/src/engine/shapes/hit.js +73 -44
  540. package/dist/native/charts/src/engine/shapes/hit.js.map +1 -1
  541. package/dist/native/charts/src/engine/shapes/labels.cjs +1 -1
  542. package/dist/native/charts/src/engine/shapes/labels.cjs.map +1 -1
  543. package/dist/native/charts/src/engine/shapes/labels.js +12 -4
  544. package/dist/native/charts/src/engine/shapes/labels.js.map +1 -1
  545. package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
  546. package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
  547. package/dist/native/charts/src/engine/shapes/layout.js +136 -94
  548. package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
  549. package/dist/native/charts/src/engine/shapes/scene.cjs +1 -1
  550. package/dist/native/charts/src/engine/shapes/scene.cjs.map +1 -1
  551. package/dist/native/charts/src/engine/shapes/scene.js +62 -19
  552. package/dist/native/charts/src/engine/shapes/scene.js.map +1 -1
  553. package/dist/native/components/Chart/ChartBase.cjs +1 -1
  554. package/dist/native/components/Chart/ChartBase.cjs.map +1 -1
  555. package/dist/native/components/Chart/ChartBase.js +127 -115
  556. package/dist/native/components/Chart/ChartBase.js.map +1 -1
  557. package/dist/native/components/Chart/charts.cjs +1 -1
  558. package/dist/native/components/Chart/charts.cjs.map +1 -1
  559. package/dist/native/components/Chart/charts.js +8 -5
  560. package/dist/native/components/Chart/charts.js.map +1 -1
  561. package/dist/native/components/Chart/scene.cjs +1 -1
  562. package/dist/native/components/Chart/scene.cjs.map +1 -1
  563. package/dist/native/components/Chart/scene.d.cts +6 -1
  564. package/dist/native/components/Chart/scene.d.ts +6 -1
  565. package/dist/native/components/Chart/scene.js +226 -108
  566. package/dist/native/components/Chart/scene.js.map +1 -1
  567. package/dist/native/components/Chart/types.d.cts +7 -1
  568. package/dist/native/components/Chart/types.d.ts +7 -1
  569. package/dist/native/components/Charts/charts.cjs +1 -1
  570. package/dist/native/components/Charts/charts.cjs.map +1 -1
  571. package/dist/native/components/Charts/charts.js +60 -43
  572. package/dist/native/components/Charts/charts.js.map +1 -1
  573. package/dist/native/components/Charts/types.d.cts +11 -0
  574. package/dist/native/components/Charts/types.d.ts +11 -0
  575. package/dist/native/components/ShapeChart/ShapeChartBase.cjs +1 -1
  576. package/dist/native/components/ShapeChart/ShapeChartBase.cjs.map +1 -1
  577. package/dist/native/components/ShapeChart/ShapeChartBase.d.cts +1 -1
  578. package/dist/native/components/ShapeChart/ShapeChartBase.d.ts +1 -1
  579. package/dist/native/components/ShapeChart/ShapeChartBase.js +97 -106
  580. package/dist/native/components/ShapeChart/ShapeChartBase.js.map +1 -1
  581. package/dist/native/components/ShapeChart/charts.cjs +1 -1
  582. package/dist/native/components/ShapeChart/charts.cjs.map +1 -1
  583. package/dist/native/components/ShapeChart/charts.d.cts +6 -1
  584. package/dist/native/components/ShapeChart/charts.d.ts +6 -1
  585. package/dist/native/components/ShapeChart/charts.js +138 -96
  586. package/dist/native/components/ShapeChart/charts.js.map +1 -1
  587. package/dist/native/components/ShapeChart/draw.cjs +1 -1
  588. package/dist/native/components/ShapeChart/draw.cjs.map +1 -1
  589. package/dist/native/components/ShapeChart/draw.d.cts +1 -1
  590. package/dist/native/components/ShapeChart/draw.d.ts +1 -1
  591. package/dist/native/components/ShapeChart/draw.js +26 -17
  592. package/dist/native/components/ShapeChart/draw.js.map +1 -1
  593. package/dist/native/components/ShapeChart/geometry.cjs +1 -1
  594. package/dist/native/components/ShapeChart/geometry.cjs.map +1 -1
  595. package/dist/native/components/ShapeChart/geometry.js +233 -70
  596. package/dist/native/components/ShapeChart/geometry.js.map +1 -1
  597. package/dist/native/components/ShapeChart/index.cjs +1 -1
  598. package/dist/native/components/ShapeChart/index.d.cts +1 -1
  599. package/dist/native/components/ShapeChart/index.d.ts +1 -1
  600. package/dist/native/components/ShapeChart/index.js +2 -2
  601. package/dist/native/components/ShapeChart/recorder.cjs +1 -1
  602. package/dist/native/components/ShapeChart/recorder.cjs.map +1 -1
  603. package/dist/native/components/ShapeChart/recorder.d.cts +10 -1
  604. package/dist/native/components/ShapeChart/recorder.d.ts +10 -1
  605. package/dist/native/components/ShapeChart/recorder.js +19 -10
  606. package/dist/native/components/ShapeChart/recorder.js.map +1 -1
  607. package/dist/native/components/ShapeChart/types.d.cts +95 -8
  608. package/dist/native/components/ShapeChart/types.d.ts +95 -8
  609. package/dist/native/index.cjs +1 -1
  610. package/dist/native/index.js +2 -2
  611. package/dist/native/source/components/Chart/ChartBase.tsx +19 -6
  612. package/dist/native/source/components/Chart/charts.tsx +10 -3
  613. package/dist/native/source/components/Chart/scene.tsx +243 -14
  614. package/dist/native/source/components/Chart/types.ts +7 -0
  615. package/dist/native/source/components/Charts/charts.tsx +37 -2
  616. package/dist/native/source/components/Charts/types.ts +11 -0
  617. package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +10 -34
  618. package/dist/native/source/components/ShapeChart/charts.tsx +91 -35
  619. package/dist/native/source/components/ShapeChart/draw.tsx +39 -8
  620. package/dist/native/source/components/ShapeChart/geometry.ts +376 -25
  621. package/dist/native/source/components/ShapeChart/index.ts +1 -0
  622. package/dist/native/source/components/ShapeChart/recorder.ts +20 -5
  623. package/dist/native/source/components/ShapeChart/types.ts +99 -6
  624. package/dist/native/source/manifest.ts +1 -0
  625. package/dist/taro/chart-a11y.d.ts +7 -0
  626. package/dist/taro/charts.d.ts +29 -6
  627. package/dist/taro/index.js +3129 -1902
  628. package/dist/taro/shape-charts.d.ts +99 -5
  629. package/dist/uni/AreaChart.vue +2 -1
  630. package/dist/uni/AreaChart.vue.d.ts +5 -1
  631. package/dist/uni/Badge.vue.d.ts +1 -1
  632. package/dist/uni/BarChart.vue +2 -1
  633. package/dist/uni/BarChart.vue.d.ts +5 -1
  634. package/dist/uni/BoxPlotChart.vue +2 -1
  635. package/dist/uni/BoxPlotChart.vue.d.ts +8 -0
  636. package/dist/uni/BubbleChart.vue +2 -1
  637. package/dist/uni/BubbleChart.vue.d.ts +4 -0
  638. package/dist/uni/BulletChart.vue.d.ts +4 -0
  639. package/dist/uni/CalendarHeatmap.vue.d.ts +2 -0
  640. package/dist/uni/CandlestickChart.vue +2 -1
  641. package/dist/uni/CandlestickChart.vue.d.ts +4 -0
  642. package/dist/uni/Chart.vue +2 -1
  643. package/dist/uni/Chart.vue.d.ts +4 -0
  644. package/dist/uni/ChordChart.vue +93 -0
  645. package/dist/uni/ChordChart.vue.d.ts +136 -0
  646. package/dist/uni/Divider.vue.d.ts +1 -1
  647. package/dist/uni/DonutChart.vue.d.ts +5 -1
  648. package/dist/uni/FunnelChart.vue.d.ts +4 -0
  649. package/dist/uni/GanttChart.vue +2 -1
  650. package/dist/uni/GanttChart.vue.d.ts +15 -0
  651. package/dist/uni/GaugeChart.vue.d.ts +5 -1
  652. package/dist/uni/HeatmapChart.vue +2 -1
  653. package/dist/uni/HeatmapChart.vue.d.ts +8 -2
  654. package/dist/uni/HistogramChart.vue +2 -1
  655. package/dist/uni/HistogramChart.vue.d.ts +4 -0
  656. package/dist/uni/HorizontalBarChart.vue +2 -1
  657. package/dist/uni/HorizontalBarChart.vue.d.ts +3 -1
  658. package/dist/uni/LineChart.vue +2 -1
  659. package/dist/uni/LineChart.vue.d.ts +4 -0
  660. package/dist/uni/MixedChart.vue +2 -1
  661. package/dist/uni/MixedChart.vue.d.ts +4 -0
  662. package/dist/uni/PieChart.vue.d.ts +5 -1
  663. package/dist/uni/QuadrantChart.vue +2 -1
  664. package/dist/uni/QuadrantChart.vue.d.ts +4 -0
  665. package/dist/uni/RadarChart.vue.d.ts +4 -0
  666. package/dist/uni/RadialBarChart.vue.d.ts +4 -0
  667. package/dist/uni/RangeAreaChart.vue +2 -1
  668. package/dist/uni/RangeAreaChart.vue.d.ts +4 -0
  669. package/dist/uni/SankeyChart.vue.d.ts +4 -0
  670. package/dist/uni/ScatterChart.vue +2 -1
  671. package/dist/uni/ScatterChart.vue.d.ts +4 -0
  672. package/dist/uni/Sparkline.vue +2 -1
  673. package/dist/uni/Sparkline.vue.d.ts +4 -0
  674. package/dist/uni/SunburstChart.vue.d.ts +4 -0
  675. package/dist/uni/ToastProvider.vue.d.ts +1 -1
  676. package/dist/uni/TreemapChart.vue.d.ts +4 -0
  677. package/dist/uni/WaterfallChart.vue +2 -1
  678. package/dist/uni/WaterfallChart.vue.d.ts +9 -0
  679. package/dist/uni/chart-a11y.d.ts +7 -0
  680. package/dist/uni/chart-a11y.js +29 -0
  681. package/dist/uni/chart-canvas.d.ts +12 -0
  682. package/dist/uni/chart-canvas.js +15 -1
  683. package/dist/uni/chart-types.d.ts +36 -5
  684. package/dist/uni/chart-types.js +31 -3
  685. package/dist/uni/charts-canvas.js +3 -2
  686. package/dist/uni/index.d.ts +2 -1
  687. package/dist/uni/index.js +1 -0
  688. package/dist/uni/manifest.d.ts +7 -0
  689. package/dist/uni/manifest.js +10 -0
  690. package/dist/uni/named-chart-options.d.ts +11 -2
  691. package/dist/uni/named-chart-options.js +21 -1
  692. package/dist/uni/shape-chart-canvas.d.ts +3 -3
  693. package/dist/uni/shape-chart-canvas.js +17 -58
  694. package/dist/uni/shape-chart-types.d.ts +53 -3
  695. package/dist/uni/shape-chart-types.js +45 -1
  696. package/dist/vue/charts-global.d.ts +48 -0
  697. package/dist/vue/charts.d.ts +18 -0
  698. package/dist/vue/charts.js +56 -0
  699. package/dist/vue/charts.js.map +1 -0
  700. package/dist/vue/components/Chart/Bar3DChart.vue.d.ts +2 -0
  701. package/dist/vue/components/Chart/BoxPlotChart.vue.d.ts +8 -0
  702. package/dist/vue/components/Chart/BoxPlotChart.vue.js.map +1 -1
  703. package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js +8 -2
  704. package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  705. package/dist/vue/components/Chart/ChordChart.vue.d.ts +153 -0
  706. package/dist/vue/components/Chart/ChordChart.vue.js +7 -0
  707. package/dist/vue/components/Chart/ChordChart.vue.js.map +1 -0
  708. package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js +81 -0
  709. package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  710. package/dist/vue/components/Chart/DependencyGraph.vue.d.ts +181 -0
  711. package/dist/vue/components/Chart/DependencyGraph.vue.js +7 -0
  712. package/dist/vue/components/Chart/DependencyGraph.vue.js.map +1 -0
  713. package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js +65 -0
  714. package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js.map +1 -0
  715. package/dist/vue/components/Chart/GanttChart.vue.d.ts +19 -0
  716. package/dist/vue/components/Chart/GanttChart.vue.js.map +1 -1
  717. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js +12 -1
  718. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  719. package/dist/vue/components/Chart/GraphChart.vue.d.ts +186 -0
  720. package/dist/vue/components/Chart/GraphChart.vue.js +7 -0
  721. package/dist/vue/components/Chart/GraphChart.vue.js.map +1 -0
  722. package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js +62 -0
  723. package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  724. package/dist/vue/components/Chart/HeatmapChart.vue.d.ts +9 -5
  725. package/dist/vue/components/Chart/HeatmapChart.vue.js.map +1 -1
  726. package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js +3 -1
  727. package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  728. package/dist/vue/components/Chart/Line3DChart.vue.d.ts +2 -0
  729. package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +2 -0
  730. package/dist/vue/components/Chart/Scatter3DChart.vue.d.ts +2 -0
  731. package/dist/vue/components/Chart/Surface3DChart.vue.d.ts +2 -0
  732. package/dist/vue/components/Chart/TimeAndSales.vue.d.ts +2 -0
  733. package/dist/vue/components/Chart/TradingChart.vue.d.ts +58 -1
  734. package/dist/vue/components/Chart/TradingChart.vue.js.map +1 -1
  735. package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js +31 -0
  736. package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  737. package/dist/vue/components/Chart/TreeChart.vue.d.ts +174 -0
  738. package/dist/vue/components/Chart/TreeChart.vue.js +7 -0
  739. package/dist/vue/components/Chart/TreeChart.vue.js.map +1 -0
  740. package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js +56 -0
  741. package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  742. package/dist/vue/components/Chart/WaterfallChart.vue.d.ts +12 -1
  743. package/dist/vue/components/Chart/WaterfallChart.vue.js.map +1 -1
  744. package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js +8 -2
  745. package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  746. package/dist/vue/components/Chart/graph.d.ts +156 -0
  747. package/dist/vue/components/Chart/graph.js +137 -0
  748. package/dist/vue/components/Chart/graph.js.map +1 -0
  749. package/dist/vue/components/Chart/index.d.ts +5 -1
  750. package/dist/vue/components/Chart/index.js +5 -1
  751. package/dist/vue/components/Chart/orderbook.d.ts +5 -1
  752. package/dist/vue/components/Chart/orderbook.js +2 -0
  753. package/dist/vue/components/Chart/orderbook.js.map +1 -1
  754. package/dist/vue/components/Chart/three-d.d.ts +3 -0
  755. package/dist/vue/components/Chart/three-d.js +2 -0
  756. package/dist/vue/components/Chart/three-d.js.map +1 -1
  757. package/dist/vue/components/Chart/trading.d.ts +30 -3
  758. package/dist/vue/components/Chart/trading.js +9 -0
  759. package/dist/vue/components/Chart/trading.js.map +1 -1
  760. package/dist/vue/components/Chart/types.d.ts +74 -2
  761. package/dist/vue/global.d.ts +2 -38
  762. package/dist/vue/groups/charts.js +10 -2
  763. package/dist/vue/groups/charts.js.map +1 -1
  764. package/dist/vue/index.js +6 -2
  765. package/dist/vue/internal/register.d.ts +7 -0
  766. package/dist/vue/internal/register.js +14 -0
  767. package/dist/vue/internal/register.js.map +1 -0
  768. package/dist/vue/plugin.d.ts +9 -4
  769. package/dist/vue/plugin.js +6 -11
  770. package/dist/vue/plugin.js.map +1 -1
  771. package/dist/weapp/area-chart/index.wxml +1 -1
  772. package/dist/weapp/bar-chart/index.wxml +1 -1
  773. package/dist/weapp/box-plot-chart/index.wxml +1 -1
  774. package/dist/weapp/bubble-chart/index.wxml +1 -1
  775. package/dist/weapp/candlestick-chart/index.wxml +1 -1
  776. package/dist/weapp/chart/index.wxml +1 -1
  777. package/dist/weapp/charts/canvas.js +1987 -175
  778. package/dist/weapp/charts/core.js +3 -0
  779. package/dist/weapp/chord-chart/index.js +1 -0
  780. package/dist/weapp/chord-chart/index.json +1 -0
  781. package/dist/weapp/chord-chart/index.wxml +1 -0
  782. package/dist/weapp/chord-chart/index.wxss +1 -0
  783. package/dist/weapp/controls.js +148 -57
  784. package/dist/weapp/gantt-chart/index.wxml +1 -1
  785. package/dist/weapp/heatmap-chart/index.wxml +1 -1
  786. package/dist/weapp/histogram-chart/index.wxml +1 -1
  787. package/dist/weapp/horizontal-bar-chart/index.wxml +1 -1
  788. package/dist/weapp/line-chart/index.wxml +1 -1
  789. package/dist/weapp/mixed-chart/index.wxml +1 -1
  790. package/dist/weapp/quadrant-chart/index.wxml +1 -1
  791. package/dist/weapp/range-area-chart/index.wxml +1 -1
  792. package/dist/weapp/scatter-chart/index.wxml +1 -1
  793. package/dist/weapp/sparkline/index.wxml +1 -1
  794. package/dist/weapp/types.d.ts +96 -4
  795. package/dist/weapp/waterfall-chart/index.wxml +1 -1
  796. package/dist/web-components/components/chart/charts.d.ts +4 -2
  797. package/dist/web-components/components/chart/charts.js +8 -1
  798. package/dist/web-components/components/chart/charts.js.map +1 -1
  799. package/dist/web-components/components/chart/extended.d.ts +21 -7
  800. package/dist/web-components/components/chart/extended.js +29 -9
  801. package/dist/web-components/components/chart/extended.js.map +1 -1
  802. package/dist/web-components/components/chart/shapes-extended.d.ts +37 -1
  803. package/dist/web-components/components/chart/shapes-extended.js +27 -1
  804. package/dist/web-components/components/chart/shapes-extended.js.map +1 -1
  805. package/dist/web-components/components/chart-3d/chart-3d.d.ts +1 -1
  806. package/dist/web-components/components/chart-3d/chart-3d.js.map +1 -1
  807. package/dist/web-components/components/graph/graph.d.ts +156 -0
  808. package/dist/web-components/components/graph/graph.js +150 -0
  809. package/dist/web-components/components/graph/graph.js.map +1 -0
  810. package/dist/web-components/components/trading-chart/trading-chart.d.ts +49 -2
  811. package/dist/web-components/components/trading-chart/trading-chart.js +62 -0
  812. package/dist/web-components/components/trading-chart/trading-chart.js.map +1 -1
  813. package/dist/web-components/elements/chart.d.ts +1 -1
  814. package/dist/web-components/elements/chart.js +6 -5
  815. package/dist/web-components/elements/chart.js.map +1 -1
  816. package/dist/web-components/elements/graph.d.ts +2 -0
  817. package/dist/web-components/elements/graph.js +12 -0
  818. package/dist/web-components/elements/graph.js.map +1 -0
  819. package/dist/web-components/html-custom-data.json +318 -4
  820. package/dist/web-components/types/react.d.ts +63 -4
  821. package/dist/web-components/types/solid.d.ts +55 -8
  822. package/dist/web-components/types/svelte.d.ts +55 -8
  823. package/dist/web-components/types/vue.d.ts +55 -4
  824. package/package.json +16 -1
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","names":["firstX","data","xs","list","i","item","detectXType","datas","x","axisModel","options","gridDefault","definedEntries","out","value","key","extent","min","max","values","v","smallestStep","step","columns","sorted","k","d","bandOf","category","axis","s","stackValues","totals","percent","byX","stack","count","y","t","running","members","base","top","valid","sums","total","b","DEFAULT_UP","DEFAULT_DOWN","hasDateY","precise","nextStep","power","f","alignedDomain","a0","a1","left","stepL","tickStep","n","lo","hi","ensureSpan","niceDomain","start","mapped","mapColumns","map","hit","raw","column","a","cols","buildModel","resolve","resolver","theme","resolveStaticColor","fallback","input","locale","resolveLocale","tooltipOptions","labels","chartLabels","xType","categories","collectCategories","categoryMap","c","resolveX","xResolver","name","yOpts","heatmapData","yCategories","collectYCategories","yType","yCategoryMap","resolveY","resolverKey","horizontal","usedKeys","series","index","entry","cache","normalizeData","type","paletteColor","color","pointColors","resolved","rgba","colorScale","valueRange","cellColors","mix","span","packColor","rampColor","id","toCss","hidden","visible","allScatter","slotted","bars","band","slots","stackId","share","w","group","slotWidth","slot","stackedBars","stacked","percentStacked","p","y0","stackedLines","candles","candleBand","heatmaps","cx","cy","xOpts","xRange","pad","pointsOnly","valuesOf","listBars","zero","leftVisible","leftSeries","leftBars","yRange","yValues","filled","y2Opts","y2","y2Map","rightSeries","domain","scale","rawBase","zoomOption","zoomAxes","yFormat","formatPercent","valueFormatter","plottedY","grids","gridOf","grid","GridIndex"],"sources":["../../../../charts/src/engine/model.ts"],"sourcesContent":["// Options -> chart model: normalized data, colors, bar layout, stacks and\n// the full ranges of the axes. Pure (colors go through the theme's resolver).\n\nimport {\n mix,\n packColor,\n rampColor,\n resolveStaticColor,\n toCss,\n type ColorResolver,\n type Rgba,\n} from \"./color\";\nimport {\n collectCategories,\n collectYCategories,\n normalizeData,\n xResolver,\n type SeriesColumns,\n type YResolver,\n} from \"./data\";\nimport { formatPercent, valueFormatter } from \"./format\";\nimport { chartLabels } from \"./labels\";\nimport { resolveLocale } from \"./locale\";\nimport { ensureSpan, niceDomain, tickStep } from \"./scale\";\nimport { GridIndex } from \"./spatial\";\nimport type { ChartTheme } from \"./theme\";\nimport type {\n ChartAxisOptions,\n ChartAxisType,\n ChartCurve,\n ChartOptions,\n ChartSeries,\n ChartSeriesData,\n ChartLabels,\n ChartSeriesType,\n ChartTimeZone,\n} from \"./types\";\nimport type { Range } from \"./viewport\";\n\nexport interface AxisModel {\n type: ChartAxisType;\n reverse: boolean;\n categories: string[];\n title?: string;\n format?: (value: number) => string;\n grid: boolean;\n visible: boolean;\n tickCount?: number;\n /** Locale of the tick and tooltip labels (historical English texts when omitted) */\n locale?: string;\n /** Calendar of a time axis */\n timeZone?: ChartTimeZone;\n}\n\nexport interface SeriesModel {\n index: number;\n /** Key of the GPU resources and of the data cache */\n key: string;\n id: string;\n name: string;\n type: ChartSeriesType;\n color: Rgba;\n colorCss: string;\n lineWidth: number;\n pointSize: number;\n opacity: number;\n hidden: boolean;\n showLabels: boolean;\n curve: ChartCurve;\n /**\n * Plotted columns: the data, mapped onto the left axis for the series of\n * the right axis (`raw` keeps the values of the data)\n */\n cols: SeriesColumns;\n /** Columns of the data (shown in tooltips and labels) */\n raw: SeriesColumns;\n /** Value axis of the series */\n yAxis: \"left\" | \"right\";\n /** Bars with a start (`y0`): drawn from it, never stacked */\n floating: boolean;\n /** Bars / candlesticks: x offset of the series inside a group and half of the bar width */\n barOffset: number;\n barHalfWidth: number;\n /** Bars: bottom / top of every bar (stacks included) */\n barBase: Float64Array | null;\n barTop: Float64Array | null;\n /** Stacked lines / areas: bottom / top of every point */\n stackBase: Float64Array | null;\n stackTop: Float64Array | null;\n /** Scatter / bar: resolved per-point colors */\n pointColors: (Rgba | undefined)[] | null;\n /** Candlesticks: colors of the rising / falling candles */\n upColor: Rgba;\n downColor: Rgba;\n /** Heatmaps: packed color of every cell (0 = no cell) and half of a cell, in data units */\n cellColors: Uint32Array | null;\n cellHalf: { x: number; y: number };\n /** Heatmaps: ramp of the colors and the values at its ends */\n colorScale: Rgba[];\n valueRange: Range;\n /** Corner radius in CSS pixels (bars, heatmap cells) */\n radius: number;\n /** Tooltip format of the values */\n format?: (value: number) => string;\n /** Scatter: name of the `value` of the points */\n valueName?: string;\n}\n\n/** Linear map of the right axis onto the left one: `left = right * scale + offset` */\nexport interface AxisMap {\n scale: number;\n offset: number;\n}\n\nexport interface ChartModel {\n series: SeriesModel[];\n x: AxisModel;\n y: AxisModel;\n /** Right value axis (`yAxis2`), `null` when no series uses it */\n y2: AxisModel | null;\n /** Right axis values -> left axis values */\n y2Map: AxisMap | null;\n /** The x axis runs down the left side, the values along the bottom */\n horizontal: boolean;\n /** Resolved locale (`locale` option, else the page language) */\n locale: string;\n /** Texts of the locale with the `labels` overrides */\n labels: ChartLabels;\n /** Tooltip value of the locale (series without `format`) */\n formatValue: (value: number) => string;\n /** Full ranges (zoomed out) */\n base: { x: Range; y: Range };\n /** Every series is a scatter (or a heatmap): nearest tooltips, xy zoom */\n allScatter: boolean;\n zoom: { x: boolean; y: boolean };\n tooltipMode: \"nearest\" | \"axis\";\n /** Y value the areas are filled to */\n baseline: number;\n /** Smallest zoomed spans */\n minSpan: { x: number; y: number };\n /** Stacks are scaled to 100% */\n percent: boolean;\n /** Stack id of every series (`null` when not stacked) */\n stacks: (string | null)[];\n}\n\nexport interface DataCacheEntry {\n data: ChartSeriesData;\n resolverKey: string;\n cols: SeriesColumns;\n}\n\nexport type DataCache = Map<string, DataCacheEntry>;\n\nconst firstX = (data: ChartSeriesData): unknown => {\n if (typeof data === \"object\" && data !== null && !(\"length\" in data)) {\n const xs = (data as { x?: ArrayLike<unknown> }).x;\n return xs && xs.length ? xs[0] : undefined;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < Math.min(list.length, 8); i++) {\n const item = list[i];\n if (Array.isArray(item)) return item[0];\n if (item && typeof item === \"object\") return (item as { x?: unknown }).x;\n }\n return undefined;\n};\n\n/** Axis type when not given: dates -> time, strings -> category */\nexport const detectXType = (\n datas: readonly ChartSeriesData[],\n): ChartAxisType => {\n for (const data of datas) {\n const x = firstX(data);\n if (x instanceof Date) return \"time\";\n if (typeof x === \"string\") return \"category\";\n }\n return \"linear\";\n};\n\nconst axisModel = (\n options: ChartAxisOptions | undefined,\n type: ChartAxisType,\n categories: string[],\n gridDefault: boolean,\n locale: string,\n): AxisModel => ({\n type,\n reverse: !!options?.reverse,\n categories,\n title: options?.title,\n format: options?.format,\n grid: options?.grid ?? gridDefault,\n visible: options?.visible ?? true,\n tickCount: options?.tickCount,\n locale,\n timeZone: options?.timeZone ?? \"local\",\n});\n\n/** Defined entries only (`{ open: undefined }` keeps the built-in text) */\nconst definedEntries = <T extends object>(value: T | undefined): Partial<T> => {\n const out: Partial<T> = {};\n if (!value) return out;\n for (const key of Object.keys(value) as (keyof T)[]) {\n if (value[key] !== undefined) out[key] = value[key];\n }\n return out;\n};\n\nconst extent = (values: ArrayLike<number>): Range => {\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (!Number.isFinite(v)) continue;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n return [min, max];\n};\n\n/** Smallest positive gap between consecutive values (bar width on numeric axes) */\nconst smallestStep = (columns: ArrayLike<number>[], sorted: boolean[]) => {\n let step = Infinity;\n columns.forEach((values, k) => {\n const xs = sorted[k] ? values : Float64Array.from(values).sort();\n for (let i = 1; i < xs.length; i++) {\n const d = xs[i] - xs[i - 1];\n if (d > 0 && d < step) step = d;\n }\n });\n return step;\n};\n\nconst bandOf = (list: SeriesModel[], axis: \"x\" | \"y\", category: boolean) => {\n if (category) return 1;\n const step = smallestStep(\n list.map((s) => (axis === \"x\" ? s.cols.x : s.cols.y)),\n list.map((s) => axis === \"x\" && s.cols.sorted),\n );\n return Number.isFinite(step) ? step : 1;\n};\n\n/**\n * Stacks the y values of series sharing a stack id (positive and negative\n * values separately); `percent` scales every stack to 100 at each x\n */\nconst stackValues = (\n list: { s: SeriesModel; stack: string }[],\n percent: boolean,\n): { base: Float64Array; top: Float64Array }[] => {\n const totals = new Map<string, Map<number, [number, number]>>();\n if (percent) {\n for (const { s, stack } of list) {\n let byX = totals.get(stack);\n if (!byX) totals.set(stack, (byX = new Map()));\n const { x, y, count } = s.cols;\n for (let i = 0; i < count; i++) {\n const v = y[i];\n if (!Number.isFinite(v)) continue;\n const t = byX.get(x[i]) ?? [0, 0];\n if (v >= 0) t[0] += v;\n else t[1] -= v;\n byX.set(x[i], t);\n }\n }\n }\n const running = new Map<string, Map<number, [number, number]>>();\n const members = new Map<string, number>();\n for (const { stack } of list)\n members.set(stack, (members.get(stack) ?? 0) + 1);\n return list.map(({ s, stack }) => {\n const { x, y, count } = s.cols;\n if (!percent && members.get(stack) === 1) {\n // alone in its stack (e.g. grouped bars): from zero, no bookkeeping\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n const v = y[i];\n const valid = Number.isFinite(v);\n base[i] = valid ? 0 : NaN;\n top[i] = valid ? v : NaN;\n }\n return { base, top };\n }\n let byX = running.get(stack);\n if (!byX) running.set(stack, (byX = new Map()));\n const sums = totals.get(stack);\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n let v = y[i];\n if (!Number.isFinite(v)) {\n base[i] = NaN;\n top[i] = NaN;\n continue;\n }\n if (sums) {\n const t = sums.get(x[i]);\n const total = t ? (v >= 0 ? t[0] : t[1]) : 0;\n v = total > 0 ? (v / total) * 100 : 0;\n }\n const t = byX.get(x[i]) ?? [0, 0];\n const b = v >= 0 ? t[0] : t[1];\n base[i] = b;\n top[i] = b + v;\n if (v >= 0) t[0] += v;\n else t[1] += v;\n byX.set(x[i], t);\n }\n return { base, top };\n });\n};\n\nconst DEFAULT_UP = \"var(--success-color, #16a34a)\";\nconst DEFAULT_DOWN = \"var(--danger-color, #dc2626)\";\n\n/** Dates in the y values (or starts) of objects: a time value axis */\nconst hasDateY = (datas: readonly ChartSeriesData[]): boolean => {\n for (const data of datas) {\n if (typeof data !== \"object\" || data === null || !(\"length\" in data))\n continue;\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < Math.min(list.length, 8); i++) {\n const item = list[i];\n if (item && typeof item === \"object\" && !Array.isArray(item)) {\n const d = item as { y?: unknown; y0?: unknown };\n if (d.y instanceof Date || d.y0 instanceof Date) return true;\n }\n }\n }\n return false;\n};\n\nconst precise = (v: number) => Number(v.toPrecision(12));\n\n/** Next step of the 1, 2, 5 × 10^k sequence */\nconst nextStep = (step: number) => {\n const power = 10 ** Math.floor(Math.log10(step) + 1e-9);\n const f = step / power;\n return (f < 1.5 ? 2 : f < 3.5 ? 5 : 10) * power;\n};\n\n/**\n * Range of the right axis covering [lo, hi] with as many tick intervals as\n * the left range has (its ticks then line up with the left grid)\n */\nexport const alignedDomain = (\n lo: number,\n hi: number,\n left: Range,\n count: number,\n): Range => {\n const [a0, a1] = left;\n const stepL = tickStep(a0, a1, count);\n const n = stepL > 0 ? Math.round((a1 - a0) / stepL) : 0;\n [lo, hi] = ensureSpan(lo, hi);\n if (n < 1 || Math.abs(n * stepL - (a1 - a0)) > stepL * 1e-6) {\n return niceDomain(lo, hi, count);\n }\n let step = tickStep(lo, hi, n);\n for (let k = 0; k < 40 && step > 0; k++) {\n const start = Math.floor(lo / step + 1e-9) * step;\n if (start + n * step >= hi - step * 1e-9) {\n return [precise(start), precise(start + n * step)];\n }\n step = nextStep(step);\n }\n return niceDomain(lo, hi, count);\n};\n\nconst mapped = new WeakMap<\n SeriesColumns,\n { key: string; cols: SeriesColumns }\n>();\n\n/** Columns of a right-axis series in left axis units (cached with the data) */\nconst mapColumns = (raw: SeriesColumns, map: AxisMap): SeriesColumns => {\n const key = `${map.scale},${map.offset}`;\n const hit = mapped.get(raw);\n if (hit && hit.key === key) return hit.cols;\n const f = (v: number) => v * map.scale + map.offset;\n const column = (a: Float64Array | null) => (a ? a.map(f) : null);\n const lo = f(raw.yMin);\n const hi = f(raw.yMax);\n const cols: SeriesColumns = {\n ...raw,\n y: raw.y.map(f),\n open: column(raw.open),\n high: column(raw.high),\n low: column(raw.low),\n y0: column(raw.y0),\n q1: column(raw.q1),\n q3: column(raw.q3),\n outliers: raw.outliers ? raw.outliers.map((list) => list?.map(f)) : null,\n yMin: Math.min(lo, hi),\n yMax: Math.max(lo, hi),\n };\n mapped.set(raw, { key, cols });\n return cols;\n};\n\nexport const buildModel = (\n options: ChartOptions,\n theme: ChartTheme,\n hidden: ReadonlySet<string>,\n cache: DataCache,\n resolver: ColorResolver | null = null,\n): ChartModel => {\n const resolve: ColorResolver =\n resolver ??\n theme.resolve ??\n ((value, fallback) => resolveStaticColor(value, {}, fallback));\n const input = options.series;\n // resolved at every build: a page language switch shows on the next update\n const locale = resolveLocale(options.locale);\n const tooltipOptions =\n typeof options.tooltip === \"object\" ? options.tooltip : undefined;\n const labels = chartLabels(locale, {\n ...definedEntries(tooltipOptions?.labels),\n ...definedEntries(options.labels),\n });\n const datas = input.map((s) => s.data);\n const xType = options.xAxis?.type ?? detectXType(datas);\n const categories =\n xType === \"category\"\n ? [...(options.xAxis?.categories ?? collectCategories(datas))]\n : [];\n const categoryMap = new Map(categories.map((c, i) => [c, i]));\n const resolveX = xResolver(xType, (name) => categoryMap.get(name) ?? NaN);\n\n // category y axis (heatmap rows): explicit, or detected from string y values\n const yOpts = options.yAxis;\n const heatmapData = input\n .filter((s) => s.type === \"heatmap\")\n .map((s) => s.data);\n const yCategories =\n yOpts?.type === \"category\" || (!yOpts?.type && heatmapData.length)\n ? [...(yOpts?.categories ?? collectYCategories(heatmapData))]\n : [];\n const yType: ChartAxisType =\n yOpts?.type === \"category\" || yCategories.length\n ? \"category\"\n : yOpts?.type === \"time\" || (!yOpts?.type && hasDateY(datas))\n ? \"time\"\n : \"linear\";\n const yCategoryMap = new Map(yCategories.map((c, i) => [c, i]));\n const resolveY: YResolver = (v) =>\n typeof v === \"number\"\n ? v\n : typeof v === \"string\"\n ? yType === \"category\"\n ? (yCategoryMap.get(v) ?? NaN)\n : yType === \"time\"\n ? Date.parse(v)\n : Number(v)\n : v instanceof Date\n ? v.getTime()\n : NaN;\n const resolverKey = `${xType}|${categories.join(\"\\u0001\")}|${yType}|${yCategories.join(\"\\u0001\")}`;\n const percent = options.stackMode === \"percent\";\n const horizontal = options.orientation === \"horizontal\";\n\n const usedKeys = new Set<string>();\n const series: SeriesModel[] = input.map((s: ChartSeries, index) => {\n let key = s.id ?? `#${index}`;\n while (usedKeys.has(key)) key += \"'\";\n usedKeys.add(key);\n let entry = cache.get(key);\n if (!entry || entry.data !== s.data || entry.resolverKey !== resolverKey) {\n entry = {\n data: s.data,\n resolverKey,\n cols: normalizeData(s.data, resolveX, resolveY),\n };\n cache.set(key, entry);\n }\n const type = s.type ?? \"line\";\n const paletteColor = theme.palette[index % theme.palette.length];\n const color = s.color ? resolve(s.color, paletteColor) : paletteColor;\n const cols = entry.cols;\n let pointColors: (Rgba | undefined)[] | null = null;\n if (\n (type === \"scatter\" || type === \"bar\" || type === \"boxplot\") &&\n cols.colors\n ) {\n const resolved = new Map<string, Rgba>();\n pointColors = cols.colors.map((c) => {\n if (c === undefined) return undefined;\n let rgba = resolved.get(c);\n if (!rgba) resolved.set(c, (rgba = resolve(c, color)));\n return rgba;\n });\n }\n let colorScale: Rgba[] = [];\n let valueRange: Range = [0, 1];\n let cellColors: Uint32Array | null = null;\n if (type === \"heatmap\") {\n colorScale =\n s.colorScale && s.colorScale.length\n ? s.colorScale.map((c) => resolve(c, color))\n : [mix(theme.background, color, 0.08), color];\n valueRange = s.valueRange\n ? [s.valueRange[0], s.valueRange[1]]\n : [cols.valueMin, cols.valueMax];\n if (!Number.isFinite(valueRange[0])) valueRange = [0, 1];\n const values = cols.value ?? cols.y;\n const [lo, hi] = valueRange;\n const span = hi - lo || 1;\n cellColors = new Uint32Array(cols.count);\n for (let i = 0; i < cols.count; i++) {\n const v = values[i];\n if (!Number.isFinite(v) || !Number.isFinite(cols.y[i])) continue;\n // 0 means \"no cell\": a fully transparent color packs to 0 as well\n cellColors[i] = packColor(rampColor(colorScale, (v - lo) / span));\n }\n }\n const id = s.id ?? String(index);\n return {\n index,\n key,\n id,\n name: s.name ?? `${labels.series} ${index + 1}`,\n type,\n color,\n colorCss: toCss(color),\n lineWidth:\n s.lineWidth ??\n (type === \"candlestick\" ? 1 : type === \"boxplot\" ? 1.5 : 2),\n pointSize: s.pointSize ?? (type === \"boxplot\" ? 6 : 8),\n opacity:\n s.opacity ??\n (type === \"area\"\n ? 0.28\n : type === \"scatter\"\n ? 0.78\n : type === \"boxplot\"\n ? 0.22\n : 1),\n hidden: !!s.hidden || hidden.has(id),\n showLabels: !!s.showLabels,\n curve: s.curve ?? \"linear\",\n cols,\n raw: cols,\n yAxis: s.yAxis === \"right\" && !horizontal ? \"right\" : \"left\",\n floating: type === \"bar\" && !!cols.y0,\n barOffset: 0,\n barHalfWidth: 0,\n barBase: null,\n barTop: null,\n stackBase: null,\n stackTop: null,\n pointColors,\n upColor:\n type === \"candlestick\"\n ? resolve(s.upColor ?? DEFAULT_UP, [0.09, 0.64, 0.29, 1])\n : color,\n downColor:\n type === \"candlestick\"\n ? resolve(s.downColor ?? DEFAULT_DOWN, [0.86, 0.15, 0.15, 1])\n : color,\n cellColors,\n cellHalf: { x: 0.5, y: 0.5 },\n colorScale,\n valueRange,\n radius: s.radius ?? (type === \"heatmap\" ? 2 : type === \"boxplot\" ? 0 : 3),\n format: s.format,\n valueName: s.valueName,\n };\n });\n\n const visible = series.filter((s) => !s.hidden);\n const allScatter =\n series.length > 0 &&\n series.every((s) => s.type === \"scatter\" || s.type === \"heatmap\");\n\n // Bars and box plots: groups (one slot per stack) and stacking; floating\n // bars (with starts) are drawn from their starts\n const slotted = visible.filter(\n (s) => s.type === \"bar\" || s.type === \"boxplot\",\n );\n const bars = visible.filter((s) => s.type === \"bar\");\n const band = bandOf(slotted, \"x\", xType === \"category\");\n if (slotted.length) {\n const slots = new Map<string, number>();\n const stackId = (s: SeriesModel) =>\n input[s.index].stack ?? `\\u0000${s.key}`;\n for (const s of slotted) {\n if (!slots.has(stackId(s))) slots.set(stackId(s), slots.size);\n }\n let share = 0;\n for (const s of slotted) {\n const w = input[s.index].barWidth;\n if (w !== undefined && w > share) share = Math.min(1, w);\n }\n const group = band * (share || (slots.size > 1 ? 0.78 : 0.62));\n const slotWidth = group / slots.size;\n for (const s of slotted) {\n const slot = slots.get(stackId(s)) ?? 0;\n s.barOffset = -group / 2 + slotWidth * (slot + 0.5);\n s.barHalfWidth = (slotWidth / 2) * (slots.size > 1 ? 0.86 : 1);\n }\n const stackedBars = bars.filter((s) => !s.floating);\n const stacked = stackValues(\n stackedBars.map((s) => ({ s, stack: stackId(s) })),\n false,\n );\n const percentStacked = percent\n ? stackValues(\n stackedBars\n .filter((s) => input[s.index].stack !== undefined)\n .map((s) => ({ s, stack: stackId(s) })),\n true,\n )\n : [];\n let p = 0;\n stackedBars.forEach((s, k) => {\n const values =\n percent && input[s.index].stack !== undefined\n ? percentStacked[p++]\n : stacked[k];\n s.barBase = values.base;\n s.barTop = values.top;\n });\n for (const s of bars) {\n const { y, y0, count } = s.cols;\n if (!s.floating || !y0) continue;\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n const valid = Number.isFinite(y[i]);\n base[i] = valid ? (Number.isFinite(y0[i]) ? y0[i] : 0) : NaN;\n top[i] = valid ? y[i] : NaN;\n }\n s.barBase = base;\n s.barTop = top;\n }\n }\n\n // Range areas: filled down to their lower edges\n for (const s of visible) {\n if (s.type === \"area\" && s.cols.y0 && input[s.index].stack === undefined)\n s.stackBase = s.cols.y0;\n }\n\n // Stacked lines / areas\n const stackedLines = visible.filter(\n (s) =>\n (s.type === \"line\" || s.type === \"area\") &&\n input[s.index].stack !== undefined,\n );\n if (stackedLines.length) {\n const values = stackValues(\n stackedLines.map((s) => ({ s, stack: input[s.index].stack ?? \"\" })),\n percent,\n );\n stackedLines.forEach((s, k) => {\n s.stackBase = values[k].base;\n s.stackTop = values[k].top;\n });\n }\n\n // Candlesticks: one band per x, bodies of 60%\n const candles = visible.filter((s) => s.type === \"candlestick\");\n const candleBand = bandOf(candles, \"x\", xType === \"category\");\n for (const s of candles) s.barHalfWidth = candleBand * 0.3;\n\n // Heatmaps: cells of the size of the smallest step\n const heatmaps = visible.filter((s) => s.type === \"heatmap\");\n if (heatmaps.length) {\n const cx = bandOf(heatmaps, \"x\", xType === \"category\") / 2;\n const cy = bandOf(heatmaps, \"y\", yType === \"category\") / 2;\n for (const s of heatmaps) s.cellHalf = { x: cx, y: cy };\n }\n\n // X range\n const xOpts = options.xAxis;\n let xRange: Range;\n if (xType === \"category\") {\n xRange = [-0.5, Math.max(1, categories.length) - 0.5];\n } else {\n const values: number[] = [];\n for (const s of visible) {\n values.push(s.cols.xMin, s.cols.xMax);\n const pad =\n s.type === \"bar\" || s.type === \"boxplot\"\n ? band / 2\n : s.type === \"candlestick\"\n ? candleBand / 2\n : s.type === \"heatmap\"\n ? s.cellHalf.x\n : 0;\n if (pad) values.push(s.cols.xMin - pad, s.cols.xMax + pad);\n }\n xRange = ensureSpan(\n ...extent(values),\n xType === \"time\" ? [Date.now() - 86400000, Date.now()] : [0, 1],\n );\n const pointsOnly = series.every((s) => s.type === \"scatter\");\n if (pointsOnly) {\n const pad = (xRange[1] - xRange[0]) * 0.04;\n xRange = [xRange[0] - pad, xRange[1] + pad];\n }\n const nice = xOpts?.nice ?? (pointsOnly && xType === \"linear\");\n if (nice && xType === \"linear\") {\n xRange = niceDomain(xRange[0], xRange[1], xOpts?.tickCount ?? 6);\n }\n }\n if (xOpts?.min !== undefined) xRange[0] = xOpts.min;\n if (xOpts?.max !== undefined) xRange[1] = xOpts.max;\n xRange = ensureSpan(xRange[0], xRange[1]);\n\n // Y range (left axis: the series of the right axis are mapped onto it)\n const valuesOf = (list: SeriesModel[], zero: boolean | undefined) => {\n const values: number[] = [];\n for (const s of list) {\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n values.push(...extent(s.barBase), ...extent(s.barTop));\n } else if (s.stackBase && s.stackTop) {\n values.push(...extent(s.stackBase), ...extent(s.stackTop));\n } else if (s.type === \"heatmap\") {\n values.push(s.cols.yMin - s.cellHalf.y, s.cols.yMax + s.cellHalf.y);\n } else {\n values.push(s.cols.yMin, s.cols.yMax);\n }\n }\n const listBars = list.filter((s) => s.type === \"bar\");\n if (listBars.some((s) => !s.floating) || zero) values.push(0);\n if (listBars.some((s) => s.showLabels)) {\n // room for the value labels above the tallest bar\n const [lo, hi] = extent(values);\n if (hi > 0) values.push(hi + (hi - Math.min(0, lo)) * 0.1);\n if (lo < 0) values.push(lo - (Math.max(0, hi) - lo) * 0.1);\n }\n return values;\n };\n const leftVisible = visible.filter((s) => s.yAxis === \"left\");\n const leftSeries = leftVisible.length ? leftVisible : visible;\n const leftBars = leftSeries.filter((s) => s.type === \"bar\");\n let yRange: Range;\n if (yType === \"category\") {\n yRange = [-0.5, Math.max(1, yCategories.length) - 0.5];\n } else {\n const yValues = valuesOf(leftSeries, yOpts?.zero);\n const filled =\n leftBars.length > 0 || leftSeries.some((s) => s.type === \"area\");\n yRange = ensureSpan(...extent(yValues));\n if (series.every((s) => s.type === \"scatter\")) {\n const pad = (yRange[1] - yRange[0]) * 0.06;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n } else if (\n (candles.length || leftSeries.some((s) => s.type === \"boxplot\")) &&\n !leftBars.length\n ) {\n // room above / below the wicks and the outliers\n const pad = (yRange[1] - yRange[0]) * 0.04;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n }\n if ((yOpts?.nice ?? !heatmaps.length) && yType === \"linear\") {\n yRange = niceDomain(yRange[0], yRange[1], yOpts?.tickCount ?? 5);\n }\n if (percent && (bars.length || stackedLines.length)) {\n // 100% stacks: exactly 0-100 (or -100-100)\n yRange = [extent(yValues)[0] < 0 ? -100 : 0, 100];\n }\n if (filled && !yOpts?.zero) {\n // bars start at zero: no padding below / above it\n if (yRange[0] < 0 && extent(yValues)[0] >= 0) yRange[0] = 0;\n }\n }\n if (yOpts?.min !== undefined) yRange[0] = yOpts.min;\n if (yOpts?.max !== undefined) yRange[1] = yOpts.max;\n yRange = ensureSpan(yRange[0], yRange[1]);\n\n // Right axis: a range aligned on the left ticks; its series are mapped\n // onto the left axis\n const y2Opts = options.yAxis2;\n let y2: AxisModel | null = null;\n let y2Map: AxisMap | null = null;\n const rightSeries = series.filter((s) => s.yAxis === \"right\");\n if (rightSeries.length && yType !== \"category\") {\n const rightVisible = rightSeries.filter((s) => !s.hidden);\n const values = valuesOf(rightVisible, y2Opts?.zero);\n const [lo, hi] = ensureSpan(...extent(values));\n let domain: Range =\n y2Opts?.nice === false\n ? [lo, hi]\n : alignedDomain(lo, hi, yRange, yOpts?.tickCount ?? 5);\n if (y2Opts?.min !== undefined) domain[0] = y2Opts.min;\n if (y2Opts?.max !== undefined) domain[1] = y2Opts.max;\n domain = ensureSpan(domain[0], domain[1]);\n const scale = (yRange[1] - yRange[0]) / (domain[1] - domain[0]);\n const map: AxisMap = { scale, offset: yRange[0] - domain[0] * scale };\n y2Map = map;\n const f = (v: number) => v * map.scale + map.offset;\n const column = (a: Float64Array | null) => (a ? a.map(f) : null);\n const zero = f(Math.min(Math.max(0, domain[0]), domain[1]));\n for (const s of rightSeries) {\n const rawBase = s.stackBase;\n s.cols = mapColumns(s.raw, map);\n s.barBase = column(s.barBase);\n s.barTop = column(s.barTop);\n s.stackTop = column(s.stackTop);\n s.stackBase =\n rawBase && rawBase === s.raw.y0\n ? s.cols.y0\n : rawBase\n ? column(rawBase)\n : s.type === \"area\"\n ? new Float64Array(s.cols.count).fill(zero)\n : null;\n }\n y2 = axisModel(y2Opts, \"linear\", [], false, locale);\n }\n\n const zoomOption =\n options.interaction === false\n ? false\n : options.interaction === true || options.interaction === undefined\n ? true\n : (options.interaction.zoom ?? true);\n const zoomAxes =\n zoomOption === false\n ? { x: false, y: false }\n : zoomOption === true\n ? { x: true, y: allScatter }\n : { x: zoomOption.includes(\"x\"), y: zoomOption.includes(\"y\") };\n\n const yFormat =\n yOpts?.format ??\n (percent && (bars.length || stackedLines.length)\n ? (v: number) => formatPercent(v, locale)\n : undefined);\n\n return {\n series,\n x: axisModel(xOpts, xType, categories, false, locale),\n y: {\n ...axisModel(yOpts, yType, yCategories, yType !== \"category\", locale),\n format: yFormat,\n },\n y2,\n y2Map,\n horizontal,\n locale,\n labels,\n formatValue: valueFormatter(locale),\n base: { x: xRange, y: yRange },\n allScatter,\n zoom: zoomAxes,\n tooltipMode: tooltipOptions?.mode ?? (allScatter ? \"nearest\" : \"axis\"),\n baseline: Math.min(Math.max(0, yRange[0]), yRange[1]),\n minSpan: {\n x: xType === \"category\" ? 1 : (xRange[1] - xRange[0]) * 1e-7,\n y: yType === \"category\" ? 1 : (yRange[1] - yRange[0]) * 1e-7,\n },\n percent,\n stacks: input.map((s) =>\n s.stack !== undefined &&\n (s.type === \"bar\" || s.type === \"line\" || s.type === \"area\" || !s.type)\n ? `${s.type === \"bar\" ? \"bar\" : \"line\"}:${s.stack}`\n : null,\n ),\n };\n};\n\n/** Y value drawn for a point: its stacked top for stacks, the close for candles */\nexport const plottedY = (s: SeriesModel, i: number): number =>\n s.barTop ? s.barTop[i] : s.stackTop ? s.stackTop[i] : s.cols.y[i];\n\nconst grids = new WeakMap<SeriesColumns, GridIndex>();\n\n/** Spatial index of a scatter series, built on first use and kept with its data */\nexport const gridOf = (s: SeriesModel): GridIndex => {\n let grid = grids.get(s.cols);\n if (!grid) {\n grid = new GridIndex(s.cols.x, s.cols.y, s.cols.count);\n grids.set(s.cols, grid);\n }\n return grid;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"model.js","names":["LOG_MAP","firstX","data","xs","list","i","item","detectXType","datas","x","axisModel","options","gridDefault","definedEntries","out","value","key","extent","min","max","values","v","smallestStep","step","columns","sorted","k","d","bandOf","category","axis","s","stackValues","totals","percent","byX","stack","count","y","t","running","members","base","top","valid","sums","total","b","DEFAULT_UP","DEFAULT_DOWN","hasDateY","precise","nextStep","power","f","alignedDomain","a0","a1","left","stepL","tickStep","n","lo","hi","ensureSpan","niceDomain","start","mapped","mapColumns","map","hit","src","mapper","column","a","raw","cols","range","add","c","decades","logColumns","rawBase","zero","toPlotY","model","fromPlotY","toPlotX","fromPlotX","viewToValues","view","viewFromValues","next","current","logXCache","logXColumns","gaps","xMin","xMax","floorBases","floor","heatPosition","mid","heatmapStops","dark","luminance","theme","scheme","neutral","mixOklab","end","withLightness","side","negative","color","buildModel","resolve","resolver","resolveStaticColor","fallback","input","locale","resolveLocale","tooltipOptions","labels","chartLabels","xType","categories","collectCategories","categoryMap","resolveX","xResolver","name","yOpts","heatmapData","yCategories","collectYCategories","yType","yLog","yCategoryMap","resolveY","resolverKey","horizontal","usedKeys","series","index","entry","cache","normalizeData","type","paletteColor","pointColors","resolved","rgba","colorScale","valueRange","cellColors","colorMidpoint","colorLut","scale","lut","oklabRamp","ramp","connector","id","toCss","hidden","visible","xLog","allScatter","slotted","bars","band","slots","stackId","share","w","group","slotWidth","slot","stackedBars","stacked","percentStacked","p","y0","stackedLines","candles","candleBand","heatmaps","cx","cy","xOpts","xRange","pad","pointsOnly","xBound","valuesOf","listBars","log","leftVisible","leftSeries","leftBars","yRange","yValues","filled","yBound","y2Opts","y2","y2Map","rightSeries","y2Log","rightVisible","domain","y2Bound","timeline","zoomOption","zoomAxes","yFormat","formatPercent","valueFormatter","plottedY","grids","gridOf","grid","GridIndex"],"sources":["../../../../charts/src/engine/model.ts"],"sourcesContent":["// Options -> chart model: normalized data, colors, bar layout, stacks and\n// the full ranges of the axes. Pure (colors go through the theme's resolver).\n\nimport {\n luminance,\n mixOklab,\n oklabRamp,\n resolveStaticColor,\n toCss,\n withLightness,\n type ColorResolver,\n type Rgba,\n} from \"./color\";\nimport {\n collectCategories,\n collectYCategories,\n normalizeData,\n xResolver,\n type SeriesColumns,\n type YResolver,\n} from \"./data\";\nimport { formatPercent, valueFormatter } from \"./format\";\nimport { chartLabels } from \"./labels\";\nimport { resolveLocale } from \"./locale\";\nimport { ensureSpan, niceDomain, tickStep } from \"./scale\";\nimport { GridIndex } from \"./spatial\";\nimport type { ChartTheme } from \"./theme\";\nimport type {\n ChartAxisOptions,\n ChartAxisType,\n ChartColorScheme,\n ChartCurve,\n ChartOptions,\n ChartSeries,\n ChartSeriesData,\n ChartLabels,\n ChartSeriesType,\n ChartTimeZone,\n} from \"./types\";\nimport type { Range } from \"./viewport\";\n\nexport interface AxisModel {\n type: ChartAxisType;\n reverse: boolean;\n categories: string[];\n title?: string;\n format?: (value: number) => string;\n grid: boolean;\n visible: boolean;\n tickCount?: number;\n /** Locale of the tick and tooltip labels (historical English texts when omitted) */\n locale?: string;\n /** Calendar of a time axis */\n timeZone?: ChartTimeZone;\n}\n\nexport interface SeriesModel {\n index: number;\n /** Key of the GPU resources and of the data cache */\n key: string;\n id: string;\n name: string;\n type: ChartSeriesType;\n color: Rgba;\n colorCss: string;\n lineWidth: number;\n pointSize: number;\n opacity: number;\n hidden: boolean;\n showLabels: boolean;\n curve: ChartCurve;\n /**\n * Plotted columns: the data, mapped onto the left axis for the series of\n * the right axis (`raw` keeps the values of the data)\n */\n cols: SeriesColumns;\n /** Columns of the data (shown in tooltips and labels) */\n raw: SeriesColumns;\n /** Value axis of the series */\n yAxis: \"left\" | \"right\";\n /** Bars with a start (`y0`): drawn from it, never stacked */\n floating: boolean;\n /** Bars / candlesticks: x offset of the series inside a group and half of the bar width */\n barOffset: number;\n barHalfWidth: number;\n /** Bars: bottom / top of every bar (stacks included) */\n barBase: Float64Array | null;\n barTop: Float64Array | null;\n /** Stacked lines / areas: bottom / top of every point */\n stackBase: Float64Array | null;\n stackTop: Float64Array | null;\n /** Scatter / bar: resolved per-point colors */\n pointColors: (Rgba | undefined)[] | null;\n /** Candlesticks: colors of the rising / falling candles */\n upColor: Rgba;\n downColor: Rgba;\n /** Heatmaps: packed color of every cell (0 = no cell) and half of a cell, in data units */\n cellColors: Uint32Array | null;\n cellHalf: { x: number; y: number };\n /** Heatmaps: ramp of the colors and the values at its ends */\n colorScale: Rgba[];\n valueRange: Range;\n /** Heatmaps: value at the middle of the ramp (`null`: linear over the range) */\n colorMidpoint: number | null;\n /** Heatmaps: 256 packed colors along the ramp (OKLab) */\n colorLut: Uint32Array | null;\n /** Hit tests and tooltips include the series */\n tooltip: boolean;\n /** Box plots: outlier rings or dots, and their diameter */\n outlierShape: \"hollow\" | \"filled\";\n outlierSize: number;\n /** Bars: lines from the end of every bar to the next one */\n connector: { color: Rgba; dash: number[]; width: number } | null;\n /** Corner radius in CSS pixels (bars, heatmap cells) */\n radius: number;\n /** Tooltip format of the values */\n format?: (value: number) => string;\n /** Scatter: name of the `value` of the points */\n valueName?: string;\n}\n\n/**\n * Map of the values of a series onto the plotted (left axis) units:\n * `left = (log ? log10(value) : value) * scale + offset`\n */\nexport interface AxisMap {\n scale: number;\n offset: number;\n /** Logarithmic axis: the values are plotted as their base-10 logarithm */\n log?: boolean;\n}\n\n/** Plotted units of a log axis: the base-10 logarithm of the values */\nconst LOG_MAP: AxisMap = { scale: 1, offset: 0, log: true };\n\nexport interface ChartModel {\n series: SeriesModel[];\n x: AxisModel;\n y: AxisModel;\n /** Right value axis (`yAxis2`), `null` when no series uses it */\n y2: AxisModel | null;\n /** Right axis values -> left axis values */\n y2Map: AxisMap | null;\n /** The x axis runs down the left side, the values along the bottom */\n horizontal: boolean;\n /** Resolved locale (`locale` option, else the page language) */\n locale: string;\n /** Texts of the locale with the `labels` overrides */\n labels: ChartLabels;\n /** Tooltip value of the locale (series without `format`) */\n formatValue: (value: number) => string;\n /** Full ranges (zoomed out) */\n base: { x: Range; y: Range };\n /** Every series is a scatter (or a heatmap): nearest tooltips, xy zoom */\n allScatter: boolean;\n zoom: { x: boolean; y: boolean };\n tooltipMode: \"nearest\" | \"axis\" | \"item\";\n /** Y value the areas are filled to */\n baseline: number;\n /** Smallest zoomed spans */\n minSpan: { x: number; y: number };\n /** Stacks are scaled to 100% */\n percent: boolean;\n /** Stack id of every series (`null` when not stacked) */\n stacks: (string | null)[];\n}\n\nexport interface DataCacheEntry {\n data: ChartSeriesData;\n resolverKey: string;\n cols: SeriesColumns;\n}\n\nexport type DataCache = Map<string, DataCacheEntry>;\n\nconst firstX = (data: ChartSeriesData): unknown => {\n if (typeof data === \"object\" && data !== null && !(\"length\" in data)) {\n const xs = (data as { x?: ArrayLike<unknown> }).x;\n return xs && xs.length ? xs[0] : undefined;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < Math.min(list.length, 8); i++) {\n const item = list[i];\n if (Array.isArray(item)) return item[0];\n if (item && typeof item === \"object\") return (item as { x?: unknown }).x;\n }\n return undefined;\n};\n\n/** Axis type when not given: dates -> time, strings -> category */\nexport const detectXType = (\n datas: readonly ChartSeriesData[],\n): ChartAxisType => {\n for (const data of datas) {\n const x = firstX(data);\n if (x instanceof Date) return \"time\";\n if (typeof x === \"string\") return \"category\";\n }\n return \"linear\";\n};\n\nconst axisModel = (\n options: ChartAxisOptions | undefined,\n type: ChartAxisType,\n categories: string[],\n gridDefault: boolean,\n locale: string,\n): AxisModel => ({\n type,\n reverse: !!options?.reverse,\n categories,\n title: options?.title,\n format: options?.format,\n grid: options?.grid ?? gridDefault,\n visible: options?.visible ?? true,\n tickCount: options?.tickCount,\n locale,\n timeZone: options?.timeZone ?? \"local\",\n});\n\n/** Defined entries only (`{ open: undefined }` keeps the built-in text) */\nconst definedEntries = <T extends object>(value: T | undefined): Partial<T> => {\n const out: Partial<T> = {};\n if (!value) return out;\n for (const key of Object.keys(value) as (keyof T)[]) {\n if (value[key] !== undefined) out[key] = value[key];\n }\n return out;\n};\n\nconst extent = (values: ArrayLike<number>): Range => {\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (!Number.isFinite(v)) continue;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n return [min, max];\n};\n\n/** Smallest positive gap between consecutive values (bar width on numeric axes) */\nconst smallestStep = (columns: ArrayLike<number>[], sorted: boolean[]) => {\n let step = Infinity;\n columns.forEach((values, k) => {\n const xs = sorted[k] ? values : Float64Array.from(values).sort();\n for (let i = 1; i < xs.length; i++) {\n const d = xs[i] - xs[i - 1];\n if (d > 0 && d < step) step = d;\n }\n });\n return step;\n};\n\nconst bandOf = (list: SeriesModel[], axis: \"x\" | \"y\", category: boolean) => {\n if (category) return 1;\n const step = smallestStep(\n list.map((s) => (axis === \"x\" ? s.cols.x : s.cols.y)),\n list.map((s) => axis === \"x\" && s.cols.sorted),\n );\n return Number.isFinite(step) ? step : 1;\n};\n\n/**\n * Stacks the y values of series sharing a stack id (positive and negative\n * values separately); `percent` scales every stack to 100 at each x\n */\nconst stackValues = (\n list: { s: SeriesModel; stack: string }[],\n percent: boolean,\n): { base: Float64Array; top: Float64Array }[] => {\n const totals = new Map<string, Map<number, [number, number]>>();\n if (percent) {\n for (const { s, stack } of list) {\n let byX = totals.get(stack);\n if (!byX) totals.set(stack, (byX = new Map()));\n const { x, y, count } = s.cols;\n for (let i = 0; i < count; i++) {\n const v = y[i];\n if (!Number.isFinite(v)) continue;\n const t = byX.get(x[i]) ?? [0, 0];\n if (v >= 0) t[0] += v;\n else t[1] -= v;\n byX.set(x[i], t);\n }\n }\n }\n const running = new Map<string, Map<number, [number, number]>>();\n const members = new Map<string, number>();\n for (const { stack } of list)\n members.set(stack, (members.get(stack) ?? 0) + 1);\n return list.map(({ s, stack }) => {\n const { x, y, count } = s.cols;\n if (!percent && members.get(stack) === 1) {\n // alone in its stack (e.g. grouped bars): from zero, no bookkeeping\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n const v = y[i];\n const valid = Number.isFinite(v);\n base[i] = valid ? 0 : NaN;\n top[i] = valid ? v : NaN;\n }\n return { base, top };\n }\n let byX = running.get(stack);\n if (!byX) running.set(stack, (byX = new Map()));\n const sums = totals.get(stack);\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n let v = y[i];\n if (!Number.isFinite(v)) {\n base[i] = NaN;\n top[i] = NaN;\n continue;\n }\n if (sums) {\n const t = sums.get(x[i]);\n const total = t ? (v >= 0 ? t[0] : t[1]) : 0;\n v = total > 0 ? (v / total) * 100 : 0;\n }\n const t = byX.get(x[i]) ?? [0, 0];\n const b = v >= 0 ? t[0] : t[1];\n base[i] = b;\n top[i] = b + v;\n if (v >= 0) t[0] += v;\n else t[1] += v;\n byX.set(x[i], t);\n }\n return { base, top };\n });\n};\n\nconst DEFAULT_UP = \"var(--success-color, #16a34a)\";\nconst DEFAULT_DOWN = \"var(--danger-color, #dc2626)\";\n\n/** Dates in the y values (or starts) of objects: a time value axis */\nconst hasDateY = (datas: readonly ChartSeriesData[]): boolean => {\n for (const data of datas) {\n if (typeof data !== \"object\" || data === null || !(\"length\" in data))\n continue;\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < Math.min(list.length, 8); i++) {\n const item = list[i];\n if (item && typeof item === \"object\" && !Array.isArray(item)) {\n const d = item as { y?: unknown; y0?: unknown };\n if (d.y instanceof Date || d.y0 instanceof Date) return true;\n }\n }\n }\n return false;\n};\n\nconst precise = (v: number) => Number(v.toPrecision(12));\n\n/** Next step of the 1, 2, 5 × 10^k sequence */\nconst nextStep = (step: number) => {\n const power = 10 ** Math.floor(Math.log10(step) + 1e-9);\n const f = step / power;\n return (f < 1.5 ? 2 : f < 3.5 ? 5 : 10) * power;\n};\n\n/**\n * Range of the right axis covering [lo, hi] with as many tick intervals as\n * the left range has (its ticks then line up with the left grid)\n */\nexport const alignedDomain = (\n lo: number,\n hi: number,\n left: Range,\n count: number,\n): Range => {\n const [a0, a1] = left;\n const stepL = tickStep(a0, a1, count);\n const n = stepL > 0 ? Math.round((a1 - a0) / stepL) : 0;\n [lo, hi] = ensureSpan(lo, hi);\n if (n < 1 || Math.abs(n * stepL - (a1 - a0)) > stepL * 1e-6) {\n return niceDomain(lo, hi, count);\n }\n let step = tickStep(lo, hi, n);\n for (let k = 0; k < 40 && step > 0; k++) {\n const start = Math.floor(lo / step + 1e-9) * step;\n if (start + n * step >= hi - step * 1e-9) {\n return [precise(start), precise(start + n * step)];\n }\n step = nextStep(step);\n }\n return niceDomain(lo, hi, count);\n};\n\nconst mapped = new WeakMap<\n SeriesColumns,\n { key: string; cols: SeriesColumns }\n>();\n\n/** Columns of a right-axis series in left axis units (cached with the data) */\nconst mapColumns = (src: SeriesColumns, map: AxisMap): SeriesColumns => {\n const key = `${map.scale},${map.offset},${!!map.log}`;\n const hit = mapped.get(src);\n if (hit && hit.key === key) return hit.cols;\n const f = mapper(map);\n const column = (a: Float64Array | null) => (a ? a.map(f) : null);\n const raw = src;\n const cols: SeriesColumns = {\n ...raw,\n y: raw.y.map(f),\n open: column(raw.open),\n high: column(raw.high),\n low: column(raw.low),\n y0: column(raw.y0),\n q1: column(raw.q1),\n q3: column(raw.q3),\n outliers: raw.outliers ? raw.outliers.map((list) => list?.map(f)) : null,\n };\n if (map.log) {\n // zeros and negatives have no logarithm: the extent of the others\n const range: Range = [Infinity, -Infinity];\n const add = (a: ArrayLike<number> | null | undefined) => {\n if (!a) return;\n for (let i = 0; i < a.length; i++) {\n const v = a[i];\n if (!Number.isFinite(v)) continue;\n if (v < range[0]) range[0] = v;\n if (v > range[1]) range[1] = v;\n }\n };\n for (const c of [cols.y, cols.y0, cols.high, cols.low, cols.q1, cols.q3])\n add(c);\n cols.outliers?.forEach((list) => add(list));\n cols.yMin = range[0] <= range[1] ? range[0] : NaN;\n cols.yMax = range[0] <= range[1] ? range[1] : NaN;\n } else {\n const lo = f(raw.yMin);\n const hi = f(raw.yMax);\n cols.yMin = Math.min(lo, hi);\n cols.yMax = Math.max(lo, hi);\n }\n mapped.set(src, { key, cols });\n return cols;\n};\n\n/** A log range widened to whole decades (`[0.3, 2.4]` -> `[0, 3]`) */\nconst decades = (range: Range): Range => {\n const lo = Math.floor(range[0] + 1e-9);\n const hi = Math.ceil(range[1] - 1e-9);\n return [lo, hi > lo ? hi : lo + 1];\n};\n\n/**\n * Plots a series through a map: its columns, bars, stacks and lower\n * edges (bars / areas of the right axis start at `zero`)\n */\nconst logColumns = (s: SeriesModel, map: AxisMap, zero = -Infinity) => {\n const f = mapper(map);\n const column = (a: Float64Array | null) => (a ? a.map(f) : null);\n const rawBase = s.stackBase;\n s.cols = mapColumns(s.cols, map);\n s.barBase =\n s.barBase && !s.floating\n ? s.barBase.map((v) => (v === 0 ? (map.log ? -Infinity : f(0)) : f(v)))\n : column(s.barBase);\n s.barTop = column(s.barTop);\n s.stackTop = column(s.stackTop);\n s.stackBase =\n rawBase && rawBase === s.raw.y0\n ? s.cols.y0\n : rawBase\n ? column(rawBase)\n : s.type === \"area\"\n ? new Float64Array(s.cols.count).fill(zero)\n : null;\n};\n\n/** Value -> plotted units of a map (`-Infinity` for 0 on log axes) */\nconst mapper =\n (map: AxisMap) =>\n (v: number): number =>\n (map.log ? Math.log10(v) : v) * map.scale + map.offset;\n\n/** Value of the y axis -> plotted y (the logarithm on log axes) */\nexport const toPlotY = (model: { y: AxisModel }, value: number): number =>\n model.y.type === \"log\" ? Math.log10(value) : value;\n\n/** Plotted y -> value of the y axis */\nexport const fromPlotY = (model: { y: AxisModel }, value: number): number =>\n model.y.type === \"log\" ? 10 ** value : value;\n\n/** Value of the x axis -> plotted x (the logarithm on log axes) */\nexport const toPlotX = (model: { x: AxisModel }, value: number): number =>\n model.x.type === \"log\" ? Math.log10(value) : value;\n\n/** Plotted x -> value of the x axis */\nexport const fromPlotX = (model: { x: AxisModel }, value: number): number =>\n model.x.type === \"log\" ? 10 ** value : value;\n\n/** A view in plotted units -> the values of the axes (zoom events, `getView`) */\nexport const viewToValues = (\n model: { x: AxisModel; y: AxisModel },\n view: { x: Range; y: Range },\n): { x: Range; y: Range } => ({\n x: [fromPlotX(model, view.x[0]), fromPlotX(model, view.x[1])],\n y: [fromPlotY(model, view.y[0]), fromPlotY(model, view.y[1])],\n});\n\n/** Values of the axes -> a view in plotted units (`setView`); missing axes keep `current` */\nexport const viewFromValues = (\n model: { x: AxisModel; y: AxisModel },\n next: { x?: Range; y?: Range },\n current: { x: Range; y: Range },\n): { x: Range; y: Range } => ({\n x: next.x\n ? [toPlotX(model, next.x[0]), toPlotX(model, next.x[1])]\n : current.x,\n y: next.y\n ? [toPlotY(model, next.y[0]), toPlotY(model, next.y[1])]\n : current.y,\n});\n\nconst logXCache = new WeakMap<SeriesColumns, SeriesColumns>();\n\n/**\n * Columns plotted on a log x axis: the logarithms of the x values; points\n * without one (x <= 0) become gaps (cached with the data)\n */\nconst logXColumns = (raw: SeriesColumns): SeriesColumns => {\n const hit = logXCache.get(raw);\n if (hit) return hit;\n const x = raw.x.map((v) => (v > 0 ? Math.log10(v) : NaN));\n let y = raw.y;\n let gaps = false;\n for (let i = 0; i < raw.count; i++) {\n if (Number.isFinite(x[i])) continue;\n if (!gaps) y = Float64Array.from(raw.y);\n gaps = true;\n y[i] = NaN;\n }\n const [xMin, xMax] = extent(x);\n const cols: SeriesColumns = {\n ...raw,\n x,\n y,\n xMin,\n xMax,\n sorted: raw.sorted && !gaps,\n };\n logXCache.set(raw, cols);\n return cols;\n};\n\n/** Replaces the bases of bars / areas on log axes (`-Infinity`) by the bottom of the axis */\nconst floorBases = (s: SeriesModel, floor: number) => {\n for (const a of [s.barBase, s.stackBase]) {\n if (!a) continue;\n for (let i = 0; i < a.length; i++) if (a[i] === -Infinity) a[i] = floor;\n }\n};\n\n/** Position (0-1) of a heatmap value on its color ramp */\nexport const heatPosition = (\n s: Pick<SeriesModel, \"valueRange\" | \"colorMidpoint\">,\n v: number,\n): number => {\n const [lo, hi] = s.valueRange;\n const mid = s.colorMidpoint;\n let t: number;\n if (mid !== null && mid > lo && mid < hi) {\n t =\n v < mid\n ? ((v - lo) / (mid - lo)) * 0.5\n : 0.5 + ((v - mid) / (hi - mid)) * 0.5;\n } else {\n t = (v - lo) / (hi - lo || 1);\n }\n return t < 0 ? 0 : t > 1 ? 1 : t;\n};\n\n/**\n * Built-in ramps of heatmaps, perceptual (OKLab) and theme-aware: light\n * themes go from a near-white tint to a deep hue, dark themes from a dark\n * tint of the surface to a bright saturated hue; diverging ramps meet in a\n * neutral middle\n */\nexport const heatmapStops = (\n scheme: ChartColorScheme,\n color: Rgba,\n theme: ChartTheme,\n negative: Rgba,\n): Rgba[] => {\n const dark = luminance(theme.background) < 0.4;\n if (scheme === \"diverging\") {\n const neutral = mixOklab(\n theme.surface,\n theme.textMuted,\n dark ? 0.12 : 0.08,\n );\n const end = (c: Rgba) =>\n dark ? withLightness(c, 0.7, 1.25) : withLightness(c, 0.5, 1.05);\n const side = (c: Rgba) => mixOklab(neutral, end(c), 0.5);\n return [end(negative), side(negative), neutral, side(color), end(color)];\n }\n return dark\n ? [\n mixOklab(theme.surface, color, 0.14),\n withLightness(color, 0.46, 0.95),\n withLightness(color, 0.64, 1.2),\n withLightness(color, 0.8, 1.15),\n ]\n : [\n mixOklab(theme.surface, color, 0.06),\n withLightness(color, 0.8, 0.6),\n withLightness(color, 0.58, 1),\n withLightness(color, 0.36, 0.9),\n ];\n};\n\nexport const buildModel = (\n options: ChartOptions,\n theme: ChartTheme,\n hidden: ReadonlySet<string>,\n cache: DataCache,\n resolver: ColorResolver | null = null,\n): ChartModel => {\n const resolve: ColorResolver =\n resolver ??\n theme.resolve ??\n ((value, fallback) => resolveStaticColor(value, {}, fallback));\n const input = options.series;\n // resolved at every build: a page language switch shows on the next update\n const locale = resolveLocale(options.locale);\n const tooltipOptions =\n typeof options.tooltip === \"object\" ? options.tooltip : undefined;\n const labels = chartLabels(locale, {\n ...definedEntries(tooltipOptions?.labels),\n ...definedEntries(options.labels),\n });\n const datas = input.map((s) => s.data);\n const xType = options.xAxis?.type ?? detectXType(datas);\n const categories =\n xType === \"category\"\n ? [...(options.xAxis?.categories ?? collectCategories(datas))]\n : [];\n const categoryMap = new Map(categories.map((c, i) => [c, i]));\n const resolveX = xResolver(xType, (name) => categoryMap.get(name) ?? NaN);\n\n // category y axis (heatmap rows): explicit, or detected from string y values\n const yOpts = options.yAxis;\n const heatmapData = input\n .filter((s) => s.type === \"heatmap\")\n .map((s) => s.data);\n const yCategories =\n yOpts?.type === \"category\" || (!yOpts?.type && heatmapData.length)\n ? [...(yOpts?.categories ?? collectYCategories(heatmapData))]\n : [];\n const yType: ChartAxisType =\n yOpts?.type === \"category\" || yCategories.length\n ? \"category\"\n : yOpts?.type === \"time\" || (!yOpts?.type && hasDateY(datas))\n ? \"time\"\n : yOpts?.type === \"log\"\n ? \"log\"\n : \"linear\";\n const yLog = yType === \"log\";\n const yCategoryMap = new Map(yCategories.map((c, i) => [c, i]));\n const resolveY: YResolver = (v) =>\n typeof v === \"number\"\n ? v\n : typeof v === \"string\"\n ? yType === \"category\"\n ? (yCategoryMap.get(v) ?? NaN)\n : yType === \"time\"\n ? Date.parse(v)\n : Number(v)\n : v instanceof Date\n ? v.getTime()\n : NaN;\n const resolverKey = `${xType}|${categories.join(\"\\u0001\")}|${yType}|${yCategories.join(\"\\u0001\")}`;\n const percent = options.stackMode === \"percent\";\n const horizontal = options.orientation === \"horizontal\";\n\n const usedKeys = new Set<string>();\n const series: SeriesModel[] = input.map((s: ChartSeries, index) => {\n let key = s.id ?? `#${index}`;\n while (usedKeys.has(key)) key += \"'\";\n usedKeys.add(key);\n let entry = cache.get(key);\n if (!entry || entry.data !== s.data || entry.resolverKey !== resolverKey) {\n entry = {\n data: s.data,\n resolverKey,\n cols: normalizeData(s.data, resolveX, resolveY),\n };\n cache.set(key, entry);\n }\n const type = s.type ?? \"line\";\n const paletteColor = theme.palette[index % theme.palette.length];\n const color = s.color ? resolve(s.color, paletteColor) : paletteColor;\n const cols = entry.cols;\n let pointColors: (Rgba | undefined)[] | null = null;\n if (\n (type === \"scatter\" || type === \"bar\" || type === \"boxplot\") &&\n cols.colors\n ) {\n const resolved = new Map<string, Rgba>();\n pointColors = cols.colors.map((c) => {\n if (c === undefined) return undefined;\n let rgba = resolved.get(c);\n if (!rgba) resolved.set(c, (rgba = resolve(c, color)));\n return rgba;\n });\n }\n let colorScale: Rgba[] = [];\n let valueRange: Range = [0, 1];\n let cellColors: Uint32Array | null = null;\n let colorMidpoint: number | null = null;\n let colorLut: Uint32Array | null = null;\n if (type === \"heatmap\") {\n const scale = s.colorScale;\n const scheme: ChartColorScheme =\n scale === \"diverging\" ? \"diverging\" : \"sequential\";\n colorScale =\n typeof scale === \"object\" && scale.length\n ? scale.map((c) => resolve(c, color))\n : heatmapStops(\n scheme,\n color,\n theme,\n resolve(DEFAULT_DOWN, [0.86, 0.15, 0.15, 1]),\n );\n valueRange = s.valueRange\n ? [s.valueRange[0], s.valueRange[1]]\n : [cols.valueMin, cols.valueMax];\n if (!Number.isFinite(valueRange[0])) valueRange = [0, 1];\n const [lo, hi] = valueRange;\n colorMidpoint =\n s.colorMidpoint ??\n (scheme === \"diverging\" && typeof scale !== \"object\"\n ? lo < 0 && hi > 0\n ? 0\n : (lo + hi) / 2\n : null);\n const lut = oklabRamp(colorScale);\n colorLut = lut;\n const values = cols.value ?? cols.y;\n const ramp = { valueRange, colorMidpoint };\n cellColors = new Uint32Array(cols.count);\n for (let i = 0; i < cols.count; i++) {\n const v = values[i];\n if (!Number.isFinite(v) || !Number.isFinite(cols.y[i])) continue;\n // 0 means \"no cell\": the ramp never packs to 0\n cellColors[i] = lut[Math.round(heatPosition(ramp, v) * 255)];\n }\n }\n const connector = s.connector\n ? typeof s.connector === \"object\"\n ? s.connector\n : {}\n : null;\n const id = s.id ?? String(index);\n return {\n index,\n key,\n id,\n name: s.name ?? `${labels.series} ${index + 1}`,\n type,\n color,\n colorCss: toCss(color),\n lineWidth:\n s.lineWidth ??\n (type === \"candlestick\" ? 1 : type === \"boxplot\" ? 1.5 : 2),\n pointSize: s.pointSize ?? (type === \"boxplot\" ? 6 : 8),\n opacity:\n s.opacity ??\n (type === \"area\"\n ? 0.28\n : type === \"scatter\"\n ? 0.78\n : type === \"boxplot\"\n ? 0.22\n : 1),\n hidden: !!s.hidden || hidden.has(id),\n showLabels: !!s.showLabels,\n curve: s.curve ?? \"linear\",\n cols,\n raw: cols,\n yAxis: s.yAxis === \"right\" && !horizontal ? \"right\" : \"left\",\n floating: type === \"bar\" && !!cols.y0,\n barOffset: 0,\n barHalfWidth: 0,\n barBase: null,\n barTop: null,\n stackBase: null,\n stackTop: null,\n pointColors,\n upColor:\n type === \"candlestick\"\n ? resolve(s.upColor ?? DEFAULT_UP, [0.09, 0.64, 0.29, 1])\n : color,\n downColor:\n type === \"candlestick\"\n ? resolve(s.downColor ?? DEFAULT_DOWN, [0.86, 0.15, 0.15, 1])\n : color,\n cellColors,\n cellHalf: { x: 0.5, y: 0.5 },\n colorScale,\n valueRange,\n colorMidpoint,\n colorLut,\n tooltip: s.tooltip !== false,\n outlierShape: s.outlierShape ?? \"hollow\",\n outlierSize: s.outlierSize ?? s.pointSize ?? 7,\n connector:\n connector && type === \"bar\"\n ? {\n color: connector.color\n ? resolve(connector.color, theme.textMuted)\n : theme.textMuted,\n dash: [...(connector.dash ?? [3, 3])],\n width: connector.width ?? 1,\n }\n : null,\n radius: s.radius ?? (type === \"heatmap\" ? 2 : type === \"boxplot\" ? 0 : 3),\n format: s.format,\n valueName: s.valueName,\n };\n });\n\n const visible = series.filter((s) => !s.hidden);\n const xLog = xType === \"log\";\n // log x axis: every series is plotted on the logarithms of its x values\n if (xLog) for (const s of series) s.cols = logXColumns(s.raw);\n const allScatter =\n series.length > 0 &&\n series.every((s) => s.type === \"scatter\" || s.type === \"heatmap\");\n\n // Bars and box plots: groups (one slot per stack) and stacking; floating\n // bars (with starts) are drawn from their starts\n const slotted = visible.filter(\n (s) => s.type === \"bar\" || s.type === \"boxplot\",\n );\n const bars = visible.filter((s) => s.type === \"bar\");\n const band = bandOf(slotted, \"x\", xType === \"category\");\n if (slotted.length) {\n const slots = new Map<string, number>();\n const stackId = (s: SeriesModel) =>\n input[s.index].stack ?? `\\u0000${s.key}`;\n for (const s of slotted) {\n if (!slots.has(stackId(s))) slots.set(stackId(s), slots.size);\n }\n let share = 0;\n for (const s of slotted) {\n const w = input[s.index].barWidth;\n if (w !== undefined && w > share) share = Math.min(1, w);\n }\n const group = band * (share || (slots.size > 1 ? 0.78 : 0.62));\n const slotWidth = group / slots.size;\n for (const s of slotted) {\n const slot = slots.get(stackId(s)) ?? 0;\n s.barOffset = -group / 2 + slotWidth * (slot + 0.5);\n s.barHalfWidth = (slotWidth / 2) * (slots.size > 1 ? 0.86 : 1);\n }\n const stackedBars = bars.filter((s) => !s.floating);\n const stacked = stackValues(\n stackedBars.map((s) => ({ s, stack: stackId(s) })),\n false,\n );\n const percentStacked = percent\n ? stackValues(\n stackedBars\n .filter((s) => input[s.index].stack !== undefined)\n .map((s) => ({ s, stack: stackId(s) })),\n true,\n )\n : [];\n let p = 0;\n stackedBars.forEach((s, k) => {\n const values =\n percent && input[s.index].stack !== undefined\n ? percentStacked[p++]\n : stacked[k];\n s.barBase = values.base;\n s.barTop = values.top;\n });\n for (const s of bars) {\n const { y, y0, count } = s.cols;\n if (!s.floating || !y0) continue;\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n const valid = Number.isFinite(y[i]);\n base[i] = valid ? (Number.isFinite(y0[i]) ? y0[i] : 0) : NaN;\n top[i] = valid ? y[i] : NaN;\n }\n s.barBase = base;\n s.barTop = top;\n }\n }\n\n // Range areas: filled down to their lower edges\n for (const s of visible) {\n if (s.type === \"area\" && s.cols.y0 && input[s.index].stack === undefined)\n s.stackBase = s.cols.y0;\n }\n\n // Stacked lines / areas\n const stackedLines = visible.filter(\n (s) =>\n (s.type === \"line\" || s.type === \"area\") &&\n input[s.index].stack !== undefined,\n );\n if (stackedLines.length) {\n const values = stackValues(\n stackedLines.map((s) => ({ s, stack: input[s.index].stack ?? \"\" })),\n percent,\n );\n stackedLines.forEach((s, k) => {\n s.stackBase = values[k].base;\n s.stackTop = values[k].top;\n });\n }\n\n // Candlesticks: one band per x, bodies of 60%\n const candles = visible.filter((s) => s.type === \"candlestick\");\n const candleBand = bandOf(candles, \"x\", xType === \"category\");\n for (const s of candles) s.barHalfWidth = candleBand * 0.3;\n\n // Heatmaps: cells of the size of the smallest step\n const heatmaps = visible.filter((s) => s.type === \"heatmap\");\n if (heatmaps.length) {\n const cx = bandOf(heatmaps, \"x\", xType === \"category\") / 2;\n const cy = bandOf(heatmaps, \"y\", yType === \"category\") / 2;\n for (const s of heatmaps) s.cellHalf = { x: cx, y: cy };\n }\n\n // X range\n const xOpts = options.xAxis;\n let xRange: Range;\n if (xType === \"category\") {\n xRange = [-0.5, Math.max(1, categories.length) - 0.5];\n } else {\n const values: number[] = [];\n for (const s of visible) {\n values.push(s.cols.xMin, s.cols.xMax);\n const pad =\n s.type === \"bar\" || s.type === \"boxplot\"\n ? band / 2\n : s.type === \"candlestick\"\n ? candleBand / 2\n : s.type === \"heatmap\"\n ? s.cellHalf.x\n : 0;\n if (pad) values.push(s.cols.xMin - pad, s.cols.xMax + pad);\n }\n xRange = ensureSpan(\n ...extent(values),\n xType === \"time\" ? [Date.now() - 86400000, Date.now()] : [0, 1],\n );\n const pointsOnly = series.every((s) => s.type === \"scatter\");\n if (pointsOnly) {\n const pad = (xRange[1] - xRange[0]) * 0.04;\n xRange = [xRange[0] - pad, xRange[1] + pad];\n }\n const nice = xOpts?.nice ?? (pointsOnly && xType === \"linear\");\n if (nice && xType === \"linear\") {\n xRange = niceDomain(xRange[0], xRange[1], xOpts?.tickCount ?? 6);\n }\n if (xLog && xOpts?.nice !== false) xRange = decades(xRange);\n }\n const xBound = (v: number) => (xLog ? Math.log10(v) : v);\n if (xOpts?.min !== undefined) xRange[0] = xBound(xOpts.min);\n if (xOpts?.max !== undefined) xRange[1] = xBound(xOpts.max);\n xRange = ensureSpan(xRange[0], xRange[1]);\n\n // Log axis: the left series are plotted as logarithms (stacks are summed\n // first); bars and areas from zero start at the bottom of the axis\n if (yLog) {\n for (const s of series) {\n if (s.yAxis === \"right\" || s.type === \"heatmap\") continue;\n logColumns(s, LOG_MAP);\n }\n }\n\n // Y range (left axis: the series of the right axis are mapped onto it)\n const valuesOf = (\n list: SeriesModel[],\n zero: boolean | undefined,\n log = false,\n ) => {\n const values: number[] = [];\n for (const s of list) {\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n values.push(...extent(s.barBase), ...extent(s.barTop));\n } else if (s.stackBase && s.stackTop) {\n values.push(...extent(s.stackBase), ...extent(s.stackTop));\n } else if (s.type === \"heatmap\") {\n values.push(s.cols.yMin - s.cellHalf.y, s.cols.yMax + s.cellHalf.y);\n } else {\n values.push(s.cols.yMin, s.cols.yMax);\n }\n }\n const listBars = list.filter((s) => s.type === \"bar\");\n if (!log && (listBars.some((s) => !s.floating) || zero)) values.push(0);\n if (listBars.some((s) => s.showLabels)) {\n // room for the value labels above the tallest bar\n const [lo, hi] = extent(values);\n if (hi > 0) values.push(hi + (hi - Math.min(0, lo)) * 0.1);\n if (lo < 0) values.push(lo - (Math.max(0, hi) - lo) * 0.1);\n }\n return values;\n };\n const leftVisible = visible.filter((s) => s.yAxis === \"left\");\n const leftSeries = leftVisible.length ? leftVisible : visible;\n const leftBars = leftSeries.filter((s) => s.type === \"bar\");\n let yRange: Range;\n if (yType === \"category\") {\n yRange = [-0.5, Math.max(1, yCategories.length) - 0.5];\n } else {\n const yValues = valuesOf(leftSeries, yOpts?.zero, yLog);\n const filled =\n leftBars.length > 0 || leftSeries.some((s) => s.type === \"area\");\n yRange = ensureSpan(...extent(yValues));\n if (series.every((s) => s.type === \"scatter\")) {\n const pad = (yRange[1] - yRange[0]) * 0.06;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n } else if (\n (candles.length || leftSeries.some((s) => s.type === \"boxplot\")) &&\n !leftBars.length\n ) {\n // room above / below the wicks and the outliers\n const pad = (yRange[1] - yRange[0]) * 0.04;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n }\n if ((yOpts?.nice ?? !heatmaps.length) && yType === \"linear\") {\n yRange = niceDomain(yRange[0], yRange[1], yOpts?.tickCount ?? 5);\n }\n if (yLog && yOpts?.nice !== false) yRange = decades(yRange);\n if (percent && (bars.length || stackedLines.length)) {\n // 100% stacks: exactly 0-100 (or -100-100)\n yRange = [extent(yValues)[0] < 0 ? -100 : 0, 100];\n }\n if (filled && !yOpts?.zero && !yLog) {\n // bars start at zero: no padding below / above it\n if (yRange[0] < 0 && extent(yValues)[0] >= 0) yRange[0] = 0;\n }\n }\n const yBound = (v: number) => (yLog ? Math.log10(v) : v);\n if (yOpts?.min !== undefined) yRange[0] = yBound(yOpts.min);\n if (yOpts?.max !== undefined) yRange[1] = yBound(yOpts.max);\n yRange = ensureSpan(yRange[0], yRange[1]);\n if (yLog) {\n for (const s of series) if (s.yAxis === \"left\") floorBases(s, yRange[0]);\n }\n\n // Right axis: a range aligned on the left ticks; its series are mapped\n // onto the left axis\n const y2Opts = options.yAxis2;\n let y2: AxisModel | null = null;\n let y2Map: AxisMap | null = null;\n const rightSeries = series.filter((s) => s.yAxis === \"right\");\n if (rightSeries.length && yType !== \"category\") {\n const y2Log = y2Opts?.type === \"log\";\n const rightVisible = rightSeries.filter((s) => !s.hidden);\n // log: the extent of the logarithms\n const values = y2Log\n ? rightVisible.flatMap((s) => {\n const c = mapColumns(s.raw, LOG_MAP);\n return [c.yMin, c.yMax];\n })\n : valuesOf(rightVisible, y2Opts?.zero);\n const [lo, hi] = ensureSpan(...extent(values));\n let domain: Range =\n y2Opts?.nice === false\n ? [lo, hi]\n : y2Log\n ? decades([lo, hi])\n : alignedDomain(lo, hi, yRange, yOpts?.tickCount ?? 5);\n const y2Bound = (v: number) => (y2Log ? Math.log10(v) : v);\n if (y2Opts?.min !== undefined) domain[0] = y2Bound(y2Opts.min);\n if (y2Opts?.max !== undefined) domain[1] = y2Bound(y2Opts.max);\n domain = ensureSpan(domain[0], domain[1]);\n const scale = (yRange[1] - yRange[0]) / (domain[1] - domain[0]);\n const map: AxisMap = {\n scale,\n offset: yRange[0] - domain[0] * scale,\n log: y2Log,\n };\n y2Map = map;\n const zero = y2Log\n ? yRange[0]\n : mapper(map)(Math.min(Math.max(0, domain[0]), domain[1]));\n for (const s of rightSeries) {\n logColumns(s, map, zero);\n floorBases(s, yRange[0]);\n }\n y2 = axisModel(y2Opts, y2Log ? \"log\" : \"linear\", [], false, locale);\n }\n\n // range bars on a time axis (Gantt charts): rows are unrelated, the\n // tooltip shows the task under the pointer\n const timeline =\n yType === \"time\" &&\n series.some((s) => s.type === \"bar\") &&\n series.every((s) => (s.type === \"bar\" ? s.floating : s.type === \"scatter\"));\n\n const zoomOption =\n options.interaction === false\n ? false\n : options.interaction === true || options.interaction === undefined\n ? true\n : (options.interaction.zoom ?? true);\n const zoomAxes =\n zoomOption === false\n ? { x: false, y: false }\n : zoomOption === true\n ? { x: true, y: allScatter }\n : { x: zoomOption.includes(\"x\"), y: zoomOption.includes(\"y\") };\n\n const yFormat =\n yOpts?.format ??\n (percent && (bars.length || stackedLines.length)\n ? (v: number) => formatPercent(v, locale)\n : undefined);\n\n return {\n series,\n x: axisModel(xOpts, xType, categories, false, locale),\n y: {\n ...axisModel(yOpts, yType, yCategories, yType !== \"category\", locale),\n format: yFormat,\n },\n y2,\n y2Map,\n horizontal,\n locale,\n labels,\n formatValue: valueFormatter(locale),\n base: { x: xRange, y: yRange },\n allScatter,\n zoom: zoomAxes,\n tooltipMode:\n tooltipOptions?.mode ??\n (allScatter ? \"nearest\" : timeline ? \"item\" : \"axis\"),\n baseline: yLog ? yRange[0] : Math.min(Math.max(0, yRange[0]), yRange[1]),\n minSpan: {\n x: xType === \"category\" ? 1 : (xRange[1] - xRange[0]) * 1e-7,\n y: yType === \"category\" ? 1 : (yRange[1] - yRange[0]) * 1e-7,\n },\n percent,\n stacks: input.map((s) =>\n s.stack !== undefined &&\n (s.type === \"bar\" || s.type === \"line\" || s.type === \"area\" || !s.type)\n ? `${s.type === \"bar\" ? \"bar\" : \"line\"}:${s.stack}`\n : null,\n ),\n };\n};\n\n/** Y value drawn for a point: its stacked top for stacks, the close for candles */\nexport const plottedY = (s: SeriesModel, i: number): number =>\n s.barTop ? s.barTop[i] : s.stackTop ? s.stackTop[i] : s.cols.y[i];\n\nconst grids = new WeakMap<SeriesColumns, GridIndex>();\n\n/** Spatial index of a scatter series, built on first use and kept with its data */\nexport const gridOf = (s: SeriesModel): GridIndex => {\n let grid = grids.get(s.cols);\n if (!grid) {\n grid = new GridIndex(s.cols.x, s.cols.y, s.cols.count);\n grids.set(s.cols, grid);\n }\n return grid;\n};\n"],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ const e=require("../defaults.cjs"),t=require("../renderers/gl.cjs"),n=require("../renderers/gl-budget.cjs"),r=require("../renderers/detect.cjs");var i=1024,a=(e,t)=>{let n=new Uint32Array(1025),r=e.length-1;for(let a=0;a<=i;a++){let o=Math.min(1,Math.max(0,t(a/i)));n[a]=e[Math.round(o*r)]??0}return n},o=(e,t,n=16384)=>{let r=e.length,i=Math.min(r,Math.max(1,n)),a=r%7919?7919:7907,o=t=>e[i===r?t:t*a%r],s=0;for(let e=0;e<i;e++)o(e)>0&&s++;if(!s)return NaN;let c=new Float64Array(s),l=0;for(let e=0;e<i;e++){let t=o(e);t>0&&(c[l++]=t)}c.sort();let u=Math.min(s-1,Math.max(0,t*(s-1))),d=Math.floor(u),f=Math.min(s-1,d+1);return c[d]+(c[f]-c[d])*(u-d)},s=(e,t)=>{let{sources:n,step:r,tick:i,x0:a,x1:o,y0:s,y1:c,end:l}=e;if(!(r>0)||!(i>0)||!(o>a)||!(c>s)||!Number.isFinite(a+o+s+c))return null;let u=r*Math.max(1,Math.ceil((o-a)/r/Math.max(1,e.maxWidth))),d=Math.floor(a/u)*u,f=Math.max(1,Math.ceil((o-d)/u)),p=Math.round(s/i),m=Math.round(c/i),h=Math.max(1,Math.ceil((m-p+1)/Math.max(1,e.maxHeight))),g=Math.floor(p/h)*h,_=Math.max(1,Math.ceil((m+1-g)/h)),v=f*_,y=t&&t.cells.length===v?t.cells.fill(0):new Float32Array(v),b=(e,t)=>{let{bins:n,sizes:r}=e;for(let e=0;e<r.length;e++){let i=r[e];if(!(i>0))continue;let a=Math.floor((n[e]-g)/h);if(a<0||a>=_)continue;let o=(_-1-a)*f+t;i>y[o]&&(y[o]=i)}},x=e=>{for(let t=0,n=e;t<_;t++,n+=f)y[n]=y[n-1]},S=0,C=n.length;for(;S<C;){let e=S+C>>>1;n[e].time<d?S=e+1:C=e}let w=S,T=S>0?n[S-1]:null;for(let e=0;e<f;e++){let t=d+e*u;if(t>=l)break;let r=t+u,i=!1;for(;w<n.length&&n[w].time<r;)b(n[w],e),T=n[w],i=!0,w++;!i&&T&&(e===0?b(T,0):x(e))}return{width:f,height:_,pixels:t&&t.pixels.length===v?t.pixels:new Uint32Array(v),cells:y,t0:d,t1:d+f*u,p0:(g-.5)*i,p1:(g+_*h-.5)*i,version:(t?.version??0)+1}},c=(e,t,n)=>{let{cells:r,pixels:i}=e,a=t.length-1,o=t[0]??0,s=n>0&&Number.isFinite(n)?n:0;for(let e=0;e<r.length;e++){let n=r[e]*s;i[e]=n>0?t[n>=a?a:n|0]:o}e.version++},l=`
2
+ attribute vec2 a_corner;
3
+ uniform vec4 u_rect;
4
+ varying vec2 v_uv;
5
+ void main() {
6
+ v_uv = a_corner;
7
+ gl_Position = vec4(mix(u_rect.x, u_rect.z, a_corner.x), mix(u_rect.y, u_rect.w, a_corner.y), 0.0, 1.0);
8
+ }`,u=`
9
+ #ifdef GL_FRAGMENT_PRECISION_HIGH
10
+ precision highp float;
11
+ #else
12
+ precision mediump float;
13
+ #endif
14
+ uniform sampler2D u_texture;
15
+ varying vec2 v_uv;
16
+ void main() {
17
+ gl_FragColor = vec4(texture2D(u_texture, v_uv).rgb, 1.0);
18
+ }`,d=(e,t,n)=>[e[0]/t*2-1,1-e[1]/n*2,e[2]/t*2-1,1-e[3]/n*2],f=e=>new Uint8Array(e.pixels.buffer,e.pixels.byteOffset,e.width*e.height*4),p=(e,r,i,a=!1)=>{let o={...t.glContextAttributes(a),alpha:!1,premultipliedAlpha:!1},s=e.getContext(r,o);if(!s)return null;let c=()=>(s.getExtension(`WEBGL_lose_context`)?.loseContext(),null);if(a&&t.isSoftwareRenderer(s))return c();let p=()=>{let e=t.compileProgram(s,{vertex:l,fragment:u},[`a_corner`]);if(!e)return null;let n=s.createBuffer();s.bindBuffer(s.ARRAY_BUFFER,n),s.bufferData(s.ARRAY_BUFFER,new Float32Array([0,0,1,0,0,1,1,1]),s.STATIC_DRAW);let r=s.createTexture();return s.bindTexture(s.TEXTURE_2D,r),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_MIN_FILTER,s.NEAREST),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_MAG_FILTER,s.NEAREST),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_WRAP_S,s.CLAMP_TO_EDGE),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_WRAP_T,s.CLAMP_TO_EDGE),{program:e,rectAt:s.getUniformLocation(e.program,`u_rect`),textureAt:s.getUniformLocation(e.program,`u_texture`),corners:n,texture:r}},m=p();if(!m)return c();let h=null,g=-1,_=[0,0],v=!1,y=!1,b=null,x=()=>{m=null,h=null,g=-1,_=[0,0]},S=n.claimGlSlot(e,s,{suspend:x,restore:()=>{x(),m=p(),m?b&&C(b.grid,b.rect,b.clear):(y=!0,v||i())},lost:()=>{y=!0,v||i()}}),C=(t,n,r)=>{if(!m)return;let{program:i,rectAt:a,textureAt:o,corners:c,texture:l}=m,u=e.width,p=e.height;s.viewport(0,0,u,p),s.disable(s.BLEND),s.clearColor(r[0],r[1],r[2],1),s.clear(s.COLOR_BUFFER_BIT),t&&(s.useProgram(i.program),s.activeTexture(s.TEXTURE0),s.bindTexture(s.TEXTURE_2D,l),(t!==h||t.version!==g)&&(s.pixelStorei(s.UNPACK_ALIGNMENT,4),s.pixelStorei(s.UNPACK_FLIP_Y_WEBGL,!1),s.pixelStorei(s.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),_[0]===t.width&&_[1]===t.height?s.texSubImage2D(s.TEXTURE_2D,0,0,0,t.width,t.height,s.RGBA,s.UNSIGNED_BYTE,f(t)):(s.texImage2D(s.TEXTURE_2D,0,s.RGBA,t.width,t.height,0,s.RGBA,s.UNSIGNED_BYTE,f(t)),_=[t.width,t.height]),h=t,g=t.version),s.uniform1i(o,0),s.uniform4fv(a,d(n,u,p)),s.bindBuffer(s.ARRAY_BUFFER,c),s.enableVertexAttribArray(0),s.vertexAttribPointer(0,2,s.FLOAT,!1,0,0),s.drawArrays(s.TRIANGLE_STRIP,0,4))};return{kind:r,canvas:e,resize(t,n){e.width=Math.max(1,t),e.height=Math.max(1,n)},render(e,t,n){v||(b={grid:e,rect:t,clear:n},!(y||!S.use()||s.isContextLost())&&C(e,t,n))},destroy(){v=!0,b=null,S.release(),m&&!s.isContextLost()&&(s.deleteTexture(m.texture),s.deleteBuffer(m.corners),s.deleteProgram(m.program.program),s.getExtension(`WEBGL_lose_context`)?.loseContext()),m=null}}},m=`
19
+ struct Uniforms { rect: vec4f };
20
+ @group(0) @binding(0) var<uniform> u: Uniforms;
21
+ @group(0) @binding(1) var heat: texture_2d<f32>;
22
+ @group(0) @binding(2) var nearest: sampler;
23
+ struct Varyings {
24
+ @builtin(position) position: vec4f,
25
+ @location(0) uv: vec2f,
26
+ };
27
+ @vertex fn vs(@builtin(vertex_index) i: u32) -> Varyings {
28
+ let c = vec2f(f32(i & 1u), f32(i >> 1u));
29
+ var out: Varyings;
30
+ out.position = vec4f(mix(u.rect.x, u.rect.z, c.x), mix(u.rect.y, u.rect.w, c.y), 0.0, 1.0);
31
+ out.uv = c;
32
+ return out;
33
+ }
34
+ @fragment fn fs(v: Varyings) -> @location(0) vec4f {
35
+ return vec4f(textureSample(heat, nearest, v.uv).rgb, 1.0);
36
+ }`,h=1,g=2,_=async(e,t,n=!1)=>{let r=typeof navigator<`u`?navigator.gpu:void 0;if(!r)return null;let i=await r.requestAdapter();if(!i)return null;let a=i;if(n&&(a.info?.isFallbackAdapter||a.isFallbackAdapter))return null;let o=await i.requestDevice(),s=e.getContext(`webgpu`);if(!s)return o.destroy(),null;let c=r.getPreferredCanvasFormat();s.configure({device:o,format:c,alphaMode:`opaque`});let l=!1;o.lost.then(()=>{l||t()});let u=o.createBindGroupLayout({entries:[{binding:0,visibility:h,buffer:{type:`uniform`}},{binding:1,visibility:g,texture:{}},{binding:2,visibility:g,sampler:{}}]}),p=o.createShaderModule({code:m}),_=o.createRenderPipeline({layout:o.createPipelineLayout({bindGroupLayouts:[u]}),vertex:{module:p,entryPoint:`vs`},fragment:{module:p,entryPoint:`fs`,targets:[{format:c}]},primitive:{topology:`triangle-strip`}}),v=o.createSampler({magFilter:`nearest`,minFilter:`nearest`,addressModeU:`clamp-to-edge`,addressModeV:`clamp-to-edge`}),y=o.createBuffer({size:16,usage:72}),b=null,x=null,S=null,C=-1;return{kind:`webgpu`,canvas:e,resize(t,n){e.width=Math.max(1,t),e.height=Math.max(1,n)},render(t,n,r){if(l)return;t&&(t!==S||t.version!==C)&&((!b||b.width!==t.width||b.height!==t.height)&&(b?.destroy(),b=o.createTexture({size:{width:t.width,height:t.height},format:`rgba8unorm`,usage:6}),x=o.createBindGroup({layout:u,entries:[{binding:0,resource:{buffer:y}},{binding:1,resource:b.createView()},{binding:2,resource:v}]})),o.queue.writeTexture({texture:b},f(t),{bytesPerRow:t.width*4,rowsPerImage:t.height},{width:t.width,height:t.height}),S=t,C=t.version),o.queue.writeBuffer(y,0,new Float32Array(d(n,e.width,e.height)));let i=o.createCommandEncoder(),a=i.beginRenderPass({colorAttachments:[{view:s.getCurrentTexture().createView(),clearValue:{r:r[0],g:r[1],b:r[2],a:1},loadOp:`clear`,storeOp:`store`}]});t&&x&&(a.setPipeline(_),a.setBindGroup(0,x),a.draw(4)),a.end(),o.queue.submit([i.finish()])},destroy(){l=!0,b?.destroy(),y.destroy(),s.unconfigure(),o.destroy()}}},v=e=>{let t=e.getContext(`2d`,{alpha:!1});if(!t)return null;let n=e.ownerDocument.createElement(`canvas`),r=n.getContext(`2d`),i=null,a=-1;return{kind:`canvas2d`,canvas:e,resize(t,n){e.width=Math.max(1,t),e.height=Math.max(1,n)},render(o,s,c){if(t.setTransform(1,0,0,1,0,0),t.fillStyle=`rgb(${Math.round(c[0]*255)}, ${Math.round(c[1]*255)}, ${Math.round(c[2]*255)})`,t.fillRect(0,0,e.width,e.height),o&&r){if(o!==i||o.version!==a){n.width!==o.width&&(n.width=o.width),n.height!==o.height&&(n.height=o.height);let e=r.createImageData?.(o.width,o.height);if(!e?.data)return;e.data.set(f(o)),r.putImageData(e,0,0),i=o,a=o.version}t.imageSmoothingEnabled=!1,t.drawImage(n,s[0],s[1],s[2]-s[0],s[3]-s[1])}},destroy(){i=null}}},y=async(t,n,i,a)=>{let o=e.resolveRendererPreference(t);for(let e of r.rendererCandidates(o,a)){let t=o===`auto`||o!==e,r;try{let a=n(),o=()=>i(e);r=e===`webgpu`?await _(a,o,t):e===`canvas2d`?v(a):p(a,e,o,t)}catch{r=null}if(r)return r}return null};exports.HEAT_TABLE_SIZE=i,exports.buildHeatGrid=s,exports.createCanvasHeatField=v,exports.createGlHeatField=p,exports.createHeatFieldRenderer=y,exports.createWebGpuHeatField=_,exports.heatTable=a,exports.paintHeatGrid=c,exports.percentile=o;
37
+ //# sourceMappingURL=field.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field.cjs","names":["glContextAttributes","isSoftwareRenderer","compileProgram","claimGlSlot","resolveRendererPreference","rendererCandidates","require_defaults","require_gl","require_gl_budget","require_detect","HEAT_TABLE_SIZE","heatTable","table","last","lut","j","t","curve","percentile","len","values","m","limit","prime","value","n","sorted","k","v","at","q","lo","hi","buildHeatGrid","input","step","tick","x1","x0","y1","y0","g","gs","width","binLo","binHi","ry","base","height","count","cells","reuse","plot","source","sizes","s","r","bins","idx","i","repeat","sources","mid","previous","start","end","stop","hit","paintHeatGrid","grid","cold","scale","GLSL_VERTEX","GLSL_FRAGMENT","clipRect","rect","bytesOf","createGlHeatField","attributes","requireHardware","gl","canvas","kind","reject","setup","program","corners","texture","objects","uploaded","uploadedVersion","size","destroyed","lost","forget","slot","draw","onLost","w","h","clear","textureAt","rectAt","WGSL","STAGE_VERTEX","STAGE_FRAGMENT","createWebGpuHeatField","gpu","adapter","info","device","context","format","layout","module","pipeline","sampler","uniform","bindGroup","encoder","pass","createCanvasHeatField","ctx","image","imageCtx","data","createHeatFieldRenderer","preference","requested","exclude","field","makeCanvas"],"sources":["../../../../../charts/src/engine/orderbook/field.ts"],"sourcesContent":["// Heat field of the order book heatmap. The liquidity of the visible\n// window is rasterized on the CPU into a small image, one texel per column\n// (sampling interval) and price row (tick), and drawn as ONE textured quad\n// with nearest filtering over a clear of the coldest color:\n// - rows and columns abut by construction (every device pixel samples\n// exactly one texel), so there are no anti-aliased seams between cells;\n// - a column fills until the next snapshot (gaps repeat the last book) and\n// the live one fills to the right edge;\n// - empty cells are the cold end of the ramp, never a transparent hole;\n// - the output is opaque (no blending), the same on every backend.\n// The backends mirror the chart engine's (WebGPU -> WebGL2 -> WebGL ->\n// Canvas2D, software GPUs skipped with `auto`), but with their own tiny\n// pipelines: a canvas only ever holds one context type.\n\nimport { resolveRendererPreference } from \"../defaults\";\nimport type { Rgba } from \"../color\";\nimport { rendererCandidates } from \"../renderers/detect\";\nimport {\n compileProgram,\n glContextAttributes,\n isSoftwareRenderer,\n type GlContext,\n} from \"../renderers/gl\";\nimport { claimGlSlot } from \"../renderers/gl-budget\";\nimport type { ChartRendererKind, ChartRendererPreference } from \"../types\";\n\n/** One sampled book: price rows (price / tick) and their resting sizes */\nexport interface HeatSource {\n /** Start time of the column */\n time: number;\n bins: ArrayLike<number>;\n sizes: ArrayLike<number>;\n}\n\n/** The rasterized field: packed RGBA texels, row 0 at the top (highest prices) */\nexport interface HeatGrid {\n width: number;\n height: number;\n pixels: Uint32Array;\n /** Resting size of every texel (max-pooled), same layout as `pixels` */\n cells: Float32Array;\n /** Times at the left / right edges of the image */\n t0: number;\n t1: number;\n /** Prices at the bottom / top edges of the image */\n p0: number;\n p1: number;\n /** Bumped on every rebuild (uploads are skipped while unchanged) */\n version: number;\n}\n\nexport interface HeatGridInput {\n /** Columns sorted by time (the live book last) */\n sources: readonly HeatSource[];\n /** Sampling interval (ms) */\n step: number;\n /** Price row height */\n tick: number;\n /** Visible time / price ranges */\n x0: number;\n x1: number;\n y0: number;\n y1: number;\n /** End of the data (the live time): texels starting later stay cold */\n end: number;\n /** Largest image (texels); denser data is max-pooled, walls stay visible */\n maxWidth: number;\n maxHeight: number;\n}\n\n/** Entries of a heat table (resolution of the size → color mapping) */\nexport const HEAT_TABLE_SIZE = 1024;\n\n/**\n * Size → color table of a ramp: entry `j` is the color of the relative size\n * `j / HEAT_TABLE_SIZE` through `curve` (0-1 → 0-1). Entry 0 is the cold end.\n */\nexport const heatTable = (\n lut: Uint32Array,\n curve: (r: number) => number,\n): Uint32Array => {\n const table = new Uint32Array(HEAT_TABLE_SIZE + 1);\n const last = lut.length - 1;\n for (let j = 0; j <= HEAT_TABLE_SIZE; j++) {\n const t = Math.min(1, Math.max(0, curve(j / HEAT_TABLE_SIZE)));\n table[j] = lut[Math.round(t * last)] ?? 0;\n }\n return table;\n};\n\n/**\n * `q`-quantile (0-1) of the positive values, NaN without any. Arrays longer\n * than `limit` are sampled (a prime stride, so a grid's rows and columns\n * are both covered).\n */\nexport const percentile = (\n values: ArrayLike<number>,\n q: number,\n limit = 16384,\n): number => {\n const len = values.length;\n const m = Math.min(len, Math.max(1, limit));\n const prime = len % 7919 ? 7919 : 7907;\n const value = (j: number) => values[m === len ? j : (j * prime) % len]!;\n let n = 0;\n for (let j = 0; j < m; j++) if (value(j) > 0) n++;\n if (!n) return NaN;\n const sorted = new Float64Array(n);\n let k = 0;\n for (let j = 0; j < m; j++) {\n const v = value(j);\n if (v > 0) sorted[k++] = v;\n }\n sorted.sort();\n const at = Math.min(n - 1, Math.max(0, q * (n - 1)));\n const lo = Math.floor(at);\n const hi = Math.min(n - 1, lo + 1);\n return sorted[lo]! + (sorted[hi]! - sorted[lo]!) * (at - lo);\n};\n\n/**\n * Rasterizes the visible liquidity into `cells` (the colors are set by\n * `paintHeatGrid`). Pass the previous grid as `reuse` to recycle its\n * buffers. Returns `null` without a valid range.\n */\nexport const buildHeatGrid = (\n input: HeatGridInput,\n reuse?: HeatGrid | null,\n): HeatGrid | null => {\n const { sources, step, tick, x0, x1, y0, y1, end } = input;\n if (\n !(step > 0) ||\n !(tick > 0) ||\n !(x1 > x0) ||\n !(y1 > y0) ||\n !Number.isFinite(x0 + x1 + y0 + y1)\n )\n return null;\n // time texels: `cx` columns each\n const cx = Math.max(\n 1,\n Math.ceil((x1 - x0) / step / Math.max(1, input.maxWidth)),\n );\n const g = step * cx;\n const gs = Math.floor(x0 / g) * g;\n const width = Math.max(1, Math.ceil((x1 - gs) / g));\n // price texels: `ry` rows each; a row covers [bin - ½, bin + ½) × tick\n const binLo = Math.round(y0 / tick);\n const binHi = Math.round(y1 / tick);\n const ry = Math.max(\n 1,\n Math.ceil((binHi - binLo + 1) / Math.max(1, input.maxHeight)),\n );\n const base = Math.floor(binLo / ry) * ry;\n const height = Math.max(1, Math.ceil((binHi + 1 - base) / ry));\n const count = width * height;\n\n const cells =\n reuse && reuse.cells.length === count\n ? reuse.cells.fill(0)\n : new Float32Array(count);\n const plot = (source: HeatSource, i: number) => {\n const { bins, sizes } = source;\n for (let k = 0; k < sizes.length; k++) {\n const s = sizes[k]!;\n if (!(s > 0)) continue;\n const r = Math.floor((bins[k]! - base) / ry);\n if (r < 0 || r >= height) continue;\n const idx = (height - 1 - r) * width + i;\n if (s > cells[idx]!) cells[idx] = s;\n }\n };\n const repeat = (i: number) => {\n for (let r = 0, idx = i; r < height; r++, idx += width)\n cells[idx] = cells[idx - 1]!;\n };\n\n // first source inside the image, and the one before (filled forward)\n let lo = 0;\n let hi = sources.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (sources[mid]!.time < gs) lo = mid + 1;\n else hi = mid;\n }\n let s = lo;\n let previous: HeatSource | null = lo > 0 ? sources[lo - 1]! : null;\n for (let i = 0; i < width; i++) {\n const start = gs + i * g;\n if (start >= end) break;\n const stop = start + g;\n let hit = false;\n while (s < sources.length && sources[s]!.time < stop) {\n plot(sources[s]!, i);\n previous = sources[s]!;\n hit = true;\n s++;\n }\n if (hit || !previous) continue;\n if (i === 0) plot(previous, 0);\n else repeat(i);\n }\n\n const pixels =\n reuse && reuse.pixels.length === count\n ? reuse.pixels\n : new Uint32Array(count);\n return {\n width,\n height,\n pixels,\n cells,\n t0: gs,\n t1: gs + width * g,\n p0: (base - 0.5) * tick,\n p1: (base + height * ry - 0.5) * tick,\n version: (reuse?.version ?? 0) + 1,\n };\n};\n\n/**\n * Colors the cells of a grid: `table[min(last, floor(size × scale))]`\n * (see `heatTable`), empty cells the cold end. Bumps the version.\n */\nexport const paintHeatGrid = (\n grid: HeatGrid,\n table: Uint32Array,\n scale: number,\n): void => {\n const { cells, pixels } = grid;\n const last = table.length - 1;\n const cold = table[0] ?? 0;\n const k = scale > 0 && Number.isFinite(scale) ? scale : 0;\n for (let idx = 0; idx < cells.length; idx++) {\n const v = cells[idx]! * k;\n pixels[idx] = v > 0 ? table[v >= last ? last : v | 0]! : cold;\n }\n grid.version++;\n};\n\n// ------------------------------------------------------------- renderers\n\n/** Draws heat grids on its own canvas (sized and placed by the caller) */\nexport interface HeatFieldRenderer {\n readonly kind: ChartRendererKind;\n readonly canvas: HTMLCanvasElement;\n /** Sets the size of the drawing buffer (device pixels) */\n resize(width: number, height: number): void;\n /**\n * Clears to `clear` (opaque) and draws `grid` stretched over `rect`\n * ([left, top, right, bottom] in device pixels, y down)\n */\n render(\n grid: HeatGrid | null,\n rect: readonly [number, number, number, number],\n clear: Rgba,\n ): void;\n destroy(): void;\n}\n\nconst GLSL_VERTEX = `\nattribute vec2 a_corner;\nuniform vec4 u_rect;\nvarying vec2 v_uv;\nvoid main() {\n v_uv = a_corner;\n gl_Position = vec4(mix(u_rect.x, u_rect.z, a_corner.x), mix(u_rect.y, u_rect.w, a_corner.y), 0.0, 1.0);\n}`;\nconst GLSL_FRAGMENT = `\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\nuniform sampler2D u_texture;\nvarying vec2 v_uv;\nvoid main() {\n gl_FragColor = vec4(texture2D(u_texture, v_uv).rgb, 1.0);\n}`;\n\n/** Clip-space rectangle of a pixel rectangle (y up) */\nconst clipRect = (\n rect: readonly [number, number, number, number],\n width: number,\n height: number,\n): [number, number, number, number] => [\n (rect[0] / width) * 2 - 1,\n 1 - (rect[1] / height) * 2,\n (rect[2] / width) * 2 - 1,\n 1 - (rect[3] / height) * 2,\n];\n\nconst bytesOf = (grid: HeatGrid) =>\n new Uint8Array(\n grid.pixels.buffer,\n grid.pixels.byteOffset,\n grid.width * grid.height * 4,\n );\n\n/** WebGL2 / WebGL backend (GLSL ES 1.00 runs on both) */\nexport const createGlHeatField = (\n canvas: HTMLCanvasElement,\n kind: \"webgl2\" | \"webgl\",\n onLost: () => void,\n requireHardware = false,\n): HeatFieldRenderer | null => {\n const attributes: WebGLContextAttributes = {\n ...glContextAttributes(requireHardware),\n alpha: false,\n premultipliedAlpha: false,\n };\n const gl = canvas.getContext(kind, attributes) as GlContext | null;\n if (!gl) return null;\n // a rejected context is freed now, not at garbage collection\n const reject = () => {\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n return null;\n };\n if (requireHardware && isSoftwareRenderer(gl)) return reject();\n\n /** Program, quad and texture: built again when a suspended context returns */\n const setup = () => {\n const program = compileProgram(\n gl,\n { vertex: GLSL_VERTEX, fragment: GLSL_FRAGMENT },\n [\"a_corner\"],\n );\n if (!program) return null;\n const corners = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, corners);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]),\n gl.STATIC_DRAW,\n );\n const texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n return {\n program,\n rectAt: gl.getUniformLocation(program.program, \"u_rect\"),\n textureAt: gl.getUniformLocation(program.program, \"u_texture\"),\n corners,\n texture,\n };\n };\n let objects = setup();\n if (!objects) return reject();\n let uploaded: HeatGrid | null = null;\n let uploadedVersion = -1;\n let size = [0, 0];\n let destroyed = false;\n let lost = false;\n let last: {\n grid: HeatGrid | null;\n rect: readonly [number, number, number, number];\n clear: Rgba;\n } | null = null;\n\n const forget = () => {\n objects = null;\n uploaded = null;\n uploadedVersion = -1;\n size = [0, 0];\n };\n // past the page-wide context budget the context may be suspended while\n // off-screen: its GPU objects go, and come back (with the last frame)\n // when it is restored\n const slot = claimGlSlot(canvas, gl, {\n suspend: forget,\n restore: () => {\n forget();\n objects = setup();\n if (!objects) {\n lost = true;\n if (!destroyed) onLost();\n } else if (last) draw(last.grid, last.rect, last.clear);\n },\n lost: () => {\n lost = true;\n if (!destroyed) onLost();\n },\n });\n\n const draw = (\n grid: HeatGrid | null,\n rect: readonly [number, number, number, number],\n clear: Rgba,\n ) => {\n if (!objects) return;\n const { program, rectAt, textureAt, corners, texture } = objects;\n const w = canvas.width;\n const h = canvas.height;\n gl.viewport(0, 0, w, h);\n gl.disable(gl.BLEND);\n gl.clearColor(clear[0], clear[1], clear[2], 1);\n gl.clear(gl.COLOR_BUFFER_BIT);\n if (!grid) return;\n gl.useProgram(program.program);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n if (grid !== uploaded || grid.version !== uploadedVersion) {\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 4);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);\n if (size[0] === grid.width && size[1] === grid.height) {\n gl.texSubImage2D(\n gl.TEXTURE_2D,\n 0,\n 0,\n 0,\n grid.width,\n grid.height,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n bytesOf(grid),\n );\n } else {\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n grid.width,\n grid.height,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n bytesOf(grid),\n );\n size = [grid.width, grid.height];\n }\n uploaded = grid;\n uploadedVersion = grid.version;\n }\n gl.uniform1i(textureAt, 0);\n gl.uniform4fv(rectAt, clipRect(rect, w, h));\n gl.bindBuffer(gl.ARRAY_BUFFER, corners);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n };\n\n return {\n kind,\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(grid, rect, clear) {\n if (destroyed) return;\n last = { grid, rect, clear };\n if (lost || !slot.use() || gl.isContextLost()) return;\n draw(grid, rect, clear);\n },\n destroy() {\n destroyed = true;\n last = null;\n slot.release();\n if (objects && !gl.isContextLost()) {\n gl.deleteTexture(objects.texture);\n gl.deleteBuffer(objects.corners);\n gl.deleteProgram(objects.program.program);\n // frees the context now instead of at garbage collection\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n }\n objects = null;\n },\n };\n};\n\nconst WGSL = `\nstruct Uniforms { rect: vec4f };\n@group(0) @binding(0) var<uniform> u: Uniforms;\n@group(0) @binding(1) var heat: texture_2d<f32>;\n@group(0) @binding(2) var nearest: sampler;\nstruct Varyings {\n @builtin(position) position: vec4f,\n @location(0) uv: vec2f,\n};\n@vertex fn vs(@builtin(vertex_index) i: u32) -> Varyings {\n let c = vec2f(f32(i & 1u), f32(i >> 1u));\n var out: Varyings;\n out.position = vec4f(mix(u.rect.x, u.rect.z, c.x), mix(u.rect.y, u.rect.w, c.y), 0.0, 1.0);\n out.uv = c;\n return out;\n}\n@fragment fn fs(v: Varyings) -> @location(0) vec4f {\n return vec4f(textureSample(heat, nearest, v.uv).rgb, 1.0);\n}`;\n\ntype GpuNavigator = Navigator & { gpu?: GPU };\n\n// lib.dom has the WebGPU interfaces but not these constant objects\nconst BUFFER_UNIFORM = 0x40;\nconst BUFFER_COPY_DST = 0x08;\nconst TEXTURE_COPY_DST = 0x02;\nconst TEXTURE_BINDING = 0x04;\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\n/** WebGPU backend */\nexport const createWebGpuHeatField = async (\n canvas: HTMLCanvasElement,\n onLost: () => void,\n requireHardware = false,\n): Promise<HeatFieldRenderer | null> => {\n const gpu =\n typeof navigator !== \"undefined\"\n ? (navigator as GpuNavigator).gpu\n : undefined;\n if (!gpu) return null;\n const adapter = await gpu.requestAdapter();\n if (!adapter) return null;\n const info = adapter as GPUAdapter & {\n isFallbackAdapter?: boolean;\n info?: { isFallbackAdapter?: boolean };\n };\n if (\n requireHardware &&\n (info.info?.isFallbackAdapter || info.isFallbackAdapter)\n )\n return null;\n const device = await adapter.requestDevice();\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) {\n device.destroy();\n return null;\n }\n const format = gpu.getPreferredCanvasFormat();\n context.configure({ device, format, alphaMode: \"opaque\" });\n let destroyed = false;\n void device.lost.then(() => {\n if (!destroyed) onLost();\n });\n\n const layout = device.createBindGroupLayout({\n entries: [\n { binding: 0, visibility: STAGE_VERTEX, buffer: { type: \"uniform\" } },\n { binding: 1, visibility: STAGE_FRAGMENT, texture: {} },\n { binding: 2, visibility: STAGE_FRAGMENT, sampler: {} },\n ],\n });\n const module = device.createShaderModule({ code: WGSL });\n const pipeline = device.createRenderPipeline({\n layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),\n vertex: { module, entryPoint: \"vs\" },\n fragment: { module, entryPoint: \"fs\", targets: [{ format }] },\n primitive: { topology: \"triangle-strip\" },\n });\n const sampler = device.createSampler({\n magFilter: \"nearest\",\n minFilter: \"nearest\",\n addressModeU: \"clamp-to-edge\",\n addressModeV: \"clamp-to-edge\",\n });\n const uniform = device.createBuffer({\n size: 16,\n usage: BUFFER_UNIFORM | BUFFER_COPY_DST,\n });\n let texture: GPUTexture | null = null;\n let bindGroup: GPUBindGroup | null = null;\n let uploaded: HeatGrid | null = null;\n let uploadedVersion = -1;\n\n return {\n kind: \"webgpu\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(grid, rect, clear) {\n if (destroyed) return;\n if (grid && (grid !== uploaded || grid.version !== uploadedVersion)) {\n if (\n !texture ||\n texture.width !== grid.width ||\n texture.height !== grid.height\n ) {\n texture?.destroy();\n texture = device.createTexture({\n size: { width: grid.width, height: grid.height },\n format: \"rgba8unorm\",\n usage: TEXTURE_COPY_DST | TEXTURE_BINDING,\n });\n bindGroup = device.createBindGroup({\n layout,\n entries: [\n { binding: 0, resource: { buffer: uniform } },\n { binding: 1, resource: texture.createView() },\n { binding: 2, resource: sampler },\n ],\n });\n }\n device.queue.writeTexture(\n { texture },\n bytesOf(grid),\n { bytesPerRow: grid.width * 4, rowsPerImage: grid.height },\n { width: grid.width, height: grid.height },\n );\n uploaded = grid;\n uploadedVersion = grid.version;\n }\n device.queue.writeBuffer(\n uniform,\n 0,\n new Float32Array(clipRect(rect, canvas.width, canvas.height)),\n );\n const encoder = device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: context.getCurrentTexture().createView(),\n clearValue: { r: clear[0], g: clear[1], b: clear[2], a: 1 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n if (grid && bindGroup) {\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, bindGroup);\n pass.draw(4);\n }\n pass.end();\n device.queue.submit([encoder.finish()]);\n },\n destroy() {\n destroyed = true;\n texture?.destroy();\n uniform.destroy();\n context.unconfigure();\n device.destroy();\n },\n };\n};\n\n/** Canvas2D backend: the image drawn with nearest-neighbour scaling */\nexport const createCanvasHeatField = (\n canvas: HTMLCanvasElement,\n): HeatFieldRenderer | null => {\n const ctx = canvas.getContext(\"2d\", { alpha: false });\n if (!ctx) return null;\n const image = canvas.ownerDocument.createElement(\"canvas\");\n const imageCtx = image.getContext(\"2d\");\n let uploaded: HeatGrid | null = null;\n let uploadedVersion = -1;\n return {\n kind: \"canvas2d\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(grid, rect, clear) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.fillStyle = `rgb(${Math.round(clear[0] * 255)}, ${Math.round(clear[1] * 255)}, ${Math.round(clear[2] * 255)})`;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n if (!grid || !imageCtx) return;\n if (grid !== uploaded || grid.version !== uploadedVersion) {\n if (image.width !== grid.width) image.width = grid.width;\n if (image.height !== grid.height) image.height = grid.height;\n const data = imageCtx.createImageData?.(grid.width, grid.height);\n if (!data?.data) return;\n data.data.set(bytesOf(grid));\n imageCtx.putImageData(data, 0, 0);\n uploaded = grid;\n uploadedVersion = grid.version;\n }\n ctx.imageSmoothingEnabled = false;\n ctx.drawImage(\n image,\n rect[0],\n rect[1],\n rect[2] - rect[0],\n rect[3] - rect[1],\n );\n },\n destroy() {\n uploaded = null;\n },\n };\n};\n\n/**\n * Creates the first heat field backend that works, in the chart engine's\n * order and with its preference rules (`auto` follows the global default\n * and skips software GPUs). Every attempt gets a fresh canvas.\n */\nexport const createHeatFieldRenderer = async (\n requested: ChartRendererPreference,\n makeCanvas: () => HTMLCanvasElement,\n onLost: (kind: ChartRendererKind) => void,\n exclude?: ReadonlySet<ChartRendererKind>,\n): Promise<HeatFieldRenderer | null> => {\n const preference = resolveRendererPreference(requested);\n for (const kind of rendererCandidates(preference, exclude)) {\n const requireHardware = preference === \"auto\" || preference !== kind;\n let field: HeatFieldRenderer | null;\n try {\n const canvas = makeCanvas();\n const lost = () => onLost(kind);\n field =\n kind === \"webgpu\"\n ? await createWebGpuHeatField(canvas, lost, requireHardware)\n : kind === \"canvas2d\"\n ? createCanvasHeatField(canvas)\n : createGlHeatField(canvas, kind, lost, requireHardware);\n } catch {\n field = null;\n }\n if (field) return field;\n }\n return null;\n};\n"],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import { Rgba } from '../color.cjs';
2
+ import { ChartRendererKind, ChartRendererPreference } from '../types.cjs';
3
+ /** One sampled book: price rows (price / tick) and their resting sizes */
4
+ export interface HeatSource {
5
+ /** Start time of the column */
6
+ time: number;
7
+ bins: ArrayLike<number>;
8
+ sizes: ArrayLike<number>;
9
+ }
10
+ /** The rasterized field: packed RGBA texels, row 0 at the top (highest prices) */
11
+ export interface HeatGrid {
12
+ width: number;
13
+ height: number;
14
+ pixels: Uint32Array;
15
+ /** Resting size of every texel (max-pooled), same layout as `pixels` */
16
+ cells: Float32Array;
17
+ /** Times at the left / right edges of the image */
18
+ t0: number;
19
+ t1: number;
20
+ /** Prices at the bottom / top edges of the image */
21
+ p0: number;
22
+ p1: number;
23
+ /** Bumped on every rebuild (uploads are skipped while unchanged) */
24
+ version: number;
25
+ }
26
+ export interface HeatGridInput {
27
+ /** Columns sorted by time (the live book last) */
28
+ sources: readonly HeatSource[];
29
+ /** Sampling interval (ms) */
30
+ step: number;
31
+ /** Price row height */
32
+ tick: number;
33
+ /** Visible time / price ranges */
34
+ x0: number;
35
+ x1: number;
36
+ y0: number;
37
+ y1: number;
38
+ /** End of the data (the live time): texels starting later stay cold */
39
+ end: number;
40
+ /** Largest image (texels); denser data is max-pooled, walls stay visible */
41
+ maxWidth: number;
42
+ maxHeight: number;
43
+ }
44
+ /** Entries of a heat table (resolution of the size → color mapping) */
45
+ export declare const HEAT_TABLE_SIZE = 1024;
46
+ /**
47
+ * Size → color table of a ramp: entry `j` is the color of the relative size
48
+ * `j / HEAT_TABLE_SIZE` through `curve` (0-1 → 0-1). Entry 0 is the cold end.
49
+ */
50
+ export declare const heatTable: (lut: Uint32Array, curve: (r: number) => number) => Uint32Array;
51
+ /**
52
+ * `q`-quantile (0-1) of the positive values, NaN without any. Arrays longer
53
+ * than `limit` are sampled (a prime stride, so a grid's rows and columns
54
+ * are both covered).
55
+ */
56
+ export declare const percentile: (values: ArrayLike<number>, q: number, limit?: number) => number;
57
+ /**
58
+ * Rasterizes the visible liquidity into `cells` (the colors are set by
59
+ * `paintHeatGrid`). Pass the previous grid as `reuse` to recycle its
60
+ * buffers. Returns `null` without a valid range.
61
+ */
62
+ export declare const buildHeatGrid: (input: HeatGridInput, reuse?: HeatGrid | null) => HeatGrid | null;
63
+ /**
64
+ * Colors the cells of a grid: `table[min(last, floor(size × scale))]`
65
+ * (see `heatTable`), empty cells the cold end. Bumps the version.
66
+ */
67
+ export declare const paintHeatGrid: (grid: HeatGrid, table: Uint32Array, scale: number) => void;
68
+ /** Draws heat grids on its own canvas (sized and placed by the caller) */
69
+ export interface HeatFieldRenderer {
70
+ readonly kind: ChartRendererKind;
71
+ readonly canvas: HTMLCanvasElement;
72
+ /** Sets the size of the drawing buffer (device pixels) */
73
+ resize(width: number, height: number): void;
74
+ /**
75
+ * Clears to `clear` (opaque) and draws `grid` stretched over `rect`
76
+ * ([left, top, right, bottom] in device pixels, y down)
77
+ */
78
+ render(grid: HeatGrid | null, rect: readonly [number, number, number, number], clear: Rgba): void;
79
+ destroy(): void;
80
+ }
81
+ /** WebGL2 / WebGL backend (GLSL ES 1.00 runs on both) */
82
+ export declare const createGlHeatField: (canvas: HTMLCanvasElement, kind: "webgl2" | "webgl", onLost: () => void, requireHardware?: boolean) => HeatFieldRenderer | null;
83
+ /** WebGPU backend */
84
+ export declare const createWebGpuHeatField: (canvas: HTMLCanvasElement, onLost: () => void, requireHardware?: boolean) => Promise<HeatFieldRenderer | null>;
85
+ /** Canvas2D backend: the image drawn with nearest-neighbour scaling */
86
+ export declare const createCanvasHeatField: (canvas: HTMLCanvasElement) => HeatFieldRenderer | null;
87
+ /**
88
+ * Creates the first heat field backend that works, in the chart engine's
89
+ * order and with its preference rules (`auto` follows the global default
90
+ * and skips software GPUs). Every attempt gets a fresh canvas.
91
+ */
92
+ export declare const createHeatFieldRenderer: (requested: ChartRendererPreference, makeCanvas: () => HTMLCanvasElement, onLost: (kind: ChartRendererKind) => void, exclude?: ReadonlySet<ChartRendererKind>) => Promise<HeatFieldRenderer | null>;
@@ -0,0 +1,92 @@
1
+ import { Rgba } from '../color.js';
2
+ import { ChartRendererKind, ChartRendererPreference } from '../types.js';
3
+ /** One sampled book: price rows (price / tick) and their resting sizes */
4
+ export interface HeatSource {
5
+ /** Start time of the column */
6
+ time: number;
7
+ bins: ArrayLike<number>;
8
+ sizes: ArrayLike<number>;
9
+ }
10
+ /** The rasterized field: packed RGBA texels, row 0 at the top (highest prices) */
11
+ export interface HeatGrid {
12
+ width: number;
13
+ height: number;
14
+ pixels: Uint32Array;
15
+ /** Resting size of every texel (max-pooled), same layout as `pixels` */
16
+ cells: Float32Array;
17
+ /** Times at the left / right edges of the image */
18
+ t0: number;
19
+ t1: number;
20
+ /** Prices at the bottom / top edges of the image */
21
+ p0: number;
22
+ p1: number;
23
+ /** Bumped on every rebuild (uploads are skipped while unchanged) */
24
+ version: number;
25
+ }
26
+ export interface HeatGridInput {
27
+ /** Columns sorted by time (the live book last) */
28
+ sources: readonly HeatSource[];
29
+ /** Sampling interval (ms) */
30
+ step: number;
31
+ /** Price row height */
32
+ tick: number;
33
+ /** Visible time / price ranges */
34
+ x0: number;
35
+ x1: number;
36
+ y0: number;
37
+ y1: number;
38
+ /** End of the data (the live time): texels starting later stay cold */
39
+ end: number;
40
+ /** Largest image (texels); denser data is max-pooled, walls stay visible */
41
+ maxWidth: number;
42
+ maxHeight: number;
43
+ }
44
+ /** Entries of a heat table (resolution of the size → color mapping) */
45
+ export declare const HEAT_TABLE_SIZE = 1024;
46
+ /**
47
+ * Size → color table of a ramp: entry `j` is the color of the relative size
48
+ * `j / HEAT_TABLE_SIZE` through `curve` (0-1 → 0-1). Entry 0 is the cold end.
49
+ */
50
+ export declare const heatTable: (lut: Uint32Array, curve: (r: number) => number) => Uint32Array;
51
+ /**
52
+ * `q`-quantile (0-1) of the positive values, NaN without any. Arrays longer
53
+ * than `limit` are sampled (a prime stride, so a grid's rows and columns
54
+ * are both covered).
55
+ */
56
+ export declare const percentile: (values: ArrayLike<number>, q: number, limit?: number) => number;
57
+ /**
58
+ * Rasterizes the visible liquidity into `cells` (the colors are set by
59
+ * `paintHeatGrid`). Pass the previous grid as `reuse` to recycle its
60
+ * buffers. Returns `null` without a valid range.
61
+ */
62
+ export declare const buildHeatGrid: (input: HeatGridInput, reuse?: HeatGrid | null) => HeatGrid | null;
63
+ /**
64
+ * Colors the cells of a grid: `table[min(last, floor(size × scale))]`
65
+ * (see `heatTable`), empty cells the cold end. Bumps the version.
66
+ */
67
+ export declare const paintHeatGrid: (grid: HeatGrid, table: Uint32Array, scale: number) => void;
68
+ /** Draws heat grids on its own canvas (sized and placed by the caller) */
69
+ export interface HeatFieldRenderer {
70
+ readonly kind: ChartRendererKind;
71
+ readonly canvas: HTMLCanvasElement;
72
+ /** Sets the size of the drawing buffer (device pixels) */
73
+ resize(width: number, height: number): void;
74
+ /**
75
+ * Clears to `clear` (opaque) and draws `grid` stretched over `rect`
76
+ * ([left, top, right, bottom] in device pixels, y down)
77
+ */
78
+ render(grid: HeatGrid | null, rect: readonly [number, number, number, number], clear: Rgba): void;
79
+ destroy(): void;
80
+ }
81
+ /** WebGL2 / WebGL backend (GLSL ES 1.00 runs on both) */
82
+ export declare const createGlHeatField: (canvas: HTMLCanvasElement, kind: "webgl2" | "webgl", onLost: () => void, requireHardware?: boolean) => HeatFieldRenderer | null;
83
+ /** WebGPU backend */
84
+ export declare const createWebGpuHeatField: (canvas: HTMLCanvasElement, onLost: () => void, requireHardware?: boolean) => Promise<HeatFieldRenderer | null>;
85
+ /** Canvas2D backend: the image drawn with nearest-neighbour scaling */
86
+ export declare const createCanvasHeatField: (canvas: HTMLCanvasElement) => HeatFieldRenderer | null;
87
+ /**
88
+ * Creates the first heat field backend that works, in the chart engine's
89
+ * order and with its preference rules (`auto` follows the global default
90
+ * and skips software GPUs). Every attempt gets a fresh canvas.
91
+ */
92
+ export declare const createHeatFieldRenderer: (requested: ChartRendererPreference, makeCanvas: () => HTMLCanvasElement, onLost: (kind: ChartRendererKind) => void, exclude?: ReadonlySet<ChartRendererKind>) => Promise<HeatFieldRenderer | null>;