minerva-design 1.4.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (824) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +21 -21
  3. package/custom-elements.json +3072 -611
  4. package/dist/angular/fesm2022/minerva-angular.mjs +1491 -5
  5. package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
  6. package/dist/angular/types/minerva-angular.d.ts +595 -5
  7. package/dist/charts/canvas.d.cts +4 -3
  8. package/dist/charts/canvas.d.ts +4 -3
  9. package/dist/charts/core.cjs +1 -1
  10. package/dist/charts/core.d.cts +6 -4
  11. package/dist/charts/core.d.ts +6 -4
  12. package/dist/charts/core.js +24 -16
  13. package/dist/charts/engine/axis.cjs +1 -1
  14. package/dist/charts/engine/axis.cjs.map +1 -1
  15. package/dist/charts/engine/axis.js +42 -19
  16. package/dist/charts/engine/axis.js.map +1 -1
  17. package/dist/charts/engine/canvas.cjs +1 -1
  18. package/dist/charts/engine/canvas.cjs.map +1 -1
  19. package/dist/charts/engine/canvas.js +155 -127
  20. package/dist/charts/engine/canvas.js.map +1 -1
  21. package/dist/charts/engine/chart.cjs +1 -1
  22. package/dist/charts/engine/chart.cjs.map +1 -1
  23. package/dist/charts/engine/chart.js +370 -255
  24. package/dist/charts/engine/chart.js.map +1 -1
  25. package/dist/charts/engine/color.cjs +1 -1
  26. package/dist/charts/engine/color.cjs.map +1 -1
  27. package/dist/charts/engine/color.d.cts +18 -0
  28. package/dist/charts/engine/color.d.ts +18 -0
  29. package/dist/charts/engine/color.js +48 -2
  30. package/dist/charts/engine/color.js.map +1 -1
  31. package/dist/charts/engine/controller.cjs +2 -2
  32. package/dist/charts/engine/controller.cjs.map +1 -1
  33. package/dist/charts/engine/controller.d.cts +34 -1
  34. package/dist/charts/engine/controller.d.ts +34 -1
  35. package/dist/charts/engine/controller.js +318 -273
  36. package/dist/charts/engine/controller.js.map +1 -1
  37. package/dist/charts/engine/data.cjs +1 -1
  38. package/dist/charts/engine/data.cjs.map +1 -1
  39. package/dist/charts/engine/data.d.cts +3 -1
  40. package/dist/charts/engine/data.d.ts +3 -1
  41. package/dist/charts/engine/data.js +6 -4
  42. package/dist/charts/engine/data.js.map +1 -1
  43. package/dist/charts/engine/defaults.cjs +2 -0
  44. package/dist/charts/engine/defaults.cjs.map +1 -0
  45. package/dist/charts/engine/defaults.d.cts +20 -0
  46. package/dist/charts/engine/defaults.d.ts +20 -0
  47. package/dist/charts/engine/defaults.js +35 -0
  48. package/dist/charts/engine/defaults.js.map +1 -0
  49. package/dist/charts/engine/format.cjs +1 -1
  50. package/dist/charts/engine/format.cjs.map +1 -1
  51. package/dist/charts/engine/format.d.cts +6 -0
  52. package/dist/charts/engine/format.d.ts +6 -0
  53. package/dist/charts/engine/format.js +15 -2
  54. package/dist/charts/engine/format.js.map +1 -1
  55. package/dist/charts/engine/graph/chart.cjs +2 -0
  56. package/dist/charts/engine/graph/chart.cjs.map +1 -0
  57. package/dist/charts/engine/graph/chart.d.cts +3 -0
  58. package/dist/charts/engine/graph/chart.d.ts +3 -0
  59. package/dist/charts/engine/graph/chart.js +1708 -0
  60. package/dist/charts/engine/graph/chart.js.map +1 -0
  61. package/dist/charts/engine/graph/circular.cjs +2 -0
  62. package/dist/charts/engine/graph/circular.cjs.map +1 -0
  63. package/dist/charts/engine/graph/circular.d.cts +16 -0
  64. package/dist/charts/engine/graph/circular.d.ts +16 -0
  65. package/dist/charts/engine/graph/circular.js +62 -0
  66. package/dist/charts/engine/graph/circular.js.map +1 -0
  67. package/dist/charts/engine/graph/dag.cjs +2 -0
  68. package/dist/charts/engine/graph/dag.cjs.map +1 -0
  69. package/dist/charts/engine/graph/dag.d.cts +34 -0
  70. package/dist/charts/engine/graph/dag.d.ts +34 -0
  71. package/dist/charts/engine/graph/dag.js +339 -0
  72. package/dist/charts/engine/graph/dag.js.map +1 -0
  73. package/dist/charts/engine/graph/dom.cjs +2 -0
  74. package/dist/charts/engine/graph/dom.cjs.map +1 -0
  75. package/dist/charts/engine/graph/dom.d.cts +23 -0
  76. package/dist/charts/engine/graph/dom.d.ts +23 -0
  77. package/dist/charts/engine/graph/dom.js +158 -0
  78. package/dist/charts/engine/graph/dom.js.map +1 -0
  79. package/dist/charts/engine/graph/force.cjs +2 -0
  80. package/dist/charts/engine/graph/force.cjs.map +1 -0
  81. package/dist/charts/engine/graph/force.d.cts +76 -0
  82. package/dist/charts/engine/graph/force.d.ts +76 -0
  83. package/dist/charts/engine/graph/force.js +423 -0
  84. package/dist/charts/engine/graph/force.js.map +1 -0
  85. package/dist/charts/engine/graph/geometry.cjs +2 -0
  86. package/dist/charts/engine/graph/geometry.cjs.map +1 -0
  87. package/dist/charts/engine/graph/geometry.d.cts +50 -0
  88. package/dist/charts/engine/graph/geometry.d.ts +50 -0
  89. package/dist/charts/engine/graph/geometry.js +197 -0
  90. package/dist/charts/engine/graph/geometry.js.map +1 -0
  91. package/dist/charts/engine/graph/index.cjs +1 -0
  92. package/dist/charts/engine/graph/index.d.cts +6 -0
  93. package/dist/charts/engine/graph/index.d.ts +6 -0
  94. package/dist/charts/engine/graph/index.js +6 -0
  95. package/dist/charts/engine/graph/labels.cjs +2 -0
  96. package/dist/charts/engine/graph/labels.cjs.map +1 -0
  97. package/dist/charts/engine/graph/labels.d.cts +12 -0
  98. package/dist/charts/engine/graph/labels.d.ts +12 -0
  99. package/dist/charts/engine/graph/labels.js +128 -0
  100. package/dist/charts/engine/graph/labels.js.map +1 -0
  101. package/dist/charts/engine/graph/model.cjs +2 -0
  102. package/dist/charts/engine/graph/model.cjs.map +1 -0
  103. package/dist/charts/engine/graph/model.d.cts +52 -0
  104. package/dist/charts/engine/graph/model.d.ts +52 -0
  105. package/dist/charts/engine/graph/model.js +108 -0
  106. package/dist/charts/engine/graph/model.js.map +1 -0
  107. package/dist/charts/engine/graph/sizing.cjs +2 -0
  108. package/dist/charts/engine/graph/sizing.cjs.map +1 -0
  109. package/dist/charts/engine/graph/sizing.d.cts +33 -0
  110. package/dist/charts/engine/graph/sizing.d.ts +33 -0
  111. package/dist/charts/engine/graph/sizing.js +60 -0
  112. package/dist/charts/engine/graph/sizing.js.map +1 -0
  113. package/dist/charts/engine/graph/tree.cjs +2 -0
  114. package/dist/charts/engine/graph/tree.cjs.map +1 -0
  115. package/dist/charts/engine/graph/tree.d.cts +30 -0
  116. package/dist/charts/engine/graph/tree.d.ts +30 -0
  117. package/dist/charts/engine/graph/tree.js +218 -0
  118. package/dist/charts/engine/graph/tree.js.map +1 -0
  119. package/dist/charts/engine/graph/types.d.cts +640 -0
  120. package/dist/charts/engine/graph/types.d.ts +640 -0
  121. package/dist/charts/engine/graph/worker.cjs +52 -0
  122. package/dist/charts/engine/graph/worker.cjs.map +1 -0
  123. package/dist/charts/engine/graph/worker.d.cts +36 -0
  124. package/dist/charts/engine/graph/worker.d.ts +36 -0
  125. package/dist/charts/engine/graph/worker.js +135 -0
  126. package/dist/charts/engine/graph/worker.js.map +1 -0
  127. package/dist/charts/engine/items.cjs +1 -1
  128. package/dist/charts/engine/items.cjs.map +1 -1
  129. package/dist/charts/engine/items.d.cts +15 -2
  130. package/dist/charts/engine/items.d.ts +15 -2
  131. package/dist/charts/engine/items.js +131 -112
  132. package/dist/charts/engine/items.js.map +1 -1
  133. package/dist/charts/engine/labels.cjs +1 -1
  134. package/dist/charts/engine/labels.cjs.map +1 -1
  135. package/dist/charts/engine/labels.d.cts +17 -0
  136. package/dist/charts/engine/labels.d.ts +17 -0
  137. package/dist/charts/engine/labels.js +28 -4
  138. package/dist/charts/engine/labels.js.map +1 -1
  139. package/dist/charts/engine/layout.cjs +1 -1
  140. package/dist/charts/engine/layout.cjs.map +1 -1
  141. package/dist/charts/engine/layout.d.cts +9 -0
  142. package/dist/charts/engine/layout.d.ts +9 -0
  143. package/dist/charts/engine/layout.js +11 -2
  144. package/dist/charts/engine/layout.js.map +1 -1
  145. package/dist/charts/engine/model.cjs +1 -1
  146. package/dist/charts/engine/model.cjs.map +1 -1
  147. package/dist/charts/engine/model.d.cts +73 -3
  148. package/dist/charts/engine/model.d.ts +73 -3
  149. package/dist/charts/engine/model.js +258 -154
  150. package/dist/charts/engine/model.js.map +1 -1
  151. package/dist/charts/engine/orderbook/field.cjs +37 -0
  152. package/dist/charts/engine/orderbook/field.cjs.map +1 -0
  153. package/dist/charts/engine/orderbook/field.d.cts +92 -0
  154. package/dist/charts/engine/orderbook/field.d.ts +92 -0
  155. package/dist/charts/engine/orderbook/field.js +297 -0
  156. package/dist/charts/engine/orderbook/field.js.map +1 -0
  157. package/dist/charts/engine/orderbook/format.cjs +1 -1
  158. package/dist/charts/engine/orderbook/format.cjs.map +1 -1
  159. package/dist/charts/engine/orderbook/format.d.cts +3 -2
  160. package/dist/charts/engine/orderbook/format.d.ts +3 -2
  161. package/dist/charts/engine/orderbook/format.js +5 -5
  162. package/dist/charts/engine/orderbook/format.js.map +1 -1
  163. package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
  164. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
  165. package/dist/charts/engine/orderbook/heatmap.js +566 -475
  166. package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
  167. package/dist/charts/engine/orderbook/host.cjs +1 -1
  168. package/dist/charts/engine/orderbook/host.cjs.map +1 -1
  169. package/dist/charts/engine/orderbook/host.d.cts +8 -1
  170. package/dist/charts/engine/orderbook/host.d.ts +8 -1
  171. package/dist/charts/engine/orderbook/host.js +27 -5
  172. package/dist/charts/engine/orderbook/host.js.map +1 -1
  173. package/dist/charts/engine/orderbook/ladder.cjs +1 -1
  174. package/dist/charts/engine/orderbook/ladder.cjs.map +1 -1
  175. package/dist/charts/engine/orderbook/ladder.js +1 -1
  176. package/dist/charts/engine/orderbook/ladder.js.map +1 -1
  177. package/dist/charts/engine/orderbook/layout.cjs +2 -0
  178. package/dist/charts/engine/orderbook/layout.cjs.map +1 -0
  179. package/dist/charts/engine/orderbook/layout.d.cts +42 -0
  180. package/dist/charts/engine/orderbook/layout.d.ts +42 -0
  181. package/dist/charts/engine/orderbook/layout.js +76 -0
  182. package/dist/charts/engine/orderbook/layout.js.map +1 -0
  183. package/dist/charts/engine/orderbook/tape.cjs +1 -1
  184. package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
  185. package/dist/charts/engine/orderbook/tape.js +4 -4
  186. package/dist/charts/engine/orderbook/tape.js.map +1 -1
  187. package/dist/charts/engine/orderbook/types.d.cts +27 -3
  188. package/dist/charts/engine/orderbook/types.d.ts +27 -3
  189. package/dist/charts/engine/overlay.cjs +1 -1
  190. package/dist/charts/engine/overlay.cjs.map +1 -1
  191. package/dist/charts/engine/overlay.d.cts +27 -0
  192. package/dist/charts/engine/overlay.d.ts +27 -0
  193. package/dist/charts/engine/overlay.js +34 -12
  194. package/dist/charts/engine/overlay.js.map +1 -1
  195. package/dist/charts/engine/presets.cjs +2 -2
  196. package/dist/charts/engine/presets.cjs.map +1 -1
  197. package/dist/charts/engine/presets.d.cts +35 -3
  198. package/dist/charts/engine/presets.d.ts +35 -3
  199. package/dist/charts/engine/presets.js +121 -101
  200. package/dist/charts/engine/presets.js.map +1 -1
  201. package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
  202. package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
  203. package/dist/charts/engine/renderers/canvas2d.js +13 -9
  204. package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
  205. package/dist/charts/engine/renderers/detect.cjs +1 -1
  206. package/dist/charts/engine/renderers/detect.cjs.map +1 -1
  207. package/dist/charts/engine/renderers/detect.d.cts +2 -1
  208. package/dist/charts/engine/renderers/detect.d.ts +2 -1
  209. package/dist/charts/engine/renderers/detect.js +23 -21
  210. package/dist/charts/engine/renderers/detect.js.map +1 -1
  211. package/dist/charts/engine/renderers/follow.cjs +2 -0
  212. package/dist/charts/engine/renderers/follow.cjs.map +1 -0
  213. package/dist/charts/engine/renderers/follow.d.cts +8 -0
  214. package/dist/charts/engine/renderers/follow.d.ts +8 -0
  215. package/dist/charts/engine/renderers/follow.js +10 -0
  216. package/dist/charts/engine/renderers/follow.js.map +1 -0
  217. package/dist/charts/engine/renderers/gl-budget.cjs +2 -0
  218. package/dist/charts/engine/renderers/gl-budget.cjs.map +1 -0
  219. package/dist/charts/engine/renderers/gl-budget.d.cts +32 -0
  220. package/dist/charts/engine/renderers/gl-budget.d.ts +32 -0
  221. package/dist/charts/engine/renderers/gl-budget.js +95 -0
  222. package/dist/charts/engine/renderers/gl-budget.js.map +1 -0
  223. package/dist/charts/engine/renderers/gl.cjs +1 -1
  224. package/dist/charts/engine/renderers/gl.cjs.map +1 -1
  225. package/dist/charts/engine/renderers/gl.js +1 -1
  226. package/dist/charts/engine/renderers/gl.js.map +1 -1
  227. package/dist/charts/engine/renderers/shaders.cjs +9 -6
  228. package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
  229. package/dist/charts/engine/renderers/shaders.d.cts +1 -1
  230. package/dist/charts/engine/renderers/shaders.d.ts +1 -1
  231. package/dist/charts/engine/renderers/shaders.js +9 -6
  232. package/dist/charts/engine/renderers/shaders.js.map +1 -1
  233. package/dist/charts/engine/renderers/types.cjs.map +1 -1
  234. package/dist/charts/engine/renderers/types.d.cts +2 -0
  235. package/dist/charts/engine/renderers/types.d.ts +2 -0
  236. package/dist/charts/engine/renderers/types.js.map +1 -1
  237. package/dist/charts/engine/renderers/webgl.cjs +1 -1
  238. package/dist/charts/engine/renderers/webgl.cjs.map +1 -1
  239. package/dist/charts/engine/renderers/webgl.js +85 -64
  240. package/dist/charts/engine/renderers/webgl.js.map +1 -1
  241. package/dist/charts/engine/renderers/webgl2.cjs +1 -1
  242. package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
  243. package/dist/charts/engine/renderers/webgl2.js +72 -58
  244. package/dist/charts/engine/renderers/webgl2.js.map +1 -1
  245. package/dist/charts/engine/renderers/webgpu.cjs +1 -1
  246. package/dist/charts/engine/renderers/webgpu.cjs.map +1 -1
  247. package/dist/charts/engine/renderers/webgpu.js +1 -1
  248. package/dist/charts/engine/renderers/webgpu.js.map +1 -1
  249. package/dist/charts/engine/scene.cjs +1 -1
  250. package/dist/charts/engine/scene.cjs.map +1 -1
  251. package/dist/charts/engine/scene.d.cts +104 -4
  252. package/dist/charts/engine/scene.d.ts +104 -4
  253. package/dist/charts/engine/scene.js +412 -193
  254. package/dist/charts/engine/scene.js.map +1 -1
  255. package/dist/charts/engine/shapes/bullet.cjs +1 -1
  256. package/dist/charts/engine/shapes/bullet.cjs.map +1 -1
  257. package/dist/charts/engine/shapes/bullet.js +110 -110
  258. package/dist/charts/engine/shapes/bullet.js.map +1 -1
  259. package/dist/charts/engine/shapes/chart.cjs +1 -1
  260. package/dist/charts/engine/shapes/chart.cjs.map +1 -1
  261. package/dist/charts/engine/shapes/chart.js +4 -1
  262. package/dist/charts/engine/shapes/chart.js.map +1 -1
  263. package/dist/charts/engine/shapes/chord.cjs +2 -0
  264. package/dist/charts/engine/shapes/chord.cjs.map +1 -0
  265. package/dist/charts/engine/shapes/chord.d.cts +18 -0
  266. package/dist/charts/engine/shapes/chord.d.ts +18 -0
  267. package/dist/charts/engine/shapes/chord.js +419 -0
  268. package/dist/charts/engine/shapes/chord.js.map +1 -0
  269. package/dist/charts/engine/shapes/draw.cjs +1 -1
  270. package/dist/charts/engine/shapes/draw.cjs.map +1 -1
  271. package/dist/charts/engine/shapes/draw.d.cts +5 -1
  272. package/dist/charts/engine/shapes/draw.d.ts +5 -1
  273. package/dist/charts/engine/shapes/draw.js +47 -17
  274. package/dist/charts/engine/shapes/draw.js.map +1 -1
  275. package/dist/charts/engine/shapes/hit.cjs +1 -1
  276. package/dist/charts/engine/shapes/hit.cjs.map +1 -1
  277. package/dist/charts/engine/shapes/hit.d.cts +3 -1
  278. package/dist/charts/engine/shapes/hit.d.ts +3 -1
  279. package/dist/charts/engine/shapes/hit.js +75 -46
  280. package/dist/charts/engine/shapes/hit.js.map +1 -1
  281. package/dist/charts/engine/shapes/index.d.cts +3 -2
  282. package/dist/charts/engine/shapes/index.d.ts +3 -2
  283. package/dist/charts/engine/shapes/labels.cjs +1 -1
  284. package/dist/charts/engine/shapes/labels.cjs.map +1 -1
  285. package/dist/charts/engine/shapes/labels.js +12 -4
  286. package/dist/charts/engine/shapes/labels.js.map +1 -1
  287. package/dist/charts/engine/shapes/layout.cjs +2 -2
  288. package/dist/charts/engine/shapes/layout.cjs.map +1 -1
  289. package/dist/charts/engine/shapes/layout.d.cts +3 -1
  290. package/dist/charts/engine/shapes/layout.d.ts +3 -1
  291. package/dist/charts/engine/shapes/layout.js +106 -78
  292. package/dist/charts/engine/shapes/layout.js.map +1 -1
  293. package/dist/charts/engine/shapes/scene.cjs +1 -1
  294. package/dist/charts/engine/shapes/scene.cjs.map +1 -1
  295. package/dist/charts/engine/shapes/scene.d.cts +33 -3
  296. package/dist/charts/engine/shapes/scene.d.ts +33 -3
  297. package/dist/charts/engine/shapes/scene.js +62 -19
  298. package/dist/charts/engine/shapes/scene.js.map +1 -1
  299. package/dist/charts/engine/shapes/types.d.cts +121 -8
  300. package/dist/charts/engine/shapes/types.d.ts +121 -8
  301. package/dist/charts/engine/signature.cjs +1 -1
  302. package/dist/charts/engine/signature.cjs.map +1 -1
  303. package/dist/charts/engine/signature.js +1 -1
  304. package/dist/charts/engine/signature.js.map +1 -1
  305. package/dist/charts/engine/three-d/canvas2d.cjs +1 -1
  306. package/dist/charts/engine/three-d/canvas2d.cjs.map +1 -1
  307. package/dist/charts/engine/three-d/canvas2d.d.cts +41 -3
  308. package/dist/charts/engine/three-d/canvas2d.d.ts +41 -3
  309. package/dist/charts/engine/three-d/canvas2d.js +166 -67
  310. package/dist/charts/engine/three-d/canvas2d.js.map +1 -1
  311. package/dist/charts/engine/three-d/chart.cjs +1 -1
  312. package/dist/charts/engine/three-d/chart.cjs.map +1 -1
  313. package/dist/charts/engine/three-d/chart.js +219 -215
  314. package/dist/charts/engine/three-d/chart.js.map +1 -1
  315. package/dist/charts/engine/three-d/detect.cjs +1 -1
  316. package/dist/charts/engine/three-d/detect.cjs.map +1 -1
  317. package/dist/charts/engine/three-d/detect.d.cts +3 -2
  318. package/dist/charts/engine/three-d/detect.d.ts +3 -2
  319. package/dist/charts/engine/three-d/detect.js +22 -20
  320. package/dist/charts/engine/three-d/detect.js.map +1 -1
  321. package/dist/charts/engine/three-d/geometry.cjs +1 -1
  322. package/dist/charts/engine/three-d/geometry.cjs.map +1 -1
  323. package/dist/charts/engine/three-d/geometry.d.cts +6 -0
  324. package/dist/charts/engine/three-d/geometry.d.ts +6 -0
  325. package/dist/charts/engine/three-d/geometry.js +106 -90
  326. package/dist/charts/engine/three-d/geometry.js.map +1 -1
  327. package/dist/charts/engine/three-d/model.cjs +1 -1
  328. package/dist/charts/engine/three-d/model.cjs.map +1 -1
  329. package/dist/charts/engine/three-d/model.d.cts +2 -0
  330. package/dist/charts/engine/three-d/model.d.ts +2 -0
  331. package/dist/charts/engine/three-d/model.js +2 -0
  332. package/dist/charts/engine/three-d/model.js.map +1 -1
  333. package/dist/charts/engine/three-d/oit.cjs +109 -0
  334. package/dist/charts/engine/three-d/oit.cjs.map +1 -0
  335. package/dist/charts/engine/three-d/oit.d.cts +34 -0
  336. package/dist/charts/engine/three-d/oit.d.ts +34 -0
  337. package/dist/charts/engine/three-d/oit.js +111 -0
  338. package/dist/charts/engine/three-d/oit.js.map +1 -0
  339. package/dist/charts/engine/three-d/overlay.cjs +1 -1
  340. package/dist/charts/engine/three-d/overlay.cjs.map +1 -1
  341. package/dist/charts/engine/three-d/overlay.js +43 -36
  342. package/dist/charts/engine/three-d/overlay.js.map +1 -1
  343. package/dist/charts/engine/three-d/render-types.cjs +1 -1
  344. package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
  345. package/dist/charts/engine/three-d/render-types.d.cts +37 -3
  346. package/dist/charts/engine/three-d/render-types.d.ts +37 -3
  347. package/dist/charts/engine/three-d/render-types.js +6 -10
  348. package/dist/charts/engine/three-d/render-types.js.map +1 -1
  349. package/dist/charts/engine/three-d/shaders.cjs +109 -48
  350. package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
  351. package/dist/charts/engine/three-d/shaders.d.cts +12 -5
  352. package/dist/charts/engine/three-d/shaders.d.ts +12 -5
  353. package/dist/charts/engine/three-d/shaders.js +118 -55
  354. package/dist/charts/engine/three-d/shaders.js.map +1 -1
  355. package/dist/charts/engine/three-d/sort.cjs +1 -1
  356. package/dist/charts/engine/three-d/sort.cjs.map +1 -1
  357. package/dist/charts/engine/three-d/sort.d.cts +18 -5
  358. package/dist/charts/engine/three-d/sort.d.ts +18 -5
  359. package/dist/charts/engine/three-d/sort.js +129 -43
  360. package/dist/charts/engine/three-d/sort.js.map +1 -1
  361. package/dist/charts/engine/three-d/types.d.cts +36 -0
  362. package/dist/charts/engine/three-d/types.d.ts +36 -0
  363. package/dist/charts/engine/three-d/webgl.cjs +1 -1
  364. package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
  365. package/dist/charts/engine/three-d/webgl.d.cts +9 -0
  366. package/dist/charts/engine/three-d/webgl.d.ts +9 -0
  367. package/dist/charts/engine/three-d/webgl.js +199 -74
  368. package/dist/charts/engine/three-d/webgl.js.map +1 -1
  369. package/dist/charts/engine/three-d/webgpu.cjs +1 -1
  370. package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
  371. package/dist/charts/engine/three-d/webgpu.js +231 -94
  372. package/dist/charts/engine/three-d/webgpu.js.map +1 -1
  373. package/dist/charts/engine/trading/chart.cjs +1 -1
  374. package/dist/charts/engine/trading/chart.cjs.map +1 -1
  375. package/dist/charts/engine/trading/chart.d.cts +10 -1
  376. package/dist/charts/engine/trading/chart.d.ts +10 -1
  377. package/dist/charts/engine/trading/chart.js +1677 -813
  378. package/dist/charts/engine/trading/chart.js.map +1 -1
  379. package/dist/charts/engine/trading/drawings.cjs +2 -1
  380. package/dist/charts/engine/trading/drawings.cjs.map +1 -1
  381. package/dist/charts/engine/trading/drawings.d.cts +53 -9
  382. package/dist/charts/engine/trading/drawings.d.ts +53 -9
  383. package/dist/charts/engine/trading/drawings.js +346 -71
  384. package/dist/charts/engine/trading/drawings.js.map +1 -1
  385. package/dist/charts/engine/trading/format.cjs +1 -1
  386. package/dist/charts/engine/trading/format.cjs.map +1 -1
  387. package/dist/charts/engine/trading/format.d.cts +19 -0
  388. package/dist/charts/engine/trading/format.d.ts +19 -0
  389. package/dist/charts/engine/trading/format.js +65 -21
  390. package/dist/charts/engine/trading/format.js.map +1 -1
  391. package/dist/charts/engine/trading/geometry.cjs +1 -1
  392. package/dist/charts/engine/trading/geometry.cjs.map +1 -1
  393. package/dist/charts/engine/trading/geometry.d.cts +16 -0
  394. package/dist/charts/engine/trading/geometry.d.ts +16 -0
  395. package/dist/charts/engine/trading/geometry.js +19 -4
  396. package/dist/charts/engine/trading/geometry.js.map +1 -1
  397. package/dist/charts/engine/trading/index.cjs +1 -1
  398. package/dist/charts/engine/trading/index.d.cts +2 -1
  399. package/dist/charts/engine/trading/index.d.ts +2 -1
  400. package/dist/charts/engine/trading/index.js +4 -3
  401. package/dist/charts/engine/trading/indicators.cjs +1 -1
  402. package/dist/charts/engine/trading/indicators.cjs.map +1 -1
  403. package/dist/charts/engine/trading/indicators.d.cts +180 -10
  404. package/dist/charts/engine/trading/indicators.d.ts +180 -10
  405. package/dist/charts/engine/trading/indicators.js +449 -173
  406. package/dist/charts/engine/trading/indicators.js.map +1 -1
  407. package/dist/charts/engine/trading/labels.cjs +1 -1
  408. package/dist/charts/engine/trading/labels.cjs.map +1 -1
  409. package/dist/charts/engine/trading/labels.js +104 -4
  410. package/dist/charts/engine/trading/labels.js.map +1 -1
  411. package/dist/charts/engine/trading/store.cjs +1 -1
  412. package/dist/charts/engine/trading/store.cjs.map +1 -1
  413. package/dist/charts/engine/trading/store.d.cts +21 -0
  414. package/dist/charts/engine/trading/store.d.ts +21 -0
  415. package/dist/charts/engine/trading/store.js +22 -1
  416. package/dist/charts/engine/trading/store.js.map +1 -1
  417. package/dist/charts/engine/trading/studies.cjs +1 -1
  418. package/dist/charts/engine/trading/studies.cjs.map +1 -1
  419. package/dist/charts/engine/trading/studies.d.cts +49 -8
  420. package/dist/charts/engine/trading/studies.d.ts +49 -8
  421. package/dist/charts/engine/trading/studies.js +352 -93
  422. package/dist/charts/engine/trading/studies.js.map +1 -1
  423. package/dist/charts/engine/trading/sync.cjs +2 -0
  424. package/dist/charts/engine/trading/sync.cjs.map +1 -0
  425. package/dist/charts/engine/trading/sync.d.cts +8 -0
  426. package/dist/charts/engine/trading/sync.d.ts +8 -0
  427. package/dist/charts/engine/trading/sync.js +25 -0
  428. package/dist/charts/engine/trading/sync.js.map +1 -0
  429. package/dist/charts/engine/trading/types.d.cts +514 -16
  430. package/dist/charts/engine/trading/types.d.ts +514 -16
  431. package/dist/charts/engine/types.d.cts +106 -11
  432. package/dist/charts/engine/types.d.ts +106 -11
  433. package/dist/charts/index.cjs +1 -1
  434. package/dist/charts/index.d.cts +3 -2
  435. package/dist/charts/index.d.ts +3 -2
  436. package/dist/charts/index.js +30 -22
  437. package/dist/charts/react/charts.cjs +1 -1
  438. package/dist/charts/react/charts.cjs.map +1 -1
  439. package/dist/charts/react/charts.js +51 -34
  440. package/dist/charts/react/charts.js.map +1 -1
  441. package/dist/charts/react/graph.cjs +2 -0
  442. package/dist/charts/react/graph.cjs.map +1 -0
  443. package/dist/charts/react/graph.d.cts +219 -0
  444. package/dist/charts/react/graph.d.ts +219 -0
  445. package/dist/charts/react/graph.js +160 -0
  446. package/dist/charts/react/graph.js.map +1 -0
  447. package/dist/charts/react/orderbook.cjs +1 -1
  448. package/dist/charts/react/orderbook.cjs.map +1 -1
  449. package/dist/charts/react/orderbook.d.cts +3 -1
  450. package/dist/charts/react/orderbook.d.ts +3 -1
  451. package/dist/charts/react/orderbook.js +1 -0
  452. package/dist/charts/react/orderbook.js.map +1 -1
  453. package/dist/charts/react/shapes.cjs +1 -1
  454. package/dist/charts/react/shapes.cjs.map +1 -1
  455. package/dist/charts/react/shapes.d.cts +88 -4
  456. package/dist/charts/react/shapes.d.ts +88 -4
  457. package/dist/charts/react/shapes.js +55 -12
  458. package/dist/charts/react/shapes.js.map +1 -1
  459. package/dist/charts/react/three-d.cjs +1 -1
  460. package/dist/charts/react/three-d.cjs.map +1 -1
  461. package/dist/charts/react/three-d.d.cts +7 -0
  462. package/dist/charts/react/three-d.d.ts +7 -0
  463. package/dist/charts/react/three-d.js +14 -13
  464. package/dist/charts/react/three-d.js.map +1 -1
  465. package/dist/charts/react/trading.cjs +1 -1
  466. package/dist/charts/react/trading.cjs.map +1 -1
  467. package/dist/charts/react/trading.d.cts +54 -2
  468. package/dist/charts/react/trading.d.ts +54 -2
  469. package/dist/charts/react/trading.js +68 -37
  470. package/dist/charts/react/trading.js.map +1 -1
  471. package/dist/charts/react/types.d.cts +11 -0
  472. package/dist/charts/react/types.d.ts +11 -0
  473. package/dist/core/contracts.cjs +1 -1
  474. package/dist/core/contracts.cjs.map +1 -1
  475. package/dist/core/contracts.js +1 -1
  476. package/dist/core/contracts.js.map +1 -1
  477. package/dist/native/charts/src/canvas.cjs +1 -1
  478. package/dist/native/charts/src/canvas.js +5 -4
  479. package/dist/native/charts/src/engine/axis.cjs +1 -1
  480. package/dist/native/charts/src/engine/axis.cjs.map +1 -1
  481. package/dist/native/charts/src/engine/axis.js +42 -19
  482. package/dist/native/charts/src/engine/axis.js.map +1 -1
  483. package/dist/native/charts/src/engine/color.cjs +1 -1
  484. package/dist/native/charts/src/engine/color.cjs.map +1 -1
  485. package/dist/native/charts/src/engine/color.js +47 -5
  486. package/dist/native/charts/src/engine/color.js.map +1 -1
  487. package/dist/native/charts/src/engine/controller.cjs +2 -2
  488. package/dist/native/charts/src/engine/controller.cjs.map +1 -1
  489. package/dist/native/charts/src/engine/controller.js +296 -251
  490. package/dist/native/charts/src/engine/controller.js.map +1 -1
  491. package/dist/native/charts/src/engine/data.cjs +1 -1
  492. package/dist/native/charts/src/engine/data.cjs.map +1 -1
  493. package/dist/native/charts/src/engine/data.js +6 -4
  494. package/dist/native/charts/src/engine/data.js.map +1 -1
  495. package/dist/native/charts/src/engine/format.cjs +1 -1
  496. package/dist/native/charts/src/engine/format.cjs.map +1 -1
  497. package/dist/native/charts/src/engine/format.js +15 -2
  498. package/dist/native/charts/src/engine/format.js.map +1 -1
  499. package/dist/native/charts/src/engine/labels.cjs +1 -1
  500. package/dist/native/charts/src/engine/labels.cjs.map +1 -1
  501. package/dist/native/charts/src/engine/labels.js +42 -5
  502. package/dist/native/charts/src/engine/labels.js.map +1 -1
  503. package/dist/native/charts/src/engine/layout.cjs +1 -1
  504. package/dist/native/charts/src/engine/layout.cjs.map +1 -1
  505. package/dist/native/charts/src/engine/layout.js +11 -2
  506. package/dist/native/charts/src/engine/layout.js.map +1 -1
  507. package/dist/native/charts/src/engine/model.cjs +1 -1
  508. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  509. package/dist/native/charts/src/engine/model.js +278 -174
  510. package/dist/native/charts/src/engine/model.js.map +1 -1
  511. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  512. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  513. package/dist/native/charts/src/engine/presets.cjs +2 -2
  514. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  515. package/dist/native/charts/src/engine/presets.js +110 -90
  516. package/dist/native/charts/src/engine/presets.js.map +1 -1
  517. package/dist/native/charts/src/engine/scene.cjs +1 -1
  518. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  519. package/dist/native/charts/src/engine/scene.js +421 -202
  520. package/dist/native/charts/src/engine/scene.js.map +1 -1
  521. package/dist/native/charts/src/engine/shapes/bullet.cjs +1 -1
  522. package/dist/native/charts/src/engine/shapes/bullet.cjs.map +1 -1
  523. package/dist/native/charts/src/engine/shapes/bullet.js +110 -110
  524. package/dist/native/charts/src/engine/shapes/bullet.js.map +1 -1
  525. package/dist/native/charts/src/engine/shapes/calendar.cjs +1 -1
  526. package/dist/native/charts/src/engine/shapes/calendar.cjs.map +1 -1
  527. package/dist/native/charts/src/engine/shapes/calendar.js +21 -16
  528. package/dist/native/charts/src/engine/shapes/calendar.js.map +1 -1
  529. package/dist/native/charts/src/engine/shapes/chord.cjs +2 -0
  530. package/dist/native/charts/src/engine/shapes/chord.cjs.map +1 -0
  531. package/dist/native/charts/src/engine/shapes/chord.js +419 -0
  532. package/dist/native/charts/src/engine/shapes/chord.js.map +1 -0
  533. package/dist/native/charts/src/engine/shapes/draw.cjs +1 -1
  534. package/dist/native/charts/src/engine/shapes/draw.cjs.map +1 -1
  535. package/dist/native/charts/src/engine/shapes/draw.js +47 -17
  536. package/dist/native/charts/src/engine/shapes/draw.js.map +1 -1
  537. package/dist/native/charts/src/engine/shapes/hit.cjs +1 -1
  538. package/dist/native/charts/src/engine/shapes/hit.cjs.map +1 -1
  539. package/dist/native/charts/src/engine/shapes/hit.js +73 -44
  540. package/dist/native/charts/src/engine/shapes/hit.js.map +1 -1
  541. package/dist/native/charts/src/engine/shapes/labels.cjs +1 -1
  542. package/dist/native/charts/src/engine/shapes/labels.cjs.map +1 -1
  543. package/dist/native/charts/src/engine/shapes/labels.js +12 -4
  544. package/dist/native/charts/src/engine/shapes/labels.js.map +1 -1
  545. package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
  546. package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
  547. package/dist/native/charts/src/engine/shapes/layout.js +136 -94
  548. package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
  549. package/dist/native/charts/src/engine/shapes/scene.cjs +1 -1
  550. package/dist/native/charts/src/engine/shapes/scene.cjs.map +1 -1
  551. package/dist/native/charts/src/engine/shapes/scene.js +62 -19
  552. package/dist/native/charts/src/engine/shapes/scene.js.map +1 -1
  553. package/dist/native/components/Chart/ChartBase.cjs +1 -1
  554. package/dist/native/components/Chart/ChartBase.cjs.map +1 -1
  555. package/dist/native/components/Chart/ChartBase.js +127 -115
  556. package/dist/native/components/Chart/ChartBase.js.map +1 -1
  557. package/dist/native/components/Chart/charts.cjs +1 -1
  558. package/dist/native/components/Chart/charts.cjs.map +1 -1
  559. package/dist/native/components/Chart/charts.js +8 -5
  560. package/dist/native/components/Chart/charts.js.map +1 -1
  561. package/dist/native/components/Chart/scene.cjs +1 -1
  562. package/dist/native/components/Chart/scene.cjs.map +1 -1
  563. package/dist/native/components/Chart/scene.d.cts +6 -1
  564. package/dist/native/components/Chart/scene.d.ts +6 -1
  565. package/dist/native/components/Chart/scene.js +226 -108
  566. package/dist/native/components/Chart/scene.js.map +1 -1
  567. package/dist/native/components/Chart/types.d.cts +7 -1
  568. package/dist/native/components/Chart/types.d.ts +7 -1
  569. package/dist/native/components/Charts/charts.cjs +1 -1
  570. package/dist/native/components/Charts/charts.cjs.map +1 -1
  571. package/dist/native/components/Charts/charts.js +60 -43
  572. package/dist/native/components/Charts/charts.js.map +1 -1
  573. package/dist/native/components/Charts/types.d.cts +11 -0
  574. package/dist/native/components/Charts/types.d.ts +11 -0
  575. package/dist/native/components/ShapeChart/ShapeChartBase.cjs +1 -1
  576. package/dist/native/components/ShapeChart/ShapeChartBase.cjs.map +1 -1
  577. package/dist/native/components/ShapeChart/ShapeChartBase.d.cts +1 -1
  578. package/dist/native/components/ShapeChart/ShapeChartBase.d.ts +1 -1
  579. package/dist/native/components/ShapeChart/ShapeChartBase.js +97 -106
  580. package/dist/native/components/ShapeChart/ShapeChartBase.js.map +1 -1
  581. package/dist/native/components/ShapeChart/charts.cjs +1 -1
  582. package/dist/native/components/ShapeChart/charts.cjs.map +1 -1
  583. package/dist/native/components/ShapeChart/charts.d.cts +6 -1
  584. package/dist/native/components/ShapeChart/charts.d.ts +6 -1
  585. package/dist/native/components/ShapeChart/charts.js +138 -96
  586. package/dist/native/components/ShapeChart/charts.js.map +1 -1
  587. package/dist/native/components/ShapeChart/draw.cjs +1 -1
  588. package/dist/native/components/ShapeChart/draw.cjs.map +1 -1
  589. package/dist/native/components/ShapeChart/draw.d.cts +1 -1
  590. package/dist/native/components/ShapeChart/draw.d.ts +1 -1
  591. package/dist/native/components/ShapeChart/draw.js +26 -17
  592. package/dist/native/components/ShapeChart/draw.js.map +1 -1
  593. package/dist/native/components/ShapeChart/geometry.cjs +1 -1
  594. package/dist/native/components/ShapeChart/geometry.cjs.map +1 -1
  595. package/dist/native/components/ShapeChart/geometry.js +233 -70
  596. package/dist/native/components/ShapeChart/geometry.js.map +1 -1
  597. package/dist/native/components/ShapeChart/index.cjs +1 -1
  598. package/dist/native/components/ShapeChart/index.d.cts +1 -1
  599. package/dist/native/components/ShapeChart/index.d.ts +1 -1
  600. package/dist/native/components/ShapeChart/index.js +2 -2
  601. package/dist/native/components/ShapeChart/recorder.cjs +1 -1
  602. package/dist/native/components/ShapeChart/recorder.cjs.map +1 -1
  603. package/dist/native/components/ShapeChart/recorder.d.cts +10 -1
  604. package/dist/native/components/ShapeChart/recorder.d.ts +10 -1
  605. package/dist/native/components/ShapeChart/recorder.js +19 -10
  606. package/dist/native/components/ShapeChart/recorder.js.map +1 -1
  607. package/dist/native/components/ShapeChart/types.d.cts +95 -8
  608. package/dist/native/components/ShapeChart/types.d.ts +95 -8
  609. package/dist/native/index.cjs +1 -1
  610. package/dist/native/index.js +2 -2
  611. package/dist/native/source/components/Chart/ChartBase.tsx +19 -6
  612. package/dist/native/source/components/Chart/charts.tsx +10 -3
  613. package/dist/native/source/components/Chart/scene.tsx +243 -14
  614. package/dist/native/source/components/Chart/types.ts +7 -0
  615. package/dist/native/source/components/Charts/charts.tsx +37 -2
  616. package/dist/native/source/components/Charts/types.ts +11 -0
  617. package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +10 -34
  618. package/dist/native/source/components/ShapeChart/charts.tsx +91 -35
  619. package/dist/native/source/components/ShapeChart/draw.tsx +39 -8
  620. package/dist/native/source/components/ShapeChart/geometry.ts +376 -25
  621. package/dist/native/source/components/ShapeChart/index.ts +1 -0
  622. package/dist/native/source/components/ShapeChart/recorder.ts +20 -5
  623. package/dist/native/source/components/ShapeChart/types.ts +99 -6
  624. package/dist/native/source/manifest.ts +1 -0
  625. package/dist/taro/chart-a11y.d.ts +7 -0
  626. package/dist/taro/charts.d.ts +29 -6
  627. package/dist/taro/index.js +3129 -1902
  628. package/dist/taro/shape-charts.d.ts +99 -5
  629. package/dist/uni/AreaChart.vue +2 -1
  630. package/dist/uni/AreaChart.vue.d.ts +5 -1
  631. package/dist/uni/Badge.vue.d.ts +1 -1
  632. package/dist/uni/BarChart.vue +2 -1
  633. package/dist/uni/BarChart.vue.d.ts +5 -1
  634. package/dist/uni/BoxPlotChart.vue +2 -1
  635. package/dist/uni/BoxPlotChart.vue.d.ts +8 -0
  636. package/dist/uni/BubbleChart.vue +2 -1
  637. package/dist/uni/BubbleChart.vue.d.ts +4 -0
  638. package/dist/uni/BulletChart.vue.d.ts +4 -0
  639. package/dist/uni/CalendarHeatmap.vue.d.ts +2 -0
  640. package/dist/uni/CandlestickChart.vue +2 -1
  641. package/dist/uni/CandlestickChart.vue.d.ts +4 -0
  642. package/dist/uni/Chart.vue +2 -1
  643. package/dist/uni/Chart.vue.d.ts +4 -0
  644. package/dist/uni/ChordChart.vue +93 -0
  645. package/dist/uni/ChordChart.vue.d.ts +136 -0
  646. package/dist/uni/Divider.vue.d.ts +1 -1
  647. package/dist/uni/DonutChart.vue.d.ts +5 -1
  648. package/dist/uni/FunnelChart.vue.d.ts +4 -0
  649. package/dist/uni/GanttChart.vue +2 -1
  650. package/dist/uni/GanttChart.vue.d.ts +15 -0
  651. package/dist/uni/GaugeChart.vue.d.ts +5 -1
  652. package/dist/uni/HeatmapChart.vue +2 -1
  653. package/dist/uni/HeatmapChart.vue.d.ts +8 -2
  654. package/dist/uni/HistogramChart.vue +2 -1
  655. package/dist/uni/HistogramChart.vue.d.ts +4 -0
  656. package/dist/uni/HorizontalBarChart.vue +2 -1
  657. package/dist/uni/HorizontalBarChart.vue.d.ts +3 -1
  658. package/dist/uni/LineChart.vue +2 -1
  659. package/dist/uni/LineChart.vue.d.ts +4 -0
  660. package/dist/uni/MixedChart.vue +2 -1
  661. package/dist/uni/MixedChart.vue.d.ts +4 -0
  662. package/dist/uni/PieChart.vue.d.ts +5 -1
  663. package/dist/uni/QuadrantChart.vue +2 -1
  664. package/dist/uni/QuadrantChart.vue.d.ts +4 -0
  665. package/dist/uni/RadarChart.vue.d.ts +4 -0
  666. package/dist/uni/RadialBarChart.vue.d.ts +4 -0
  667. package/dist/uni/RangeAreaChart.vue +2 -1
  668. package/dist/uni/RangeAreaChart.vue.d.ts +4 -0
  669. package/dist/uni/SankeyChart.vue.d.ts +4 -0
  670. package/dist/uni/ScatterChart.vue +2 -1
  671. package/dist/uni/ScatterChart.vue.d.ts +4 -0
  672. package/dist/uni/Sparkline.vue +2 -1
  673. package/dist/uni/Sparkline.vue.d.ts +4 -0
  674. package/dist/uni/SunburstChart.vue.d.ts +4 -0
  675. package/dist/uni/ToastProvider.vue.d.ts +1 -1
  676. package/dist/uni/TreemapChart.vue.d.ts +4 -0
  677. package/dist/uni/WaterfallChart.vue +2 -1
  678. package/dist/uni/WaterfallChart.vue.d.ts +9 -0
  679. package/dist/uni/chart-a11y.d.ts +7 -0
  680. package/dist/uni/chart-a11y.js +29 -0
  681. package/dist/uni/chart-canvas.d.ts +12 -0
  682. package/dist/uni/chart-canvas.js +15 -1
  683. package/dist/uni/chart-types.d.ts +36 -5
  684. package/dist/uni/chart-types.js +31 -3
  685. package/dist/uni/charts-canvas.js +3 -2
  686. package/dist/uni/index.d.ts +2 -1
  687. package/dist/uni/index.js +1 -0
  688. package/dist/uni/manifest.d.ts +7 -0
  689. package/dist/uni/manifest.js +10 -0
  690. package/dist/uni/named-chart-options.d.ts +11 -2
  691. package/dist/uni/named-chart-options.js +21 -1
  692. package/dist/uni/shape-chart-canvas.d.ts +3 -3
  693. package/dist/uni/shape-chart-canvas.js +17 -58
  694. package/dist/uni/shape-chart-types.d.ts +53 -3
  695. package/dist/uni/shape-chart-types.js +45 -1
  696. package/dist/vue/charts-global.d.ts +48 -0
  697. package/dist/vue/charts.d.ts +18 -0
  698. package/dist/vue/charts.js +56 -0
  699. package/dist/vue/charts.js.map +1 -0
  700. package/dist/vue/components/Chart/Bar3DChart.vue.d.ts +2 -0
  701. package/dist/vue/components/Chart/BoxPlotChart.vue.d.ts +8 -0
  702. package/dist/vue/components/Chart/BoxPlotChart.vue.js.map +1 -1
  703. package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js +8 -2
  704. package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  705. package/dist/vue/components/Chart/ChordChart.vue.d.ts +153 -0
  706. package/dist/vue/components/Chart/ChordChart.vue.js +7 -0
  707. package/dist/vue/components/Chart/ChordChart.vue.js.map +1 -0
  708. package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js +81 -0
  709. package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  710. package/dist/vue/components/Chart/DependencyGraph.vue.d.ts +181 -0
  711. package/dist/vue/components/Chart/DependencyGraph.vue.js +7 -0
  712. package/dist/vue/components/Chart/DependencyGraph.vue.js.map +1 -0
  713. package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js +65 -0
  714. package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js.map +1 -0
  715. package/dist/vue/components/Chart/GanttChart.vue.d.ts +19 -0
  716. package/dist/vue/components/Chart/GanttChart.vue.js.map +1 -1
  717. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js +12 -1
  718. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  719. package/dist/vue/components/Chart/GraphChart.vue.d.ts +186 -0
  720. package/dist/vue/components/Chart/GraphChart.vue.js +7 -0
  721. package/dist/vue/components/Chart/GraphChart.vue.js.map +1 -0
  722. package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js +62 -0
  723. package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  724. package/dist/vue/components/Chart/HeatmapChart.vue.d.ts +9 -5
  725. package/dist/vue/components/Chart/HeatmapChart.vue.js.map +1 -1
  726. package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js +3 -1
  727. package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  728. package/dist/vue/components/Chart/Line3DChart.vue.d.ts +2 -0
  729. package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +2 -0
  730. package/dist/vue/components/Chart/Scatter3DChart.vue.d.ts +2 -0
  731. package/dist/vue/components/Chart/Surface3DChart.vue.d.ts +2 -0
  732. package/dist/vue/components/Chart/TimeAndSales.vue.d.ts +2 -0
  733. package/dist/vue/components/Chart/TradingChart.vue.d.ts +58 -1
  734. package/dist/vue/components/Chart/TradingChart.vue.js.map +1 -1
  735. package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js +31 -0
  736. package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  737. package/dist/vue/components/Chart/TreeChart.vue.d.ts +174 -0
  738. package/dist/vue/components/Chart/TreeChart.vue.js +7 -0
  739. package/dist/vue/components/Chart/TreeChart.vue.js.map +1 -0
  740. package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js +56 -0
  741. package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  742. package/dist/vue/components/Chart/WaterfallChart.vue.d.ts +12 -1
  743. package/dist/vue/components/Chart/WaterfallChart.vue.js.map +1 -1
  744. package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js +8 -2
  745. package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  746. package/dist/vue/components/Chart/graph.d.ts +156 -0
  747. package/dist/vue/components/Chart/graph.js +137 -0
  748. package/dist/vue/components/Chart/graph.js.map +1 -0
  749. package/dist/vue/components/Chart/index.d.ts +5 -1
  750. package/dist/vue/components/Chart/index.js +5 -1
  751. package/dist/vue/components/Chart/orderbook.d.ts +5 -1
  752. package/dist/vue/components/Chart/orderbook.js +2 -0
  753. package/dist/vue/components/Chart/orderbook.js.map +1 -1
  754. package/dist/vue/components/Chart/three-d.d.ts +3 -0
  755. package/dist/vue/components/Chart/three-d.js +2 -0
  756. package/dist/vue/components/Chart/three-d.js.map +1 -1
  757. package/dist/vue/components/Chart/trading.d.ts +30 -3
  758. package/dist/vue/components/Chart/trading.js +9 -0
  759. package/dist/vue/components/Chart/trading.js.map +1 -1
  760. package/dist/vue/components/Chart/types.d.ts +74 -2
  761. package/dist/vue/global.d.ts +2 -38
  762. package/dist/vue/groups/charts.js +10 -2
  763. package/dist/vue/groups/charts.js.map +1 -1
  764. package/dist/vue/index.js +6 -2
  765. package/dist/vue/internal/register.d.ts +7 -0
  766. package/dist/vue/internal/register.js +14 -0
  767. package/dist/vue/internal/register.js.map +1 -0
  768. package/dist/vue/plugin.d.ts +9 -4
  769. package/dist/vue/plugin.js +6 -11
  770. package/dist/vue/plugin.js.map +1 -1
  771. package/dist/weapp/area-chart/index.wxml +1 -1
  772. package/dist/weapp/bar-chart/index.wxml +1 -1
  773. package/dist/weapp/box-plot-chart/index.wxml +1 -1
  774. package/dist/weapp/bubble-chart/index.wxml +1 -1
  775. package/dist/weapp/candlestick-chart/index.wxml +1 -1
  776. package/dist/weapp/chart/index.wxml +1 -1
  777. package/dist/weapp/charts/canvas.js +1987 -175
  778. package/dist/weapp/charts/core.js +3 -0
  779. package/dist/weapp/chord-chart/index.js +1 -0
  780. package/dist/weapp/chord-chart/index.json +1 -0
  781. package/dist/weapp/chord-chart/index.wxml +1 -0
  782. package/dist/weapp/chord-chart/index.wxss +1 -0
  783. package/dist/weapp/controls.js +148 -57
  784. package/dist/weapp/gantt-chart/index.wxml +1 -1
  785. package/dist/weapp/heatmap-chart/index.wxml +1 -1
  786. package/dist/weapp/histogram-chart/index.wxml +1 -1
  787. package/dist/weapp/horizontal-bar-chart/index.wxml +1 -1
  788. package/dist/weapp/line-chart/index.wxml +1 -1
  789. package/dist/weapp/mixed-chart/index.wxml +1 -1
  790. package/dist/weapp/quadrant-chart/index.wxml +1 -1
  791. package/dist/weapp/range-area-chart/index.wxml +1 -1
  792. package/dist/weapp/scatter-chart/index.wxml +1 -1
  793. package/dist/weapp/sparkline/index.wxml +1 -1
  794. package/dist/weapp/types.d.ts +96 -4
  795. package/dist/weapp/waterfall-chart/index.wxml +1 -1
  796. package/dist/web-components/components/chart/charts.d.ts +4 -2
  797. package/dist/web-components/components/chart/charts.js +8 -1
  798. package/dist/web-components/components/chart/charts.js.map +1 -1
  799. package/dist/web-components/components/chart/extended.d.ts +21 -7
  800. package/dist/web-components/components/chart/extended.js +29 -9
  801. package/dist/web-components/components/chart/extended.js.map +1 -1
  802. package/dist/web-components/components/chart/shapes-extended.d.ts +37 -1
  803. package/dist/web-components/components/chart/shapes-extended.js +27 -1
  804. package/dist/web-components/components/chart/shapes-extended.js.map +1 -1
  805. package/dist/web-components/components/chart-3d/chart-3d.d.ts +1 -1
  806. package/dist/web-components/components/chart-3d/chart-3d.js.map +1 -1
  807. package/dist/web-components/components/graph/graph.d.ts +156 -0
  808. package/dist/web-components/components/graph/graph.js +150 -0
  809. package/dist/web-components/components/graph/graph.js.map +1 -0
  810. package/dist/web-components/components/trading-chart/trading-chart.d.ts +49 -2
  811. package/dist/web-components/components/trading-chart/trading-chart.js +62 -0
  812. package/dist/web-components/components/trading-chart/trading-chart.js.map +1 -1
  813. package/dist/web-components/elements/chart.d.ts +1 -1
  814. package/dist/web-components/elements/chart.js +6 -5
  815. package/dist/web-components/elements/chart.js.map +1 -1
  816. package/dist/web-components/elements/graph.d.ts +2 -0
  817. package/dist/web-components/elements/graph.js +12 -0
  818. package/dist/web-components/elements/graph.js.map +1 -0
  819. package/dist/web-components/html-custom-data.json +318 -4
  820. package/dist/web-components/types/react.d.ts +63 -4
  821. package/dist/web-components/types/solid.d.ts +55 -8
  822. package/dist/web-components/types/svelte.d.ts +55 -8
  823. package/dist/web-components/types/vue.d.ts +55 -4
  824. package/package.json +16 -1
