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,2 +1,2 @@
1
- const e=require("../color.cjs"),t=require("../renderers/types.cjs"),n=require("../locale.cjs"),r=require("../scale.cjs"),i=require("../renderers/detect.cjs"),a=require("../time.cjs"),o=require("./book.cjs"),s=require("./format.cjs"),c=require("./host.cjs");var l=32,u=128,d=[`#0b2a4f`,`#12508f`,`#1c7fd0`,`#25b3d6`,`#4fd6a0`,`#e9e35a`,`#ffa23d`,`#ff5533`],f=[`#dbeafe`,`#93c5fd`,`#3b82f6`,`#4338ca`,`#9333ea`,`#db2777`,`#f97316`],p={en:{time:`Time`,price:`Price`,liquidity:`Liquidity`,buys:`Buys`,sells:`Sells`,bid:`Bid`,ask:`Ask`,name:`Liquidity heatmap`},zh:{time:`时间`,price:`价格`,liquidity:`挂单量`,buys:`主动买入`,sells:`主动卖出`,bid:`买一`,ask:`卖一`,name:`订单簿热力图`},ja:{time:`時刻`,price:`価格`,liquidity:`指値量`,buys:`買い約定`,sells:`売り約定`,bid:`最良買気配`,ask:`最良売気配`,name:`板ヒートマップ`},fr:{time:`Heure`,price:`Prix`,liquidity:`Liquidité`,buys:`Achats`,sells:`Ventes`,bid:`Meilleur achat`,ask:`Meilleure vente`,name:`Carte de chaleur de la liquidité`}},m=(e,t,n,r)=>{if(!(e>0)||!(t>0))return 0;let i=Math.min(1,e*r/t);switch(n){case`linear`:return i;case`sqrt`:return Math.sqrt(i);default:return Math.log10(1+9*i)}},ee=(ee,h={})=>{let g=h,_=o.createOrderBookStore(),v=c.createEmitter(),y=s.createFormatters(g,2,4),b={up:[0,0,0,1],down:[0,0,0,1]},te=new Uint32Array(u),x=0,S=[],ne=0,C=NaN,w={buyVolume:0,buyNotional:0,sellVolume:0,sellNotional:0},T=null,E=NaN,D=0,O=0,k=0,A=new Map,j=new Set,M=0,N=null,P=-1,F={x:NaN,y:NaN},I=null,L=0,R=!1,z=()=>{},re=new Promise(e=>{z=e}),B=!0,V=NaN,H=[0,1],U=[0,1],W=NaN,G=NaN,K=!1,ie=0,q={x:0,y:0,w:0,h:0},J=null,ae=``,Y=null,X=c.createHost(ee,{className:`minerva-orderbook-heatmap`,draw:je,onTheme:()=>{me(),ge()}}),{root:Z,doc:oe}=X;Z.tabIndex=0,Z.setAttribute(`role`,`figure`),Z.style.touchAction=`none`;let se=n.localeLabels(p,g.locale,g.labels),ce=()=>se,le=()=>{se=n.localeLabels(p,g.locale,g.labels),Z.setAttribute(`aria-label`,g.ariaLabel??se.name)},Q=()=>Math.max(10,g.interval??100),ue=()=>Math.max(Q()*4,g.history??3e5),de=()=>Math.max(4,Math.round(g.depth??160)),fe=()=>{if(!Number.isFinite(E))return Date.now();let e=pe()-D;return E+Math.min(Math.max(0,e),Q()*3)},pe=()=>typeof performance<`u`?performance.now():Date.now();function me(){let t=X.theme;b=s.sideColors(t,g);let n=e=>t.resolve?t.resolve(e,t.primary):t.primary,r=e.luminance(t.background)<.4,i=[t.background,...(g.colors?.length?g.colors:r?d:f).map(n)];te=new Uint32Array(u);for(let t=0;t<u;t++){let n=e.rampColor(i,t/127);te[t]=e.packColor([n[0],n[1],n[2],1])}}let he=()=>{y=s.createFormatters(g,x>0?Math.max(o.decimalsOf(x),o.inferPriceDecimals(_)):o.inferPriceDecimals(_),o.inferSizeDecimals(_))},ge=()=>{for(let e of A.keys())j.add(e);P=-1,X.invalidate()},_e=()=>{S=[],A.clear(),j.clear(),N=null,P=-1,C=NaN,F={x:NaN,y:NaN},O=0,k=0,w.buyVolume=w.buyNotional=w.sellVolume=w.sellNotional=0},ve=()=>{if(x>0)return;let e=o.inferTickSize(_),t=_.mid();if(g.tickSize&&g.tickSize>0)x=g.tickSize;else if(e>0&&Number.isFinite(t)){let n=t*1e-5/e,r=1;for(let e=1;e<=1e9&&r<n*.75;e*=10)for(let t of[1,2,5])if(r=t*e,r>=n*.75)break;x=o.roundToStep(e*r,e)}else x=Number.isFinite(t)?Math.max(1e-8,t*1e-5):0;x>0&&he()},ye=()=>{let e=de(),t=new Float64Array(e*2),n=new Float32Array(e*2),r=0,i=[0,0,0,0];for(let i of[`bid`,`ask`]){let a=_.count(i),o=0;for(let s=0;s<a;s++){let a=Math.round(_.priceAt(i,s)/x),c=_.sizeAt(i,s);if(r>0&&t[r-1]===a&&o>0){n[r-1]+=c;continue}if(o>=e)break;t[r]=a,n[r]=c,r++,o++}}for(let e=0;e<r;e++){let t=n[e];t>i[3]&&(i[3]=t,i.sort((e,t)=>t-e))}return{bins:t.subarray(0,r),sizes:n.subarray(0,r),reference:i[3]||i[0]}},be=e=>{if(!(x>0))return;let{bins:t,sizes:n,reference:r}=ye(),i={seq:ne++,time:e,bins:t,sizes:n,bestBid:_.bestBid(),bestAsk:_.bestAsk(),buyVolume:w.buyVolume,buyNotional:w.buyNotional,sellVolume:w.sellVolume,sellNotional:w.sellNotional,reference:r};if(w.buyVolume=w.buyNotional=w.sellVolume=w.sellNotional=0,S.push(i),j.add(Math.floor(i.seq/l)),g.maxSize===void 0){let e=S.slice(-100),t=0;for(let n of e)t+=n.reference;let n=t/e.length*1.6;if(!(O>0)||Math.abs(n/O-1)>.3){O=n;for(let e of A.keys())j.add(e);P=-1}}let a=e-ue(),o=0;for(;o<S.length&&S[o].time<a;)o++;if(o){S=S.slice(o);let e=S[0]?Math.floor(S[0].seq/l):1/0;for(let t of[...A.keys()])t<e&&A.delete(t)}},$=e=>{if(!Number.isFinite(e))return;let t=Q();if(!Number.isFinite(C)){C=Math.floor(e/t)*t;return}if(e-C>ue()){be(C),C=Math.floor(e/t)*t;return}for(;e>=C+t;)be(C),C+=t},xe=e=>e===void 0||!Number.isFinite(e)?Date.now():((!Number.isFinite(E)||e>=E)&&(E=e,D=pe()),e),Se=e=>{let t=0,n=S.length-1,r=Q();for(;t<=n;){let i=t+n>>>1,a=S[i];if(e<a.time)n=i-1;else if(e>=a.time+r)t=i+1;else return a}return null},Ce=()=>{if(Number.isFinite(F.x))return;let e=_.mid();F={x:Number.isFinite(C)?C:0,y:Number.isFinite(e)?e:0}},we=e=>{let t=m(e,g.maxSize??O,g.colorScale??`log`,Math.max(.01,g.contrast??1));return Math.round(t*127)},Te=(e,t)=>{let n=Q(),r=0;for(let e of t)for(let t=0;t<e.sizes.length;t++)we(e.sizes[t])>0&&r++;let i=new ArrayBuffer(Math.max(1,r)*16),a=new Float32Array(i),o=new Uint32Array(i),s=0,c=x/2*1.06;for(let e of t){let t=e.time+n/2-F.x;for(let n=0;n<e.sizes.length;n++){let r=we(e.sizes[n]);if(r<=0)continue;let i=e.bins[n]*x-F.y;a[s*4]=t,a[s*4+1]=i-c,a[s*4+2]=i+c,o[s*4+3]=te[r],s++}}return{kind:`bar`,key:e,version:++M,color:[1,1,1,1],instances:i,count:r,halfWidth:n/2*1.06,radius:0,inset:.01,minHalf:0,sorted:!0}},Ee=()=>{if(j.size){let e=new Map;for(let t of S){let n=Math.floor(t.seq/l);if(!j.has(n))continue;let r=e.get(n);r||e.set(n,r=[]),r.push(t)}for(let t of j){let n=e.get(t);n?A.set(t,Te(`heat:${t}`,n)):A.delete(t)}j.clear()}return[...A.values()]},De=()=>{let e=Q(),t=[],n=0,r=S.length;for(;n<r;){let t=n+r>>>1;S[t].time+e<H[0]?n=t+1:r=t}for(let e=n;e<S.length;e++){let n=S[e];if(n.time>H[1])break;t.push(n)}return t},Oe=t=>{if(g.bubbles===!1)return null;let n=Q(),r=[],i=(e,t,i,a)=>{t>0&&r.push([e+n/2,i/t,t,a])};for(let e of t)i(e.time,e.sellVolume,e.sellNotional,!1),i(e.time,e.buyVolume,e.buyNotional,!0);if(Number.isFinite(C)&&(i(C,w.sellVolume,w.sellNotional,!1),i(C,w.buyVolume,w.buyNotional,!0)),!r.length)return null;let a=0;for(let e of r)a=Math.max(a,e[2]);k=k>0?Math.max(a,k*.995):a;let o=g.bubbleVolume??k,c=Math.max(4,g.bubbleSize??28),l=new ArrayBuffer(r.length*16),u=new Float32Array(l),d=new Uint32Array(l),f=e.packColor([b.up[0],b.up[1],b.up[2],.78]),p=e.packColor([b.down[0],b.down[1],b.down[2],.78]);return r.forEach(([e,t,n,r],i)=>{u[i*4]=e-F.x,u[i*4+1]=t-F.y,u[i*4+2]=s.clamp(Math.sqrt(n/o)*c,3,c),d[i*4+3]=r?f:p}),{kind:`scatter`,key:`trades`,version:++M,color:b.up,instances:l,count:r.length,opacity:1,stroke:1.25}},ke=e=>{if(g.bestLines===!1)return[];let n=Q(),r=(r,i,a)=>{let o=e.length+ +!!Number.isFinite(C),s=new Float32Array(o*4),c=(e,r,i)=>{let a=Number.isFinite(i)?i-F.y:t.GAP;s[e*4]=r-F.x,s[e*4+1]=a,s[e*4+2]=r+n-F.x,s[e*4+3]=a};if(e.forEach((e,t)=>c(t,e.time,i(e))),Number.isFinite(C)){let t=r===`bid`?_.bestBid():_.bestAsk();c(e.length,C,t)}return{kind:`line`,key:`best:${r}`,version:++M,color:a,points:s,count:o*2,width:1.5,sorted:!0}};return[r(`bid`,e=>e.bestBid,b.up),r(`ask`,e=>e.bestAsk,b.down)]},Ae=()=>{if(!Number.isFinite(C)||!(x>0))return null;let e=_.version();if(N&&P===e)return N;let{bins:t,sizes:n}=ye();return N=Te(`heat:head`,[{time:C,bins:t,sizes:n}]),P=e,N};function je(t){let n=X.ctx;if(!n)return!1;let{width:i,height:o,dpr:c,theme:l}=X,u=ie?t-ie:0;ie=t;let d=ce(),f=g.fontSize??(i<420?10:11),p=Q(),m=!Number.isFinite(E);m&&_.count(`bid`)+_.count(`ask`)>0&&$(Date.now());let ee=fe();n.setTransform(c,0,0,c,0,0),n.clearRect(0,0,i,o),n.font=s.fontOf(l,g,400,f);let h=_.mid(),v=y.price(Number.isFinite(h)?h*1.0001:0),te=Math.ceil(n.measureText(v).width)+16,S=g.profile===!1?0:Math.round(s.clamp(i*.1,36,84)),ne=f+12;if(q={x:0,y:0,w:Math.max(10,i-te-S),h:Math.max(10,o-ne)},Number.isFinite(V)||(V=Math.max(p*10,g.window??6e4)),(!Number.isFinite(G)||G<=0)&&(ve(),G=g.priceSpan??(x>0?x*60:NaN)),B){let e=ee+p*1.5;H=[e-V,e];let t=_.bestBid(),n=_.bestAsk();Number.isFinite(t)||(t=n),Number.isFinite(n)||(n=t);for(let e of De())e.bestBid<t&&(t=e.bestBid),e.bestAsk>n&&(n=e.bestAsk);if(Number.isFinite(t)&&Number.isFinite(n)){let e=Number.isFinite(W)?s.ease(u,260):1,r=(t+n)/2;if(W=Number.isFinite(W)?W+(r-W)*e:r,!K&&g.priceSpan===void 0&&x>0){let r=Math.max(x*60,(n-t)*1.5);G+=(r-G)*e}}else Number.isFinite(h)&&(W=Number.isFinite(W)?W+(h-W)*s.ease(u,220):h);Number.isFinite(W)&&Number.isFinite(G)&&(U=[W-G/2,W+G/2])}let[w,O]=H,[k,A]=U,j=e=>q.x+(e-w)/(O-w)*q.w,M=e=>q.y+q.h-(e-k)/(A-k)*q.h,N=De();if(I&&x>0){Ce();let e=I.canvas;e.style.left=`${q.x}px`,e.style.top=`${q.y}px`,e.style.width=`${q.w}px`,e.style.height=`${q.h}px`;let t=Math.max(1,Math.round(q.w*c)),n=Math.max(1,Math.round(q.h*c));(e.width!==t||e.height!==n)&&I.resize(t,n);let r=Ee(),i=Ae();i&&r.push(i),r.push(...ke(N));let a=Oe(N);a&&r.push(a);let o=2/(O-w),s=2/(A-k);I.render(r,{transform:{xScale:o,xOffset:(F.x-w)*o-1,yScale:s,yOffset:(F.y-k)*s-1},width:t,height:n,dpr:c})}let P=q.x+q.w+S,L=Number.isFinite(k)?r.linearTicks(k,A,Math.max(2,Math.floor(q.h/44))):[];n.strokeStyle=e.toCss(l.text,.07),n.lineWidth=1,n.beginPath();for(let e of L){let t=Math.round(M(e))+.5;n.moveTo(q.x,t),n.lineTo(P,t)}n.stroke(),n.fillStyle=e.toCss(l.textMuted),n.textAlign=`left`,n.textBaseline=`middle`;for(let e of L){let t=M(e);t<6||t>q.h-6||n.fillText(y.price(e),P+6,t)}let R=a.timeTicks(w,O,Math.max(2,Math.floor(q.w/90)));n.textAlign=`center`,n.textBaseline=`top`;for(let e of R.values){let t=j(e);t<20||t>q.x+q.w-20||n.fillText(R.format(e),t,q.y+q.h+6)}if(n.strokeStyle=e.toCss(l.axis),n.beginPath(),n.moveTo(0,Math.round(q.y+q.h)+.5),n.lineTo(i,Math.round(q.y+q.h)+.5),n.moveTo(Math.round(P)+.5,0),n.lineTo(Math.round(P)+.5,q.y+q.h),n.stroke(),S&&x>0&&Number.isFinite(k)){let t=q.x+q.w;n.fillStyle=e.toCss(l.background,.85),n.fillRect(t,q.y,S,q.h);let r=Math.max(1,x/(A-k)*q.h),i=0,a=[`bid`,`ask`].map(e=>{let{price:t,size:n,count:r}=_.levels(e,{step:x,limit:de()});for(let e=0;e<r;e++)t[e]>=k&&t[e]<=A&&(i=Math.max(i,n[e]));return{side:e,price:t,size:n,count:r}});for(let{side:o,price:s,size:c,count:l}of a){n.fillStyle=e.toCss(o===`bid`?b.up:b.down,.6);for(let e=0;e<l;e++){let a=s[e];if(a<k||a>A||i<=0)continue;let o=c[e]/i*(S-4),l=M(a)-r/2;n.fillRect(t+2,l+(r>3?.5:0),o,Math.max(1,r-+(r>3)))}}}let z=(t,r,a)=>{if(!Number.isFinite(t)||t<k||t>A)return;let o=s.clamp(M(t),8,q.h-8),c=y.price(t);n.font=s.fontOf(l,g,600,f);let u=n.measureText(c).width+10;n.fillStyle=a?e.toCss(r):e.toCss(l.background),s.roundRect(n,P+1,o-8,Math.min(u,i-P-2),16,3),n.fill(),a||(n.strokeStyle=e.toCss(r),n.stroke()),n.fillStyle=a?`#fff`:e.toCss(r),n.textAlign=`left`,n.textBaseline=`middle`,n.fillText(c,P+6,o+.5),n.font=s.fontOf(l,g,400,f)};z(_.bestBid(),b.up,!0),z(_.bestAsk(),b.down,!0);let re=e=>!Number.isFinite(e)||Math.abs(M(e)-M(T?.price??NaN))>=17;T&&re(_.bestBid())&&re(_.bestAsk())&&z(T.price,T.side===`buy`?b.up:b.down,!1),Me(n,j,M,f,P,d),!I&&X.root.dataset.renderer,X.describe(`${g.ariaLabel??d.name}. ${d.bid} ${y.price(_.bestBid())}, ${d.ask} ${y.price(_.bestAsk())}.`);let J=m||pe()-D<2e3;return B&&J&&Number.isFinite(C)}function Me(t,n,r,i,a,l){let{theme:u}=X,d=()=>{X.tooltip.style.display=`none`,ae&&(ae=``,v.emit(`hover`,null))};if(!J||g.tooltip===!1||!(x>0)||Y){d();return}let[f,p]=J;if(f<q.x||f>q.x+q.w||p<q.y||p>q.y+q.h){d();return}let[m,ee]=H,[h,te]=U,S=m+(f-q.x)/q.w*(ee-m),ne=h+(q.y+q.h-p)/q.h*(te-h),T=Math.round(ne/x),E=+(T*x).toFixed(Math.min(12,o.decimalsOf(x)+2)),D=Se(S),O=Q(),k=0,A=NaN,j=NaN,M=0,N=0,P=NaN;if(D){for(let e=0;e<D.bins.length;e++)D.bins[e]===T&&(k+=D.sizes[e]);({bestBid:A,bestAsk:j,buyVolume:M,sellVolume:N}=D),P=D.time}else if(Number.isFinite(C)&&S>=C){let e=[`bid`,`ask`].map(e=>_.levels(e,{step:x,limit:de()}));for(let t of e)for(let e=0;e<t.count;e++)Math.round(t.price[e]/x)===T&&(k+=t.size[e]);A=_.bestBid(),j=_.bestAsk(),M=w.buyVolume,N=w.sellVolume,P=C}let F=E<=A?`bid`:E>=j?`ask`:null;t.strokeStyle=e.toCss(u.text,.45),t.setLineDash([3,3]),t.beginPath(),t.moveTo(Math.round(f)+.5,q.y),t.lineTo(Math.round(f)+.5,q.y+q.h);let I=Math.round(r(E))+.5;if(t.moveTo(q.x,I),t.lineTo(a,I),t.stroke(),t.setLineDash([]),Number.isFinite(P)){let i=n(P),a=n(P+O),o=r(E+x/2),s=r(E-x/2);t.strokeStyle=e.toCss(u.text,.85),t.strokeRect(i,o,Math.max(2,a-i),Math.max(2,s-o))}t.font=s.fontOf(u,g,600,i);let L=y.price(E),R=Math.min(t.measureText(L).width+10,X.width-a-2);t.fillStyle=e.toCss(u.text),s.roundRect(t,a+1,I-8,R,16,3),t.fill(),t.fillStyle=e.toCss(u.background),t.textAlign=`left`,t.textBaseline=`middle`,t.fillText(L,a+6,I+.5),t.font=s.fontOf(u,g,400,i);let z=F===`bid`?b.up:F===`ask`?b.down:u.text;c.tooltipHtml(oe,X.tooltip,{text:Number.isFinite(P)?s.formatClock(P):s.formatClock(S),color:void 0},[[l.price,y.price(E)],[l.liquidity,y.size(k)],[l.buys,y.size(M)],[l.sells,y.size(N)]]),X.tooltip.style.display=`block`,X.tooltip.style.borderLeft=`3px solid ${e.toCss(z)}`,X.placeTooltip(X.tooltip,f,p,f>q.w*.6?`left`:`right`);let re=`${P}|${T}|${k}|${M}|${N}`;if(re!==ae){ae=re;let e={time:Number.isFinite(P)?P:S,price:E,size:k,side:F,buyVolume:M,sellVolume:N};v.emit(`hover`,e)}}let Ne=async(e=new Set)=>{let t=++L,n=await i.createRenderer(g.renderer??`auto`,()=>{let e=oe.createElement(`canvas`);return Object.assign(e.style,{position:`absolute`,left:`0`,top:`0`,pointerEvents:`none`}),e.setAttribute(`aria-hidden`,`true`),e},t=>{R||I?.kind!==t||(I.destroy(),I.canvas.remove(),I=null,Ne(new Set([...e,t])))},e);if(R||t!==L){n?.destroy();return}I&&(I.destroy(),I.canvas.remove()),I=n,n&&(Z.dataset.renderer=n.kind,Z.insertBefore(n.canvas,X.canvas),v.emit(`renderer`,n.kind)),z(n?.kind??null),X.invalidate()},Pe=e=>{B!==e&&(B=e,v.emit(`follow`,e))},Fe=e=>{if(g.interactive===!1)return;let[t,n]=c.localPoint(Z,e);Z.setPointerCapture?.(e.pointerId),Y={x:t,y:n,viewX:[...H],viewY:[...U],axis:t>q.x+q.w,span:U[1]-U[0]}},Ie=e=>{let[t,n]=c.localPoint(Z,e);if(J=[t,n],Y){let e=t-Y.x,r=n-Y.y;if(Y.axis){let e=Y.span*Math.exp(r*.006),t=(Y.viewY[0]+Y.viewY[1])/2;G=e,K=!0,U=[t-e/2,t+e/2],B&&(W=t)}else if(Math.abs(e)+Math.abs(r)>3){Pe(!1);let t=(Y.viewX[1]-Y.viewX[0])/q.w*e,n=(Y.viewY[1]-Y.viewY[0])/q.h*r;H=[Y.viewX[0]-t,Y.viewX[1]-t],U=[Y.viewY[0]+n,Y.viewY[1]+n]}}X.invalidate()},Le=e=>{Z.releasePointerCapture?.(e.pointerId),Y=null,X.invalidate()},Re=()=>{Y||(J=null,X.invalidate())},ze=(e,t)=>{let[n,r]=H,i=s.clamp((r-n)*e,Q()*10,ue());if(V=i,!B){let e=n+(t-q.x)/q.w*(r-n),a=(e-n)/(r-n);H=[e-i*a,e+i*(1-a)]}X.invalidate()},Be=e=>{let t=s.clamp((U[1]-U[0])*e,x*6||1e-9,1/0),n=(U[0]+U[1])/2;G=t,K=!0,U=[n-t/2,n+t/2],X.invalidate()},Ve=e=>{if(g.interactive===!1||!(e.ctrlKey||e.metaKey))return;e.preventDefault();let[t]=c.localPoint(Z,e),n=Math.exp(e.deltaY*.002);e.shiftKey||t>q.x+q.w?Be(n):ze(n,t)},He=()=>{g.interactive!==!1&&Ge.resetView()},Ue=e=>{if(g.interactive!==!1){switch(e.key){case`+`:case`=`:ze(.8,q.x+q.w);break;case`-`:ze(1.25,q.x+q.w);break;case`ArrowUp`:case`ArrowDown`:{if(e.shiftKey){Be(e.key===`ArrowUp`?.8:1.25);break}Pe(!1);let t=(U[1]-U[0])*.1*(e.key===`ArrowUp`?1:-1);U=[U[0]+t,U[1]+t],X.invalidate();break}case`ArrowLeft`:case`ArrowRight`:{Pe(!1);let t=(H[1]-H[0])*.1*(e.key===`ArrowLeft`?-1:1);H=[H[0]+t,H[1]+t],X.invalidate();break}case`0`:case`Home`:Ge.resetView();break;default:return}e.preventDefault()}};Z.addEventListener(`pointerdown`,Fe),Z.addEventListener(`pointermove`,Ie),Z.addEventListener(`pointerup`,Le),Z.addEventListener(`pointercancel`,Le),Z.addEventListener(`pointerleave`,Re),Z.addEventListener(`wheel`,Ve,{passive:!1}),Z.addEventListener(`dblclick`,He),Z.addEventListener(`keydown`,Ue);let We=e=>{let t=xe(e.time);_.count(`bid`)+_.count(`ask`)>0&&(ve(),$(t)),_.applyDelta(e)},Ge={setBook(e){let t=xe(e.time);_.count(`bid`)+_.count(`ask`)>0&&$(t),_.setSnapshot(e),ve(),he(),Number.isFinite(C)||$(t),X.invalidate()},applyDeltas(e){if(Array.isArray(e))for(let t of e)We(t);else We(e);!Number.isFinite(C)&&x>0&&$(fe()),X.invalidate()},addTrades(e){let t=Array.isArray(e)?e:[e];for(let e of t){if(!(e.size>0)||!Number.isFinite(e.price))continue;Number.isFinite(E)&&(xe(e.time),$(e.time));let t=!Number.isFinite(C)||e.time>=C?w:Se(e.time);t&&(e.side===`buy`?(t.buyVolume+=e.size,t.buyNotional+=e.size*e.price):(t.sellVolume+=e.size,t.sellNotional+=e.size*e.price)),(!T||e.time>=T.time)&&(T=e)}X.invalidate()},clear(){_.clear(),_e(),T=null,E=NaN,x=0,W=NaN,G=NaN,K=!1,X.invalidate()},setOptions(e){let t=g;g=e,le(),(e.tickSize!==t.tickSize||(e.interval??100)!==(t.interval??100))&&(_e(),x=0,G=NaN,ve()),e.window!==t.window&&(V=NaN),e.priceSpan!==t.priceSpan&&(G=NaN),(e.renderer??`auto`)!==(t.renderer??`auto`)&&Ne(),me(),he(),ge()},resetView(){V=NaN,G=NaN,K=!1,W=NaN,Pe(!0),X.invalidate()},getRenderer:()=>I?.kind??null,ready:re,getStore:()=>_,on:(e,t)=>v.on(e,t),resize(){X.invalidate()},destroy(){R=!0,Z.removeEventListener(`pointerdown`,Fe),Z.removeEventListener(`pointermove`,Ie),Z.removeEventListener(`pointerup`,Le),Z.removeEventListener(`pointercancel`,Le),Z.removeEventListener(`pointerleave`,Re),Z.removeEventListener(`wheel`,Ve),Z.removeEventListener(`dblclick`,He),Z.removeEventListener(`keydown`,Ue),I?.destroy(),I=null,v.clear(),X.destroy(),z(null)}};return le(),me(),Ne(),Ge};exports.createOrderBookHeatmap=ee,exports.heatIntensity=m;
1
+ const e=require("../color.cjs"),t=require("../locale.cjs"),n=require("../scale.cjs"),r=require("../renderers/follow.cjs"),i=require("../time.cjs"),a=require("./book.cjs"),o=require("./format.cjs"),s=require("./host.cjs"),c=require("./field.cjs"),l=require("./layout.cjs");var u=256,d=4096,f=.98,p=1.4,m=[`#0a1830`,`#0f2c57`,`#134a8a`,`#1670b4`,`#1aa0bf`,`#2fc3a0`,`#8ad65a`,`#e8dc3f`,`#ffa733`,`#ff5a2e`],h=[`#eef4fb`,`#cfe1f6`,`#9fc2ee`,`#679ee2`,`#3a73cf`,`#3f4bb0`,`#62309a`,`#9c2783`,`#d12c52`],g=16,_=6,v={en:{time:`Time`,price:`Price`,liquidity:`Liquidity`,buys:`Buys`,sells:`Sells`,bid:`Bid`,ask:`Ask`,bidSide:`Bid side`,askSide:`Ask side`,name:`Liquidity heatmap`},zh:{time:`时间`,price:`价格`,liquidity:`挂单量`,buys:`主动买入`,sells:`主动卖出`,bid:`买一`,ask:`卖一`,bidSide:`买盘`,askSide:`卖盘`,name:`订单簿热力图`},ja:{time:`時刻`,price:`価格`,liquidity:`指値量`,buys:`買い約定`,sells:`売り約定`,bid:`最良買気配`,ask:`最良売気配`,bidSide:`買い板`,askSide:`売り板`,name:`板ヒートマップ`},fr:{time:`Heure`,price:`Prix`,liquidity:`Liquidité`,buys:`Achats`,sells:`Ventes`,bid:`Meilleur achat`,ask:`Meilleure vente`,bidSide:`Côté achat`,askSide:`Côté vente`,name:`Carte de chaleur de la liquidité`}},y=(e,t,n,r)=>{if(!(e>0)||!(t>0))return 0;let i=Math.min(1,e*r/t);switch(n){case`linear`:return i;case`sqrt`:return Math.sqrt(i);default:return Math.log10(1+9*i)}},ee=(ee,b={})=>{let x=b,S=a.createOrderBookStore(),te=s.createEmitter(),C=o.createFormatters(x,2,4),w={up:[0,0,0,1],down:[0,0,0,1]},ne=new Uint32Array(u),T=new Uint32Array(c.HEAT_TABLE_SIZE+1),E=[0,0,0,1],D=!1,O=0,k=[],re=0,A=NaN,j={buyVolume:0,buyNotional:0,sellVolume:0,sellNotional:0},ie=null,M=NaN,ae=0,N=0,P=0,oe=-1/0,F=0,I=0,L=null,R=``,z=``,B=null,V=null,se=0,ce=!1,le=()=>{},ue=new Promise(e=>{le=e}),de=!0,H=NaN,U=[0,1],W=[0,1],fe=!1,G=null,K=NaN,q=NaN,pe=0,J={x:0,y:0,w:0,h:0},Y=null,me=``,X=null,Z=s.createHost(ee,{className:`minerva-orderbook-heatmap`,draw:He,onTheme:()=>{Ce(),Z.invalidate()}}),{root:Q,doc:he}=Z;Q.tabIndex=0,Q.setAttribute(`role`,`figure`),Q.style.touchAction=`none`;let ge=t.localeLabels(v,x.locale,x.labels),_e=()=>ge,ve=()=>{ge=t.localeLabels(v,x.locale,x.labels),Q.setAttribute(`aria-label`,x.ariaLabel??ge.name)},$=()=>Math.max(10,x.interval??100),ye=()=>Math.max($()*4,x.history??3e5),be=()=>Math.max(4,Math.round(x.depth??160)),xe=()=>{if(!Number.isFinite(M))return Date.now();let e=Se()-ae;return M+Math.min(Math.max(0,e),$()*3)},Se=()=>typeof performance<`u`?performance.now():Date.now();function Ce(){let t=Z.theme;w=o.sideColors(t,x);let n=e=>{let n=t.resolve?t.resolve(e,t.primary):t.primary;return[n[0],n[1],n[2],1]},r=[t.background[0],t.background[1],t.background[2],1];D=t.background[3]>0&&e.luminance(r)<.4;let i=(x.colors?.length?x.colors:D?m:h).map(n);E=i[0]??r,ne=e.oklabRamp(i.length>1?i:[E,E],u);let a=x.colorScale??`log`;T=c.heatTable(ne,e=>y(e,1,a,1)**p),z=``}let we=()=>{C=o.createFormatters(x,O>0?Math.max(a.decimalsOf(O),a.inferPriceDecimals(S)):a.inferPriceDecimals(S),a.inferSizeDecimals(S))},Te=()=>{k=[],L=null,R=z=``,B=null,A=NaN,N=P=0,oe=-1/0,F=0,I=0,q=NaN,j.buyVolume=j.buyNotional=j.sellVolume=j.sellNotional=0},Ee=()=>{if(O>0)return;let e=a.inferTickSize(S),t=S.mid();if(x.tickSize&&x.tickSize>0)O=x.tickSize;else if(e>0&&Number.isFinite(t)){let n=t*1e-5/e,r=1;for(let e=1;e<=1e9&&r<n*.75;e*=10)for(let t of[1,2,5])if(r=t*e,r>=n*.75)break;O=a.roundToStep(e*r,e)}else O=Number.isFinite(t)?Math.max(1e-8,t*1e-5):0;O>0&&we()},De=()=>{let e=be(),t=new Float64Array(e*2),n=new Float32Array(e*2),r=0;for(let i of[`bid`,`ask`]){let a=S.count(i),o=0;for(let s=0;s<a;s++){let a=Math.round(S.priceAt(i,s)/O),c=S.sizeAt(i,s);if(r>0&&t[r-1]===a&&o>0){n[r-1]+=c;continue}if(o>=e)break;t[r]=a,n[r]=c,r++,o++}}return{bins:t.slice(0,r),sizes:n.slice(0,r)}},Oe=e=>{if(!(O>0))return;let{bins:t,sizes:n}=De(),r={seq:re++,time:e,bins:t,sizes:n,bestBid:S.bestBid(),bestAsk:S.bestAsk(),buyVolume:j.buyVolume,buyNotional:j.buyNotional,sellVolume:j.sellVolume,sellNotional:j.sellNotional};j.buyVolume=j.buyNotional=j.sellVolume=j.sellNotional=0,k.push(r);let i=e-ye(),a=0;for(;a<k.length&&k[a].time<i;)a++;a&&(k=k.slice(a))},ke=e=>{if(!Number.isFinite(e))return;let t=$();if(!Number.isFinite(A)){A=Math.floor(e/t)*t;return}if(e-A>ye()){Oe(A),A=Math.floor(e/t)*t;return}for(;e>=A+t;)Oe(A),A+=t},Ae=e=>e===void 0||!Number.isFinite(e)?Date.now():((!Number.isFinite(M)||e>=M)&&(M=e,ae=Se()),e),je=e=>{if(Number.isFinite(A)&&e>=A)return null;let t=0,n=k.length;for(;t<n;){let r=t+n>>>1;k[r].time<=e?t=r+1:n=r}return t>0?k[t-1]:null},Me=()=>{if(!Number.isFinite(A)||!(O>0))return null;let e=S.version();return(!B||B.version!==e)&&(B={version:e,...De()}),{time:A,bins:B.bins,sizes:B.sizes}},Ne=(e,t,n,r,i,a)=>{let s=$(),l=Me(),u=Math.min(d,Math.ceil(J.w)),p=Math.min(d,Math.ceil(J.h)),m=k.length?k[k.length-1].seq:-1,h=[e,t,n,r,Math.floor(i/s),k.length,m,B?.version??-1,u,p,O].join(`|`);if(h!==R){let a=l?[...k,l]:k;L=c.buildHeatGrid({sources:a,step:s,tick:O,x0:e,x1:t,y0:n,y1:r,end:i,maxWidth:u,maxHeight:p},L),R=h,z=``}if(!L)return null;let g=x.maxSize;if(g!==void 0&&g>0)N=g;else{let e=Se();if(e-oe>250||!(P>0)){let t=c.percentile(L.cells,f);t>0&&(P=t),oe=e}N>0?P>0&&Math.abs(P/N-1)>.001&&(N+=(P-N)*o.ease(a,700)):N=P}let _=Math.max(.01,x.contrast??1),v=N>0?c.HEAT_TABLE_SIZE*_/N:0;return`${L.version}|${v}`!==z&&(c.paintHeatGrid(L,T,v),z=`${L.version}|${v}`),L},Pe=()=>{let e=$(),t=[],n=0,r=k.length;for(;n<r;){let t=n+r>>>1;k[t].time+e<U[0]?n=t+1:r=t}for(let e=n;e<k.length;e++){let n=k[e];if(n.time>U[1])break;t.push(n)}return t},Fe=(e,t)=>{let n=$(),r=Math.max(1,Math.ceil(_/Math.max(1e-6,t))),i=[],a=NaN,o=0,s=0,c={bv:0,bn:0,sv:0,sn:0},l=()=>{let e=(o+s)/2;c.sv>0&&i.push({time:e,price:c.sn/c.sv,volume:c.sv,buy:!1}),c.bv>0&&i.push({time:e,price:c.bn/c.bv,volume:c.bv,buy:!0}),c.bv=c.bn=c.sv=c.sn=0},u=(e,t,i)=>{let u=Math.floor(e/r);u!==a&&(Number.isFinite(a)&&l(),a=u,o=t),s=t+n,c.bv+=i.buyVolume,c.bn+=i.buyNotional,c.sv+=i.sellVolume,c.sn+=i.sellNotional};for(let t of e)u(t.seq,t.time,t);return Number.isFinite(A)&&A<=U[1]&&u(re,A,j),Number.isFinite(a)&&l(),i},Ie=e=>{e.save(),e.beginPath(),e.rect(J.x,J.y,J.w,J.h),e.clip()},Le=(t,n,r,i,a)=>{if(x.bestLines===!1)return;let o=$(),s=n.map(e=>[e.time,e.time+o,e.bestBid,e.bestAsk]);if(Number.isFinite(A)&&s.push([A,A+o,S.bestBid(),S.bestAsk()]),!s.length)return;for(let e=0;e+1<s.length;e++)s[e][1]=s[e+1][0];let c=a>=2,l=e=>{let t=r(e[0]),n=r(e[1]);return c?[t,n]:[(t+n)/2,(t+n)/2]};Ie(t),t.beginPath();let u=[],d=()=>{if(u.length){u.forEach((e,n)=>{let[r,a]=l(e),o=i(e[3]);n?t.lineTo(r,o):t.moveTo(r,o),t.lineTo(a,o)});for(let e=u.length-1;e>=0;e--){let[n,r]=l(u[e]),a=i(u[e][2]);t.lineTo(r,a),t.lineTo(n,a)}t.closePath(),u=[]}};for(let e of s){let[,,t,n]=e;Number.isFinite(t)&&Number.isFinite(n)&&n>t?u.push(e):d()}d(),t.fillStyle=e.toCss(Z.theme.text,D?.08:.07),t.fill(),t.lineJoin=`round`;for(let[n,r]of[[2,w.up],[3,w.down]]){t.beginPath();let a=!1;for(let e of s){let r=e[n];if(!Number.isFinite(r)){a=!1;continue}let o=i(r),[s,u]=l(e);a?t.lineTo(s,o):t.moveTo(s,o),c&&t.lineTo(u,o),a=!0}t.strokeStyle=e.toCss(E,.55),t.lineWidth=3.5,t.stroke(),t.strokeStyle=e.toCss(r),t.lineWidth=1.5,t.stroke()}t.restore()},Re=(t,n,r,i,a)=>{if(!n.length)return;let s=0;for(let e of n)s=Math.max(s,e.volume);F=F>0?Math.max(s,F*.995):s;let c=x.bubbleVolume??F,l=Math.max(4,x.bubbleSize??28),u=n.map(e=>({...e,d:o.clamp(Math.sqrt(e.volume/c)*l,3,l)})).sort((e,t)=>e.d-t.d);Ie(t),t.lineWidth=1.25,t.textAlign=`center`,t.textBaseline=`middle`,t.font=o.fontOf(Z.theme,x,600,Math.max(8,a-1));for(let n of u){let a=r(n.time),o=i(n.price),s=n.d/2;if(a<J.x-s||a>J.x+J.w+s||o<J.y-s||o>J.y+J.h+s)continue;let c=n.buy?w.up:w.down;if(t.beginPath(),t.arc(a,o,s,0,Math.PI*2),t.fillStyle=e.toCss(c,.62),t.fill(),t.strokeStyle=e.toCss(e.mixOklab(c,[1,1,1,1],.25)),t.stroke(),n.d>=26){let e=C.compact(n.volume);t.measureText(e).width<=n.d-6&&(t.fillStyle=`#fff`,t.fillText(e,a,o+.5))}}t.restore()},ze=(t,n,r,i,a)=>{let s=Z.theme,[c,u]=W,d=Math.max(1,O/(u-c)*J.h),f=0,p=[`bid`,`ask`].map(e=>{let t=S.levels(e,{step:O,limit:be()});for(let e=0;e<t.count;e++){let n=t.price[e];n>=c&&n<=u&&(f=Math.max(f,t.size[e]))}return{side:e,...t}});if((f>I||f<I*.6||!(I>0))&&(I=l.fineCeil(f)),!(I>0))return;let m=n+2,h=Math.max(4,r-6);t.strokeStyle=e.toCss(s.text,.07),t.lineWidth=1,t.setLineDash([2,3]),t.beginPath();for(let e of[.5,1]){let n=Math.round(m+h*e)-.5;t.moveTo(n,J.y),t.lineTo(n,J.y+J.h)}t.stroke(),t.setLineDash([]),t.save(),t.beginPath(),t.rect(n,J.y,r,J.h),t.clip();let g=+(d>=4),_=(e,n)=>{let r=Math.round(i(e+O/2)),a=Math.max(r+1,Math.round(i(e-O/2))-g),o=Math.max(1,Math.min(h,n/I*h));t.rect(m,r,o,a-r)};for(let{side:n,price:r,size:i,count:a}of p){let o=n===`bid`?w.up:w.down;t.beginPath();for(let e=1;e<a;e++){let t=r[e];t>=c-O&&t<=u+O&&_(t,i[e])}t.fillStyle=e.toCss(o,D?.62:.55),t.fill();let s=r[0];a&&s!==void 0&&s>=c&&s<=u&&(t.beginPath(),_(s,i[0]),t.fillStyle=e.toCss(o),t.fill())}t.restore();let v=Math.round(J.y+J.h+4)+.5;t.strokeStyle=e.toCss(s.textMuted,.7),t.beginPath(),t.moveTo(m,v),t.lineTo(m+h,v);for(let e of[0,.5,1]){let n=Math.round(m+h*e)+.5;t.moveTo(n,v),t.lineTo(n,v+3)}t.stroke(),t.font=o.fontOf(s,x,400,Math.max(8,a-1)),t.fillStyle=e.toCss(s.textMuted),t.textBaseline=`top`;let y=C.compact(I),ee=t.measureText(y).width;t.textAlign=`right`,t.fillText(y,m+h+2,v+4),ee+t.measureText(`0`).width+8<h&&(t.textAlign=`left`,t.fillText(`0`,m-1,v+4))},Be=()=>{if(!Y||x.tooltip===!1||!(O>0)||X||!fe)return null;let[e,t]=Y;if(e<J.x||e>J.x+J.w||t<J.y||t>J.y+J.h)return null;let[n,r]=U,[i,o]=W,s=n+(e-J.x)/J.w*(r-n),c=i+(J.y+J.h-t)/J.h*(o-i),l=Math.round(c/O),u=+(l*O).toFixed(Math.min(12,a.decimalsOf(O)+2)),d=je(s);return{hx:e,hy:t,time:s,start:d?d.time:Number.isFinite(A)&&s>=A?A:NaN,column:d,bin:l,rowPrice:u}},Ve=(t,n,r,i,a,s,c,l=`left`)=>{let u=Math.min(t.measureText(n).width+10,a),d=l===`center`?r-u/2:r;t.fillStyle=c?e.toCss(s):e.toCss(E),o.roundRect(t,d,i-g/2,u,g,3),t.fill(),c||(t.strokeStyle=e.toCss(s),t.lineWidth=1,t.stroke()),t.fillStyle=c?e.luminance(s)>.6?`#111`:`#fff`:e.toCss(s),t.textAlign=l,t.textBaseline=`middle`,t.fillText(n,l===`center`?r:d+5,i+.5)};function He(t){let r=Z.ctx;if(!r)return!1;let{width:a,height:s,dpr:c,theme:u}=Z,d=pe?t-pe:0;pe=t;let f=_e(),p=x.fontSize??(a<420?10:11),m=o.fontOf(u,x,400,p),h=o.fontOf(u,x,600,p),_=$(),v=!Number.isFinite(M);v&&S.count(`bid`)+S.count(`ask`)>0&&ke(Date.now());let y=xe();q=Number.isFinite(q)&&y>q-_*4?Math.max(q,y):y;let ee=q;r.setTransform(c,0,0,c,0,0),r.clearRect(0,0,a,s),Ee();let b=S.mid();r.font=h;let te=C.price(Number.isFinite(b)?b*1.0001:0),ne=Math.ceil(r.measureText(te).width)+18;r.font=m;let T=x.profile===!1?0:Math.round(o.clamp(a*.12,56,120)),re=p+12;J={x:0,y:0,w:Math.max(10,a-ne-T),h:Math.max(10,s-re)};let j=J.x+J.w,N=j+T;if(Number.isFinite(H)||(H=Math.max(_*10,x.window??6e4)),de){let e=k.length?k[0].time:A;U=l.fitTimeRange(e,ee,H,Math.min(H,_*60));let t=S.bestBid(),n=S.bestAsk();for(let e of Pe())Number.isFinite(e.bestBid)&&!(e.bestBid>=t)&&(t=e.bestBid),Number.isFinite(e.bestAsk)&&!(e.bestAsk<=n)&&(n=e.bestAsk);Number.isFinite(t)||(t=n),Number.isFinite(n)||(n=t);let r=O>0?O*Math.max(40,J.h/6):0,i=x.priceSpan??(Number.isFinite(K)?K:void 0);if(r>0||i!==void 0){G=l.fitPriceRange(G,t,n,r,i);let[e,a]=G;if(Number.isFinite(e)&&Number.isFinite(a)){if(!fe)W=[e,a],fe=!0;else{let t=o.ease(d,280);W=[W[0]+(e-W[0])*t,W[1]+(a-W[1])*t]}}}}let[P,oe]=U,[F,I]=W,L=e=>J.x+(e-P)/(oe-P)*J.w,R=e=>J.y+J.h-(e-F)/(I-F)*J.h,z=fe&&O>0,B=Pe(),se=_/(oe-P)*J.w,ce=e.toCss(E);if(V){let e=V.canvas;e.style.left=`${J.x}px`,e.style.top=`${J.y}px`,e.style.width=`${J.w}px`,e.style.height=`${J.h}px`;let t=Math.max(1,Math.round(J.w*c)),n=Math.max(1,Math.round(J.h*c));(e.width!==t||e.height!==n)&&V.resize(t,n);let r=z&&Number.isFinite(A)?Ne(P,oe,F,I,ee,d):null,i=t/J.w,a=n/J.h,o=r?[(L(r.t0)-J.x)*i,(R(r.p1)-J.y)*a,(L(r.t1)-J.x)*i,(R(r.p0)-J.y)*a]:[0,0,0,0];V.render(r,o,E)}else r.fillStyle=ce,r.fillRect(J.x,J.y,J.w,J.h);let le=z?n.linearTicks(F,I,Math.max(2,Math.floor(J.h/44))):[],ue=i.timeTicks(P,oe,Math.max(2,Math.floor(J.w/75)),void 0,x.timeZone??`local`);r.strokeStyle=e.toCss(u.text,D?.07:.09),r.lineWidth=1,r.beginPath();for(let e of le){let t=Math.round(R(e))+.5;r.moveTo(J.x,t),r.lineTo(N,t)}for(let e of ue.values){let t=Math.round(L(e))+.5;t<=J.x+1||t>=j-1||(r.moveTo(t,J.y),r.lineTo(t,J.y+J.h))}r.stroke(),z&&(Le(r,B,L,R,se),x.bubbles!==!1&&Re(r,Fe(B,se),L,R,p),T&&ze(r,j,T,R,p)),r.strokeStyle=e.toCss(u.axis),r.lineWidth=1,r.beginPath(),r.moveTo(0,Math.round(J.y+J.h)+.5),r.lineTo(a,Math.round(J.y+J.h)+.5),T&&(r.moveTo(Math.round(j)+.5,J.y),r.lineTo(Math.round(j)+.5,J.y+J.h)),r.moveTo(Math.round(N)+.5,J.y),r.lineTo(Math.round(N)+.5,J.y+J.h),r.stroke();let Y=z?Be():null;r.font=m;let me=Y?o.formatClock(Number.isFinite(Y.start)?Y.start:Y.time,_<1e3,x.timeZone):``,X=Y?r.measureText(me).width/2+8:0;r.fillStyle=e.toCss(u.textMuted),r.textAlign=`center`,r.textBaseline=`top`;for(let e of ue.values){let t=L(e),n=ue.format(e),i=r.measureText(n).width/2;t-i<J.x+2||t+i>j-2||Y&&Math.abs(t-Y.hx)<X+i||r.fillText(n,t,J.y+J.h+6)}let Q=ie,he=[{price:S.bestAsk(),color:w.down,filled:!0},{price:S.bestBid(),color:w.up,filled:!0}];Q&&Q.price!==S.bestBid()&&Q.price!==S.bestAsk()&&he.push({price:Q.price,color:Q.side===`buy`?w.up:w.down,filled:!1});let ge=z?he.filter(e=>Number.isFinite(e.price)&&e.price>=F&&e.price<=I):[],ve=Y?Math.round(R(Y.rowPrice))+.5:NaN,ye=l.layoutAxisLabels(ge.map(e=>({y:R(e.price),h:g})),Y?{y:ve,h:g}:null,le.map(R),p+2,[J.y,J.y+J.h]);r.fillStyle=e.toCss(u.textMuted),r.textAlign=`left`,r.textBaseline=`middle`,le.forEach((e,t)=>{ye.ticks[t]&&r.fillText(C.price(e),N+6,R(e))}),r.font=h,ge.forEach((t,n)=>{let i=ye.pinned[n];if(i==null)return;let o=R(t.price);Math.abs(i-o)>1&&(r.strokeStyle=e.toCss(t.color),r.lineWidth=1,r.beginPath(),r.moveTo(N-4,o),r.lineTo(N+1,i),r.stroke()),Ve(r,C.price(t.price),N+1,i,a-N-2,t.color,t.filled)}),Ue(r,L,R,N,f,Y,ve,me),r.font=m,Z.describe(`${x.ariaLabel??f.name}. ${f.bid} ${C.price(S.bestBid())}, ${f.ask} ${C.price(S.bestAsk())}.`);let be=v||Se()-ae<2e3;return de&&be&&Number.isFinite(A)||fe&&G!==null&&Math.abs(W[0]-G[0])>1e-9}function Ue(t,n,r,i,a,c,l,u){let{theme:d}=Z;if(!c){Z.tooltip.style.display=`none`,me&&(me=``,te.emit(`hover`,null));return}let{hx:f,hy:p,time:m,start:h,column:_,bin:v,rowPrice:y}=c,ee=$(),b=0,ne=NaN,T=NaN,E=0,D=0;if(_){for(let e=0;e<_.bins.length;e++)_.bins[e]===v&&(b+=_.sizes[e]);({bestBid:ne,bestAsk:T,buyVolume:E,sellVolume:D}=_)}else if(Number.isFinite(h)){let e=[`bid`,`ask`].map(e=>S.levels(e,{step:O,limit:be()}));for(let t of e)for(let e=0;e<t.count;e++)Math.round(t.price[e]/O)===v&&(b+=t.size[e]);ne=S.bestBid(),T=S.bestAsk(),E=j.buyVolume,D=j.sellVolume}let k=y<=ne?`bid`:y>=T?`ask`:null;if(t.strokeStyle=e.toCss(d.text,.5),t.lineWidth=1,t.setLineDash([3,3]),t.beginPath(),t.moveTo(Math.round(f)+.5,J.y),t.lineTo(Math.round(f)+.5,J.y+J.h),t.moveTo(J.x,l),t.lineTo(i,l),t.stroke(),t.setLineDash([]),Number.isFinite(h)){let i=n(h),a=n(h+ee),o=r(y+O/2),s=r(y-O/2);t.strokeStyle=e.toCss(d.text,.85),t.strokeRect(i,o,Math.max(2,a-i),Math.max(2,s-o))}t.font=o.fontOf(d,x,600,x.fontSize??(Z.width<420?10:11)),Ve(t,C.price(y),i+1,l,Z.width-i-2,d.text,!0),Ve(t,u,o.clamp(f,J.x+40,J.x+J.w-40),J.y+J.h+g/2+2,J.w,d.text,!0,`center`);let re=k===`bid`?w.up:k===`ask`?w.down:null;s.tooltipHtml(he,Z.tooltip,{text:o.formatClock(Number.isFinite(h)?h:m,!0,x.timeZone),color:void 0,badge:k&&re?{text:k===`bid`?a.bidSide:a.askSide,color:e.toCss(re)}:void 0},[[a.price,C.price(y)],[a.liquidity,C.size(b)],[a.buys,C.size(E)],[a.sells,C.size(D)]]),Z.tooltip.style.display=`block`,Z.placeTooltip(Z.tooltip,f,p,f>J.w*.6?`left`:`right`);let A=`${h}|${v}|${b}|${E}|${D}`;if(A!==me){me=A;let e={time:Number.isFinite(h)?h:m,price:y,size:b,side:k,buyVolume:E,sellVolume:D};te.emit(`hover`,e)}}let We=async(e=new Set)=>{let t=++se,n=await c.createHeatFieldRenderer(x.renderer??`auto`,()=>{let e=he.createElement(`canvas`);return Object.assign(e.style,{position:`absolute`,left:`0`,top:`0`,pointerEvents:`none`}),e.setAttribute(`aria-hidden`,`true`),e},t=>{ce||V?.kind!==t||(V.destroy(),V.canvas.remove(),V=null,We(new Set([...e,t])))},e);if(ce||t!==se){n?.destroy();return}V&&(V.destroy(),V.canvas.remove()),V=n,n?(Q.dataset.renderer=n.kind,Q.insertBefore(n.canvas,Z.canvas),te.emit(`renderer`,n.kind)):delete Q.dataset.renderer,le(n?.kind??null),Z.invalidate()},Ge=r.followDefaultRenderer(()=>x.renderer,()=>void We()),Ke=e=>{de!==e&&(de=e,te.emit(`follow`,e))},qe=e=>{let t=k.length?k[0].time:A;if(!Number.isFinite(t))return e;let n=e[1]-e[0],r=(Number.isFinite(q)?q:xe())+$()+n/2,i=Math.max(t-n/2,Math.min(e[0],r-n));return[i,i+n]},Je=e=>{if(x.interactive===!1)return;let[t,n]=s.localPoint(Q,e);Q.setPointerCapture?.(e.pointerId),X={x:t,y:n,viewX:[...U],viewY:[...W],axis:t>J.x+J.w,span:W[1]-W[0]}},Ye=e=>{let[t,n]=s.localPoint(Q,e);if(Y=[t,n],X){let e=t-X.x,r=n-X.y;if(X.axis){let e=X.span*Math.exp(r*.006),t=(X.viewY[0]+X.viewY[1])/2;K=e,W=[t-e/2,t+e/2],G=[W[0],W[1]]}else if(Math.abs(e)+Math.abs(r)>3){Ke(!1);let t=(X.viewX[1]-X.viewX[0])/J.w*e,n=(X.viewY[1]-X.viewY[0])/J.h*r;U=qe([X.viewX[0]-t,X.viewX[1]-t]),W=[X.viewY[0]+n,X.viewY[1]+n]}}Z.invalidate()},Xe=e=>{Q.releasePointerCapture?.(e.pointerId),X=null,Z.invalidate()},Ze=()=>{X||(Y=null,Z.invalidate())},Qe=(e,t)=>{let[n,r]=U,i=o.clamp((de?H:r-n)*e,$()*10,ye());if(H=i,!de){let e=n+(t-J.x)/J.w*(r-n),a=(e-n)/(r-n);U=qe([e-i*a,e+i*(1-a)])}Z.invalidate()},$e=e=>{let t=o.clamp((W[1]-W[0])*e,O*6||1e-9,1/0),n=(W[0]+W[1])/2;K=t,W=[n-t/2,n+t/2],G=[W[0],W[1]],Z.invalidate()},et=e=>{if(x.interactive===!1||!(e.ctrlKey||e.metaKey))return;e.preventDefault();let[t]=s.localPoint(Q,e),n=Math.exp(e.deltaY*.002);e.shiftKey||t>J.x+J.w?$e(n):Qe(n,t)},tt=()=>{x.interactive!==!1&&it.resetView()},nt=e=>{if(x.interactive!==!1){switch(e.key){case`+`:case`=`:Qe(.8,J.x+J.w);break;case`-`:Qe(1.25,J.x+J.w);break;case`ArrowUp`:case`ArrowDown`:{if(e.shiftKey){$e(e.key===`ArrowUp`?.8:1.25);break}Ke(!1);let t=(W[1]-W[0])*.1*(e.key===`ArrowUp`?1:-1);W=[W[0]+t,W[1]+t],Z.invalidate();break}case`ArrowLeft`:case`ArrowRight`:{Ke(!1);let t=(U[1]-U[0])*.1*(e.key===`ArrowLeft`?-1:1);U=qe([U[0]+t,U[1]+t]),Z.invalidate();break}case`0`:case`Home`:it.resetView();break;default:return}e.preventDefault()}};Q.addEventListener(`pointerdown`,Je),Q.addEventListener(`pointermove`,Ye),Q.addEventListener(`pointerup`,Xe),Q.addEventListener(`pointercancel`,Xe),Q.addEventListener(`pointerleave`,Ze),Q.addEventListener(`wheel`,et,{passive:!1}),Q.addEventListener(`dblclick`,tt),Q.addEventListener(`keydown`,nt);let rt=e=>{let t=Ae(e.time);S.count(`bid`)+S.count(`ask`)>0&&(Ee(),ke(t)),S.applyDelta(e)},it={setBook(e){let t=Ae(e.time);S.count(`bid`)+S.count(`ask`)>0&&ke(t),S.setSnapshot(e),Ee(),we(),Number.isFinite(A)||ke(t),Z.invalidate()},applyDeltas(e){if(Array.isArray(e))for(let t of e)rt(t);else rt(e);!Number.isFinite(A)&&O>0&&ke(xe()),Z.invalidate()},addTrades(e){let t=Array.isArray(e)?e:[e];for(let e of t){if(!(e.size>0)||!Number.isFinite(e.price))continue;Number.isFinite(M)&&(Ae(e.time),ke(e.time));let t=!Number.isFinite(A)||e.time>=A?j:je(e.time);t&&(e.side===`buy`?(t.buyVolume+=e.size,t.buyNotional+=e.size*e.price):(t.sellVolume+=e.size,t.sellNotional+=e.size*e.price)),(!ie||e.time>=ie.time)&&(ie=e)}Z.invalidate()},clear(){S.clear(),Te(),ie=null,M=NaN,O=0,K=NaN,G=null,fe=!1,Z.invalidate()},setOptions(e){let t=x;x=e,ve(),(e.tickSize!==t.tickSize||(e.interval??100)!==(t.interval??100))&&(Te(),O=0,K=NaN,Ee()),e.window!==t.window&&(H=NaN),e.priceSpan!==t.priceSpan&&(K=NaN),(e.renderer??`auto`)!==(t.renderer??`auto`)&&We(),Ce(),we(),Z.invalidate()},resetView(){H=NaN,K=NaN,G=null,Ke(!0),Z.invalidate()},getRenderer:()=>V?.kind??null,ready:ue,getStore:()=>S,on:(e,t)=>te.on(e,t),resize(){Z.invalidate()},destroy(){ce=!0,Ge(),Q.removeEventListener(`pointerdown`,Je),Q.removeEventListener(`pointermove`,Ye),Q.removeEventListener(`pointerup`,Xe),Q.removeEventListener(`pointercancel`,Xe),Q.removeEventListener(`pointerleave`,Ze),Q.removeEventListener(`wheel`,et),Q.removeEventListener(`dblclick`,tt),Q.removeEventListener(`keydown`,nt),V?.destroy(),V=null,te.clear(),Z.destroy(),le(null)}};return ve(),Ce(),We(),it};exports.createOrderBookHeatmap=ee,exports.heatIntensity=y;
2
2
  //# sourceMappingURL=heatmap.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"heatmap.cjs","names":["createOrderBookStore","createEmitter","createFormatters","createHost","localeLabels","sideColors","luminance","rampColor","packColor","decimalsOf","inferPriceDecimals","inferSizeDecimals","inferTickSize","roundToStep","clamp","GAP","fontOf","ease","linearTicks","toCss","timeTicks","formatClock","createRenderer","localPoint","require_color","require_types","require_locale","require_scale","require_detect","require_time","require_book","require_format","require_host","CHUNK","LUT_SIZE","DARK_RAMP","LIGHT_RAMP","LABELS","heatIntensity","size","max","r","contrast","scale","createOrderBookHeatmap","options","initial","store","emitter","fmt","colors","lut","tick","columns","seq","openStart","open","lastTrade","dataTime","dataWall","scaleMax","bubbleRef","chunks","dirtyChunks","itemVersion","headItem","headVersion","origin","renderer","rendererToken","destroyed","resolveReady","ready","resolve","follow","windowSpan","viewX","viewY","yCenter","ySpan","userSpan","lastFrame","plot","hoverAt","hoverKey","drag","host","container","refreshColors","markAllDirty","root","texts","labels","applyTexts","interval","history","depth","nowTime","elapsed","perfNow","theme","value","dark","stops","i","c","refreshFormat","id","clearHistory","ensureTick","base","mid","ratio","multiple","p","m","sampleBook","limit","bins","sizes","n","top","side","count","rows","bin","s","b","a","closeColumn","column","start","recent","sum","target","oldest","drop","first","advance","time","step","noteTime","columnAt","lo","hi","ensureOrigin","intensityIndex","cellsItem","list","instances","f","u","k","half","x","level","price","chunkItems","byChunk","visibleColumns","out","bubblesItem","all","push","volume","notional","buy","visible","ref","maxD","buffer","up","down","lineItems","build","points","write","y","pick","key","headCells","version","draw","ctx","dt","now","l","fontSize","width","live","dpr","height","sample","axisW","profileW","timeH","right","center","x0","x1","y0","y1","xOf","t","yOf","canvas","bw","bh","items","head","bubbles","xScale","yScale","yTicks","xt","px","rowPx","maxSize","sides","w","tag","text","filled","color","clear","drawHover","fresh","hide","hx","hy","rowPrice","bestBid","bestAsk","buyVolume","sellVolume","levels","lv","ry","cx0","cx1","cy0","cy1","sideColor","doc","event","initRenderer","token","next","kind","exclude","setFollow","onPointerDown","onPointerMove","dx","dy","span","tx","ty","onPointerUp","onPointerLeave","zoomTime","factor","anchorX","zoomPrice","onWheel","onDoubleClick","instance","onKeyDown","d","applyOne","delta","snapshot","deltas","trades","trade","previous","handler"],"sources":["../../../../../charts/src/engine/orderbook/heatmap.ts"],"sourcesContent":["// createOrderBookHeatmap: Bookmap-style liquidity heatmap. The book is\n// sampled every `interval` ms into a column of price rows; columns are\n// drawn by the GPU renderers of the chart engine as bar instances (one per\n// cell), in chunks of CHUNK columns uploaded once, so streaming costs one\n// small chunk per column. Trades are bubbles (scatter instances), the best\n// bid / ask are lines; axes, the book profile, the crosshair and the\n// tooltip are drawn on a Canvas2D layer above.\n\nimport { packColor, rampColor, toCss, luminance, type Rgba } from \"../color\";\nimport { createRenderer } from \"../renderers/detect\";\nimport {\n BAR_STRIDE,\n GAP,\n SCATTER_STRIDE,\n type BarItem,\n type ChartRenderer,\n type LineItem,\n type RenderItem,\n type ScatterItem,\n} from \"../renderers/types\";\nimport { linearTicks } from \"../scale\";\nimport { timeTicks } from \"../time\";\nimport type { ChartRendererKind } from \"../types\";\nimport {\n createOrderBookStore,\n decimalsOf,\n inferPriceDecimals,\n inferSizeDecimals,\n inferTickSize,\n roundToStep,\n} from \"./book\";\nimport {\n clamp,\n createFormatters,\n ease,\n fontOf,\n formatClock,\n roundRect,\n sideColors,\n type Formatters,\n} from \"./format\";\nimport { localeLabels, type LabelDictionary } from \"../locale\";\nimport { createEmitter, createHost, localPoint, tooltipHtml } from \"./host\";\nimport type {\n OrderBookDelta,\n OrderBookHeatmapEventMap,\n OrderBookHeatmapHoverEvent,\n OrderBookHeatmapInstance,\n OrderBookHeatmapLabels,\n OrderBookHeatmapOptions,\n OrderBookHeatmapScale,\n OrderBookSide,\n MarketTrade,\n} from \"./types\";\n\n/** Columns per GPU chunk */\nconst CHUNK = 32;\n/** Colors of the ramp lookup table */\nconst LUT_SIZE = 128;\n\nconst DARK_RAMP = [\n \"#0b2a4f\",\n \"#12508f\",\n \"#1c7fd0\",\n \"#25b3d6\",\n \"#4fd6a0\",\n \"#e9e35a\",\n \"#ffa23d\",\n \"#ff5533\",\n];\nconst LIGHT_RAMP = [\n \"#dbeafe\",\n \"#93c5fd\",\n \"#3b82f6\",\n \"#4338ca\",\n \"#9333ea\",\n \"#db2777\",\n \"#f97316\",\n];\n\nconst LABELS: LabelDictionary<OrderBookHeatmapLabels> = {\n en: {\n time: \"Time\",\n price: \"Price\",\n liquidity: \"Liquidity\",\n buys: \"Buys\",\n sells: \"Sells\",\n bid: \"Bid\",\n ask: \"Ask\",\n name: \"Liquidity heatmap\",\n },\n zh: {\n time: \"时间\",\n price: \"价格\",\n liquidity: \"挂单量\",\n buys: \"主动买入\",\n sells: \"主动卖出\",\n bid: \"买一\",\n ask: \"卖一\",\n name: \"订单簿热力图\",\n },\n ja: {\n time: \"時刻\",\n price: \"価格\",\n liquidity: \"指値量\",\n buys: \"買い約定\",\n sells: \"売り約定\",\n bid: \"最良買気配\",\n ask: \"最良売気配\",\n name: \"板ヒートマップ\",\n },\n fr: {\n time: \"Heure\",\n price: \"Prix\",\n liquidity: \"Liquidité\",\n buys: \"Achats\",\n sells: \"Ventes\",\n bid: \"Meilleur achat\",\n ask: \"Meilleure vente\",\n name: \"Carte de chaleur de la liquidité\",\n },\n};\n\ninterface Column {\n /** Sequence number (chunk = seq / CHUNK) */\n seq: number;\n /** Start time */\n time: number;\n /** Price rows (price / tick, rounded) */\n bins: Float64Array;\n sizes: Float32Array;\n bestBid: number;\n bestAsk: number;\n buyVolume: number;\n buyNotional: number;\n sellVolume: number;\n sellNotional: number;\n /** A robust \"large\" size of the column (4th largest), for the auto scale */\n reference: number;\n}\n\n/** Normalized intensity (0-1) of a size */\nexport const heatIntensity = (\n size: number,\n max: number,\n scale: OrderBookHeatmapScale,\n contrast: number,\n): number => {\n if (!(size > 0) || !(max > 0)) return 0;\n const r = Math.min(1, (size * contrast) / max);\n switch (scale) {\n case \"linear\":\n return r;\n case \"sqrt\":\n return Math.sqrt(r);\n default:\n // one decade: a tenth of the hottest size is a fifth of the ramp\n return Math.log10(1 + 9 * r);\n }\n};\n\n/**\n * Creates a liquidity heatmap in `container`: resting size over time and\n * price on the GPU, trades as bubbles, best bid / ask lines, the current\n * book profile, zoom / pan and a crosshair tooltip.\n */\nexport const createOrderBookHeatmap = (\n container: HTMLElement,\n initial: OrderBookHeatmapOptions = {},\n): OrderBookHeatmapInstance => {\n let options = initial;\n const store = createOrderBookStore();\n const emitter = createEmitter<OrderBookHeatmapEventMap>();\n let fmt: Formatters = createFormatters(options, 2, 4);\n let colors = { up: [0, 0, 0, 1] as Rgba, down: [0, 0, 0, 1] as Rgba };\n let lut = new Uint32Array(LUT_SIZE);\n\n let tick = 0;\n let columns: Column[] = [];\n let seq = 0;\n /** Start of the open column (the live book), NaN before the first data */\n let openStart = NaN;\n const open = { buyVolume: 0, buyNotional: 0, sellVolume: 0, sellNotional: 0 };\n let lastTrade: MarketTrade | null = null;\n\n /** Time source: exchange times once any is given, the local clock otherwise */\n let dataTime = NaN;\n let dataWall = 0;\n\n let scaleMax = 0;\n let bubbleRef = 0;\n const chunks = new Map<number, BarItem>();\n const dirtyChunks = new Set<number>();\n let itemVersion = 0;\n let headItem: BarItem | null = null;\n let headVersion = -1;\n let origin = { x: NaN, y: NaN };\n\n let renderer: ChartRenderer | null = null;\n let rendererToken = 0;\n let destroyed = false;\n let resolveReady: (kind: ChartRendererKind | null) => void = () => {};\n const ready = new Promise<ChartRendererKind | null>((resolve) => {\n resolveReady = resolve;\n });\n\n /** View: time range and price range; follows the market unless panned */\n let follow = true;\n let windowSpan = NaN;\n let viewX: [number, number] = [0, 1];\n let viewY: [number, number] = [0, 1];\n let yCenter = NaN;\n let ySpan = NaN;\n /** The price range was zoomed by the user: no more auto fit */\n let userSpan = false;\n let lastFrame = 0;\n let plot = { x: 0, y: 0, w: 0, h: 0 };\n let hoverAt: [number, number] | null = null;\n let hoverKey = \"\";\n let drag: {\n x: number;\n y: number;\n viewX: [number, number];\n viewY: [number, number];\n axis: boolean;\n span: number;\n } | null = null;\n\n const host = createHost(container, {\n className: \"minerva-orderbook-heatmap\",\n draw,\n onTheme: () => {\n refreshColors();\n markAllDirty();\n },\n });\n const { root, doc } = host;\n root.tabIndex = 0;\n root.setAttribute(\"role\", \"figure\");\n root.style.touchAction = \"none\";\n\n /** Texts in the locale, resolved on every option update */\n let texts = localeLabels(LABELS, options.locale, options.labels);\n const labels = () => texts;\n const applyTexts = () => {\n texts = localeLabels(LABELS, options.locale, options.labels);\n root.setAttribute(\"aria-label\", options.ariaLabel ?? texts.name);\n };\n const interval = () => Math.max(10, options.interval ?? 100);\n const history = () => Math.max(interval() * 4, options.history ?? 300_000);\n const depth = () => Math.max(4, Math.round(options.depth ?? 160));\n const nowTime = () => {\n if (!Number.isFinite(dataTime)) return Date.now();\n const elapsed = perfNow() - dataWall;\n return dataTime + Math.min(Math.max(0, elapsed), interval() * 3);\n };\n const perfNow = () =>\n typeof performance !== \"undefined\" ? performance.now() : Date.now();\n\n function refreshColors() {\n const theme = host.theme;\n colors = sideColors(theme, options);\n const resolve = (value: string) =>\n theme.resolve ? theme.resolve(value, theme.primary) : theme.primary;\n const dark = luminance(theme.background) < 0.4;\n const stops: Rgba[] = [\n theme.background,\n ...(options.colors?.length\n ? options.colors\n : dark\n ? DARK_RAMP\n : LIGHT_RAMP\n ).map(resolve),\n ];\n lut = new Uint32Array(LUT_SIZE);\n for (let i = 0; i < LUT_SIZE; i++) {\n const c = rampColor(stops, i / (LUT_SIZE - 1));\n lut[i] = packColor([c[0], c[1], c[2], 1]);\n }\n }\n\n const refreshFormat = () => {\n fmt = createFormatters(\n options,\n tick > 0\n ? Math.max(decimalsOf(tick), inferPriceDecimals(store))\n : inferPriceDecimals(store),\n inferSizeDecimals(store),\n );\n };\n\n const markAllDirty = () => {\n for (const id of chunks.keys()) dirtyChunks.add(id);\n headVersion = -1;\n host.invalidate();\n };\n\n const clearHistory = () => {\n columns = [];\n chunks.clear();\n dirtyChunks.clear();\n headItem = null;\n headVersion = -1;\n openStart = NaN;\n origin = { x: NaN, y: NaN };\n scaleMax = 0;\n bubbleRef = 0;\n open.buyVolume = open.buyNotional = open.sellVolume = open.sellNotional = 0;\n };\n\n // --------------------------------------------------------------- columns\n\n const ensureTick = () => {\n if (tick > 0) return;\n const base = inferTickSize(store);\n const mid = store.mid();\n if (options.tickSize && options.tickSize > 0) tick = options.tickSize;\n else if (base > 0 && Number.isFinite(mid)) {\n // rows of about 0.1 basis point: a round multiple of the tick (BTC at\n // 64,000 with a 0.1 tick: 0.5 rows)\n const ratio = (mid * 1e-5) / base;\n let multiple = 1;\n for (let p = 1; p <= 1e9 && multiple < ratio * 0.75; p *= 10) {\n for (const m of [1, 2, 5]) {\n multiple = m * p;\n if (multiple >= ratio * 0.75) break;\n }\n }\n tick = roundToStep(base * multiple, base);\n } else tick = Number.isFinite(mid) ? Math.max(1e-8, mid * 1e-5) : 0;\n if (tick > 0) refreshFormat();\n };\n\n /** Samples the book into price rows */\n const sampleBook = () => {\n const limit = depth();\n const bins = new Float64Array(limit * 2);\n const sizes = new Float32Array(limit * 2);\n let n = 0;\n const top = [0, 0, 0, 0];\n for (const side of [\"bid\", \"ask\"] as const) {\n const count = store.count(side);\n let rows = 0;\n for (let i = 0; i < count; i++) {\n const bin = Math.round(store.priceAt(side, i) / tick);\n const size = store.sizeAt(side, i);\n if (n > 0 && bins[n - 1] === bin && rows > 0) {\n sizes[n - 1] += size;\n continue;\n }\n if (rows >= limit) break;\n bins[n] = bin;\n sizes[n] = size;\n n++;\n rows++;\n }\n }\n for (let i = 0; i < n; i++) {\n const s = sizes[i]!;\n if (s > top[3]!) {\n top[3] = s;\n top.sort((a, b) => b - a);\n }\n }\n return {\n bins: bins.subarray(0, n),\n sizes: sizes.subarray(0, n),\n reference: top[3]! || top[0]!,\n };\n };\n\n /** Closes the open column at `start` with the current book */\n const closeColumn = (start: number) => {\n if (!(tick > 0)) return;\n const { bins, sizes, reference } = sampleBook();\n const column: Column = {\n seq: seq++,\n time: start,\n bins,\n sizes,\n bestBid: store.bestBid(),\n bestAsk: store.bestAsk(),\n buyVolume: open.buyVolume,\n buyNotional: open.buyNotional,\n sellVolume: open.sellVolume,\n sellNotional: open.sellNotional,\n reference,\n };\n open.buyVolume = open.buyNotional = open.sellVolume = open.sellNotional = 0;\n columns.push(column);\n dirtyChunks.add(Math.floor(column.seq / CHUNK));\n // the auto color scale: average reference of the recent columns, moved\n // only on a clear change (a change recolors every chunk)\n if (options.maxSize === undefined) {\n const recent = columns.slice(-100);\n let sum = 0;\n for (const c of recent) sum += c.reference;\n const target = (sum / recent.length) * 1.6;\n if (!(scaleMax > 0) || Math.abs(target / scaleMax - 1) > 0.3) {\n scaleMax = target;\n for (const id of chunks.keys()) dirtyChunks.add(id);\n headVersion = -1;\n }\n }\n // history\n const oldest = start - history();\n let drop = 0;\n while (drop < columns.length && columns[drop]!.time < oldest) drop++;\n if (drop) {\n columns = columns.slice(drop);\n const first = columns[0] ? Math.floor(columns[0].seq / CHUNK) : Infinity;\n for (const id of [...chunks.keys()]) {\n if (id < first) chunks.delete(id);\n }\n }\n };\n\n /** Closes every column ending before `time` */\n const advance = (time: number) => {\n if (!Number.isFinite(time)) return;\n const step = interval();\n if (!Number.isFinite(openStart)) {\n openStart = Math.floor(time / step) * step;\n return;\n }\n if (time - openStart > history()) {\n // a long gap: one column, then jump\n closeColumn(openStart);\n openStart = Math.floor(time / step) * step;\n return;\n }\n while (time >= openStart + step) {\n closeColumn(openStart);\n openStart += step;\n }\n };\n\n const noteTime = (time: number | undefined) => {\n if (time === undefined || !Number.isFinite(time)) return Date.now();\n if (!Number.isFinite(dataTime) || time >= dataTime) {\n dataTime = time;\n dataWall = perfNow();\n }\n return time;\n };\n\n /** Column containing a time (`null` for the open one or outside) */\n const columnAt = (time: number): Column | null => {\n let lo = 0;\n let hi = columns.length - 1;\n const step = interval();\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const c = columns[mid]!;\n if (time < c.time) hi = mid - 1;\n else if (time >= c.time + step) lo = mid + 1;\n else return c;\n }\n return null;\n };\n\n // --------------------------------------------------------------- items\n\n const ensureOrigin = () => {\n if (Number.isFinite(origin.x)) return;\n const mid = store.mid();\n origin = {\n x: Number.isFinite(openStart) ? openStart : 0,\n y: Number.isFinite(mid) ? mid : 0,\n };\n };\n\n const intensityIndex = (size: number) => {\n const t = heatIntensity(\n size,\n options.maxSize ?? scaleMax,\n options.colorScale ?? \"log\",\n Math.max(0.01, options.contrast ?? 1),\n );\n return Math.round(t * (LUT_SIZE - 1));\n };\n\n /** Bar instances of a set of columns (empty cells skipped) */\n const cellsItem = (\n key: string,\n list: readonly { time: number; bins: Float64Array; sizes: Float32Array }[],\n ): BarItem => {\n const step = interval();\n let count = 0;\n for (const c of list) {\n for (let i = 0; i < c.sizes.length; i++) {\n if (intensityIndex(c.sizes[i]!) > 0) count++;\n }\n }\n const instances = new ArrayBuffer(Math.max(1, count) * BAR_STRIDE);\n const f = new Float32Array(instances);\n const u = new Uint32Array(instances);\n let k = 0;\n // cells overlap a little: no seams between neighbours after rasterization\n const half = (tick / 2) * 1.06;\n for (const c of list) {\n const x = c.time + step / 2 - origin.x;\n for (let i = 0; i < c.sizes.length; i++) {\n const level = intensityIndex(c.sizes[i]!);\n if (level <= 0) continue;\n const price = c.bins[i]! * tick - origin.y;\n f[k * 4] = x;\n f[k * 4 + 1] = price - half;\n f[k * 4 + 2] = price + half;\n u[k * 4 + 3] = lut[level]!;\n k++;\n }\n }\n return {\n kind: \"bar\",\n key,\n version: ++itemVersion,\n color: [1, 1, 1, 1],\n instances,\n count,\n halfWidth: (step / 2) * 1.06,\n radius: 0,\n // a positive inset turns on the renderers' overlap of small cells (no\n // seam between neighbours); 0.01 px leaves no visible gap on large ones\n inset: 0.01,\n minHalf: 0,\n sorted: true,\n };\n };\n\n const chunkItems = (): BarItem[] => {\n if (dirtyChunks.size) {\n const byChunk = new Map<number, Column[]>();\n for (const c of columns) {\n const id = Math.floor(c.seq / CHUNK);\n if (!dirtyChunks.has(id)) continue;\n let list = byChunk.get(id);\n if (!list) byChunk.set(id, (list = []));\n list.push(c);\n }\n for (const id of dirtyChunks) {\n const list = byChunk.get(id);\n if (list) chunks.set(id, cellsItem(`heat:${id}`, list));\n else chunks.delete(id);\n }\n dirtyChunks.clear();\n }\n return [...chunks.values()];\n };\n\n const visibleColumns = () => {\n const step = interval();\n const out: Column[] = [];\n // binary search of the first visible column\n let lo = 0;\n let hi = columns.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (columns[mid]!.time + step < viewX[0]) lo = mid + 1;\n else hi = mid;\n }\n for (let i = lo; i < columns.length; i++) {\n const c = columns[i]!;\n if (c.time > viewX[1]) break;\n out.push(c);\n }\n return out;\n };\n\n const bubblesItem = (visible: readonly Column[]): ScatterItem | null => {\n if (options.bubbles === false) return null;\n const step = interval();\n const all: [number, number, number, boolean][] = [];\n const push = (\n time: number,\n volume: number,\n notional: number,\n buy: boolean,\n ) => {\n if (volume > 0)\n all.push([time + step / 2, notional / volume, volume, buy]);\n };\n for (const c of visible) {\n push(c.time, c.sellVolume, c.sellNotional, false);\n push(c.time, c.buyVolume, c.buyNotional, true);\n }\n if (Number.isFinite(openStart)) {\n push(openStart, open.sellVolume, open.sellNotional, false);\n push(openStart, open.buyVolume, open.buyNotional, true);\n }\n if (!all.length) return null;\n let max = 0;\n for (const b of all) max = Math.max(max, b[2]);\n bubbleRef = bubbleRef > 0 ? Math.max(max, bubbleRef * 0.995) : max;\n const ref = options.bubbleVolume ?? bubbleRef;\n const maxD = Math.max(4, options.bubbleSize ?? 28);\n const buffer = new ArrayBuffer(all.length * SCATTER_STRIDE);\n const f = new Float32Array(buffer);\n const u = new Uint32Array(buffer);\n const up = packColor([colors.up[0], colors.up[1], colors.up[2], 0.78]);\n const down = packColor([\n colors.down[0],\n colors.down[1],\n colors.down[2],\n 0.78,\n ]);\n all.forEach(([x, price, volume, buy], i) => {\n f[i * 4] = x - origin.x;\n f[i * 4 + 1] = price - origin.y;\n f[i * 4 + 2] = clamp(Math.sqrt(volume / ref) * maxD, 3, maxD);\n u[i * 4 + 3] = buy ? up : down;\n });\n return {\n kind: \"scatter\",\n key: \"trades\",\n version: ++itemVersion,\n color: colors.up,\n instances: buffer,\n count: all.length,\n opacity: 1,\n stroke: 1.25,\n };\n };\n\n const lineItems = (visible: readonly Column[]): LineItem[] => {\n if (options.bestLines === false) return [];\n const step = interval();\n const build = (key: string, pick: (c: Column) => number, color: Rgba) => {\n const n = visible.length + (Number.isFinite(openStart) ? 1 : 0);\n const points = new Float32Array(n * 4);\n const write = (i: number, time: number, price: number) => {\n const y = Number.isFinite(price) ? price - origin.y : GAP;\n points[i * 4] = time - origin.x;\n points[i * 4 + 1] = y;\n points[i * 4 + 2] = time + step - origin.x;\n points[i * 4 + 3] = y;\n };\n visible.forEach((c, i) => write(i, c.time, pick(c)));\n if (Number.isFinite(openStart)) {\n const price = key === \"bid\" ? store.bestBid() : store.bestAsk();\n write(visible.length, openStart, price);\n }\n const item: LineItem = {\n kind: \"line\",\n key: `best:${key}`,\n version: ++itemVersion,\n color,\n points,\n count: n * 2,\n width: 1.5,\n sorted: true,\n };\n return item;\n };\n return [\n build(\"bid\", (c) => c.bestBid, colors.up),\n build(\"ask\", (c) => c.bestAsk, colors.down),\n ];\n };\n\n const headCells = (): BarItem | null => {\n if (!Number.isFinite(openStart) || !(tick > 0)) return null;\n const version = store.version();\n if (headItem && headVersion === version) return headItem;\n const { bins, sizes } = sampleBook();\n headItem = cellsItem(\"heat:head\", [{ time: openStart, bins, sizes }]);\n headVersion = version;\n return headItem;\n };\n\n // ---------------------------------------------------------------- draw\n\n function draw(now: number): boolean {\n const ctx = host.ctx;\n if (!ctx) return false;\n const { width, height, dpr, theme } = host;\n const dt = lastFrame ? now - lastFrame : 0;\n lastFrame = now;\n const l = labels();\n const fontSize = options.fontSize ?? (width < 420 ? 10 : 11);\n const step = interval();\n const live = !Number.isFinite(dataTime);\n if (live && store.count(\"bid\") + store.count(\"ask\") > 0)\n advance(Date.now());\n const time = nowTime();\n\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, width, height);\n ctx.font = fontOf(theme, options, 400, fontSize);\n\n // layout\n const mid = store.mid();\n const sample = fmt.price(Number.isFinite(mid) ? mid * 1.0001 : 0);\n const axisW = Math.ceil(ctx.measureText(sample).width) + 16;\n const profileW =\n options.profile === false ? 0 : Math.round(clamp(width * 0.1, 36, 84));\n const timeH = fontSize + 12;\n plot = {\n x: 0,\n y: 0,\n w: Math.max(10, width - axisW - profileW),\n h: Math.max(10, height - timeH),\n };\n\n // view\n if (!Number.isFinite(windowSpan))\n windowSpan = Math.max(step * 10, options.window ?? 60_000);\n if (!Number.isFinite(ySpan) || ySpan <= 0) {\n ensureTick();\n ySpan = options.priceSpan ?? (tick > 0 ? tick * 60 : NaN);\n }\n if (follow) {\n const right = time + step * 1.5;\n viewX = [right - windowSpan, right];\n // fit the prices traded in the window (best bid / ask), with room\n let lo = store.bestBid();\n let hi = store.bestAsk();\n if (!Number.isFinite(lo)) lo = hi;\n if (!Number.isFinite(hi)) hi = lo;\n for (const c of visibleColumns()) {\n if (c.bestBid < lo) lo = c.bestBid;\n if (c.bestAsk > hi) hi = c.bestAsk;\n }\n if (Number.isFinite(lo) && Number.isFinite(hi)) {\n const k = Number.isFinite(yCenter) ? ease(dt, 260) : 1;\n const center = (lo + hi) / 2;\n yCenter = Number.isFinite(yCenter)\n ? yCenter + (center - yCenter) * k\n : center;\n if (!userSpan && options.priceSpan === undefined && tick > 0) {\n const target = Math.max(tick * 60, (hi - lo) * 1.5);\n ySpan += (target - ySpan) * k;\n }\n } else if (Number.isFinite(mid)) {\n yCenter = Number.isFinite(yCenter)\n ? yCenter + (mid - yCenter) * ease(dt, 220)\n : mid;\n }\n if (Number.isFinite(yCenter) && Number.isFinite(ySpan))\n viewY = [yCenter - ySpan / 2, yCenter + ySpan / 2];\n }\n const [x0, x1] = viewX;\n const [y0, y1] = viewY;\n const xOf = (t: number) => plot.x + ((t - x0) / (x1 - x0)) * plot.w;\n const yOf = (p: number) =>\n plot.y + plot.h - ((p - y0) / (y1 - y0)) * plot.h;\n\n // data layer\n const visible = visibleColumns();\n if (renderer && tick > 0) {\n ensureOrigin();\n const canvas = renderer.canvas;\n canvas.style.left = `${plot.x}px`;\n canvas.style.top = `${plot.y}px`;\n canvas.style.width = `${plot.w}px`;\n canvas.style.height = `${plot.h}px`;\n const bw = Math.max(1, Math.round(plot.w * dpr));\n const bh = Math.max(1, Math.round(plot.h * dpr));\n if (canvas.width !== bw || canvas.height !== bh) renderer.resize(bw, bh);\n const items: RenderItem[] = chunkItems();\n const head = headCells();\n if (head) items.push(head);\n items.push(...lineItems(visible));\n const bubbles = bubblesItem(visible);\n if (bubbles) items.push(bubbles);\n const xScale = 2 / (x1 - x0);\n const yScale = 2 / (y1 - y0);\n renderer.render(items, {\n transform: {\n xScale,\n xOffset: (origin.x - x0) * xScale - 1,\n yScale,\n yOffset: (origin.y - y0) * yScale - 1,\n },\n width: bw,\n height: bh,\n dpr,\n });\n }\n\n // price grid and axis\n const right = plot.x + plot.w + profileW;\n const yTicks = Number.isFinite(y0)\n ? linearTicks(y0, y1, Math.max(2, Math.floor(plot.h / 44)))\n : [];\n ctx.strokeStyle = toCss(theme.text, 0.07);\n ctx.lineWidth = 1;\n ctx.beginPath();\n for (const p of yTicks) {\n const y = Math.round(yOf(p)) + 0.5;\n ctx.moveTo(plot.x, y);\n ctx.lineTo(right, y);\n }\n ctx.stroke();\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n for (const p of yTicks) {\n const y = yOf(p);\n if (y < 6 || y > plot.h - 6) continue;\n ctx.fillText(fmt.price(p), right + 6, y);\n }\n\n // time axis\n const xt = timeTicks(x0, x1, Math.max(2, Math.floor(plot.w / 90)));\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n for (const t of xt.values) {\n const x = xOf(t);\n if (x < 20 || x > plot.x + plot.w - 20) continue;\n ctx.fillText(xt.format(t), x, plot.y + plot.h + 6);\n }\n ctx.strokeStyle = toCss(theme.axis);\n ctx.beginPath();\n ctx.moveTo(0, Math.round(plot.y + plot.h) + 0.5);\n ctx.lineTo(width, Math.round(plot.y + plot.h) + 0.5);\n ctx.moveTo(Math.round(right) + 0.5, 0);\n ctx.lineTo(Math.round(right) + 0.5, plot.y + plot.h);\n ctx.stroke();\n\n // current book profile\n if (profileW && tick > 0 && Number.isFinite(y0)) {\n const px = plot.x + plot.w;\n ctx.fillStyle = toCss(theme.background, 0.85);\n ctx.fillRect(px, plot.y, profileW, plot.h);\n const rowPx = Math.max(1, (tick / (y1 - y0)) * plot.h);\n let maxSize = 0;\n const sides = ([\"bid\", \"ask\"] as const).map((side) => {\n const { price, size, count } = store.levels(side, {\n step: tick,\n limit: depth(),\n });\n for (let i = 0; i < count; i++) {\n if (price[i]! >= y0 && price[i]! <= y1)\n maxSize = Math.max(maxSize, size[i]!);\n }\n return { side, price, size, count };\n });\n for (const { side, price, size, count } of sides) {\n ctx.fillStyle = toCss(side === \"bid\" ? colors.up : colors.down, 0.6);\n for (let i = 0; i < count; i++) {\n const p = price[i]!;\n if (p < y0 || p > y1 || maxSize <= 0) continue;\n const w = (size[i]! / maxSize) * (profileW - 4);\n const y = yOf(p) - rowPx / 2;\n ctx.fillRect(\n px + 2,\n y + (rowPx > 3 ? 0.5 : 0),\n w,\n Math.max(1, rowPx - (rowPx > 3 ? 1 : 0)),\n );\n }\n }\n }\n\n // price tags: best bid / ask and the last trade\n const tag = (price: number, color: Rgba, filled: boolean) => {\n if (!Number.isFinite(price) || price < y0 || price > y1) return;\n const y = clamp(yOf(price), 8, plot.h - 8);\n const text = fmt.price(price);\n ctx.font = fontOf(theme, options, 600, fontSize);\n const w = ctx.measureText(text).width + 10;\n ctx.fillStyle = filled ? toCss(color) : toCss(theme.background);\n roundRect(ctx, right + 1, y - 8, Math.min(w, width - right - 2), 16, 3);\n ctx.fill();\n if (!filled) {\n ctx.strokeStyle = toCss(color);\n ctx.stroke();\n }\n ctx.fillStyle = filled ? \"#fff\" : toCss(color);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(text, right + 6, y + 0.5);\n ctx.font = fontOf(theme, options, 400, fontSize);\n };\n tag(store.bestBid(), colors.up, true);\n tag(store.bestAsk(), colors.down, true);\n // the last trade only when it does not cover the best bid / ask tags\n const clear = (price: number) =>\n !Number.isFinite(price) ||\n Math.abs(yOf(price) - yOf(lastTrade?.price ?? NaN)) >= 17;\n if (lastTrade && clear(store.bestBid()) && clear(store.bestAsk()))\n tag(\n lastTrade.price,\n lastTrade.side === \"buy\" ? colors.up : colors.down,\n false,\n );\n\n // crosshair and tooltip\n drawHover(ctx, xOf, yOf, fontSize, right, l);\n\n if (!renderer && !host.root.dataset.renderer) {\n // no backend yet: nothing else to draw\n }\n host.describe(\n `${options.ariaLabel ?? l.name}. ${l.bid} ${fmt.price(store.bestBid())}, ${l.ask} ${fmt.price(store.bestAsk())}.`,\n );\n // keep scrolling while following a live market\n const fresh = live || perfNow() - dataWall < 2000;\n return follow && fresh && Number.isFinite(openStart);\n }\n\n function drawHover(\n ctx: CanvasRenderingContext2D,\n xOf: (t: number) => number,\n yOf: (p: number) => number,\n fontSize: number,\n right: number,\n l: OrderBookHeatmapLabels,\n ) {\n const { theme } = host;\n const hide = () => {\n host.tooltip.style.display = \"none\";\n if (hoverKey) {\n hoverKey = \"\";\n emitter.emit(\"hover\", null);\n }\n };\n if (!hoverAt || options.tooltip === false || !(tick > 0) || drag) {\n hide();\n return;\n }\n const [hx, hy] = hoverAt;\n if (\n hx < plot.x ||\n hx > plot.x + plot.w ||\n hy < plot.y ||\n hy > plot.y + plot.h\n ) {\n hide();\n return;\n }\n const [x0, x1] = viewX;\n const [y0, y1] = viewY;\n const time = x0 + ((hx - plot.x) / plot.w) * (x1 - x0);\n const price = y0 + ((plot.y + plot.h - hy) / plot.h) * (y1 - y0);\n const bin = Math.round(price / tick);\n const rowPrice = +(bin * tick).toFixed(Math.min(12, decimalsOf(tick) + 2));\n const column = columnAt(time);\n const step = interval();\n let size = 0;\n let bestBid = NaN;\n let bestAsk = NaN;\n let buyVolume = 0;\n let sellVolume = 0;\n let start = NaN;\n if (column) {\n for (let i = 0; i < column.bins.length; i++) {\n if (column.bins[i] === bin) size += column.sizes[i]!;\n }\n ({ bestBid, bestAsk, buyVolume, sellVolume } = column);\n start = column.time;\n } else if (Number.isFinite(openStart) && time >= openStart) {\n const levels = ([\"bid\", \"ask\"] as const).map((side) =>\n store.levels(side, { step: tick, limit: depth() }),\n );\n for (const lv of levels) {\n for (let i = 0; i < lv.count; i++) {\n if (Math.round(lv.price[i]! / tick) === bin) size += lv.size[i]!;\n }\n }\n bestBid = store.bestBid();\n bestAsk = store.bestAsk();\n buyVolume = open.buyVolume;\n sellVolume = open.sellVolume;\n start = openStart;\n }\n const side: OrderBookSide | null =\n rowPrice <= bestBid ? \"bid\" : rowPrice >= bestAsk ? \"ask\" : null;\n\n // crosshair\n ctx.strokeStyle = toCss(theme.text, 0.45);\n ctx.setLineDash([3, 3]);\n ctx.beginPath();\n ctx.moveTo(Math.round(hx) + 0.5, plot.y);\n ctx.lineTo(Math.round(hx) + 0.5, plot.y + plot.h);\n const ry = Math.round(yOf(rowPrice)) + 0.5;\n ctx.moveTo(plot.x, ry);\n ctx.lineTo(right, ry);\n ctx.stroke();\n ctx.setLineDash([]);\n if (Number.isFinite(start)) {\n // outline of the hovered cell\n const cx0 = xOf(start);\n const cx1 = xOf(start + step);\n const cy0 = yOf(rowPrice + tick / 2);\n const cy1 = yOf(rowPrice - tick / 2);\n ctx.strokeStyle = toCss(theme.text, 0.85);\n ctx.strokeRect(cx0, cy0, Math.max(2, cx1 - cx0), Math.max(2, cy1 - cy0));\n }\n // price label on the axis\n ctx.font = fontOf(theme, options, 600, fontSize);\n const text = fmt.price(rowPrice);\n const w = Math.min(\n ctx.measureText(text).width + 10,\n host.width - right - 2,\n );\n ctx.fillStyle = toCss(theme.text);\n roundRect(ctx, right + 1, ry - 8, w, 16, 3);\n ctx.fill();\n ctx.fillStyle = toCss(theme.background);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(text, right + 6, ry + 0.5);\n ctx.font = fontOf(theme, options, 400, fontSize);\n\n const sideColor =\n side === \"bid\" ? colors.up : side === \"ask\" ? colors.down : theme.text;\n tooltipHtml(\n doc,\n host.tooltip,\n {\n text: Number.isFinite(start) ? formatClock(start) : formatClock(time),\n color: undefined,\n },\n [\n [l.price, fmt.price(rowPrice)],\n [l.liquidity, fmt.size(size)],\n [l.buys, fmt.size(buyVolume)],\n [l.sells, fmt.size(sellVolume)],\n ],\n );\n host.tooltip.style.display = \"block\";\n host.tooltip.style.borderLeft = `3px solid ${toCss(sideColor)}`;\n host.placeTooltip(\n host.tooltip,\n hx,\n hy,\n hx > plot.w * 0.6 ? \"left\" : \"right\",\n );\n\n const key = `${start}|${bin}|${size}|${buyVolume}|${sellVolume}`;\n if (key !== hoverKey) {\n hoverKey = key;\n const event: OrderBookHeatmapHoverEvent = {\n time: Number.isFinite(start) ? start : time,\n price: rowPrice,\n size,\n side,\n buyVolume,\n sellVolume,\n };\n emitter.emit(\"hover\", event);\n }\n }\n\n // ------------------------------------------------------------ renderer\n\n const initRenderer = async (exclude: Set<ChartRendererKind> = new Set()) => {\n const token = ++rendererToken;\n const next = await createRenderer(\n options.renderer ?? \"auto\",\n () => {\n const canvas = doc.createElement(\"canvas\");\n Object.assign(canvas.style, {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n pointerEvents: \"none\",\n });\n canvas.setAttribute(\"aria-hidden\", \"true\");\n return canvas;\n },\n (kind) => {\n if (destroyed || renderer?.kind !== kind) return;\n renderer.destroy();\n renderer.canvas.remove();\n renderer = null;\n void initRenderer(new Set([...exclude, kind]));\n },\n exclude,\n );\n if (destroyed || token !== rendererToken) {\n next?.destroy();\n return;\n }\n if (renderer) {\n renderer.destroy();\n renderer.canvas.remove();\n }\n renderer = next;\n if (next) {\n root.dataset.renderer = next.kind;\n root.insertBefore(next.canvas, host.canvas);\n emitter.emit(\"renderer\", next.kind);\n }\n resolveReady(next?.kind ?? null);\n host.invalidate();\n };\n\n // --------------------------------------------------------- interaction\n\n const setFollow = (value: boolean) => {\n if (follow === value) return;\n follow = value;\n emitter.emit(\"follow\", value);\n };\n\n const onPointerDown = (event: PointerEvent) => {\n if (options.interactive === false) return;\n const [x, y] = localPoint(root, event);\n root.setPointerCapture?.(event.pointerId);\n drag = {\n x,\n y,\n viewX: [...viewX],\n viewY: [...viewY],\n axis: x > plot.x + plot.w,\n span: viewY[1] - viewY[0],\n };\n };\n const onPointerMove = (event: PointerEvent) => {\n const [x, y] = localPoint(root, event);\n hoverAt = [x, y];\n if (drag) {\n const dx = x - drag.x;\n const dy = y - drag.y;\n if (drag.axis) {\n // dragging the price axis scales the prices around the center\n const span = drag.span * Math.exp(dy * 0.006);\n const c = (drag.viewY[0] + drag.viewY[1]) / 2;\n ySpan = span;\n userSpan = true;\n viewY = [c - span / 2, c + span / 2];\n if (follow) yCenter = c;\n } else if (Math.abs(dx) + Math.abs(dy) > 3) {\n setFollow(false);\n const tx = ((drag.viewX[1] - drag.viewX[0]) / plot.w) * dx;\n const ty = ((drag.viewY[1] - drag.viewY[0]) / plot.h) * dy;\n viewX = [drag.viewX[0] - tx, drag.viewX[1] - tx];\n viewY = [drag.viewY[0] + ty, drag.viewY[1] + ty];\n }\n }\n host.invalidate();\n };\n const onPointerUp = (event: PointerEvent) => {\n root.releasePointerCapture?.(event.pointerId);\n drag = null;\n host.invalidate();\n };\n const onPointerLeave = () => {\n if (drag) return;\n hoverAt = null;\n host.invalidate();\n };\n const zoomTime = (factor: number, anchorX: number) => {\n const [a, b] = viewX;\n const span = clamp((b - a) * factor, interval() * 10, history());\n windowSpan = span;\n if (!follow) {\n const t = a + ((anchorX - plot.x) / plot.w) * (b - a);\n const r = (t - a) / (b - a);\n viewX = [t - span * r, t + span * (1 - r)];\n }\n host.invalidate();\n };\n const zoomPrice = (factor: number) => {\n const span = clamp(\n (viewY[1] - viewY[0]) * factor,\n tick * 6 || 1e-9,\n Infinity,\n );\n const c = (viewY[0] + viewY[1]) / 2;\n ySpan = span;\n userSpan = true;\n viewY = [c - span / 2, c + span / 2];\n host.invalidate();\n };\n const onWheel = (event: WheelEvent) => {\n if (options.interactive === false || !(event.ctrlKey || event.metaKey))\n return;\n event.preventDefault();\n const [x] = localPoint(root, event);\n const factor = Math.exp(event.deltaY * 0.002);\n if (event.shiftKey || x > plot.x + plot.w) zoomPrice(factor);\n else zoomTime(factor, x);\n };\n const onDoubleClick = () => {\n if (options.interactive === false) return;\n instance.resetView();\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (options.interactive === false) return;\n switch (event.key) {\n case \"+\":\n case \"=\":\n zoomTime(0.8, plot.x + plot.w);\n break;\n case \"-\":\n zoomTime(1.25, plot.x + plot.w);\n break;\n case \"ArrowUp\":\n case \"ArrowDown\": {\n if (event.shiftKey) {\n zoomPrice(event.key === \"ArrowUp\" ? 0.8 : 1.25);\n break;\n }\n setFollow(false);\n const d =\n (viewY[1] - viewY[0]) * 0.1 * (event.key === \"ArrowUp\" ? 1 : -1);\n viewY = [viewY[0] + d, viewY[1] + d];\n host.invalidate();\n break;\n }\n case \"ArrowLeft\":\n case \"ArrowRight\": {\n setFollow(false);\n const d =\n (viewX[1] - viewX[0]) * 0.1 * (event.key === \"ArrowLeft\" ? -1 : 1);\n viewX = [viewX[0] + d, viewX[1] + d];\n host.invalidate();\n break;\n }\n case \"0\":\n case \"Home\":\n instance.resetView();\n break;\n default:\n return;\n }\n event.preventDefault();\n };\n\n root.addEventListener(\"pointerdown\", onPointerDown);\n root.addEventListener(\"pointermove\", onPointerMove);\n root.addEventListener(\"pointerup\", onPointerUp);\n root.addEventListener(\"pointercancel\", onPointerUp);\n root.addEventListener(\"pointerleave\", onPointerLeave);\n root.addEventListener(\"wheel\", onWheel, { passive: false });\n root.addEventListener(\"dblclick\", onDoubleClick);\n root.addEventListener(\"keydown\", onKeyDown);\n\n // ----------------------------------------------------------------- api\n\n const applyOne = (delta: OrderBookDelta) => {\n const time = noteTime(delta.time);\n if (store.count(\"bid\") + store.count(\"ask\") > 0) {\n ensureTick();\n advance(time);\n }\n store.applyDelta(delta);\n };\n\n const instance: OrderBookHeatmapInstance = {\n setBook(snapshot) {\n const time = noteTime(snapshot.time);\n if (store.count(\"bid\") + store.count(\"ask\") > 0) advance(time);\n store.setSnapshot(snapshot);\n ensureTick();\n refreshFormat();\n if (!Number.isFinite(openStart)) advance(time);\n host.invalidate();\n },\n applyDeltas(deltas) {\n if (Array.isArray(deltas)) {\n for (const d of deltas as readonly OrderBookDelta[]) applyOne(d);\n } else applyOne(deltas as OrderBookDelta);\n if (!Number.isFinite(openStart) && tick > 0) advance(nowTime());\n host.invalidate();\n },\n addTrades(trades) {\n const list: readonly MarketTrade[] = Array.isArray(trades)\n ? (trades as readonly MarketTrade[])\n : [trades as MarketTrade];\n for (const trade of list) {\n if (!(trade.size > 0) || !Number.isFinite(trade.price)) continue;\n if (Number.isFinite(dataTime)) {\n noteTime(trade.time);\n advance(trade.time);\n }\n const target =\n !Number.isFinite(openStart) || trade.time >= openStart\n ? open\n : columnAt(trade.time);\n if (target) {\n if (trade.side === \"buy\") {\n target.buyVolume += trade.size;\n target.buyNotional += trade.size * trade.price;\n } else {\n target.sellVolume += trade.size;\n target.sellNotional += trade.size * trade.price;\n }\n }\n if (!lastTrade || trade.time >= lastTrade.time) lastTrade = trade;\n }\n host.invalidate();\n },\n clear() {\n store.clear();\n clearHistory();\n lastTrade = null;\n dataTime = NaN;\n tick = 0;\n yCenter = NaN;\n ySpan = NaN;\n userSpan = false;\n host.invalidate();\n },\n setOptions(next) {\n const previous = options;\n options = next;\n applyTexts();\n if (\n next.tickSize !== previous.tickSize ||\n (next.interval ?? 100) !== (previous.interval ?? 100)\n ) {\n clearHistory();\n tick = 0;\n ySpan = NaN;\n ensureTick();\n }\n if (next.window !== previous.window) windowSpan = NaN;\n if (next.priceSpan !== previous.priceSpan) ySpan = NaN;\n if ((next.renderer ?? \"auto\") !== (previous.renderer ?? \"auto\"))\n void initRenderer();\n refreshColors();\n refreshFormat();\n markAllDirty();\n },\n resetView() {\n windowSpan = NaN;\n ySpan = NaN;\n userSpan = false;\n yCenter = NaN;\n setFollow(true);\n host.invalidate();\n },\n getRenderer: () => renderer?.kind ?? null,\n ready,\n getStore: () => store,\n on: (event, handler) => emitter.on(event, handler),\n resize() {\n host.invalidate();\n },\n destroy() {\n destroyed = true;\n root.removeEventListener(\"pointerdown\", onPointerDown);\n root.removeEventListener(\"pointermove\", onPointerMove);\n root.removeEventListener(\"pointerup\", onPointerUp);\n root.removeEventListener(\"pointercancel\", onPointerUp);\n root.removeEventListener(\"pointerleave\", onPointerLeave);\n root.removeEventListener(\"wheel\", onWheel);\n root.removeEventListener(\"dblclick\", onDoubleClick);\n root.removeEventListener(\"keydown\", onKeyDown);\n renderer?.destroy();\n renderer = null;\n emitter.clear();\n host.destroy();\n resolveReady(null);\n },\n };\n\n applyTexts();\n refreshColors();\n void initRenderer();\n return instance;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"heatmap.cjs","names":["createOrderBookStore","createEmitter","createFormatters","HEAT_TABLE_SIZE","createHost","localeLabels","sideColors","luminance","oklabRamp","heatTable","decimalsOf","inferPriceDecimals","inferSizeDecimals","inferTickSize","roundToStep","buildHeatGrid","percentile","ease","toCss","clamp","fontOf","mixOklab","fineCeil","fitTimeRange","fitPriceRange","linearTicks","timeTicks","formatClock","layoutAxisLabels","createHeatFieldRenderer","followDefaultRenderer","localPoint","require_color","require_locale","require_scale","require_follow","require_time","require_book","require_format","require_host","require_field","require_layout","LUT_SIZE","MAX_TEXELS","SCALE_QUANTILE","HEAT_GAMMA","DARK_RAMP","LIGHT_RAMP","TAG_HEIGHT","BUBBLE_SPACING","LABELS","heatIntensity","size","max","r","contrast","scale","createOrderBookHeatmap","options","initial","store","emitter","fmt","colors","lut","table","floor","dark","tick","columns","seq","openStart","open","lastTrade","dataTime","dataWall","scaleMax","scaleTarget","scaleAt","bubbleRef","profileMax","grid","gridKey","paintKey","head","renderer","rendererToken","destroyed","resolveReady","ready","resolve","follow","windowSpan","viewX","viewY","viewYReady","yTarget","ySpan","shownTime","lastFrame","plot","hoverAt","hoverKey","drag","host","container","refreshColors","root","texts","labels","applyTexts","interval","history","depth","nowTime","elapsed","perfNow","theme","c","value","background","ramp","refreshFormat","clearHistory","ensureTick","base","mid","ratio","multiple","p","m","sampleBook","limit","bins","sizes","n","side","count","rows","i","bin","closeColumn","column","start","oldest","drop","advance","time","step","noteTime","columnAt","lo","hi","headSource","version","heatGrid","live","maxWidth","maxHeight","lastSeq","key","x0","x1","y0","y1","end","sources","fixed","now","target","dt","k","visibleColumns","out","tradeBubbles","columnPx","group","t0","t1","sum","flush","add","g","id","flow","visible","clipPlot","ctx","drawBest","steps","xs","xa","xOf","row","xb","run","flushRun","y","yOf","bid","ask","index","color","pen","price","drawBubbles","bubbles","b","ref","maxD","sized","a","fontSize","x","text","drawProfile","rowPx","maxSize","sides","levels","left","px","inner","profileW","f","gap","bar","top","bottom","w","s","best","tw","hoverCell","hx","hy","rowPrice","drawTag","align","filled","draw","l","width","regular","bold","clock","dpr","height","sample","axisW","timeH","right","first","minSpan","t","floorCss","canvas","bw","bh","heat","sx","sy","rect","yTicks","xt","cell","hoverTime","hoverHalf","half","last","pins","shownPins","hoverY","layout","at","pin","drawHover","fresh","bestBid","bestAsk","buyVolume","sellVolume","lv","ry","cx0","cx1","cy0","cy1","timeText","sideColor","doc","event","initRenderer","token","next","kind","exclude","unfollowDefault","setFollow","clampTime","range","span","onPointerDown","onPointerMove","dx","dy","tx","ty","onPointerUp","onPointerLeave","zoomTime","factor","anchorX","zoomPrice","onWheel","onDoubleClick","instance","onKeyDown","d","applyOne","delta","snapshot","deltas","list","trades","trade","previous","handler"],"sources":["../../../../../charts/src/engine/orderbook/heatmap.ts"],"sourcesContent":["// createOrderBookHeatmap: Bookmap-style liquidity heatmap. The book is\n// sampled every `interval` ms into a column of price rows; the visible\n// columns are rasterized into one image (a texel per column and price row,\n// see field.ts) drawn with nearest filtering by a WebGPU / WebGL / Canvas2D\n// backend over the cold end of the ramp: a continuous field without seams.\n// The best bid / ask step lines, the spread band, the trade bubbles, the\n// grid, the axes, the book profile, the crosshair and the tooltip are drawn\n// on a Canvas2D layer above.\n\nimport { luminance, mixOklab, oklabRamp, toCss, type Rgba } from \"../color\";\nimport { followDefaultRenderer } from \"../renderers/follow\";\nimport { linearTicks } from \"../scale\";\nimport { timeTicks } from \"../time\";\nimport type { ChartRendererKind } from \"../types\";\nimport {\n createOrderBookStore,\n decimalsOf,\n inferPriceDecimals,\n inferSizeDecimals,\n inferTickSize,\n roundToStep,\n} from \"./book\";\nimport {\n clamp,\n createFormatters,\n ease,\n fontOf,\n formatClock,\n roundRect,\n sideColors,\n type Formatters,\n} from \"./format\";\nimport { localeLabels, type LabelDictionary } from \"../locale\";\nimport {\n HEAT_TABLE_SIZE,\n buildHeatGrid,\n createHeatFieldRenderer,\n heatTable,\n paintHeatGrid,\n percentile,\n type HeatFieldRenderer,\n type HeatGrid,\n type HeatSource,\n} from \"./field\";\nimport { createEmitter, createHost, localPoint, tooltipHtml } from \"./host\";\nimport {\n fineCeil,\n fitPriceRange,\n fitTimeRange,\n layoutAxisLabels,\n type AxisLabel,\n} from \"./layout\";\nimport type {\n OrderBookDelta,\n OrderBookHeatmapEventMap,\n OrderBookHeatmapHoverEvent,\n OrderBookHeatmapInstance,\n OrderBookHeatmapLabels,\n OrderBookHeatmapOptions,\n OrderBookHeatmapScale,\n OrderBookSide,\n MarketTrade,\n} from \"./types\";\n\n/** Colors of the ramp lookup table */\nconst LUT_SIZE = 256;\n/** Largest heat image (texels per side) */\nconst MAX_TEXELS = 4096;\n/** Quantile of the visible sizes at the hottest color (auto scale) */\nconst SCALE_QUANTILE = 0.98;\n/** Gamma of the color curve (> 1: less noise at the cold end) */\nconst HEAT_GAMMA = 1.4;\n\n/**\n * Heat ramps, interpolated in OKLab; the first color is also the empty\n * field. Dark: from deep navy, lightness rises through blue, cyan and green\n * to yellow, then the hottest walls turn orange / red (the Bookmap\n * convention). Light: from a pale tint, lightness falls through blue and\n * violet to crimson.\n */\nconst DARK_RAMP = [\n \"#0a1830\",\n \"#0f2c57\",\n \"#134a8a\",\n \"#1670b4\",\n \"#1aa0bf\",\n \"#2fc3a0\",\n \"#8ad65a\",\n \"#e8dc3f\",\n \"#ffa733\",\n \"#ff5a2e\",\n];\nconst LIGHT_RAMP = [\n \"#eef4fb\",\n \"#cfe1f6\",\n \"#9fc2ee\",\n \"#679ee2\",\n \"#3a73cf\",\n \"#3f4bb0\",\n \"#62309a\",\n \"#9c2783\",\n \"#d12c52\",\n];\n/** Height of the price tags of the axis, in pixels */\nconst TAG_HEIGHT = 16;\n/** Smallest distance between two trade bubbles' columns, in pixels */\nconst BUBBLE_SPACING = 6;\n\nconst LABELS: LabelDictionary<OrderBookHeatmapLabels> = {\n en: {\n time: \"Time\",\n price: \"Price\",\n liquidity: \"Liquidity\",\n buys: \"Buys\",\n sells: \"Sells\",\n bid: \"Bid\",\n ask: \"Ask\",\n bidSide: \"Bid side\",\n askSide: \"Ask side\",\n name: \"Liquidity heatmap\",\n },\n zh: {\n time: \"时间\",\n price: \"价格\",\n liquidity: \"挂单量\",\n buys: \"主动买入\",\n sells: \"主动卖出\",\n bid: \"买一\",\n ask: \"卖一\",\n bidSide: \"买盘\",\n askSide: \"卖盘\",\n name: \"订单簿热力图\",\n },\n ja: {\n time: \"時刻\",\n price: \"価格\",\n liquidity: \"指値量\",\n buys: \"買い約定\",\n sells: \"売り約定\",\n bid: \"最良買気配\",\n ask: \"最良売気配\",\n bidSide: \"買い板\",\n askSide: \"売り板\",\n name: \"板ヒートマップ\",\n },\n fr: {\n time: \"Heure\",\n price: \"Prix\",\n liquidity: \"Liquidité\",\n buys: \"Achats\",\n sells: \"Ventes\",\n bid: \"Meilleur achat\",\n ask: \"Meilleure vente\",\n bidSide: \"Côté achat\",\n askSide: \"Côté vente\",\n name: \"Carte de chaleur de la liquidité\",\n },\n};\n\ninterface Column extends HeatSource {\n /** Sequence number */\n seq: number;\n /** Start time */\n time: number;\n /** Price rows (price / tick, rounded) */\n bins: Float64Array;\n sizes: Float32Array;\n bestBid: number;\n bestAsk: number;\n buyVolume: number;\n buyNotional: number;\n sellVolume: number;\n sellNotional: number;\n}\n\n/** Normalized intensity (0-1) of a size */\nexport const heatIntensity = (\n size: number,\n max: number,\n scale: OrderBookHeatmapScale,\n contrast: number,\n): number => {\n if (!(size > 0) || !(max > 0)) return 0;\n const r = Math.min(1, (size * contrast) / max);\n switch (scale) {\n case \"linear\":\n return r;\n case \"sqrt\":\n return Math.sqrt(r);\n default:\n // one decade: a tenth of the hottest size is a fifth of the ramp\n return Math.log10(1 + 9 * r);\n }\n};\n\n/**\n * Creates a liquidity heatmap in `container`: resting size over time and\n * price on the GPU, trades as bubbles, best bid / ask lines, the current\n * book profile, zoom / pan and a crosshair tooltip.\n */\nexport const createOrderBookHeatmap = (\n container: HTMLElement,\n initial: OrderBookHeatmapOptions = {},\n): OrderBookHeatmapInstance => {\n let options = initial;\n const store = createOrderBookStore();\n const emitter = createEmitter<OrderBookHeatmapEventMap>();\n let fmt: Formatters = createFormatters(options, 2, 4);\n let colors = { up: [0, 0, 0, 1] as Rgba, down: [0, 0, 0, 1] as Rgba };\n let lut: Uint32Array = new Uint32Array(LUT_SIZE);\n /** Size → color table of the current ramp and color scale */\n let table: Uint32Array = new Uint32Array(HEAT_TABLE_SIZE + 1);\n /** The empty field: the cold end of the ramp */\n let floor: Rgba = [0, 0, 0, 1];\n let dark = false;\n\n let tick = 0;\n let columns: Column[] = [];\n let seq = 0;\n /** Start of the open column (the live book), NaN before the first data */\n let openStart = NaN;\n const open = { buyVolume: 0, buyNotional: 0, sellVolume: 0, sellNotional: 0 };\n let lastTrade: MarketTrade | null = null;\n\n /** Time source: exchange times once any is given, the local clock otherwise */\n let dataTime = NaN;\n let dataWall = 0;\n\n /** Size at the hottest color (auto scale, eased) and its target */\n let scaleMax = 0;\n let scaleTarget = 0;\n let scaleAt = -Infinity;\n let bubbleRef = 0;\n /** Size at the full width of the profile */\n let profileMax = 0;\n /** The rasterized field and the inputs it was built from */\n let grid: HeatGrid | null = null;\n let gridKey = \"\";\n let paintKey = \"\";\n /** The live book as a column, cached by store version */\n let head: {\n version: number;\n bins: Float64Array;\n sizes: Float32Array;\n } | null = null;\n\n let renderer: HeatFieldRenderer | null = null;\n let rendererToken = 0;\n let destroyed = false;\n let resolveReady: (kind: ChartRendererKind | null) => void = () => {};\n const ready = new Promise<ChartRendererKind | null>((resolve) => {\n resolveReady = resolve;\n });\n\n /** View: time range and price range; follows the market unless panned */\n let follow = true;\n let windowSpan = NaN;\n let viewX: [number, number] = [0, 1];\n let viewY: [number, number] = [0, 1];\n /** `viewY` holds a fitted range (it eases toward `yTarget` afterwards) */\n let viewYReady = false;\n /** Price range the following view eases to */\n let yTarget: [number, number] | null = null;\n /** Price span chosen by the user (zoom), NaN for the auto fit */\n let ySpan = NaN;\n /** Monotonic clock of the view (no jitter back when data arrives) */\n let shownTime = NaN;\n let lastFrame = 0;\n let plot = { x: 0, y: 0, w: 0, h: 0 };\n let hoverAt: [number, number] | null = null;\n let hoverKey = \"\";\n let drag: {\n x: number;\n y: number;\n viewX: [number, number];\n viewY: [number, number];\n axis: boolean;\n span: number;\n } | null = null;\n\n const host = createHost(container, {\n className: \"minerva-orderbook-heatmap\",\n draw,\n onTheme: () => {\n refreshColors();\n host.invalidate();\n },\n });\n const { root, doc } = host;\n root.tabIndex = 0;\n root.setAttribute(\"role\", \"figure\");\n root.style.touchAction = \"none\";\n\n /** Texts in the locale, resolved on every option update */\n let texts = localeLabels(LABELS, options.locale, options.labels);\n const labels = () => texts;\n const applyTexts = () => {\n texts = localeLabels(LABELS, options.locale, options.labels);\n root.setAttribute(\"aria-label\", options.ariaLabel ?? texts.name);\n };\n const interval = () => Math.max(10, options.interval ?? 100);\n const history = () => Math.max(interval() * 4, options.history ?? 300_000);\n const depth = () => Math.max(4, Math.round(options.depth ?? 160));\n const nowTime = () => {\n if (!Number.isFinite(dataTime)) return Date.now();\n const elapsed = perfNow() - dataWall;\n return dataTime + Math.min(Math.max(0, elapsed), interval() * 3);\n };\n const perfNow = () =>\n typeof performance !== \"undefined\" ? performance.now() : Date.now();\n\n function refreshColors() {\n const theme = host.theme;\n colors = sideColors(theme, options);\n const resolve = (value: string) => {\n const c = theme.resolve\n ? theme.resolve(value, theme.primary)\n : theme.primary;\n return [c[0], c[1], c[2], 1] as Rgba;\n };\n const background: Rgba = [\n theme.background[0],\n theme.background[1],\n theme.background[2],\n 1,\n ];\n dark = theme.background[3] > 0 ? luminance(background) < 0.4 : false;\n const ramp = (\n options.colors?.length ? options.colors : dark ? DARK_RAMP : LIGHT_RAMP\n ).map(resolve);\n // the field is opaque: the empty color is the cold end of the ramp\n floor = ramp[0] ?? background;\n lut = oklabRamp(ramp.length > 1 ? ramp : [floor, floor], LUT_SIZE);\n const scale = options.colorScale ?? \"log\";\n // a mild gamma after the scale: the thin noise of the book stays near\n // the cold end, the walls stand out\n table = heatTable(lut, (r) => heatIntensity(r, 1, scale, 1) ** HEAT_GAMMA);\n paintKey = \"\";\n }\n\n const refreshFormat = () => {\n fmt = createFormatters(\n options,\n tick > 0\n ? Math.max(decimalsOf(tick), inferPriceDecimals(store))\n : inferPriceDecimals(store),\n inferSizeDecimals(store),\n );\n };\n\n const clearHistory = () => {\n columns = [];\n grid = null;\n gridKey = paintKey = \"\";\n head = null;\n openStart = NaN;\n scaleMax = scaleTarget = 0;\n scaleAt = -Infinity;\n bubbleRef = 0;\n profileMax = 0;\n shownTime = NaN;\n open.buyVolume = open.buyNotional = open.sellVolume = open.sellNotional = 0;\n };\n\n // --------------------------------------------------------------- columns\n\n const ensureTick = () => {\n if (tick > 0) return;\n const base = inferTickSize(store);\n const mid = store.mid();\n if (options.tickSize && options.tickSize > 0) tick = options.tickSize;\n else if (base > 0 && Number.isFinite(mid)) {\n // rows of about 0.1 basis point: a round multiple of the tick (BTC at\n // 64,000 with a 0.1 tick: 0.5 rows)\n const ratio = (mid * 1e-5) / base;\n let multiple = 1;\n for (let p = 1; p <= 1e9 && multiple < ratio * 0.75; p *= 10) {\n for (const m of [1, 2, 5]) {\n multiple = m * p;\n if (multiple >= ratio * 0.75) break;\n }\n }\n tick = roundToStep(base * multiple, base);\n } else tick = Number.isFinite(mid) ? Math.max(1e-8, mid * 1e-5) : 0;\n if (tick > 0) refreshFormat();\n };\n\n /** Samples the book into price rows */\n const sampleBook = () => {\n const limit = depth();\n const bins = new Float64Array(limit * 2);\n const sizes = new Float32Array(limit * 2);\n let n = 0;\n for (const side of [\"bid\", \"ask\"] as const) {\n const count = store.count(side);\n let rows = 0;\n for (let i = 0; i < count; i++) {\n const bin = Math.round(store.priceAt(side, i) / tick);\n const size = store.sizeAt(side, i);\n if (n > 0 && bins[n - 1] === bin && rows > 0) {\n sizes[n - 1] += size;\n continue;\n }\n if (rows >= limit) break;\n bins[n] = bin;\n sizes[n] = size;\n n++;\n rows++;\n }\n }\n return { bins: bins.slice(0, n), sizes: sizes.slice(0, n) };\n };\n\n /** Closes the open column at `start` with the current book */\n const closeColumn = (start: number) => {\n if (!(tick > 0)) return;\n const { bins, sizes } = sampleBook();\n const column: Column = {\n seq: seq++,\n time: start,\n bins,\n sizes,\n bestBid: store.bestBid(),\n bestAsk: store.bestAsk(),\n buyVolume: open.buyVolume,\n buyNotional: open.buyNotional,\n sellVolume: open.sellVolume,\n sellNotional: open.sellNotional,\n };\n open.buyVolume = open.buyNotional = open.sellVolume = open.sellNotional = 0;\n columns.push(column);\n // history\n const oldest = start - history();\n let drop = 0;\n while (drop < columns.length && columns[drop]!.time < oldest) drop++;\n if (drop) columns = columns.slice(drop);\n };\n\n /** Closes every column ending before `time` */\n const advance = (time: number) => {\n if (!Number.isFinite(time)) return;\n const step = interval();\n if (!Number.isFinite(openStart)) {\n openStart = Math.floor(time / step) * step;\n return;\n }\n if (time - openStart > history()) {\n // a long gap: one column, then jump\n closeColumn(openStart);\n openStart = Math.floor(time / step) * step;\n return;\n }\n while (time >= openStart + step) {\n closeColumn(openStart);\n openStart += step;\n }\n };\n\n const noteTime = (time: number | undefined) => {\n if (time === undefined || !Number.isFinite(time)) return Date.now();\n if (!Number.isFinite(dataTime) || time >= dataTime) {\n dataTime = time;\n dataWall = perfNow();\n }\n return time;\n };\n\n /**\n * Column showing a time: the last one starting at or before it (a column\n * lasts until the next one), `null` for the open one or before the data\n */\n const columnAt = (time: number): Column | null => {\n if (Number.isFinite(openStart) && time >= openStart) return null;\n let lo = 0;\n let hi = columns.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (columns[mid]!.time <= time) lo = mid + 1;\n else hi = mid;\n }\n return lo > 0 ? columns[lo - 1]! : null;\n };\n\n // ----------------------------------------------------------------- field\n\n /** The live book as a column (sampled once per store version) */\n const headSource = (): HeatSource | null => {\n if (!Number.isFinite(openStart) || !(tick > 0)) return null;\n const version = store.version();\n if (!head || head.version !== version) head = { version, ...sampleBook() };\n return { time: openStart, bins: head.bins, sizes: head.sizes };\n };\n\n /**\n * The heat image of the view, rebuilt when its inputs change; the color\n * scale follows the 98th percentile of the visible sizes (eased), so the\n * whole ramp is used in light and dark themes alike\n */\n const heatGrid = (\n x0: number,\n x1: number,\n y0: number,\n y1: number,\n end: number,\n dt: number,\n ): HeatGrid | null => {\n const step = interval();\n const live = headSource();\n const maxWidth = Math.min(MAX_TEXELS, Math.ceil(plot.w));\n const maxHeight = Math.min(MAX_TEXELS, Math.ceil(plot.h));\n const lastSeq = columns.length ? columns[columns.length - 1]!.seq : -1;\n const key = [\n x0,\n x1,\n y0,\n y1,\n Math.floor(end / step),\n columns.length,\n lastSeq,\n head?.version ?? -1,\n maxWidth,\n maxHeight,\n tick,\n ].join(\"|\");\n if (key !== gridKey) {\n const sources: HeatSource[] = live ? [...columns, live] : columns;\n grid = buildHeatGrid(\n { sources, step, tick, x0, x1, y0, y1, end, maxWidth, maxHeight },\n grid,\n );\n gridKey = key;\n paintKey = \"\";\n }\n if (!grid) return null;\n // auto scale: a robust \"hot\" size, sampled at most 4 times a second\n const fixed = options.maxSize;\n if (fixed !== undefined && fixed > 0) scaleMax = fixed;\n else {\n const now = perfNow();\n if (now - scaleAt > 250 || !(scaleTarget > 0)) {\n const target = percentile(grid.cells, SCALE_QUANTILE);\n if (target > 0) scaleTarget = target;\n scaleAt = now;\n }\n if (!(scaleMax > 0)) scaleMax = scaleTarget;\n else if (scaleTarget > 0 && Math.abs(scaleTarget / scaleMax - 1) > 1e-3)\n scaleMax += (scaleTarget - scaleMax) * ease(dt, 700);\n }\n const contrast = Math.max(0.01, options.contrast ?? 1);\n const k = scaleMax > 0 ? (HEAT_TABLE_SIZE * contrast) / scaleMax : 0;\n const paint = `${grid.version}|${k}`;\n if (paint !== paintKey) {\n paintHeatGrid(grid, table, k);\n paintKey = `${grid.version}|${k}`;\n }\n return grid;\n };\n\n const visibleColumns = () => {\n const step = interval();\n const out: Column[] = [];\n // binary search of the first visible column\n let lo = 0;\n let hi = columns.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (columns[mid]!.time + step < viewX[0]) lo = mid + 1;\n else hi = mid;\n }\n for (let i = lo; i < columns.length; i++) {\n const c = columns[i]!;\n if (c.time > viewX[1]) break;\n out.push(c);\n }\n return out;\n };\n\n /** Trade volumes of a group of columns */\n interface Bubble {\n time: number;\n price: number;\n volume: number;\n buy: boolean;\n }\n type Flow = Pick<\n Column,\n \"buyVolume\" | \"buyNotional\" | \"sellVolume\" | \"sellNotional\"\n >;\n\n /**\n * Trades of the visible columns as bubbles: columns are grouped (by their\n * sequence, so groups stay put while the view scrolls) until a group is\n * BUBBLE_SPACING px wide; one bubble per side at the average price\n */\n const tradeBubbles = (\n visible: readonly Column[],\n columnPx: number,\n ): Bubble[] => {\n const step = interval();\n const k = Math.max(1, Math.ceil(BUBBLE_SPACING / Math.max(1e-6, columnPx)));\n const out: Bubble[] = [];\n let group = NaN;\n let t0 = 0;\n let t1 = 0;\n const sum = { bv: 0, bn: 0, sv: 0, sn: 0 };\n const flush = () => {\n const time = (t0 + t1) / 2;\n if (sum.sv > 0)\n out.push({ time, price: sum.sn / sum.sv, volume: sum.sv, buy: false });\n if (sum.bv > 0)\n out.push({ time, price: sum.bn / sum.bv, volume: sum.bv, buy: true });\n sum.bv = sum.bn = sum.sv = sum.sn = 0;\n };\n const add = (id: number, start: number, flow: Flow) => {\n const g = Math.floor(id / k);\n if (g !== group) {\n if (Number.isFinite(group)) flush();\n group = g;\n t0 = start;\n }\n t1 = start + step;\n sum.bv += flow.buyVolume;\n sum.bn += flow.buyNotional;\n sum.sv += flow.sellVolume;\n sum.sn += flow.sellNotional;\n };\n for (const c of visible) add(c.seq, c.time, c);\n if (Number.isFinite(openStart) && openStart <= viewX[1])\n add(seq, openStart, open);\n if (Number.isFinite(group)) flush();\n return out;\n };\n\n const clipPlot = (ctx: CanvasRenderingContext2D) => {\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.w, plot.h);\n ctx.clip();\n };\n\n /** Best bid / ask step lines and the translucent spread band between them */\n const drawBest = (\n ctx: CanvasRenderingContext2D,\n visible: readonly Column[],\n xOf: (t: number) => number,\n yOf: (p: number) => number,\n columnPx: number,\n ) => {\n if (options.bestLines === false) return;\n const step = interval();\n // [start, end, bid, ask]: a column lasts until the next one\n const rows: [number, number, number, number][] = visible.map((c) => [\n c.time,\n c.time + step,\n c.bestBid,\n c.bestAsk,\n ]);\n if (Number.isFinite(openStart))\n rows.push([\n openStart,\n openStart + step,\n store.bestBid(),\n store.bestAsk(),\n ]);\n if (!rows.length) return;\n for (let i = 0; i + 1 < rows.length; i++) rows[i]![1] = rows[i + 1]![0];\n // wide columns: steps; narrow ones: a line through the column centers\n const steps = columnPx >= 2;\n const xs = (row: readonly number[]): [number, number] => {\n const xa = xOf(row[0]!);\n const xb = xOf(row[1]!);\n return steps ? [xa, xb] : [(xa + xb) / 2, (xa + xb) / 2];\n };\n clipPlot(ctx);\n // the spread band: one polygon per run of valid columns (no overlapping\n // rectangles, so no seams where neighbours meet)\n ctx.beginPath();\n let run: (typeof rows)[number][] = [];\n const flushRun = () => {\n if (!run.length) return;\n run.forEach((row, i) => {\n const [xa, xb] = xs(row);\n const y = yOf(row[3]);\n if (i) ctx.lineTo(xa, y);\n else ctx.moveTo(xa, y);\n ctx.lineTo(xb, y);\n });\n for (let i = run.length - 1; i >= 0; i--) {\n const [xa, xb] = xs(run[i]!);\n const y = yOf(run[i]![2]);\n ctx.lineTo(xb, y);\n ctx.lineTo(xa, y);\n }\n ctx.closePath();\n run = [];\n };\n for (const row of rows) {\n const [, , bid, ask] = row;\n if (Number.isFinite(bid) && Number.isFinite(ask) && ask > bid)\n run.push(row);\n else flushRun();\n }\n flushRun();\n ctx.fillStyle = toCss(host.theme.text, dark ? 0.08 : 0.07);\n ctx.fill();\n ctx.lineJoin = \"round\";\n for (const [index, color] of [\n [2, colors.up],\n [3, colors.down],\n ] as const) {\n ctx.beginPath();\n let pen = false;\n for (const row of rows) {\n const price = row[index];\n if (!Number.isFinite(price)) {\n pen = false;\n continue;\n }\n const y = yOf(price);\n const [xa, xb] = xs(row);\n if (pen) ctx.lineTo(xa, y);\n else ctx.moveTo(xa, y);\n if (steps) ctx.lineTo(xb, y);\n pen = true;\n }\n // a dark halo keeps the line readable on hot cells\n ctx.strokeStyle = toCss(floor, 0.55);\n ctx.lineWidth = 3.5;\n ctx.stroke();\n ctx.strokeStyle = toCss(color);\n ctx.lineWidth = 1.5;\n ctx.stroke();\n }\n ctx.restore();\n };\n\n /** Trade bubbles, area ∝ volume, the largest with their volume */\n const drawBubbles = (\n ctx: CanvasRenderingContext2D,\n bubbles: Bubble[],\n xOf: (t: number) => number,\n yOf: (p: number) => number,\n fontSize: number,\n ) => {\n if (!bubbles.length) return;\n let max = 0;\n for (const b of bubbles) max = Math.max(max, b.volume);\n bubbleRef = bubbleRef > 0 ? Math.max(max, bubbleRef * 0.995) : max;\n const ref = options.bubbleVolume ?? bubbleRef;\n const maxD = Math.max(4, options.bubbleSize ?? 28);\n const sized = bubbles\n .map((b) => ({\n ...b,\n d: clamp(Math.sqrt(b.volume / ref) * maxD, 3, maxD),\n }))\n .sort((a, b) => a.d - b.d);\n clipPlot(ctx);\n ctx.lineWidth = 1.25;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.font = fontOf(host.theme, options, 600, Math.max(8, fontSize - 1));\n for (const b of sized) {\n const x = xOf(b.time);\n const y = yOf(b.price);\n const r = b.d / 2;\n if (x < plot.x - r || x > plot.x + plot.w + r) continue;\n if (y < plot.y - r || y > plot.y + plot.h + r) continue;\n const color = b.buy ? colors.up : colors.down;\n ctx.beginPath();\n ctx.arc(x, y, r, 0, Math.PI * 2);\n ctx.fillStyle = toCss(color, 0.62);\n ctx.fill();\n ctx.strokeStyle = toCss(mixOklab(color, [1, 1, 1, 1], 0.25));\n ctx.stroke();\n if (b.d >= 26) {\n const text = fmt.compact(b.volume);\n if (ctx.measureText(text).width <= b.d - 6) {\n ctx.fillStyle = \"#fff\";\n ctx.fillText(text, x, y + 0.5);\n }\n }\n }\n ctx.restore();\n };\n\n /** The current book as horizontal bars right of the plot, with a size scale */\n const drawProfile = (\n ctx: CanvasRenderingContext2D,\n px: number,\n profileW: number,\n yOf: (p: number) => number,\n fontSize: number,\n ) => {\n const theme = host.theme;\n const [y0, y1] = viewY;\n const rowPx = Math.max(1, (tick / (y1 - y0)) * plot.h);\n let maxSize = 0;\n const sides = ([\"bid\", \"ask\"] as const).map((side) => {\n const levels = store.levels(side, { step: tick, limit: depth() });\n for (let i = 0; i < levels.count; i++) {\n const p = levels.price[i]!;\n if (p >= y0 && p <= y1) maxSize = Math.max(maxSize, levels.size[i]!);\n }\n return { side, ...levels };\n });\n // a fine \"nice\" scale (the largest bar fills 75-100 % of the panel),\n // changed only on a clear change: no jumping bars\n if (maxSize > profileMax || maxSize < profileMax * 0.6 || !(profileMax > 0))\n profileMax = fineCeil(maxSize);\n if (!(profileMax > 0)) return;\n const left = px + 2;\n const inner = Math.max(4, profileW - 6);\n // faint guides at half and full scale\n ctx.strokeStyle = toCss(theme.text, 0.07);\n ctx.lineWidth = 1;\n ctx.setLineDash([2, 3]);\n ctx.beginPath();\n for (const f of [0.5, 1]) {\n const x = Math.round(left + inner * f) - 0.5;\n ctx.moveTo(x, plot.y);\n ctx.lineTo(x, plot.y + plot.h);\n }\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.save();\n ctx.beginPath();\n ctx.rect(px, plot.y, profileW, plot.h);\n ctx.clip();\n // rows on whole pixels from the price edges; a 1 px gap when tall\n const gap = rowPx >= 4 ? 1 : 0;\n const bar = (p: number, s: number) => {\n const top = Math.round(yOf(p + tick / 2));\n const bottom = Math.max(top + 1, Math.round(yOf(p - tick / 2)) - gap);\n const w = Math.max(1, Math.min(inner, (s / profileMax) * inner));\n ctx.rect(left, top, w, bottom - top);\n };\n for (const { side, price, size, count } of sides) {\n const color = side === \"bid\" ? colors.up : colors.down;\n ctx.beginPath();\n for (let i = 1; i < count; i++) {\n const p = price[i]!;\n if (p >= y0 - tick && p <= y1 + tick) bar(p, size[i]!);\n }\n ctx.fillStyle = toCss(color, dark ? 0.62 : 0.55);\n ctx.fill();\n // the best level, solid\n const best = price[0];\n if (count && best !== undefined && best >= y0 && best <= y1) {\n ctx.beginPath();\n bar(best, size[0]!);\n ctx.fillStyle = toCss(color);\n ctx.fill();\n }\n }\n ctx.restore();\n // size scale below the panel\n const y = Math.round(plot.y + plot.h + 4) + 0.5;\n ctx.strokeStyle = toCss(theme.textMuted, 0.7);\n ctx.beginPath();\n ctx.moveTo(left, y);\n ctx.lineTo(left + inner, y);\n for (const f of [0, 0.5, 1]) {\n const x = Math.round(left + inner * f) + 0.5;\n ctx.moveTo(x, y);\n ctx.lineTo(x, y + 3);\n }\n ctx.stroke();\n ctx.font = fontOf(theme, options, 400, Math.max(8, fontSize - 1));\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.textBaseline = \"top\";\n const text = fmt.compact(profileMax);\n const tw = ctx.measureText(text).width;\n ctx.textAlign = \"right\";\n ctx.fillText(text, left + inner + 2, y + 4);\n if (tw + ctx.measureText(\"0\").width + 8 < inner) {\n ctx.textAlign = \"left\";\n ctx.fillText(\"0\", left - 1, y + 4);\n }\n };\n\n /** Hovered cell: pointer, time, price row */\n interface HoverCell {\n hx: number;\n hy: number;\n /** Time under the pointer */\n time: number;\n /** Start of the hovered column (NaN outside the data) */\n start: number;\n column: Column | null;\n bin: number;\n rowPrice: number;\n }\n\n const hoverCell = (): HoverCell | null => {\n if (!hoverAt || options.tooltip === false || !(tick > 0) || drag)\n return null;\n if (!viewYReady) return null;\n const [hx, hy] = hoverAt;\n if (\n hx < plot.x ||\n hx > plot.x + plot.w ||\n hy < plot.y ||\n hy > plot.y + plot.h\n )\n return null;\n const [x0, x1] = viewX;\n const [y0, y1] = viewY;\n const time = x0 + ((hx - plot.x) / plot.w) * (x1 - x0);\n const price = y0 + ((plot.y + plot.h - hy) / plot.h) * (y1 - y0);\n const bin = Math.round(price / tick);\n const rowPrice = +(bin * tick).toFixed(Math.min(12, decimalsOf(tick) + 2));\n const column = columnAt(time);\n const start = column\n ? column.time\n : Number.isFinite(openStart) && time >= openStart\n ? openStart\n : NaN;\n return { hx, hy, time, start, column, bin, rowPrice };\n };\n\n /** Price / time tag: filled (best bid / ask, hover) or outlined (last trade) */\n const drawTag = (\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n maxWidth: number,\n color: Rgba,\n filled: boolean,\n align: \"left\" | \"center\" = \"left\",\n ) => {\n const w = Math.min(ctx.measureText(text).width + 10, maxWidth);\n const left = align === \"center\" ? x - w / 2 : x;\n ctx.fillStyle = filled ? toCss(color) : toCss(floor);\n roundRect(ctx, left, y - TAG_HEIGHT / 2, w, TAG_HEIGHT, 3);\n ctx.fill();\n if (!filled) {\n ctx.strokeStyle = toCss(color);\n ctx.lineWidth = 1;\n ctx.stroke();\n }\n ctx.fillStyle = filled\n ? luminance(color) > 0.6\n ? \"#111\"\n : \"#fff\"\n : toCss(color);\n ctx.textAlign = align;\n ctx.textBaseline = \"middle\";\n ctx.fillText(text, align === \"center\" ? x : left + 5, y + 0.5);\n };\n\n // ---------------------------------------------------------------- draw\n\n function draw(now: number): boolean {\n const ctx = host.ctx;\n if (!ctx) return false;\n const { width, height, dpr, theme } = host;\n const dt = lastFrame ? now - lastFrame : 0;\n lastFrame = now;\n const l = labels();\n const fontSize = options.fontSize ?? (width < 420 ? 10 : 11);\n const regular = fontOf(theme, options, 400, fontSize);\n const bold = fontOf(theme, options, 600, fontSize);\n const step = interval();\n const live = !Number.isFinite(dataTime);\n if (live && store.count(\"bid\") + store.count(\"ask\") > 0)\n advance(Date.now());\n // a monotonic clock: the view never jumps back when data arrives late\n const clock = nowTime();\n shownTime =\n Number.isFinite(shownTime) && clock > shownTime - step * 4\n ? Math.max(shownTime, clock)\n : clock;\n const time = shownTime;\n\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, width, height);\n\n // layout\n ensureTick();\n const mid = store.mid();\n ctx.font = bold;\n const sample = fmt.price(Number.isFinite(mid) ? mid * 1.0001 : 0);\n const axisW = Math.ceil(ctx.measureText(sample).width) + 18;\n ctx.font = regular;\n const profileW =\n options.profile === false ? 0 : Math.round(clamp(width * 0.12, 56, 120));\n const timeH = fontSize + 12;\n plot = {\n x: 0,\n y: 0,\n w: Math.max(10, width - axisW - profileW),\n h: Math.max(10, height - timeH),\n };\n const px = plot.x + plot.w;\n const right = px + profileW;\n\n // view: the following view fits the data (history fills the plot from\n // the left) and keeps the price range while the market stays inside it\n if (!Number.isFinite(windowSpan))\n windowSpan = Math.max(step * 10, options.window ?? 60_000);\n if (follow) {\n const first = columns.length ? columns[0]!.time : openStart;\n // the view ends at the live time: the open column (the live book) is\n // cut by the right edge, so no gap opens while it is being sampled\n viewX = fitTimeRange(\n first,\n time,\n windowSpan,\n Math.min(windowSpan, step * 60),\n );\n let lo = store.bestBid();\n let hi = store.bestAsk();\n for (const c of visibleColumns()) {\n if (Number.isFinite(c.bestBid) && !(c.bestBid >= lo)) lo = c.bestBid;\n if (Number.isFinite(c.bestAsk) && !(c.bestAsk <= hi)) hi = c.bestAsk;\n }\n if (!Number.isFinite(lo)) lo = hi;\n if (!Number.isFinite(hi)) hi = lo;\n const minSpan = tick > 0 ? tick * Math.max(40, plot.h / 6) : 0;\n const fixed =\n options.priceSpan ?? (Number.isFinite(ySpan) ? ySpan : undefined);\n if (minSpan > 0 || fixed !== undefined) {\n yTarget = fitPriceRange(yTarget, lo, hi, minSpan, fixed);\n const [t0, t1] = yTarget;\n if (Number.isFinite(t0) && Number.isFinite(t1)) {\n if (!viewYReady) {\n viewY = [t0, t1];\n viewYReady = true;\n } else {\n const k = ease(dt, 280);\n viewY = [\n viewY[0] + (t0 - viewY[0]) * k,\n viewY[1] + (t1 - viewY[1]) * k,\n ];\n }\n }\n }\n }\n const [x0, x1] = viewX;\n const [y0, y1] = viewY;\n const xOf = (t: number) => plot.x + ((t - x0) / (x1 - x0)) * plot.w;\n const yOf = (p: number) =>\n plot.y + plot.h - ((p - y0) / (y1 - y0)) * plot.h;\n const ready = viewYReady && tick > 0;\n const visible = visibleColumns();\n const columnPx = (step / (x1 - x0)) * plot.w;\n\n // data layer: the heat field (an opaque image over the cold color)\n const floorCss = toCss(floor);\n if (renderer) {\n const canvas = renderer.canvas;\n canvas.style.left = `${plot.x}px`;\n canvas.style.top = `${plot.y}px`;\n canvas.style.width = `${plot.w}px`;\n canvas.style.height = `${plot.h}px`;\n const bw = Math.max(1, Math.round(plot.w * dpr));\n const bh = Math.max(1, Math.round(plot.h * dpr));\n if (canvas.width !== bw || canvas.height !== bh) renderer.resize(bw, bh);\n const heat =\n ready && Number.isFinite(openStart)\n ? heatGrid(x0, x1, y0, y1, time, dt)\n : null;\n // the image rectangle in device pixels of the plot canvas\n const sx = bw / plot.w;\n const sy = bh / plot.h;\n const rect: [number, number, number, number] = heat\n ? [\n (xOf(heat.t0) - plot.x) * sx,\n (yOf(heat.p1) - plot.y) * sy,\n (xOf(heat.t1) - plot.x) * sx,\n (yOf(heat.p0) - plot.y) * sy,\n ]\n : [0, 0, 0, 0];\n renderer.render(heat, rect, floor);\n } else {\n ctx.fillStyle = floorCss;\n ctx.fillRect(plot.x, plot.y, plot.w, plot.h);\n }\n\n // grid over the cells\n const yTicks = ready\n ? linearTicks(y0, y1, Math.max(2, Math.floor(plot.h / 44)))\n : [];\n const xt = timeTicks(\n x0,\n x1,\n Math.max(2, Math.floor(plot.w / 75)),\n undefined,\n options.timeZone ?? \"local\",\n );\n ctx.strokeStyle = toCss(theme.text, dark ? 0.07 : 0.09);\n ctx.lineWidth = 1;\n ctx.beginPath();\n for (const p of yTicks) {\n const y = Math.round(yOf(p)) + 0.5;\n ctx.moveTo(plot.x, y);\n ctx.lineTo(right, y);\n }\n for (const t of xt.values) {\n const x = Math.round(xOf(t)) + 0.5;\n if (x <= plot.x + 1 || x >= px - 1) continue;\n ctx.moveTo(x, plot.y);\n ctx.lineTo(x, plot.y + plot.h);\n }\n ctx.stroke();\n\n // best bid / ask, trades, the current book\n if (ready) {\n drawBest(ctx, visible, xOf, yOf, columnPx);\n if (options.bubbles !== false)\n drawBubbles(ctx, tradeBubbles(visible, columnPx), xOf, yOf, fontSize);\n if (profileW) drawProfile(ctx, px, profileW, yOf, fontSize);\n }\n\n // frame\n ctx.strokeStyle = toCss(theme.axis);\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(0, Math.round(plot.y + plot.h) + 0.5);\n ctx.lineTo(width, Math.round(plot.y + plot.h) + 0.5);\n if (profileW) {\n ctx.moveTo(Math.round(px) + 0.5, plot.y);\n ctx.lineTo(Math.round(px) + 0.5, plot.y + plot.h);\n }\n ctx.moveTo(Math.round(right) + 0.5, plot.y);\n ctx.lineTo(Math.round(right) + 0.5, plot.y + plot.h);\n ctx.stroke();\n\n const cell = ready ? hoverCell() : null;\n\n // time axis (the hover time tag hides the ticks it covers)\n ctx.font = regular;\n const hoverTime = cell\n ? formatClock(\n Number.isFinite(cell.start) ? cell.start : cell.time,\n step < 1000,\n options.timeZone,\n )\n : \"\";\n const hoverHalf = cell ? ctx.measureText(hoverTime).width / 2 + 8 : 0;\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n for (const t of xt.values) {\n const x = xOf(t);\n const text = xt.format(t);\n const half = ctx.measureText(text).width / 2;\n // labels stay whole inside the plot\n if (x - half < plot.x + 2 || x + half > px - 2) continue;\n if (cell && Math.abs(x - cell.hx) < hoverHalf + half) continue;\n ctx.fillText(text, x, plot.y + plot.h + 6);\n }\n\n // price axis: pinned tags (best ask / bid, last trade) win over the\n // ticks, the hover tag over everything\n const last = lastTrade;\n const pins: { price: number; color: Rgba; filled: boolean }[] = [\n { price: store.bestAsk(), color: colors.down, filled: true },\n { price: store.bestBid(), color: colors.up, filled: true },\n ];\n if (\n last &&\n last.price !== store.bestBid() &&\n last.price !== store.bestAsk()\n )\n pins.push({\n price: last.price,\n color: last.side === \"buy\" ? colors.up : colors.down,\n filled: false,\n });\n const shownPins = ready\n ? pins.filter(\n (p) => Number.isFinite(p.price) && p.price >= y0 && p.price <= y1,\n )\n : [];\n const hoverY = cell ? Math.round(yOf(cell.rowPrice)) + 0.5 : NaN;\n const layout = layoutAxisLabels(\n shownPins.map((p): AxisLabel => ({ y: yOf(p.price), h: TAG_HEIGHT })),\n cell ? { y: hoverY, h: TAG_HEIGHT } : null,\n yTicks.map(yOf),\n fontSize + 2,\n [plot.y, plot.y + plot.h],\n );\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n yTicks.forEach((p, i) => {\n if (layout.ticks[i]) ctx.fillText(fmt.price(p), right + 6, yOf(p));\n });\n ctx.font = bold;\n shownPins.forEach((pin, i) => {\n const y = layout.pinned[i];\n if (y === null || y === undefined) return;\n const at = yOf(pin.price);\n if (Math.abs(y - at) > 1) {\n // a moved tag points at its price\n ctx.strokeStyle = toCss(pin.color);\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(right - 4, at);\n ctx.lineTo(right + 1, y);\n ctx.stroke();\n }\n drawTag(\n ctx,\n fmt.price(pin.price),\n right + 1,\n y,\n width - right - 2,\n pin.color,\n pin.filled,\n );\n });\n\n // crosshair, hover tags and tooltip\n drawHover(ctx, xOf, yOf, right, l, cell, hoverY, hoverTime);\n ctx.font = regular;\n\n host.describe(\n `${options.ariaLabel ?? l.name}. ${l.bid} ${fmt.price(store.bestBid())}, ${l.ask} ${fmt.price(store.bestAsk())}.`,\n );\n // keep scrolling while following a live market\n const fresh = live || perfNow() - dataWall < 2000;\n return (\n (follow && fresh && Number.isFinite(openStart)) ||\n (viewYReady && yTarget !== null && Math.abs(viewY[0] - yTarget[0]) > 1e-9)\n );\n }\n\n function drawHover(\n ctx: CanvasRenderingContext2D,\n xOf: (t: number) => number,\n yOf: (p: number) => number,\n right: number,\n l: OrderBookHeatmapLabels,\n cell: HoverCell | null,\n ry: number,\n timeText: string,\n ) {\n const { theme } = host;\n if (!cell) {\n host.tooltip.style.display = \"none\";\n if (hoverKey) {\n hoverKey = \"\";\n emitter.emit(\"hover\", null);\n }\n return;\n }\n const { hx, hy, time, start, column, bin, rowPrice } = cell;\n const step = interval();\n let size = 0;\n let bestBid = NaN;\n let bestAsk = NaN;\n let buyVolume = 0;\n let sellVolume = 0;\n if (column) {\n for (let i = 0; i < column.bins.length; i++) {\n if (column.bins[i] === bin) size += column.sizes[i]!;\n }\n ({ bestBid, bestAsk, buyVolume, sellVolume } = column);\n } else if (Number.isFinite(start)) {\n const levels = ([\"bid\", \"ask\"] as const).map((side) =>\n store.levels(side, { step: tick, limit: depth() }),\n );\n for (const lv of levels) {\n for (let i = 0; i < lv.count; i++) {\n if (Math.round(lv.price[i]! / tick) === bin) size += lv.size[i]!;\n }\n }\n bestBid = store.bestBid();\n bestAsk = store.bestAsk();\n buyVolume = open.buyVolume;\n sellVolume = open.sellVolume;\n }\n const side: OrderBookSide | null =\n rowPrice <= bestBid ? \"bid\" : rowPrice >= bestAsk ? \"ask\" : null;\n\n // crosshair\n ctx.strokeStyle = toCss(theme.text, 0.5);\n ctx.lineWidth = 1;\n ctx.setLineDash([3, 3]);\n ctx.beginPath();\n ctx.moveTo(Math.round(hx) + 0.5, plot.y);\n ctx.lineTo(Math.round(hx) + 0.5, plot.y + plot.h);\n ctx.moveTo(plot.x, ry);\n ctx.lineTo(right, ry);\n ctx.stroke();\n ctx.setLineDash([]);\n if (Number.isFinite(start)) {\n // outline of the hovered cell\n const cx0 = xOf(start);\n const cx1 = xOf(start + step);\n const cy0 = yOf(rowPrice + tick / 2);\n const cy1 = yOf(rowPrice - tick / 2);\n ctx.strokeStyle = toCss(theme.text, 0.85);\n ctx.strokeRect(cx0, cy0, Math.max(2, cx1 - cx0), Math.max(2, cy1 - cy0));\n }\n // price and time tags\n ctx.font = fontOf(\n theme,\n options,\n 600,\n options.fontSize ?? (host.width < 420 ? 10 : 11),\n );\n drawTag(\n ctx,\n fmt.price(rowPrice),\n right + 1,\n ry,\n host.width - right - 2,\n theme.text,\n true,\n );\n drawTag(\n ctx,\n timeText,\n clamp(hx, plot.x + 40, plot.x + plot.w - 40),\n plot.y + plot.h + TAG_HEIGHT / 2 + 2,\n plot.w,\n theme.text,\n true,\n \"center\",\n );\n\n const sideColor =\n side === \"bid\" ? colors.up : side === \"ask\" ? colors.down : null;\n tooltipHtml(\n doc,\n host.tooltip,\n {\n text: formatClock(\n Number.isFinite(start) ? start : time,\n true,\n options.timeZone,\n ),\n color: undefined,\n // the side as a small colored badge (no accent border)\n badge:\n side && sideColor\n ? {\n text: side === \"bid\" ? l.bidSide : l.askSide,\n color: toCss(sideColor),\n }\n : undefined,\n },\n [\n [l.price, fmt.price(rowPrice)],\n [l.liquidity, fmt.size(size)],\n [l.buys, fmt.size(buyVolume)],\n [l.sells, fmt.size(sellVolume)],\n ],\n );\n host.tooltip.style.display = \"block\";\n host.placeTooltip(\n host.tooltip,\n hx,\n hy,\n hx > plot.w * 0.6 ? \"left\" : \"right\",\n );\n\n const key = `${start}|${bin}|${size}|${buyVolume}|${sellVolume}`;\n if (key !== hoverKey) {\n hoverKey = key;\n const event: OrderBookHeatmapHoverEvent = {\n time: Number.isFinite(start) ? start : time,\n price: rowPrice,\n size,\n side,\n buyVolume,\n sellVolume,\n };\n emitter.emit(\"hover\", event);\n }\n }\n\n // ------------------------------------------------------------ renderer\n\n const initRenderer = async (exclude: Set<ChartRendererKind> = new Set()) => {\n const token = ++rendererToken;\n const next = await createHeatFieldRenderer(\n options.renderer ?? \"auto\",\n () => {\n const canvas = doc.createElement(\"canvas\");\n Object.assign(canvas.style, {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n pointerEvents: \"none\",\n });\n canvas.setAttribute(\"aria-hidden\", \"true\");\n return canvas;\n },\n (kind) => {\n if (destroyed || renderer?.kind !== kind) return;\n renderer.destroy();\n renderer.canvas.remove();\n renderer = null;\n void initRenderer(new Set([...exclude, kind]));\n },\n exclude,\n );\n if (destroyed || token !== rendererToken) {\n next?.destroy();\n return;\n }\n if (renderer) {\n renderer.destroy();\n renderer.canvas.remove();\n }\n renderer = next;\n if (next) {\n root.dataset.renderer = next.kind;\n root.insertBefore(next.canvas, host.canvas);\n emitter.emit(\"renderer\", next.kind);\n } else delete root.dataset.renderer;\n resolveReady(next?.kind ?? null);\n host.invalidate();\n };\n const unfollowDefault = followDefaultRenderer(\n () => options.renderer,\n () => void initRenderer(),\n );\n\n // --------------------------------------------------------- interaction\n\n const setFollow = (value: boolean) => {\n if (follow === value) return;\n follow = value;\n emitter.emit(\"follow\", value);\n };\n\n /** Keeps a panned time range near the data (half a view of margin) */\n const clampTime = (range: [number, number]): [number, number] => {\n const first = columns.length ? columns[0]!.time : openStart;\n if (!Number.isFinite(first)) return range;\n const span = range[1] - range[0];\n const latest = Number.isFinite(shownTime) ? shownTime : nowTime();\n const max = latest + interval() + span / 2;\n const start = Math.max(first - span / 2, Math.min(range[0], max - span));\n return [start, start + span];\n };\n\n const onPointerDown = (event: PointerEvent) => {\n if (options.interactive === false) return;\n const [x, y] = localPoint(root, event);\n root.setPointerCapture?.(event.pointerId);\n drag = {\n x,\n y,\n viewX: [...viewX],\n viewY: [...viewY],\n axis: x > plot.x + plot.w,\n span: viewY[1] - viewY[0],\n };\n };\n const onPointerMove = (event: PointerEvent) => {\n const [x, y] = localPoint(root, event);\n hoverAt = [x, y];\n if (drag) {\n const dx = x - drag.x;\n const dy = y - drag.y;\n if (drag.axis) {\n // dragging the price axis scales the prices around the center\n const span = drag.span * Math.exp(dy * 0.006);\n const c = (drag.viewY[0] + drag.viewY[1]) / 2;\n ySpan = span;\n viewY = [c - span / 2, c + span / 2];\n yTarget = [viewY[0], viewY[1]];\n } else if (Math.abs(dx) + Math.abs(dy) > 3) {\n setFollow(false);\n const tx = ((drag.viewX[1] - drag.viewX[0]) / plot.w) * dx;\n const ty = ((drag.viewY[1] - drag.viewY[0]) / plot.h) * dy;\n viewX = clampTime([drag.viewX[0] - tx, drag.viewX[1] - tx]);\n viewY = [drag.viewY[0] + ty, drag.viewY[1] + ty];\n }\n }\n host.invalidate();\n };\n const onPointerUp = (event: PointerEvent) => {\n root.releasePointerCapture?.(event.pointerId);\n drag = null;\n host.invalidate();\n };\n const onPointerLeave = () => {\n if (drag) return;\n hoverAt = null;\n host.invalidate();\n };\n const zoomTime = (factor: number, anchorX: number) => {\n const [a, b] = viewX;\n const span = clamp(\n (follow ? windowSpan : b - a) * factor,\n interval() * 10,\n history(),\n );\n windowSpan = span;\n if (!follow) {\n const t = a + ((anchorX - plot.x) / plot.w) * (b - a);\n const r = (t - a) / (b - a);\n viewX = clampTime([t - span * r, t + span * (1 - r)]);\n }\n host.invalidate();\n };\n const zoomPrice = (factor: number) => {\n const span = clamp(\n (viewY[1] - viewY[0]) * factor,\n tick * 6 || 1e-9,\n Infinity,\n );\n const c = (viewY[0] + viewY[1]) / 2;\n ySpan = span;\n viewY = [c - span / 2, c + span / 2];\n yTarget = [viewY[0], viewY[1]];\n host.invalidate();\n };\n const onWheel = (event: WheelEvent) => {\n if (options.interactive === false || !(event.ctrlKey || event.metaKey))\n return;\n event.preventDefault();\n const [x] = localPoint(root, event);\n const factor = Math.exp(event.deltaY * 0.002);\n if (event.shiftKey || x > plot.x + plot.w) zoomPrice(factor);\n else zoomTime(factor, x);\n };\n const onDoubleClick = () => {\n if (options.interactive === false) return;\n instance.resetView();\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (options.interactive === false) return;\n switch (event.key) {\n case \"+\":\n case \"=\":\n zoomTime(0.8, plot.x + plot.w);\n break;\n case \"-\":\n zoomTime(1.25, plot.x + plot.w);\n break;\n case \"ArrowUp\":\n case \"ArrowDown\": {\n if (event.shiftKey) {\n zoomPrice(event.key === \"ArrowUp\" ? 0.8 : 1.25);\n break;\n }\n setFollow(false);\n const d =\n (viewY[1] - viewY[0]) * 0.1 * (event.key === \"ArrowUp\" ? 1 : -1);\n viewY = [viewY[0] + d, viewY[1] + d];\n host.invalidate();\n break;\n }\n case \"ArrowLeft\":\n case \"ArrowRight\": {\n setFollow(false);\n const d =\n (viewX[1] - viewX[0]) * 0.1 * (event.key === \"ArrowLeft\" ? -1 : 1);\n viewX = clampTime([viewX[0] + d, viewX[1] + d]);\n host.invalidate();\n break;\n }\n case \"0\":\n case \"Home\":\n instance.resetView();\n break;\n default:\n return;\n }\n event.preventDefault();\n };\n\n root.addEventListener(\"pointerdown\", onPointerDown);\n root.addEventListener(\"pointermove\", onPointerMove);\n root.addEventListener(\"pointerup\", onPointerUp);\n root.addEventListener(\"pointercancel\", onPointerUp);\n root.addEventListener(\"pointerleave\", onPointerLeave);\n root.addEventListener(\"wheel\", onWheel, { passive: false });\n root.addEventListener(\"dblclick\", onDoubleClick);\n root.addEventListener(\"keydown\", onKeyDown);\n\n // ----------------------------------------------------------------- api\n\n const applyOne = (delta: OrderBookDelta) => {\n const time = noteTime(delta.time);\n if (store.count(\"bid\") + store.count(\"ask\") > 0) {\n ensureTick();\n advance(time);\n }\n store.applyDelta(delta);\n };\n\n const instance: OrderBookHeatmapInstance = {\n setBook(snapshot) {\n const time = noteTime(snapshot.time);\n if (store.count(\"bid\") + store.count(\"ask\") > 0) advance(time);\n store.setSnapshot(snapshot);\n ensureTick();\n refreshFormat();\n if (!Number.isFinite(openStart)) advance(time);\n host.invalidate();\n },\n applyDeltas(deltas) {\n if (Array.isArray(deltas)) {\n for (const d of deltas as readonly OrderBookDelta[]) applyOne(d);\n } else applyOne(deltas as OrderBookDelta);\n if (!Number.isFinite(openStart) && tick > 0) advance(nowTime());\n host.invalidate();\n },\n addTrades(trades) {\n const list: readonly MarketTrade[] = Array.isArray(trades)\n ? (trades as readonly MarketTrade[])\n : [trades as MarketTrade];\n for (const trade of list) {\n if (!(trade.size > 0) || !Number.isFinite(trade.price)) continue;\n if (Number.isFinite(dataTime)) {\n noteTime(trade.time);\n advance(trade.time);\n }\n const target =\n !Number.isFinite(openStart) || trade.time >= openStart\n ? open\n : columnAt(trade.time);\n if (target) {\n if (trade.side === \"buy\") {\n target.buyVolume += trade.size;\n target.buyNotional += trade.size * trade.price;\n } else {\n target.sellVolume += trade.size;\n target.sellNotional += trade.size * trade.price;\n }\n }\n if (!lastTrade || trade.time >= lastTrade.time) lastTrade = trade;\n }\n host.invalidate();\n },\n clear() {\n store.clear();\n clearHistory();\n lastTrade = null;\n dataTime = NaN;\n tick = 0;\n ySpan = NaN;\n yTarget = null;\n viewYReady = false;\n host.invalidate();\n },\n setOptions(next) {\n const previous = options;\n options = next;\n applyTexts();\n if (\n next.tickSize !== previous.tickSize ||\n (next.interval ?? 100) !== (previous.interval ?? 100)\n ) {\n clearHistory();\n tick = 0;\n ySpan = NaN;\n ensureTick();\n }\n if (next.window !== previous.window) windowSpan = NaN;\n if (next.priceSpan !== previous.priceSpan) ySpan = NaN;\n if ((next.renderer ?? \"auto\") !== (previous.renderer ?? \"auto\"))\n void initRenderer();\n refreshColors();\n refreshFormat();\n host.invalidate();\n },\n resetView() {\n windowSpan = NaN;\n ySpan = NaN;\n yTarget = null;\n setFollow(true);\n host.invalidate();\n },\n getRenderer: () => renderer?.kind ?? null,\n ready,\n getStore: () => store,\n on: (event, handler) => emitter.on(event, handler),\n resize() {\n host.invalidate();\n },\n destroy() {\n destroyed = true;\n unfollowDefault();\n root.removeEventListener(\"pointerdown\", onPointerDown);\n root.removeEventListener(\"pointermove\", onPointerMove);\n root.removeEventListener(\"pointerup\", onPointerUp);\n root.removeEventListener(\"pointercancel\", onPointerUp);\n root.removeEventListener(\"pointerleave\", onPointerLeave);\n root.removeEventListener(\"wheel\", onWheel);\n root.removeEventListener(\"dblclick\", onDoubleClick);\n root.removeEventListener(\"keydown\", onKeyDown);\n renderer?.destroy();\n renderer = null;\n emitter.clear();\n host.destroy();\n resolveReady(null);\n },\n };\n\n applyTexts();\n refreshColors();\n void initRenderer();\n return instance;\n};\n"],"mappings":"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"}