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":"chart.js","names":["styleElement","storeUpdate","storeAppend","storePrepend","assign","TIME_AXIS","MIN_AXIS","MAX_SPACING","MIN_PANE","PRICE","UP","DOWN","WARNING","PRIMARY","PRICE_LINE_TITLES","clamp","v","lo","hi","textOn","color","parseColor","fill","luminance","finite","createTradingChart","doc","container","win","options","initial","destroyed","make","tag","style","root","layer","background","foreground","legends","jump","live","store","createStore","pyramid","createPyramid","ha","haValid","haPyramid","studies","studyValid","visibility","compares","dataVersion","tailVersion","detectedPrecision","inferredTimeframe","DAY","spacing","right","plotW","plotH","axisW","width","height","panes","scales","paneHeights","vis","volumeOverlayMax","theme","readTheme","themeVersion","optionsVersion","renderer","rendererToken","frameId","layers","geomKey","builtTail","itemVersion","resolveReady","ready","resolve","pointer","keyboardIndex","gesture","touches","pinch","kinetic","scrollAnim","pendingRange","drawings","emittedDrawings","tool","selected","hovered","draft","drawingCounter","lineOverrides","hoveredLine","lastRange","lastCrosshair","historyFirst","countdownTimer","listeners","emit","type","fn","event","locale","resolveLocale","texts","localeLabels","TRADING_LABELS","resolveTexts","labels","n","redUp","upCss","downCss","css","fallback","toCss","value","alpha","precision","priceFormat","priceFormatter","priceFormatKey","formatPrice","key","timeframe","parseTimeframe","tfMs","font","weight","size","isVisible","study","xOf","index","indexAt","x","timeAt","count","i","indexOfTimeExt","last","time","indexOfTime","display","markDirty","from","c","level","l","p","syncDerived","valid","next","heikinAshiInto","j","lowerBoundTime","afterDataChange","detectPrecision","inferTimeframe","invalidate","rebuildStudies","buildStudies","reused","id","s","rebuildCompares","data","series","a","b","LINE_COLORS","d","followsRealtime","replaceBars","setBars","bars","scale","applyBarsOption","length","inputLength","first","barAt","follow","before","at","updateBar","added","layoutPanes","paneStudies","available","wanted","total","max","k","heights","h","priceHeight","scaleOf","createScale","mode","price","top","paneAt","y","clampView","minSpacing","computeVisible","left","src","cols","pyramidLevel","i0","i1","r0","r1","groupCenter","g","groupValue","values","groupBars","firstVisibleIndex","compareBase","compareScaled","base","toScaled","baselinePrice","autoscale","pane","closeOnly","vol","out","fitScale","timeTicks","tf","intraday","offset","gEnd","groupTime","candidates","prev","shiftTime","boundaryWeight","sample","gap","ctx","pickTicks","t","tickText","paneTickText","formatPercent","scaled","stepDecimals","fromScaled","formatVolume","formatFixed","studyValueText","createLayers","result","up","down","upP","packColor","downP","bg","metrics","candleMetrics","dpr","X","histogramHalf","volumeColors","bottom","Y","yOf","lineLayer","buffer","LineBuffer","isLive","ga","gb","toY","lineWidth","st","BarBuffer","pixelRange","yOfScaled","lineColor","area","AreaBuffer","yb","upArea","downArea","upLine","downLine","px","py","point","hollow","ohlc","wick","body","wicks","bodies","caps","ticks","tick","o","cx","wt","wb","range","clampRange","side","bt","bb","segments","edges","box","items","y0","strong","faded","mix","runLayer","lastMain","version","item","renderData","canvas","bw","bh","sizeCanvas","w","roundRect","r","paintBackground","grid","showGrid","ys","ui","li","upper","lower","started","back","flush","ya","axisLabel","second","textColor","text","priceAxisText","line","kind","linePrice","crosshairState","bar","valueAt","best","yy","drawingMapper","formatSpan","abs","ms","parts","days","hours","HOUR","minutes","MINUTE","paintForeground","muted","bgCss","upC","downC","hiG","loG","below","leftSide","label","stack","many","marker","sell","anchor","dir","tip","mapper","context","drawing","paintDrawing","lastClose","lineStyle","setDash","titleKey","title","pnl","pnlFill","widths","part","grip","lastLine","lastColor","covered","start","end","date","formatCountdown","cross","labelBg","scaledAt","textValue","formatCrosshairTime","legendKey","legendRows","legendBoxes","legendBox","legendRow","row","button","updateLegends","outputs","span","buildLegends","priceBox","head","titleOf","setSpan","prevClose","change","html","name","escapeHtml","pct","shown","slots","prefix","ch","frame","animate","active","now","eased","dt","measureAxis","widest","animating","fg","pass","applyRange","scaleTicks","bands","updateJump","emitView","show","visibleRange","readBar","local","rect","zoomAt","factor","anchorAt","setTool","notify","select","commitDrawings","finishDraft","done","hitLine","hitDrawingAt","hit","hitDrawing","separatorAt","updateCursor","cursor","nextHover","onPointerDown","sep","above","anchorCount","onPointerMove","distance","mid","dx","panScale","zoomScale","lastIndex","dy","nextBelow","step","di","ds","points","onPointerUp","onPointerLeave","onWheel","unit","modifier","onDoubleClick","instance","announce","page","move","current","target","keyboard","resizeObserver","refreshTheme","themeColorsChanged","unwatchTheme","watchTheme","langObserver","applyStatic","initRenderer","token","createRenderer","createDataCanvas","exclude","symbol","wantTimer","applyOptions","previous","appendBars","prependBars","animateScroll","to","visible","set","listener"],"sources":["../../../../../charts/src/engine/trading/chart.ts"],"sourcesContent":["// Trading chart: candles (or bars, lines, areas...) over a gap-free index\n// axis, indicator panes, price lines, markers, drawings and streaming.\n//\n// Layers, bottom to top: a Canvas2D background (grid, bands, watermark),\n// the GPU data canvas covering every pane (candles, volumes, indicator\n// lines, baked in device pixels), a Canvas2D overlay (axes, labels, price\n// lines, markers, drawings, crosshair) and DOM legends. The GPU items are\n// rebuilt only when the view, the scales or the data change; a tick\n// rebuilds only the items of the last bar.\n\nimport {\n luminance,\n mix,\n packColor,\n parseColor,\n toCss,\n type Rgba,\n} from \"../color\";\nimport { createDataCanvas, styleElement } from \"../dom\";\nimport { createRenderer } from \"../renderers/detect\";\nimport type { ChartRenderer, RenderItem } from \"../renderers/types\";\nimport { stepDecimals } from \"../scale\";\nimport {\n readTheme,\n themeColorsChanged,\n watchTheme,\n type ChartTheme,\n} from \"../theme\";\nimport type { ChartRendererKind } from \"../types\";\nimport { localeLabels, resolveLocale } from \"../locale\";\nimport {\n anchorCount,\n hitDrawing,\n paintDrawing,\n setDash,\n type DrawingMapper,\n} from \"./drawings\";\nimport {\n DAY,\n HOUR,\n MINUTE,\n boundaryWeight,\n detectPrecision,\n formatCountdown,\n formatCrosshairTime,\n formatFixed,\n formatPercent,\n formatVolume,\n inferTimeframe,\n pickTicks,\n priceFormatter,\n shiftTime,\n tickText,\n} from \"./format\";\nimport {\n AreaBuffer,\n BarBuffer,\n LineBuffer,\n candleMetrics,\n clampRange,\n pixelRange,\n} from \"./geometry\";\nimport { heikinAshiInto, parseTimeframe } from \"./indicators\";\nimport { TRADING_LABELS, fill, type TradingTexts } from \"./labels\";\nimport {\n createScale,\n fitScale,\n fromScaled,\n panScale,\n scaleTicks,\n scaledAt,\n toScaled,\n valueAt,\n yOf,\n yOfScaled,\n zoomScale,\n type PaneScale,\n} from \"./scale\";\nimport {\n appendBars as storeAppend,\n createPyramid,\n createStore,\n indexOfTime,\n inputLength,\n barAt,\n prependBars as storePrepend,\n pyramidLevel,\n readBar,\n setBars as storeSet,\n updateBar as storeUpdate,\n lowerBoundTime,\n type OhlcColumns,\n} from \"./store\";\nimport { LINE_COLORS, buildStudies, type Study } from \"./studies\";\nimport type {\n TradingBarsInput,\n TradingChartEventMap,\n TradingChartInstance,\n TradingChartOptions,\n TradingCrosshairEvent,\n TradingDrawing,\n TradingDrawingPoint,\n TradingDrawingTool,\n TradingPriceLine,\n TradingScaleMode,\n TradingVisibleRange,\n} from \"./types\";\n\nconst TIME_AXIS = 28;\nconst MIN_AXIS = 60;\nconst MAX_SPACING = 60;\nconst MIN_PANE = 48;\nconst PRICE = \"price\";\nconst UP = \"var(--success-color, #089981)\";\nconst DOWN = \"var(--danger-color, #f23645)\";\nconst WARNING = \"var(--warning-color, #f59e0b)\";\nconst PRIMARY = \"var(--primary-color, #2962ff)\";\n\nconst PRICE_LINE_TITLES: Record<string, keyof TradingTexts | undefined> = {\n order: \"limit\",\n position: \"position\",\n takeProfit: \"takeProfit\",\n stopLoss: \"stopLoss\",\n alert: \"alert\",\n};\n\nconst clamp = (v: number, lo: number, hi: number) =>\n v < lo ? lo : v > hi ? hi : v;\n\n/** Readable text on a fill (a CSS color): dark on light fills, white otherwise */\nconst textOn = (fill: string) => {\n const color = parseColor(fill);\n return color && luminance(color) > 0.5 ? \"#0b0e11\" : \"#fff\";\n};\n\nconst finite = Number.isFinite;\n\ninterface Pane {\n id: string;\n study: Study | null;\n scale: PaneScale;\n top: number;\n height: number;\n ticks: number[];\n step: number;\n}\n\n/** Bars drawn: a level of the pyramid and the groups in view */\ninterface Visible {\n /** Logical index at the left edge */\n left: number;\n level: number;\n /** Bars per group */\n size: number;\n cols: OhlcColumns;\n /** Groups drawn (one extra on each side) */\n g0: number;\n g1: number;\n /** Groups whose center is in the plot */\n s0: number;\n s1: number;\n /** Last group */\n last: number;\n}\n\ninterface LegendRow {\n row: HTMLDivElement;\n values: HTMLSpanElement[];\n button: HTMLButtonElement | null;\n}\n\ntype Layer = (ga: number, gb: number, live: boolean) => RenderItem[];\n\n/** Interaction in progress */\ntype Gesture =\n | {\n kind: \"pan\";\n x: number;\n y: number;\n right: number;\n pane: Pane | null;\n moved: boolean;\n lastX: number;\n lastY: number;\n lastT: number;\n velocity: number;\n }\n | { kind: \"axisY\"; pane: Pane; y: number; min: number; max: number }\n | { kind: \"axisX\"; x: number; spacing: number }\n | {\n kind: \"separator\";\n index: number;\n y: number;\n above: number;\n below: number;\n }\n | { kind: \"order\"; line: TradingPriceLine; startPrice: number }\n | {\n kind: \"drawing\";\n id: string;\n handle: number;\n x: number;\n y: number;\n original: TradingDrawing;\n moved: boolean;\n }\n | { kind: \"create\"; x: number; y: number; moved: boolean };\n\n/** Mounts a trading chart in `container` (which should have a height) */\nexport const createTradingChart = (\n container: HTMLElement,\n initial: TradingChartOptions = {},\n): TradingChartInstance => {\n const doc = container.ownerDocument;\n const win = doc.defaultView;\n let options: TradingChartOptions = { ...initial };\n let destroyed = false;\n\n // ------------------------------------------------------------------ DOM\n\n const make = <K extends keyof HTMLElementTagNameMap>(\n tag: K,\n style: Partial<CSSStyleDeclaration>,\n ) => styleElement(doc.createElement(tag), style) as HTMLElementTagNameMap[K];\n\n const root = make(\"div\", {\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n minHeight: \"0\",\n overflow: \"hidden\",\n outline: \"none\",\n userSelect: \"none\",\n touchAction: \"pan-y\",\n fontFamily: \"var(--font-family-sans, system-ui, sans-serif)\",\n color: \"var(--text-color, #1f2937)\",\n cursor: \"crosshair\",\n });\n root.className = \"minerva-trading-chart\";\n root.tabIndex = 0;\n root.setAttribute(\"role\", \"figure\");\n root.setAttribute(\"aria-roledescription\", \"chart\");\n\n const layer = (tag: \"canvas\" | \"div\") =>\n make(tag, {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n pointerEvents: \"none\",\n });\n const background = layer(\"canvas\") as HTMLCanvasElement;\n const foreground = layer(\"canvas\") as HTMLCanvasElement;\n background.setAttribute(\"aria-hidden\", \"true\");\n foreground.setAttribute(\"aria-hidden\", \"true\");\n const legends = layer(\"div\") as HTMLDivElement;\n legends.style.right = \"0\";\n legends.style.bottom = \"0\";\n const jump = make(\"button\", {\n position: \"absolute\",\n display: \"none\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"28px\",\n height: \"28px\",\n padding: \"0\",\n borderRadius: \"50%\",\n border:\n \"1px solid color-mix(in srgb, var(--border-color, #e5e7eb) 80%, transparent)\",\n background: \"var(--surface-elevated-color, var(--surface-color, #fff))\",\n color: \"var(--text-color, #1f2937)\",\n boxShadow: \"0 4px 14px -4px rgba(15, 23, 42, 0.25)\",\n cursor: \"pointer\",\n });\n jump.type = \"button\";\n jump.innerHTML =\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M3 3l5 5-5 5M9 3l5 5-5 5\"/></svg>';\n const live = make(\"div\", {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n whiteSpace: \"nowrap\",\n });\n live.setAttribute(\"aria-live\", \"polite\");\n root.append(background, foreground, legends, jump, live);\n container.appendChild(root);\n\n // ----------------------------------------------------------------- data\n\n const store = createStore();\n let pyramid = createPyramid();\n /** Heikin-Ashi bars (time and volume shared with the store) */\n const ha: OhlcColumns = {\n time: store.time,\n open: new Float64Array(0),\n high: new Float64Array(0),\n low: new Float64Array(0),\n close: new Float64Array(0),\n volume: store.volume,\n };\n let haValid = 0;\n let haPyramid = createPyramid();\n let studies: Study[] = [];\n const studyValid = new Map<Study, number>();\n const visibility = new Map<string, boolean>();\n interface CompareRuntime {\n id: string;\n name: string;\n color: string;\n times: Float64Array;\n data: Float64Array;\n values: Float64Array;\n valid: number;\n }\n let compares: CompareRuntime[] = [];\n /** Changes when bars other than the last one change */\n let dataVersion = 0;\n /** Changes when the last bar changes */\n let tailVersion = 0;\n let detectedPrecision = 2;\n let inferredTimeframe = DAY;\n\n // ----------------------------------------------------------------- view\n\n let spacing = options.barSpacing ?? 8;\n let right = NaN;\n let plotW = 0;\n let plotH = 0;\n let axisW = MIN_AXIS;\n let width = 0;\n let height = 0;\n let panes: Pane[] = [];\n const scales = new Map<string, PaneScale>();\n const paneHeights = new Map<string, number>();\n let vis: Visible | null = null;\n let volumeOverlayMax = 0;\n\n // -------------------------------------------------------------- state\n\n let theme: ChartTheme = readTheme(root);\n let themeVersion = 0;\n let optionsVersion = 0;\n let renderer: ChartRenderer | null = null;\n let rendererToken = 0;\n let frameId = 0;\n let layers: { fn: Layer; main: RenderItem[]; live: RenderItem[] }[] = [];\n let geomKey = \"\";\n let builtTail = -1;\n let itemVersion = 0;\n let resolveReady!: (kind: ChartRendererKind | null) => void;\n const ready = new Promise<ChartRendererKind | null>((resolve) => {\n resolveReady = resolve;\n });\n\n let pointer: { x: number; y: number } | null = null;\n let keyboardIndex: number | null = null;\n let gesture: Gesture | null = null;\n const touches = new Map<number, { x: number; y: number }>();\n let pinch: { distance: number; spacing: number } | null = null;\n let kinetic: { v: number; t: number } | null = null;\n let scrollAnim: { from: number; to: number; start: number } | null = null;\n /** Range asked by `setVisibleRange` / `fitContent`, applied once the plot width is known */\n let pendingRange: { from: number; to: number } | null = null;\n\n let drawings: readonly TradingDrawing[] = options.drawings ?? [];\n let emittedDrawings: readonly TradingDrawing[] | null = null;\n let tool: TradingDrawingTool = options.drawingMode ?? \"cursor\";\n let selected: string | null = null;\n let hovered: string | null = null;\n let draft: TradingDrawing | null = null;\n let drawingCounter = 0;\n const lineOverrides = new Map<string, number>();\n let hoveredLine: string | null = null;\n let lastRange: TradingVisibleRange | null = null;\n let lastCrosshair = \"\";\n let historyFirst = NaN;\n let countdownTimer: ReturnType<typeof setInterval> | null = null;\n\n // ---------------------------------------------------------- listeners\n\n const listeners = new Map<string, Set<(event: never) => void>>();\n const emit = <K extends keyof TradingChartEventMap>(\n type: K,\n event: TradingChartEventMap[K],\n ) => {\n listeners\n .get(type)\n ?.forEach((fn) => (fn as (e: TradingChartEventMap[K]) => void)(event));\n };\n\n // ------------------------------------------------------------- helpers\n\n // locale and texts, resolved at each options update (and `<html lang>` change)\n let locale = resolveLocale(options.locale);\n let texts = localeLabels(TRADING_LABELS, locale, options.labels);\n const resolveTexts = () => {\n locale = resolveLocale(options.locale);\n texts = localeLabels(TRADING_LABELS, locale, options.labels);\n };\n const labels = () => texts;\n const n = () => store.length;\n const style = () => options.chartStyle ?? \"candles\";\n const redUp = () => options.colorConvention === \"redUp\";\n const upCss = () => options.upColor ?? (redUp() ? DOWN : UP);\n const downCss = () => options.downColor ?? (redUp() ? UP : DOWN);\n const resolve = (css: string, fallback: Rgba = theme.primary): Rgba =>\n theme.resolve ? theme.resolve(css, fallback) : fallback;\n const css = (value: string, alpha = 1) => toCss(resolve(value), alpha);\n const precision = () => options.precision ?? detectedPrecision;\n let priceFormat = priceFormatter(2, undefined);\n let priceFormatKey = \"\";\n const formatPrice = (value: number) => {\n if (options.formatPrice) return options.formatPrice(value);\n const key = `${precision()}|${locale}`;\n if (key !== priceFormatKey) {\n priceFormat = priceFormatter(precision(), locale);\n priceFormatKey = key;\n }\n return priceFormat(value);\n };\n const timeframe = () => {\n const parsed =\n options.timeframe !== undefined\n ? parseTimeframe(options.timeframe)\n : null;\n return (\n parsed ?? {\n unit: \"ms\" as const,\n count: inferredTimeframe,\n ms: inferredTimeframe,\n }\n );\n };\n const tfMs = () => timeframe().ms;\n const font = (size: number, weight = 400) =>\n `${weight} ${size}px ${theme.fontFamily}`;\n\n const isVisible = (study: Study) =>\n visibility.get(study.id) ?? study.config.visible ?? true;\n\n const xOf = (index: number) => plotW + (index - right) * spacing;\n const indexAt = (x: number) => right - (plotW - x) / spacing;\n\n /** Time of a logical index (extrapolated outside the bars) */\n const timeAt = (index: number) => {\n const count = n();\n if (!count) return 0;\n const i = Math.round(index);\n if (i < 0) return store.time[0] + i * tfMs();\n if (i >= count) return store.time[count - 1] + (i - count + 1) * tfMs();\n return store.time[i];\n };\n\n /** Logical index of a time (extrapolated outside the bars) */\n const indexOfTimeExt = (time: number) => {\n const count = n();\n if (!count) return 0;\n const last = store.time[count - 1];\n if (time > last) return count - 1 + (time - last) / tfMs();\n if (time < store.time[0]) return (time - store.time[0]) / tfMs();\n return indexOfTime(store.time, count, time);\n };\n\n /** Bars as drawn: Heikin-Ashi or the store */\n const display = (): OhlcColumns => (style() === \"heikinAshi\" ? ha : store);\n\n // ------------------------------------------------------- derived data\n\n const markDirty = (from: number) => {\n for (const study of studies)\n studyValid.set(study, Math.min(studyValid.get(study) ?? 0, from));\n haValid = Math.min(haValid, from);\n for (const c of compares) c.valid = Math.min(c.valid, from);\n const level = (p: typeof pyramid) => {\n for (const l of p.levels)\n if (l) l.valid = Math.min(l.valid, Math.floor(from / l.size));\n };\n level(pyramid);\n level(haPyramid);\n };\n\n const syncDerived = () => {\n const count = n();\n for (const study of studies) {\n const valid = studyValid.get(study) ?? 0;\n if (valid < count) {\n study.compute(store, valid);\n studyValid.set(study, count);\n }\n }\n ha.time = store.time;\n ha.volume = store.volume;\n if (style() === \"heikinAshi\" && haValid < count) {\n if (ha.open.length < store.capacity) {\n for (const key of [\"open\", \"high\", \"low\", \"close\"] as const) {\n const next = new Float64Array(store.capacity);\n next.set(ha[key].subarray(0, haValid));\n ha[key] = next;\n }\n }\n heikinAshiInto(\n store.open,\n store.high,\n store.low,\n store.close,\n count,\n ha,\n haValid,\n );\n haValid = count;\n }\n for (const c of compares) {\n if (c.valid >= count) continue;\n if (c.values.length < store.capacity) {\n const next = new Float64Array(store.capacity).fill(NaN);\n next.set(c.values.subarray(0, c.valid));\n c.values = next;\n }\n for (let i = c.valid; i < count; i++) {\n const j =\n lowerBoundTime(c.times, c.times.length, store.time[i] + 0.5) - 1;\n c.values[i] = j >= 0 ? c.data[j] : NaN;\n }\n c.valid = count;\n }\n };\n\n const afterDataChange = (from: number) => {\n markDirty(from);\n const count = n();\n if (from < count - 1) dataVersion++;\n tailVersion++;\n if (count) {\n detectedPrecision = Math.max(\n from === 0 ? 0 : detectedPrecision,\n detectPrecision(store.close, from, count),\n detectPrecision(store.open, Math.max(from, count - 50), count),\n );\n if (from === 0 || count < 80)\n inferredTimeframe = inferTimeframe(store.time, count);\n }\n invalidate();\n };\n\n const rebuildStudies = () => {\n const { studies: next, reused } = buildStudies(\n options.indicators ?? [],\n studies,\n options.utcOffset ?? -new Date().getTimezoneOffset(),\n );\n for (const study of studies)\n if (!reused.has(study)) studyValid.delete(study);\n for (const study of next) if (!reused.has(study)) studyValid.set(study, 0);\n studies = next;\n // drop the user's toggles of indicators whose visibility is now set\n for (const id of [...visibility.keys()])\n if (!studies.some((s) => s.id === id)) visibility.delete(id);\n };\n\n const rebuildCompares = () => {\n compares = (options.compare ?? []).map((series, i) => {\n const data = [...series.data].sort((a, b) => a.time - b.time);\n return {\n id: series.id ?? series.name,\n name: series.name,\n color: series.color ?? LINE_COLORS[(i + 2) % LINE_COLORS.length],\n times: Float64Array.from(data, (d) => d.time),\n data: Float64Array.from(data, (d) => d.value),\n values: new Float64Array(0),\n valid: 0,\n };\n });\n };\n\n // ---------------------------------------------------------- bars input\n\n /** Last bar visible: new bars keep the view at the latest bar */\n const followsRealtime = () => {\n const count = n();\n if (!count || !finite(right)) return true;\n const x = xOf(count - 1);\n return x >= 0 && x <= plotW + spacing * 0.5;\n };\n\n const replaceBars = (bars: TradingBarsInput) => {\n storeSet(store, bars);\n pyramid = createPyramid();\n haPyramid = createPyramid();\n haValid = 0;\n historyFirst = NaN;\n for (const scale of scales.values()) scale.auto = true;\n right = n() - 1 + (options.rightOffset ?? 8);\n kinetic = null;\n scrollAnim = null;\n afterDataChange(0);\n };\n\n /**\n * New `bars` option: streamed (same first bars plus newer ones),\n * prepended history (same last bar), or replaced\n */\n const applyBarsOption = (bars: TradingBarsInput) => {\n const count = n();\n const length = inputLength(bars);\n if (count >= 2 && length >= count) {\n const first = barAt(bars, 0).time;\n const last = store.time[count - 1];\n if (\n first === store.time[0] &&\n barAt(bars, count - 2).time === store.time[count - 2]\n ) {\n // streaming through the props: update the last bar, append the rest\n const follow = followsRealtime();\n const before = count;\n let from = count;\n for (let i = count - 1; i < length; i++) {\n const at = storeUpdate(store, barAt(bars, i));\n if (at >= 0) from = Math.min(from, at);\n }\n if (follow) right += n() - before;\n if (from < n()) afterDataChange(from);\n return;\n }\n if (barAt(bars, length - 1).time === last && length > count) {\n const added = length - count;\n storeSet(store, bars);\n pyramid = createPyramid();\n haPyramid = createPyramid();\n haValid = 0;\n right += added;\n afterDataChange(0);\n return;\n }\n }\n replaceBars(bars);\n };\n\n // --------------------------------------------------------------- layout\n\n const layoutPanes = () => {\n const paneStudies = studies.filter((s) => !s.overlay);\n const available = plotH;\n const wanted = paneStudies.map((s) => paneHeights.get(s.id) ?? s.height);\n const total = wanted.reduce((a, b) => a + b, 0);\n const max = Math.max(0, available * 0.62);\n const k = total > max && total > 0 ? max / total : 1;\n const heights = wanted.map((h) =>\n Math.max(MIN_PANE * Math.min(1, k * 2), h * k),\n );\n const priceHeight = Math.max(\n 40,\n available - heights.reduce((a, b) => a + b, 0),\n );\n const next: Pane[] = [];\n const scaleOf = (id: string, mode: TradingScaleMode) => {\n let scale = scales.get(id);\n if (!scale) {\n scale = createScale(mode);\n scales.set(id, scale);\n }\n if (scale.mode !== mode) {\n scale.mode = mode;\n scale.auto = true;\n }\n return scale;\n };\n const price = scaleOf(PRICE, options.scaleMode ?? \"linear\");\n price.top = 0;\n price.height = priceHeight;\n price.marginTop = 0.1;\n price.marginBottom = 0.08;\n next.push({\n id: PRICE,\n study: null,\n scale: price,\n top: 0,\n height: priceHeight,\n ticks: [],\n step: 0,\n });\n let top = priceHeight;\n paneStudies.forEach((study, i) => {\n const scale = scaleOf(study.id, \"linear\");\n scale.top = top;\n scale.height = heights[i];\n scale.marginTop = study.type === \"volume\" ? 0.18 : 0.14;\n scale.marginBottom = study.type === \"volume\" ? 0 : 0.1;\n if (study.range) scale.marginTop = scale.marginBottom = 0.06;\n next.push({\n id: study.id,\n study,\n scale,\n top,\n height: heights[i],\n ticks: [],\n step: 0,\n });\n top += heights[i];\n });\n for (const id of [...scales.keys()])\n if (!next.some((p) => p.id === id)) scales.delete(id);\n panes = next;\n };\n\n const paneAt = (y: number) =>\n panes.find((p) => y >= p.top && y < p.top + p.height) ?? null;\n\n const clampView = () => {\n const count = n();\n const minSpacing = Math.min(1, (plotW * 0.8) / Math.max(1, count));\n spacing = clamp(spacing, Math.max(1e-4, minSpacing), MAX_SPACING);\n const bars = plotW / spacing;\n if (!finite(right)) right = count - 1 + (options.rightOffset ?? 8);\n const hi =\n Math.max(0, count - 1) + Math.max(options.rightOffset ?? 8, bars * 0.75);\n const lo = Math.min(bars * 0.25, hi);\n right = clamp(right, lo, hi);\n };\n\n const computeVisible = (): Visible | null => {\n const count = n();\n if (!count) return null;\n const left = right - plotW / spacing;\n const level = spacing >= 2 ? 0 : Math.ceil(Math.log2(2 / spacing));\n const size = 2 ** level;\n const src = display();\n const cols = level\n ? pyramidLevel(\n style() === \"heikinAshi\" ? haPyramid : pyramid,\n src,\n count,\n level,\n )\n : src;\n const last = Math.floor((count - 1) / size);\n const i0 = clamp(Math.floor(left) - 1, 0, count - 1);\n const i1 = clamp(Math.ceil(right) + 1, 0, count - 1);\n const r0 = clamp(Math.ceil(left - 0.5), 0, count - 1);\n const r1 = clamp(Math.floor(right + 0.5), 0, count - 1);\n return {\n left,\n level,\n size,\n cols,\n g0: Math.floor(i0 / size),\n g1: Math.floor(i1 / size),\n s0: Math.floor(r0 / size),\n s1: Math.floor(r1 / size),\n last,\n };\n };\n\n /** Center index of a group */\n const groupCenter = (v: Visible, g: number) => g * v.size + (v.size - 1) / 2;\n /** Value of a study output for a group (its last bar) */\n const groupValue = (v: Visible, values: Float64Array, g: number) =>\n values[Math.min(n() - 1, g * v.size + v.size - 1)];\n const groupBars = (v: Visible, g: number) =>\n Math.min(v.size, n() - g * v.size);\n\n /** First visible bar: the base of the percent scale and of the baseline */\n const firstVisibleIndex = () =>\n clamp(Math.ceil(right - plotW / spacing - 0.5), 0, Math.max(0, n() - 1));\n\n const compareBase = (c: CompareRuntime) => {\n const count = n();\n for (let i = firstVisibleIndex(); i < count; i++) {\n const v = c.values[i];\n if (finite(v) && v !== 0) return v;\n }\n return NaN;\n };\n\n /** Scaled value of a comparison series (percent: from its own base) */\n const compareScaled = (scale: PaneScale, value: number, base: number) =>\n scale.mode === \"percent\"\n ? (value / base - 1) * 100\n : toScaled(scale, value);\n\n const baselinePrice = () =>\n options.baselinePrice ?? display().close[firstVisibleIndex()];\n\n const autoscale = (v: Visible | null) => {\n volumeOverlayMax = 0;\n for (const pane of panes) {\n const scale = pane.scale;\n if (!v) continue;\n if (pane.id === PRICE) {\n scale.base = store.close[firstVisibleIndex()] || 1;\n const { cols } = v;\n const s = style();\n const closeOnly = s === \"line\" || s === \"area\" || s === \"baseline\";\n let lo = Infinity;\n let hi = -Infinity;\n for (let g = v.s0; g <= v.s1; g++) {\n const l = closeOnly ? cols.close[g] : cols.low[g];\n const h = closeOnly ? cols.close[g] : cols.high[g];\n if (l < lo) lo = l;\n if (h > hi) hi = h;\n }\n for (const study of studies) {\n if (!study.overlay || !isVisible(study)) continue;\n if (study.type === \"volume\") {\n for (let g = v.s0; g <= v.s1; g++) {\n const vol = cols.volume[g] / groupBars(v, g);\n if (vol > volumeOverlayMax) volumeOverlayMax = vol;\n }\n continue;\n }\n for (const out of study.outputs) {\n for (let g = v.s0; g <= v.s1; g++) {\n const value = groupValue(v, out.values, g);\n if (value < lo) lo = value;\n if (value > hi) hi = value;\n }\n }\n }\n if (s === \"baseline\") {\n const b = baselinePrice();\n if (b < lo) lo = b;\n if (b > hi) hi = b;\n }\n if (!scale.auto) continue;\n let a = toScaled(scale, lo);\n let b = toScaled(scale, hi);\n if (scale.mode === \"log\" && !(lo > 0))\n a = toScaled(scale, Math.max(hi * 1e-3, 1e-12));\n for (const c of compares) {\n const base = compareBase(c);\n for (let g = v.s0; g <= v.s1; g++) {\n const value = compareScaled(\n scale,\n groupValue(v, c.values, g),\n base,\n );\n if (value < a) a = value;\n if (value > b) b = value;\n }\n }\n fitScale(scale, a, b);\n continue;\n }\n const study = pane.study;\n if (!study || !scale.auto) continue;\n if (study.range) {\n fitScale(scale, study.range[0], study.range[1]);\n continue;\n }\n let lo = Infinity;\n let hi = -Infinity;\n if (study.type === \"volume\") lo = 0;\n for (const out of study.outputs) {\n for (let g = v.s0; g <= v.s1; g++) {\n const value =\n out.kind === \"volume\"\n ? v.cols.volume[g] / groupBars(v, g)\n : groupValue(v, out.values, g);\n if (value < lo) lo = value;\n if (value > hi) hi = value;\n }\n }\n if (study.type === \"macd\" && finite(lo) && finite(hi)) {\n // keep the zero line in view\n lo = Math.min(lo, 0);\n hi = Math.max(hi, 0);\n }\n fitScale(scale, lo, hi);\n }\n };\n\n // ----------------------------------------------------------------- ticks\n\n interface TimeLabel {\n x: number;\n text: string;\n bold: boolean;\n }\n\n const timeTicks = (\n v: Visible | null,\n ctx: CanvasRenderingContext2D,\n ): TimeLabel[] => {\n const count = n();\n if (!count || !v) return [];\n const tf = tfMs();\n const intraday = tf < DAY;\n const offset = options.utcOffset;\n // groups up to the right edge, past the last bar too\n const gEnd = Math.floor(Math.max(0, Math.ceil(right)) / v.size);\n const groupTime = (g: number) => {\n if (g <= v.last) return v.cols.time[g];\n return store.time[count - 1] + (g * v.size - (count - 1)) * tf;\n };\n const candidates: { x: number; weight: number; time: number }[] = [];\n let prev = v.g0 > 0 ? shiftTime(groupTime(v.g0 - 1), offset) : NaN;\n for (let g = v.g0; g <= gEnd; g++) {\n const time = shiftTime(groupTime(g), offset);\n const x = xOf(groupCenter(v, g));\n const weight = boundaryWeight(prev, time);\n // no labels inside a second (tick charts)\n if (x >= -20 && x <= plotW + 20 && weight > 10)\n candidates.push({ x, weight, time });\n prev = time;\n }\n ctx.font = font(theme.fontSize);\n const sample = intraday ? \"00:00\" : \"Sep 30\";\n const gap =\n Math.max(ctx.measureText(sample).width, ctx.measureText(\"2024\").width) +\n 34;\n return pickTicks(candidates, gap)\n .filter((t) => t.x > 8 && t.x < plotW - 8)\n .map((t) => ({\n x: t.x,\n text: tickText(t.time, t.weight, locale, intraday),\n bold: t.weight >= (intraday ? 50 : 60),\n }));\n };\n\n const paneTickText = (pane: Pane, scaled: number) => {\n if (pane.id === PRICE) {\n if (pane.scale.mode === \"percent\")\n return formatPercent(\n scaled,\n locale,\n Math.min(2, stepDecimals(pane.step)),\n );\n return formatPrice(fromScaled(pane.scale, scaled));\n }\n if (pane.study?.compact) return formatVolume(scaled, locale);\n return formatFixed(scaled, Math.min(4, stepDecimals(pane.step)), locale);\n };\n\n /** Text of a value of a study in the legend */\n const studyValueText = (study: Study, value: number) => {\n if (study.overlay && study.type !== \"volume\") return formatPrice(value);\n if (study.compact) return formatVolume(value, locale);\n return formatFixed(\n value,\n study.range ? 2 : Math.max(2, Math.min(6, precision())),\n locale,\n );\n };\n\n // ------------------------------------------------------------ GPU items\n\n const createLayers = (v: Visible, dpr: number): Layer[] => {\n const result: Layer[] = [];\n const cols = v.cols;\n const up = resolve(upCss());\n const down = resolve(downCss());\n const upP = packColor(up);\n const downP = packColor(down);\n const bg = theme.background;\n const metrics = candleMetrics(spacing * v.size * dpr, dpr);\n const X = (g: number) => xOf(groupCenter(v, g)) * dpr;\n const s = style();\n\n const histogramHalf = Math.max(0.5, metrics.body / 2);\n const volumeColors = {\n up: packColor([up[0], up[1], up[2], 0.5]),\n down: packColor([down[0], down[1], down[2], 0.5]),\n };\n\n for (const pane of panes) {\n const top = pane.top * dpr;\n const bottom = (pane.top + pane.height) * dpr;\n const scale = pane.scale;\n const Y = (value: number) => yOf(scale, value) * dpr;\n\n const lineLayer =\n (\n values: (g: number) => number,\n color: Rgba,\n lineWidth: number,\n toY: (value: number) => number = Y,\n ): Layer =>\n (ga, gb, isLive) => {\n const buffer = new LineBuffer(top, bottom);\n for (let g = isLive ? Math.max(v.g0, ga - 1) : ga; g <= gb; g++)\n buffer.push(X(g), toY(values(g)));\n return buffer.count > 1 ? [buffer.item(\"\", 0, color, lineWidth)] : [];\n };\n\n if (pane.id === PRICE) {\n // volume at the bottom of the price pane\n const volumeStudy = studies.find(\n (st) => st.overlay && st.type === \"volume\" && isVisible(st),\n );\n if (volumeStudy && volumeOverlayMax > 0) {\n const h = (bottom - top) * 0.2;\n result.push((ga, gb) => {\n const buffer = new BarBuffer();\n for (let g = ga; g <= gb; g++) {\n const vol = cols.volume[g] / groupBars(v, g);\n if (!(vol > 0)) continue;\n const y = bottom - (vol / volumeOverlayMax) * h;\n const [a, b] = pixelRange(y, bottom);\n buffer.push(\n metrics.snap(X(g)),\n a,\n b,\n cols.close[g] >= cols.open[g]\n ? volumeColors.up\n : volumeColors.down,\n );\n }\n return [buffer.item(\"\", 0, histogramHalf)];\n });\n }\n // comparison series\n for (const c of compares) {\n const base = compareBase(c);\n const color = resolve(c.color);\n result.push(\n lineLayer(\n (g) => groupValue(v, c.values, g),\n color,\n 1.5,\n (value) =>\n yOfScaled(scale, compareScaled(scale, value, base)) * dpr,\n ),\n );\n }\n // the bars\n if (s === \"line\" || s === \"area\" || s === \"baseline\") {\n const lineColor = resolve(PRIMARY);\n if (s === \"area\") {\n result.push((ga, gb, isLive) => {\n const area = new AreaBuffer(top, bottom);\n for (let g = isLive ? Math.max(v.g0, ga - 1) : ga; g <= gb; g++)\n area.push(X(g), Y(cols.close[g]), bottom);\n return area.count > 1 ? [area.item(\"\", 0, lineColor, 0.28)] : [];\n });\n }\n if (s === \"baseline\") {\n const yb = Y(baselinePrice());\n result.push((ga, gb, isLive) => {\n const upArea = new AreaBuffer(top, bottom);\n const downArea = new AreaBuffer(top, bottom);\n const upLine = new LineBuffer(top, bottom);\n const downLine = new LineBuffer(top, bottom);\n let px = NaN;\n let py = NaN;\n const point = (x: number, y: number) => {\n upArea.push(x, Math.min(y, yb), yb);\n downArea.push(x, Math.max(y, yb), yb);\n if (y <= yb) upLine.push(x, y);\n else upLine.break();\n if (y >= yb) downLine.push(x, y);\n else downLine.break();\n };\n for (let g = isLive ? Math.max(v.g0, ga - 1) : ga; g <= gb; g++) {\n const x = X(g);\n const y = Y(cols.close[g]);\n if (finite(py) && (py - yb) * (y - yb) < 0) {\n const t = (yb - py) / (y - py);\n point(px + (x - px) * t, yb);\n }\n point(x, y);\n px = x;\n py = y;\n }\n const out: RenderItem[] = [];\n if (upArea.count > 1)\n out.push(\n upArea.item(\"u\", 0, up, 0.22),\n downArea.item(\"d\", 0, down, 0.22),\n );\n if (upLine.count > 1) out.push(upLine.item(\"ul\", 0, up, 2));\n if (downLine.count > 1) out.push(downLine.item(\"dl\", 0, down, 2));\n return out;\n });\n } else {\n result.push(lineLayer((g) => cols.close[g], lineColor, 2));\n }\n } else {\n const hollow = s === \"hollowCandles\";\n const ohlc = s === \"bars\";\n const wick = metrics.wick;\n const body = metrics.body;\n result.push((ga, gb) => {\n const wicks = new BarBuffer();\n const bodies = new BarBuffer();\n const caps = new BarBuffer();\n const ticks = new BarBuffer();\n const tick = Math.max(wick, Math.round((body - wick) / 2));\n for (let g = ga; g <= gb; g++) {\n const o = cols.open[g];\n const h = cols.high[g];\n const l = cols.low[g];\n const c = cols.close[g];\n if (!finite(o) || !finite(c)) continue;\n const rising = hollow\n ? c >= (g > 0 ? cols.close[g - 1] : o)\n : c >= o;\n const color = rising ? upP : downP;\n const cx = metrics.snap(X(g));\n const [wt, wb] = pixelRange(Y(h), Y(l));\n if (ohlc) {\n const range = clampRange(wt, wb, top, bottom);\n if (range) wicks.push(cx, range[0], range[1], color);\n for (const [value, side] of [\n [o, -1],\n [c, 1],\n ] as const) {\n const y = Math.round(Y(value) - wick / 2);\n if (y < top || y + wick > bottom) continue;\n ticks.push(\n cx + side * (wick / 2 + tick / 2),\n y,\n y + wick,\n color,\n );\n }\n continue;\n }\n const [bt, bb] = pixelRange(Y(o), Y(c));\n if (body <= wick) {\n const range = clampRange(wt, wb, top, bottom);\n if (range) wicks.push(cx, range[0], range[1], color);\n continue;\n }\n if (hollow && c > o) {\n const segments: [number, number][] = [\n [wt, bt],\n [bb, wb],\n ];\n for (const [a, b] of segments) {\n const range = b > a ? clampRange(a, b, top, bottom) : null;\n if (range) wicks.push(cx, range[0], range[1], color);\n }\n const edges = clampRange(bt, bb, top, bottom);\n if (edges) {\n wicks.push(\n cx - body / 2 + wick / 2,\n edges[0],\n edges[1],\n color,\n );\n wicks.push(\n cx + body / 2 - wick / 2,\n edges[0],\n edges[1],\n color,\n );\n }\n for (const y of [bt, bb - wick]) {\n if (y >= top && y + wick <= bottom)\n caps.push(cx, y, y + wick, color);\n }\n continue;\n }\n const range = clampRange(wt, wb, top, bottom);\n if (range) wicks.push(cx, range[0], range[1], color);\n const box = clampRange(bt, bb, top, bottom);\n if (box) bodies.push(cx, box[0], box[1], color);\n }\n const items: RenderItem[] = [wicks.item(\"w\", 0, wick / 2)];\n if (bodies.count) items.push(bodies.item(\"b\", 0, body / 2));\n if (caps.count) items.push(caps.item(\"c\", 0, body / 2));\n if (ticks.count) items.push(ticks.item(\"t\", 0, tick / 2));\n return items;\n });\n }\n }\n\n // indicators of the pane\n const paneStudies =\n pane.id === PRICE\n ? studies.filter((st) => st.overlay && st.type !== \"volume\")\n : pane.study\n ? [pane.study]\n : [];\n for (const study of paneStudies) {\n if (!isVisible(study)) continue;\n for (const out of study.outputs) {\n if (out.kind === \"volume\") {\n const y0 = Y(0);\n result.push((ga, gb) => {\n const buffer = new BarBuffer();\n for (let g = ga; g <= gb; g++) {\n const vol = cols.volume[g] / groupBars(v, g);\n if (!(vol > 0)) continue;\n const range = clampRange(\n ...pixelRange(Y(vol), y0),\n top,\n bottom,\n );\n if (range)\n buffer.push(\n metrics.snap(X(g)),\n range[0],\n range[1],\n cols.close[g] >= cols.open[g]\n ? volumeColors.up\n : volumeColors.down,\n );\n }\n return [buffer.item(\"\", 0, histogramHalf)];\n });\n } else if (out.kind === \"histogram\") {\n const y0 = Y(0);\n const strong = { up: upP, down: downP };\n const faded = {\n up: packColor(mix(bg, up, 0.45)),\n down: packColor(mix(bg, down, 0.45)),\n };\n result.push((ga, gb) => {\n const buffer = new BarBuffer();\n for (let g = ga; g <= gb; g++) {\n const value = groupValue(v, out.values, g);\n if (!finite(value)) continue;\n const prev = g > 0 ? groupValue(v, out.values, g - 1) : value;\n const color =\n value >= 0\n ? value >= prev\n ? strong.up\n : faded.up\n : value <= prev\n ? strong.down\n : faded.down;\n const range = clampRange(\n ...pixelRange(Y(value), y0),\n top,\n bottom,\n );\n if (range)\n buffer.push(metrics.snap(X(g)), range[0], range[1], color);\n }\n return [buffer.item(\"\", 0, histogramHalf)];\n });\n } else {\n result.push(\n lineLayer(\n (g) => groupValue(v, out.values, g),\n resolve(out.color),\n out.width,\n ),\n );\n }\n }\n }\n }\n return result;\n };\n\n /** Builds the items of the main bars or of the last group */\n const runLayer = (\n fn: Layer,\n index: number,\n v: Visible,\n isLive: boolean,\n ): RenderItem[] => {\n const lastMain = Math.min(v.g1, v.last - 1);\n const items = isLive\n ? v.last >= v.g0 && v.last <= v.g1\n ? fn(v.last, v.last, true)\n : []\n : lastMain >= v.g0\n ? fn(v.g0, lastMain, false)\n : [];\n const version = ++itemVersion;\n return items.map((item, k) => ({\n ...item,\n key: `L${index}:${k}:${item.kind}:${item.key}${isLive ? \":live\" : \"\"}`,\n version,\n }));\n };\n\n const renderData = (v: Visible | null, dpr: number) => {\n if (!renderer) return;\n const canvas = renderer.canvas;\n styleElement(canvas, {\n left: \"0px\",\n top: \"0px\",\n width: `${plotW}px`,\n height: `${plotH}px`,\n });\n const bw = Math.max(1, Math.round(plotW * dpr));\n const bh = Math.max(1, Math.round(plotH * dpr));\n if (canvas.width !== bw || canvas.height !== bh) renderer.resize(bw, bh);\n if (v) {\n const key = [\n bw,\n bh,\n dpr,\n spacing,\n right,\n v.level,\n style(),\n dataVersion,\n themeVersion,\n optionsVersion,\n volumeOverlayMax,\n style() === \"baseline\" ? baselinePrice() : 0,\n ...panes.map(\n (p) =>\n `${p.id}:${p.top}:${p.height}:${p.scale.min}:${p.scale.max}:${p.scale.base}:${p.scale.mode}`,\n ),\n ...studies.map((st) => `${st.id}:${isVisible(st)}`),\n ].join(\"|\");\n if (key !== geomKey) {\n geomKey = key;\n builtTail = tailVersion;\n layers = createLayers(v, dpr).map((fn) => ({ fn, main: [], live: [] }));\n layers.forEach((l, i) => {\n l.main = runLayer(l.fn, i, v, false);\n l.live = runLayer(l.fn, i, v, true);\n });\n } else if (builtTail !== tailVersion) {\n builtTail = tailVersion;\n layers.forEach((l, i) => {\n l.live = runLayer(l.fn, i, v, true);\n });\n }\n } else {\n layers = [];\n geomKey = \"\";\n }\n const items = layers.flatMap((l) => [...l.main, ...l.live]);\n renderer.render(items, {\n transform: { xScale: 2 / bw, xOffset: -1, yScale: -2 / bh, yOffset: 1 },\n width: bw,\n height: bh,\n dpr,\n });\n };\n\n // -------------------------------------------------------- 2D painting\n\n const sizeCanvas = (canvas: HTMLCanvasElement, dpr: number) => {\n const w = Math.max(1, Math.round(width * dpr));\n const h = Math.max(1, Math.round(height * dpr));\n if (canvas.width !== w) canvas.width = w;\n if (canvas.height !== h) canvas.height = h;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n };\n\n const roundRect = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n ) => {\n ctx.beginPath();\n if (typeof ctx.roundRect === \"function\") ctx.roundRect(x, y, w, h, r);\n else ctx.rect(x, y, w, h);\n };\n\n const paintBackground = (\n ctx: CanvasRenderingContext2D,\n v: Visible | null,\n ticks: TimeLabel[],\n ) => {\n const grid = toCss(theme.grid);\n const showGrid = options.grid !== false;\n ctx.lineWidth = 1;\n if (showGrid) {\n ctx.strokeStyle = grid;\n ctx.beginPath();\n for (const t of ticks) {\n const x = Math.round(t.x) + 0.5;\n ctx.moveTo(x, 0);\n ctx.lineTo(x, plotH);\n }\n for (const pane of panes) {\n for (const t of pane.ticks) {\n const y = Math.round(yOfScaled(pane.scale, t)) + 0.5;\n if (y < pane.top + 2 || y > pane.top + pane.height - 2) continue;\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n }\n }\n ctx.stroke();\n }\n // watermark\n if (options.watermark) {\n const price = panes[0];\n ctx.save();\n ctx.font = font(Math.min(56, Math.max(22, plotW / 14)), 700);\n ctx.fillStyle = toCss(theme.text, 0.07);\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(options.watermark, plotW / 2, price.top + price.height / 2);\n ctx.restore();\n }\n // bands of the indicator panes, fill of the Bollinger bands\n for (const pane of panes) {\n const study = pane.study;\n if (study?.bands && isVisible(study)) {\n const color = resolve(study.outputs[0]?.color ?? PRIMARY);\n const ys = study.bands.map((b) => Math.round(yOf(pane.scale, b)) + 0.5);\n if (study.type === \"rsi\" && ys.length === 2) {\n ctx.fillStyle = toCss(color, 0.07);\n ctx.fillRect(\n 0,\n Math.min(ys[0], ys[1]),\n plotW,\n Math.abs(ys[1] - ys[0]),\n );\n }\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = toCss(theme.textMuted, 0.45);\n ctx.beginPath();\n for (const y of ys) {\n if (y < pane.top || y > pane.top + pane.height) continue;\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n }\n ctx.stroke();\n ctx.restore();\n }\n }\n if (v) {\n const price = panes[0];\n for (const study of studies) {\n if (study.type !== \"boll\" || !study.fill || !isVisible(study)) continue;\n const [ui, li] = study.fill;\n const upper = study.outputs[ui].values;\n const lower = study.outputs[li].values;\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, price.top, plotW, price.height);\n ctx.clip();\n ctx.fillStyle = css(study.outputs[ui].color, 0.07);\n ctx.beginPath();\n let started = false;\n const back: [number, number][] = [];\n const flush = () => {\n for (let k = back.length - 1; k >= 0; k--)\n ctx.lineTo(back[k][0], back[k][1]);\n if (started) ctx.closePath();\n back.length = 0;\n started = false;\n };\n for (let g = v.g0; g <= v.g1; g++) {\n const a = groupValue(v, upper, g);\n const b = groupValue(v, lower, g);\n if (!finite(a) || !finite(b)) {\n flush();\n continue;\n }\n const x = xOf(groupCenter(v, g));\n const ya = yOf(price.scale, a);\n if (started) ctx.lineTo(x, ya);\n else ctx.moveTo(x, ya);\n started = true;\n back.push([x, yOf(price.scale, b)]);\n }\n flush();\n ctx.fill();\n ctx.restore();\n }\n }\n // separators and axis borders\n ctx.strokeStyle = toCss(theme.axis);\n ctx.beginPath();\n for (const pane of panes.slice(1)) {\n const y = Math.round(pane.top) + 0.5;\n ctx.moveTo(0, y);\n ctx.lineTo(width, y);\n }\n ctx.moveTo(Math.round(plotW) + 0.5, 0);\n ctx.lineTo(Math.round(plotW) + 0.5, height);\n ctx.moveTo(0, Math.round(plotH) + 0.5);\n ctx.lineTo(width, Math.round(plotH) + 0.5);\n ctx.stroke();\n };\n\n /** Label on the price axis; returns its vertical extent */\n const axisLabel = (\n ctx: CanvasRenderingContext2D,\n y: number,\n text: string,\n fill: string,\n textColor: string,\n second?: string,\n ) => {\n const h = second ? 32 : 18;\n const top = clamp(Math.round(y - 9), 0, plotH - h);\n roundRect(ctx, plotW + 1, top, axisW - 2, h, 3);\n ctx.fillStyle = fill;\n ctx.fill();\n ctx.fillStyle = textColor;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.font = font(theme.fontSize, 500);\n ctx.fillText(text, plotW + 7, top + 9.5);\n if (second) {\n ctx.font = font(theme.fontSize - 1);\n ctx.fillText(second, plotW + 7, top + 24);\n }\n };\n\n const priceAxisText = (value: number) =>\n panes[0]?.scale.mode === \"percent\"\n ? formatPercent(toScaled(panes[0].scale, value), locale)\n : formatPrice(value);\n\n const lineColor = (line: TradingPriceLine) => {\n if (line.color) return css(line.color);\n const kind = line.kind ?? \"line\";\n if (kind === \"takeProfit\") return css(upCss());\n if (kind === \"stopLoss\") return css(downCss());\n if (kind === \"alert\") return css(WARNING);\n if (kind === \"line\") return css(PRIMARY);\n return css(line.side === \"sell\" ? downCss() : upCss());\n };\n\n const linePrice = (line: TradingPriceLine) =>\n lineOverrides.get(line.id) ?? line.price;\n\n const crosshairState = () => {\n if (!vis || !panes.length) return null;\n if (keyboardIndex !== null) {\n const index = keyboardIndex;\n const bar = index >= 0 && index < n() ? display().close[index] : NaN;\n return { index, pane: panes[0], y: yOf(panes[0].scale, bar), price: bar };\n }\n if (!pointer || pointer.x > plotW || pointer.y > plotH) return null;\n const pane = paneAt(pointer.y);\n if (!pane) return null;\n const index = Math.round(indexAt(pointer.x));\n let y = pointer.y;\n let price = valueAt(pane.scale, y);\n if (\n pane.id === PRICE &&\n options.crosshair !== \"free\" &&\n index >= 0 &&\n index < n() &&\n tool === \"cursor\"\n ) {\n const d = display();\n let best = Infinity;\n for (const value of [\n d.open[index],\n d.high[index],\n d.low[index],\n d.close[index],\n ]) {\n const yy = yOf(pane.scale, value);\n if (Math.abs(yy - pointer.y) < best) {\n best = Math.abs(yy - pointer.y);\n y = yy;\n price = value;\n }\n }\n }\n return { index, pane, y, price };\n };\n\n const drawingMapper = (): DrawingMapper | null => {\n const price = panes[0];\n if (!price) return null;\n return {\n x: xOf,\n y: (p) => yOf(price.scale, p),\n index: indexOfTimeExt,\n left: 0,\n right: plotW,\n top: price.top,\n bottom: price.top + price.height,\n };\n };\n\n const formatSpan = (bars: number, ms: number) => {\n const l = labels();\n const abs = Math.abs(ms);\n const parts: string[] = [];\n const days = Math.floor(abs / DAY);\n const hours = Math.floor((abs % DAY) / HOUR);\n const minutes = Math.floor((abs % HOUR) / MINUTE);\n if (days) parts.push(fill(l.days, { count: days }));\n if (hours) parts.push(fill(l.hours, { count: hours }));\n if (minutes && !days) parts.push(fill(l.minutes, { count: minutes }));\n return `${fill(labels().bars, { count: bars })}, ${parts.join(\" \") || fill(l.minutes, { count: 0 })}`;\n };\n\n const paintForeground = (\n ctx: CanvasRenderingContext2D,\n v: Visible | null,\n ticks: TimeLabel[],\n ) => {\n const price = panes[0];\n if (!price) return;\n const count = n();\n const text = toCss(theme.text);\n const muted = toCss(theme.textMuted);\n const bgCss = toCss(theme.background);\n const upC = css(upCss());\n const downC = css(downCss());\n\n // ---- price pane contents (clipped)\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, price.top, plotW, price.height);\n ctx.clip();\n\n // high / low of the visible bars\n if (\n v &&\n options.highLowMarkers !== false &&\n style() !== \"line\" &&\n style() !== \"area\" &&\n style() !== \"baseline\"\n ) {\n let hi = -Infinity;\n let lo = Infinity;\n let hiG = -1;\n let loG = -1;\n for (let g = v.s0; g <= v.s1; g++) {\n if (v.cols.high[g] > hi) {\n hi = v.cols.high[g];\n hiG = g;\n }\n if (v.cols.low[g] < lo) {\n lo = v.cols.low[g];\n loG = g;\n }\n }\n ctx.font = font(theme.fontSize);\n ctx.fillStyle = muted;\n ctx.strokeStyle = muted;\n ctx.lineWidth = 1;\n for (const [g, value, below] of [\n [hiG, hi, false],\n [loG, lo, true],\n ] as const) {\n if (g < 0 || !finite(value)) continue;\n const x = xOf(groupCenter(v, g));\n const y = yOf(price.scale, value) + (below ? 9 : -9);\n const leftSide = x > plotW * 0.6;\n const label = formatPrice(value);\n ctx.textBaseline = \"middle\";\n ctx.textAlign = leftSide ? \"right\" : \"left\";\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + (leftSide ? -14 : 14), y);\n ctx.stroke();\n ctx.fillText(label, x + (leftSide ? -17 : 17), y);\n }\n }\n\n // trade markers\n if (v && options.markers?.length) {\n const stack = new Map<string, number>();\n ctx.font = font(theme.fontSize, 600);\n ctx.textAlign = \"center\";\n const many = options.markers.length > 400;\n for (const marker of options.markers) {\n const index = indexOfTimeExt(marker.time);\n if (index < 0 || index > count - 1) continue;\n const g = Math.floor(index / v.size);\n if (g < v.g0 || g > v.g1) continue;\n const x = Math.round(xOf(groupCenter(v, g)));\n const sell = marker.side === \"sell\";\n const color = marker.color ? css(marker.color) : sell ? downC : upC;\n const key = `${g}:${sell}`;\n const offset = stack.get(key) ?? 0;\n stack.set(key, offset + (marker.text && !many ? 30 : 16));\n const anchor = yOf(price.scale, sell ? v.cols.high[g] : v.cols.low[g]);\n const dir = sell ? -1 : 1;\n const tip = anchor + dir * (6 + offset);\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(x, tip);\n ctx.lineTo(x - 5.5, tip + dir * 7);\n ctx.lineTo(x - 2, tip + dir * 7);\n ctx.lineTo(x - 2, tip + dir * 12);\n ctx.lineTo(x + 2, tip + dir * 12);\n ctx.lineTo(x + 2, tip + dir * 7);\n ctx.lineTo(x + 5.5, tip + dir * 7);\n ctx.closePath();\n ctx.fill();\n if (marker.text && !many) {\n ctx.textBaseline = sell ? \"bottom\" : \"top\";\n ctx.fillText(marker.text, x, tip + dir * 14);\n }\n if (marker.price !== undefined && finite(marker.price)) {\n ctx.beginPath();\n ctx.arc(x, yOf(price.scale, marker.price), 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = bgCss;\n ctx.stroke();\n }\n }\n }\n\n // drawings\n const mapper = drawingMapper();\n if (mapper) {\n const context = (drawing: TradingDrawing) => ({\n color: css(drawing.color ?? PRIMARY),\n text,\n background: bgCss,\n up: upC,\n down: downC,\n font: font(theme.fontSize, 500),\n formatPrice,\n formatPercent: (value: number) => formatPercent(value, locale),\n formatSpan,\n textOn,\n });\n for (const drawing of drawings) {\n paintDrawing(ctx, drawing, mapper, context(drawing), {\n selected: drawing.id === selected,\n hovered: drawing.id === hovered,\n });\n }\n if (draft)\n paintDrawing(ctx, draft, mapper, context(draft), {\n selected: true,\n hovered: false,\n });\n }\n\n // price lines (orders, positions, TP / SL, alerts)\n const lastClose = count ? store.close[count - 1] : NaN;\n for (const line of options.priceLines ?? []) {\n const p = linePrice(line);\n const y = Math.round(yOf(price.scale, p)) + 0.5;\n if (!finite(y) || y < price.top || y > price.top + price.height) continue;\n const color = lineColor(line);\n const kind = line.kind ?? \"line\";\n const lineStyle =\n line.lineStyle ??\n (kind === \"position\" || kind === \"line\" ? \"solid\" : \"dashed\");\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth =\n hoveredLine === line.id ||\n (gesture?.kind === \"order\" && gesture.line.id === line.id)\n ? 1.5\n : 1;\n setDash(ctx, lineStyle, 1);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n // label: [grip] title | quantity | profit\n const titleKey = PRICE_LINE_TITLES[kind];\n const title = line.title ?? (titleKey ? labels()[titleKey] : \"\");\n const parts: { text: string; fill: string; color: string }[] = [];\n if (title) parts.push({ text: title, fill: color, color: textOn(color) });\n if (line.quantity !== undefined && line.quantity !== \"\")\n parts.push({ text: String(line.quantity), fill: bgCss, color });\n if (\n kind === \"position\" &&\n typeof line.quantity === \"number\" &&\n finite(lastClose)\n ) {\n const pnl =\n (lastClose - p) * line.quantity * (line.side === \"sell\" ? -1 : 1);\n const pnlFill = pnl >= 0 ? upC : downC;\n parts.push({\n text: `${pnl >= 0 ? \"+\" : \"−\"}${formatPrice(Math.abs(pnl))}`,\n fill: pnlFill,\n color: textOn(pnlFill),\n });\n }\n if (!parts.length && !line.draggable) continue;\n ctx.font = font(theme.fontSize, 600);\n const widths = parts.map((part) => ctx.measureText(part.text).width + 12);\n const grip = line.draggable ? 14 : 0;\n const total = widths.reduce((a, b) => a + b, 0) + grip;\n let x = Math.round(plotW - total - 56);\n const top = Math.round(y - 9.5);\n roundRect(ctx, x - 0.5, top - 0.5, total + 1, 19, 3);\n ctx.fillStyle = bgCss;\n ctx.fill();\n ctx.strokeStyle = color;\n ctx.lineWidth = 1;\n ctx.setLineDash([]);\n ctx.stroke();\n if (grip) {\n ctx.fillStyle = color;\n for (let k = 0; k < 3; k++)\n ctx.fillRect(x + 4, top + 5 + k * 3.5, 6, 1.5);\n x += grip;\n }\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"center\";\n parts.forEach((part, k) => {\n if (part.fill !== bgCss) {\n ctx.fillStyle = part.fill;\n ctx.fillRect(x, top, widths[k], 18);\n }\n ctx.fillStyle = part.color;\n ctx.fillText(part.text, x + widths[k] / 2, top + 9.5);\n x += widths[k];\n });\n }\n\n // last price line\n const lastLine = options.lastPriceLine !== false && count > 0;\n const lastUp = count > 0 && store.close[count - 1] >= store.open[count - 1];\n const lastColor = lastUp ? upC : downC;\n if (lastLine) {\n const y = Math.round(yOf(price.scale, lastClose)) + 0.5;\n ctx.save();\n ctx.strokeStyle = lastColor;\n ctx.setLineDash([1, 2]);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n }\n ctx.restore();\n\n // price axis ticks, except under the labels drawn over the axis\n const covered: number[] = [];\n for (const line of options.priceLines ?? [])\n covered.push(yOf(price.scale, linePrice(line)));\n for (const drawing of drawings) {\n if (drawing.type === \"horizontalLine\" && drawing.points[0])\n covered.push(yOf(price.scale, drawing.points[0].price));\n }\n if (lastLine)\n covered.push(yOf(price.scale, lastClose) + (options.countdown ? 7 : 0));\n ctx.font = font(theme.fontSize);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = muted;\n for (const pane of panes) {\n for (const t of pane.ticks) {\n const y = yOfScaled(pane.scale, t);\n if (y < pane.top + 8 || y > pane.top + pane.height - 8) continue;\n const gap = options.countdown ? 18 : 14;\n if (pane.id === PRICE && covered.some((c) => Math.abs(c - y) < gap))\n continue;\n ctx.fillText(paneTickText(pane, t), plotW + 8, y);\n }\n }\n // time axis ticks\n ctx.textAlign = \"center\";\n for (const t of ticks) {\n ctx.font = font(theme.fontSize, t.bold ? 600 : 400);\n ctx.fillStyle = t.bold ? text : muted;\n ctx.fillText(t.text, t.x, plotH + TIME_AXIS / 2);\n }\n\n // labels of the price lines and drawings\n for (const line of options.priceLines ?? []) {\n const p = linePrice(line);\n const y = yOf(price.scale, p);\n if (!finite(y) || y < price.top || y > price.top + price.height) continue;\n const fill = lineColor(line);\n axisLabel(ctx, y, priceAxisText(p), fill, textOn(fill));\n }\n for (const drawing of drawings) {\n if (drawing.type !== \"horizontalLine\" || !drawing.points[0]) continue;\n const p = drawing.points[0].price;\n const y = yOf(price.scale, p);\n if (y < price.top || y > price.top + price.height) continue;\n const fill = css(drawing.color ?? PRIMARY);\n axisLabel(ctx, y, priceAxisText(p), fill, textOn(fill));\n }\n // last price label (with the countdown)\n if (lastLine) {\n let second: string | undefined;\n if (options.countdown) {\n const tf = timeframe();\n const start = store.time[count - 1];\n let end = start + tf.ms;\n if (tf.unit === \"month\") {\n const date = new Date(start);\n end = Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth() + tf.count,\n date.getUTCDate(),\n date.getUTCHours(),\n date.getUTCMinutes(),\n );\n }\n second = formatCountdown(end - Date.now(), labels());\n }\n axisLabel(\n ctx,\n yOf(price.scale, lastClose),\n priceAxisText(lastClose),\n lastColor,\n textOn(lastColor),\n second,\n );\n }\n\n // crosshair\n const cross = crosshairState();\n if (cross && v) {\n const x = Math.round(xOf(cross.index)) + 0.5;\n ctx.save();\n ctx.strokeStyle = toCss(theme.textMuted, 0.75);\n ctx.lineWidth = 1;\n ctx.setLineDash([4, 3]);\n ctx.beginPath();\n if (x >= 0 && x <= plotW) {\n ctx.moveTo(x, 0);\n ctx.lineTo(x, plotH);\n }\n const y = Math.round(cross.y) + 0.5;\n if (\n finite(y) &&\n y >= cross.pane.top &&\n y <= cross.pane.top + cross.pane.height\n ) {\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n }\n ctx.stroke();\n ctx.restore();\n const labelBg = toCss(theme.text);\n if (\n finite(cross.y) &&\n cross.y >= cross.pane.top &&\n cross.y <= cross.pane.top + cross.pane.height\n ) {\n const scaled = scaledAt(cross.pane.scale, cross.y);\n const textValue =\n cross.pane.id === PRICE\n ? priceAxisText(fromScaled(cross.pane.scale, scaled))\n : paneTickText(cross.pane, scaled);\n axisLabel(ctx, cross.y, textValue, labelBg, bgCss);\n }\n if (x >= 0 && x <= plotW && count) {\n const label = formatCrosshairTime(\n shiftTime(timeAt(cross.index), options.utcOffset),\n tfMs(),\n locale,\n );\n ctx.font = font(theme.fontSize, 500);\n const w = ctx.measureText(label).width + 16;\n const left = clamp(x - w / 2, 0, width - w);\n roundRect(ctx, left, plotH + 3, w, 21, 3);\n ctx.fillStyle = labelBg;\n ctx.fill();\n ctx.fillStyle = bgCss;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(label, left + w / 2, plotH + 14);\n }\n }\n };\n\n // -------------------------------------------------------------- legends\n\n let legendKey = \"\";\n const legendRows = new Map<string, LegendRow>();\n const legendBoxes = new Map<string, HTMLDivElement>();\n\n const legendBox = (id: string) => {\n let box = legendBoxes.get(id);\n if (!box) {\n box = make(\"div\", {\n position: \"absolute\",\n left: \"8px\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n gap: \"1px\",\n maxWidth: \"calc(100% - 16px)\",\n fontSize: \"12px\",\n lineHeight: \"18px\",\n fontVariantNumeric: \"tabular-nums\",\n whiteSpace: \"nowrap\",\n pointerEvents: \"none\",\n });\n legends.appendChild(box);\n legendBoxes.set(id, box);\n }\n return box;\n };\n\n const legendRow = (\n box: HTMLDivElement,\n title: string,\n study: Study | null,\n outputs: number,\n ) => {\n const row = make(\"div\", {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"0 4px\",\n marginLeft: \"-4px\",\n borderRadius: \"4px\",\n background:\n \"color-mix(in srgb, var(--surface-color, var(--background-color, #fff)) 86%, transparent)\",\n });\n let button: HTMLButtonElement | null = null;\n if (study) {\n button = make(\"button\", {\n all: \"unset\",\n cursor: \"pointer\",\n pointerEvents: \"auto\",\n color: \"var(--text-color, #1f2937)\",\n fontWeight: \"500\",\n borderRadius: \"3px\",\n });\n button.type = \"button\";\n button.textContent = title;\n button.setAttribute(\n \"aria-label\",\n fill(labels().toggleIndicator, { name: title }),\n );\n button.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n const next = !isVisible(study);\n visibility.set(study.id, next);\n emit(\"indicatorToggle\", { id: study.id, visible: next });\n updateLegends();\n invalidate();\n });\n button.addEventListener(\"pointerdown\", (event) =>\n event.stopPropagation(),\n );\n row.appendChild(button);\n } else if (title) {\n const label = make(\"span\", { fontWeight: \"600\" });\n label.textContent = title;\n row.appendChild(label);\n }\n const values: HTMLSpanElement[] = [];\n for (let i = 0; i < outputs; i++) {\n const span = make(\"span\", {});\n row.appendChild(span);\n values.push(span);\n }\n box.appendChild(row);\n return { row, values, button };\n };\n\n const buildLegends = () => {\n legendRows.clear();\n for (const box of legendBoxes.values()) box.remove();\n legendBoxes.clear();\n if (options.legend === false) return;\n const priceBox = legendBox(PRICE);\n const head = [\n options.symbol,\n options.labels?.timeframe ??\n (typeof options.timeframe === \"string\" ? options.timeframe : \"\"),\n ]\n .filter(Boolean)\n .join(\" · \");\n legendRows.set(\"ohlc\", legendRow(priceBox, head, null, 1));\n for (const study of studies) {\n if (study.overlay && study.type === \"volume\") {\n legendRows.set(study.id, legendRow(priceBox, titleOf(study), study, 1));\n } else if (study.overlay) {\n legendRows.set(\n study.id,\n legendRow(priceBox, titleOf(study), study, study.outputs.length),\n );\n }\n }\n for (const c of compares)\n legendRows.set(`compare:${c.id}`, legendRow(priceBox, \"\", null, 1));\n for (const study of studies) {\n if (study.overlay) continue;\n legendRows.set(\n study.id,\n legendRow(\n legendBox(study.id),\n titleOf(study),\n study,\n study.outputs.length,\n ),\n );\n }\n };\n\n /** Legend title: indicator abbreviations, but a word for the volume */\n const titleOf = (study: Study) =>\n study.type === \"volume\" ? labels().volume : study.title;\n\n const setSpan = (\n span: HTMLSpanElement | undefined,\n text: string,\n color?: string,\n ) => {\n if (!span) return;\n if (span.textContent !== text) span.textContent = text;\n const c = color ?? \"\";\n if (span.style.color !== c) span.style.color = c;\n };\n\n const updateLegends = () => {\n const key = [\n options.legend !== false,\n options.symbol,\n options.timeframe,\n ...studies.map((s) => `${s.id}:${titleOf(s)}:${s.outputs.length}`),\n ...compares.map((c) => c.id),\n texts.toggleIndicator,\n options.labels?.timeframe,\n ].join(\"|\");\n if (key !== legendKey) {\n legendKey = key;\n buildLegends();\n }\n if (options.legend === false) return;\n for (const pane of panes) {\n const box = legendBoxes.get(pane.id);\n if (box) box.style.top = `${pane.top + 6}px`;\n }\n const count = n();\n const cross = crosshairState();\n const index = clamp(\n cross && cross.index >= 0 && cross.index < count\n ? cross.index\n : count - 1,\n 0,\n Math.max(0, count - 1),\n );\n const l = labels();\n const ohlc = legendRows.get(\"ohlc\");\n const upC = css(upCss());\n const downC = css(downCss());\n if (ohlc && count) {\n const d = display();\n const o = d.open[index];\n const c = d.close[index];\n const prevClose = index > 0 ? d.close[index - 1] : o;\n const change = c - prevClose;\n const color = c >= o ? upC : downC;\n const span = ohlc.values[0];\n const html = [\n [l.open, d.open[index]],\n [l.high, d.high[index]],\n [l.low, d.low[index]],\n [l.close, c],\n ]\n .map(\n ([name, value]) =>\n `<span style=\"color:var(--text-secondary-color,#6b7280)\">${escapeHtml(String(name))}</span><span style=\"color:${color}\">${escapeHtml(formatPrice(value as number))}</span>`,\n )\n .join(\" \");\n const pct = prevClose ? (change / prevClose) * 100 : NaN;\n const changeName = l.change\n ? `<span style=\"color:var(--text-secondary-color,#6b7280)\">${escapeHtml(l.change)}</span>`\n : \"\";\n const changeHtml = `${changeName}<span style=\"color:${change >= 0 ? upC : downC}\">${change >= 0 ? \"+\" : \"−\"}${escapeHtml(formatPrice(Math.abs(change)))} (${escapeHtml(formatPercent(pct, locale))})</span>`;\n const vol = store.hasVolume\n ? ` <span style=\"color:var(--text-secondary-color,#6b7280)\">${escapeHtml(l.volume)}</span>${escapeHtml(formatVolume(store.volume[index], locale))}`\n : \"\";\n const next = `${html} ${changeHtml}${vol}`;\n if (span && span.dataset.html !== next) {\n span.innerHTML = next;\n span.dataset.html = next;\n span.style.display = \"inline-flex\";\n span.style.gap = \"4px\";\n span.style.flexWrap = \"wrap\";\n }\n }\n for (const study of studies) {\n const row = legendRows.get(study.id);\n if (!row) continue;\n const shown = isVisible(study);\n row.row.style.opacity = shown ? \"1\" : \"0.5\";\n if (row.button) {\n row.button.setAttribute(\"aria-pressed\", String(shown));\n row.button.style.textDecoration = shown ? \"none\" : \"line-through\";\n }\n const slots = study.outputs.length;\n study.outputs.forEach((out, i) => {\n // the MACD histogram (drawn first, under the lines) is listed last\n const span =\n row.values[study.type === \"macd\" ? (i + slots - 1) % slots : i];\n if (!shown || !count) {\n setSpan(span, \"\");\n return;\n }\n if (out.kind === \"volume\") {\n const c = store.close[index] >= store.open[index] ? upC : downC;\n setSpan(span, formatVolume(store.volume[index], locale), c);\n return;\n }\n const value = out.values[index];\n let color = out.color ? css(out.color) : undefined;\n if (out.kind === \"histogram\") color = value >= 0 ? upC : downC;\n const prefix =\n study.outputs.length > 1 && study.type !== \"boll\"\n ? `${out.label} `\n : \"\";\n setSpan(span, `${prefix}${studyValueText(study, value)}`, color);\n });\n }\n for (const c of compares) {\n const row = legendRows.get(`compare:${c.id}`);\n if (!row) continue;\n const value = c.values[index];\n const base = compareBase(c);\n const pct = finite(base) ? (value / base - 1) * 100 : NaN;\n setSpan(\n row.values[0],\n `${c.name} ${formatPrice(value)} ${formatPercent(pct, locale)}`,\n css(c.color),\n );\n }\n };\n\n const escapeHtml = (text: string) =>\n text.replace(/[&<>\"]/g, (ch) =>\n ch === \"&\"\n ? \"&amp;\"\n : ch === \"<\"\n ? \"&lt;\"\n : ch === \">\"\n ? \"&gt;\"\n : \"&quot;\",\n );\n\n // ---------------------------------------------------------------- frame\n\n const invalidate = () => {\n if (destroyed || frameId) return;\n frameId = win?.requestAnimationFrame\n ? win.requestAnimationFrame(frame)\n : (setTimeout(() => frame(Date.now()), 16) as unknown as number);\n };\n\n const animate = (now: number) => {\n let active = false;\n if (scrollAnim) {\n const t = Math.min(1, (now - scrollAnim.start) / 320);\n const eased = 1 - (1 - t) ** 3;\n right = scrollAnim.from + (scrollAnim.to - scrollAnim.from) * eased;\n if (t >= 1) scrollAnim = null;\n else active = true;\n }\n if (kinetic) {\n const dt = Math.min(64, now - kinetic.t);\n kinetic.t = now;\n const before = right;\n right -= (kinetic.v * dt) / spacing;\n kinetic.v *= Math.exp(-dt / 320);\n clampView();\n if (Math.abs(kinetic.v) < 0.02 || right === before) kinetic = null;\n else active = true;\n }\n return active;\n };\n\n const measureAxis = (ctx: CanvasRenderingContext2D) => {\n ctx.font = font(theme.fontSize, 500);\n let widest = 0;\n for (const pane of panes) {\n for (const t of pane.ticks)\n widest = Math.max(widest, ctx.measureText(paneTickText(pane, t)).width);\n }\n const count = n();\n if (count) {\n widest = Math.max(\n widest,\n ctx.measureText(priceAxisText(store.close[count - 1])).width,\n );\n if (options.countdown)\n widest = Math.max(widest, ctx.measureText(\"00:00:00\").width);\n }\n const wanted = Math.max(MIN_AXIS, Math.ceil(widest + 18));\n // shrink only when clearly narrower (no jitter while the price moves)\n if (wanted > axisW || wanted < axisW - 12) axisW = wanted;\n };\n\n function frame(now?: number) {\n frameId = 0;\n if (destroyed) return;\n width = root.clientWidth;\n height = root.clientHeight;\n if (width <= 0 || height <= 0) return;\n const time = now ?? Date.now();\n const animating = animate(\n typeof performance !== \"undefined\" ? performance.now() : time,\n );\n const dpr = win?.devicePixelRatio || 1;\n syncDerived();\n sizeCanvas(background, dpr);\n sizeCanvas(foreground, dpr);\n const bg = background.getContext(\"2d\");\n const fg = foreground.getContext(\"2d\");\n plotH = Math.max(1, height - TIME_AXIS);\n for (let pass = 0; pass < 2; pass++) {\n plotW = Math.max(1, width - axisW);\n layoutPanes();\n if (pendingRange) applyRange(pendingRange);\n clampView();\n vis = computeVisible();\n autoscale(vis);\n for (const pane of panes) {\n const ticks = scaleTicks(pane.scale, pane.id === PRICE ? 44 : 30);\n // fixed-range panes (RSI) label their bands and their middle\n const range = pane.study?.range;\n const bands = pane.study?.bands;\n pane.ticks =\n range && bands\n ? [...bands, (range[0] + range[1]) / 2].sort((a, b) => a - b)\n : ticks.scaled;\n pane.step = ticks.step;\n }\n const before = axisW;\n if (fg) measureAxis(fg);\n if (axisW === before) break;\n }\n const v = vis;\n pendingRange = null;\n const ticks = fg ? timeTicks(v, fg) : [];\n renderData(v, dpr);\n if (bg) {\n bg.setTransform(dpr, 0, 0, dpr, 0, 0);\n bg.clearRect(0, 0, width, height);\n paintBackground(bg, v, ticks);\n }\n if (fg) {\n fg.setTransform(dpr, 0, 0, dpr, 0, 0);\n fg.clearRect(0, 0, width, height);\n paintForeground(fg, v, ticks);\n }\n updateLegends();\n updateJump();\n emitView();\n if (animating) invalidate();\n }\n\n const updateJump = () => {\n const count = n();\n const price = panes[0];\n const show = count > 0 && price && xOf(count - 1) > plotW + spacing * 0.5;\n jump.style.display = show ? \"flex\" : \"none\";\n if (show && price) {\n jump.style.left = `${plotW - 40}px`;\n jump.style.top = `${price.top + price.height - 40}px`;\n const text = labels().scrollToRealtime;\n if (jump.getAttribute(\"aria-label\") !== text) {\n jump.setAttribute(\"aria-label\", text);\n jump.title = text;\n }\n }\n };\n\n const visibleRange = (): TradingVisibleRange => {\n const from = right - plotW / spacing;\n return { from, to: right, fromTime: timeAt(from), toTime: timeAt(right) };\n };\n\n const emitView = () => {\n const count = n();\n if (!count) return;\n const range = visibleRange();\n if (\n !lastRange ||\n Math.abs(lastRange.from - range.from) > 1e-6 ||\n Math.abs(lastRange.to - range.to) > 1e-6\n ) {\n lastRange = range;\n emit(\"visibleRangeChange\", range);\n }\n if (range.from < 10 && historyFirst !== store.time[0]) {\n historyFirst = store.time[0];\n emit(\"historyRequest\", { firstTime: store.time[0], count });\n }\n const cross = crosshairState();\n const key = cross ? `${cross.index}|${cross.price}|${cross.pane.id}` : \"\";\n if (key !== lastCrosshair) {\n lastCrosshair = key;\n if (!cross) {\n emit(\"crosshairMove\", null);\n } else {\n const event: TradingCrosshairEvent = {\n index: cross.index,\n time: timeAt(cross.index),\n bar:\n cross.index >= 0 && cross.index < count\n ? readBar(store, cross.index)\n : null,\n price: cross.price,\n pane: cross.pane.id,\n x: xOf(cross.index),\n y: cross.y,\n };\n emit(\"crosshairMove\", event);\n }\n }\n };\n\n // ---------------------------------------------------------- interaction\n\n const local = (event: { clientX: number; clientY: number }) => {\n const rect = root.getBoundingClientRect();\n return { x: event.clientX - rect.left, y: event.clientY - rect.top };\n };\n\n const applyRange = (range: { from: number; to: number }) => {\n spacing = plotW / (range.to - range.from);\n right = range.to;\n clampView();\n };\n\n /**\n * Zooms around `x`; while the latest bar is in view it stays where it is\n * (the reader is following the market), like the price scale side of\n * trading terminals\n */\n const zoomAt = (x: number, factor: number) => {\n const count = n();\n if (count && followsRealtime()) x = Math.min(plotW, xOf(count - 1));\n const anchor = indexAt(x);\n spacing = spacing * factor;\n clampView();\n right = anchor + (plotW - x) / spacing;\n clampView();\n kinetic = null;\n scrollAnim = null;\n invalidate();\n };\n\n const anchorAt = (x: number, y: number): TradingDrawingPoint => {\n const index = Math.round(indexAt(x));\n return { time: timeAt(index), price: valueAt(panes[0].scale, y) };\n };\n\n const setTool = (next: TradingDrawingTool, notify: boolean) => {\n if (next === tool) return;\n tool = next;\n draft = null;\n if (notify) emit(\"drawingToolChange\", next);\n invalidate();\n };\n\n const select = (id: string | null) => {\n if (id === selected) return;\n selected = id;\n emit(\"drawingSelect\", id);\n invalidate();\n };\n\n const commitDrawings = (next: readonly TradingDrawing[]) => {\n drawings = next;\n emittedDrawings = next;\n emit(\"drawingsChange\", next);\n invalidate();\n };\n\n const finishDraft = () => {\n if (!draft) return;\n const done = draft;\n draft = null;\n commitDrawings([...drawings, done]);\n select(done.id);\n if (!options.keepDrawingMode) setTool(\"cursor\", true);\n };\n\n const hitLine = (x: number, y: number) => {\n const price = panes[0];\n if (!price || x > plotW) return null;\n for (const line of options.priceLines ?? []) {\n if (!line.draggable) continue;\n if (Math.abs(yOf(price.scale, linePrice(line)) - y) <= 5) return line;\n }\n return null;\n };\n\n const hitDrawingAt = (x: number, y: number) => {\n const mapper = drawingMapper();\n if (!mapper || y < mapper.top || y > mapper.bottom || x > plotW)\n return null;\n for (let i = drawings.length - 1; i >= 0; i--) {\n const hit = hitDrawing(drawings[i], mapper, { x, y });\n if (hit) return { drawing: drawings[i], hit };\n }\n return null;\n };\n\n const separatorAt = (y: number) => {\n for (let i = 1; i < panes.length; i++) {\n if (Math.abs(panes[i].top - y) <= 4) return i;\n }\n return -1;\n };\n\n const updateCursor = (x: number, y: number) => {\n let cursor = \"crosshair\";\n hoveredLine = null;\n let nextHover: string | null = null;\n if (gesture?.kind === \"pan\" && gesture.moved) cursor = \"grabbing\";\n else if (separatorAt(y) > 0) cursor = \"row-resize\";\n else if (x > plotW && y < plotH) cursor = \"ns-resize\";\n else if (y > plotH) cursor = \"ew-resize\";\n else if (tool === \"cursor\") {\n const line = hitLine(x, y);\n if (line) {\n cursor = \"ns-resize\";\n hoveredLine = line.id;\n } else {\n const hit = hitDrawingAt(x, y);\n if (hit) {\n nextHover = hit.drawing.id;\n cursor = hit.drawing.locked\n ? \"pointer\"\n : hit.hit.part === \"handle\"\n ? \"move\"\n : \"pointer\";\n }\n }\n }\n if (nextHover !== hovered) hovered = nextHover;\n if (root.style.cursor !== cursor) root.style.cursor = cursor;\n };\n\n const onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0 && event.pointerType === \"mouse\") return;\n const { x, y } = local(event);\n pointer = { x, y };\n keyboardIndex = null;\n kinetic = null;\n scrollAnim = null;\n if (event.pointerType === \"touch\") {\n touches.set(event.pointerId, { x, y });\n if (touches.size === 2) {\n const [a, b] = [...touches.values()];\n pinch = { distance: Math.hypot(a.x - b.x, a.y - b.y), spacing };\n gesture = null;\n return;\n }\n }\n try {\n root.setPointerCapture(event.pointerId);\n } catch {\n // the pointer may already be released\n }\n const sep = separatorAt(y);\n if (sep > 0) {\n const above = panes[sep - 1];\n const below = panes[sep];\n gesture = {\n kind: \"separator\",\n index: sep,\n y,\n above: above.height,\n below: below.height,\n };\n return;\n }\n if (x > plotW && y < plotH) {\n const pane = paneAt(y);\n if (pane)\n gesture = {\n kind: \"axisY\",\n pane,\n y,\n min: pane.scale.min,\n max: pane.scale.max,\n };\n return;\n }\n if (y > plotH) {\n gesture = { kind: \"axisX\", x, spacing };\n return;\n }\n const pane = paneAt(y);\n if (tool !== \"cursor\" && pane?.id === PRICE && n()) {\n const point = anchorAt(x, y);\n if (draft) {\n draft = { ...draft, points: [draft.points[0], point] };\n finishDraft();\n gesture = null;\n return;\n }\n const type = tool;\n draft = {\n id: `drawing-${Date.now().toString(36)}-${++drawingCounter}`,\n type,\n points: anchorCount(type) === 1 ? [point] : [point, point],\n };\n if (anchorCount(type) === 1) {\n finishDraft();\n return;\n }\n gesture = { kind: \"create\", x, y, moved: false };\n invalidate();\n return;\n }\n if (tool === \"cursor\") {\n const line = hitLine(x, y);\n if (line) {\n gesture = { kind: \"order\", line, startPrice: line.price };\n return;\n }\n const hit = hitDrawingAt(x, y);\n if (hit) {\n select(hit.drawing.id);\n if (!hit.drawing.locked) {\n gesture = {\n kind: \"drawing\",\n id: hit.drawing.id,\n handle: hit.hit.part === \"handle\" ? hit.hit.index : -1,\n x,\n y,\n original: hit.drawing,\n moved: false,\n };\n }\n return;\n }\n }\n gesture = {\n kind: \"pan\",\n x,\n y,\n right,\n pane,\n moved: false,\n lastX: x,\n lastY: y,\n lastT: event.timeStamp,\n velocity: 0,\n };\n };\n\n const onPointerMove = (event: PointerEvent) => {\n const { x, y } = local(event);\n pointer = { x, y };\n if (event.pointerType === \"touch\" && touches.has(event.pointerId)) {\n touches.set(event.pointerId, { x, y });\n if (pinch && touches.size === 2) {\n const [a, b] = [...touches.values()];\n const distance = Math.hypot(a.x - b.x, a.y - b.y);\n const count = n();\n const mid =\n count && followsRealtime()\n ? Math.min(plotW, xOf(count - 1))\n : (a.x + b.x) / 2;\n const anchor = indexAt(mid);\n spacing = (pinch.spacing * distance) / Math.max(1, pinch.distance);\n clampView();\n right = anchor + (plotW - mid) / spacing;\n clampView();\n invalidate();\n return;\n }\n }\n const g = gesture;\n if (!g) {\n updateCursor(x, y);\n invalidate();\n return;\n }\n switch (g.kind) {\n case \"pan\": {\n const dx = x - g.x;\n if (!g.moved && Math.hypot(dx, y - g.y) < 3) break;\n g.moved = true;\n right = g.right - dx / spacing;\n if (g.pane && !g.pane.scale.auto) panScale(g.pane.scale, y - g.lastY);\n g.lastY = y;\n const dt = Math.max(1, event.timeStamp - g.lastT);\n g.velocity = 0.6 * ((x - g.lastX) / dt) + 0.4 * g.velocity;\n g.lastX = x;\n g.lastT = event.timeStamp;\n clampView();\n root.style.cursor = \"grabbing\";\n break;\n }\n case \"axisY\": {\n const scale = g.pane.scale;\n scale.min = g.min;\n scale.max = g.max;\n zoomScale(scale, Math.exp((y - g.y) * 0.006));\n break;\n }\n case \"axisX\": {\n const lastIndex = right;\n spacing = g.spacing * Math.exp((x - g.x) * 0.006);\n clampView();\n right = lastIndex;\n clampView();\n break;\n }\n case \"separator\": {\n const dy = y - g.y;\n const above = panes[g.index - 1];\n const below = panes[g.index];\n if (!above || !below) break;\n const total = g.above + g.below;\n const nextBelow = clamp(g.below - dy, MIN_PANE, total - MIN_PANE);\n paneHeights.set(below.id, nextBelow);\n if (above.id !== PRICE) paneHeights.set(above.id, total - nextBelow);\n break;\n }\n case \"order\": {\n const price = valueAt(panes[0].scale, y);\n const step = 10 ** -precision();\n lineOverrides.set(g.line.id, Math.round(price / step) * step);\n break;\n }\n case \"drawing\": {\n if (!g.moved && Math.hypot(x - g.x, y - g.y) < 3) break;\n g.moved = true;\n const scale = panes[0].scale;\n const di = Math.round(indexAt(x) - indexAt(g.x));\n const ds = scaledAt(scale, y) - scaledAt(scale, g.y);\n const points = g.original.points.map((p, i) => {\n if (g.handle >= 0 && i !== g.handle) return p;\n if (g.handle >= 0) return anchorAt(x, y);\n return {\n time: timeAt(Math.round(indexOfTimeExt(p.time)) + di),\n price: fromScaled(scale, toScaled(scale, p.price) + ds),\n };\n });\n drawings = drawings.map((d) => (d.id === g.id ? { ...d, points } : d));\n break;\n }\n case \"create\": {\n if (draft) {\n if (Math.hypot(x - g.x, y - g.y) >= 4) g.moved = true;\n draft = { ...draft, points: [draft.points[0], anchorAt(x, y)] };\n }\n break;\n }\n }\n invalidate();\n };\n\n const onPointerUp = (event: PointerEvent) => {\n touches.delete(event.pointerId);\n if (touches.size < 2) pinch = null;\n const g = gesture;\n gesture = null;\n const { x, y } = local(event);\n if (event.pointerType === \"touch\") pointer = null;\n if (!g) {\n invalidate();\n return;\n }\n switch (g.kind) {\n case \"pan\":\n if (!g.moved) {\n if (selected) select(null);\n const pane = paneAt(y);\n if (pane && x <= plotW) {\n emit(\"click\", {\n index: Math.round(indexAt(x)),\n time: timeAt(Math.round(indexAt(x))),\n price: valueAt(pane.scale, y),\n pane: pane.id,\n });\n }\n } else if (\n options.kineticScroll !== false &&\n event.timeStamp - g.lastT < 60 &&\n Math.abs(g.velocity) > 0.25\n ) {\n kinetic = {\n v: g.velocity,\n t:\n typeof performance !== \"undefined\"\n ? performance.now()\n : Date.now(),\n };\n }\n break;\n case \"order\": {\n const next = lineOverrides.get(g.line.id);\n if (next !== undefined && next !== g.startPrice) {\n emit(\"orderMove\", {\n id: g.line.id,\n price: next,\n previousPrice: g.startPrice,\n line: g.line,\n });\n } else {\n lineOverrides.delete(g.line.id);\n }\n break;\n }\n case \"drawing\":\n if (g.moved) commitDrawings(drawings);\n break;\n case \"create\":\n // a click starts a click-click drawing; a drag finishes it\n if (g.moved) finishDraft();\n break;\n default:\n break;\n }\n updateCursor(x, y);\n invalidate();\n };\n\n const onPointerLeave = (event: PointerEvent) => {\n if (gesture || event.pointerType === \"touch\") return;\n pointer = null;\n hovered = null;\n hoveredLine = null;\n invalidate();\n };\n\n const onWheel = (event: WheelEvent) => {\n const mode = options.wheel ?? \"zoom\";\n if (mode === \"none\") return;\n const { x } = local(event);\n const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? plotW : 1;\n const dx = event.deltaX * unit;\n const dy = event.deltaY * unit;\n const modifier = event.ctrlKey || event.metaKey;\n if (mode === \"modifier\" && !modifier && Math.abs(dx) <= Math.abs(dy))\n return;\n event.preventDefault();\n keyboardIndex = null;\n if (Math.abs(dx) > Math.abs(dy) || event.shiftKey) {\n right += (Math.abs(dx) > Math.abs(dy) ? dx : dy) / spacing;\n clampView();\n kinetic = null;\n invalidate();\n return;\n }\n const factor = Math.exp(-dy * (event.ctrlKey ? 0.01 : 0.0015));\n zoomAt(Math.min(x, plotW), factor);\n };\n\n const onDoubleClick = (event: MouseEvent) => {\n const { x, y } = local(event);\n if (x > plotW && y < plotH) {\n const pane = paneAt(y);\n if (pane) pane.scale.auto = true;\n } else if (y > plotH) {\n spacing = options.barSpacing ?? 8;\n instance.scrollToRealtime(true);\n } else {\n for (const scale of scales.values()) scale.auto = true;\n }\n invalidate();\n };\n\n const announce = (index: number) => {\n if (index < 0 || index >= n()) return;\n const d = display();\n const l = labels();\n live.textContent = fill(l.announcement, {\n time: formatCrosshairTime(\n shiftTime(store.time[index], options.utcOffset),\n tfMs(),\n locale,\n ),\n open: formatPrice(d.open[index]),\n high: formatPrice(d.high[index]),\n low: formatPrice(d.low[index]),\n close: formatPrice(d.close[index]),\n });\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n const count = n();\n const page = Math.max(1, Math.floor(plotW / spacing / 2));\n const move = (index: number) => {\n keyboardIndex = clamp(index, 0, Math.max(0, count - 1));\n const x = xOf(keyboardIndex);\n if (x < spacing) right += (spacing - x) / spacing + 1;\n if (x > plotW - spacing) right -= (x - plotW + spacing) / spacing - 1;\n clampView();\n announce(keyboardIndex);\n };\n const current = keyboardIndex ?? Math.min(count - 1, Math.round(right));\n switch (event.key) {\n case \"ArrowLeft\":\n move(current - (event.shiftKey ? 10 : 1));\n break;\n case \"ArrowRight\":\n move(current + (event.shiftKey ? 10 : 1));\n break;\n case \"PageUp\":\n move(current - page);\n break;\n case \"PageDown\":\n move(current + page);\n break;\n case \"Home\":\n move(0);\n break;\n case \"End\":\n move(count - 1);\n instance.scrollToRealtime(true);\n break;\n case \"+\":\n case \"=\":\n case \"ArrowUp\":\n zoomAt(keyboardIndex !== null ? xOf(keyboardIndex) : plotW, 1.2);\n break;\n case \"-\":\n case \"_\":\n case \"ArrowDown\":\n zoomAt(keyboardIndex !== null ? xOf(keyboardIndex) : plotW, 1 / 1.2);\n break;\n case \"Escape\":\n if (draft) draft = null;\n else if (tool !== \"cursor\") setTool(\"cursor\", true);\n else if (selected) select(null);\n else keyboardIndex = null;\n break;\n case \"Delete\":\n case \"Backspace\": {\n const target = drawings.find((d) => d.id === selected);\n if (!target || target.locked) return;\n select(null);\n commitDrawings(drawings.filter((d) => d.id !== target.id));\n break;\n }\n default:\n return;\n }\n event.preventDefault();\n invalidate();\n };\n\n const onFocus = () => {\n let keyboard = true;\n try {\n keyboard = root.matches(\":focus-visible\");\n } catch {\n // older engines: show the ring\n }\n if (keyboard)\n root.style.boxShadow = `inset 0 0 0 2px ${toCss(theme.primary, 0.6)}`;\n };\n const onBlur = () => {\n root.style.boxShadow = \"\";\n if (keyboardIndex !== null) {\n keyboardIndex = null;\n invalidate();\n }\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 root.addEventListener(\"focus\", onFocus);\n root.addEventListener(\"blur\", onBlur);\n jump.addEventListener(\"pointerdown\", (event) => event.stopPropagation());\n jump.addEventListener(\"click\", () => instance.scrollToRealtime(true));\n\n const resizeObserver =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(() => invalidate())\n : null;\n resizeObserver?.observe(root);\n\n const refreshTheme = () => {\n if (destroyed) return;\n const next = readTheme(root);\n if (themeColorsChanged(theme, next)) themeVersion++;\n theme = next;\n legendKey = \"\";\n invalidate();\n };\n const unwatchTheme = watchTheme(refreshTheme);\n\n // the page language, when no `locale` is given\n let langObserver: MutationObserver | null = null;\n if (typeof MutationObserver === \"function\" && root.ownerDocument) {\n langObserver = new MutationObserver(() => {\n if (options.locale) return;\n const before = locale;\n resolveTexts();\n if (locale === before) return;\n legendKey = \"\";\n optionsVersion++;\n applyStatic();\n invalidate();\n });\n langObserver.observe(root.ownerDocument.documentElement, {\n attributes: true,\n attributeFilter: [\"lang\"],\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 () => createDataCanvas(doc),\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 geomKey = \"\";\n if (next) {\n root.dataset.renderer = next.kind;\n root.insertBefore(next.canvas, foreground);\n emit(\"renderer\", next.kind);\n }\n resolveReady(next?.kind ?? null);\n invalidate();\n };\n\n // ------------------------------------------------------------- options\n\n const applyStatic = () => {\n const symbol = options.symbol ?? \"\";\n root.setAttribute(\n \"aria-label\",\n options.ariaLabel ?? fill(labels().chart, { symbol }).trim(),\n );\n const wantTimer = !!options.countdown && options.lastPriceLine !== false;\n if (wantTimer && !countdownTimer)\n countdownTimer = setInterval(invalidate, 1000);\n if (!wantTimer && countdownTimer) {\n clearInterval(countdownTimer);\n countdownTimer = null;\n }\n };\n\n const applyOptions = (previous: TradingChartOptions | null) => {\n const next = options;\n resolveTexts();\n if (\n !previous ||\n next.indicators !== previous.indicators ||\n next.utcOffset !== previous.utcOffset\n ) {\n rebuildStudies();\n }\n if (!previous || next.compare !== previous.compare) rebuildCompares();\n if (next.bars && (!previous || next.bars !== previous.bars)) {\n if (previous) applyBarsOption(next.bars);\n else replaceBars(next.bars);\n } else if (!next.bars && previous?.bars) {\n replaceBars([]);\n }\n if (previous && next.barSpacing !== previous.barSpacing && next.barSpacing)\n spacing = next.barSpacing;\n if (previous && next.scaleMode !== previous.scaleMode) {\n const price = scales.get(PRICE);\n if (price) price.auto = true;\n }\n if (\n next.drawings &&\n next.drawings !== emittedDrawings &&\n (!previous || next.drawings !== previous.drawings)\n ) {\n drawings = next.drawings;\n if (selected && !drawings.some((d) => d.id === selected)) select(null);\n }\n if (\n previous &&\n (next.drawingMode ?? \"cursor\") !== (previous.drawingMode ?? \"cursor\")\n ) {\n setTool(next.drawingMode ?? \"cursor\", false);\n }\n if (previous && next.priceLines !== previous.priceLines)\n lineOverrides.clear();\n if (previous && next.chartStyle !== previous.chartStyle)\n haValid = Math.min(haValid, 0);\n optionsVersion++;\n applyStatic();\n invalidate();\n };\n\n applyOptions(null);\n void initRenderer();\n\n // ------------------------------------------------------------------ api\n\n const instance: TradingChartInstance = {\n setOptions(next) {\n if (destroyed) return;\n const previous = options;\n options = { ...next };\n applyOptions(previous);\n if ((next.renderer ?? \"auto\") !== (previous.renderer ?? \"auto\"))\n void initRenderer();\n },\n setBars(bars) {\n replaceBars(bars);\n },\n update(bar) {\n const before = n();\n const follow = followsRealtime();\n const at = storeUpdate(store, bar);\n if (at < 0) return;\n if (n() > before && follow) right += n() - before;\n afterDataChange(at);\n },\n appendBars(bars) {\n const before = n();\n const follow = followsRealtime();\n const at = storeAppend(store, bars);\n if (at < 0) return;\n if (follow) right += n() - before;\n afterDataChange(at);\n },\n prependBars(bars) {\n const added = storePrepend(store, bars);\n if (!added) return;\n pyramid = createPyramid();\n haPyramid = createPyramid();\n haValid = 0;\n right += added;\n if (keyboardIndex !== null) keyboardIndex += added;\n afterDataChange(0);\n },\n getBarCount: () => n(),\n getBar: (index) =>\n index >= 0 && index < n() ? readBar(store, Math.floor(index)) : null,\n scrollToRealtime(animateScroll = true) {\n const target = n() - 1 + (options.rightOffset ?? 8);\n kinetic = null;\n if (\n animateScroll &&\n finite(right) &&\n Math.abs(target - right) * spacing < plotW * 6\n ) {\n scrollAnim = {\n from: right,\n to: target,\n start:\n typeof performance !== \"undefined\" ? performance.now() : Date.now(),\n };\n } else {\n right = target;\n }\n invalidate();\n },\n fitContent() {\n const count = n();\n if (!count) return;\n instance.setVisibleRange({\n from: -0.5,\n to: count - 1 + (options.rightOffset ?? 8),\n });\n },\n getVisibleRange: () => visibleRange(),\n setVisibleRange({ from, to }) {\n if (!(to > from)) return;\n kinetic = null;\n scrollAnim = null;\n pendingRange = { from, to };\n applyRange(pendingRange);\n invalidate();\n },\n setScaleMode(mode) {\n options = { ...options, scaleMode: mode };\n const price = scales.get(PRICE);\n if (price) price.auto = true;\n invalidate();\n },\n resetPriceScales() {\n for (const scale of scales.values()) scale.auto = true;\n invalidate();\n },\n setDrawingTool: (next) => setTool(next, true),\n getDrawingTool: () => tool,\n getDrawings: () => drawings,\n setDrawings(next) {\n drawings = next;\n if (selected && !drawings.some((d) => d.id === selected)) select(null);\n invalidate();\n },\n removeDrawing(id) {\n if (!drawings.some((d) => d.id === id)) return;\n if (selected === id) select(null);\n commitDrawings(drawings.filter((d) => d.id !== id));\n },\n selectDrawing: (id) => select(id),\n setIndicatorVisible(id, visible) {\n visibility.set(id, visible);\n invalidate();\n },\n getRenderer: () => renderer?.kind ?? null,\n ready,\n refreshTheme,\n resize: () => invalidate(),\n on(type, listener) {\n let set = listeners.get(type);\n if (!set) listeners.set(type, (set = new Set()));\n set.add(listener as (event: never) => void);\n return () => set.delete(listener as (event: never) => void);\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n if (frameId) {\n if (win?.cancelAnimationFrame) win.cancelAnimationFrame(frameId);\n else clearTimeout(frameId);\n }\n if (countdownTimer) clearInterval(countdownTimer);\n resizeObserver?.disconnect();\n unwatchTheme();\n langObserver?.disconnect();\n root.removeEventListener(\"wheel\", onWheel);\n renderer?.destroy();\n renderer = null;\n resolveReady(null);\n listeners.clear();\n root.remove();\n },\n };\n return instance;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"chart.js","names":["styleElement","storeUpdate","storeAppend","storePrepend","assign","TIME_AXIS","MIN_AXIS","MAX_SPACING","MIN_PANE","PRICE","UP","DOWN","WARNING","PRIMARY","HISTORY_LIMIT","PALETTE","LINE_STYLES","syncHooks","PRICE_LINE_TITLES","clamp","v","lo","hi","textOn","color","parseColor","fill","luminance","finite","createTradingChart","doc","container","win","options","initial","destroyed","make","tag","style","root","layer","background","foreground","legends","jump","live","toolbar","editor","sheet","store","createStore","pyramid","createPyramid","ha","haValid","haPyramid","studies","studyValid","visibility","compares","outputLods","dataVersion","tailVersion","detectedPrecision","inferredTimeframe","DAY","spacing","right","plotW","plotH","axisW","width","height","panes","scales","paneHeights","vis","volumeOverlayMax","theme","readTheme","themeVersion","optionsVersion","renderer","rendererToken","frameId","layers","geomKey","builtTail","itemVersion","resolveReady","ready","resolve","pointer","keyboardIndex","gesture","touches","pinch","kinetic","scrollAnim","pendingRange","drawings","emittedDrawings","committed","undoStack","redoStack","undoKey","tool","selected","hovered","draft","draftClicks","draftPane","drawingCounter","textBoxes","editing","toolbarKey","paletteOpen","lineOverrides","hoveredLine","canvasButtons","hoveredButton","lastRange","silentRange","externalCross","lastCrosshair","historyFirst","countdownTimer","replay","replayPicking","replaySpeed","profile","listeners","emit","type","fn","event","locale","resolveLocale","texts","localeLabels","TRADING_LABELS","resolveTexts","labels","n","redUp","upCss","downCss","css","fallback","toCss","value","alpha","precision","priceFormat","priceFormatter","priceFormatKey","formatPrice","key","timeframe","parseTimeframe","tfMs","font","weight","size","isVisible","study","xOf","index","indexAt","x","timeAt","count","i","timeAtFrac","edge","t","indexAtTimeFrac","time","indexOfTime","span","zone","offsetMinutes","zoneOffset","studyOffset","shift","MINUTE","colorOf","groupRanges","rangeLevel","lod","values","lodOf","out","createRangePyramid","indexOfTimeExt","last","display","markDirty","from","invalidateRangePyramid","c","level","l","p","syncDerived","valid","next","heikinAshiInto","j","lowerBoundTime","afterDataChange","detectPrecision","inferTimeframe","invalidate","rebuildStudies","buildStudies","reused","id","s","rebuildCompares","data","series","a","b","LINE_COLORS","d","followsRealtime","replaceBars","setBars","bars","scale","applyBarsOption","length","inputLength","first","barAt","follow","before","at","updateBar","added","layoutPanes","paneStudies","available","wanted","total","max","k","heights","h","priceHeight","scaleOf","createScale","mode","price","top","paneAt","y","clampView","minSpacing","computeVisible","left","src","cols","pyramidLevel","i0","i1","r0","r1","groupCenter","g","groupBars","firstVisibleIndex","compareBase","compareScaled","base","toScaled","baselinePrice","outputExtent","r","offset","shiftBars","range","autoscale","pane","closeOnly","vol","extent","scaled","fitScale","band","timeTicks","tf","intraday","gEnd","groupTime","candidates","prev","boundaryWeight","sample","gap","ctx","pickTicks","tickText","paneTickText","formatPercent","stepDecimals","fromScaled","formatVolume","formatFixed","studyValueText","createLayers","result","up","down","upP","packColor","downP","bg","metrics","candleMetrics","dpr","X","histogramHalf","volumeColors","bottom","Y","yOf","lineLayer","buffer","LineBuffer","isLive","ga","gb","toY","lineWidth","rangeLayer","dx","extra","to","prevY","yLo","yHi","second","st","BarBuffer","pixelRange","yOfScaled","lineColor","area","AreaBuffer","yb","upArea","downArea","upLine","downLine","px","py","point","hollow","ohlc","wick","body","wicks","bodies","caps","ticks","tick","o","cx","wt","wb","clampRange","side","bt","bb","segments","edges","box","items","y0","strong","faded","mix","fixed","radius","half","runLayer","lastMain","version","item","renderData","canvas","bw","bh","sizeCanvas","w","roundRect","paintFill","outA","f","outB","ra","rb","above","below","run","sign","flush","ya","d0","cy","paintSessionBreaks","xs","prevDay","day","profileOptions","option","paintVolumeProfile","rows","volumeProfile","largest","fromRight","upColor","downColor","y1","upLength","downLength","dir","start","paintBackground","grid","showGrid","ys","axisLabel","textColor","text","priceAxisText","line","kind","linePrice","crosshairState","bar","valueAt","best","yy","paneOf","drawingMapper","formatSpan","abs","ms","parts","days","hours","HOUR","minutes","paneValueText","roundPrice","step","pill","align","fillColor","canvasButton","paintDrawings","all","position","mapper","own","drawing","paintDrawing","colors","paintForeground","muted","bgCss","upC","downC","hiG","loG","label","labelLeft","row","priceLegend","roomRight","roomLeft","leftSide","tx","stack","many","marker","sell","anchor","tip","lastClose","lineStyle","setDash","titleKey","title","pnl","pnlFill","widths","part","grip","partFill","lastLine","lastUp","lastColor","compareLabels","covered","end","date","formatCountdown","badgeY","formatCrosshairTime","cross","labelBg","scaledAt","textValue","bx","by","orderPrice","hover","legendKey","legendRows","legendBoxes","legendBox","legendRow","button","updateLegends","outputs","buildLegends","priceBox","head","slots","titleOf","setSpan","maxWidth","prevClose","change","html","name","escapeHtml","pct","shown","source","prefix","ch","frame","animate","active","now","eased","dt","measureAxis","widest","animating","fg","pass","applyRange","scaleTicks","bands","updateJump","updateToolbar","positionEditor","emitView","buttonAt","updateCursor","show","visibleRange","readBar","local","rect","zoomAt","factor","anchorAt","setTool","notify","select","undoState","emitUndo","state","commitDrawings","restoreDrawings","undo","previous","closeEditor","redo","updateDrawing","patch","removeDrawing","positionPoints","entry","risk","target","long","stop","finishDraft","done","openEditor","fixDraftAnchor","followDraft","hitLine","hitDrawingAt","hit","hitDrawing","separatorAt","autosizeEditor","created","commit","icon","dash","path","toolbarButton","pressed","content","onClick","separator","buildToolbar","swatch","isFillable","remove","palette","dragging","pts","handlePoints","x0","x1","replayState","emitReplay","columnsOf","showBars","hasVolume","stopReplayTimer","beginReplay","replayStepBy","playReplay","speed","interval","perTick","endReplay","wasPicking","restore","cursor","nextHover","onPointerDown","sep","isPosition","anchors","anchorCount","onPointerMove","distance","mid","panScale","zoomScale","lastIndex","dy","nextBelow","points","moveHandle","di","ds","onPointerUp","onPointerLeave","onWheel","unit","modifier","onDoubleClick","instance","announce","page","move","current","keyboard","resizeObserver","refreshTheme","themeColorsChanged","unwatchTheme","watchTheme","langObserver","applyStatic","compose","origin","view","element","computed","fullscreen","onFullscreen","initRenderer","token","createRenderer","createDataCanvas","exclude","symbol","wantTimer","applyOptions","nextZone","isTimeZone","timeChanged","appendBars","prependBars","animateScroll","quality","visible","set","listener"],"sources":["../../../../../charts/src/engine/trading/chart.ts"],"sourcesContent":["// Trading chart: candles (or bars, lines, areas...) over a gap-free index\n// axis, indicator panes, price lines, markers, drawings and streaming.\n//\n// Layers, bottom to top: a Canvas2D background (grid, bands, watermark),\n// the GPU data canvas covering every pane (candles, volumes, indicator\n// lines, baked in device pixels), a Canvas2D overlay (axes, labels, price\n// lines, markers, drawings, crosshair) and DOM legends. The GPU items are\n// rebuilt only when the view, the scales or the data change; a tick\n// rebuilds only the items of the last bar.\n\nimport {\n luminance,\n mix,\n packColor,\n parseColor,\n toCss,\n type Rgba,\n} from \"../color\";\nimport { createDataCanvas, styleElement } from \"../dom\";\nimport { createRenderer } from \"../renderers/detect\";\nimport type { ChartRenderer, RenderItem } from \"../renderers/types\";\nimport { stepDecimals } from \"../scale\";\nimport {\n readTheme,\n themeColorsChanged,\n watchTheme,\n type ChartTheme,\n} from \"../theme\";\nimport type { ChartRendererKind } from \"../types\";\nimport { localeLabels, resolveLocale } from \"../locale\";\nimport {\n anchorCount,\n handlePoints,\n hitDrawing,\n isFillable,\n isPosition,\n moveHandle,\n paintDrawing,\n setDash,\n type Box,\n type DrawingMapper,\n} from \"./drawings\";\nimport {\n DAY,\n HOUR,\n MINUTE,\n boundaryWeight,\n detectPrecision,\n formatCountdown,\n formatCrosshairTime,\n formatFixed,\n formatPercent,\n formatVolume,\n inferTimeframe,\n isTimeZone,\n pickTicks,\n priceFormatter,\n tickText,\n zoneOffset,\n type UtcOffset,\n} from \"./format\";\nimport {\n AreaBuffer,\n BarBuffer,\n LineBuffer,\n candleMetrics,\n clampRange,\n pixelRange,\n} from \"./geometry\";\nimport { heikinAshiInto, parseTimeframe, volumeProfile } from \"./indicators\";\nimport { TRADING_LABELS, fill, type TradingTexts } from \"./labels\";\nimport {\n createScale,\n fitScale,\n fromScaled,\n panScale,\n scaleTicks,\n scaledAt,\n toScaled,\n valueAt,\n yOf,\n yOfScaled,\n zoomScale,\n type PaneScale,\n} from \"./scale\";\nimport {\n appendBars as storeAppend,\n createPyramid,\n createRangePyramid,\n createStore,\n indexOfTime,\n inputLength,\n invalidateRangePyramid,\n barAt,\n prependBars as storePrepend,\n pyramidLevel,\n rangeLevel,\n readBar,\n setBars as storeSet,\n updateBar as storeUpdate,\n lowerBoundTime,\n type BarStore,\n type OhlcColumns,\n type RangePyramid,\n} from \"./store\";\nimport {\n LINE_COLORS,\n buildStudies,\n type Study,\n type StudyOutput,\n} from \"./studies\";\nimport type {\n TradingBarsInput,\n TradingChartEventMap,\n TradingChartInstance,\n TradingChartOptions,\n TradingCrosshairEvent,\n TradingDrawing,\n TradingDrawingPatch,\n TradingDrawingPoint,\n TradingDrawingTool,\n TradingLineStyle,\n TradingPriceLine,\n TradingReplayState,\n TradingScaleMode,\n TradingUndoState,\n TradingVisibleRange,\n TradingVolumeProfile,\n TradingVolumeProfileOptions,\n} from \"./types\";\n\nconst TIME_AXIS = 28;\nconst MIN_AXIS = 60;\nconst MAX_SPACING = 60;\nconst MIN_PANE = 48;\nconst PRICE = \"price\";\nconst UP = \"var(--success-color, #089981)\";\nconst DOWN = \"var(--danger-color, #f23645)\";\nconst WARNING = \"var(--warning-color, #f59e0b)\";\nconst PRIMARY = \"var(--primary-color, #2962ff)\";\nconst HISTORY_LIMIT = 100;\n\n/** Colors of the drawing toolbar */\nconst PALETTE = [\n \"#2962ff\",\n \"#089981\",\n \"#f23645\",\n \"#f59e0b\",\n \"#a855f7\",\n \"#0ea5e9\",\n \"#ec4899\",\n \"#787b86\",\n];\nconst LINE_STYLES: readonly TradingLineStyle[] = [\"solid\", \"dashed\", \"dotted\"];\n\n/**\n * Hooks used by `syncCharts` to follow another chart without echoing its\n * events back (internal: not part of the public instance)\n */\nexport const syncHooks = new WeakMap<\n TradingChartInstance,\n { setTimeRange(range: { from: number; to: number }): void }\n>();\n\nconst PRICE_LINE_TITLES: Record<string, keyof TradingTexts | undefined> = {\n order: \"limit\",\n position: \"position\",\n takeProfit: \"takeProfit\",\n stopLoss: \"stopLoss\",\n alert: \"alert\",\n};\n\nconst clamp = (v: number, lo: number, hi: number) =>\n v < lo ? lo : v > hi ? hi : v;\n\n/** Readable text on a fill (a CSS color): dark on light fills, white otherwise */\nconst textOn = (fill: string) => {\n const color = parseColor(fill);\n return color && luminance(color) > 0.5 ? \"#0b0e11\" : \"#fff\";\n};\n\nconst finite = Number.isFinite;\n\ninterface Pane {\n id: string;\n study: Study | null;\n scale: PaneScale;\n top: number;\n height: number;\n ticks: number[];\n step: number;\n}\n\n/** Bars drawn: a level of the pyramid and the groups in view */\ninterface Visible {\n /** Logical index at the left edge */\n left: number;\n level: number;\n /** Bars per group */\n size: number;\n cols: OhlcColumns;\n /** Groups drawn (one extra on each side) */\n g0: number;\n g1: number;\n /** Groups whose center is in the plot */\n s0: number;\n s1: number;\n /** Last group */\n last: number;\n}\n\ninterface LegendRow {\n row: HTMLDivElement;\n values: HTMLSpanElement[];\n button: HTMLButtonElement | null;\n}\n\ntype Layer = (ga: number, gb: number, live: boolean) => RenderItem[];\n\n/** Interaction in progress */\ntype Gesture =\n | {\n kind: \"pan\";\n x: number;\n y: number;\n right: number;\n pane: Pane | null;\n moved: boolean;\n lastX: number;\n lastY: number;\n lastT: number;\n velocity: number;\n }\n | { kind: \"axisY\"; pane: Pane; y: number; min: number; max: number }\n | { kind: \"axisX\"; x: number; spacing: number }\n | {\n kind: \"separator\";\n index: number;\n y: number;\n above: number;\n below: number;\n }\n | { kind: \"order\"; line: TradingPriceLine; startPrice: number }\n | {\n kind: \"drawing\";\n id: string;\n pane: Pane;\n handle: number;\n x: number;\n y: number;\n original: TradingDrawing;\n moved: boolean;\n }\n | { kind: \"create\"; pane: Pane; x: number; y: number; moved: boolean }\n | { kind: \"button\"; action: () => void };\n\n/** Mounts a trading chart in `container` (which should have a height) */\nexport const createTradingChart = (\n container: HTMLElement,\n initial: TradingChartOptions = {},\n): TradingChartInstance => {\n const doc = container.ownerDocument;\n const win = doc.defaultView;\n let options: TradingChartOptions = { ...initial };\n let destroyed = false;\n\n // ------------------------------------------------------------------ DOM\n\n const make = <K extends keyof HTMLElementTagNameMap>(\n tag: K,\n style: Partial<CSSStyleDeclaration>,\n ) => styleElement(doc.createElement(tag), style) as HTMLElementTagNameMap[K];\n\n const root = make(\"div\", {\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n minHeight: \"0\",\n overflow: \"hidden\",\n outline: \"none\",\n userSelect: \"none\",\n touchAction: \"pan-y\",\n fontFamily: \"var(--font-family-sans, system-ui, sans-serif)\",\n color: \"var(--text-color, #1f2937)\",\n cursor: \"crosshair\",\n });\n root.className = \"minerva-trading-chart\";\n root.tabIndex = 0;\n root.setAttribute(\"role\", \"figure\");\n root.setAttribute(\"aria-roledescription\", \"chart\");\n\n const layer = (tag: \"canvas\" | \"div\") =>\n make(tag, {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n pointerEvents: \"none\",\n });\n const background = layer(\"canvas\") as HTMLCanvasElement;\n const foreground = layer(\"canvas\") as HTMLCanvasElement;\n background.setAttribute(\"aria-hidden\", \"true\");\n foreground.setAttribute(\"aria-hidden\", \"true\");\n const legends = layer(\"div\") as HTMLDivElement;\n legends.style.right = \"0\";\n legends.style.bottom = \"0\";\n const jump = make(\"button\", {\n position: \"absolute\",\n display: \"none\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"28px\",\n height: \"28px\",\n padding: \"0\",\n borderRadius: \"50%\",\n border:\n \"1px solid color-mix(in srgb, var(--border-color, #e5e7eb) 80%, transparent)\",\n background: \"var(--surface-elevated-color, var(--surface-color, #fff))\",\n color: \"var(--text-color, #1f2937)\",\n boxShadow: \"0 4px 14px -4px rgba(15, 23, 42, 0.25)\",\n cursor: \"pointer\",\n });\n jump.type = \"button\";\n jump.innerHTML =\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M3 3l5 5-5 5M9 3l5 5-5 5\"/></svg>';\n const live = make(\"div\", {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n whiteSpace: \"nowrap\",\n });\n live.setAttribute(\"aria-live\", \"polite\");\n // floating toolbar of the selected drawing, and the editor of text drawings\n const toolbar = make(\"div\", {\n position: \"absolute\",\n display: \"none\",\n alignItems: \"center\",\n gap: \"1px\",\n padding: \"3px\",\n borderRadius: \"8px\",\n border:\n \"1px solid color-mix(in srgb, var(--border-color, #e5e7eb) 85%, transparent)\",\n background: \"var(--surface-elevated-color, var(--surface-color, #fff))\",\n boxShadow: \"0 8px 24px -8px rgba(15, 23, 42, 0.35)\",\n zIndex: \"2\",\n cursor: \"default\",\n });\n toolbar.className = \"minerva-trading-toolbar\";\n toolbar.setAttribute(\"role\", \"toolbar\");\n const editor = make(\"textarea\", {\n position: \"absolute\",\n display: \"none\",\n minWidth: \"120px\",\n minHeight: \"28px\",\n padding: \"5px 9px\",\n resize: \"none\",\n border: \"1px solid var(--primary-color, #2962ff)\",\n borderRadius: \"5px\",\n outline: \"none\",\n background: \"var(--surface-elevated-color, var(--surface-color, #fff))\",\n color: \"var(--text-color, #1f2937)\",\n font: \"500 13px var(--font-family-sans, system-ui, sans-serif)\",\n boxShadow: \"0 6px 18px -6px rgba(15, 23, 42, 0.3)\",\n zIndex: \"3\",\n });\n editor.rows = 1;\n const sheet = make(\"style\", {});\n sheet.textContent = `.minerva-trading-toolbar button{all:unset;box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;min-width:26px;height:26px;padding:0 5px;border-radius:5px;cursor:pointer;color:var(--text-color,#1f2937)}.minerva-trading-toolbar button:hover{background:color-mix(in srgb,var(--text-color,#1f2937) 9%,transparent)}.minerva-trading-toolbar button:focus-visible{box-shadow:inset 0 0 0 2px var(--primary-color,#2962ff)}.minerva-trading-toolbar button[aria-pressed=\"true\"]{background:color-mix(in srgb,var(--primary-color,#2962ff) 16%,transparent);color:var(--primary-color,#2962ff)}.minerva-trading-toolbar .sep{width:1px;height:18px;margin:0 3px;background:var(--border-color,#e5e7eb)}`;\n root.append(\n sheet,\n background,\n foreground,\n legends,\n jump,\n toolbar,\n editor,\n live,\n );\n container.appendChild(root);\n\n // ----------------------------------------------------------------- data\n\n const store = createStore();\n let pyramid = createPyramid();\n /** Heikin-Ashi bars (time and volume shared with the store) */\n const ha: OhlcColumns = {\n time: store.time,\n open: new Float64Array(0),\n high: new Float64Array(0),\n low: new Float64Array(0),\n close: new Float64Array(0),\n volume: store.volume,\n };\n let haValid = 0;\n let haPyramid = createPyramid();\n let studies: Study[] = [];\n const studyValid = new Map<Study, number>();\n const visibility = new Map<string, boolean>();\n interface CompareRuntime {\n id: string;\n name: string;\n color: string;\n width: number;\n times: Float64Array;\n data: Float64Array;\n values: Float64Array;\n valid: number;\n lod: RangePyramid;\n }\n let compares: CompareRuntime[] = [];\n /** Min / max pyramids of the indicator outputs (zoomed-out decimation) */\n const outputLods = new WeakMap<StudyOutput, RangePyramid>();\n /** Changes when bars other than the last one change */\n let dataVersion = 0;\n /** Changes when the last bar changes */\n let tailVersion = 0;\n let detectedPrecision = 2;\n let inferredTimeframe = DAY;\n\n // ----------------------------------------------------------------- view\n\n let spacing = options.barSpacing ?? 8;\n let right = NaN;\n let plotW = 0;\n let plotH = 0;\n let axisW = MIN_AXIS;\n let width = 0;\n let height = 0;\n let panes: Pane[] = [];\n const scales = new Map<string, PaneScale>();\n const paneHeights = new Map<string, number>();\n let vis: Visible | null = null;\n let volumeOverlayMax = 0;\n\n // -------------------------------------------------------------- state\n\n let theme: ChartTheme = readTheme(root);\n let themeVersion = 0;\n let optionsVersion = 0;\n let renderer: ChartRenderer | null = null;\n let rendererToken = 0;\n let frameId = 0;\n let layers: { fn: Layer; main: RenderItem[]; live: RenderItem[] }[] = [];\n let geomKey = \"\";\n let builtTail = -1;\n let itemVersion = 0;\n let resolveReady!: (kind: ChartRendererKind | null) => void;\n const ready = new Promise<ChartRendererKind | null>((resolve) => {\n resolveReady = resolve;\n });\n\n let pointer: { x: number; y: number } | null = null;\n let keyboardIndex: number | null = null;\n let gesture: Gesture | null = null;\n const touches = new Map<number, { x: number; y: number }>();\n let pinch: { distance: number; spacing: number } | null = null;\n let kinetic: { v: number; t: number } | null = null;\n let scrollAnim: { from: number; to: number; start: number } | null = null;\n /** Range asked by `setVisibleRange` / `fitContent`, applied once the plot width is known */\n let pendingRange: { from: number; to: number } | null = null;\n\n let drawings: readonly TradingDrawing[] = options.drawings ?? [];\n let emittedDrawings: readonly TradingDrawing[] | null = null;\n /** Drawings of the last commit: the base of the undo history */\n let committed: readonly TradingDrawing[] = drawings;\n const undoStack: (readonly TradingDrawing[])[] = [];\n const redoStack: (readonly TradingDrawing[])[] = [];\n let undoKey = \"false|false\";\n let tool: TradingDrawingTool = options.drawingMode ?? \"cursor\";\n let selected: string | null = null;\n let hovered: string | null = null;\n let draft: TradingDrawing | null = null;\n /** Clicks still needed by the drawing being made (three-anchor tools) */\n let draftClicks = 0;\n let draftPane: string = PRICE;\n let drawingCounter = 0;\n /** Text boxes measured when painted (hit tests of text drawings) */\n const textBoxes = new Map<string, Box>();\n /** Drawing whose text is being edited */\n let editing: { id: string; created: boolean } | null = null;\n let toolbarKey = \"\";\n let paletteOpen = false;\n const lineOverrides = new Map<string, number>();\n let hoveredLine: string | null = null;\n /** Clickable areas painted on the canvas (close buttons, order entry) */\n let canvasButtons: {\n x: number;\n y: number;\n w: number;\n h: number;\n action: () => void;\n }[] = [];\n let hoveredButton = -1;\n let lastRange: TradingVisibleRange | null = null;\n /** The next view change comes from a synchronized chart: not reported */\n let silentRange = false;\n /** Crosshair set by `setCrosshair` (synchronized charts) */\n let externalCross: { time: number; price: number } | null = null;\n let lastCrosshair = \"\";\n let historyFirst = NaN;\n let countdownTimer: ReturnType<typeof setInterval> | null = null;\n /** Bar replay: the full history, and the bars shown so far */\n let replay: {\n source: BarStore;\n playing: boolean;\n speed: number;\n timer: ReturnType<typeof setInterval> | null;\n } | null = null;\n let replayPicking = false;\n let replaySpeed = 4;\n let profile: { key: string; result: TradingVolumeProfile } | null = null;\n\n // ---------------------------------------------------------- listeners\n\n const listeners = new Map<string, Set<(event: never) => void>>();\n const emit = <K extends keyof TradingChartEventMap>(\n type: K,\n event: TradingChartEventMap[K],\n ) => {\n listeners\n .get(type)\n ?.forEach((fn) => (fn as (e: TradingChartEventMap[K]) => void)(event));\n };\n\n // ------------------------------------------------------------- helpers\n\n // locale and texts, resolved at each options update (and `<html lang>` change)\n let locale = resolveLocale(options.locale);\n let texts = localeLabels(TRADING_LABELS, locale, options.labels);\n const resolveTexts = () => {\n locale = resolveLocale(options.locale);\n texts = localeLabels(TRADING_LABELS, locale, options.labels);\n };\n const labels = () => texts;\n const n = () => store.length;\n const style = () => options.chartStyle ?? \"candles\";\n const redUp = () => options.colorConvention === \"redUp\";\n const upCss = () => options.upColor ?? (redUp() ? DOWN : UP);\n const downCss = () => options.downColor ?? (redUp() ? UP : DOWN);\n const resolve = (css: string, fallback: Rgba = theme.primary): Rgba =>\n theme.resolve ? theme.resolve(css, fallback) : fallback;\n const css = (value: string, alpha = 1) => toCss(resolve(value), alpha);\n const precision = () => options.precision ?? detectedPrecision;\n let priceFormat = priceFormatter(2, undefined);\n let priceFormatKey = \"\";\n const formatPrice = (value: number) => {\n if (options.formatPrice) return options.formatPrice(value);\n const key = `${precision()}|${locale}`;\n if (key !== priceFormatKey) {\n priceFormat = priceFormatter(precision(), locale);\n priceFormatKey = key;\n }\n return priceFormat(value);\n };\n const timeframe = () => {\n const parsed =\n options.timeframe !== undefined\n ? parseTimeframe(options.timeframe)\n : null;\n return (\n parsed ?? {\n unit: \"ms\" as const,\n count: inferredTimeframe,\n ms: inferredTimeframe,\n }\n );\n };\n const tfMs = () => timeframe().ms;\n const font = (size: number, weight = 400) =>\n `${weight} ${size}px ${theme.fontFamily}`;\n\n const isVisible = (study: Study) =>\n visibility.get(study.id) ?? study.config.visible ?? true;\n\n const xOf = (index: number) => plotW + (index - right) * spacing;\n const indexAt = (x: number) => right - (plotW - x) / spacing;\n\n /** Time of a logical index (extrapolated outside the bars) */\n const timeAt = (index: number) => {\n const count = n();\n if (!count) return 0;\n const i = Math.round(index);\n if (i < 0) return store.time[0] + i * tfMs();\n if (i >= count) return store.time[count - 1] + (i - count + 1) * tfMs();\n return store.time[i];\n };\n\n /** Time of a fractional index, interpolated between the bars */\n const timeAtFrac = (index: number) => {\n const count = n();\n if (!count) return 0;\n const i = Math.floor(index);\n if (i < 0 || i >= count - 1) {\n const edge = i < 0 ? 0 : count - 1;\n return store.time[edge] + (index - edge) * tfMs();\n }\n const t = index - i;\n return store.time[i] + t * (store.time[i + 1] - store.time[i]);\n };\n\n /** Fractional index of a time (the inverse of `timeAtFrac`) */\n const indexAtTimeFrac = (time: number) => {\n const count = n();\n if (!count) return 0;\n if (time >= store.time[count - 1])\n return count - 1 + (time - store.time[count - 1]) / tfMs();\n if (time <= store.time[0]) return (time - store.time[0]) / tfMs();\n const i = indexOfTime(store.time, count, time);\n const span = store.time[i + 1] - store.time[i];\n return i + (span > 0 ? (time - store.time[i]) / span : 0);\n };\n\n // displayed time: a fixed offset, a time zone or the local time\n let zone: string | undefined;\n const offsetMinutes = (time: number) =>\n options.utcOffset ??\n (zone\n ? zoneOffset(time, zone)\n : -new Date(finite(time) ? time : 0).getTimezoneOffset());\n const studyOffset: UtcOffset = (time) => offsetMinutes(time);\n /** Time shifted so that the UTC getters read the displayed time */\n const shift = (time: number) => time + offsetMinutes(time) * MINUTE;\n\n /** CSS color of a study color: `up` / `down` stand for the bar colors */\n const colorOf = (color: string) =>\n color === \"up\" ? upCss() : color === \"down\" ? downCss() : color;\n\n /** Min / max / last of each visible group of a column of values */\n const groupRanges = (\n v: Visible,\n values: Float64Array,\n lod: RangePyramid,\n ): {\n min: ArrayLike<number>;\n max: ArrayLike<number>;\n last: ArrayLike<number>;\n } => {\n if (!v.level) return { min: values, max: values, last: values };\n const level = rangeLevel(lod, values, n(), v.level);\n return level;\n };\n const lodOf = (out: StudyOutput) => {\n let lod = outputLods.get(out);\n if (!lod) outputLods.set(out, (lod = createRangePyramid()));\n return lod;\n };\n\n /** Logical index of a time (extrapolated outside the bars) */\n const indexOfTimeExt = (time: number) => {\n const count = n();\n if (!count) return 0;\n const last = store.time[count - 1];\n if (time > last) return count - 1 + (time - last) / tfMs();\n if (time < store.time[0]) return (time - store.time[0]) / tfMs();\n return indexOfTime(store.time, count, time);\n };\n\n /** Bars as drawn: Heikin-Ashi or the store */\n const display = (): OhlcColumns => (style() === \"heikinAshi\" ? ha : store);\n\n // ------------------------------------------------------- derived data\n\n const markDirty = (from: number) => {\n for (const study of studies) {\n studyValid.set(study, Math.min(studyValid.get(study) ?? 0, from));\n for (const out of study.outputs) {\n const lod = outputLods.get(out);\n if (lod) invalidateRangePyramid(lod, from);\n }\n }\n haValid = Math.min(haValid, from);\n for (const c of compares) {\n c.valid = Math.min(c.valid, from);\n invalidateRangePyramid(c.lod, from);\n }\n profile = null;\n const level = (p: typeof pyramid) => {\n for (const l of p.levels)\n if (l) l.valid = Math.min(l.valid, Math.floor(from / l.size));\n };\n level(pyramid);\n level(haPyramid);\n };\n\n const syncDerived = () => {\n const count = n();\n for (const study of studies) {\n const valid = studyValid.get(study) ?? 0;\n if (valid < count) {\n study.compute(store, valid);\n studyValid.set(study, count);\n }\n }\n ha.time = store.time;\n ha.volume = store.volume;\n if (style() === \"heikinAshi\" && haValid < count) {\n if (ha.open.length < store.capacity) {\n for (const key of [\"open\", \"high\", \"low\", \"close\"] as const) {\n const next = new Float64Array(store.capacity);\n next.set(ha[key].subarray(0, haValid));\n ha[key] = next;\n }\n }\n heikinAshiInto(\n store.open,\n store.high,\n store.low,\n store.close,\n count,\n ha,\n haValid,\n );\n haValid = count;\n }\n for (const c of compares) {\n if (c.valid >= count) continue;\n if (c.values.length < store.capacity) {\n const next = new Float64Array(store.capacity).fill(NaN);\n next.set(c.values.subarray(0, c.valid));\n c.values = next;\n }\n for (let i = c.valid; i < count; i++) {\n const j =\n lowerBoundTime(c.times, c.times.length, store.time[i] + 0.5) - 1;\n c.values[i] = j >= 0 ? c.data[j] : NaN;\n }\n c.valid = count;\n }\n };\n\n const afterDataChange = (from: number) => {\n markDirty(from);\n const count = n();\n if (from < count - 1) dataVersion++;\n tailVersion++;\n if (count) {\n detectedPrecision = Math.max(\n from === 0 ? 0 : detectedPrecision,\n detectPrecision(store.close, from, count),\n detectPrecision(store.open, Math.max(from, count - 50), count),\n );\n if (from === 0 || count < 80)\n inferredTimeframe = inferTimeframe(store.time, count);\n }\n invalidate();\n };\n\n const rebuildStudies = () => {\n const { studies: next, reused } = buildStudies(\n options.indicators ?? [],\n studies,\n studyOffset,\n );\n for (const study of studies)\n if (!reused.has(study)) studyValid.delete(study);\n for (const study of next) if (!reused.has(study)) studyValid.set(study, 0);\n studies = next;\n // drop the user's toggles of indicators whose visibility is now set\n for (const id of [...visibility.keys()])\n if (!studies.some((s) => s.id === id)) visibility.delete(id);\n };\n\n const rebuildCompares = () => {\n compares = (options.compare ?? []).map((series, i) => {\n const data = [...series.data].sort((a, b) => a.time - b.time);\n return {\n id: series.id ?? series.name,\n name: series.name,\n color: series.color ?? LINE_COLORS[(i + 2) % LINE_COLORS.length],\n width: series.lineWidth ?? 1.5,\n times: Float64Array.from(data, (d) => d.time),\n data: Float64Array.from(data, (d) => d.value),\n values: new Float64Array(0),\n valid: 0,\n lod: createRangePyramid(),\n };\n });\n };\n\n // ---------------------------------------------------------- bars input\n\n /** Last bar visible: new bars keep the view at the latest bar */\n const followsRealtime = () => {\n const count = n();\n if (!count || !finite(right)) return true;\n const x = xOf(count - 1);\n return x >= 0 && x <= plotW + spacing * 0.5;\n };\n\n const replaceBars = (bars: TradingBarsInput) => {\n storeSet(store, bars);\n pyramid = createPyramid();\n haPyramid = createPyramid();\n haValid = 0;\n historyFirst = NaN;\n for (const scale of scales.values()) scale.auto = true;\n right = n() - 1 + (options.rightOffset ?? 8);\n kinetic = null;\n scrollAnim = null;\n afterDataChange(0);\n };\n\n /**\n * New `bars` option: streamed (same first bars plus newer ones),\n * prepended history (same last bar), or replaced\n */\n const applyBarsOption = (bars: TradingBarsInput) => {\n const count = n();\n const length = inputLength(bars);\n if (count >= 2 && length >= count) {\n const first = barAt(bars, 0).time;\n const last = store.time[count - 1];\n if (\n first === store.time[0] &&\n barAt(bars, count - 2).time === store.time[count - 2]\n ) {\n // streaming through the props: update the last bar, append the rest\n const follow = followsRealtime();\n const before = count;\n let from = count;\n for (let i = count - 1; i < length; i++) {\n const at = storeUpdate(store, barAt(bars, i));\n if (at >= 0) from = Math.min(from, at);\n }\n if (follow) right += n() - before;\n if (from < n()) afterDataChange(from);\n return;\n }\n if (barAt(bars, length - 1).time === last && length > count) {\n const added = length - count;\n storeSet(store, bars);\n pyramid = createPyramid();\n haPyramid = createPyramid();\n haValid = 0;\n right += added;\n afterDataChange(0);\n return;\n }\n }\n replaceBars(bars);\n };\n\n // --------------------------------------------------------------- layout\n\n const layoutPanes = () => {\n const paneStudies = studies.filter((s) => !s.overlay);\n const available = plotH;\n const wanted = paneStudies.map((s) => paneHeights.get(s.id) ?? s.height);\n const total = wanted.reduce((a, b) => a + b, 0);\n const max = Math.max(0, available * 0.62);\n const k = total > max && total > 0 ? max / total : 1;\n const heights = wanted.map((h) =>\n Math.max(MIN_PANE * Math.min(1, k * 2), h * k),\n );\n const priceHeight = Math.max(\n 40,\n available - heights.reduce((a, b) => a + b, 0),\n );\n const next: Pane[] = [];\n const scaleOf = (id: string, mode: TradingScaleMode) => {\n let scale = scales.get(id);\n if (!scale) {\n scale = createScale(mode);\n scales.set(id, scale);\n }\n if (scale.mode !== mode) {\n scale.mode = mode;\n scale.auto = true;\n }\n return scale;\n };\n const price = scaleOf(PRICE, options.scaleMode ?? \"linear\");\n price.top = 0;\n price.height = priceHeight;\n price.marginTop = 0.1;\n price.marginBottom = 0.08;\n next.push({\n id: PRICE,\n study: null,\n scale: price,\n top: 0,\n height: priceHeight,\n ticks: [],\n step: 0,\n });\n let top = priceHeight;\n paneStudies.forEach((study, i) => {\n const scale = scaleOf(study.id, \"linear\");\n scale.top = top;\n scale.height = heights[i];\n scale.marginTop = study.type === \"volume\" ? 0.18 : 0.14;\n scale.marginBottom = study.type === \"volume\" ? 0 : 0.1;\n if (study.range) scale.marginTop = scale.marginBottom = 0.06;\n next.push({\n id: study.id,\n study,\n scale,\n top,\n height: heights[i],\n ticks: [],\n step: 0,\n });\n top += heights[i];\n });\n for (const id of [...scales.keys()])\n if (!next.some((p) => p.id === id)) scales.delete(id);\n panes = next;\n };\n\n const paneAt = (y: number) =>\n panes.find((p) => y >= p.top && y < p.top + p.height) ?? null;\n\n const clampView = () => {\n const count = n();\n const minSpacing = Math.min(1, (plotW * 0.8) / Math.max(1, count));\n spacing = clamp(spacing, Math.max(1e-4, minSpacing), MAX_SPACING);\n const bars = plotW / spacing;\n if (!finite(right)) right = count - 1 + (options.rightOffset ?? 8);\n const hi =\n Math.max(0, count - 1) + Math.max(options.rightOffset ?? 8, bars * 0.75);\n const lo = Math.min(bars * 0.25, hi);\n right = clamp(right, lo, hi);\n };\n\n const computeVisible = (): Visible | null => {\n const count = n();\n if (!count) return null;\n const left = right - plotW / spacing;\n const level = spacing >= 2 ? 0 : Math.ceil(Math.log2(2 / spacing));\n const size = 2 ** level;\n const src = display();\n const cols = level\n ? pyramidLevel(\n style() === \"heikinAshi\" ? haPyramid : pyramid,\n src,\n count,\n level,\n )\n : src;\n const last = Math.floor((count - 1) / size);\n const i0 = clamp(Math.floor(left) - 1, 0, count - 1);\n const i1 = clamp(Math.ceil(right) + 1, 0, count - 1);\n const r0 = clamp(Math.ceil(left - 0.5), 0, count - 1);\n const r1 = clamp(Math.floor(right + 0.5), 0, count - 1);\n return {\n left,\n level,\n size,\n cols,\n g0: Math.floor(i0 / size),\n g1: Math.floor(i1 / size),\n s0: Math.floor(r0 / size),\n s1: Math.floor(r1 / size),\n last,\n };\n };\n\n /** Center index of a group */\n const groupCenter = (v: Visible, g: number) => g * v.size + (v.size - 1) / 2;\n const groupBars = (v: Visible, g: number) =>\n Math.min(v.size, n() - g * v.size);\n\n /** First visible bar: the base of the percent scale and of the baseline */\n const firstVisibleIndex = () =>\n clamp(Math.ceil(right - plotW / spacing - 0.5), 0, Math.max(0, n() - 1));\n\n const compareBase = (c: CompareRuntime) => {\n const count = n();\n for (let i = firstVisibleIndex(); i < count; i++) {\n const v = c.values[i];\n if (finite(v) && v !== 0) return v;\n }\n return NaN;\n };\n\n /** Scaled value of a comparison series (percent: from its own base) */\n const compareScaled = (scale: PaneScale, value: number, base: number) =>\n scale.mode === \"percent\"\n ? (value / base - 1) * 100\n : toScaled(scale, value);\n\n const baselinePrice = () =>\n options.baselinePrice ?? display().close[firstVisibleIndex()];\n\n /** Extends `[lo, hi]` with the visible groups of an output (shift included) */\n const outputExtent = (\n v: Visible,\n values: Float64Array,\n lod: RangePyramid,\n shiftBars: number,\n range: [number, number],\n ) => {\n const r = groupRanges(v, values, lod);\n const offset = Math.round(shiftBars / v.size);\n const a = clamp(v.s0 - offset, 0, v.last);\n const b = clamp(v.s1 - offset, 0, v.last);\n for (let g = a; g <= b; g++) {\n if (r.min[g] < range[0]) range[0] = r.min[g];\n if (r.max[g] > range[1]) range[1] = r.max[g];\n }\n };\n\n const autoscale = (v: Visible | null) => {\n volumeOverlayMax = 0;\n for (const pane of panes) {\n const scale = pane.scale;\n if (!v) continue;\n if (pane.id === PRICE) {\n scale.base = store.close[firstVisibleIndex()] || 1;\n const { cols } = v;\n const s = style();\n const closeOnly = s === \"line\" || s === \"area\" || s === \"baseline\";\n const range: [number, number] = [Infinity, -Infinity];\n for (let g = v.s0; g <= v.s1; g++) {\n const l = closeOnly ? cols.close[g] : cols.low[g];\n const h = closeOnly ? cols.close[g] : cols.high[g];\n if (l < range[0]) range[0] = l;\n if (h > range[1]) range[1] = h;\n }\n for (const study of studies) {\n if (!study.overlay || !isVisible(study)) continue;\n if (study.type === \"volume\") {\n for (let g = v.s0; g <= v.s1; g++) {\n const vol = cols.volume[g] / groupBars(v, g);\n if (vol > volumeOverlayMax) volumeOverlayMax = vol;\n }\n continue;\n }\n for (const out of study.outputs)\n outputExtent(v, out.values, lodOf(out), out.shift, range);\n }\n let [lo, hi] = range;\n if (s === \"baseline\") {\n const b = baselinePrice();\n if (b < lo) lo = b;\n if (b > hi) hi = b;\n }\n if (!scale.auto) continue;\n let a = toScaled(scale, lo);\n let b = toScaled(scale, hi);\n if (scale.mode === \"log\" && !(lo > 0))\n a = toScaled(scale, Math.max(hi * 1e-3, 1e-12));\n for (const c of compares) {\n const base = compareBase(c);\n const extent: [number, number] = [Infinity, -Infinity];\n outputExtent(v, c.values, c.lod, 0, extent);\n for (const value of extent) {\n const scaled = compareScaled(scale, value, base);\n if (scaled < a) a = scaled;\n if (scaled > b) b = scaled;\n }\n }\n if (scale.mode === \"percent\" && compares.length) {\n // the 0% line of a comparison stays in view\n a = Math.min(a, 0);\n b = Math.max(b, 0);\n }\n fitScale(scale, a, b);\n continue;\n }\n const study = pane.study;\n if (!study || !scale.auto) continue;\n if (study.range) {\n fitScale(scale, study.range[0], study.range[1]);\n continue;\n }\n const range: [number, number] = [Infinity, -Infinity];\n if (study.type === \"volume\") range[0] = 0;\n for (const out of study.outputs) {\n if (out.kind === \"volume\") {\n for (let g = v.s0; g <= v.s1; g++) {\n const value = v.cols.volume[g] / groupBars(v, g);\n if (value > range[1]) range[1] = value;\n }\n continue;\n }\n outputExtent(v, out.values, lodOf(out), out.shift, range);\n }\n let [lo, hi] = range;\n if (study.bands && finite(lo) && finite(hi)) {\n // reference bands (CCI ±100, DMI 25) stay in view\n for (const band of study.bands) {\n lo = Math.min(lo, band);\n hi = Math.max(hi, band);\n }\n }\n if (study.zero && finite(lo) && finite(hi)) {\n lo = Math.min(lo, 0);\n hi = Math.max(hi, 0);\n }\n fitScale(scale, lo, hi);\n }\n };\n\n // ----------------------------------------------------------------- ticks\n\n interface TimeLabel {\n x: number;\n text: string;\n bold: boolean;\n }\n\n const timeTicks = (\n v: Visible | null,\n ctx: CanvasRenderingContext2D,\n ): TimeLabel[] => {\n const count = n();\n if (!count || !v) return [];\n const tf = tfMs();\n const intraday = tf < DAY;\n // groups up to the right edge, past the last bar too\n const gEnd = Math.floor(Math.max(0, Math.ceil(right)) / v.size);\n const groupTime = (g: number) => {\n if (g <= v.last) return v.cols.time[g];\n return store.time[count - 1] + (g * v.size - (count - 1)) * tf;\n };\n const candidates: { x: number; weight: number; time: number }[] = [];\n let prev = v.g0 > 0 ? shift(groupTime(v.g0 - 1)) : NaN;\n for (let g = v.g0; g <= gEnd; g++) {\n const time = shift(groupTime(g));\n const x = xOf(groupCenter(v, g));\n const weight = boundaryWeight(prev, time);\n // no labels inside a second (tick charts)\n if (x >= -20 && x <= plotW + 20 && weight > 10)\n candidates.push({ x, weight, time });\n prev = time;\n }\n ctx.font = font(theme.fontSize);\n const sample = intraday ? \"00:00\" : \"Sep 30\";\n const gap =\n Math.max(ctx.measureText(sample).width, ctx.measureText(\"2024\").width) +\n 34;\n return pickTicks(candidates, gap)\n .filter((t) => t.x > 8 && t.x < plotW - 8)\n .map((t) => ({\n x: t.x,\n text: tickText(t.time, t.weight, locale, intraday),\n bold: t.weight >= (intraday ? 50 : 60),\n }));\n };\n\n const paneTickText = (pane: Pane, scaled: number) => {\n if (pane.id === PRICE) {\n if (pane.scale.mode === \"percent\")\n return formatPercent(\n scaled,\n locale,\n Math.min(2, stepDecimals(pane.step)),\n );\n return formatPrice(fromScaled(pane.scale, scaled));\n }\n if (pane.study?.compact) return formatVolume(scaled, locale);\n return formatFixed(scaled, Math.min(4, stepDecimals(pane.step)), locale);\n };\n\n /** Text of a value of a study in the legend */\n const studyValueText = (study: Study, value: number) => {\n if (study.overlay && study.type !== \"volume\") return formatPrice(value);\n if (study.compact) return formatVolume(value, locale);\n return formatFixed(\n value,\n study.range ? 2 : Math.max(2, Math.min(6, precision())),\n locale,\n );\n };\n\n // ------------------------------------------------------------ GPU items\n\n const createLayers = (v: Visible, dpr: number): Layer[] => {\n const result: Layer[] = [];\n const cols = v.cols;\n const up = resolve(upCss());\n const down = resolve(downCss());\n const upP = packColor(up);\n const downP = packColor(down);\n const bg = theme.background;\n const metrics = candleMetrics(spacing * v.size * dpr, dpr);\n const X = (g: number) => xOf(groupCenter(v, g)) * dpr;\n const s = style();\n\n const histogramHalf = Math.max(0.5, metrics.body / 2);\n const volumeColors = {\n up: packColor([up[0], up[1], up[2], 0.5]),\n down: packColor([down[0], down[1], down[2], 0.5]),\n };\n\n for (const pane of panes) {\n const top = pane.top * dpr;\n const bottom = (pane.top + pane.height) * dpr;\n const scale = pane.scale;\n const Y = (value: number) => yOf(scale, value) * dpr;\n\n const lineLayer =\n (\n values: (g: number) => number,\n color: Rgba,\n lineWidth: number,\n toY: (value: number) => number = Y,\n ): Layer =>\n (ga, gb, isLive) => {\n const buffer = new LineBuffer(top, bottom);\n for (let g = isLive ? Math.max(v.g0, ga - 1) : ga; g <= gb; g++)\n buffer.push(X(g), toY(values(g)));\n return buffer.count > 1 ? [buffer.item(\"\", 0, color, lineWidth)] : [];\n };\n\n /**\n * Line of a column of values: one point per bar, or the low and high\n * of each group once zoomed out (min / max decimation), drawn\n * `shiftBars` later\n */\n const rangeLayer =\n (\n values: Float64Array,\n lod: RangePyramid,\n color: Rgba,\n lineWidth: number,\n shiftBars = 0,\n toY: (value: number) => number = Y,\n ): Layer =>\n (ga, gb, isLive) => {\n const r = groupRanges(v, values, lod);\n const dx = shiftBars * spacing * dpr;\n const extra = Math.ceil(Math.abs(shiftBars) / v.size) + 1;\n let from = isLive ? Math.max(0, ga - 1) : ga;\n let to = gb;\n if (!isLive && shiftBars > 0) from = Math.max(0, from - extra);\n if (!isLive && shiftBars < 0) to = Math.min(v.last - 1, to + extra);\n const buffer = new LineBuffer(top, bottom);\n let prevY = NaN;\n for (let g = from; g <= to; g++) {\n const x = X(g) + dx;\n const lo = r.min[g];\n const hi = r.max[g];\n if (!v.level || lo === hi || !finite(lo) || !finite(hi)) {\n prevY = toY(r.last[g]);\n buffer.push(x, prevY);\n continue;\n }\n const yLo = toY(lo);\n const yHi = toY(hi);\n // start with the extreme closest to the previous point\n const first =\n finite(prevY) && Math.abs(prevY - yHi) < Math.abs(prevY - yLo)\n ? yHi\n : yLo;\n const second = first === yHi ? yLo : yHi;\n buffer.push(x, first);\n buffer.push(x, second);\n prevY = second;\n }\n return buffer.count > 1 ? [buffer.item(\"\", 0, color, lineWidth)] : [];\n };\n\n if (pane.id === PRICE) {\n // volume at the bottom of the price pane\n const volumeStudy = studies.find(\n (st) => st.overlay && st.type === \"volume\" && isVisible(st),\n );\n if (volumeStudy && volumeOverlayMax > 0) {\n const h = (bottom - top) * 0.2;\n result.push((ga, gb) => {\n const buffer = new BarBuffer();\n for (let g = ga; g <= gb; g++) {\n const vol = cols.volume[g] / groupBars(v, g);\n if (!(vol > 0)) continue;\n const y = bottom - (vol / volumeOverlayMax) * h;\n const [a, b] = pixelRange(y, bottom);\n buffer.push(\n metrics.snap(X(g)),\n a,\n b,\n cols.close[g] >= cols.open[g]\n ? volumeColors.up\n : volumeColors.down,\n );\n }\n return [buffer.item(\"\", 0, histogramHalf)];\n });\n }\n // comparison series\n for (const c of compares) {\n const base = compareBase(c);\n const color = resolve(c.color);\n result.push(\n rangeLayer(\n c.values,\n c.lod,\n color,\n c.width,\n 0,\n (value) =>\n yOfScaled(scale, compareScaled(scale, value, base)) * dpr,\n ),\n );\n }\n // the bars\n if (s === \"line\" || s === \"area\" || s === \"baseline\") {\n const lineColor = resolve(PRIMARY);\n if (s === \"area\") {\n result.push((ga, gb, isLive) => {\n const area = new AreaBuffer(top, bottom);\n for (let g = isLive ? Math.max(v.g0, ga - 1) : ga; g <= gb; g++)\n area.push(X(g), Y(cols.close[g]), bottom);\n return area.count > 1 ? [area.item(\"\", 0, lineColor, 0.28)] : [];\n });\n }\n if (s === \"baseline\") {\n const yb = Y(baselinePrice());\n result.push((ga, gb, isLive) => {\n const upArea = new AreaBuffer(top, bottom);\n const downArea = new AreaBuffer(top, bottom);\n const upLine = new LineBuffer(top, bottom);\n const downLine = new LineBuffer(top, bottom);\n let px = NaN;\n let py = NaN;\n const point = (x: number, y: number) => {\n upArea.push(x, Math.min(y, yb), yb);\n downArea.push(x, Math.max(y, yb), yb);\n if (y <= yb) upLine.push(x, y);\n else upLine.break();\n if (y >= yb) downLine.push(x, y);\n else downLine.break();\n };\n for (let g = isLive ? Math.max(v.g0, ga - 1) : ga; g <= gb; g++) {\n const x = X(g);\n const y = Y(cols.close[g]);\n if (finite(py) && (py - yb) * (y - yb) < 0) {\n const t = (yb - py) / (y - py);\n point(px + (x - px) * t, yb);\n }\n point(x, y);\n px = x;\n py = y;\n }\n const out: RenderItem[] = [];\n if (upArea.count > 1)\n out.push(\n upArea.item(\"u\", 0, up, 0.22),\n downArea.item(\"d\", 0, down, 0.22),\n );\n if (upLine.count > 1) out.push(upLine.item(\"ul\", 0, up, 2));\n if (downLine.count > 1) out.push(downLine.item(\"dl\", 0, down, 2));\n return out;\n });\n } else {\n result.push(lineLayer((g) => cols.close[g], lineColor, 2));\n }\n } else {\n const hollow = s === \"hollowCandles\";\n const ohlc = s === \"bars\";\n const wick = metrics.wick;\n const body = metrics.body;\n result.push((ga, gb) => {\n const wicks = new BarBuffer();\n const bodies = new BarBuffer();\n const caps = new BarBuffer();\n const ticks = new BarBuffer();\n const tick = Math.max(wick, Math.round((body - wick) / 2));\n for (let g = ga; g <= gb; g++) {\n const o = cols.open[g];\n const h = cols.high[g];\n const l = cols.low[g];\n const c = cols.close[g];\n if (!finite(o) || !finite(c)) continue;\n const rising = hollow\n ? c >= (g > 0 ? cols.close[g - 1] : o)\n : c >= o;\n const color = rising ? upP : downP;\n const cx = metrics.snap(X(g));\n const [wt, wb] = pixelRange(Y(h), Y(l));\n if (ohlc) {\n const range = clampRange(wt, wb, top, bottom);\n if (range) wicks.push(cx, range[0], range[1], color);\n for (const [value, side] of [\n [o, -1],\n [c, 1],\n ] as const) {\n const y = Math.round(Y(value) - wick / 2);\n if (y < top || y + wick > bottom) continue;\n ticks.push(\n cx + side * (wick / 2 + tick / 2),\n y,\n y + wick,\n color,\n );\n }\n continue;\n }\n const [bt, bb] = pixelRange(Y(o), Y(c));\n if (body <= wick) {\n const range = clampRange(wt, wb, top, bottom);\n if (range) wicks.push(cx, range[0], range[1], color);\n continue;\n }\n if (hollow && c > o) {\n const segments: [number, number][] = [\n [wt, bt],\n [bb, wb],\n ];\n for (const [a, b] of segments) {\n const range = b > a ? clampRange(a, b, top, bottom) : null;\n if (range) wicks.push(cx, range[0], range[1], color);\n }\n const edges = clampRange(bt, bb, top, bottom);\n if (edges) {\n wicks.push(\n cx - body / 2 + wick / 2,\n edges[0],\n edges[1],\n color,\n );\n wicks.push(\n cx + body / 2 - wick / 2,\n edges[0],\n edges[1],\n color,\n );\n }\n for (const y of [bt, bb - wick]) {\n if (y >= top && y + wick <= bottom)\n caps.push(cx, y, y + wick, color);\n }\n continue;\n }\n const range = clampRange(wt, wb, top, bottom);\n if (range) wicks.push(cx, range[0], range[1], color);\n const box = clampRange(bt, bb, top, bottom);\n if (box) bodies.push(cx, box[0], box[1], color);\n }\n const items: RenderItem[] = [wicks.item(\"w\", 0, wick / 2)];\n if (bodies.count) items.push(bodies.item(\"b\", 0, body / 2));\n if (caps.count) items.push(caps.item(\"c\", 0, body / 2));\n if (ticks.count) items.push(ticks.item(\"t\", 0, tick / 2));\n return items;\n });\n }\n }\n\n // indicators of the pane\n const paneStudies =\n pane.id === PRICE\n ? studies.filter((st) => st.overlay && st.type !== \"volume\")\n : pane.study\n ? [pane.study]\n : [];\n for (const study of paneStudies) {\n if (!isVisible(study)) continue;\n for (const out of study.outputs) {\n if (out.kind === \"volume\") {\n const y0 = Y(0);\n result.push((ga, gb) => {\n const buffer = new BarBuffer();\n for (let g = ga; g <= gb; g++) {\n const vol = cols.volume[g] / groupBars(v, g);\n if (!(vol > 0)) continue;\n const range = clampRange(\n ...pixelRange(Y(vol), y0),\n top,\n bottom,\n );\n if (range)\n buffer.push(\n metrics.snap(X(g)),\n range[0],\n range[1],\n cols.close[g] >= cols.open[g]\n ? volumeColors.up\n : volumeColors.down,\n );\n }\n return [buffer.item(\"\", 0, histogramHalf)];\n });\n } else if (out.kind === \"histogram\") {\n const y0 = Y(0);\n const strong = { up: upP, down: downP };\n const faded = {\n up: packColor(mix(bg, up, 0.45)),\n down: packColor(mix(bg, down, 0.45)),\n };\n const lod = lodOf(out);\n result.push((ga, gb) => {\n const r = groupRanges(v, out.values, lod);\n const buffer = new BarBuffer();\n for (let g = ga; g <= gb; g++) {\n const value = r.last[g];\n if (!finite(value)) continue;\n const prev = g > 0 ? r.last[g - 1] : value;\n const color =\n value >= 0\n ? value >= prev\n ? strong.up\n : faded.up\n : value <= prev\n ? strong.down\n : faded.down;\n // a group spans its lowest and highest values (and zero)\n const lo = Math.min(0, finite(r.min[g]) ? r.min[g] : value);\n const hi = Math.max(0, finite(r.max[g]) ? r.max[g] : value);\n const range = clampRange(\n ...(v.level\n ? pixelRange(Y(hi), Y(lo))\n : pixelRange(Y(value), y0)),\n top,\n bottom,\n );\n if (range)\n buffer.push(metrics.snap(X(g)), range[0], range[1], color);\n }\n return [buffer.item(\"\", 0, histogramHalf)];\n });\n } else if (out.kind === \"dots\") {\n const fixed = out.color\n ? packColor(resolve(colorOf(out.color)))\n : 0;\n const radius = clamp(spacing * v.size * 0.22, 1.25, 2.6);\n const half = radius * dpr;\n result.push((ga, gb) => {\n const buffer = new BarBuffer();\n for (let g = ga; g <= gb; g++) {\n const value = v.level\n ? out.values[Math.min(n() - 1, g * v.size + v.size - 1)]\n : out.values[g];\n if (!finite(value)) continue;\n const y = Y(value);\n if (y < top || y > bottom) continue;\n const color = fixed || (value <= cols.close[g] ? upP : downP);\n buffer.push(X(g), y - half, y + half, color);\n }\n return buffer.count ? [buffer.item(\"\", 0, half, 0, radius)] : [];\n });\n } else {\n const color = resolve(colorOf(out.color));\n result.push(\n rangeLayer(\n out.values,\n lodOf(out),\n [color[0], color[1], color[2], color[3] * out.alpha],\n out.width,\n out.shift,\n ),\n );\n }\n }\n }\n }\n return result;\n };\n\n /** Builds the items of the main bars or of the last group */\n const runLayer = (\n fn: Layer,\n index: number,\n v: Visible,\n isLive: boolean,\n ): RenderItem[] => {\n const lastMain = Math.min(v.g1, v.last - 1);\n const items = isLive\n ? v.last >= v.g0 && v.last <= v.g1\n ? fn(v.last, v.last, true)\n : []\n : lastMain >= v.g0\n ? fn(v.g0, lastMain, false)\n : [];\n const version = ++itemVersion;\n return items.map((item, k) => ({\n ...item,\n key: `L${index}:${k}:${item.kind}:${item.key}${isLive ? \":live\" : \"\"}`,\n version,\n }));\n };\n\n const renderData = (v: Visible | null, dpr: number) => {\n if (!renderer) return;\n const canvas = renderer.canvas;\n styleElement(canvas, {\n left: \"0px\",\n top: \"0px\",\n width: `${plotW}px`,\n height: `${plotH}px`,\n });\n const bw = Math.max(1, Math.round(plotW * dpr));\n const bh = Math.max(1, Math.round(plotH * dpr));\n if (canvas.width !== bw || canvas.height !== bh) renderer.resize(bw, bh);\n if (v) {\n const key = [\n bw,\n bh,\n dpr,\n spacing,\n right,\n v.level,\n style(),\n dataVersion,\n themeVersion,\n optionsVersion,\n volumeOverlayMax,\n style() === \"baseline\" ? baselinePrice() : 0,\n ...panes.map(\n (p) =>\n `${p.id}:${p.top}:${p.height}:${p.scale.min}:${p.scale.max}:${p.scale.base}:${p.scale.mode}`,\n ),\n ...studies.map((st) => `${st.id}:${isVisible(st)}`),\n ].join(\"|\");\n if (key !== geomKey) {\n geomKey = key;\n builtTail = tailVersion;\n layers = createLayers(v, dpr).map((fn) => ({ fn, main: [], live: [] }));\n layers.forEach((l, i) => {\n l.main = runLayer(l.fn, i, v, false);\n l.live = runLayer(l.fn, i, v, true);\n });\n } else if (builtTail !== tailVersion) {\n builtTail = tailVersion;\n layers.forEach((l, i) => {\n l.live = runLayer(l.fn, i, v, true);\n });\n }\n } else {\n layers = [];\n geomKey = \"\";\n }\n const items = layers.flatMap((l) => [...l.main, ...l.live]);\n renderer.render(items, {\n transform: { xScale: 2 / bw, xOffset: -1, yScale: -2 / bh, yOffset: 1 },\n width: bw,\n height: bh,\n dpr,\n });\n };\n\n // -------------------------------------------------------- 2D painting\n\n const sizeCanvas = (canvas: HTMLCanvasElement, dpr: number) => {\n const w = Math.max(1, Math.round(width * dpr));\n const h = Math.max(1, Math.round(height * dpr));\n if (canvas.width !== w) canvas.width = w;\n if (canvas.height !== h) canvas.height = h;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n };\n\n const roundRect = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n ) => {\n ctx.beginPath();\n if (typeof ctx.roundRect === \"function\") ctx.roundRect(x, y, w, h, r);\n else ctx.rect(x, y, w, h);\n };\n\n /** Area between two outputs of a study, colored by which one is above */\n const paintFill = (\n ctx: CanvasRenderingContext2D,\n v: Visible,\n pane: Pane,\n study: Study,\n f: Study[\"fills\"][number],\n ) => {\n const outA = study.outputs[f.a];\n const outB = study.outputs[f.b];\n if (!outA || !outB) return;\n const ra = groupRanges(v, outA.values, lodOf(outA));\n const rb = groupRanges(v, outB.values, lodOf(outB));\n const shiftBars = outA.shift;\n const extra = Math.ceil(Math.abs(shiftBars) / v.size) + 1;\n const from = Math.max(0, v.g0 - (shiftBars > 0 ? extra : 0));\n const to = Math.min(v.last, v.g1 + (shiftBars < 0 ? extra : 0));\n const above = css(colorOf(f.color), f.opacity);\n const below = css(colorOf(f.colorBelow ?? f.color), f.opacity);\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, pane.top, plotW, pane.height);\n ctx.clip();\n let run: { x: number; ya: number; yb: number }[] = [];\n let sign = 0;\n const flush = () => {\n if (run.length > 1) {\n ctx.fillStyle = sign >= 0 ? above : below;\n ctx.beginPath();\n run.forEach((p, i) =>\n i ? ctx.lineTo(p.x, p.ya) : ctx.moveTo(p.x, p.ya),\n );\n for (let k = run.length - 1; k >= 0; k--) {\n const p = run[k];\n if (p) ctx.lineTo(p.x, p.yb);\n }\n ctx.closePath();\n ctx.fill();\n }\n run = [];\n };\n for (let g = from; g <= to; g++) {\n const a = ra.last[g];\n const b = rb.last[g];\n if (!finite(a) || !finite(b)) {\n flush();\n sign = 0;\n continue;\n }\n const x = xOf(groupCenter(v, g) + shiftBars);\n const ya = yOf(pane.scale, a);\n const yb = yOf(pane.scale, b);\n const s = a >= b ? 1 : -1;\n const prev = run[run.length - 1];\n if (prev && s !== sign) {\n // the lines cross: close the run at the crossing\n const d0 = prev.ya - prev.yb;\n const t = d0 / (d0 - (ya - yb));\n const cx = prev.x + (x - prev.x) * t;\n const cy = prev.ya + (ya - prev.ya) * t;\n run.push({ x: cx, ya: cy, yb: cy });\n flush();\n run.push({ x: cx, ya: cy, yb: cy });\n }\n sign = s;\n run.push({ x, ya, yb });\n }\n flush();\n ctx.restore();\n };\n\n /** Dashed lines where a day starts (in the displayed time zone) */\n const paintSessionBreaks = (ctx: CanvasRenderingContext2D, v: Visible) => {\n if (!options.sessionBreaks || tfMs() >= DAY) return;\n const xs: number[] = [];\n let prevDay = NaN;\n for (let g = Math.max(0, v.g0 - 1); g <= Math.min(v.g1, v.last); g++) {\n const day = Math.floor(shift(v.cols.time[g]) / DAY);\n if (finite(prevDay) && day !== prevDay) {\n const x = Math.round(xOf(g * v.size - 0.5)) + 0.5;\n if (x > 0 && x < plotW) xs.push(x);\n // too dense to read: none at all\n if (xs.length > plotW / 6) return;\n }\n prevDay = day;\n }\n if (!xs.length) return;\n ctx.save();\n ctx.strokeStyle = toCss(theme.textMuted, 0.4);\n ctx.setLineDash([4, 4]);\n ctx.beginPath();\n for (const x of xs) {\n ctx.moveTo(x, 0);\n ctx.lineTo(x, plotH);\n }\n ctx.stroke();\n ctx.restore();\n };\n\n const profileOptions = (): TradingVolumeProfileOptions | null => {\n const option = options.volumeProfile;\n if (!option) return null;\n return option === true ? {} : option;\n };\n\n /** Volume by price of the visible bars, from the right (or left) edge */\n const paintVolumeProfile = (ctx: CanvasRenderingContext2D, v: Visible) => {\n const o = profileOptions();\n const price = panes[0];\n if (!o || !price || !store.hasVolume) return;\n const rows = clamp(Math.floor(o.rows ?? 24), 2, 400);\n const key = [\n v.level,\n v.s0,\n v.s1,\n rows,\n o.valueArea ?? 0.7,\n dataVersion,\n tailVersion,\n ].join(\"|\");\n if (!profile || profile.key !== key) {\n // real prices, also under Heikin-Ashi bars\n const cols = v.level ? pyramidLevel(pyramid, store, n(), v.level) : store;\n profile = {\n key,\n result: volumeProfile(cols, {\n from: v.s0,\n to: v.s1,\n rows,\n valueArea: o.valueArea,\n }),\n };\n }\n const r = profile.result;\n if (r.poc < 0) return;\n let largest = 0;\n for (let i = 0; i < rows; i++)\n largest = Math.max(largest, (r.up[i] ?? 0) + (r.down[i] ?? 0));\n if (!(largest > 0)) return;\n const span = plotW * clamp(o.width ?? 0.28, 0.05, 0.9);\n const fromRight = (o.side ?? \"right\") === \"right\";\n const upColor = resolve(colorOf(o.upColor ?? \"up\"));\n const downColor = resolve(colorOf(o.downColor ?? \"down\"));\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, price.top, plotW, price.height);\n ctx.clip();\n for (let i = 0; i < rows; i++) {\n const up = r.up[i] ?? 0;\n const down = r.down[i] ?? 0;\n if (!(up + down > 0)) continue;\n const y0 = yOf(price.scale, r.low + i * r.step);\n const y1 = yOf(price.scale, r.low + (i + 1) * r.step);\n const top = Math.min(y0, y1);\n const h = Math.max(\n 1,\n Math.abs(y1 - y0) - (Math.abs(y1 - y0) > 4 ? 1 : 0),\n );\n const inside = i >= r.valueAreaFrom && i <= r.valueAreaTo;\n const alpha = inside ? 0.42 : 0.17;\n const upLength = (up / largest) * span;\n const downLength = (down / largest) * span;\n const edge = fromRight ? plotW : 0;\n const dir = fromRight ? -1 : 1;\n ctx.fillStyle = toCss(upColor, alpha);\n ctx.fillRect(Math.min(edge, edge + dir * upLength), top, upLength, h);\n ctx.fillStyle = toCss(downColor, alpha);\n const start = edge + dir * upLength;\n ctx.fillRect(\n Math.min(start, start + dir * downLength),\n top,\n downLength,\n h,\n );\n }\n // point of control\n const y =\n Math.round(yOf(price.scale, r.low + (r.poc + 0.5) * r.step)) + 0.5;\n ctx.strokeStyle = css(o.pocColor ?? WARNING, 0.9);\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n };\n\n const paintBackground = (\n ctx: CanvasRenderingContext2D,\n v: Visible | null,\n ticks: TimeLabel[],\n ) => {\n const grid = toCss(theme.grid);\n const showGrid = options.grid !== false;\n ctx.lineWidth = 1;\n if (showGrid) {\n ctx.strokeStyle = grid;\n ctx.beginPath();\n for (const t of ticks) {\n const x = Math.round(t.x) + 0.5;\n ctx.moveTo(x, 0);\n ctx.lineTo(x, plotH);\n }\n for (const pane of panes) {\n for (const t of pane.ticks) {\n const y = Math.round(yOfScaled(pane.scale, t)) + 0.5;\n if (y < pane.top + 2 || y > pane.top + pane.height - 2) continue;\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n }\n }\n ctx.stroke();\n }\n // watermark\n if (options.watermark) {\n const price = panes[0];\n ctx.save();\n ctx.font = font(Math.min(56, Math.max(22, plotW / 14)), 700);\n ctx.fillStyle = toCss(theme.text, 0.07);\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(options.watermark, plotW / 2, price.top + price.height / 2);\n ctx.restore();\n }\n // bands of the indicator panes\n for (const pane of panes) {\n const study = pane.study;\n if (study?.bands && isVisible(study)) {\n const color = resolve(colorOf(study.outputs[0]?.color ?? PRIMARY));\n const ys = study.bands.map((b) => Math.round(yOf(pane.scale, b)) + 0.5);\n if (study.bandFill && ys.length === 2) {\n ctx.fillStyle = toCss(color, 0.07);\n ctx.fillRect(\n 0,\n Math.min(ys[0], ys[1]),\n plotW,\n Math.abs(ys[1] - ys[0]),\n );\n }\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = toCss(theme.textMuted, 0.45);\n ctx.beginPath();\n for (const y of ys) {\n if (y < pane.top || y > pane.top + pane.height) continue;\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n }\n ctx.stroke();\n ctx.restore();\n }\n }\n if (v) {\n paintSessionBreaks(ctx, v);\n for (const study of studies) {\n if (!study.fills.length || !isVisible(study)) continue;\n const pane = study.overlay\n ? panes[0]\n : panes.find((p) => p.study === study);\n if (pane)\n for (const f of study.fills) paintFill(ctx, v, pane, study, f);\n }\n const price = panes[0];\n if (price && price.scale.mode === \"percent\" && compares.length) {\n // the common origin of the compared series\n const y = Math.round(yOfScaled(price.scale, 0)) + 0.5;\n if (y > price.top && y < price.top + price.height) {\n ctx.save();\n ctx.strokeStyle = toCss(theme.textMuted, 0.6);\n ctx.setLineDash([2, 3]);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n }\n }\n paintVolumeProfile(ctx, v);\n }\n // separators and axis borders\n ctx.strokeStyle = toCss(theme.axis);\n ctx.beginPath();\n for (const pane of panes.slice(1)) {\n const y = Math.round(pane.top) + 0.5;\n ctx.moveTo(0, y);\n ctx.lineTo(width, y);\n }\n ctx.moveTo(Math.round(plotW) + 0.5, 0);\n ctx.lineTo(Math.round(plotW) + 0.5, height);\n ctx.moveTo(0, Math.round(plotH) + 0.5);\n ctx.lineTo(width, Math.round(plotH) + 0.5);\n ctx.stroke();\n };\n\n /** Label on the price axis; returns its vertical extent */\n const axisLabel = (\n ctx: CanvasRenderingContext2D,\n y: number,\n text: string,\n fill: string,\n textColor: string,\n second?: string,\n ) => {\n const h = second ? 32 : 18;\n const top = clamp(Math.round(y - 9), 0, plotH - h);\n roundRect(ctx, plotW + 1, top, axisW - 2, h, 3);\n ctx.fillStyle = fill;\n ctx.fill();\n ctx.fillStyle = textColor;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.font = font(theme.fontSize, 500);\n ctx.fillText(text, plotW + 7, top + 9.5);\n if (second) {\n ctx.font = font(theme.fontSize - 1);\n ctx.fillText(second, plotW + 7, top + 24);\n }\n };\n\n const priceAxisText = (value: number) =>\n panes[0]?.scale.mode === \"percent\"\n ? formatPercent(toScaled(panes[0].scale, value), locale)\n : formatPrice(value);\n\n const lineColor = (line: TradingPriceLine) => {\n if (line.color) return css(line.color);\n const kind = line.kind ?? \"line\";\n if (kind === \"takeProfit\") return css(upCss());\n if (kind === \"stopLoss\") return css(downCss());\n if (kind === \"alert\") return css(WARNING);\n if (kind === \"line\") return css(PRIMARY);\n return css(line.side === \"sell\" ? downCss() : upCss());\n };\n\n const linePrice = (line: TradingPriceLine) =>\n lineOverrides.get(line.id) ?? line.price;\n\n const crosshairState = () => {\n if (!vis || !panes.length) return null;\n if (keyboardIndex !== null) {\n const index = keyboardIndex;\n const bar = index >= 0 && index < n() ? display().close[index] : NaN;\n return { index, pane: panes[0], y: yOf(panes[0].scale, bar), price: bar };\n }\n if (!pointer && externalCross) {\n const index = Math.round(indexOfTimeExt(externalCross.time));\n const price = externalCross.price;\n return {\n index,\n pane: panes[0],\n y: finite(price) ? yOf(panes[0].scale, price) : NaN,\n price,\n };\n }\n if (!pointer || pointer.x > plotW || pointer.y > plotH) return null;\n const pane = paneAt(pointer.y);\n if (!pane) return null;\n const index = Math.round(indexAt(pointer.x));\n let y = pointer.y;\n let price = valueAt(pane.scale, y);\n if (\n pane.id === PRICE &&\n options.crosshair !== \"free\" &&\n index >= 0 &&\n index < n() &&\n tool === \"cursor\"\n ) {\n const d = display();\n let best = Infinity;\n for (const value of [\n d.open[index],\n d.high[index],\n d.low[index],\n d.close[index],\n ]) {\n const yy = yOf(pane.scale, value);\n if (Math.abs(yy - pointer.y) < best) {\n best = Math.abs(yy - pointer.y);\n y = yy;\n price = value;\n }\n }\n }\n return { index, pane, y, price };\n };\n\n const paneOf = (id: string | undefined) =>\n panes.find((p) => p.id === (id ?? PRICE)) ?? null;\n\n const drawingMapper = (pane: Pane | null): DrawingMapper | null => {\n if (!pane) return null;\n return {\n x: xOf,\n y: (p) => yOf(pane.scale, p),\n index: indexOfTimeExt,\n left: 0,\n right: plotW,\n top: pane.top,\n bottom: pane.top + pane.height,\n };\n };\n\n const formatSpan = (bars: number, ms: number) => {\n const l = labels();\n const abs = Math.abs(ms);\n const parts: string[] = [];\n const days = Math.floor(abs / DAY);\n const hours = Math.floor((abs % DAY) / HOUR);\n const minutes = Math.floor((abs % HOUR) / MINUTE);\n if (days) parts.push(fill(l.days, { count: days }));\n if (hours) parts.push(fill(l.hours, { count: hours }));\n if (minutes && !days) parts.push(fill(l.minutes, { count: minutes }));\n return `${fill(labels().bars, { count: bars })}, ${parts.join(\" \") || fill(l.minutes, { count: 0 })}`;\n };\n\n /** A value of a pane as written by its axis (prices on the price pane) */\n const paneValueText = (pane: Pane, value: number) =>\n pane.id === PRICE ? formatPrice(value) : paneTickText(pane, value);\n\n /** Price rounded to the precision of the prices */\n const roundPrice = (price: number) => {\n const step = 10 ** -precision();\n return Number((Math.round(price / step) * step).toFixed(precision()));\n };\n\n /** A rounded label (pill) with text */\n const pill = (\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n fillColor: string,\n align: \"left\" | \"center\" | \"right\" = \"center\",\n ) => {\n ctx.font = font(theme.fontSize, 500);\n const w = ctx.measureText(text).width + 16;\n const left = clamp(\n align === \"center\" ? x - w / 2 : align === \"right\" ? x - w : x,\n 2,\n Math.max(2, plotW - w - 2),\n );\n roundRect(ctx, left, y, w, 22, 11);\n ctx.fillStyle = fillColor;\n ctx.fill();\n ctx.fillStyle = textOn(fillColor);\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(text, left + w / 2, y + 11.5);\n return w;\n };\n\n /** Registers a clickable area of the canvas; returns whether it is hovered */\n const canvasButton = (\n x: number,\n y: number,\n w: number,\n h: number,\n action: () => void,\n ) => {\n canvasButtons.push({ x, y, w, h, action });\n return hoveredButton === canvasButtons.length - 1;\n };\n\n const paintDrawings = (\n ctx: CanvasRenderingContext2D,\n colors: { text: string; background: string; up: string; down: string },\n ) => {\n const count = n();\n const last = count ? store.close[count - 1] : NaN;\n const all = draft ? [...drawings, draft] : drawings;\n if (!all.length) return;\n const l = labels();\n const position = {\n target: l.target,\n stop: l.stop,\n riskReward: l.riskReward,\n profit: l.profit,\n long: l.long,\n short: l.short,\n };\n for (const pane of panes) {\n const mapper = drawingMapper(pane);\n if (!mapper) continue;\n const own = all.filter((d) => (d.pane ?? PRICE) === pane.id);\n if (!own.length) continue;\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, pane.top, plotW, pane.height);\n ctx.clip();\n for (const drawing of own) {\n const box = paintDrawing(\n ctx,\n drawing,\n mapper,\n {\n ...colors,\n color: css(drawing.color ?? PRIMARY),\n font: font(theme.fontSize, 500),\n fontFamily: theme.fontFamily,\n formatPrice: (value) => paneValueText(pane, value),\n formatPercent: (value) => formatPercent(value, locale),\n formatSpan,\n textOn,\n defaultText: l.text,\n position,\n last: pane.id === PRICE ? last : NaN,\n fill,\n },\n {\n selected: drawing === draft || drawing.id === selected,\n hovered: drawing.id === hovered,\n },\n );\n if (box) textBoxes.set(drawing.id, box);\n }\n ctx.restore();\n }\n };\n\n const paintForeground = (\n ctx: CanvasRenderingContext2D,\n v: Visible | null,\n ticks: TimeLabel[],\n ) => {\n const price = panes[0];\n if (!price) return;\n canvasButtons = [];\n const count = n();\n const text = toCss(theme.text);\n const muted = toCss(theme.textMuted);\n const bgCss = toCss(theme.background);\n const upC = css(upCss());\n const downC = css(downCss());\n const l = labels();\n\n // ---- price pane contents (clipped)\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, price.top, plotW, price.height);\n ctx.clip();\n\n // high / low of the visible bars, kept inside the plot\n if (\n v &&\n options.highLowMarkers !== false &&\n style() !== \"line\" &&\n style() !== \"area\" &&\n style() !== \"baseline\"\n ) {\n let hi = -Infinity;\n let lo = Infinity;\n let hiG = -1;\n let loG = -1;\n for (let g = v.s0; g <= v.s1; g++) {\n if (v.cols.high[g] > hi) {\n hi = v.cols.high[g];\n hiG = g;\n }\n if (v.cols.low[g] < lo) {\n lo = v.cols.low[g];\n loG = g;\n }\n }\n ctx.font = font(theme.fontSize);\n ctx.fillStyle = muted;\n ctx.strokeStyle = muted;\n ctx.lineWidth = 1;\n for (const [g, value, below] of [\n [hiG, hi, false],\n [loG, lo, true],\n ] as const) {\n if (g < 0 || !finite(value)) continue;\n const x = xOf(groupCenter(v, g));\n const label = formatPrice(value);\n const w = ctx.measureText(label).width;\n let y = clamp(\n yOf(price.scale, value) + (below ? 9 : -9),\n price.top + 8,\n price.top + price.height - 8,\n );\n // not under a row of the legend\n const labelLeft = Math.min(x, x + (x > plotW * 0.6 ? -17 - w : 17 + w));\n for (const row of priceLegend) {\n if (\n labelLeft < row.right &&\n y - 7 < row.bottom &&\n y + 7 > row.top &&\n row.bottom + 10 < price.top + price.height - 8\n )\n y = row.bottom + 10;\n }\n // on the right of the bar, unless it does not fit there\n const roomRight = plotW - 4 - (x + 17 + w);\n const roomLeft = x - 17 - w - 4;\n const leftSide =\n (roomRight < 0 || x > plotW * 0.6) &&\n roomLeft >= Math.min(0, roomRight);\n const dir = leftSide ? -1 : 1;\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"left\";\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + dir * 14, y);\n ctx.stroke();\n const tx = clamp(leftSide ? x - 17 - w : x + 17, 2, plotW - w - 2);\n ctx.fillText(label, tx, y);\n }\n }\n\n // trade markers\n if (v && options.markers?.length) {\n const stack = new Map<string, number>();\n ctx.font = font(theme.fontSize, 600);\n ctx.textAlign = \"center\";\n const many = options.markers.length > 400;\n for (const marker of options.markers) {\n const index = indexOfTimeExt(marker.time);\n if (index < 0 || index > count - 1) continue;\n const g = Math.floor(index / v.size);\n if (g < v.g0 || g > v.g1) continue;\n const x = Math.round(xOf(groupCenter(v, g)));\n const sell = marker.side === \"sell\";\n const color = marker.color ? css(marker.color) : sell ? downC : upC;\n const key = `${g}:${sell}`;\n const offset = stack.get(key) ?? 0;\n stack.set(key, offset + (marker.text && !many ? 30 : 16));\n const anchor = yOf(price.scale, sell ? v.cols.high[g] : v.cols.low[g]);\n const dir = sell ? -1 : 1;\n const tip = anchor + dir * (6 + offset);\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(x, tip);\n ctx.lineTo(x - 5.5, tip + dir * 7);\n ctx.lineTo(x - 2, tip + dir * 7);\n ctx.lineTo(x - 2, tip + dir * 12);\n ctx.lineTo(x + 2, tip + dir * 12);\n ctx.lineTo(x + 2, tip + dir * 7);\n ctx.lineTo(x + 5.5, tip + dir * 7);\n ctx.closePath();\n ctx.fill();\n if (marker.text && !many) {\n ctx.textBaseline = sell ? \"bottom\" : \"top\";\n ctx.fillText(marker.text, x, tip + dir * 14);\n }\n if (marker.price !== undefined && finite(marker.price)) {\n ctx.beginPath();\n ctx.arc(x, yOf(price.scale, marker.price), 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = bgCss;\n ctx.stroke();\n }\n }\n }\n ctx.restore();\n\n // drawings, each in its pane\n paintDrawings(ctx, { text, background: bgCss, up: upC, down: downC });\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, price.top, plotW, price.height);\n ctx.clip();\n // price lines (orders, positions, TP / SL, alerts)\n const lastClose = count ? store.close[count - 1] : NaN;\n for (const line of options.priceLines ?? []) {\n const p = linePrice(line);\n const y = Math.round(yOf(price.scale, p)) + 0.5;\n if (!finite(y) || y < price.top || y > price.top + price.height) continue;\n const color = lineColor(line);\n const kind = line.kind ?? \"line\";\n const lineStyle =\n line.lineStyle ??\n (kind === \"position\" || kind === \"line\" ? \"solid\" : \"dashed\");\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth =\n hoveredLine === line.id ||\n (gesture?.kind === \"order\" && gesture.line.id === line.id)\n ? 1.5\n : 1;\n setDash(ctx, lineStyle, 1);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n // label: [grip] title | quantity | profit | close\n const titleKey = PRICE_LINE_TITLES[kind];\n const title = line.title ?? (titleKey ? l[titleKey] : \"\");\n const parts: {\n text: string;\n fill: string;\n color: string;\n cancel?: boolean;\n }[] = [];\n if (title) parts.push({ text: title, fill: color, color: textOn(color) });\n if (line.quantity !== undefined && line.quantity !== \"\")\n parts.push({ text: String(line.quantity), fill: bgCss, color });\n if (\n kind === \"position\" &&\n typeof line.quantity === \"number\" &&\n finite(lastClose)\n ) {\n const pnl =\n (lastClose - p) * line.quantity * (line.side === \"sell\" ? -1 : 1);\n const pnlFill = pnl >= 0 ? upC : downC;\n parts.push({\n text: `${pnl >= 0 ? \"+\" : \"−\"}${formatPrice(Math.abs(pnl))}`,\n fill: pnlFill,\n color: textOn(pnlFill),\n });\n }\n if (line.cancellable)\n parts.push({ text: \"×\", fill: bgCss, color, cancel: true });\n if (!parts.length && !line.draggable) continue;\n ctx.font = font(theme.fontSize, 600);\n const widths = parts.map((part) =>\n part.cancel ? 20 : ctx.measureText(part.text).width + 12,\n );\n const grip = line.draggable ? 14 : 0;\n const total = widths.reduce((a, b) => a + b, 0) + grip;\n let x = Math.round(plotW - total - 56);\n const top = Math.round(y - 9.5);\n roundRect(ctx, x - 0.5, top - 0.5, total + 1, 19, 3);\n ctx.fillStyle = bgCss;\n ctx.fill();\n ctx.strokeStyle = color;\n ctx.lineWidth = 1;\n ctx.setLineDash([]);\n ctx.stroke();\n if (grip) {\n ctx.fillStyle = color;\n for (let k = 0; k < 3; k++)\n ctx.fillRect(x + 4, top + 5 + k * 3.5, 6, 1.5);\n x += grip;\n }\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"center\";\n parts.forEach((part, k) => {\n const w = widths[k] ?? 0;\n let partFill = part.fill;\n if (part.cancel) {\n const hover = canvasButton(x, top, w, 18, () =>\n emit(\"orderCancel\", { id: line.id, line }),\n );\n if (hover) partFill = color;\n ctx.fillStyle = color;\n ctx.fillRect(x, top + 3, 1, 12);\n }\n if (partFill !== bgCss) {\n ctx.fillStyle = partFill;\n ctx.fillRect(x, top, w, 18);\n }\n ctx.fillStyle =\n part.cancel && partFill !== bgCss ? textOn(color) : part.color;\n if (part.cancel) ctx.font = font(theme.fontSize + 3, 500);\n ctx.fillText(part.text, x + w / 2, top + (part.cancel ? 9 : 9.5));\n ctx.font = font(theme.fontSize, 600);\n x += w;\n });\n }\n\n // last price line\n const lastLine = options.lastPriceLine !== false && count > 0;\n const lastUp = count > 0 && store.close[count - 1] >= store.open[count - 1];\n // a line takes its own color; bars the color of the last bar\n const lastColor =\n style() === \"line\" || style() === \"area\"\n ? css(PRIMARY)\n : lastUp\n ? upC\n : downC;\n if (lastLine) {\n const y = Math.round(yOf(price.scale, lastClose)) + 0.5;\n ctx.save();\n ctx.strokeStyle = lastColor;\n ctx.setLineDash([1, 2]);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n }\n ctx.restore();\n\n // last values of the compared series\n const compareLabels: { y: number; text: string; color: string }[] = [];\n for (const c of compares) {\n let i = count - 1;\n while (i >= 0 && !finite(c.values[i])) i--;\n if (i < 0) continue;\n const value = c.values[i];\n const scaled = compareScaled(price.scale, value, compareBase(c));\n const y = yOfScaled(price.scale, scaled);\n if (!finite(y) || y < price.top || y > price.top + price.height) continue;\n compareLabels.push({\n y,\n text:\n price.scale.mode === \"percent\"\n ? formatPercent(scaled, locale)\n : formatPrice(value),\n color: css(c.color),\n });\n }\n\n // axis ticks, except under the labels drawn over the axis\n const covered: { pane: string; y: number }[] = [];\n for (const line of options.priceLines ?? [])\n covered.push({ pane: PRICE, y: yOf(price.scale, linePrice(line)) });\n for (const drawing of drawings) {\n const pane = paneOf(drawing.pane);\n if (pane && drawing.type === \"horizontalLine\" && drawing.points[0])\n covered.push({\n pane: pane.id,\n y: yOf(pane.scale, drawing.points[0].price),\n });\n }\n for (const label of compareLabels)\n covered.push({ pane: PRICE, y: label.y });\n if (lastLine)\n covered.push({\n pane: PRICE,\n y: yOf(price.scale, lastClose) + (options.countdown ? 7 : 0),\n });\n ctx.font = font(theme.fontSize);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = muted;\n for (const pane of panes) {\n for (const t of pane.ticks) {\n const y = yOfScaled(pane.scale, t);\n if (y < pane.top + 8 || y > pane.top + pane.height - 8) continue;\n const gap = options.countdown && pane.id === PRICE ? 18 : 14;\n if (covered.some((c) => c.pane === pane.id && Math.abs(c.y - y) < gap))\n continue;\n ctx.fillText(paneTickText(pane, t), plotW + 8, y);\n }\n }\n // time axis ticks\n ctx.textAlign = \"center\";\n for (const t of ticks) {\n ctx.font = font(theme.fontSize, t.bold ? 600 : 400);\n ctx.fillStyle = t.bold ? text : muted;\n ctx.fillText(t.text, t.x, plotH + TIME_AXIS / 2);\n }\n\n // labels of the price lines, the drawings and the compared series\n for (const line of options.priceLines ?? []) {\n const p = linePrice(line);\n const y = yOf(price.scale, p);\n if (!finite(y) || y < price.top || y > price.top + price.height) continue;\n const fillColor = lineColor(line);\n axisLabel(ctx, y, priceAxisText(p), fillColor, textOn(fillColor));\n }\n for (const drawing of drawings) {\n const pane = paneOf(drawing.pane);\n if (!pane || drawing.type !== \"horizontalLine\" || !drawing.points[0])\n continue;\n const p = drawing.points[0].price;\n const y = yOf(pane.scale, p);\n if (y < pane.top || y > pane.top + pane.height) continue;\n const fillColor = css(drawing.color ?? PRIMARY);\n axisLabel(\n ctx,\n y,\n pane.id === PRICE ? priceAxisText(p) : paneValueText(pane, p),\n fillColor,\n textOn(fillColor),\n );\n }\n for (const label of compareLabels)\n axisLabel(ctx, label.y, label.text, label.color, textOn(label.color));\n // last price label (with the countdown)\n if (lastLine) {\n let second: string | undefined;\n if (options.countdown) {\n const tf = timeframe();\n const start = store.time[count - 1];\n let end = start + tf.ms;\n if (tf.unit === \"month\") {\n const date = new Date(start);\n end = Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth() + tf.count,\n date.getUTCDate(),\n date.getUTCHours(),\n date.getUTCMinutes(),\n );\n }\n second = formatCountdown(end - Date.now(), l);\n }\n axisLabel(\n ctx,\n yOf(price.scale, lastClose),\n priceAxisText(lastClose),\n lastColor,\n textOn(lastColor),\n second,\n );\n }\n\n // replay: the badge, or the picking of the first bar (at the bottom of\n // the price pane: the legends cover its top)\n const badgeY = price.top + price.height - 32;\n if (replayPicking) {\n const x = pointer && pointer.x <= plotW ? pointer.x : NaN;\n if (finite(x)) {\n ctx.fillStyle = toCss(theme.background, 0.62);\n ctx.fillRect(x, 0, plotW - x, plotH);\n ctx.strokeStyle = css(PRIMARY);\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n ctx.moveTo(Math.round(x) + 0.5, 0);\n ctx.lineTo(Math.round(x) + 0.5, plotH);\n ctx.stroke();\n }\n pill(ctx, l.replayHint, plotW / 2, badgeY, css(PRIMARY));\n } else if (replay && count) {\n pill(\n ctx,\n fill(l.replay, {\n time: formatCrosshairTime(\n shift(store.time[count - 1]),\n tfMs(),\n locale,\n ),\n }),\n plotW / 2,\n badgeY,\n css(PRIMARY),\n );\n }\n\n // crosshair\n const cross = crosshairState();\n if (cross && v && !replayPicking) {\n const x = Math.round(xOf(cross.index)) + 0.5;\n ctx.save();\n ctx.strokeStyle = toCss(theme.textMuted, 0.75);\n ctx.lineWidth = 1;\n ctx.setLineDash([4, 3]);\n ctx.beginPath();\n if (x >= 0 && x <= plotW) {\n ctx.moveTo(x, 0);\n ctx.lineTo(x, plotH);\n }\n const y = Math.round(cross.y) + 0.5;\n if (\n finite(y) &&\n y >= cross.pane.top &&\n y <= cross.pane.top + cross.pane.height\n ) {\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n }\n ctx.stroke();\n ctx.restore();\n const labelBg = toCss(theme.text);\n if (\n finite(cross.y) &&\n cross.y >= cross.pane.top &&\n cross.y <= cross.pane.top + cross.pane.height\n ) {\n const scaled = scaledAt(cross.pane.scale, cross.y);\n const textValue =\n cross.pane.id === PRICE\n ? priceAxisText(fromScaled(cross.pane.scale, scaled))\n : paneTickText(cross.pane, scaled);\n axisLabel(ctx, cross.y, textValue, labelBg, bgCss);\n }\n if (x >= 0 && x <= plotW && count) {\n const label = formatCrosshairTime(\n shift(timeAt(cross.index)),\n tfMs(),\n locale,\n );\n ctx.font = font(theme.fontSize, 500);\n const w = ctx.measureText(label).width + 16;\n const left = clamp(x - w / 2, 0, width - w);\n roundRect(ctx, left, plotH + 3, w, 21, 3);\n ctx.fillStyle = labelBg;\n ctx.fill();\n ctx.fillStyle = bgCss;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(label, left + w / 2, plotH + 14);\n }\n // order entry: a \"+\" at the crosshair price\n if (\n options.orderEntry &&\n pointer &&\n cross.pane.id === PRICE &&\n finite(cross.y) &&\n tool === \"cursor\" &&\n !gesture &&\n count\n ) {\n const size = 18;\n const bx = plotW - size - 4;\n const by = clamp(\n Math.round(cross.y - size / 2),\n price.top + 1,\n price.top + price.height - size - 1,\n );\n const orderPrice = roundPrice(cross.price);\n const side = orderPrice < lastClose ? \"buy\" : \"sell\";\n const hover = canvasButton(bx, by, size, size, () =>\n emit(\"orderCreate\", { price: orderPrice, side }),\n );\n roundRect(ctx, bx, by, size, size, 4);\n ctx.fillStyle = hover ? css(PRIMARY) : labelBg;\n ctx.fill();\n ctx.strokeStyle = hover ? textOn(css(PRIMARY)) : bgCss;\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n ctx.moveTo(bx + 5, by + size / 2);\n ctx.lineTo(bx + size - 5, by + size / 2);\n ctx.moveTo(bx + size / 2, by + 5);\n ctx.lineTo(bx + size / 2, by + size - 5);\n ctx.stroke();\n if (hover) {\n pill(\n ctx,\n fill(side === \"buy\" ? l.buyLimit : l.sellLimit, {\n price: formatPrice(orderPrice),\n }),\n bx - 6,\n by - 2,\n side === \"buy\" ? upC : downC,\n \"right\",\n );\n }\n }\n }\n };\n\n // -------------------------------------------------------------- legends\n\n let legendKey = \"\";\n /** Rows of the legend of the price pane (labels painted under them are moved) */\n let priceLegend: { right: number; top: number; bottom: number }[] = [];\n const legendRows = new Map<string, LegendRow>();\n const legendBoxes = new Map<string, HTMLDivElement>();\n\n const legendBox = (id: string) => {\n let box = legendBoxes.get(id);\n if (!box) {\n box = make(\"div\", {\n position: \"absolute\",\n left: \"8px\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n gap: \"1px\",\n maxWidth: \"calc(100% - 16px)\",\n fontSize: \"12px\",\n lineHeight: \"18px\",\n fontVariantNumeric: \"tabular-nums\",\n whiteSpace: \"nowrap\",\n pointerEvents: \"none\",\n });\n legends.appendChild(box);\n legendBoxes.set(id, box);\n }\n return box;\n };\n\n const legendRow = (\n box: HTMLDivElement,\n title: string,\n study: Study | null,\n outputs: number,\n ) => {\n const row = make(\"div\", {\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n columnGap: \"6px\",\n padding: \"0 4px\",\n marginLeft: \"-4px\",\n borderRadius: \"4px\",\n background:\n \"color-mix(in srgb, var(--surface-color, var(--background-color, #fff)) 86%, transparent)\",\n });\n let button: HTMLButtonElement | null = null;\n if (study) {\n button = make(\"button\", {\n all: \"unset\",\n cursor: \"pointer\",\n pointerEvents: \"auto\",\n color: \"var(--text-color, #1f2937)\",\n fontWeight: \"500\",\n borderRadius: \"3px\",\n });\n button.type = \"button\";\n button.textContent = title;\n button.setAttribute(\n \"aria-label\",\n fill(labels().toggleIndicator, { name: title }),\n );\n button.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n const next = !isVisible(study);\n visibility.set(study.id, next);\n emit(\"indicatorToggle\", { id: study.id, visible: next });\n updateLegends();\n invalidate();\n });\n button.addEventListener(\"pointerdown\", (event) =>\n event.stopPropagation(),\n );\n row.appendChild(button);\n } else if (title) {\n const label = make(\"span\", { fontWeight: \"600\" });\n label.textContent = title;\n row.appendChild(label);\n }\n const values: HTMLSpanElement[] = [];\n for (let i = 0; i < outputs; i++) {\n const span = make(\"span\", {});\n row.appendChild(span);\n values.push(span);\n }\n box.appendChild(row);\n return { row, values, button };\n };\n\n const buildLegends = () => {\n legendRows.clear();\n for (const box of legendBoxes.values()) box.remove();\n legendBoxes.clear();\n if (options.legend === false) return;\n const priceBox = legendBox(PRICE);\n const head = [\n options.symbol,\n options.labels?.timeframe ??\n (typeof options.timeframe === \"string\" ? options.timeframe : \"\"),\n ]\n .filter(Boolean)\n .join(\" · \");\n legendRows.set(\"ohlc\", legendRow(priceBox, head, null, 1));\n for (const study of studies) {\n const slots = study.mergeLegend ? 1 : study.outputs.length;\n if (study.overlay && study.type === \"volume\") {\n legendRows.set(study.id, legendRow(priceBox, titleOf(study), study, 1));\n } else if (study.overlay) {\n legendRows.set(\n study.id,\n legendRow(priceBox, titleOf(study), study, slots),\n );\n }\n }\n for (const c of compares)\n legendRows.set(`compare:${c.id}`, legendRow(priceBox, \"\", null, 1));\n for (const study of studies) {\n if (study.overlay) continue;\n legendRows.set(\n study.id,\n legendRow(\n legendBox(study.id),\n titleOf(study),\n study,\n study.mergeLegend ? 1 : study.outputs.length,\n ),\n );\n }\n };\n\n /** Legend title: indicator abbreviations, but words for the volume and some indicators */\n const titleOf = (study: Study) =>\n study.type === \"volume\"\n ? labels().volume\n : study.titleKey\n ? `${labels()[study.titleKey]} ${study.title}`\n : study.title;\n\n const setSpan = (\n span: HTMLSpanElement | undefined,\n text: string,\n color?: string,\n ) => {\n if (!span) return;\n if (span.textContent !== text) span.textContent = text;\n const c = color ?? \"\";\n if (span.style.color !== c) span.style.color = c;\n };\n\n const updateLegends = () => {\n const key = [\n options.legend !== false,\n options.symbol,\n options.timeframe,\n ...studies.map((s) => `${s.id}:${titleOf(s)}:${s.outputs.length}`),\n ...compares.map((c) => c.id),\n texts.toggleIndicator,\n options.labels?.timeframe,\n ].join(\"|\");\n if (key !== legendKey) {\n legendKey = key;\n buildLegends();\n }\n if (options.legend === false) return;\n for (const pane of panes) {\n const box = legendBoxes.get(pane.id);\n if (!box) continue;\n box.style.top = `${pane.top + 6}px`;\n // over the plot only, never over the price axis\n const maxWidth = `${Math.max(80, Math.floor(plotW - 14))}px`;\n if (box.style.maxWidth !== maxWidth) box.style.maxWidth = maxWidth;\n }\n const priceBox = legendBoxes.get(PRICE);\n priceLegend = priceBox\n ? Array.from(\n priceBox.children as HTMLCollectionOf<HTMLElement>,\n (row) => ({\n right: priceBox.offsetLeft + row.offsetLeft + row.offsetWidth,\n top: priceBox.offsetTop + row.offsetTop,\n bottom: priceBox.offsetTop + row.offsetTop + row.offsetHeight,\n }),\n )\n : [];\n const count = n();\n const cross = crosshairState();\n const index = clamp(\n cross && cross.index >= 0 && cross.index < count\n ? cross.index\n : count - 1,\n 0,\n Math.max(0, count - 1),\n );\n const l = labels();\n const ohlc = legendRows.get(\"ohlc\");\n const upC = css(upCss());\n const downC = css(downCss());\n if (ohlc && count) {\n const d = display();\n const o = d.open[index];\n const c = d.close[index];\n const prevClose = index > 0 ? d.close[index - 1] : o;\n const change = c - prevClose;\n const color = c >= o ? upC : downC;\n const span = ohlc.values[0];\n const html = [\n [l.open, d.open[index]],\n [l.high, d.high[index]],\n [l.low, d.low[index]],\n [l.close, c],\n ]\n .map(\n ([name, value]) =>\n `<span style=\"color:var(--text-secondary-color,#6b7280)\">${escapeHtml(String(name))}</span><span style=\"color:${color}\">${escapeHtml(formatPrice(value as number))}</span>`,\n )\n .join(\" \");\n const pct = prevClose ? (change / prevClose) * 100 : NaN;\n const changeName = l.change\n ? `<span style=\"color:var(--text-secondary-color,#6b7280)\">${escapeHtml(l.change)}</span>`\n : \"\";\n const changeHtml = `${changeName}<span style=\"color:${change >= 0 ? upC : downC}\">${change >= 0 ? \"+\" : \"−\"}${escapeHtml(formatPrice(Math.abs(change)))} (${escapeHtml(formatPercent(pct, locale))})</span>`;\n const vol = store.hasVolume\n ? ` <span style=\"color:var(--text-secondary-color,#6b7280)\">${escapeHtml(l.volume)}</span>${escapeHtml(formatVolume(store.volume[index], locale))}`\n : \"\";\n const next = `${html} ${changeHtml}${vol}`;\n if (span && span.dataset.html !== next) {\n span.innerHTML = next;\n span.dataset.html = next;\n span.style.display = \"inline-flex\";\n span.style.gap = \"4px\";\n span.style.flexWrap = \"wrap\";\n }\n }\n for (const study of studies) {\n const row = legendRows.get(study.id);\n if (!row) continue;\n const shown = isVisible(study);\n row.row.style.opacity = shown ? \"1\" : \"0.5\";\n if (row.button) {\n row.button.setAttribute(\"aria-pressed\", String(shown));\n row.button.style.textDecoration = shown ? \"none\" : \"line-through\";\n }\n const slots = study.outputs.length;\n if (study.mergeLegend) {\n // one value: the output in use (SuperTrend up or down)\n const out = study.outputs.find((o) => finite(o.values[index]));\n setSpan(\n row.values[0],\n shown && count && out ? studyValueText(study, out.values[index]) : \"\",\n out ? css(colorOf(out.color)) : undefined,\n );\n continue;\n }\n study.outputs.forEach((out, i) => {\n // the MACD histogram (drawn first, under the lines) is listed last\n const span =\n row.values[study.type === \"macd\" ? (i + slots - 1) % slots : i];\n if (!shown || !count) {\n setSpan(span, \"\");\n return;\n }\n if (out.kind === \"volume\") {\n const c = store.close[index] >= store.open[index] ? upC : downC;\n setSpan(span, formatVolume(store.volume[index], locale), c);\n return;\n }\n // a shifted output shows the value drawn at this bar\n const source = index - out.shift;\n const value = source >= 0 && source < count ? out.values[source] : NaN;\n let color = out.color ? css(colorOf(out.color)) : undefined;\n if (out.kind === \"histogram\") color = value >= 0 ? upC : downC;\n if (out.kind === \"dots\" && !out.color)\n color = value <= store.close[index] ? upC : downC;\n const prefix =\n study.outputs.length > 1 && !study.plainLegend ? `${out.label} ` : \"\";\n setSpan(span, `${prefix}${studyValueText(study, value)}`, color);\n });\n }\n for (const c of compares) {\n const row = legendRows.get(`compare:${c.id}`);\n if (!row) continue;\n const value = c.values[index];\n const base = compareBase(c);\n const pct = finite(base) ? (value / base - 1) * 100 : NaN;\n setSpan(\n row.values[0],\n `${c.name} ${formatPrice(value)} ${formatPercent(pct, locale)}`,\n css(c.color),\n );\n }\n };\n\n const escapeHtml = (text: string) =>\n text.replace(/[&<>\"]/g, (ch) =>\n ch === \"&\"\n ? \"&amp;\"\n : ch === \"<\"\n ? \"&lt;\"\n : ch === \">\"\n ? \"&gt;\"\n : \"&quot;\",\n );\n\n // ---------------------------------------------------------------- frame\n\n const invalidate = () => {\n if (destroyed || frameId) return;\n frameId = win?.requestAnimationFrame\n ? win.requestAnimationFrame(frame)\n : (setTimeout(() => frame(Date.now()), 16) as unknown as number);\n };\n\n const animate = (now: number) => {\n let active = false;\n if (scrollAnim) {\n const t = Math.min(1, (now - scrollAnim.start) / 320);\n const eased = 1 - (1 - t) ** 3;\n right = scrollAnim.from + (scrollAnim.to - scrollAnim.from) * eased;\n if (t >= 1) scrollAnim = null;\n else active = true;\n }\n if (kinetic) {\n const dt = Math.min(64, now - kinetic.t);\n kinetic.t = now;\n const before = right;\n right -= (kinetic.v * dt) / spacing;\n kinetic.v *= Math.exp(-dt / 320);\n clampView();\n if (Math.abs(kinetic.v) < 0.02 || right === before) kinetic = null;\n else active = true;\n }\n return active;\n };\n\n const measureAxis = (ctx: CanvasRenderingContext2D) => {\n ctx.font = font(theme.fontSize, 500);\n let widest = 0;\n for (const pane of panes) {\n for (const t of pane.ticks)\n widest = Math.max(widest, ctx.measureText(paneTickText(pane, t)).width);\n }\n const count = n();\n if (count) {\n widest = Math.max(\n widest,\n ctx.measureText(priceAxisText(store.close[count - 1])).width,\n );\n if (options.countdown)\n widest = Math.max(widest, ctx.measureText(\"00:00:00\").width);\n }\n const wanted = Math.max(MIN_AXIS, Math.ceil(widest + 18));\n // shrink only when clearly narrower (no jitter while the price moves)\n if (wanted > axisW || wanted < axisW - 12) axisW = wanted;\n };\n\n function frame(now?: number) {\n frameId = 0;\n if (destroyed) return;\n width = root.clientWidth;\n height = root.clientHeight;\n if (width <= 0 || height <= 0) return;\n const time = now ?? Date.now();\n const animating = animate(\n typeof performance !== \"undefined\" ? performance.now() : time,\n );\n const dpr = win?.devicePixelRatio || 1;\n syncDerived();\n sizeCanvas(background, dpr);\n sizeCanvas(foreground, dpr);\n const bg = background.getContext(\"2d\");\n const fg = foreground.getContext(\"2d\");\n plotH = Math.max(1, height - TIME_AXIS);\n for (let pass = 0; pass < 2; pass++) {\n plotW = Math.max(1, width - axisW);\n layoutPanes();\n if (pendingRange) applyRange(pendingRange);\n clampView();\n vis = computeVisible();\n autoscale(vis);\n for (const pane of panes) {\n const ticks = scaleTicks(pane.scale, pane.id === PRICE ? 44 : 30);\n // fixed-range panes (RSI) label their bands and their middle\n const range = pane.study?.range;\n const bands = pane.study?.bands;\n pane.ticks =\n range && bands\n ? [...bands, (range[0] + range[1]) / 2].sort((a, b) => a - b)\n : ticks.scaled;\n pane.step = ticks.step;\n }\n const before = axisW;\n if (fg) measureAxis(fg);\n if (axisW === before) break;\n }\n const v = vis;\n pendingRange = null;\n const ticks = fg ? timeTicks(v, fg) : [];\n renderData(v, dpr);\n if (bg) {\n bg.setTransform(dpr, 0, 0, dpr, 0, 0);\n bg.clearRect(0, 0, width, height);\n paintBackground(bg, v, ticks);\n }\n if (fg) {\n fg.setTransform(dpr, 0, 0, dpr, 0, 0);\n fg.clearRect(0, 0, width, height);\n paintForeground(fg, v, ticks);\n }\n updateLegends();\n updateJump();\n updateToolbar();\n positionEditor();\n emitView();\n // buttons painted this frame may now be under the pointer\n if (\n pointer &&\n !gesture &&\n buttonAt(pointer.x, pointer.y) !== hoveredButton\n ) {\n updateCursor(pointer.x, pointer.y);\n invalidate();\n }\n if (animating) invalidate();\n }\n\n const updateJump = () => {\n const count = n();\n const price = panes[0];\n const show = count > 0 && price && xOf(count - 1) > plotW + spacing * 0.5;\n jump.style.display = show ? \"flex\" : \"none\";\n if (show && price) {\n jump.style.left = `${plotW - 40}px`;\n jump.style.top = `${price.top + price.height - 40}px`;\n const text = labels().scrollToRealtime;\n if (jump.getAttribute(\"aria-label\") !== text) {\n jump.setAttribute(\"aria-label\", text);\n jump.title = text;\n }\n }\n };\n\n const visibleRange = (): TradingVisibleRange => {\n const from = right - plotW / spacing;\n return { from, to: right, fromTime: timeAt(from), toTime: timeAt(right) };\n };\n\n const emitView = () => {\n const count = n();\n if (!count) return;\n const range = visibleRange();\n if (\n !lastRange ||\n Math.abs(lastRange.from - range.from) > 1e-6 ||\n Math.abs(lastRange.to - range.to) > 1e-6\n ) {\n lastRange = range;\n if (!silentRange) emit(\"visibleRangeChange\", range);\n }\n silentRange = false;\n if (range.from < 10 && historyFirst !== store.time[0]) {\n historyFirst = store.time[0];\n emit(\"historyRequest\", { firstTime: store.time[0], count });\n }\n const cross = crosshairState();\n // a crosshair set by `setCrosshair` is not reported\n const own = cross && (pointer || keyboardIndex !== null) ? cross : null;\n const key = own ? `${own.index}|${own.price}|${own.pane.id}` : \"\";\n if (key !== lastCrosshair) {\n lastCrosshair = key;\n if (!own) {\n emit(\"crosshairMove\", null);\n } else {\n const event: TradingCrosshairEvent = {\n index: own.index,\n time: timeAt(own.index),\n bar:\n own.index >= 0 && own.index < count\n ? readBar(store, own.index)\n : null,\n price: own.price,\n pane: own.pane.id,\n x: xOf(own.index),\n y: own.y,\n };\n emit(\"crosshairMove\", event);\n }\n }\n };\n\n // ---------------------------------------------------------- interaction\n\n const local = (event: { clientX: number; clientY: number }) => {\n const rect = root.getBoundingClientRect();\n return { x: event.clientX - rect.left, y: event.clientY - rect.top };\n };\n\n const applyRange = (range: { from: number; to: number }) => {\n spacing = plotW / (range.to - range.from);\n right = range.to;\n clampView();\n };\n\n /**\n * Zooms around `x`; while the latest bar is in view it stays where it is\n * (the reader is following the market), like the price scale side of\n * trading terminals\n */\n const zoomAt = (x: number, factor: number) => {\n const count = n();\n if (count && followsRealtime()) x = Math.min(plotW, xOf(count - 1));\n const anchor = indexAt(x);\n spacing = spacing * factor;\n clampView();\n right = anchor + (plotW - x) / spacing;\n clampView();\n kinetic = null;\n scrollAnim = null;\n invalidate();\n };\n\n const anchorAt = (x: number, y: number, pane: Pane): TradingDrawingPoint => {\n const index = Math.round(indexAt(x));\n return { time: timeAt(index), price: valueAt(pane.scale, y) };\n };\n\n const setTool = (next: TradingDrawingTool, notify: boolean) => {\n if (next === tool) return;\n tool = next;\n draft = null;\n draftClicks = 0;\n if (notify) emit(\"drawingToolChange\", next);\n invalidate();\n };\n\n const select = (id: string | null) => {\n if (id === selected) return;\n selected = id;\n paletteOpen = false;\n emit(\"drawingSelect\", id);\n invalidate();\n };\n\n // ------------------------------------------------------ drawing history\n\n const undoState = (): TradingUndoState => ({\n canUndo: undoStack.length > 0,\n canRedo: redoStack.length > 0,\n });\n\n const emitUndo = () => {\n const state = undoState();\n const key = `${state.canUndo}|${state.canRedo}`;\n if (key === undoKey) return;\n undoKey = key;\n emit(\"undoChange\", state);\n };\n\n /** Records a change of the drawings: undoable, and reported unless `notify` is false */\n const commitDrawings = (next: readonly TradingDrawing[], notify = true) => {\n if (next !== committed) {\n undoStack.push(committed);\n if (undoStack.length > HISTORY_LIMIT) undoStack.shift();\n redoStack.length = 0;\n committed = next;\n }\n drawings = next;\n if (notify) {\n emittedDrawings = next;\n emit(\"drawingsChange\", next);\n }\n if (selected && !next.some((d) => d.id === selected)) select(null);\n emitUndo();\n invalidate();\n };\n\n /** Shows drawings of the history (undo / redo) */\n const restoreDrawings = (next: readonly TradingDrawing[]) => {\n committed = next;\n drawings = next;\n emittedDrawings = next;\n draft = null;\n if (selected && !next.some((d) => d.id === selected)) select(null);\n emit(\"drawingsChange\", next);\n emitUndo();\n invalidate();\n };\n\n const undo = () => {\n const previous = undoStack.pop();\n if (!previous) return;\n if (editing) closeEditor(false);\n redoStack.push(committed);\n restoreDrawings(previous);\n };\n\n const redo = () => {\n const next = redoStack.pop();\n if (!next) return;\n undoStack.push(committed);\n restoreDrawings(next);\n };\n\n const updateDrawing = (id: string, patch: TradingDrawingPatch) => {\n if (!drawings.some((d) => d.id === id)) return;\n commitDrawings(\n drawings.map((d) =>\n d.id === id ? { ...d, ...patch, id: d.id, type: d.type } : d,\n ),\n );\n };\n\n const removeDrawing = (id: string) => {\n if (!drawings.some((d) => d.id === id)) return;\n if (selected === id) select(null);\n commitDrawings(drawings.filter((d) => d.id !== id));\n };\n\n /** Default target and stop of a new position: a reward twice the risk */\n const positionPoints = (\n entry: TradingDrawingPoint,\n pane: Pane,\n long: boolean,\n ): TradingDrawingPoint[] => {\n const y = yOf(pane.scale, entry.price);\n const risk = Math.max(12, pane.height * 0.07);\n const target = valueAt(pane.scale, y + (long ? -2 : 2) * risk);\n const stop = valueAt(pane.scale, y + (long ? 1 : -1) * risk);\n const bars = Math.max(6, Math.round((plotW * 0.16) / spacing));\n const end = timeAt(Math.round(indexOfTimeExt(entry.time)) + bars);\n return [\n entry,\n { time: end, price: roundPrice(target) },\n { time: end, price: roundPrice(stop) },\n ];\n };\n\n const finishDraft = () => {\n if (!draft) return;\n const done = draft;\n draft = null;\n draftClicks = 0;\n commitDrawings([...drawings, done]);\n select(done.id);\n if (!options.keepDrawingMode) setTool(\"cursor\", true);\n if (done.type === \"text\") openEditor(done.id, true);\n };\n\n /** Fixes the anchor following the pointer; the drawing is done after its last anchor */\n const fixDraftAnchor = () => {\n if (!draft) return;\n draftClicks--;\n if (draftClicks <= 0) {\n finishDraft();\n return;\n }\n const last = draft.points[draft.points.length - 1];\n if (last) draft = { ...draft, points: [...draft.points, last] };\n };\n\n /** Moves the anchor of the drawing being made to the pointer */\n const followDraft = (x: number, y: number) => {\n const pane = paneOf(draftPane);\n if (!draft || !pane || draftClicks <= 0) return;\n draft = {\n ...draft,\n points: [...draft.points.slice(0, -1), anchorAt(x, y, pane)],\n };\n };\n\n const hitLine = (x: number, y: number) => {\n const price = panes[0];\n if (!price || x > plotW) return null;\n for (const line of options.priceLines ?? []) {\n if (!line.draggable) continue;\n if (Math.abs(yOf(price.scale, linePrice(line)) - y) <= 5) return line;\n }\n return null;\n };\n\n const hitDrawingAt = (x: number, y: number) => {\n if (x > plotW) return null;\n const pane = paneAt(y);\n const mapper = drawingMapper(pane);\n if (!pane || !mapper) return null;\n for (let i = drawings.length - 1; i >= 0; i--) {\n const drawing = drawings[i];\n if (!drawing || (drawing.pane ?? PRICE) !== pane.id) continue;\n const hit = hitDrawing(\n drawing,\n mapper,\n { x, y },\n 6,\n textBoxes.get(drawing.id),\n );\n if (hit) return { drawing, hit, pane };\n }\n return null;\n };\n\n const buttonAt = (x: number, y: number) =>\n canvasButtons.findIndex(\n (b) => x >= b.x && x <= b.x + b.w && y >= b.y && y <= b.y + b.h,\n );\n\n const separatorAt = (y: number) => {\n for (let i = 1; i < panes.length; i++) {\n if (Math.abs(panes[i].top - y) <= 4) return i;\n }\n return -1;\n };\n\n // --------------------------------------------------------- text editor\n\n const autosizeEditor = () => {\n editor.style.height = \"auto\";\n editor.style.height = `${Math.max(28, editor.scrollHeight + 2)}px`;\n };\n\n const positionEditor = () => {\n if (!editing) return;\n const id = editing.id;\n const drawing = drawings.find((d) => d.id === id);\n const pane = drawing ? paneOf(drawing.pane) : null;\n const anchor = drawing?.points[0];\n if (!drawing || !pane || !anchor) return;\n const x = xOf(indexOfTimeExt(anchor.time));\n const y = yOf(pane.scale, anchor.price);\n editor.style.left = `${clamp(x, 2, Math.max(2, plotW - 160))}px`;\n editor.style.top = `${clamp(y, 2, Math.max(2, plotH - 40))}px`;\n };\n\n function openEditor(id: string, created: boolean) {\n const drawing = drawings.find((d) => d.id === id);\n if (!drawing || drawing.locked) return;\n editing = { id, created };\n editor.value = created ? \"\" : (drawing.text ?? \"\");\n editor.placeholder = labels().text;\n editor.setAttribute(\"aria-label\", labels().editText);\n editor.style.display = \"block\";\n positionEditor();\n autosizeEditor();\n editor.focus();\n editor.select();\n invalidate();\n }\n\n function closeEditor(commit: boolean) {\n if (!editing) return;\n const { id, created } = editing;\n editing = null;\n editor.style.display = \"none\";\n const text = editor.value.replace(/\\s+$/, \"\");\n const drawing = drawings.find((d) => d.id === id);\n if (drawing && created && (!commit || !text)) {\n // a new text left empty or cancelled: as if it had never been made\n const previous = undoStack.pop();\n restoreDrawings(previous ?? drawings.filter((d) => d.id !== id));\n } else if (drawing && commit && text !== (drawing.text ?? \"\")) {\n if (created) {\n // the text completes the creation (a single undo step)\n const next = drawings.map((d) => (d.id === id ? { ...d, text } : d));\n committed = next;\n drawings = next;\n emittedDrawings = next;\n emit(\"drawingsChange\", next);\n } else {\n updateDrawing(id, { text });\n }\n }\n if (doc.activeElement === editor || doc.activeElement === doc.body)\n root.focus();\n invalidate();\n }\n\n editor.addEventListener(\"keydown\", (event) => {\n event.stopPropagation();\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n closeEditor(true);\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n closeEditor(false);\n }\n });\n editor.addEventListener(\"input\", autosizeEditor);\n editor.addEventListener(\"blur\", () => closeEditor(true));\n editor.addEventListener(\"pointerdown\", (event) => event.stopPropagation());\n editor.addEventListener(\"dblclick\", (event) => event.stopPropagation());\n\n // ------------------------------------------------------ drawing toolbar\n\n const icon = (path: string, dash = \"\", width = 1.5) =>\n `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"${width}\" stroke-linecap=\"round\" stroke-linejoin=\"round\"${dash ? ` stroke-dasharray=\"${dash}\"` : \"\"} aria-hidden=\"true\"><path d=\"${path}\"/></svg>`;\n\n const toolbarButton = (\n label: string,\n content: string,\n onClick: () => void,\n pressed?: boolean,\n ) => {\n const button = doc.createElement(\"button\");\n button.type = \"button\";\n button.setAttribute(\"aria-label\", label);\n button.title = label;\n if (pressed !== undefined)\n button.setAttribute(\"aria-pressed\", String(pressed));\n button.innerHTML = content;\n button.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n onClick();\n });\n return button;\n };\n\n const separator = () => {\n const span = doc.createElement(\"span\");\n span.className = \"sep\";\n return span;\n };\n\n const buildToolbar = (drawing: TradingDrawing) => {\n toolbar.textContent = \"\";\n const l = labels();\n toolbar.setAttribute(\"aria-label\", l.lineStyle);\n const id = drawing.id;\n const items: HTMLElement[] = [];\n if (!drawing.locked) {\n const color = css(drawing.color ?? PRIMARY);\n const swatch = toolbarButton(\n l.color,\n `<span style=\"display:block;width:14px;height:14px;border-radius:50%;background:${color};box-shadow:inset 0 0 0 1px rgba(127,127,127,.35)\"></span>`,\n () => {\n paletteOpen = !paletteOpen;\n toolbarKey = \"\";\n updateToolbar();\n },\n );\n swatch.setAttribute(\"aria-expanded\", String(paletteOpen));\n items.push(swatch);\n const width = drawing.lineWidth ?? 1.5;\n const widths = [1, 2, 3, 4];\n items.push(\n toolbarButton(\n `${l.lineWidth}: ${width}px`,\n `${icon(\"M2 8h12\", \"\", Math.min(4, width))}<span style=\"font-size:11px;margin-left:3px\">${width}</span>`,\n () =>\n updateDrawing(id, {\n lineWidth: widths.find((w) => w > width) ?? widths[0],\n }),\n ),\n );\n const lineStyle = drawing.lineStyle ?? \"solid\";\n items.push(\n toolbarButton(\n l.lineStyle,\n icon(\n \"M2 8h12\",\n lineStyle === \"dashed\"\n ? \"3.5 2.5\"\n : lineStyle === \"dotted\"\n ? \"0.1 3\"\n : \"\",\n lineStyle === \"dotted\" ? 2.2 : 1.6,\n ),\n () =>\n updateDrawing(id, {\n lineStyle:\n LINE_STYLES[\n (LINE_STYLES.indexOf(lineStyle) + 1) % LINE_STYLES.length\n ],\n }),\n ),\n );\n if (isFillable(drawing.type)) {\n items.push(\n toolbarButton(\n l.fill,\n '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\"><rect x=\"2.5\" y=\"3.5\" width=\"11\" height=\"9\" rx=\"1.5\" fill=\"currentColor\" fill-opacity=\".3\" stroke=\"currentColor\" stroke-width=\"1.3\"/></svg>',\n () => updateDrawing(id, { fill: drawing.fill === false }),\n drawing.fill !== false,\n ),\n );\n }\n if (drawing.type === \"text\") {\n items.push(\n toolbarButton(l.editText, icon(\"M3 13h3l7-7-3-3-7 7zM9 4l3 3\"), () =>\n openEditor(id, false),\n ),\n );\n }\n items.push(separator());\n }\n items.push(\n toolbarButton(\n l.lock,\n drawing.locked\n ? icon(\"M4.5 7.5h7v6h-7zM6 7.5V5.5a2 2 0 0 1 4 0v2\")\n : icon(\"M4.5 7.5h7v6h-7zM6 7.5V5.5a2 2 0 0 1 3.8-.9\"),\n () => updateDrawing(id, { locked: !drawing.locked }),\n !!drawing.locked,\n ),\n );\n if (!drawing.locked) {\n const remove = toolbarButton(\n l.remove,\n icon(\"M3 4.5h10M6.5 4.5V3h3v1.5M4.5 4.5l.7 8.5h5.6l.7-8.5\"),\n () => removeDrawing(id),\n );\n remove.style.color = \"var(--danger-color, #f23645)\";\n items.push(remove);\n }\n toolbar.append(...items);\n if (paletteOpen && !drawing.locked) {\n const palette = make(\"div\", {\n position: \"absolute\",\n left: \"0\",\n top: \"calc(100% + 4px)\",\n display: \"flex\",\n gap: \"2px\",\n padding: \"4px\",\n borderRadius: \"8px\",\n border:\n \"1px solid color-mix(in srgb, var(--border-color, #e5e7eb) 85%, transparent)\",\n background: \"var(--surface-elevated-color, var(--surface-color, #fff))\",\n boxShadow: \"0 8px 24px -8px rgba(15, 23, 42, 0.35)\",\n });\n for (const color of PALETTE) {\n const button = toolbarButton(\n `${l.color} ${color}`,\n `<span style=\"display:block;width:16px;height:16px;border-radius:50%;background:${color}\"></span>`,\n () => {\n paletteOpen = false;\n updateDrawing(id, { color });\n },\n (drawing.color ?? \"\").toLowerCase() === color,\n );\n palette.appendChild(button);\n }\n toolbar.appendChild(palette);\n }\n };\n\n function updateToolbar() {\n const drawing = selected\n ? drawings.find((d) => d.id === selected)\n : undefined;\n const pane = drawing ? paneOf(drawing.pane) : null;\n const mapper = drawingMapper(pane);\n const dragging = gesture?.kind === \"drawing\" && gesture.moved;\n if (\n !drawing ||\n !pane ||\n !mapper ||\n options.drawingToolbar === false ||\n editing ||\n dragging ||\n draft\n ) {\n toolbar.style.display = \"none\";\n toolbarKey = \"\";\n paletteOpen = false;\n return;\n }\n const key = [\n drawing.id,\n drawing.color,\n drawing.lineWidth,\n drawing.lineStyle,\n drawing.fill,\n drawing.locked,\n paletteOpen,\n locale,\n themeVersion,\n ].join(\"|\");\n if (key !== toolbarKey) {\n toolbarKey = key;\n buildToolbar(drawing);\n }\n toolbar.style.display = \"flex\";\n // above the drawing (below it when there is no room), inside the plot\n const pts = handlePoints(drawing, mapper, textBoxes.get(drawing.id));\n const box = textBoxes.get(drawing.id);\n if (drawing.type === \"text\" && box)\n pts.push({ x: box.x + box.w, y: box.y + box.h });\n let x0 = Infinity;\n let x1 = -Infinity;\n let y0 = Infinity;\n let y1 = -Infinity;\n for (const p of pts) {\n x0 = Math.min(x0, clamp(p.x, 0, plotW));\n x1 = Math.max(x1, clamp(p.x, 0, plotW));\n y0 = Math.min(y0, clamp(p.y, pane.top, pane.top + pane.height));\n y1 = Math.max(y1, clamp(p.y, pane.top, pane.top + pane.height));\n }\n if (drawing.type === \"horizontalLine\") {\n x0 = plotW * 0.35;\n x1 = plotW * 0.65;\n }\n const w = toolbar.offsetWidth || 200;\n const h = toolbar.offsetHeight || 34;\n const left = clamp((x0 + x1) / 2 - w / 2, 4, Math.max(4, plotW - w - 4));\n let top = y0 - h - 14;\n // below, clear of the labels under the drawing (position stops, measures)\n if (top < 4) top = y1 + 32;\n toolbar.style.left = `${Math.round(left)}px`;\n toolbar.style.top = `${Math.round(clamp(top, 4, Math.max(4, plotH - h - 4)))}px`;\n }\n\n toolbar.addEventListener(\"pointerdown\", (event) => event.stopPropagation());\n toolbar.addEventListener(\"dblclick\", (event) => event.stopPropagation());\n // the chart under the toolbar is not hovered\n toolbar.addEventListener(\"pointermove\", (event) => event.stopPropagation());\n toolbar.addEventListener(\"pointerenter\", () => {\n pointer = null;\n hovered = null;\n root.style.cursor = \"default\";\n invalidate();\n });\n\n // ---------------------------------------------------------------- replay\n\n const replayState = (): TradingReplayState => ({\n active: !!replay,\n picking: replayPicking,\n playing: !!replay?.playing,\n speed: replay?.speed ?? replaySpeed,\n index: n(),\n total: replay ? replay.source.length : n(),\n time: n() ? store.time[n() - 1] : NaN,\n });\n\n const emitReplay = () => emit(\"replayChange\", replayState());\n\n const columnsOf = (from: BarStore, count: number) => ({\n time: from.time.subarray(0, count),\n open: from.open.subarray(0, count),\n high: from.high.subarray(0, count),\n low: from.low.subarray(0, count),\n close: from.close.subarray(0, count),\n volume: from.volume.subarray(0, count),\n });\n\n /** Replaces the bars of the store by the first `count` bars of `source` */\n const showBars = (source: BarStore, count: number) => {\n const hasVolume = source.hasVolume;\n storeSet(store, columnsOf(source, count));\n store.hasVolume = hasVolume;\n pyramid = createPyramid();\n haPyramid = createPyramid();\n haValid = 0;\n historyFirst = NaN;\n afterDataChange(0);\n };\n\n const stopReplayTimer = () => {\n if (replay?.timer) clearInterval(replay.timer);\n if (replay) {\n replay.timer = null;\n replay.playing = false;\n }\n };\n\n const beginReplay = (index: number) => {\n replayPicking = false;\n if (!replay) {\n if (!n()) return;\n const source = createStore();\n storeSet(source, columnsOf(store, n()));\n source.hasVolume = store.hasVolume;\n replay = { source, playing: false, speed: replaySpeed, timer: null };\n }\n stopReplayTimer();\n const shown = clamp(Math.round(index) + 1, 1, replay.source.length);\n showBars(replay.source, shown);\n right = shown - 1 + (options.rightOffset ?? 8);\n for (const scale of scales.values()) scale.auto = true;\n emitReplay();\n };\n\n const replayStepBy = (count: number) => {\n if (!replay) return;\n const source = replay.source;\n const before = n();\n const follow = followsRealtime();\n let from = -1;\n for (let i = 0; i < count && n() < source.length; i++) {\n const at = storeUpdate(store, readBar(source, n()));\n if (from < 0) from = at;\n }\n store.hasVolume = source.hasVolume;\n if (from >= 0) {\n if (follow) right += n() - before;\n afterDataChange(from);\n }\n if (n() >= source.length) stopReplayTimer();\n emitReplay();\n };\n\n const playReplay = (speed?: number) => {\n if (!replay) return;\n if (speed !== undefined && speed > 0) replay.speed = replaySpeed = speed;\n stopReplayTimer();\n if (n() >= replay.source.length) {\n emitReplay();\n return;\n }\n const interval = Math.max(16, 1000 / replay.speed);\n const perTick = Math.max(1, Math.round((replay.speed * interval) / 1000));\n replay.playing = true;\n replay.timer = setInterval(() => replayStepBy(perTick), interval);\n emitReplay();\n };\n\n /** Ends the replay; `restore` shows every bar again */\n const endReplay = (restore: boolean) => {\n const wasPicking = replayPicking;\n replayPicking = false;\n if (!replay) {\n if (wasPicking) {\n emitReplay();\n invalidate();\n }\n return;\n }\n stopReplayTimer();\n const source = replay.source;\n replay = null;\n if (restore) showBars(source, source.length);\n emitReplay();\n };\n\n // ----------------------------------------------------------- pointer\n\n const updateCursor = (x: number, y: number) => {\n let cursor = \"crosshair\";\n hoveredLine = null;\n let nextHover: string | null = null;\n const button = gesture ? -1 : buttonAt(x, y);\n if (button !== hoveredButton) hoveredButton = button;\n if (gesture?.kind === \"pan\" && gesture.moved) cursor = \"grabbing\";\n else if (button >= 0) cursor = \"pointer\";\n else if (replayPicking && x <= plotW && y <= plotH) cursor = \"pointer\";\n else if (separatorAt(y) > 0) cursor = \"row-resize\";\n else if (x > plotW && y < plotH) cursor = \"ns-resize\";\n else if (y > plotH) cursor = \"ew-resize\";\n else if (tool === \"cursor\") {\n const line = hitLine(x, y);\n if (line) {\n cursor = \"ns-resize\";\n hoveredLine = line.id;\n } else {\n const hit = hitDrawingAt(x, y);\n if (hit) {\n nextHover = hit.drawing.id;\n cursor = hit.drawing.locked\n ? \"pointer\"\n : hit.hit.part === \"handle\"\n ? \"move\"\n : \"pointer\";\n }\n }\n }\n if (nextHover !== hovered) hovered = nextHover;\n if (root.style.cursor !== cursor) root.style.cursor = cursor;\n };\n\n const onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0 && event.pointerType === \"mouse\") return;\n const { x, y } = local(event);\n pointer = { x, y };\n keyboardIndex = null;\n kinetic = null;\n scrollAnim = null;\n if (editing) closeEditor(true);\n if (paletteOpen) {\n paletteOpen = false;\n invalidate();\n }\n if (event.pointerType === \"touch\") {\n touches.set(event.pointerId, { x, y });\n if (touches.size === 2) {\n const [a, b] = [...touches.values()];\n pinch = { distance: Math.hypot(a.x - b.x, a.y - b.y), spacing };\n gesture = null;\n return;\n }\n }\n try {\n root.setPointerCapture(event.pointerId);\n } catch {\n // the pointer may already be released\n }\n const button = buttonAt(x, y);\n const target = canvasButtons[button];\n if (target) {\n gesture = { kind: \"button\", action: target.action };\n return;\n }\n if (replayPicking && x <= plotW && y <= plotH) {\n beginReplay(Math.min(n() - 1, Math.round(indexAt(x))));\n return;\n }\n const sep = separatorAt(y);\n if (sep > 0) {\n const above = panes[sep - 1];\n const below = panes[sep];\n gesture = {\n kind: \"separator\",\n index: sep,\n y,\n above: above.height,\n below: below.height,\n };\n return;\n }\n if (x > plotW && y < plotH) {\n const pane = paneAt(y);\n if (pane)\n gesture = {\n kind: \"axisY\",\n pane,\n y,\n min: pane.scale.min,\n max: pane.scale.max,\n };\n return;\n }\n if (y > plotH) {\n gesture = { kind: \"axisX\", x, spacing };\n return;\n }\n const pane = paneAt(y);\n if (tool !== \"cursor\" && pane && n()) {\n if (draft) {\n // the next anchor of a click-by-click drawing\n followDraft(x, y);\n fixDraftAnchor();\n gesture = null;\n invalidate();\n return;\n }\n const type = tool;\n const position = isPosition(type);\n // positions need prices: on the price pane only\n const at = position ? panes[0] : pane;\n const point = anchorAt(x, clamp(y, at.top, at.top + at.height), at);\n const anchors = anchorCount(type);\n draftPane = at.id;\n draft = {\n id: `drawing-${Date.now().toString(36)}-${++drawingCounter}`,\n type,\n points: position\n ? positionPoints(\n { ...point, price: roundPrice(point.price) },\n at,\n type === \"longPosition\",\n )\n : anchors === 1\n ? [point]\n : [point, point],\n ...(at.id !== PRICE ? { pane: at.id } : {}),\n };\n if (anchors === 1) {\n finishDraft();\n return;\n }\n draftClicks = anchors - 1;\n gesture = { kind: \"create\", pane: at, x, y, moved: false };\n invalidate();\n return;\n }\n if (tool === \"cursor\") {\n const line = hitLine(x, y);\n if (line) {\n gesture = { kind: \"order\", line, startPrice: line.price };\n return;\n }\n const hit = hitDrawingAt(x, y);\n if (hit) {\n select(hit.drawing.id);\n if (!hit.drawing.locked) {\n gesture = {\n kind: \"drawing\",\n id: hit.drawing.id,\n pane: hit.pane,\n handle: hit.hit.part === \"handle\" ? hit.hit.index : -1,\n x,\n y,\n original: hit.drawing,\n moved: false,\n };\n }\n return;\n }\n }\n gesture = {\n kind: \"pan\",\n x,\n y,\n right,\n pane,\n moved: false,\n lastX: x,\n lastY: y,\n lastT: event.timeStamp,\n velocity: 0,\n };\n };\n\n const onPointerMove = (event: PointerEvent) => {\n const { x, y } = local(event);\n pointer = { x, y };\n if (event.pointerType === \"touch\" && touches.has(event.pointerId)) {\n touches.set(event.pointerId, { x, y });\n if (pinch && touches.size === 2) {\n const [a, b] = [...touches.values()];\n const distance = Math.hypot(a.x - b.x, a.y - b.y);\n const count = n();\n const mid =\n count && followsRealtime()\n ? Math.min(plotW, xOf(count - 1))\n : (a.x + b.x) / 2;\n const anchor = indexAt(mid);\n spacing = (pinch.spacing * distance) / Math.max(1, pinch.distance);\n clampView();\n right = anchor + (plotW - mid) / spacing;\n clampView();\n invalidate();\n return;\n }\n }\n const g = gesture;\n if (!g) {\n if (draft) followDraft(x, y);\n updateCursor(x, y);\n invalidate();\n return;\n }\n switch (g.kind) {\n case \"pan\": {\n const dx = x - g.x;\n if (!g.moved && Math.hypot(dx, y - g.y) < 3) break;\n g.moved = true;\n right = g.right - dx / spacing;\n if (g.pane && !g.pane.scale.auto) panScale(g.pane.scale, y - g.lastY);\n g.lastY = y;\n const dt = Math.max(1, event.timeStamp - g.lastT);\n g.velocity = 0.6 * ((x - g.lastX) / dt) + 0.4 * g.velocity;\n g.lastX = x;\n g.lastT = event.timeStamp;\n clampView();\n root.style.cursor = \"grabbing\";\n break;\n }\n case \"axisY\": {\n const scale = g.pane.scale;\n scale.min = g.min;\n scale.max = g.max;\n zoomScale(scale, Math.exp((y - g.y) * 0.006));\n break;\n }\n case \"axisX\": {\n const lastIndex = right;\n spacing = g.spacing * Math.exp((x - g.x) * 0.006);\n clampView();\n right = lastIndex;\n clampView();\n break;\n }\n case \"separator\": {\n const dy = y - g.y;\n const above = panes[g.index - 1];\n const below = panes[g.index];\n if (!above || !below) break;\n const total = g.above + g.below;\n const nextBelow = clamp(g.below - dy, MIN_PANE, total - MIN_PANE);\n paneHeights.set(below.id, nextBelow);\n if (above.id !== PRICE) paneHeights.set(above.id, total - nextBelow);\n break;\n }\n case \"order\": {\n lineOverrides.set(g.line.id, roundPrice(valueAt(panes[0].scale, y)));\n break;\n }\n case \"drawing\": {\n if (!g.moved && Math.hypot(x - g.x, y - g.y) < 3) break;\n g.moved = true;\n const scale = g.pane.scale;\n let points: TradingDrawingPoint[];\n if (g.handle >= 0) {\n points = moveHandle(g.original, g.handle, anchorAt(x, y, g.pane));\n } else {\n const di = Math.round(indexAt(x) - indexAt(g.x));\n const ds = scaledAt(scale, y) - scaledAt(scale, g.y);\n points = g.original.points.map((p) => ({\n time: timeAt(Math.round(indexOfTimeExt(p.time)) + di),\n price: fromScaled(scale, toScaled(scale, p.price) + ds),\n }));\n }\n drawings = drawings.map((d) => (d.id === g.id ? { ...d, points } : d));\n break;\n }\n case \"create\": {\n if (Math.hypot(x - g.x, y - g.y) >= 4) g.moved = true;\n followDraft(x, y);\n break;\n }\n default:\n updateCursor(x, y);\n break;\n }\n invalidate();\n };\n\n const onPointerUp = (event: PointerEvent) => {\n touches.delete(event.pointerId);\n if (touches.size < 2) pinch = null;\n const g = gesture;\n gesture = null;\n const { x, y } = local(event);\n if (event.pointerType === \"touch\") pointer = null;\n if (!g) {\n invalidate();\n return;\n }\n switch (g.kind) {\n case \"pan\":\n if (!g.moved) {\n if (selected) select(null);\n const pane = paneAt(y);\n if (pane && x <= plotW) {\n emit(\"click\", {\n index: Math.round(indexAt(x)),\n time: timeAt(Math.round(indexAt(x))),\n price: valueAt(pane.scale, y),\n pane: pane.id,\n });\n }\n } else if (\n options.kineticScroll !== false &&\n event.timeStamp - g.lastT < 60 &&\n Math.abs(g.velocity) > 0.25\n ) {\n kinetic = {\n v: g.velocity,\n t:\n typeof performance !== \"undefined\"\n ? performance.now()\n : Date.now(),\n };\n }\n break;\n case \"order\": {\n const next = lineOverrides.get(g.line.id);\n if (next !== undefined && next !== g.startPrice) {\n emit(\"orderMove\", {\n id: g.line.id,\n price: next,\n previousPrice: g.startPrice,\n line: g.line,\n });\n } else {\n lineOverrides.delete(g.line.id);\n }\n break;\n }\n case \"drawing\":\n if (g.moved) commitDrawings(drawings);\n break;\n case \"create\":\n // a click starts a click-by-click drawing; a drag fixes the anchor\n if (g.moved) fixDraftAnchor();\n break;\n case \"button\":\n if (buttonAt(x, y) >= 0) g.action();\n break;\n default:\n break;\n }\n updateCursor(x, y);\n invalidate();\n };\n\n const onPointerLeave = (event: PointerEvent) => {\n if (gesture || event.pointerType === \"touch\") return;\n pointer = null;\n hovered = null;\n hoveredLine = null;\n invalidate();\n };\n\n const onWheel = (event: WheelEvent) => {\n const mode = options.wheel ?? \"zoom\";\n if (mode === \"none\") return;\n const { x } = local(event);\n const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? plotW : 1;\n const dx = event.deltaX * unit;\n const dy = event.deltaY * unit;\n const modifier = event.ctrlKey || event.metaKey;\n if (mode === \"modifier\" && !modifier && Math.abs(dx) <= Math.abs(dy))\n return;\n event.preventDefault();\n keyboardIndex = null;\n if (Math.abs(dx) > Math.abs(dy) || event.shiftKey) {\n right += (Math.abs(dx) > Math.abs(dy) ? dx : dy) / spacing;\n clampView();\n kinetic = null;\n invalidate();\n return;\n }\n const factor = Math.exp(-dy * (event.ctrlKey ? 0.01 : 0.0015));\n zoomAt(Math.min(x, plotW), factor);\n };\n\n const onDoubleClick = (event: MouseEvent) => {\n const { x, y } = local(event);\n const hit = tool === \"cursor\" ? hitDrawingAt(x, y) : null;\n if (hit?.drawing.type === \"text\") {\n openEditor(hit.drawing.id, false);\n return;\n }\n if (x > plotW && y < plotH) {\n const pane = paneAt(y);\n if (pane) pane.scale.auto = true;\n } else if (y > plotH) {\n spacing = options.barSpacing ?? 8;\n instance.scrollToRealtime(true);\n } else {\n for (const scale of scales.values()) scale.auto = true;\n }\n invalidate();\n };\n\n const announce = (index: number) => {\n if (index < 0 || index >= n()) return;\n const d = display();\n const l = labels();\n live.textContent = fill(l.announcement, {\n time: formatCrosshairTime(shift(store.time[index]), tfMs(), locale),\n open: formatPrice(d.open[index]),\n high: formatPrice(d.high[index]),\n low: formatPrice(d.low[index]),\n close: formatPrice(d.close[index]),\n });\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if ((event.ctrlKey || event.metaKey) && !event.altKey) {\n const key = event.key.toLowerCase();\n if (key === \"z\" || key === \"y\") {\n if (key === \"y\" || event.shiftKey) redo();\n else undo();\n event.preventDefault();\n }\n return;\n }\n const count = n();\n const page = Math.max(1, Math.floor(plotW / spacing / 2));\n const move = (index: number) => {\n keyboardIndex = clamp(index, 0, Math.max(0, count - 1));\n const x = xOf(keyboardIndex);\n if (x < spacing) right += (spacing - x) / spacing + 1;\n if (x > plotW - spacing) right -= (x - plotW + spacing) / spacing - 1;\n clampView();\n announce(keyboardIndex);\n };\n const current = keyboardIndex ?? Math.min(count - 1, Math.round(right));\n switch (event.key) {\n case \"ArrowLeft\":\n move(current - (event.shiftKey ? 10 : 1));\n break;\n case \"ArrowRight\":\n move(current + (event.shiftKey ? 10 : 1));\n break;\n case \"PageUp\":\n move(current - page);\n break;\n case \"PageDown\":\n move(current + page);\n break;\n case \"Home\":\n move(0);\n break;\n case \"End\":\n move(count - 1);\n instance.scrollToRealtime(true);\n break;\n case \"+\":\n case \"=\":\n case \"ArrowUp\":\n zoomAt(keyboardIndex !== null ? xOf(keyboardIndex) : plotW, 1.2);\n break;\n case \"-\":\n case \"_\":\n case \"ArrowDown\":\n zoomAt(keyboardIndex !== null ? xOf(keyboardIndex) : plotW, 1 / 1.2);\n break;\n case \"Escape\":\n if (paletteOpen) paletteOpen = false;\n else if (replayPicking) endReplay(false);\n else if (draft) {\n draft = null;\n draftClicks = 0;\n } else if (tool !== \"cursor\") setTool(\"cursor\", true);\n else if (selected) select(null);\n else keyboardIndex = null;\n break;\n case \"Delete\":\n case \"Backspace\": {\n const target = drawings.find((d) => d.id === selected);\n if (!target || target.locked) return;\n removeDrawing(target.id);\n break;\n }\n default:\n return;\n }\n event.preventDefault();\n invalidate();\n };\n\n const onFocus = () => {\n let keyboard = true;\n try {\n keyboard = root.matches(\":focus-visible\");\n } catch {\n // older engines: show the ring\n }\n if (keyboard)\n root.style.boxShadow = `inset 0 0 0 2px ${toCss(theme.primary, 0.6)}`;\n };\n const onBlur = () => {\n root.style.boxShadow = \"\";\n if (keyboardIndex !== null) {\n keyboardIndex = null;\n invalidate();\n }\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 root.addEventListener(\"focus\", onFocus);\n root.addEventListener(\"blur\", onBlur);\n jump.addEventListener(\"pointerdown\", (event) => event.stopPropagation());\n jump.addEventListener(\"click\", () => instance.scrollToRealtime(true));\n\n const resizeObserver =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(() => invalidate())\n : null;\n resizeObserver?.observe(root);\n\n const refreshTheme = () => {\n if (destroyed) return;\n const next = readTheme(root);\n if (themeColorsChanged(theme, next)) themeVersion++;\n theme = next;\n legendKey = \"\";\n invalidate();\n };\n const unwatchTheme = watchTheme(refreshTheme);\n\n // the page language, when no `locale` is given\n let langObserver: MutationObserver | null = null;\n if (typeof MutationObserver === \"function\" && root.ownerDocument) {\n langObserver = new MutationObserver(() => {\n if (options.locale) return;\n const before = locale;\n resolveTexts();\n if (locale === before) return;\n legendKey = \"\";\n optionsVersion++;\n applyStatic();\n invalidate();\n });\n langObserver.observe(root.ownerDocument.documentElement, {\n attributes: true,\n attributeFilter: [\"lang\"],\n });\n }\n\n // ----------------------------------------------------- image, full screen\n\n /** Every layer of the chart (and the legends) drawn on one canvas */\n const compose = (): HTMLCanvasElement | null => {\n if (destroyed) return null;\n // a fresh frame: the GPU canvas is read in the same task\n if (frameId) {\n if (win?.cancelAnimationFrame) win.cancelAnimationFrame(frameId);\n else clearTimeout(frameId);\n frameId = 0;\n }\n frame();\n const dpr = win?.devicePixelRatio || 1;\n const canvas = doc.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(width * dpr));\n canvas.height = Math.max(1, Math.round(height * dpr));\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n ctx.fillStyle = toCss(theme.background);\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n try {\n ctx.drawImage(background, 0, 0);\n if (renderer)\n ctx.drawImage(\n renderer.canvas,\n 0,\n 0,\n Math.round(plotW * dpr),\n Math.round(plotH * dpr),\n );\n ctx.drawImage(foreground, 0, 0);\n } catch {\n // a canvas that can't be read (lost context): skipped\n }\n // the legends are DOM text: written at their place\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n const origin = root.getBoundingClientRect();\n const view = win ?? null;\n legends.querySelectorAll(\"span, button\").forEach((element) => {\n const text = element.textContent ?? \"\";\n if (element.children.length || !text.trim() || !view) return;\n const rect = element.getBoundingClientRect();\n const computed = view.getComputedStyle(element);\n ctx.font = `${computed.fontWeight} ${computed.fontSize} ${computed.fontFamily}`;\n ctx.fillStyle = computed.color || toCss(theme.text);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(\n text,\n rect.left - origin.left,\n rect.top - origin.top + rect.height / 2,\n );\n });\n return canvas;\n };\n\n let fullscreen = false;\n const onFullscreen = () => {\n const next = doc.fullscreenElement === root;\n if (next === fullscreen) return;\n fullscreen = next;\n root.style.background = next ? toCss(theme.background) : \"\";\n emit(\"fullscreenChange\", next);\n invalidate();\n };\n doc.addEventListener(\"fullscreenchange\", onFullscreen);\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 () => createDataCanvas(doc),\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 geomKey = \"\";\n if (next) {\n root.dataset.renderer = next.kind;\n root.insertBefore(next.canvas, foreground);\n emit(\"renderer\", next.kind);\n }\n resolveReady(next?.kind ?? null);\n invalidate();\n };\n\n // ------------------------------------------------------------- options\n\n const applyStatic = () => {\n const symbol = options.symbol ?? \"\";\n root.setAttribute(\n \"aria-label\",\n options.ariaLabel ?? fill(labels().chart, { symbol }).trim(),\n );\n const wantTimer = !!options.countdown && options.lastPriceLine !== false;\n if (wantTimer && !countdownTimer)\n countdownTimer = setInterval(invalidate, 1000);\n if (!wantTimer && countdownTimer) {\n clearInterval(countdownTimer);\n countdownTimer = null;\n }\n };\n\n const applyOptions = (previous: TradingChartOptions | null) => {\n const next = options;\n resolveTexts();\n const nextZone =\n next.timeZone && isTimeZone(next.timeZone) ? next.timeZone : undefined;\n const timeChanged =\n !!previous &&\n (next.utcOffset !== previous.utcOffset || nextZone !== zone);\n zone = nextZone;\n if (!previous || next.indicators !== previous.indicators) rebuildStudies();\n // session periods (VWAP) follow the displayed time\n if (timeChanged) for (const study of studies) studyValid.set(study, 0);\n if (!previous || next.compare !== previous.compare) rebuildCompares();\n if (next.bars && (!previous || next.bars !== previous.bars)) {\n if (replay) endReplay(false);\n if (previous) applyBarsOption(next.bars);\n else replaceBars(next.bars);\n } else if (!next.bars && previous?.bars) {\n if (replay) endReplay(false);\n replaceBars([]);\n }\n if (previous && next.barSpacing !== previous.barSpacing && next.barSpacing)\n spacing = next.barSpacing;\n if (previous && next.scaleMode !== previous.scaleMode) {\n const price = scales.get(PRICE);\n if (price) price.auto = true;\n }\n if (\n next.drawings &&\n next.drawings !== emittedDrawings &&\n (!previous || next.drawings !== previous.drawings)\n ) {\n if (previous) commitDrawings(next.drawings, false);\n else drawings = committed = next.drawings;\n }\n if (\n previous &&\n (next.drawingMode ?? \"cursor\") !== (previous.drawingMode ?? \"cursor\")\n ) {\n setTool(next.drawingMode ?? \"cursor\", false);\n }\n if (previous && next.priceLines !== previous.priceLines)\n lineOverrides.clear();\n if (previous && next.chartStyle !== previous.chartStyle)\n haValid = Math.min(haValid, 0);\n optionsVersion++;\n applyStatic();\n invalidate();\n };\n\n applyOptions(null);\n void initRenderer();\n\n // ------------------------------------------------------------------ api\n\n const instance: TradingChartInstance = {\n setOptions(next) {\n if (destroyed) return;\n const previous = options;\n options = { ...next };\n applyOptions(previous);\n if ((next.renderer ?? \"auto\") !== (previous.renderer ?? \"auto\"))\n void initRenderer();\n },\n setBars(bars) {\n if (replay) endReplay(false);\n replaceBars(bars);\n },\n update(bar) {\n if (replay) {\n // the stream goes on behind the replay\n storeUpdate(replay.source, bar);\n return;\n }\n const before = n();\n const follow = followsRealtime();\n const at = storeUpdate(store, bar);\n if (at < 0) return;\n if (n() > before && follow) right += n() - before;\n afterDataChange(at);\n },\n appendBars(bars) {\n if (replay) {\n storeAppend(replay.source, bars);\n return;\n }\n const before = n();\n const follow = followsRealtime();\n const at = storeAppend(store, bars);\n if (at < 0) return;\n if (follow) right += n() - before;\n afterDataChange(at);\n },\n prependBars(bars) {\n if (replay) storePrepend(replay.source, bars);\n const added = storePrepend(store, bars);\n if (!added) return;\n pyramid = createPyramid();\n haPyramid = createPyramid();\n haValid = 0;\n right += added;\n if (keyboardIndex !== null) keyboardIndex += added;\n afterDataChange(0);\n },\n getBarCount: () => n(),\n getBar: (index) =>\n index >= 0 && index < n() ? readBar(store, Math.floor(index)) : null,\n scrollToRealtime(animateScroll = true) {\n const target = n() - 1 + (options.rightOffset ?? 8);\n kinetic = null;\n if (\n animateScroll &&\n finite(right) &&\n Math.abs(target - right) * spacing < plotW * 6\n ) {\n scrollAnim = {\n from: right,\n to: target,\n start:\n typeof performance !== \"undefined\" ? performance.now() : Date.now(),\n };\n } else {\n right = target;\n }\n invalidate();\n },\n fitContent() {\n const count = n();\n if (!count) return;\n instance.setVisibleRange({\n from: -0.5,\n to: count - 1 + (options.rightOffset ?? 8),\n });\n },\n getVisibleRange: () => visibleRange(),\n setVisibleRange({ from, to }) {\n if (!(to > from)) return;\n kinetic = null;\n scrollAnim = null;\n pendingRange = { from, to };\n applyRange(pendingRange);\n invalidate();\n },\n getVisibleTimeRange() {\n const range = visibleRange();\n return { from: timeAtFrac(range.from), to: timeAtFrac(range.to) };\n },\n setVisibleTimeRange({ from, to }) {\n if (!n() || !(to > from)) return;\n instance.setVisibleRange({\n from: indexAtTimeFrac(from),\n to: indexAtTimeFrac(to),\n });\n },\n setCrosshair(time, price) {\n externalCross =\n time === null || !finite(time) ? null : { time, price: price ?? NaN };\n invalidate();\n },\n setScaleMode(mode) {\n options = { ...options, scaleMode: mode };\n const price = scales.get(PRICE);\n if (price) price.auto = true;\n invalidate();\n },\n resetPriceScales() {\n for (const scale of scales.values()) scale.auto = true;\n invalidate();\n },\n setDrawingTool: (next) => setTool(next, true),\n getDrawingTool: () => tool,\n getDrawings: () => drawings,\n setDrawings(next) {\n commitDrawings(next, false);\n },\n removeDrawing,\n updateDrawing,\n selectDrawing: (id) => select(id),\n undo,\n redo,\n getUndoState: undoState,\n startReplay(time) {\n if (!n() && !replay) return;\n if (time === undefined) {\n if (replay) endReplay(true);\n replayPicking = true;\n emitReplay();\n invalidate();\n return;\n }\n const source = replay ? replay.source : store;\n beginReplay(indexOfTime(source.time, source.length, time));\n },\n replayStep: (count = 1) => replayStepBy(Math.max(1, Math.floor(count))),\n replayPlay: (speed) => playReplay(speed),\n replayPause() {\n if (!replay) return;\n stopReplayTimer();\n emitReplay();\n },\n stopReplay: () => endReplay(true),\n getReplayState: replayState,\n toDataURL(type = \"image/png\", quality) {\n return compose()?.toDataURL(type, quality) ?? \"\";\n },\n toBlob(type = \"image/png\", quality) {\n const canvas = compose();\n return new Promise((resolve) => {\n if (!canvas || typeof canvas.toBlob !== \"function\") resolve(null);\n else canvas.toBlob(resolve, type, quality);\n });\n },\n async requestFullscreen() {\n if (typeof root.requestFullscreen === \"function\")\n await root.requestFullscreen();\n },\n async exitFullscreen() {\n if (\n doc.fullscreenElement === root &&\n typeof doc.exitFullscreen === \"function\"\n )\n await doc.exitFullscreen();\n },\n isFullscreen: () => doc.fullscreenElement === root,\n setIndicatorVisible(id, visible) {\n visibility.set(id, visible);\n invalidate();\n },\n getRenderer: () => renderer?.kind ?? null,\n ready,\n refreshTheme,\n resize: () => invalidate(),\n on(type, listener) {\n let set = listeners.get(type);\n if (!set) listeners.set(type, (set = new Set()));\n set.add(listener as (event: never) => void);\n return () => set.delete(listener as (event: never) => void);\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n if (frameId) {\n if (win?.cancelAnimationFrame) win.cancelAnimationFrame(frameId);\n else clearTimeout(frameId);\n }\n if (countdownTimer) clearInterval(countdownTimer);\n if (replay?.timer) clearInterval(replay.timer);\n doc.removeEventListener(\"fullscreenchange\", onFullscreen);\n resizeObserver?.disconnect();\n unwatchTheme();\n langObserver?.disconnect();\n root.removeEventListener(\"wheel\", onWheel);\n renderer?.destroy();\n renderer = null;\n resolveReady(null);\n listeners.clear();\n root.remove();\n },\n };\n syncHooks.set(instance, {\n setTimeRange(range) {\n silentRange = true;\n instance.setVisibleTimeRange(range);\n },\n });\n return instance;\n};\n"],"mappings":"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"}