@@ -1 +1 @@
1
- {"version":3,"file":"chart.cjs","names":["parseColor","luminance","styleElement","createStore","createPyramid","DAY","readTheme","resolveLocale","localeLabels","TRADING_LABELS","toCss","priceFormatter","parseTimeframe","indexOfTime","lowerBoundTime","detectPrecision","inferTimeframe","buildStudies","LINE_COLORS","inputLength","barAt","storeUpdate","createScale","pyramidLevel","toScaled","shiftTime","boundaryWeight","pickTicks","tickText","formatPercent","stepDecimals","fromScaled","formatVolume","formatFixed","packColor","candleMetrics","yOf","LineBuffer","BarBuffer","pixelRange","yOfScaled","AreaBuffer","clampRange","mix","valueAt","HOUR","MINUTE","fill","formatCountdown","scaledAt","formatCrosshairTime","scaleTicks","readBar","hitDrawing","anchorCount","themeColorsChanged","watchTheme","createRenderer","createDataCanvas","storeAppend","storePrepend","require_dom","require_color","require_locale","require_scale","require_detect","require_theme","require_drawings","require_format","require_geometry","require_indicators","require_labels","require_scale$1","require_store","require_studies","TIME_AXIS","MIN_AXIS","MAX_SPACING","MIN_PANE","PRICE","UP","DOWN","WARNING","PRIMARY","PRICE_LINE_TITLES","clamp","v","lo","hi","textOn","color","fill","finite","createTradingChart","doc","container","win","options","initial","destroyed","make","tag","style","root","layer","background","foreground","legends","jump","live","store","pyramid","ha","haValid","haPyramid","studies","studyValid","visibility","compares","dataVersion","tailVersion","detectedPrecision","inferredTimeframe","spacing","right","plotW","plotH","axisW","width","height","panes","scales","paneHeights","vis","volumeOverlayMax","theme","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","texts","resolveTexts","labels","n","redUp","upCss","downCss","css","fallback","value","alpha","precision","priceFormat","priceFormatKey","formatPrice","key","timeframe","tfMs","font","weight","size","isVisible","study","xOf","index","indexAt","x","timeAt","count","i","indexOfTimeExt","last","time","display","markDirty","from","c","level","l","p","syncDerived","valid","next","j","afterDataChange","invalidate","rebuildStudies","reused","id","s","rebuildCompares","data","series","a","b","d","followsRealtime","replaceBars","bars","scale","applyBarsOption","length","first","follow","before","at","added","layoutPanes","paneStudies","available","wanted","total","max","k","heights","h","priceHeight","scaleOf","mode","price","top","paneAt","y","clampView","minSpacing","computeVisible","left","src","cols","i0","i1","r0","r1","groupCenter","g","groupValue","values","groupBars","firstVisibleIndex","compareBase","compareScaled","base","baselinePrice","autoscale","pane","closeOnly","vol","out","timeTicks","tf","intraday","offset","gEnd","groupTime","candidates","prev","sample","gap","ctx","t","paneTickText","scaled","studyValueText","createLayers","result","up","down","upP","downP","bg","metrics","dpr","X","histogramHalf","volumeColors","bottom","Y","lineLayer","buffer","isLive","ga","gb","toY","lineWidth","st","lineColor","area","yb","upArea","downArea","upLine","downLine","px","py","point","hollow","ohlc","wick","body","wicks","bodies","caps","ticks","tick","o","cx","wt","wb","range","side","bt","bb","segments","edges","box","items","y0","strong","faded","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","best","yy","drawingMapper","formatSpan","abs","ms","parts","days","hours","minutes","paintForeground","muted","bgCss","upC","downC","hiG","loG","below","leftSide","label","stack","many","marker","sell","anchor","dir","tip","mapper","context","drawing","lastClose","lineStyle","titleKey","title","pnl","pnlFill","widths","part","grip","lastLine","lastColor","covered","start","end","date","cross","labelBg","textValue","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","bands","updateJump","emitView","show","visibleRange","local","rect","zoomAt","factor","anchorAt","setTool","notify","select","commitDrawings","finishDraft","done","hitLine","hitDrawingAt","hit","separatorAt","updateCursor","cursor","nextHover","onPointerDown","sep","above","onPointerMove","distance","mid","dx","lastIndex","dy","nextBelow","step","di","ds","points","onPointerUp","onPointerLeave","onWheel","unit","modifier","onDoubleClick","instance","announce","page","move","current","target","keyboard","resizeObserver","refreshTheme","unwatchTheme","langObserver","applyStatic","initRenderer","token","exclude","symbol","wantTimer","applyOptions","previous","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.cjs","names":["parseColor","luminance","styleElement","createStore","createPyramid","DAY","readTheme","resolveLocale","localeLabels","TRADING_LABELS","redUpLocale","toCss","priceFormatter","parseTimeframe","indexOfTime","zoneOffset","MINUTE","rangeLevel","createRangePyramid","lowerBoundTime","detectPrecision","inferTimeframe","buildStudies","LINE_COLORS","inputLength","barAt","storeUpdate","createScale","pyramidLevel","toScaled","drawingPrices","boundaryWeight","pickTicks","tickText","formatPercent","stepDecimals","fromScaled","formatVolume","formatFixed","packColor","candleMetrics","yOf","LineBuffer","TrendBuffer","BarBuffer","pixelRange","yOfScaled","AreaBuffer","clampRange","mix","volumeProfile","valueAt","HOUR","fill","paintDrawing","formatCountdown","formatCrosshairTime","scaledAt","scaleTicks","readBar","hitDrawing","isFillable","handlePoints","isPosition","anchorCount","moveHandle","themeColorsChanged","watchTheme","createRenderer","createDataCanvas","isTimeZone","followDefaultRenderer","storeAppend","storePrepend","require_dom","require_color","require_locale","require_scale","require_detect","require_follow","require_theme","require_drawings","require_format","require_geometry","require_indicators","require_labels","require_scale$1","require_store","require_studies","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","fill","finite","ORDER_KEYS","ELLIPSIS","PAIR","createTradingChart","doc","container","win","options","initial","destroyed","make","tag","style","root","layer","background","foreground","legends","jump","live","toolbar","editor","sheet","store","pyramid","ha","haValid","haPyramid","studies","studyValid","visibility","compares","outputLods","trendLods","dataVersion","tailVersion","detectedPrecision","inferredTimeframe","spacing","right","plotW","plotH","axisW","width","height","panes","scales","paneHeights","vis","volumeOverlayMax","theme","themeVersion","optionsVersion","renderer","rendererToken","frameId","layers","geomKey","builtTail","itemVersion","resolveReady","ready","resolve","pointer","keyboardIndex","keyOrder","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","texts","resolveTexts","labels","n","redUp","upCss","downCss","css","fallback","value","alpha","precision","priceFormat","priceFormatKey","formatPrice","key","timeframe","tfMs","font","weight","size","isVisible","study","xOf","index","indexAt","x","timeAt","count","i","timeAtFrac","edge","t","indexAtTimeFrac","time","span","zone","offsetMinutes","studyOffset","shift","colorOf","groupRanges","lod","values","trendLodOf","lodOf","out","indexOfTimeExt","last","display","markDirty","from","trendLod","c","level","l","p","syncDerived","valid","next","j","afterDataChange","invalidate","rebuildStudies","reused","id","s","rebuildCompares","data","series","a","b","d","followsRealtime","replaceBars","bars","scale","applyBarsOption","length","first","follow","before","at","added","layoutPanes","paneStudies","available","wanted","total","max","k","heights","h","priceHeight","scaleOf","mode","price","top","paneAt","y","clampView","minSpacing","computeVisible","left","src","cols","i0","i1","r0","r1","groupCenter","g","groupBars","firstVisibleIndex","compareBase","compareScaled","base","baselinePrice","outputExtent","r","offset","shiftBars","range","drawingsExtent","dragged","drawing","paneId","autoscale","pane","closeOnly","vol","extent","scaled","band","timeTicks","tf","intraday","gEnd","groupTime","candidates","prev","sample","gap","ctx","paneTickText","studyValueText","createLayers","result","up","down","upP","downP","bg","metrics","dpr","X","histogramHalf","volumeColors","bottom","Y","lineLayer","buffer","isLive","ga","gb","toY","lineWidth","rangeLayer","dx","extra","to","prevY","yLo","yHi","second","trendLayer","trend","line","halo","items","upColor","downColor","st","lineColor","area","yb","upArea","downArea","upLine","downLine","px","py","point","hollow","ohlc","wick","body","wicks","bodies","caps","ticks","tick","o","cx","wt","wb","side","bt","bb","segments","edges","box","upOut","downOut","y0","strong","faded","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","largest","fromRight","y1","upLength","downLength","dir","start","paintBackground","grid","showGrid","ys","axisLabel","textColor","text","priceAxisText","kind","linePrice","crosshairState","bar","best","yy","paneOf","drawingMapper","formatSpan","abs","ms","parts","days","hours","minutes","paneValueText","roundPrice","step","pill","align","fillColor","canvasButton","paintDrawings","all","position","mapper","own","colors","paintForeground","muted","bgCss","upC","downC","hiG","loG","label","labelLeft","row","priceLegend","roomRight","roomLeft","leftSide","tx","stack","many","marker","sell","anchor","tip","lastClose","lineStyle","titleKey","title","pnl","pnlFill","widths","part","grip","partFill","lastLine","lastUp","lastColor","compareLabels","covered","end","date","badgeY","cross","labelBg","textValue","bx","by","orderPrice","hover","legendKey","legendRows","legendBoxes","legendBox","legendRow","button","updateLegends","outputs","buildLegends","priceBox","head","slots","titleOf","setSpan","maxWidth","maxHeight","measured","moved","prevClose","change","html","name","escapeHtml","pct","shown","source","prefix","ch","frame","animate","active","now","eased","dt","measureAxis","widest","animating","fg","pass","applyRange","bands","updateJump","updateToolbar","positionEditor","emitView","buttonAt","updateCursor","show","visibleRange","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","separatorAt","autosizeEditor","created","commit","icon","dash","path","toolbarButton","pressed","content","onClick","separator","buildToolbar","swatch","remove","palette","dragging","pts","x0","x1","replayState","emitReplay","columnsOf","showBars","hasVolume","stopReplayTimer","beginReplay","replayStepBy","playReplay","speed","interval","perTick","endReplay","wasPicking","restore","cursor","nextHover","onPointerDown","endKeyOrder","sep","anchors","onPointerMove","distance","mid","lastIndex","dy","nextBelow","points","di","ds","onPointerUp","onPointerLeave","onWheel","unit","modifier","onDoubleClick","instance","announce","say","keyLines","lineTitle","onOrderKey","orderText","lines","current","pickedId","picked","page","move","keyboard","resizeObserver","refreshTheme","unwatchTheme","langObserver","applyStatic","compose","origin","view","element","computed","fullscreen","onFullscreen","initRenderer","token","exclude","symbol","wantTimer","applyOptions","nextZone","timeChanged","unfollowDefault","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 { followDefaultRenderer } from \"../renderers/follow\";\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 drawingPrices,\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 redUpLocale,\n tickText,\n zoneOffset,\n type UtcOffset,\n} from \"./format\";\nimport {\n AreaBuffer,\n BarBuffer,\n LineBuffer,\n TrendBuffer,\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) */\n/** Keys of the keyboard order entry (`aria-keyshortcuts`) */\nconst ORDER_KEYS =\n \"B S O Shift+O ArrowUp ArrowDown Shift+ArrowUp Shift+ArrowDown Enter Escape Delete\";\n\n/** Legend items cut with an ellipsis when wider than the legend */\nconst ELLIPSIS: Partial<CSSStyleDeclaration> = {\n minWidth: \"0\",\n maxWidth: \"100%\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n};\n/** A name and its value in the OHLC legend, never split by the wrapping */\nconst PAIR =\n \"display:inline-flex;gap:3px;max-width:100%;overflow:hidden;text-overflow:ellipsis\";\n\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 /** Min / max pyramids of the trend lines (SuperTrend) */\n const trendLods = new WeakMap<Study, 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 /**\n * Keyboard order entry: an order armed with B / S, or a price line picked\n * with O (its preview price lives in `lineOverrides`, like a drag)\n */\n let keyOrder:\n | { kind: \"create\"; side: \"buy\" | \"sell\"; price: number }\n | { kind: \"move\"; id: string; start: number; override?: number }\n | 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 = () =>\n options.colorConvention === \"redUp\" ||\n (options.colorConvention === \"auto\" && redUpLocale(locale));\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 trendLodOf = (study: Study) => {\n let lod = trendLods.get(study);\n if (!lod) trendLods.set(study, (lod = createRangePyramid()));\n return lod;\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 const trendLod = trendLods.get(study);\n if (trendLod) invalidateRangePyramid(trendLod, from);\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 /**\n * Extends `[lo, hi]` with the visible drawings of a pane\n * (`autoscaleIncludesDrawings`); a drawing being dragged counts where it\n * started, so the scale does not move under the pointer\n */\n const drawingsExtent = (paneId: string, range: [number, number]) => {\n if (!options.autoscaleIncludesDrawings || !drawings.length) return;\n const from = right - plotW / spacing;\n const dragged = gesture?.kind === \"drawing\" ? gesture : null;\n for (const drawing of drawings) {\n if ((drawing.pane ?? PRICE) !== paneId) continue;\n const d =\n dragged && dragged.id === drawing.id ? dragged.original : drawing;\n for (const price of drawingPrices(d, indexOfTimeExt, from, right)) {\n if (price < range[0]) range[0] = price;\n if (price > range[1]) range[1] = price;\n }\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 drawingsExtent(PRICE, range);\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 drawingsExtent(pane.id, range);\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 /**\n * Line colored by its direction once zoomed out: the min / max of each\n * group in the color of its last bar, each run starting at the last\n * point of the previous one so the line stays joined at the flips\n */\n const trendLayer =\n (\n trend: NonNullable<Study[\"trend\"]>,\n lod: RangePyramid,\n upColor: Rgba,\n downColor: Rgba,\n lineWidth: number,\n ): Layer =>\n (ga, gb, isLive) => {\n const r = groupRanges(v, trend.value, lod);\n const count = n();\n const line = new TrendBuffer(top, bottom);\n let prevY = NaN;\n for (let g = isLive ? Math.max(0, ga - 1) : ga; g <= gb; g++) {\n const lo = r.min[g];\n const hi = r.max[g];\n if (!finite(lo) || !finite(hi)) {\n line.break();\n prevY = NaN;\n continue;\n }\n const up =\n trend.direction[Math.min(count - 1, g * v.size + v.size - 1)] !==\n -1;\n const x = X(g);\n const yLo = Y(lo);\n const yHi = Y(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 line.push(x, first, up);\n if (second !== first) line.push(x, second, up);\n prevY = second;\n }\n // a halo of the background under the line: zoomed out, it runs\n // through the bars, drawn in the same colors\n const halo: Rgba = [bg[0], bg[1], bg[2], 0.9];\n const items: RenderItem[] = [];\n for (const [buffer, key] of [\n [line.up, \"u\"],\n [line.down, \"d\"],\n ] as const) {\n if (buffer.count > 1)\n items.push(buffer.item(`${key}h`, 0, halo, lineWidth + 2.5));\n }\n if (line.up.count > 1)\n items.push(line.up.item(\"u\", 0, upColor, lineWidth));\n if (line.down.count > 1)\n items.push(line.down.item(\"d\", 0, downColor, lineWidth));\n return items;\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 const trend = study.trend;\n const [upOut, downOut] = study.outputs;\n if (trend && v.level && upOut && downOut) {\n result.push(\n trendLayer(\n trend,\n trendLodOf(study),\n resolve(colorOf(upOut.color)),\n resolve(colorOf(downOut.color)),\n upOut.width,\n ),\n );\n continue;\n }\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 (keyOrder?.kind === \"move\" && keyOrder.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 if (keyOrder?.kind === \"move\" && keyOrder.id === line.id) {\n // picked with the keyboard: a focus ring around the label\n roundRect(ctx, x - 3.5, top - 3.5, total + 7, 25, 5);\n ctx.strokeStyle = css(PRIMARY);\n ctx.lineWidth = 2;\n ctx.setLineDash([]);\n ctx.stroke();\n }\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 // keyboard order entry: the armed order and the keys to use\n if (keyOrder && count) {\n if (keyOrder.kind === \"create\") {\n const color = keyOrder.side === \"buy\" ? upC : downC;\n const y = Math.round(yOf(price.scale, keyOrder.price)) + 0.5;\n if (finite(y) && y >= price.top && y <= price.top + price.height) {\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = 1.5;\n ctx.setLineDash([6, 4]);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n pill(\n ctx,\n fill(keyOrder.side === \"buy\" ? l.buyLimit : l.sellLimit, {\n price: formatPrice(keyOrder.price),\n }),\n plotW - 56,\n clamp(y - 11, price.top + 2, price.top + price.height - 24),\n color,\n \"right\",\n );\n axisLabel(\n ctx,\n y,\n priceAxisText(keyOrder.price),\n color,\n textOn(color),\n );\n }\n }\n // the keys to use, on the left: order labels sit on the right\n if (!replay && !replayPicking)\n pill(ctx, l.orderHint, 8, badgeY, toCss(theme.text, 0.86), \"left\");\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 // narrow charts: rows wrap, long items are cut with an ellipsis and\n // the rows that do not fit in the pane are hidden\n box = make(\"div\", {\n position: \"absolute\",\n left: \"4px\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n gap: \"1px\",\n maxWidth: \"calc(100% - 12px)\",\n overflow: \"hidden\",\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 maxWidth: \"100%\",\n minWidth: \"0\",\n boxSizing: \"border-box\",\n padding: \"0 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 ...ELLIPSIS,\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\", ...ELLIPSIS });\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\", ELLIPSIS);\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 nor the next pane\n const maxWidth = `${Math.max(60, Math.floor(plotW - 10))}px`;\n if (box.style.maxWidth !== maxWidth) box.style.maxWidth = maxWidth;\n const maxHeight = `${Math.max(18, Math.floor(pane.height - 10))}px`;\n if (box.style.maxHeight !== maxHeight) box.style.maxHeight = maxHeight;\n }\n const priceBox = legendBoxes.get(PRICE);\n const measured = 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 // the labels avoiding the legend were painted with the previous layout\n // (a resize wraps the rows differently): paint them again\n const moved =\n measured.length !== priceLegend.length ||\n measured.some((row, i) => {\n const before = priceLegend[i];\n return (\n !before ||\n before.right !== row.right ||\n before.top !== row.top ||\n before.bottom !== row.bottom\n );\n });\n priceLegend = measured;\n if (moved) invalidate();\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=\"${PAIR}\"><span style=\"color:var(--text-secondary-color,#6b7280)\">${escapeHtml(String(name))}</span><span style=\"color:${color}\">${escapeHtml(formatPrice(value as number))}</span></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 = `<span style=\"${PAIR}\">${changeName}<span style=\"color:${change >= 0 ? upC : downC}\">${change >= 0 ? \"+\" : \"−\"}${escapeHtml(formatPrice(Math.abs(change)))} (${escapeHtml(formatPercent(pct, locale))})</span></span>`;\n const vol = store.hasVolume\n ? `<span style=\"${PAIR}\"><span style=\"color:var(--text-secondary-color,#6b7280)\">${escapeHtml(l.volume)}</span>${escapeHtml(formatVolume(store.volume[index], locale))}</span>`\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.columnGap = \"6px\";\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 if (keyOrder) endKeyOrder(true);\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 say = (text: string) => {\n live.textContent = text;\n };\n\n /** Price lines the keyboard can pick: draggable or cancellable ones */\n const keyLines = () =>\n (options.priceLines ?? []).filter(\n (line) => line.draggable || line.cancellable,\n );\n\n const lineTitle = (line: TradingPriceLine) => {\n const key = PRICE_LINE_TITLES[line.kind ?? \"line\"];\n return line.title ?? (key ? labels()[key] : \"\");\n };\n\n /** Leaves the keyboard order entry; `restore` puts a picked line back */\n const endKeyOrder = (restore: boolean) => {\n if (keyOrder?.kind === \"move\" && restore) {\n if (keyOrder.override === undefined) lineOverrides.delete(keyOrder.id);\n else lineOverrides.set(keyOrder.id, keyOrder.override);\n }\n keyOrder = null;\n };\n\n /** Order entry keys (`orderEntry`); returns whether the key was used */\n const onOrderKey = (event: KeyboardEvent): boolean => {\n const count = n();\n if (\n !options.orderEntry ||\n !count ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey\n )\n return false;\n const l = labels();\n const key = event.key.length === 1 ? event.key.toLowerCase() : event.key;\n const orderText = (side: \"buy\" | \"sell\", value: number) =>\n fill(side === \"buy\" ? l.buyLimit : l.sellLimit, {\n price: formatPrice(value),\n });\n if (key === \"b\" || key === \"s\") {\n endKeyOrder(true);\n const cross = crosshairState();\n const at =\n cross && cross.pane.id === PRICE && finite(cross.price)\n ? cross.price\n : store.close[count - 1];\n const side = key === \"b\" ? \"buy\" : \"sell\";\n keyOrder = { kind: \"create\", side, price: roundPrice(at) };\n say(`${orderText(side, keyOrder.price)}. ${l.orderHint}`);\n return true;\n }\n if (key === \"o\") {\n const lines = keyLines();\n if (!lines.length) return false;\n const current = keyOrder?.kind === \"move\" ? keyOrder.id : null;\n endKeyOrder(true);\n const at = lines.findIndex((line) => line.id === current);\n const step = event.shiftKey ? -1 : 1;\n const next =\n at < 0\n ? step > 0\n ? 0\n : lines.length - 1\n : (at + step + lines.length) % lines.length;\n const line = lines[next];\n if (!line) return false;\n keyOrder = {\n kind: \"move\",\n id: line.id,\n start: linePrice(line),\n override: lineOverrides.get(line.id),\n };\n const name = fill(l.orderLine, {\n title: lineTitle(line),\n price: formatPrice(linePrice(line)),\n });\n say(\n [\n name,\n line.draggable ? l.orderHint : \"\",\n line.cancellable ? l.orderCancelHint : \"\",\n ]\n .filter(Boolean)\n .join(\". \"),\n );\n return true;\n }\n if (!keyOrder) return false;\n const pickedId = keyOrder.kind === \"move\" ? keyOrder.id : null;\n const picked = (options.priceLines ?? []).find(\n (line) => line.id === pickedId,\n );\n switch (event.key) {\n case \"ArrowUp\":\n case \"ArrowDown\": {\n const tick =\n 10 ** -precision() *\n (event.shiftKey ? 10 : 1) *\n (event.key === \"ArrowUp\" ? 1 : -1);\n if (keyOrder.kind === \"create\") {\n keyOrder.price = roundPrice(keyOrder.price + tick);\n say(orderText(keyOrder.side, keyOrder.price));\n } else if (picked?.draggable) {\n const next = roundPrice(linePrice(picked) + tick);\n lineOverrides.set(picked.id, next);\n say(formatPrice(next));\n }\n return true;\n }\n case \"Enter\": {\n if (keyOrder.kind === \"create\") {\n const { price, side } = keyOrder;\n endKeyOrder(false);\n emit(\"orderCreate\", { price, side });\n say(fill(l.orderPlaced, { price: formatPrice(price) }));\n return true;\n }\n const start = keyOrder.start;\n endKeyOrder(false);\n const next = picked ? lineOverrides.get(picked.id) : undefined;\n if (picked && next !== undefined && next !== start) {\n emit(\"orderMove\", {\n id: picked.id,\n price: next,\n previousPrice: start,\n line: picked,\n });\n say(fill(l.orderPlaced, { price: formatPrice(next) }));\n }\n return true;\n }\n case \"Escape\":\n if (keyOrder.kind === \"create\") say(l.orderCancelled);\n else if (picked)\n say(\n fill(l.orderLine, {\n title: lineTitle(picked),\n price: formatPrice(keyOrder.start),\n }),\n );\n endKeyOrder(true);\n return true;\n case \"Delete\":\n case \"Backspace\":\n if (picked?.cancellable) {\n endKeyOrder(true);\n emit(\"orderCancel\", { id: picked.id, line: picked });\n say(l.orderCancelled);\n }\n return true;\n default:\n return false;\n }\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.target === root && onOrderKey(event)) {\n event.preventDefault();\n invalidate();\n return;\n }\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 (keyOrder) {\n endKeyOrder(true);\n invalidate();\n }\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 // the picked line is gone, or its new price is the reference now\n if (keyOrder?.kind === \"move\") {\n const id = keyOrder.id;\n const line = keyLines().find((l) => l.id === id);\n keyOrder = line\n ? { kind: \"move\", id, start: line.price, override: undefined }\n : null;\n }\n }\n if (next.orderEntry) root.setAttribute(\"aria-keyshortcuts\", ORDER_KEYS);\n else {\n root.removeAttribute(\"aria-keyshortcuts\");\n if (keyOrder) endKeyOrder(true);\n }\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 const unfollowDefault = followDefaultRenderer(\n () => options.renderer,\n () => void initRenderer(),\n );\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 unfollowDefault();\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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"}