minerva-design 1.4.0 → 1.5.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 (670) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +21 -21
  3. package/custom-elements.json +4047 -1703
  4. package/dist/angular/fesm2022/minerva-angular.mjs +1436 -5
  5. package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
  6. package/dist/angular/types/minerva-angular.d.ts +573 -4
  7. package/dist/charts/canvas.d.cts +2 -2
  8. package/dist/charts/canvas.d.ts +2 -2
  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 +154 -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 +365 -251
  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 +32 -1
  34. package/dist/charts/engine/controller.d.ts +32 -1
  35. package/dist/charts/engine/controller.js +310 -263
  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 +1565 -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 +314 -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 +67 -0
  82. package/dist/charts/engine/graph/force.d.ts +67 -0
  83. package/dist/charts/engine/graph/force.js +325 -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 +37 -0
  88. package/dist/charts/engine/graph/geometry.d.ts +37 -0
  89. package/dist/charts/engine/graph/geometry.js +144 -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 +43 -0
  104. package/dist/charts/engine/graph/model.d.ts +43 -0
  105. package/dist/charts/engine/graph/model.js +88 -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 +626 -0
  120. package/dist/charts/engine/graph/types.d.ts +626 -0
  121. package/dist/charts/engine/graph/worker.cjs +46 -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 +129 -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.js +28 -4
  136. package/dist/charts/engine/labels.js.map +1 -1
  137. package/dist/charts/engine/layout.cjs +1 -1
  138. package/dist/charts/engine/layout.cjs.map +1 -1
  139. package/dist/charts/engine/layout.d.cts +9 -0
  140. package/dist/charts/engine/layout.d.ts +9 -0
  141. package/dist/charts/engine/layout.js +11 -2
  142. package/dist/charts/engine/layout.js.map +1 -1
  143. package/dist/charts/engine/model.cjs +1 -1
  144. package/dist/charts/engine/model.cjs.map +1 -1
  145. package/dist/charts/engine/model.d.cts +40 -3
  146. package/dist/charts/engine/model.d.ts +40 -3
  147. package/dist/charts/engine/model.js +246 -165
  148. package/dist/charts/engine/model.js.map +1 -1
  149. package/dist/charts/engine/orderbook/format.cjs +1 -1
  150. package/dist/charts/engine/orderbook/format.cjs.map +1 -1
  151. package/dist/charts/engine/orderbook/format.d.cts +3 -2
  152. package/dist/charts/engine/orderbook/format.d.ts +3 -2
  153. package/dist/charts/engine/orderbook/format.js +5 -5
  154. package/dist/charts/engine/orderbook/format.js.map +1 -1
  155. package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
  156. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
  157. package/dist/charts/engine/orderbook/heatmap.js +527 -408
  158. package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
  159. package/dist/charts/engine/orderbook/layout.cjs +2 -0
  160. package/dist/charts/engine/orderbook/layout.cjs.map +1 -0
  161. package/dist/charts/engine/orderbook/layout.d.cts +37 -0
  162. package/dist/charts/engine/orderbook/layout.d.ts +37 -0
  163. package/dist/charts/engine/orderbook/layout.js +70 -0
  164. package/dist/charts/engine/orderbook/layout.js.map +1 -0
  165. package/dist/charts/engine/orderbook/tape.cjs +1 -1
  166. package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
  167. package/dist/charts/engine/orderbook/tape.js +1 -1
  168. package/dist/charts/engine/orderbook/tape.js.map +1 -1
  169. package/dist/charts/engine/orderbook/types.d.cts +18 -2
  170. package/dist/charts/engine/orderbook/types.d.ts +18 -2
  171. package/dist/charts/engine/overlay.cjs +1 -1
  172. package/dist/charts/engine/overlay.cjs.map +1 -1
  173. package/dist/charts/engine/overlay.d.cts +10 -0
  174. package/dist/charts/engine/overlay.d.ts +10 -0
  175. package/dist/charts/engine/overlay.js +6 -0
  176. package/dist/charts/engine/overlay.js.map +1 -1
  177. package/dist/charts/engine/presets.cjs +2 -2
  178. package/dist/charts/engine/presets.cjs.map +1 -1
  179. package/dist/charts/engine/presets.d.cts +25 -3
  180. package/dist/charts/engine/presets.d.ts +25 -3
  181. package/dist/charts/engine/presets.js +115 -101
  182. package/dist/charts/engine/presets.js.map +1 -1
  183. package/dist/charts/engine/renderers/detect.cjs +1 -1
  184. package/dist/charts/engine/renderers/detect.cjs.map +1 -1
  185. package/dist/charts/engine/renderers/detect.d.cts +2 -1
  186. package/dist/charts/engine/renderers/detect.d.ts +2 -1
  187. package/dist/charts/engine/renderers/detect.js +23 -21
  188. package/dist/charts/engine/renderers/detect.js.map +1 -1
  189. package/dist/charts/engine/scene.cjs +1 -1
  190. package/dist/charts/engine/scene.cjs.map +1 -1
  191. package/dist/charts/engine/scene.d.cts +57 -4
  192. package/dist/charts/engine/scene.d.ts +57 -4
  193. package/dist/charts/engine/scene.js +335 -182
  194. package/dist/charts/engine/scene.js.map +1 -1
  195. package/dist/charts/engine/shapes/bullet.cjs +1 -1
  196. package/dist/charts/engine/shapes/bullet.cjs.map +1 -1
  197. package/dist/charts/engine/shapes/bullet.js +110 -110
  198. package/dist/charts/engine/shapes/bullet.js.map +1 -1
  199. package/dist/charts/engine/shapes/chart.cjs +1 -1
  200. package/dist/charts/engine/shapes/chart.cjs.map +1 -1
  201. package/dist/charts/engine/shapes/chart.js +4 -1
  202. package/dist/charts/engine/shapes/chart.js.map +1 -1
  203. package/dist/charts/engine/shapes/chord.cjs +2 -0
  204. package/dist/charts/engine/shapes/chord.cjs.map +1 -0
  205. package/dist/charts/engine/shapes/chord.d.cts +18 -0
  206. package/dist/charts/engine/shapes/chord.d.ts +18 -0
  207. package/dist/charts/engine/shapes/chord.js +414 -0
  208. package/dist/charts/engine/shapes/chord.js.map +1 -0
  209. package/dist/charts/engine/shapes/draw.cjs +1 -1
  210. package/dist/charts/engine/shapes/draw.cjs.map +1 -1
  211. package/dist/charts/engine/shapes/draw.d.cts +5 -1
  212. package/dist/charts/engine/shapes/draw.d.ts +5 -1
  213. package/dist/charts/engine/shapes/draw.js +47 -17
  214. package/dist/charts/engine/shapes/draw.js.map +1 -1
  215. package/dist/charts/engine/shapes/hit.cjs +1 -1
  216. package/dist/charts/engine/shapes/hit.cjs.map +1 -1
  217. package/dist/charts/engine/shapes/hit.d.cts +3 -1
  218. package/dist/charts/engine/shapes/hit.d.ts +3 -1
  219. package/dist/charts/engine/shapes/hit.js +75 -46
  220. package/dist/charts/engine/shapes/hit.js.map +1 -1
  221. package/dist/charts/engine/shapes/index.d.cts +3 -2
  222. package/dist/charts/engine/shapes/index.d.ts +3 -2
  223. package/dist/charts/engine/shapes/labels.cjs +1 -1
  224. package/dist/charts/engine/shapes/labels.cjs.map +1 -1
  225. package/dist/charts/engine/shapes/labels.js +12 -4
  226. package/dist/charts/engine/shapes/labels.js.map +1 -1
  227. package/dist/charts/engine/shapes/layout.cjs +2 -2
  228. package/dist/charts/engine/shapes/layout.cjs.map +1 -1
  229. package/dist/charts/engine/shapes/layout.d.cts +3 -1
  230. package/dist/charts/engine/shapes/layout.d.ts +3 -1
  231. package/dist/charts/engine/shapes/layout.js +106 -78
  232. package/dist/charts/engine/shapes/layout.js.map +1 -1
  233. package/dist/charts/engine/shapes/scene.cjs +1 -1
  234. package/dist/charts/engine/shapes/scene.cjs.map +1 -1
  235. package/dist/charts/engine/shapes/scene.d.cts +33 -3
  236. package/dist/charts/engine/shapes/scene.d.ts +33 -3
  237. package/dist/charts/engine/shapes/scene.js +62 -19
  238. package/dist/charts/engine/shapes/scene.js.map +1 -1
  239. package/dist/charts/engine/shapes/types.d.cts +119 -8
  240. package/dist/charts/engine/shapes/types.d.ts +119 -8
  241. package/dist/charts/engine/signature.cjs +1 -1
  242. package/dist/charts/engine/signature.cjs.map +1 -1
  243. package/dist/charts/engine/signature.js +1 -1
  244. package/dist/charts/engine/signature.js.map +1 -1
  245. package/dist/charts/engine/three-d/canvas2d.cjs +1 -1
  246. package/dist/charts/engine/three-d/canvas2d.cjs.map +1 -1
  247. package/dist/charts/engine/three-d/canvas2d.d.cts +5 -2
  248. package/dist/charts/engine/three-d/canvas2d.d.ts +5 -2
  249. package/dist/charts/engine/three-d/canvas2d.js +89 -65
  250. package/dist/charts/engine/three-d/canvas2d.js.map +1 -1
  251. package/dist/charts/engine/three-d/detect.cjs +1 -1
  252. package/dist/charts/engine/three-d/detect.cjs.map +1 -1
  253. package/dist/charts/engine/three-d/detect.d.cts +3 -2
  254. package/dist/charts/engine/three-d/detect.d.ts +3 -2
  255. package/dist/charts/engine/three-d/detect.js +22 -20
  256. package/dist/charts/engine/three-d/detect.js.map +1 -1
  257. package/dist/charts/engine/three-d/geometry.cjs +1 -1
  258. package/dist/charts/engine/three-d/geometry.cjs.map +1 -1
  259. package/dist/charts/engine/three-d/geometry.d.cts +6 -0
  260. package/dist/charts/engine/three-d/geometry.d.ts +6 -0
  261. package/dist/charts/engine/three-d/geometry.js +106 -90
  262. package/dist/charts/engine/three-d/geometry.js.map +1 -1
  263. package/dist/charts/engine/three-d/model.cjs +1 -1
  264. package/dist/charts/engine/three-d/model.cjs.map +1 -1
  265. package/dist/charts/engine/three-d/model.d.cts +2 -0
  266. package/dist/charts/engine/three-d/model.d.ts +2 -0
  267. package/dist/charts/engine/three-d/model.js +2 -0
  268. package/dist/charts/engine/three-d/model.js.map +1 -1
  269. package/dist/charts/engine/three-d/overlay.cjs +1 -1
  270. package/dist/charts/engine/three-d/overlay.cjs.map +1 -1
  271. package/dist/charts/engine/three-d/overlay.js +43 -36
  272. package/dist/charts/engine/three-d/overlay.js.map +1 -1
  273. package/dist/charts/engine/three-d/render-types.cjs +1 -1
  274. package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
  275. package/dist/charts/engine/three-d/render-types.d.cts +24 -3
  276. package/dist/charts/engine/three-d/render-types.d.ts +24 -3
  277. package/dist/charts/engine/three-d/render-types.js +6 -7
  278. package/dist/charts/engine/three-d/render-types.js.map +1 -1
  279. package/dist/charts/engine/three-d/shaders.cjs +63 -28
  280. package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
  281. package/dist/charts/engine/three-d/shaders.d.cts +2 -3
  282. package/dist/charts/engine/three-d/shaders.d.ts +2 -3
  283. package/dist/charts/engine/three-d/shaders.js +41 -22
  284. package/dist/charts/engine/three-d/shaders.js.map +1 -1
  285. package/dist/charts/engine/three-d/sort.cjs +1 -1
  286. package/dist/charts/engine/three-d/sort.cjs.map +1 -1
  287. package/dist/charts/engine/three-d/sort.d.cts +15 -4
  288. package/dist/charts/engine/three-d/sort.d.ts +15 -4
  289. package/dist/charts/engine/three-d/sort.js +117 -43
  290. package/dist/charts/engine/three-d/sort.js.map +1 -1
  291. package/dist/charts/engine/three-d/types.d.cts +27 -0
  292. package/dist/charts/engine/three-d/types.d.ts +27 -0
  293. package/dist/charts/engine/three-d/webgl.cjs +1 -1
  294. package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
  295. package/dist/charts/engine/three-d/webgl.js +15 -13
  296. package/dist/charts/engine/three-d/webgl.js.map +1 -1
  297. package/dist/charts/engine/three-d/webgpu.cjs +1 -1
  298. package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
  299. package/dist/charts/engine/three-d/webgpu.js +50 -39
  300. package/dist/charts/engine/three-d/webgpu.js.map +1 -1
  301. package/dist/charts/engine/trading/chart.cjs +1 -1
  302. package/dist/charts/engine/trading/chart.cjs.map +1 -1
  303. package/dist/charts/engine/trading/chart.d.cts +10 -0
  304. package/dist/charts/engine/trading/chart.d.ts +10 -0
  305. package/dist/charts/engine/trading/chart.js +1475 -776
  306. package/dist/charts/engine/trading/chart.js.map +1 -1
  307. package/dist/charts/engine/trading/drawings.cjs +2 -1
  308. package/dist/charts/engine/trading/drawings.cjs.map +1 -1
  309. package/dist/charts/engine/trading/drawings.d.cts +47 -9
  310. package/dist/charts/engine/trading/drawings.d.ts +47 -9
  311. package/dist/charts/engine/trading/drawings.js +338 -75
  312. package/dist/charts/engine/trading/drawings.js.map +1 -1
  313. package/dist/charts/engine/trading/format.cjs +1 -1
  314. package/dist/charts/engine/trading/format.cjs.map +1 -1
  315. package/dist/charts/engine/trading/format.d.cts +13 -0
  316. package/dist/charts/engine/trading/format.d.ts +13 -0
  317. package/dist/charts/engine/trading/format.js +51 -19
  318. package/dist/charts/engine/trading/format.js.map +1 -1
  319. package/dist/charts/engine/trading/index.cjs +1 -1
  320. package/dist/charts/engine/trading/index.d.cts +2 -1
  321. package/dist/charts/engine/trading/index.d.ts +2 -1
  322. package/dist/charts/engine/trading/index.js +4 -3
  323. package/dist/charts/engine/trading/indicators.cjs +1 -1
  324. package/dist/charts/engine/trading/indicators.cjs.map +1 -1
  325. package/dist/charts/engine/trading/indicators.d.cts +180 -10
  326. package/dist/charts/engine/trading/indicators.d.ts +180 -10
  327. package/dist/charts/engine/trading/indicators.js +449 -173
  328. package/dist/charts/engine/trading/indicators.js.map +1 -1
  329. package/dist/charts/engine/trading/labels.cjs +1 -1
  330. package/dist/charts/engine/trading/labels.cjs.map +1 -1
  331. package/dist/charts/engine/trading/labels.js +84 -4
  332. package/dist/charts/engine/trading/labels.js.map +1 -1
  333. package/dist/charts/engine/trading/store.cjs +1 -1
  334. package/dist/charts/engine/trading/store.cjs.map +1 -1
  335. package/dist/charts/engine/trading/store.d.cts +21 -0
  336. package/dist/charts/engine/trading/store.d.ts +21 -0
  337. package/dist/charts/engine/trading/store.js +22 -1
  338. package/dist/charts/engine/trading/store.js.map +1 -1
  339. package/dist/charts/engine/trading/studies.cjs +1 -1
  340. package/dist/charts/engine/trading/studies.cjs.map +1 -1
  341. package/dist/charts/engine/trading/studies.d.cts +41 -8
  342. package/dist/charts/engine/trading/studies.d.ts +41 -8
  343. package/dist/charts/engine/trading/studies.js +349 -93
  344. package/dist/charts/engine/trading/studies.js.map +1 -1
  345. package/dist/charts/engine/trading/sync.cjs +2 -0
  346. package/dist/charts/engine/trading/sync.cjs.map +1 -0
  347. package/dist/charts/engine/trading/sync.d.cts +8 -0
  348. package/dist/charts/engine/trading/sync.d.ts +8 -0
  349. package/dist/charts/engine/trading/sync.js +25 -0
  350. package/dist/charts/engine/trading/sync.js.map +1 -0
  351. package/dist/charts/engine/trading/types.d.cts +484 -9
  352. package/dist/charts/engine/trading/types.d.ts +484 -9
  353. package/dist/charts/engine/types.d.cts +82 -8
  354. package/dist/charts/engine/types.d.ts +82 -8
  355. package/dist/charts/index.cjs +1 -1
  356. package/dist/charts/index.d.cts +3 -2
  357. package/dist/charts/index.d.ts +3 -2
  358. package/dist/charts/index.js +30 -22
  359. package/dist/charts/react/charts.cjs +1 -1
  360. package/dist/charts/react/charts.cjs.map +1 -1
  361. package/dist/charts/react/charts.js +46 -34
  362. package/dist/charts/react/charts.js.map +1 -1
  363. package/dist/charts/react/graph.cjs +2 -0
  364. package/dist/charts/react/graph.cjs.map +1 -0
  365. package/dist/charts/react/graph.d.cts +213 -0
  366. package/dist/charts/react/graph.d.ts +213 -0
  367. package/dist/charts/react/graph.js +159 -0
  368. package/dist/charts/react/graph.js.map +1 -0
  369. package/dist/charts/react/shapes.cjs +1 -1
  370. package/dist/charts/react/shapes.cjs.map +1 -1
  371. package/dist/charts/react/shapes.d.cts +87 -4
  372. package/dist/charts/react/shapes.d.ts +87 -4
  373. package/dist/charts/react/shapes.js +55 -12
  374. package/dist/charts/react/shapes.js.map +1 -1
  375. package/dist/charts/react/trading.cjs +1 -1
  376. package/dist/charts/react/trading.cjs.map +1 -1
  377. package/dist/charts/react/trading.d.cts +53 -1
  378. package/dist/charts/react/trading.d.ts +53 -1
  379. package/dist/charts/react/trading.js +68 -37
  380. package/dist/charts/react/trading.js.map +1 -1
  381. package/dist/charts/react/types.d.cts +11 -0
  382. package/dist/charts/react/types.d.ts +11 -0
  383. package/dist/core/contracts.cjs +1 -1
  384. package/dist/core/contracts.cjs.map +1 -1
  385. package/dist/core/contracts.js +1 -1
  386. package/dist/core/contracts.js.map +1 -1
  387. package/dist/native/charts/src/canvas.cjs +1 -1
  388. package/dist/native/charts/src/canvas.js +3 -3
  389. package/dist/native/charts/src/engine/axis.cjs +1 -1
  390. package/dist/native/charts/src/engine/axis.cjs.map +1 -1
  391. package/dist/native/charts/src/engine/axis.js +42 -19
  392. package/dist/native/charts/src/engine/axis.js.map +1 -1
  393. package/dist/native/charts/src/engine/color.cjs +1 -1
  394. package/dist/native/charts/src/engine/color.cjs.map +1 -1
  395. package/dist/native/charts/src/engine/color.js +47 -5
  396. package/dist/native/charts/src/engine/color.js.map +1 -1
  397. package/dist/native/charts/src/engine/controller.cjs +2 -2
  398. package/dist/native/charts/src/engine/controller.cjs.map +1 -1
  399. package/dist/native/charts/src/engine/controller.js +300 -253
  400. package/dist/native/charts/src/engine/controller.js.map +1 -1
  401. package/dist/native/charts/src/engine/data.cjs +1 -1
  402. package/dist/native/charts/src/engine/data.cjs.map +1 -1
  403. package/dist/native/charts/src/engine/data.js +6 -4
  404. package/dist/native/charts/src/engine/data.js.map +1 -1
  405. package/dist/native/charts/src/engine/format.cjs +1 -1
  406. package/dist/native/charts/src/engine/format.cjs.map +1 -1
  407. package/dist/native/charts/src/engine/format.js +15 -2
  408. package/dist/native/charts/src/engine/format.js.map +1 -1
  409. package/dist/native/charts/src/engine/labels.cjs +1 -1
  410. package/dist/native/charts/src/engine/labels.cjs.map +1 -1
  411. package/dist/native/charts/src/engine/labels.js +28 -4
  412. package/dist/native/charts/src/engine/labels.js.map +1 -1
  413. package/dist/native/charts/src/engine/layout.cjs +1 -1
  414. package/dist/native/charts/src/engine/layout.cjs.map +1 -1
  415. package/dist/native/charts/src/engine/layout.js +11 -2
  416. package/dist/native/charts/src/engine/layout.js.map +1 -1
  417. package/dist/native/charts/src/engine/model.cjs +1 -1
  418. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  419. package/dist/native/charts/src/engine/model.js +252 -171
  420. package/dist/native/charts/src/engine/model.js.map +1 -1
  421. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  422. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  423. package/dist/native/charts/src/engine/presets.cjs +2 -2
  424. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  425. package/dist/native/charts/src/engine/presets.js +104 -90
  426. package/dist/native/charts/src/engine/presets.js.map +1 -1
  427. package/dist/native/charts/src/engine/scene.cjs +1 -1
  428. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  429. package/dist/native/charts/src/engine/scene.js +341 -188
  430. package/dist/native/charts/src/engine/scene.js.map +1 -1
  431. package/dist/native/charts/src/engine/shapes/bullet.cjs +1 -1
  432. package/dist/native/charts/src/engine/shapes/bullet.cjs.map +1 -1
  433. package/dist/native/charts/src/engine/shapes/bullet.js +110 -110
  434. package/dist/native/charts/src/engine/shapes/bullet.js.map +1 -1
  435. package/dist/native/charts/src/engine/shapes/calendar.cjs +1 -1
  436. package/dist/native/charts/src/engine/shapes/calendar.cjs.map +1 -1
  437. package/dist/native/charts/src/engine/shapes/calendar.js +21 -16
  438. package/dist/native/charts/src/engine/shapes/calendar.js.map +1 -1
  439. package/dist/native/charts/src/engine/shapes/chord.cjs +2 -0
  440. package/dist/native/charts/src/engine/shapes/chord.cjs.map +1 -0
  441. package/dist/native/charts/src/engine/shapes/chord.js +414 -0
  442. package/dist/native/charts/src/engine/shapes/chord.js.map +1 -0
  443. package/dist/native/charts/src/engine/shapes/draw.cjs +1 -1
  444. package/dist/native/charts/src/engine/shapes/draw.cjs.map +1 -1
  445. package/dist/native/charts/src/engine/shapes/draw.js +47 -17
  446. package/dist/native/charts/src/engine/shapes/draw.js.map +1 -1
  447. package/dist/native/charts/src/engine/shapes/hit.cjs +1 -1
  448. package/dist/native/charts/src/engine/shapes/hit.cjs.map +1 -1
  449. package/dist/native/charts/src/engine/shapes/hit.js +73 -44
  450. package/dist/native/charts/src/engine/shapes/hit.js.map +1 -1
  451. package/dist/native/charts/src/engine/shapes/labels.cjs +1 -1
  452. package/dist/native/charts/src/engine/shapes/labels.cjs.map +1 -1
  453. package/dist/native/charts/src/engine/shapes/labels.js +12 -4
  454. package/dist/native/charts/src/engine/shapes/labels.js.map +1 -1
  455. package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
  456. package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
  457. package/dist/native/charts/src/engine/shapes/layout.js +117 -90
  458. package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
  459. package/dist/native/charts/src/engine/shapes/scene.cjs +1 -1
  460. package/dist/native/charts/src/engine/shapes/scene.cjs.map +1 -1
  461. package/dist/native/charts/src/engine/shapes/scene.js +62 -19
  462. package/dist/native/charts/src/engine/shapes/scene.js.map +1 -1
  463. package/dist/native/components/Chart/scene.cjs +1 -1
  464. package/dist/native/components/Chart/scene.cjs.map +1 -1
  465. package/dist/native/components/Chart/scene.js +140 -71
  466. package/dist/native/components/Chart/scene.js.map +1 -1
  467. package/dist/native/components/Charts/charts.cjs +1 -1
  468. package/dist/native/components/Charts/charts.cjs.map +1 -1
  469. package/dist/native/components/Charts/charts.js +54 -42
  470. package/dist/native/components/Charts/charts.js.map +1 -1
  471. package/dist/native/components/Charts/types.d.cts +11 -0
  472. package/dist/native/components/Charts/types.d.ts +11 -0
  473. package/dist/native/components/ShapeChart/ShapeChartBase.cjs +1 -1
  474. package/dist/native/components/ShapeChart/ShapeChartBase.cjs.map +1 -1
  475. package/dist/native/components/ShapeChart/ShapeChartBase.js +1 -0
  476. package/dist/native/components/ShapeChart/ShapeChartBase.js.map +1 -1
  477. package/dist/native/components/ShapeChart/charts.cjs +1 -1
  478. package/dist/native/components/ShapeChart/charts.cjs.map +1 -1
  479. package/dist/native/components/ShapeChart/charts.d.cts +6 -1
  480. package/dist/native/components/ShapeChart/charts.d.ts +6 -1
  481. package/dist/native/components/ShapeChart/charts.js +138 -96
  482. package/dist/native/components/ShapeChart/charts.js.map +1 -1
  483. package/dist/native/components/ShapeChart/draw.cjs +1 -1
  484. package/dist/native/components/ShapeChart/draw.cjs.map +1 -1
  485. package/dist/native/components/ShapeChart/draw.d.cts +1 -1
  486. package/dist/native/components/ShapeChart/draw.d.ts +1 -1
  487. package/dist/native/components/ShapeChart/draw.js +26 -17
  488. package/dist/native/components/ShapeChart/draw.js.map +1 -1
  489. package/dist/native/components/ShapeChart/geometry.cjs +1 -1
  490. package/dist/native/components/ShapeChart/geometry.cjs.map +1 -1
  491. package/dist/native/components/ShapeChart/geometry.js +138 -59
  492. package/dist/native/components/ShapeChart/geometry.js.map +1 -1
  493. package/dist/native/components/ShapeChart/index.cjs +1 -1
  494. package/dist/native/components/ShapeChart/index.d.cts +1 -1
  495. package/dist/native/components/ShapeChart/index.d.ts +1 -1
  496. package/dist/native/components/ShapeChart/index.js +2 -2
  497. package/dist/native/components/ShapeChart/recorder.cjs +1 -1
  498. package/dist/native/components/ShapeChart/recorder.cjs.map +1 -1
  499. package/dist/native/components/ShapeChart/recorder.d.cts +10 -1
  500. package/dist/native/components/ShapeChart/recorder.d.ts +10 -1
  501. package/dist/native/components/ShapeChart/recorder.js +19 -10
  502. package/dist/native/components/ShapeChart/recorder.js.map +1 -1
  503. package/dist/native/components/ShapeChart/types.d.cts +92 -7
  504. package/dist/native/components/ShapeChart/types.d.ts +92 -7
  505. package/dist/native/index.cjs +1 -1
  506. package/dist/native/index.js +2 -2
  507. package/dist/native/source/components/Chart/scene.tsx +158 -14
  508. package/dist/native/source/components/Charts/charts.tsx +30 -2
  509. package/dist/native/source/components/Charts/types.ts +11 -0
  510. package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +2 -0
  511. package/dist/native/source/components/ShapeChart/charts.tsx +91 -35
  512. package/dist/native/source/components/ShapeChart/draw.tsx +39 -8
  513. package/dist/native/source/components/ShapeChart/geometry.ts +189 -8
  514. package/dist/native/source/components/ShapeChart/index.ts +1 -0
  515. package/dist/native/source/components/ShapeChart/recorder.ts +20 -5
  516. package/dist/native/source/components/ShapeChart/types.ts +96 -5
  517. package/dist/native/source/manifest.ts +1 -0
  518. package/dist/taro/charts.d.ts +25 -5
  519. package/dist/taro/index.js +3900 -2836
  520. package/dist/taro/shape-charts.d.ts +96 -4
  521. package/dist/uni/AreaChart.vue.d.ts +5 -1
  522. package/dist/uni/Badge.vue.d.ts +1 -1
  523. package/dist/uni/BarChart.vue.d.ts +5 -1
  524. package/dist/uni/BoxPlotChart.vue.d.ts +8 -0
  525. package/dist/uni/BubbleChart.vue.d.ts +4 -0
  526. package/dist/uni/BulletChart.vue.d.ts +4 -0
  527. package/dist/uni/CalendarHeatmap.vue.d.ts +2 -0
  528. package/dist/uni/CandlestickChart.vue.d.ts +4 -0
  529. package/dist/uni/Chart.vue.d.ts +4 -0
  530. package/dist/uni/ChordChart.vue +93 -0
  531. package/dist/uni/ChordChart.vue.d.ts +136 -0
  532. package/dist/uni/DonutChart.vue.d.ts +4 -0
  533. package/dist/uni/FunnelChart.vue.d.ts +4 -0
  534. package/dist/uni/GanttChart.vue.d.ts +4 -0
  535. package/dist/uni/GaugeChart.vue.d.ts +4 -0
  536. package/dist/uni/HeatmapChart.vue.d.ts +8 -2
  537. package/dist/uni/HistogramChart.vue.d.ts +4 -0
  538. package/dist/uni/HorizontalBarChart.vue.d.ts +3 -1
  539. package/dist/uni/LineChart.vue.d.ts +4 -0
  540. package/dist/uni/MixedChart.vue.d.ts +4 -0
  541. package/dist/uni/PieChart.vue.d.ts +4 -0
  542. package/dist/uni/QuadrantChart.vue.d.ts +4 -0
  543. package/dist/uni/RadarChart.vue.d.ts +4 -0
  544. package/dist/uni/RadialBarChart.vue.d.ts +4 -0
  545. package/dist/uni/RangeAreaChart.vue.d.ts +4 -0
  546. package/dist/uni/SankeyChart.vue.d.ts +4 -0
  547. package/dist/uni/ScatterChart.vue.d.ts +4 -0
  548. package/dist/uni/Sparkline.vue.d.ts +4 -0
  549. package/dist/uni/SunburstChart.vue.d.ts +4 -0
  550. package/dist/uni/ToastProvider.vue.d.ts +1 -1
  551. package/dist/uni/TreemapChart.vue.d.ts +4 -0
  552. package/dist/uni/WaterfallChart.vue.d.ts +9 -0
  553. package/dist/uni/chart-canvas.d.ts +3 -0
  554. package/dist/uni/chart-canvas.js +4 -0
  555. package/dist/uni/chart-types.d.ts +28 -4
  556. package/dist/uni/chart-types.js +26 -2
  557. package/dist/uni/charts-canvas.js +1 -1
  558. package/dist/uni/index.d.ts +2 -1
  559. package/dist/uni/index.js +1 -0
  560. package/dist/uni/manifest.d.ts +7 -0
  561. package/dist/uni/manifest.js +10 -0
  562. package/dist/uni/named-chart-options.d.ts +9 -2
  563. package/dist/uni/named-chart-options.js +18 -1
  564. package/dist/uni/shape-chart-canvas.d.ts +3 -1
  565. package/dist/uni/shape-chart-canvas.js +15 -24
  566. package/dist/uni/shape-chart-types.d.ts +52 -2
  567. package/dist/uni/shape-chart-types.js +44 -0
  568. package/dist/vue/charts-global.d.ts +48 -0
  569. package/dist/vue/charts.d.ts +18 -0
  570. package/dist/vue/charts.js +56 -0
  571. package/dist/vue/charts.js.map +1 -0
  572. package/dist/vue/components/Chart/BoxPlotChart.vue.d.ts +8 -0
  573. package/dist/vue/components/Chart/BoxPlotChart.vue.js.map +1 -1
  574. package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js +8 -2
  575. package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  576. package/dist/vue/components/Chart/ChordChart.vue.d.ts +153 -0
  577. package/dist/vue/components/Chart/ChordChart.vue.js +7 -0
  578. package/dist/vue/components/Chart/ChordChart.vue.js.map +1 -0
  579. package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js +81 -0
  580. package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  581. package/dist/vue/components/Chart/DependencyGraph.vue.d.ts +179 -0
  582. package/dist/vue/components/Chart/DependencyGraph.vue.js +7 -0
  583. package/dist/vue/components/Chart/DependencyGraph.vue.js.map +1 -0
  584. package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js +65 -0
  585. package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js.map +1 -0
  586. package/dist/vue/components/Chart/GanttChart.vue.d.ts +4 -0
  587. package/dist/vue/components/Chart/GanttChart.vue.js.map +1 -1
  588. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js +4 -1
  589. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  590. package/dist/vue/components/Chart/GraphChart.vue.d.ts +184 -0
  591. package/dist/vue/components/Chart/GraphChart.vue.js +7 -0
  592. package/dist/vue/components/Chart/GraphChart.vue.js.map +1 -0
  593. package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js +62 -0
  594. package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  595. package/dist/vue/components/Chart/HeatmapChart.vue.d.ts +9 -5
  596. package/dist/vue/components/Chart/HeatmapChart.vue.js.map +1 -1
  597. package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js +3 -1
  598. package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  599. package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +2 -0
  600. package/dist/vue/components/Chart/TimeAndSales.vue.d.ts +2 -0
  601. package/dist/vue/components/Chart/TradingChart.vue.d.ts +49 -1
  602. package/dist/vue/components/Chart/TradingChart.vue.js.map +1 -1
  603. package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js +31 -0
  604. package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  605. package/dist/vue/components/Chart/TreeChart.vue.d.ts +172 -0
  606. package/dist/vue/components/Chart/TreeChart.vue.js +7 -0
  607. package/dist/vue/components/Chart/TreeChart.vue.js.map +1 -0
  608. package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js +56 -0
  609. package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  610. package/dist/vue/components/Chart/WaterfallChart.vue.d.ts +12 -1
  611. package/dist/vue/components/Chart/WaterfallChart.vue.js.map +1 -1
  612. package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js +8 -2
  613. package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  614. package/dist/vue/components/Chart/graph.d.ts +153 -0
  615. package/dist/vue/components/Chart/graph.js +135 -0
  616. package/dist/vue/components/Chart/graph.js.map +1 -0
  617. package/dist/vue/components/Chart/index.d.ts +5 -1
  618. package/dist/vue/components/Chart/index.js +5 -1
  619. package/dist/vue/components/Chart/orderbook.d.ts +5 -1
  620. package/dist/vue/components/Chart/orderbook.js +2 -0
  621. package/dist/vue/components/Chart/orderbook.js.map +1 -1
  622. package/dist/vue/components/Chart/trading.d.ts +24 -2
  623. package/dist/vue/components/Chart/trading.js +8 -0
  624. package/dist/vue/components/Chart/trading.js.map +1 -1
  625. package/dist/vue/components/Chart/types.d.ts +74 -2
  626. package/dist/vue/global.d.ts +2 -38
  627. package/dist/vue/groups/charts.js +10 -2
  628. package/dist/vue/groups/charts.js.map +1 -1
  629. package/dist/vue/index.js +6 -2
  630. package/dist/vue/internal/register.d.ts +7 -0
  631. package/dist/vue/internal/register.js +14 -0
  632. package/dist/vue/internal/register.js.map +1 -0
  633. package/dist/vue/plugin.d.ts +9 -4
  634. package/dist/vue/plugin.js +6 -11
  635. package/dist/vue/plugin.js.map +1 -1
  636. package/dist/weapp/charts/canvas.js +1687 -147
  637. package/dist/weapp/charts/core.js +1 -0
  638. package/dist/weapp/chord-chart/index.js +1 -0
  639. package/dist/weapp/chord-chart/index.json +1 -0
  640. package/dist/weapp/chord-chart/index.wxml +1 -0
  641. package/dist/weapp/chord-chart/index.wxss +1 -0
  642. package/dist/weapp/controls.js +92 -32
  643. package/dist/weapp/types.d.ts +87 -4
  644. package/dist/web-components/components/chart/charts.d.ts +4 -2
  645. package/dist/web-components/components/chart/charts.js +8 -1
  646. package/dist/web-components/components/chart/charts.js.map +1 -1
  647. package/dist/web-components/components/chart/extended.d.ts +17 -7
  648. package/dist/web-components/components/chart/extended.js +23 -9
  649. package/dist/web-components/components/chart/extended.js.map +1 -1
  650. package/dist/web-components/components/chart/shapes-extended.d.ts +37 -1
  651. package/dist/web-components/components/chart/shapes-extended.js +27 -1
  652. package/dist/web-components/components/chart/shapes-extended.js.map +1 -1
  653. package/dist/web-components/components/graph/graph.d.ts +154 -0
  654. package/dist/web-components/components/graph/graph.js +149 -0
  655. package/dist/web-components/components/graph/graph.js.map +1 -0
  656. package/dist/web-components/components/trading-chart/trading-chart.d.ts +49 -2
  657. package/dist/web-components/components/trading-chart/trading-chart.js +62 -0
  658. package/dist/web-components/components/trading-chart/trading-chart.js.map +1 -1
  659. package/dist/web-components/elements/chart.d.ts +1 -1
  660. package/dist/web-components/elements/chart.js +6 -5
  661. package/dist/web-components/elements/chart.js.map +1 -1
  662. package/dist/web-components/elements/graph.d.ts +2 -0
  663. package/dist/web-components/elements/graph.js +12 -0
  664. package/dist/web-components/elements/graph.js.map +1 -0
  665. package/dist/web-components/html-custom-data.json +273 -4
  666. package/dist/web-components/types/react.d.ts +63 -4
  667. package/dist/web-components/types/solid.d.ts +55 -8
  668. package/dist/web-components/types/svelte.d.ts +55 -8
  669. package/dist/web-components/types/vue.d.ts +55 -4
  670. package/package.json +16 -1
@@ -1 +1 @@
1
- {"version":3,"file":"heatmap.js","names":["CHUNK","LUT_SIZE","DARK_RAMP","LIGHT_RAMP","LABELS","heatIntensity","size","max","r","contrast","scale","createOrderBookHeatmap","options","initial","store","createOrderBookStore","emitter","createEmitter","fmt","createFormatters","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","createHost","container","refreshColors","markAllDirty","root","texts","localeLabels","labels","applyTexts","interval","history","depth","nowTime","elapsed","perfNow","theme","sideColors","value","dark","luminance","stops","i","c","rampColor","packColor","refreshFormat","decimalsOf","inferPriceDecimals","inferSizeDecimals","id","clearHistory","ensureTick","base","inferTickSize","mid","ratio","multiple","p","m","roundToStep","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","clamp","lineItems","build","points","write","y","GAP","pick","key","headCells","version","draw","ctx","dt","now","l","fontSize","width","live","dpr","height","fontOf","sample","axisW","profileW","timeH","right","ease","center","x0","x1","y0","y1","xOf","t","yOf","canvas","bw","bh","items","head","bubbles","xScale","yScale","yTicks","linearTicks","toCss","xt","timeTicks","px","rowPx","maxSize","sides","w","tag","text","filled","color","roundRect","clear","drawHover","fresh","hide","hx","hy","rowPrice","bestBid","bestAsk","buyVolume","sellVolume","levels","lv","ry","cx0","cx1","cy0","cy1","sideColor","tooltipHtml","doc","formatClock","event","initRenderer","token","next","createRenderer","kind","exclude","setFollow","onPointerDown","localPoint","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.js","names":["CHUNK","LUT_SIZE","DARK_RAMP","LIGHT_RAMP","TAG_HEIGHT","BUBBLE_SPACING","LABELS","heatIntensity","size","max","r","contrast","scale","createOrderBookHeatmap","options","initial","store","createOrderBookStore","emitter","createEmitter","fmt","createFormatters","colors","lut","floor","dark","tick","columns","seq","openStart","open","lastTrade","dataTime","dataWall","scaleMax","bubbleRef","profileMax","chunks","dirtyChunks","itemVersion","headItem","headVersion","origin","renderer","rendererToken","destroyed","resolveReady","ready","resolve","follow","windowSpan","viewX","viewY","viewYReady","yTarget","ySpan","shownTime","lastFrame","plot","hoverAt","hoverKey","drag","host","createHost","container","refreshColors","markAllDirty","root","texts","localeLabels","labels","applyTexts","interval","history","depth","nowTime","elapsed","perfNow","theme","sideColors","c","value","background","luminance","mixOklab","oklabRamp","refreshFormat","decimalsOf","inferPriceDecimals","inferSizeDecimals","id","clearHistory","ensureTick","base","inferTickSize","mid","ratio","multiple","p","m","roundToStep","sampleBook","limit","bins","sizes","n","top","side","count","rows","i","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","tradeBubbles","columnPx","group","t0","t1","flush","add","g","flow","visible","clipPlot","ctx","drawBest","steps","bid","ask","xa","xOf","ya","yOf","toCss","index","color","pen","row","y","xb","drawBubbles","bubbles","ref","maxD","sized","clamp","fontOf","fontSize","text","drawProfile","y0","y1","rowPx","maxSize","sides","levels","niceCeil","left","px","inner","profileW","gap","height","w","best","tw","headCells","version","hoverCell","hx","hy","x0","x1","rowPrice","drawTag","maxWidth","align","filled","roundRect","draw","dt","now","l","width","regular","bold","live","clock","dpr","sample","axisW","timeH","right","fitTimeRange","minSpan","fixed","fitPriceRange","ease","t","floorCss","canvas","bw","bh","items","head","xScale","yScale","yTicks","linearTicks","xt","timeTicks","cell","hoverTime","formatClock","hoverHalf","last","pins","shownPins","hoverY","layout","layoutAxisLabels","at","pin","drawHover","fresh","bestBid","bestAsk","buyVolume","sellVolume","lv","ry","cx0","cx1","cy0","cy1","timeText","sideColor","tooltipHtml","doc","key","event","initRenderer","token","next","createRenderer","kind","exclude","setFollow","clampTime","range","span","onPointerDown","localPoint","onPointerMove","dx","dy","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, over a solid \"floor\" color (the coldest end of\n// the ramp). The best bid / ask step lines, the spread band, the trade\n// bubbles, the grid, the axes, the book profile, the crosshair and the\n// tooltip are drawn on a Canvas2D layer above.\n\nimport { luminance, mixOklab, oklabRamp, toCss, type Rgba } from \"../color\";\nimport { createRenderer } from \"../renderers/detect\";\nimport {\n BAR_STRIDE,\n type BarItem,\n type ChartRenderer,\n type RenderItem,\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 {\n fitPriceRange,\n fitTimeRange,\n layoutAxisLabels,\n niceCeil,\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/** Columns per GPU chunk */\nconst CHUNK = 32;\n/** Colors of the ramp lookup table */\nconst LUT_SIZE = 128;\n\n/**\n * Heat ramps after the floor color, interpolated in OKLab. Dark: lightness\n * rises from deep blue through cyan and green to yellow, then the hottest\n * walls turn orange / red (the Bookmap convention). Light: lightness falls\n * from pale blue through blue and violet to crimson.\n */\nconst DARK_RAMP = [\n \"#0b2140\",\n \"#0f3a70\",\n \"#1259a3\",\n \"#1585bd\",\n \"#1fb3b0\",\n \"#62cf73\",\n \"#d9e04a\",\n \"#ffb23a\",\n \"#ff6a33\",\n];\nconst LIGHT_RAMP = [\n \"#dfecfb\",\n \"#b3d2f5\",\n \"#79abe8\",\n \"#4580d6\",\n \"#3b54b8\",\n \"#5a33a0\",\n \"#962a86\",\n \"#cf2f55\",\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 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: Uint32Array = new Uint32Array(LUT_SIZE);\n /** Color under the cells (no liquidity) */\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 let scaleMax = 0;\n let bubbleRef = 0;\n /** Size at the full width of the profile (eased) */\n let profileMax = 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 /** `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 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 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 // the floor: a shade darker than the surface in dark themes (the cold\n // end of the ramp stays visible on it), the surface in light ones\n floor = dark\n ? mixOklab(background, [0, 0, 0, 1], 0.4)\n : mixOklab(\n background,\n [theme.text[0], theme.text[1], theme.text[2], 1],\n 0.02,\n );\n lut = oklabRamp(\n [\n floor,\n ...(options.colors?.length\n ? options.colors\n : dark\n ? DARK_RAMP\n : LIGHT_RAMP\n ).map(resolve),\n ],\n LUT_SIZE,\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 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 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 /** 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 const rows: [number, number, number][] = visible.map((c) => [\n c.time,\n c.bestBid,\n c.bestAsk,\n ]);\n if (Number.isFinite(openStart))\n rows.push([openStart, store.bestBid(), store.bestAsk()]);\n if (!rows.length) return;\n // wide columns: steps; narrow ones: a line through the column centers\n const steps = columnPx >= 2;\n clipPlot(ctx);\n ctx.beginPath();\n for (const [t, bid, ask] of rows) {\n if (!Number.isFinite(bid) || !Number.isFinite(ask) || !(ask > bid))\n continue;\n const xa = xOf(t);\n const ya = yOf(ask);\n ctx.rect(xa, ya, xOf(t + step) - xa, yOf(bid) - ya);\n }\n ctx.fillStyle = toCss(host.theme.text, dark ? 0.07 : 0.06);\n ctx.fill();\n ctx.lineJoin = \"round\";\n for (const [index, color] of [\n [1, colors.up],\n [2, 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 = xOf(row[0]);\n const xb = xOf(row[0] + step);\n if (steps) {\n if (pen) ctx.lineTo(xa, y);\n else ctx.moveTo(xa, y);\n ctx.lineTo(xb, y);\n } else if (pen) ctx.lineTo((xa + xb) / 2, y);\n else ctx.moveTo((xa + xb) / 2, 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 nice scale, changed only on a clear change (no jumping bars)\n if (\n maxSize > profileMax ||\n maxSize < profileMax * 0.35 ||\n !(profileMax > 0)\n )\n profileMax = niceCeil(maxSize);\n if (!(profileMax > 0)) return;\n const left = px + 3;\n const inner = profileW - 9;\n // guides at half and full scale\n ctx.strokeStyle = toCss(theme.text, 0.09);\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 const gap = rowPx > 3 ? 1 : 0;\n const height = Math.max(1, rowPx - gap);\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 || p > y1) continue;\n const w = Math.max(1, Math.min(inner, (size[i]! / profileMax) * inner));\n ctx.rect(left, yOf(p) - rowPx / 2 + gap / 2, w, height);\n }\n ctx.fillStyle = toCss(color, 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 const w = Math.max(1, Math.min(inner, (size[0]! / profileMax) * inner));\n ctx.fillStyle = toCss(color, 0.95);\n ctx.fillRect(left, yOf(best) - rowPx / 2 + gap / 2, w, height);\n }\n }\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 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 /** 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.11, 44, 96));\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 cells on the GPU, over the floor color\n const floorCss = toCss(floor);\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 if (canvas.dataset.floor !== floorCss) {\n canvas.dataset.floor = floorCss;\n canvas.style.background = floorCss;\n }\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 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 } else {\n ctx.fillStyle = floorCss;\n ctx.fillRect(plot.x, plot.y, plot.w, plot.h);\n }\n if (profileW) {\n ctx.fillStyle = floorCss;\n ctx.fillRect(px, plot.y, profileW, 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 if (x < 20 || x > px - 20) continue;\n const text = xt.format(t);\n if (\n cell &&\n Math.abs(x - cell.hx) < hoverHalf + ctx.measureText(text).width / 2\n )\n 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 : theme.text;\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 },\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 /** 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 markAllDirty();\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 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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"}
@@ -0,0 +1,2 @@
1
+ var e=(e,t,n,r,i,a=2)=>{let[o,s]=i,c=e.map((e,t)=>({label:e,i:t})).filter(({label:e})=>Number.isFinite(e.y)).sort((e,t)=>e.label.y-t.label.y||e.i-t.i),l=t=>{let n=0;t.items.forEach((r,i)=>{n+=e[r].y-t.offsets[i]});let r=n/t.items.length;t.top=Math.max(o,Math.min(r,s-t.height))},u=[];for(let{label:e,i:t}of c){let n={items:[t],offsets:[e.h/2],height:e.h,top:e.y-e.h/2};for(l(n),u.push(n);u.length>1;){let e=u[u.length-1],t=u[u.length-2];if(t.top+t.height+a<=e.top)break;let n=t.height+a;t.items.push(...e.items),t.offsets.push(...e.offsets.map(e=>e+n)),t.height+=a+e.height,u.pop(),l(t)}}let d=e.map(()=>null);for(let e of u)e.items.forEach((t,n)=>{d[t]=e.top+e.offsets[n]});let f=(e,t,n,r)=>Math.abs(e-n)<(t+r)/2+a;t&&d.forEach((n,r)=>{n!==null&&f(n,e[r].h,t.y,t.h)&&(d[r]=null)});let p=[];return d.forEach((t,n)=>{t!==null&&p.push({y:t,h:e[n].h})}),t&&p.push(t),{pinned:d,ticks:n.map(e=>e-r/2>=o&&e+r/2<=s&&!p.some(t=>f(e,r,t.y,t.h)))}},t=(e,t,n,r,i)=>{if(!Number.isFinite(t)||!Number.isFinite(n))return e?[e[0],e[1]]:[NaN,NaN];let a=i!==void 0&&i>0?i:Math.max(r,(n-t)*1.6);if(e&&Number.isFinite(e[0])&&Number.isFinite(e[1])){let r=e[1]-e[0],o=r*.12,s=t>=e[0]+o&&n<=e[1]-o,c=i!==void 0&&i>0?Math.abs(r/i-1)<1e-6:r<=a*1.8;if(s&&c)return[e[0],e[1]]}let o=(t+n)/2;return[o-a/2,o+a/2]},n=(e,t,n,r)=>[t-(Number.isFinite(e)?Math.max(Math.min(r,n),Math.min(n,t-e)):n),t],r=e=>{if(!(e>0)||!Number.isFinite(e))return 0;let t=10**Math.floor(Math.log10(e));for(let n of[1,2,2.5,5,10])if(n*t>=e*(1-1e-9))return n*t;return 10*t};exports.fitPriceRange=t,exports.fitTimeRange=n,exports.layoutAxisLabels=e,exports.niceCeil=r;
2
+ //# sourceMappingURL=layout.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.cjs","names":["layoutAxisLabels","top","bottom","bounds","order","pinned","label","a","b","place","sum","block","item","k","ideal","blocks","i","last","previous","gap","shift","o","centers","overlaps","ah","bh","hover","y","shown","ticks","tickHeight","fitPriceRange","lo","hi","current","want","fixedSpan","minSpan","span","margin","inside","sized","center","fitTimeRange","right","first","window","niceCeil","value","power","m"],"sources":["../../../../../charts/src/engine/orderbook/layout.ts"],"sourcesContent":["// Pure layout helpers of the order book widgets: price-axis label collision\n// resolution and the view fitting of the liquidity heatmap.\n\n/** A label on a vertical axis: center and height, in pixels */\nexport interface AxisLabel {\n y: number;\n h: number;\n}\n\n/** Result of `layoutAxisLabels` */\nexport interface AxisLabelLayout {\n /** Centers of the pinned labels (moved apart), `null` when hidden by the hover label */\n pinned: (number | null)[];\n /** Whether each tick label stays visible */\n ticks: boolean[];\n}\n\n/**\n * Resolves the collisions of the labels of a price axis. Priority: the\n * hover label stays where it is and hides the pinned labels it covers;\n * pinned labels (best bid / ask, last trade) never overlap each other: a\n * group of overlapping ones is stacked, in order, around their desired\n * positions and kept within `bounds`; tick labels under any of them are\n * hidden.\n */\nexport const layoutAxisLabels = (\n pinned: readonly AxisLabel[],\n hover: AxisLabel | null,\n ticks: readonly number[],\n tickHeight: number,\n bounds: readonly [number, number],\n gap = 2,\n): AxisLabelLayout => {\n const [top, bottom] = bounds;\n // blocks of stacked labels, top to bottom\n interface Block {\n items: number[];\n /** Offset of each item's center from the block's top */\n offsets: number[];\n height: number;\n top: number;\n }\n const order = pinned\n .map((label, i) => ({ label, i }))\n .filter(({ label }) => Number.isFinite(label.y))\n .sort((a, b) => a.label.y - b.label.y || a.i - b.i);\n const place = (block: Block) => {\n let sum = 0;\n block.items.forEach((item, k) => {\n sum += pinned[item]!.y - block.offsets[k]!;\n });\n const ideal = sum / block.items.length;\n block.top = Math.max(top, Math.min(ideal, bottom - block.height));\n };\n const blocks: Block[] = [];\n for (const { label, i } of order) {\n const block: Block = {\n items: [i],\n offsets: [label.h / 2],\n height: label.h,\n top: label.y - label.h / 2,\n };\n place(block);\n blocks.push(block);\n // merge with the blocks above while they overlap\n while (blocks.length > 1) {\n const last = blocks[blocks.length - 1]!;\n const previous = blocks[blocks.length - 2]!;\n if (previous.top + previous.height + gap <= last.top) break;\n const shift = previous.height + gap;\n previous.items.push(...last.items);\n previous.offsets.push(...last.offsets.map((o) => o + shift));\n previous.height += gap + last.height;\n blocks.pop();\n place(previous);\n }\n }\n const centers: (number | null)[] = pinned.map(() => null);\n for (const block of blocks) {\n block.items.forEach((item, k) => {\n centers[item] = block.top + block.offsets[k]!;\n });\n }\n const overlaps = (a: number, ah: number, b: number, bh: number) =>\n Math.abs(a - b) < (ah + bh) / 2 + gap;\n if (hover) {\n centers.forEach((y, i) => {\n if (y !== null && overlaps(y, pinned[i]!.h, hover.y, hover.h))\n centers[i] = null;\n });\n }\n const shown: AxisLabel[] = [];\n centers.forEach((y, i) => {\n if (y !== null) shown.push({ y, h: pinned[i]!.h });\n });\n if (hover) shown.push(hover);\n return {\n pinned: centers,\n ticks: ticks.map(\n (y) =>\n y - tickHeight / 2 >= top &&\n y + tickHeight / 2 <= bottom &&\n !shown.some((label) => overlaps(y, tickHeight, label.y, label.h)),\n ),\n };\n};\n\n/**\n * Price range of a following heatmap view, with hysteresis: the current\n * range is kept while the traded prices (`lo` – `hi`, best bid / ask of the\n * window) stay inside its inner part and it is not much too wide; otherwise\n * a range centered on them, `minSpan` or 1.6 × their spread high. With\n * `fixedSpan` (the user zoomed the prices) only the center moves.\n */\nexport const fitPriceRange = (\n current: readonly [number, number] | null,\n lo: number,\n hi: number,\n minSpan: number,\n fixedSpan?: number,\n): [number, number] => {\n if (!Number.isFinite(lo) || !Number.isFinite(hi)) {\n return current ? [current[0], current[1]] : [NaN, NaN];\n }\n const want =\n fixedSpan !== undefined && fixedSpan > 0\n ? fixedSpan\n : Math.max(minSpan, (hi - lo) * 1.6);\n if (current && Number.isFinite(current[0]) && Number.isFinite(current[1])) {\n const span = current[1] - current[0];\n const margin = span * 0.12;\n const inside = lo >= current[0] + margin && hi <= current[1] - margin;\n const sized =\n fixedSpan !== undefined && fixedSpan > 0\n ? Math.abs(span / fixedSpan - 1) < 1e-6\n : span <= want * 1.8;\n if (inside && sized) return [current[0], current[1]];\n }\n const center = (lo + hi) / 2;\n return [center - want / 2, center + want / 2];\n};\n\n/**\n * Time range of a following heatmap view ending at `right`: `window` wide\n * once the data covers it; before that, the span of the data (at least\n * `minSpan`), so a short history fills the plot from the left.\n */\nexport const fitTimeRange = (\n first: number,\n right: number,\n window: number,\n minSpan: number,\n): [number, number] => {\n const span = Number.isFinite(first)\n ? Math.max(Math.min(minSpan, window), Math.min(window, right - first))\n : window;\n return [right - span, right];\n};\n\n/** Smallest \"nice\" number (1, 2, 2.5, 5 × 10ⁿ) at least `value` */\nexport const niceCeil = (value: number): number => {\n if (!(value > 0) || !Number.isFinite(value)) return 0;\n const power = 10 ** Math.floor(Math.log10(value));\n for (const m of [1, 2, 2.5, 5, 10]) {\n if (m * power >= value * (1 - 1e-9)) return m * power;\n }\n return 10 * power;\n};\n"],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /** A label on a vertical axis: center and height, in pixels */
2
+ export interface AxisLabel {
3
+ y: number;
4
+ h: number;
5
+ }
6
+ /** Result of `layoutAxisLabels` */
7
+ export interface AxisLabelLayout {
8
+ /** Centers of the pinned labels (moved apart), `null` when hidden by the hover label */
9
+ pinned: (number | null)[];
10
+ /** Whether each tick label stays visible */
11
+ ticks: boolean[];
12
+ }
13
+ /**
14
+ * Resolves the collisions of the labels of a price axis. Priority: the
15
+ * hover label stays where it is and hides the pinned labels it covers;
16
+ * pinned labels (best bid / ask, last trade) never overlap each other: a
17
+ * group of overlapping ones is stacked, in order, around their desired
18
+ * positions and kept within `bounds`; tick labels under any of them are
19
+ * hidden.
20
+ */
21
+ export declare const layoutAxisLabels: (pinned: readonly AxisLabel[], hover: AxisLabel | null, ticks: readonly number[], tickHeight: number, bounds: readonly [number, number], gap?: number) => AxisLabelLayout;
22
+ /**
23
+ * Price range of a following heatmap view, with hysteresis: the current
24
+ * range is kept while the traded prices (`lo` – `hi`, best bid / ask of the
25
+ * window) stay inside its inner part and it is not much too wide; otherwise
26
+ * a range centered on them, `minSpan` or 1.6 × their spread high. With
27
+ * `fixedSpan` (the user zoomed the prices) only the center moves.
28
+ */
29
+ export declare const fitPriceRange: (current: readonly [number, number] | null, lo: number, hi: number, minSpan: number, fixedSpan?: number) => [number, number];
30
+ /**
31
+ * Time range of a following heatmap view ending at `right`: `window` wide
32
+ * once the data covers it; before that, the span of the data (at least
33
+ * `minSpan`), so a short history fills the plot from the left.
34
+ */
35
+ export declare const fitTimeRange: (first: number, right: number, window: number, minSpan: number) => [number, number];
36
+ /** Smallest "nice" number (1, 2, 2.5, 5 × 10ⁿ) at least `value` */
37
+ export declare const niceCeil: (value: number) => number;
@@ -0,0 +1,37 @@
1
+ /** A label on a vertical axis: center and height, in pixels */
2
+ export interface AxisLabel {
3
+ y: number;
4
+ h: number;
5
+ }
6
+ /** Result of `layoutAxisLabels` */
7
+ export interface AxisLabelLayout {
8
+ /** Centers of the pinned labels (moved apart), `null` when hidden by the hover label */
9
+ pinned: (number | null)[];
10
+ /** Whether each tick label stays visible */
11
+ ticks: boolean[];
12
+ }
13
+ /**
14
+ * Resolves the collisions of the labels of a price axis. Priority: the
15
+ * hover label stays where it is and hides the pinned labels it covers;
16
+ * pinned labels (best bid / ask, last trade) never overlap each other: a
17
+ * group of overlapping ones is stacked, in order, around their desired
18
+ * positions and kept within `bounds`; tick labels under any of them are
19
+ * hidden.
20
+ */
21
+ export declare const layoutAxisLabels: (pinned: readonly AxisLabel[], hover: AxisLabel | null, ticks: readonly number[], tickHeight: number, bounds: readonly [number, number], gap?: number) => AxisLabelLayout;
22
+ /**
23
+ * Price range of a following heatmap view, with hysteresis: the current
24
+ * range is kept while the traded prices (`lo` – `hi`, best bid / ask of the
25
+ * window) stay inside its inner part and it is not much too wide; otherwise
26
+ * a range centered on them, `minSpan` or 1.6 × their spread high. With
27
+ * `fixedSpan` (the user zoomed the prices) only the center moves.
28
+ */
29
+ export declare const fitPriceRange: (current: readonly [number, number] | null, lo: number, hi: number, minSpan: number, fixedSpan?: number) => [number, number];
30
+ /**
31
+ * Time range of a following heatmap view ending at `right`: `window` wide
32
+ * once the data covers it; before that, the span of the data (at least
33
+ * `minSpan`), so a short history fills the plot from the left.
34
+ */
35
+ export declare const fitTimeRange: (first: number, right: number, window: number, minSpan: number) => [number, number];
36
+ /** Smallest "nice" number (1, 2, 2.5, 5 × 10ⁿ) at least `value` */
37
+ export declare const niceCeil: (value: number) => number;
@@ -0,0 +1,70 @@
1
+ //#region src/engine/orderbook/layout.ts
2
+ var e = (e, t, n, r, i, a = 2) => {
3
+ let [o, s] = i, c = e.map((e, t) => ({
4
+ label: e,
5
+ i: t
6
+ })).filter(({ label: e }) => Number.isFinite(e.y)).sort((e, t) => e.label.y - t.label.y || e.i - t.i), l = (t) => {
7
+ let n = 0;
8
+ t.items.forEach((r, i) => {
9
+ n += e[r].y - t.offsets[i];
10
+ });
11
+ let r = n / t.items.length;
12
+ t.top = Math.max(o, Math.min(r, s - t.height));
13
+ }, u = [];
14
+ for (let { label: e, i: t } of c) {
15
+ let n = {
16
+ items: [t],
17
+ offsets: [e.h / 2],
18
+ height: e.h,
19
+ top: e.y - e.h / 2
20
+ };
21
+ for (l(n), u.push(n); u.length > 1;) {
22
+ let e = u[u.length - 1], t = u[u.length - 2];
23
+ if (t.top + t.height + a <= e.top) break;
24
+ let n = t.height + a;
25
+ t.items.push(...e.items), t.offsets.push(...e.offsets.map((e) => e + n)), t.height += a + e.height, u.pop(), l(t);
26
+ }
27
+ }
28
+ let d = e.map(() => null);
29
+ for (let e of u) e.items.forEach((t, n) => {
30
+ d[t] = e.top + e.offsets[n];
31
+ });
32
+ let f = (e, t, n, r) => Math.abs(e - n) < (t + r) / 2 + a;
33
+ t && d.forEach((n, r) => {
34
+ n !== null && f(n, e[r].h, t.y, t.h) && (d[r] = null);
35
+ });
36
+ let p = [];
37
+ return d.forEach((t, n) => {
38
+ t !== null && p.push({
39
+ y: t,
40
+ h: e[n].h
41
+ });
42
+ }), t && p.push(t), {
43
+ pinned: d,
44
+ ticks: n.map((e) => e - r / 2 >= o && e + r / 2 <= s && !p.some((t) => f(e, r, t.y, t.h)))
45
+ };
46
+ }, t = (e, t, n, r, i) => {
47
+ if (!Number.isFinite(t) || !Number.isFinite(n)) return e ? [e[0], e[1]] : [NaN, NaN];
48
+ let a = i !== void 0 && i > 0 ? i : Math.max(r, (n - t) * 1.6);
49
+ if (e && Number.isFinite(e[0]) && Number.isFinite(e[1])) {
50
+ let r = e[1] - e[0], o = r * .12, s = t >= e[0] + o && n <= e[1] - o, c = i !== void 0 && i > 0 ? Math.abs(r / i - 1) < 1e-6 : r <= a * 1.8;
51
+ if (s && c) return [e[0], e[1]];
52
+ }
53
+ let o = (t + n) / 2;
54
+ return [o - a / 2, o + a / 2];
55
+ }, n = (e, t, n, r) => [t - (Number.isFinite(e) ? Math.max(Math.min(r, n), Math.min(n, t - e)) : n), t], r = (e) => {
56
+ if (!(e > 0) || !Number.isFinite(e)) return 0;
57
+ let t = 10 ** Math.floor(Math.log10(e));
58
+ for (let n of [
59
+ 1,
60
+ 2,
61
+ 2.5,
62
+ 5,
63
+ 10
64
+ ]) if (n * t >= e * (1 - 1e-9)) return n * t;
65
+ return 10 * t;
66
+ };
67
+ //#endregion
68
+ export { t as fitPriceRange, n as fitTimeRange, e as layoutAxisLabels, r as niceCeil };
69
+
70
+ //# sourceMappingURL=layout.js.map