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":"tape.js","names":["LABELS","COLUMNS","BUY","SELL","MAX_LAG","FLASH_MS","createRing","cap","max","slot","ring","k","pushSlot","i","next","key","old","grown","createTimeAndSales","options","initial","emitter","createEmitter","capacity","raw","rows","open","head","closedTotal","lastPrice","lastTick","fmt","createFormatters","priceDecimals","sizeDecimals","colors","view","target","userScrolled","hoverPaused","paused","lastFrame","hoverAt","keySeq","hoverKey","hovered","dragging","layout","host","createHost","container","sideColors","root","texts","localeLabels","labels","applyTexts","minSize","openVisible","count","refreshFormat","infer","p","decimalsOf","trade","s","writeRow","a","ingest","side","time","size","price","tick","arrival","advance","after","delta","before","n","addTrade","rebuild","rowAt","index","visibleOpen","toEvent","row","setPaused","scrollTo","clamp","rowsFromTop","user","draw","ctx","l","compact","width","fontSize","rh","headerH","top","visible","height","dt","now","animating","ease","dpr","text","toCss","theme","muted","pad","scrollbar","right","cols","all","c","shownCols","weights","totalWeight","colRight","acc","colLeft","j","alignLeft","threshold","first","offset","flash","hoverIndex","r","y","sell","color","large","age","ty","weight","left","x","fontOf","formatClock","tickColor","label","w","trackH","track","pageRows","thumbH","maxScroll","thumbY","active","roundRect","badge","above","textParts","bw","bh","bx","by","inRect","latest","thumbScroll","th","ratio","onPointerMove","localPoint","event","onPointerLeave","onPointerDown","onPointerUp","onClick","onWheel","step","onKeyDown","page","select","instance","onBlur","nowMs","reset","list","trades","previous","nextCapacity","handler"],"sources":["../../../../../charts/src/engine/orderbook/tape.ts"],"sourcesContent":["// createTimeAndSales: the trade tape. Trades are kept in a ring of typed\n// arrays (hundreds of thousands cost a few megabytes, no object per trade);\n// a second ring holds the rows after the size filter and the same\n// millisecond aggregation. Only the visible rows are drawn, once per frame\n// whatever the number of trades received in between.\n\nimport { toCss, type Rgba } from \"../color\";\nimport { decimalsOf } from \"./book\";\nimport {\n clamp,\n createFormatters,\n ease,\n fontOf,\n formatClock,\n roundRect,\n sideColors,\n type Formatters,\n} from \"./format\";\nimport { localeLabels, type LabelDictionary } from \"../locale\";\nimport { createEmitter, createHost, localPoint } from \"./host\";\nimport type {\n MarketTrade,\n TimeAndSalesColumn,\n TimeAndSalesEventMap,\n TimeAndSalesInstance,\n TimeAndSalesLabels,\n TimeAndSalesOptions,\n TimeAndSalesRowEvent,\n} from \"./types\";\n\nconst LABELS: LabelDictionary<TimeAndSalesLabels> = {\n en: {\n time: \"Time\",\n price: \"Price\",\n size: \"Size\",\n side: \"Side\",\n buy: \"Buy\",\n sell: \"Sell\",\n paused: \"Paused\",\n newTrades: \"{count} new\",\n name: \"Time and sales\",\n },\n zh: {\n time: \"时间\",\n price: \"价格\",\n size: \"数量\",\n side: \"方向\",\n buy: \"买入\",\n sell: \"卖出\",\n paused: \"已暂停\",\n newTrades: \"{count} 条新成交\",\n name: \"逐笔成交\",\n },\n ja: {\n time: \"時刻\",\n price: \"価格\",\n size: \"数量\",\n side: \"売買\",\n buy: \"買い\",\n sell: \"売り\",\n paused: \"一時停止中\",\n newTrades: \"新着 {count} 件\",\n name: \"歩み値\",\n },\n fr: {\n time: \"Heure\",\n price: \"Prix\",\n size: \"Quantité\",\n side: \"Sens\",\n buy: \"Achat\",\n sell: \"Vente\",\n paused: \"En pause\",\n newTrades: \"{count} nouvelles\",\n name: \"Historique des transactions\",\n },\n};\n\nconst COLUMNS: readonly TimeAndSalesColumn[] = [\"time\", \"price\", \"size\"];\nconst BUY = 1;\nconst SELL = 2;\n/** Rows the slide-in animation may lag behind the newest one */\nconst MAX_LAG = 3;\nconst FLASH_MS = 450;\n\n/** Growable ring of trades stored column by column */\ninterface Ring {\n time: Float64Array;\n price: Float64Array;\n size: Float64Array;\n side: Uint8Array;\n /** -1 down tick, 0 unchanged, 1 up tick */\n tick: Int8Array;\n /** Trades merged into the row */\n count: Uint32Array;\n /** Local arrival time of the row (flash), `-Infinity` without flash */\n arrival: Float64Array;\n start: number;\n length: number;\n readonly max: number;\n}\n\nconst createRing = (max: number): Ring => {\n const cap = Math.min(max, 1024);\n return {\n time: new Float64Array(cap),\n price: new Float64Array(cap),\n size: new Float64Array(cap),\n side: new Uint8Array(cap),\n tick: new Int8Array(cap),\n count: new Uint32Array(cap),\n arrival: new Float64Array(cap),\n start: 0,\n length: 0,\n max,\n };\n};\n\n/** Physical index of the `k`-th oldest row */\nconst slot = (ring: Ring, k: number) => (ring.start + k) % ring.time.length;\n\n/** Physical index of a new row (grows the arrays, drops the oldest row when full) */\nconst pushSlot = (ring: Ring): number => {\n const cap = ring.time.length;\n if (ring.length < cap) {\n const i = (ring.start + ring.length) % cap;\n ring.length++;\n return i;\n }\n if (cap < ring.max) {\n const next = Math.min(ring.max, cap * 2);\n const keys = [\n \"time\",\n \"price\",\n \"size\",\n \"side\",\n \"tick\",\n \"count\",\n \"arrival\",\n ] as const;\n for (const key of keys) {\n const old = ring[key];\n const grown = new (old.constructor as new (n: number) => typeof old)(\n next,\n );\n // unwrap: oldest row first\n grown.set(old.subarray(ring.start) as never);\n grown.set(old.subarray(0, ring.start) as never, cap - ring.start);\n (ring as unknown as Record<string, unknown>)[key] = grown;\n }\n ring.start = 0;\n ring.length++;\n return cap;\n }\n // full: the oldest row is replaced\n const i = ring.start;\n ring.start = (ring.start + 1) % cap;\n return i;\n};\n\ninterface Aggregate {\n time: number;\n price: number;\n size: number;\n side: number;\n tick: number;\n count: number;\n arrival: number;\n}\n\n/**\n * Creates a time and sales tape in `container`: newest trades on top,\n * virtualized rows, large trade highlight, pause on hover.\n */\nexport const createTimeAndSales = (\n container: HTMLElement,\n initial: TimeAndSalesOptions = {},\n): TimeAndSalesInstance => {\n let options = initial;\n const emitter = createEmitter<TimeAndSalesEventMap>();\n let capacity = Math.max(1, Math.round(options.capacity ?? 200000));\n let raw = createRing(capacity);\n let rows = createRing(capacity);\n /** Aggregate still receiving trades (aggregation only) */\n let open: Aggregate | null = null;\n /** Rows ever shown (closed rows + the open one when visible); only grows */\n let head = 0;\n let closedTotal = 0;\n let lastPrice = NaN;\n let lastTick = 0;\n let fmt: Formatters = createFormatters(options, 2, 4);\n let priceDecimals = 0;\n let sizeDecimals = 0;\n let colors = { up: [0, 0, 0, 1] as Rgba, down: [0, 0, 0, 1] as Rgba };\n\n // scrolling, in rows from the newest one\n let view = 0;\n let target = 0;\n let userScrolled = false;\n let hoverPaused = false;\n let paused = false;\n let lastFrame = NaN;\n let hoverAt: [number, number] | null = null;\n /** Keyboard selection: sequence number of the row (head - 1 - index) */\n let keySeq: number | null = null;\n let hoverKey = \"\";\n let hovered: TimeAndSalesRowEvent | null = null;\n let dragging: { offset: number } | null = null;\n // layout of the last frame\n let layout = {\n top: 0,\n rh: 20,\n visible: 0,\n track: [0, 0, 0, 0],\n badge: [0, 0, 0, 0],\n };\n\n const host = createHost(container, {\n className: \"minerva-time-and-sales\",\n draw,\n onTheme: () => {\n colors = sideColors(host.theme, options);\n },\n });\n const { root } = host;\n root.tabIndex = 0;\n root.setAttribute(\"role\", \"log\");\n root.setAttribute(\"aria-live\", \"off\");\n\n /** Texts in the locale, resolved on every option update */\n let texts = localeLabels(LABELS, options.locale, options.labels);\n const labels = () => texts;\n const applyTexts = () => {\n texts = localeLabels(LABELS, options.locale, options.labels);\n root.setAttribute(\"aria-label\", options.ariaLabel ?? texts.name);\n };\n const minSize = () => Math.max(0, options.minSize ?? 0);\n const openVisible = () => open !== null && open.size >= minSize();\n const count = () => rows.length + (openVisible() ? 1 : 0);\n\n const refreshFormat = () => {\n fmt = createFormatters(options, priceDecimals, sizeDecimals);\n };\n\n const infer = (trade: MarketTrade) => {\n // the first trades decide the decimals (until the precision is set)\n if (raw.length > 64) return;\n const p = Math.min(8, decimalsOf(trade.price));\n const s = Math.min(6, decimalsOf(trade.size));\n if (p > priceDecimals || s > sizeDecimals) {\n priceDecimals = Math.max(priceDecimals, p);\n sizeDecimals = Math.max(sizeDecimals, s);\n refreshFormat();\n }\n };\n\n const writeRow = (a: Aggregate) => {\n const i = pushSlot(rows);\n rows.time[i] = a.time;\n rows.price[i] = a.price;\n rows.size[i] = a.size;\n rows.side[i] = a.side;\n rows.tick[i] = a.tick;\n rows.count[i] = a.count;\n rows.arrival[i] = a.arrival;\n closedTotal++;\n };\n\n /** Adds a trade to the rows (after the raw ring) */\n const ingest = (\n time: number,\n price: number,\n size: number,\n side: number,\n tick: number,\n arrival: number,\n ) => {\n if (options.aggregate) {\n if (open && open.side === side && open.time === time) {\n open.size += size;\n open.price = price;\n open.tick = tick;\n open.count++;\n open.arrival = arrival;\n return;\n }\n if (open && open.size >= minSize()) writeRow(open);\n open = { time, price, size, side, tick, count: 1, arrival };\n return;\n }\n if (size >= minSize())\n writeRow({ time, price, size, side, tick, count: 1, arrival });\n };\n\n /** Moves the view so that the rows on screen stay put (or slide in) */\n const advance = (before: number) => {\n const after = closedTotal + (openVisible() ? 1 : 0);\n const delta = after - before;\n head = after;\n if (delta <= 0) return;\n view += delta;\n if (paused) target += delta;\n else if (options.animate === false) view = target;\n else view = Math.min(view, target + MAX_LAG);\n const n = count();\n target = Math.min(target, Math.max(0, n - 1));\n view = Math.min(view, Math.max(0, n - 1));\n };\n\n const addTrade = (trade: MarketTrade, arrival: number) => {\n const { time, price, size } = trade;\n if (!Number.isFinite(price) || !Number.isFinite(size) || size <= 0) return;\n infer(trade);\n const side = trade.side === \"sell\" ? SELL : BUY;\n if (Number.isFinite(lastPrice) && price !== lastPrice)\n lastTick = price > lastPrice ? 1 : -1;\n lastPrice = price;\n const i = pushSlot(raw);\n raw.time[i] = time;\n raw.price[i] = price;\n raw.size[i] = size;\n raw.side[i] = side;\n raw.tick[i] = lastTick;\n ingest(time, price, size, side, lastTick, arrival);\n };\n\n /** Recomputes the rows from the raw trades (filter / aggregation changed) */\n const rebuild = () => {\n rows = createRing(capacity);\n open = null;\n closedTotal = 0;\n for (let k = 0; k < raw.length; k++) {\n const i = slot(raw, k);\n ingest(\n raw.time[i]!,\n raw.price[i]!,\n raw.size[i]!,\n raw.side[i]!,\n raw.tick[i]!,\n -Infinity,\n );\n }\n head = count();\n view = target = 0;\n userScrolled = false;\n keySeq = null;\n };\n\n /** Row `index` from the top (0 = newest) */\n const rowAt = (index: number): Aggregate | null => {\n if (index < 0) return null;\n const visibleOpen = openVisible();\n if (visibleOpen && index === 0) return open;\n const k = rows.length - 1 - (index - (visibleOpen ? 1 : 0));\n if (k < 0) return null;\n const i = slot(rows, k);\n return {\n time: rows.time[i]!,\n price: rows.price[i]!,\n size: rows.size[i]!,\n side: rows.side[i]!,\n tick: rows.tick[i]!,\n count: rows.count[i]!,\n arrival: rows.arrival[i]!,\n };\n };\n\n const toEvent = (row: Aggregate, index: number): TimeAndSalesRowEvent => ({\n trade: {\n time: row.time,\n price: row.price,\n size: row.size,\n side: row.side === SELL ? \"sell\" : \"buy\",\n },\n count: row.count,\n index,\n });\n\n const setPaused = () => {\n const next = hoverPaused || userScrolled || keySeq !== null;\n if (next === paused) return;\n paused = next;\n if (!paused) {\n // back to the newest rows: scroll at most a page, jump over the rest\n target = 0;\n view = Math.min(view, Math.max(MAX_LAG, layout.visible));\n }\n emitter.emit(\"pause\", paused);\n };\n\n const scrollTo = (rowsFromTop: number, user = true) => {\n const max = Math.max(0, count() - layout.visible);\n target = clamp(Math.round(rowsFromTop), 0, max);\n if (user) userScrolled = target > 0;\n setPaused();\n host.invalidate();\n };\n\n function draw(now: number): boolean {\n const ctx = host.ctx;\n if (!ctx) return false;\n const { width, height, dpr, theme } = host;\n const l = labels();\n const compact = width < 240;\n const fontSize = options.fontSize ?? (compact ? 11 : 12);\n const rh = Math.max(12, options.rowHeight ?? (compact ? 18 : 20));\n const headerH = options.header === false ? 0 : rh + 2;\n const top = headerH;\n const visible = Math.max(0, Math.ceil((height - top) / rh));\n const n = count();\n const dt = Number.isFinite(lastFrame) ? now - lastFrame : 16;\n lastFrame = now;\n\n // scroll animation\n let animating = false;\n if (options.animate === false || !Number.isFinite(view)) view = target;\n else {\n view += (target - view) * ease(dt, 70);\n if (Math.abs(view - target) < 0.01) view = target;\n else animating = true;\n }\n\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, width, height);\n const text = toCss(theme.text);\n const muted = toCss(theme.textMuted);\n const pad = compact ? 6 : 10;\n const scrollbar = n > Math.floor((height - top) / rh);\n const right = width - pad - (scrollbar ? 6 : 0);\n\n // columns\n const cols = (options.columns ?? COLUMNS).filter(\n (c, i, all) => all.indexOf(c) === i,\n );\n const shownCols =\n compact && cols.length > 3 ? cols.filter((c) => c !== \"side\") : cols;\n const weights: Record<TimeAndSalesColumn, number> = {\n time: options.milliseconds === false ? 1 : 1.25,\n price: 1.1,\n size: 1,\n side: 0.6,\n };\n const totalWeight = shownCols.reduce((s, c) => s + weights[c], 0);\n const colRight: number[] = [];\n let acc = pad;\n for (const c of shownCols) {\n acc += ((right - pad) * weights[c]) / totalWeight;\n colRight.push(acc);\n }\n const colLeft = (j: number) => (j === 0 ? pad : colRight[j - 1]!);\n // the time column (and the first one) is left aligned\n const alignLeft = (c: TimeAndSalesColumn, j: number) =>\n j === 0 || c === \"time\";\n\n // rows\n const threshold = options.largeTradeThreshold ?? Infinity;\n const first = Math.max(0, Math.floor(view));\n const offset = view - first;\n const flash = options.animate !== false;\n hovered = null;\n let hoverIndex = -1;\n if (hoverAt && hoverAt[1] >= top) {\n hoverIndex = Math.floor((hoverAt[1] - top) / rh + view);\n } else if (keySeq !== null) {\n hoverIndex = head - 1 - keySeq;\n }\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, top, width, height - top);\n ctx.clip();\n ctx.textBaseline = \"middle\";\n for (let r = 0; r <= visible; r++) {\n const index = first + r;\n if (index >= n) break;\n const row = rowAt(index);\n if (!row) break;\n const y = top + (r - offset) * rh;\n if (y > height) break;\n const sell = row.side === SELL;\n const color = sell ? colors.down : colors.up;\n const large = row.size >= threshold;\n if (index === hoverIndex) {\n hovered = toEvent(row, index);\n ctx.fillStyle = toCss(theme.text, 0.08);\n ctx.fillRect(0, y, width, rh);\n }\n if (large) {\n // stronger tint as the trade grows (log scale, up to 8x the threshold)\n const k = clamp(Math.log2(row.size / threshold) / 3, 0, 1);\n ctx.fillStyle = toCss(color, 0.12 + 0.2 * k);\n ctx.fillRect(0, y + 1, width, rh - 2);\n ctx.fillStyle = toCss(color);\n ctx.fillRect(0, y + 2, 3, rh - 4);\n }\n if (flash && Number.isFinite(row.arrival)) {\n const age = (now - row.arrival) / FLASH_MS;\n if (age < 1 && age >= 0) {\n ctx.fillStyle = toCss(color, 0.18 * (1 - age) * (1 - age));\n ctx.fillRect(0, y, width, rh);\n animating = true;\n }\n }\n const ty = y + rh / 2 + 0.5;\n const weight = large ? 700 : 400;\n shownCols.forEach((c, j) => {\n const left = alignLeft(c, j);\n ctx.textAlign = left ? \"left\" : \"right\";\n const x = left ? colLeft(j) + (j === 0 && large ? 4 : 0) : colRight[j]!;\n switch (c) {\n case \"time\":\n ctx.font = fontOf(theme, options, 400, fontSize);\n ctx.fillStyle = muted;\n ctx.fillText(\n options.formatTime\n ? options.formatTime(row.time)\n : formatClock(row.time, options.milliseconds !== false),\n x,\n ty,\n );\n break;\n case \"price\": {\n const tickColor =\n row.tick > 0 ? colors.up : row.tick < 0 ? colors.down : null;\n ctx.font = fontOf(theme, options, large ? 700 : 500, fontSize);\n ctx.fillStyle =\n options.priceColor === \"tick\"\n ? tickColor\n ? toCss(tickColor)\n : text\n : toCss(color);\n ctx.fillText(fmt.price(row.price), x, ty);\n break;\n }\n case \"size\": {\n ctx.font = fontOf(theme, options, weight, fontSize);\n ctx.fillStyle = large ? toCss(color) : text;\n const label = fmt.size(row.size);\n ctx.fillText(label, x, ty);\n if (row.count > 1 && !compact) {\n // trades merged into the row\n const w = ctx.measureText(label).width;\n ctx.font = fontOf(theme, options, 400, fontSize - 2);\n ctx.fillStyle = muted;\n ctx.fillText(`×${row.count}`, x - w - 5, ty);\n }\n break;\n }\n case \"side\":\n ctx.font = fontOf(theme, options, 500, fontSize);\n ctx.fillStyle = toCss(color);\n ctx.fillText(sell ? l.sell : l.buy, x, ty);\n break;\n }\n });\n }\n ctx.restore();\n\n // header\n if (headerH) {\n ctx.font = fontOf(theme, options, 400, fontSize - 1);\n ctx.fillStyle = muted;\n ctx.textBaseline = \"middle\";\n shownCols.forEach((c, j) => {\n const left = alignLeft(c, j);\n ctx.textAlign = left ? \"left\" : \"right\";\n ctx.fillText(l[c], left ? colLeft(j) : colRight[j]!, rh / 2 + 1);\n });\n ctx.fillStyle = toCss(theme.grid);\n ctx.fillRect(0, headerH - 1, width, 1);\n }\n\n // scrollbar\n const trackH = height - top - 4;\n let track = [0, 0, 0, 0];\n if (scrollbar && trackH > 20) {\n const pageRows = Math.max(1, (height - top) / rh);\n const thumbH = Math.max(18, (trackH * pageRows) / n);\n const maxScroll = Math.max(1, n - pageRows);\n const thumbY =\n top + 2 + (trackH - thumbH) * clamp(view / maxScroll, 0, 1);\n const active =\n dragging !== null || (hoverAt !== null && hoverAt[0] > width - 12);\n ctx.fillStyle = toCss(theme.textMuted, active ? 0.5 : 0.28);\n roundRect(ctx, width - 6, thumbY, 4, thumbH, 2);\n ctx.fill();\n track = [width - 12, top, 12, trackH + 4];\n }\n\n // badge: paused / new trades above the view\n let badge = [0, 0, 0, 0];\n const above = Math.round(target);\n if (paused || above > 0) {\n const textParts: string[] = [];\n if (hoverPaused && !userScrolled) textParts.push(l.paused);\n if (above > 0)\n textParts.push(\n l.newTrades.replace(\n \"{count}\",\n above > 9999 ? \"9999+\" : String(above),\n ),\n );\n if (textParts.length) {\n const label = textParts.join(\" · \");\n ctx.font = fontOf(theme, options, 500, Math.max(10, fontSize - 1));\n const bw = ctx.measureText(label).width + 20;\n const bh = Math.min(22, rh + 2);\n const bx = (width - bw) / 2;\n const by = top + 6;\n ctx.fillStyle = toCss(theme.primary, 0.92);\n roundRect(ctx, bx, by, bw, bh, bh / 2);\n ctx.fill();\n ctx.fillStyle = \"#fff\";\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(label, width / 2, by + bh / 2 + 0.5);\n badge = [bx, by, bw, bh];\n }\n }\n layout = {\n top,\n rh,\n visible: Math.floor((height - top) / rh),\n track,\n badge,\n };\n root.style.cursor =\n badge[2] && hoverAt && inRect(hoverAt, badge) ? \"pointer\" : \"default\";\n\n // hover event\n const key = hovered\n ? `${head - 1 - hovered.index}|${hovered.trade.size}`\n : \"\";\n if (key !== hoverKey) {\n hoverKey = key;\n emitter.emit(\"hover\", hovered);\n }\n\n const latest = rowAt(0);\n if (latest)\n host.describe(\n `${options.ariaLabel ?? l.name}. ${latest.side === SELL ? l.sell : l.buy} ${fmt.size(latest.size)} @ ${fmt.price(latest.price)}.`,\n );\n return animating;\n }\n\n const inRect = (p: readonly number[], r: readonly number[]) =>\n r[2]! > 0 &&\n p[0]! >= r[0]! &&\n p[0]! <= r[0]! + r[2]! &&\n p[1]! >= r[1]! &&\n p[1]! <= r[1]! + r[3]!;\n\n // ---------------------------------------------------------- interaction\n\n const thumbScroll = (y: number) => {\n const [, ty, , th] = layout.track;\n const n = count();\n const ratio = clamp((y - ty!) / Math.max(1, th!), 0, 1);\n scrollTo(ratio * Math.max(0, n - layout.visible));\n };\n\n const onPointerMove = (event: PointerEvent) => {\n hoverAt = localPoint(root, event);\n if (dragging) thumbScroll(hoverAt[1] - dragging.offset);\n if (options.pauseOnHover !== false && !hoverPaused) {\n hoverPaused = true;\n setPaused();\n }\n host.invalidate();\n };\n const onPointerLeave = () => {\n hoverAt = null;\n if (hoverPaused) {\n hoverPaused = false;\n setPaused();\n }\n host.invalidate();\n };\n const onPointerDown = (event: PointerEvent) => {\n const p = localPoint(root, event);\n if (inRect(p, layout.track) && !inRect(p, layout.badge)) {\n dragging = { offset: 0 };\n root.setPointerCapture?.(event.pointerId);\n thumbScroll(p[1]);\n event.preventDefault();\n }\n };\n const onPointerUp = (event: PointerEvent) => {\n if (!dragging) return;\n dragging = null;\n root.releasePointerCapture?.(event.pointerId);\n host.invalidate();\n };\n const onClick = (event: MouseEvent) => {\n const p = localPoint(root, event);\n if (inRect(p, layout.badge)) {\n instance.scrollToLatest();\n return;\n }\n if (inRect(p, layout.track) || p[1] < layout.top) return;\n const index = Math.floor((p[1] - layout.top) / layout.rh + view);\n const row = rowAt(index);\n if (row && index < count()) emitter.emit(\"tradeClick\", toEvent(row, index));\n };\n const onWheel = (event: WheelEvent) => {\n const n = count();\n const max = Math.max(0, n - layout.visible);\n const step =\n event.deltaMode === 1\n ? event.deltaY\n : event.deltaMode === 2\n ? event.deltaY * layout.visible\n : event.deltaY / layout.rh;\n // at the ends the page scrolls\n if ((step < 0 && target <= 0) || (step > 0 && target >= max)) return;\n event.preventDefault();\n scrollTo(target + (Math.abs(step) < 1 ? Math.sign(step) : step));\n };\n const onKeyDown = (event: KeyboardEvent) => {\n const n = count();\n if (!n) return;\n const page = Math.max(1, layout.visible - 1);\n const index = keySeq === null ? -1 : head - 1 - keySeq;\n const select = (next: number) => {\n const i = clamp(next, 0, n - 1);\n keySeq = head - 1 - i;\n // keep the selection on screen\n if (i < target) scrollTo(i);\n else if (i >= target + layout.visible) scrollTo(i - layout.visible + 1);\n else setPaused();\n host.invalidate();\n };\n switch (event.key) {\n case \"ArrowDown\":\n select(index + 1);\n break;\n case \"ArrowUp\":\n select(Math.max(0, index - 1));\n break;\n case \"PageDown\":\n select(Math.max(0, index) + page);\n break;\n case \"PageUp\":\n select(index - page);\n break;\n case \"Home\":\n keySeq = null;\n instance.scrollToLatest();\n break;\n case \"End\":\n select(n - 1);\n break;\n case \"Enter\":\n case \" \": {\n const row = index >= 0 ? rowAt(index) : null;\n if (row) emitter.emit(\"tradeClick\", toEvent(row, index));\n break;\n }\n case \"Escape\":\n keySeq = null;\n instance.scrollToLatest();\n break;\n default:\n return;\n }\n event.preventDefault();\n };\n const onBlur = () => {\n if (keySeq === null) return;\n keySeq = null;\n setPaused();\n host.invalidate();\n };\n root.addEventListener(\"pointermove\", onPointerMove);\n root.addEventListener(\"pointerleave\", onPointerLeave);\n root.addEventListener(\"pointerdown\", onPointerDown);\n root.addEventListener(\"pointerup\", onPointerUp);\n root.addEventListener(\"click\", onClick);\n root.addEventListener(\"wheel\", onWheel, { passive: false });\n root.addEventListener(\"keydown\", onKeyDown);\n root.addEventListener(\"blur\", onBlur);\n\n const nowMs = () =>\n typeof performance !== \"undefined\" ? performance.now() : Date.now();\n\n const reset = () => {\n raw = createRing(capacity);\n rows = createRing(capacity);\n open = null;\n head = closedTotal = 0;\n lastPrice = NaN;\n lastTick = 0;\n priceDecimals = sizeDecimals = 0;\n view = target = 0;\n userScrolled = false;\n keySeq = null;\n setPaused();\n refreshFormat();\n };\n\n const instance: TimeAndSalesInstance = {\n addTrades(trades) {\n const list = Array.isArray(trades)\n ? (trades as readonly MarketTrade[])\n : [trades as MarketTrade];\n if (!list.length) return;\n const before = head;\n const arrival = nowMs();\n for (const trade of list) addTrade(trade, arrival);\n advance(before);\n host.invalidate();\n },\n setTrades(trades) {\n reset();\n for (const trade of trades) addTrade(trade, -Infinity);\n head = count();\n host.invalidate();\n },\n clear() {\n reset();\n host.invalidate();\n },\n setOptions(next) {\n const previous = options;\n options = next;\n applyTexts();\n colors = sideColors(host.theme, options);\n const nextCapacity = Math.max(1, Math.round(options.capacity ?? 200000));\n if (nextCapacity !== capacity) {\n // keep the newest trades that fit\n const old = raw;\n capacity = nextCapacity;\n raw = createRing(capacity);\n for (let k = Math.max(0, old.length - capacity); k < old.length; k++) {\n const i = slot(old, k);\n const j = pushSlot(raw);\n raw.time[j] = old.time[i]!;\n raw.price[j] = old.price[i]!;\n raw.size[j] = old.size[i]!;\n raw.side[j] = old.side[i]!;\n raw.tick[j] = old.tick[i]!;\n }\n rebuild();\n } else if (\n (previous.minSize ?? 0) !== (next.minSize ?? 0) ||\n !previous.aggregate !== !next.aggregate\n ) {\n rebuild();\n }\n if (options.pauseOnHover === false && hoverPaused) hoverPaused = false;\n setPaused();\n refreshFormat();\n host.invalidate();\n },\n scrollToLatest() {\n keySeq = null;\n userScrolled = false;\n target = 0;\n setPaused();\n host.invalidate();\n },\n getCount: count,\n on: (event, handler) => emitter.on(event, handler),\n resize() {\n host.invalidate();\n },\n destroy() {\n root.removeEventListener(\"pointermove\", onPointerMove);\n root.removeEventListener(\"pointerleave\", onPointerLeave);\n root.removeEventListener(\"pointerdown\", onPointerDown);\n root.removeEventListener(\"pointerup\", onPointerUp);\n root.removeEventListener(\"click\", onClick);\n root.removeEventListener(\"wheel\", onWheel);\n root.removeEventListener(\"keydown\", onKeyDown);\n root.removeEventListener(\"blur\", onBlur);\n emitter.clear();\n host.destroy();\n },\n };\n applyTexts();\n colors = sideColors(host.theme, options);\n refreshFormat();\n host.invalidate();\n return instance;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"tape.js","names":["LABELS","COLUMNS","BUY","SELL","MAX_LAG","FLASH_MS","createRing","cap","max","slot","ring","k","pushSlot","i","next","key","old","grown","createTimeAndSales","options","initial","emitter","createEmitter","capacity","raw","rows","open","head","closedTotal","lastPrice","lastTick","fmt","createFormatters","priceDecimals","sizeDecimals","colors","view","target","userScrolled","hoverPaused","paused","lastFrame","hoverAt","keySeq","hoverKey","hovered","dragging","layout","host","createHost","container","sideColors","root","texts","localeLabels","labels","applyTexts","minSize","openVisible","count","refreshFormat","infer","p","decimalsOf","trade","s","writeRow","a","ingest","side","time","size","price","tick","arrival","advance","after","delta","before","n","addTrade","rebuild","rowAt","index","visibleOpen","toEvent","row","setPaused","scrollTo","clamp","rowsFromTop","user","draw","ctx","l","compact","width","fontSize","rh","headerH","top","visible","height","dt","now","animating","ease","dpr","text","toCss","theme","muted","pad","scrollbar","right","cols","all","c","shownCols","weights","totalWeight","colRight","acc","colLeft","j","alignLeft","threshold","first","offset","flash","hoverIndex","r","y","sell","color","large","age","ty","weight","left","x","fontOf","formatClock","tickColor","label","w","trackH","track","pageRows","thumbH","maxScroll","thumbY","active","roundRect","badge","above","textParts","bw","bh","bx","by","inRect","latest","thumbScroll","th","ratio","onPointerMove","localPoint","event","onPointerLeave","onPointerDown","onPointerUp","onClick","onWheel","step","onKeyDown","page","select","instance","onBlur","nowMs","reset","list","trades","previous","nextCapacity","handler"],"sources":["../../../../../charts/src/engine/orderbook/tape.ts"],"sourcesContent":["// createTimeAndSales: the trade tape. Trades are kept in a ring of typed\n// arrays (hundreds of thousands cost a few megabytes, no object per trade);\n// a second ring holds the rows after the size filter and the same\n// millisecond aggregation. Only the visible rows are drawn, once per frame\n// whatever the number of trades received in between.\n\nimport { toCss, type Rgba } from \"../color\";\nimport { decimalsOf } from \"./book\";\nimport {\n clamp,\n createFormatters,\n ease,\n fontOf,\n formatClock,\n roundRect,\n sideColors,\n type Formatters,\n} from \"./format\";\nimport { localeLabels, type LabelDictionary } from \"../locale\";\nimport { createEmitter, createHost, localPoint } from \"./host\";\nimport type {\n MarketTrade,\n TimeAndSalesColumn,\n TimeAndSalesEventMap,\n TimeAndSalesInstance,\n TimeAndSalesLabels,\n TimeAndSalesOptions,\n TimeAndSalesRowEvent,\n} from \"./types\";\n\nconst LABELS: LabelDictionary<TimeAndSalesLabels> = {\n en: {\n time: \"Time\",\n price: \"Price\",\n size: \"Size\",\n side: \"Side\",\n buy: \"Buy\",\n sell: \"Sell\",\n paused: \"Paused\",\n newTrades: \"{count} new\",\n name: \"Time and sales\",\n },\n zh: {\n time: \"时间\",\n price: \"价格\",\n size: \"数量\",\n side: \"方向\",\n buy: \"买入\",\n sell: \"卖出\",\n paused: \"已暂停\",\n newTrades: \"{count} 条新成交\",\n name: \"逐笔成交\",\n },\n ja: {\n time: \"時刻\",\n price: \"価格\",\n size: \"数量\",\n side: \"売買\",\n buy: \"買い\",\n sell: \"売り\",\n paused: \"一時停止中\",\n newTrades: \"新着 {count} 件\",\n name: \"歩み値\",\n },\n fr: {\n time: \"Heure\",\n price: \"Prix\",\n size: \"Quantité\",\n side: \"Sens\",\n buy: \"Achat\",\n sell: \"Vente\",\n paused: \"En pause\",\n newTrades: \"{count} nouvelles\",\n name: \"Historique des transactions\",\n },\n};\n\nconst COLUMNS: readonly TimeAndSalesColumn[] = [\"time\", \"price\", \"size\"];\nconst BUY = 1;\nconst SELL = 2;\n/** Rows the slide-in animation may lag behind the newest one */\nconst MAX_LAG = 3;\nconst FLASH_MS = 450;\n\n/** Growable ring of trades stored column by column */\ninterface Ring {\n time: Float64Array;\n price: Float64Array;\n size: Float64Array;\n side: Uint8Array;\n /** -1 down tick, 0 unchanged, 1 up tick */\n tick: Int8Array;\n /** Trades merged into the row */\n count: Uint32Array;\n /** Local arrival time of the row (flash), `-Infinity` without flash */\n arrival: Float64Array;\n start: number;\n length: number;\n readonly max: number;\n}\n\nconst createRing = (max: number): Ring => {\n const cap = Math.min(max, 1024);\n return {\n time: new Float64Array(cap),\n price: new Float64Array(cap),\n size: new Float64Array(cap),\n side: new Uint8Array(cap),\n tick: new Int8Array(cap),\n count: new Uint32Array(cap),\n arrival: new Float64Array(cap),\n start: 0,\n length: 0,\n max,\n };\n};\n\n/** Physical index of the `k`-th oldest row */\nconst slot = (ring: Ring, k: number) => (ring.start + k) % ring.time.length;\n\n/** Physical index of a new row (grows the arrays, drops the oldest row when full) */\nconst pushSlot = (ring: Ring): number => {\n const cap = ring.time.length;\n if (ring.length < cap) {\n const i = (ring.start + ring.length) % cap;\n ring.length++;\n return i;\n }\n if (cap < ring.max) {\n const next = Math.min(ring.max, cap * 2);\n const keys = [\n \"time\",\n \"price\",\n \"size\",\n \"side\",\n \"tick\",\n \"count\",\n \"arrival\",\n ] as const;\n for (const key of keys) {\n const old = ring[key];\n const grown = new (old.constructor as new (n: number) => typeof old)(\n next,\n );\n // unwrap: oldest row first\n grown.set(old.subarray(ring.start) as never);\n grown.set(old.subarray(0, ring.start) as never, cap - ring.start);\n (ring as unknown as Record<string, unknown>)[key] = grown;\n }\n ring.start = 0;\n ring.length++;\n return cap;\n }\n // full: the oldest row is replaced\n const i = ring.start;\n ring.start = (ring.start + 1) % cap;\n return i;\n};\n\ninterface Aggregate {\n time: number;\n price: number;\n size: number;\n side: number;\n tick: number;\n count: number;\n arrival: number;\n}\n\n/**\n * Creates a time and sales tape in `container`: newest trades on top,\n * virtualized rows, large trade highlight, pause on hover.\n */\nexport const createTimeAndSales = (\n container: HTMLElement,\n initial: TimeAndSalesOptions = {},\n): TimeAndSalesInstance => {\n let options = initial;\n const emitter = createEmitter<TimeAndSalesEventMap>();\n let capacity = Math.max(1, Math.round(options.capacity ?? 200000));\n let raw = createRing(capacity);\n let rows = createRing(capacity);\n /** Aggregate still receiving trades (aggregation only) */\n let open: Aggregate | null = null;\n /** Rows ever shown (closed rows + the open one when visible); only grows */\n let head = 0;\n let closedTotal = 0;\n let lastPrice = NaN;\n let lastTick = 0;\n let fmt: Formatters = createFormatters(options, 2, 4);\n let priceDecimals = 0;\n let sizeDecimals = 0;\n let colors = { up: [0, 0, 0, 1] as Rgba, down: [0, 0, 0, 1] as Rgba };\n\n // scrolling, in rows from the newest one\n let view = 0;\n let target = 0;\n let userScrolled = false;\n let hoverPaused = false;\n let paused = false;\n let lastFrame = NaN;\n let hoverAt: [number, number] | null = null;\n /** Keyboard selection: sequence number of the row (head - 1 - index) */\n let keySeq: number | null = null;\n let hoverKey = \"\";\n let hovered: TimeAndSalesRowEvent | null = null;\n let dragging: { offset: number } | null = null;\n // layout of the last frame\n let layout = {\n top: 0,\n rh: 20,\n visible: 0,\n track: [0, 0, 0, 0],\n badge: [0, 0, 0, 0],\n };\n\n const host = createHost(container, {\n className: \"minerva-time-and-sales\",\n draw,\n onTheme: () => {\n colors = sideColors(host.theme, options);\n },\n });\n const { root } = host;\n root.tabIndex = 0;\n root.setAttribute(\"role\", \"log\");\n root.setAttribute(\"aria-live\", \"off\");\n\n /** Texts in the locale, resolved on every option update */\n let texts = localeLabels(LABELS, options.locale, options.labels);\n const labels = () => texts;\n const applyTexts = () => {\n texts = localeLabels(LABELS, options.locale, options.labels);\n root.setAttribute(\"aria-label\", options.ariaLabel ?? texts.name);\n };\n const minSize = () => Math.max(0, options.minSize ?? 0);\n const openVisible = () => open !== null && open.size >= minSize();\n const count = () => rows.length + (openVisible() ? 1 : 0);\n\n const refreshFormat = () => {\n fmt = createFormatters(options, priceDecimals, sizeDecimals);\n };\n\n const infer = (trade: MarketTrade) => {\n // the first trades decide the decimals (until the precision is set)\n if (raw.length > 64) return;\n const p = Math.min(8, decimalsOf(trade.price));\n const s = Math.min(6, decimalsOf(trade.size));\n if (p > priceDecimals || s > sizeDecimals) {\n priceDecimals = Math.max(priceDecimals, p);\n sizeDecimals = Math.max(sizeDecimals, s);\n refreshFormat();\n }\n };\n\n const writeRow = (a: Aggregate) => {\n const i = pushSlot(rows);\n rows.time[i] = a.time;\n rows.price[i] = a.price;\n rows.size[i] = a.size;\n rows.side[i] = a.side;\n rows.tick[i] = a.tick;\n rows.count[i] = a.count;\n rows.arrival[i] = a.arrival;\n closedTotal++;\n };\n\n /** Adds a trade to the rows (after the raw ring) */\n const ingest = (\n time: number,\n price: number,\n size: number,\n side: number,\n tick: number,\n arrival: number,\n ) => {\n if (options.aggregate) {\n if (open && open.side === side && open.time === time) {\n open.size += size;\n open.price = price;\n open.tick = tick;\n open.count++;\n open.arrival = arrival;\n return;\n }\n if (open && open.size >= minSize()) writeRow(open);\n open = { time, price, size, side, tick, count: 1, arrival };\n return;\n }\n if (size >= minSize())\n writeRow({ time, price, size, side, tick, count: 1, arrival });\n };\n\n /** Moves the view so that the rows on screen stay put (or slide in) */\n const advance = (before: number) => {\n const after = closedTotal + (openVisible() ? 1 : 0);\n const delta = after - before;\n head = after;\n if (delta <= 0) return;\n view += delta;\n if (paused) target += delta;\n else if (options.animate === false) view = target;\n else view = Math.min(view, target + MAX_LAG);\n const n = count();\n target = Math.min(target, Math.max(0, n - 1));\n view = Math.min(view, Math.max(0, n - 1));\n };\n\n const addTrade = (trade: MarketTrade, arrival: number) => {\n const { time, price, size } = trade;\n if (!Number.isFinite(price) || !Number.isFinite(size) || size <= 0) return;\n infer(trade);\n const side = trade.side === \"sell\" ? SELL : BUY;\n if (Number.isFinite(lastPrice) && price !== lastPrice)\n lastTick = price > lastPrice ? 1 : -1;\n lastPrice = price;\n const i = pushSlot(raw);\n raw.time[i] = time;\n raw.price[i] = price;\n raw.size[i] = size;\n raw.side[i] = side;\n raw.tick[i] = lastTick;\n ingest(time, price, size, side, lastTick, arrival);\n };\n\n /** Recomputes the rows from the raw trades (filter / aggregation changed) */\n const rebuild = () => {\n rows = createRing(capacity);\n open = null;\n closedTotal = 0;\n for (let k = 0; k < raw.length; k++) {\n const i = slot(raw, k);\n ingest(\n raw.time[i]!,\n raw.price[i]!,\n raw.size[i]!,\n raw.side[i]!,\n raw.tick[i]!,\n -Infinity,\n );\n }\n head = count();\n view = target = 0;\n userScrolled = false;\n keySeq = null;\n };\n\n /** Row `index` from the top (0 = newest) */\n const rowAt = (index: number): Aggregate | null => {\n if (index < 0) return null;\n const visibleOpen = openVisible();\n if (visibleOpen && index === 0) return open;\n const k = rows.length - 1 - (index - (visibleOpen ? 1 : 0));\n if (k < 0) return null;\n const i = slot(rows, k);\n return {\n time: rows.time[i]!,\n price: rows.price[i]!,\n size: rows.size[i]!,\n side: rows.side[i]!,\n tick: rows.tick[i]!,\n count: rows.count[i]!,\n arrival: rows.arrival[i]!,\n };\n };\n\n const toEvent = (row: Aggregate, index: number): TimeAndSalesRowEvent => ({\n trade: {\n time: row.time,\n price: row.price,\n size: row.size,\n side: row.side === SELL ? \"sell\" : \"buy\",\n },\n count: row.count,\n index,\n });\n\n const setPaused = () => {\n const next = hoverPaused || userScrolled || keySeq !== null;\n if (next === paused) return;\n paused = next;\n if (!paused) {\n // back to the newest rows: scroll at most a page, jump over the rest\n target = 0;\n view = Math.min(view, Math.max(MAX_LAG, layout.visible));\n }\n emitter.emit(\"pause\", paused);\n };\n\n const scrollTo = (rowsFromTop: number, user = true) => {\n const max = Math.max(0, count() - layout.visible);\n target = clamp(Math.round(rowsFromTop), 0, max);\n if (user) userScrolled = target > 0;\n setPaused();\n host.invalidate();\n };\n\n function draw(now: number): boolean {\n const ctx = host.ctx;\n if (!ctx) return false;\n const { width, height, dpr, theme } = host;\n const l = labels();\n const compact = width < 240;\n const fontSize = options.fontSize ?? (compact ? 11 : 12);\n const rh = Math.max(12, options.rowHeight ?? (compact ? 18 : 20));\n const headerH = options.header === false ? 0 : rh + 2;\n const top = headerH;\n const visible = Math.max(0, Math.ceil((height - top) / rh));\n const n = count();\n const dt = Number.isFinite(lastFrame) ? now - lastFrame : 16;\n lastFrame = now;\n\n // scroll animation\n let animating = false;\n if (options.animate === false || !Number.isFinite(view)) view = target;\n else {\n view += (target - view) * ease(dt, 70);\n if (Math.abs(view - target) < 0.01) view = target;\n else animating = true;\n }\n\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, width, height);\n const text = toCss(theme.text);\n const muted = toCss(theme.textMuted);\n const pad = compact ? 6 : 10;\n const scrollbar = n > Math.floor((height - top) / rh);\n const right = width - pad - (scrollbar ? 6 : 0);\n\n // columns\n const cols = (options.columns ?? COLUMNS).filter(\n (c, i, all) => all.indexOf(c) === i,\n );\n const shownCols =\n compact && cols.length > 3 ? cols.filter((c) => c !== \"side\") : cols;\n const weights: Record<TimeAndSalesColumn, number> = {\n time: options.milliseconds === false ? 1 : 1.25,\n price: 1.1,\n size: 1,\n side: 0.6,\n };\n const totalWeight = shownCols.reduce((s, c) => s + weights[c], 0);\n const colRight: number[] = [];\n let acc = pad;\n for (const c of shownCols) {\n acc += ((right - pad) * weights[c]) / totalWeight;\n colRight.push(acc);\n }\n const colLeft = (j: number) => (j === 0 ? pad : colRight[j - 1]!);\n // the time column (and the first one) is left aligned\n const alignLeft = (c: TimeAndSalesColumn, j: number) =>\n j === 0 || c === \"time\";\n\n // rows\n const threshold = options.largeTradeThreshold ?? Infinity;\n const first = Math.max(0, Math.floor(view));\n const offset = view - first;\n const flash = options.animate !== false;\n hovered = null;\n let hoverIndex = -1;\n if (hoverAt && hoverAt[1] >= top) {\n hoverIndex = Math.floor((hoverAt[1] - top) / rh + view);\n } else if (keySeq !== null) {\n hoverIndex = head - 1 - keySeq;\n }\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, top, width, height - top);\n ctx.clip();\n ctx.textBaseline = \"middle\";\n for (let r = 0; r <= visible; r++) {\n const index = first + r;\n if (index >= n) break;\n const row = rowAt(index);\n if (!row) break;\n const y = top + (r - offset) * rh;\n if (y > height) break;\n const sell = row.side === SELL;\n const color = sell ? colors.down : colors.up;\n const large = row.size >= threshold;\n if (index === hoverIndex) {\n hovered = toEvent(row, index);\n ctx.fillStyle = toCss(theme.text, 0.08);\n ctx.fillRect(0, y, width, rh);\n }\n if (large) {\n // stronger tint as the trade grows (log scale, up to 8x the threshold)\n const k = clamp(Math.log2(row.size / threshold) / 3, 0, 1);\n ctx.fillStyle = toCss(color, 0.12 + 0.2 * k);\n ctx.fillRect(0, y + 1, width, rh - 2);\n // a small dot in the left padding marks the large trade (no accent bar)\n ctx.fillStyle = toCss(color);\n ctx.beginPath();\n ctx.arc(\n pad / 2,\n y + rh / 2,\n Math.min(2.5, pad / 2 - 1),\n 0,\n Math.PI * 2,\n );\n ctx.fill();\n }\n if (flash && Number.isFinite(row.arrival)) {\n const age = (now - row.arrival) / FLASH_MS;\n if (age < 1 && age >= 0) {\n ctx.fillStyle = toCss(color, 0.18 * (1 - age) * (1 - age));\n ctx.fillRect(0, y, width, rh);\n animating = true;\n }\n }\n const ty = y + rh / 2 + 0.5;\n const weight = large ? 700 : 400;\n shownCols.forEach((c, j) => {\n const left = alignLeft(c, j);\n ctx.textAlign = left ? \"left\" : \"right\";\n const x = left ? colLeft(j) + (j === 0 && large ? 4 : 0) : colRight[j]!;\n switch (c) {\n case \"time\":\n ctx.font = fontOf(theme, options, 400, fontSize);\n ctx.fillStyle = muted;\n ctx.fillText(\n options.formatTime\n ? options.formatTime(row.time)\n : formatClock(\n row.time,\n options.milliseconds !== false,\n options.timeZone,\n ),\n x,\n ty,\n );\n break;\n case \"price\": {\n const tickColor =\n row.tick > 0 ? colors.up : row.tick < 0 ? colors.down : null;\n ctx.font = fontOf(theme, options, large ? 700 : 500, fontSize);\n ctx.fillStyle =\n options.priceColor === \"tick\"\n ? tickColor\n ? toCss(tickColor)\n : text\n : toCss(color);\n ctx.fillText(fmt.price(row.price), x, ty);\n break;\n }\n case \"size\": {\n ctx.font = fontOf(theme, options, weight, fontSize);\n ctx.fillStyle = large ? toCss(color) : text;\n const label = fmt.size(row.size);\n ctx.fillText(label, x, ty);\n if (row.count > 1 && !compact) {\n // trades merged into the row\n const w = ctx.measureText(label).width;\n ctx.font = fontOf(theme, options, 400, fontSize - 2);\n ctx.fillStyle = muted;\n ctx.fillText(`×${row.count}`, x - w - 5, ty);\n }\n break;\n }\n case \"side\":\n ctx.font = fontOf(theme, options, 500, fontSize);\n ctx.fillStyle = toCss(color);\n ctx.fillText(sell ? l.sell : l.buy, x, ty);\n break;\n }\n });\n }\n ctx.restore();\n\n // header\n if (headerH) {\n ctx.font = fontOf(theme, options, 400, fontSize - 1);\n ctx.fillStyle = muted;\n ctx.textBaseline = \"middle\";\n shownCols.forEach((c, j) => {\n const left = alignLeft(c, j);\n ctx.textAlign = left ? \"left\" : \"right\";\n ctx.fillText(l[c], left ? colLeft(j) : colRight[j]!, rh / 2 + 1);\n });\n ctx.fillStyle = toCss(theme.grid);\n ctx.fillRect(0, headerH - 1, width, 1);\n }\n\n // scrollbar\n const trackH = height - top - 4;\n let track = [0, 0, 0, 0];\n if (scrollbar && trackH > 20) {\n const pageRows = Math.max(1, (height - top) / rh);\n const thumbH = Math.max(18, (trackH * pageRows) / n);\n const maxScroll = Math.max(1, n - pageRows);\n const thumbY =\n top + 2 + (trackH - thumbH) * clamp(view / maxScroll, 0, 1);\n const active =\n dragging !== null || (hoverAt !== null && hoverAt[0] > width - 12);\n ctx.fillStyle = toCss(theme.textMuted, active ? 0.5 : 0.28);\n roundRect(ctx, width - 6, thumbY, 4, thumbH, 2);\n ctx.fill();\n track = [width - 12, top, 12, trackH + 4];\n }\n\n // badge: paused / new trades above the view\n let badge = [0, 0, 0, 0];\n const above = Math.round(target);\n if (paused || above > 0) {\n const textParts: string[] = [];\n if (hoverPaused && !userScrolled) textParts.push(l.paused);\n if (above > 0)\n textParts.push(\n l.newTrades.replace(\n \"{count}\",\n above > 9999 ? \"9999+\" : String(above),\n ),\n );\n if (textParts.length) {\n const label = textParts.join(\" · \");\n ctx.font = fontOf(theme, options, 500, Math.max(10, fontSize - 1));\n const bw = ctx.measureText(label).width + 20;\n const bh = Math.min(22, rh + 2);\n const bx = (width - bw) / 2;\n const by = top + 6;\n ctx.fillStyle = toCss(theme.primary, 0.92);\n roundRect(ctx, bx, by, bw, bh, bh / 2);\n ctx.fill();\n ctx.fillStyle = \"#fff\";\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(label, width / 2, by + bh / 2 + 0.5);\n badge = [bx, by, bw, bh];\n }\n }\n layout = {\n top,\n rh,\n visible: Math.floor((height - top) / rh),\n track,\n badge,\n };\n root.style.cursor =\n badge[2] && hoverAt && inRect(hoverAt, badge) ? \"pointer\" : \"default\";\n\n // hover event\n const key = hovered\n ? `${head - 1 - hovered.index}|${hovered.trade.size}`\n : \"\";\n if (key !== hoverKey) {\n hoverKey = key;\n emitter.emit(\"hover\", hovered);\n }\n\n const latest = rowAt(0);\n if (latest)\n host.describe(\n `${options.ariaLabel ?? l.name}. ${latest.side === SELL ? l.sell : l.buy} ${fmt.size(latest.size)} @ ${fmt.price(latest.price)}.`,\n );\n return animating;\n }\n\n const inRect = (p: readonly number[], r: readonly number[]) =>\n r[2]! > 0 &&\n p[0]! >= r[0]! &&\n p[0]! <= r[0]! + r[2]! &&\n p[1]! >= r[1]! &&\n p[1]! <= r[1]! + r[3]!;\n\n // ---------------------------------------------------------- interaction\n\n const thumbScroll = (y: number) => {\n const [, ty, , th] = layout.track;\n const n = count();\n const ratio = clamp((y - ty!) / Math.max(1, th!), 0, 1);\n scrollTo(ratio * Math.max(0, n - layout.visible));\n };\n\n const onPointerMove = (event: PointerEvent) => {\n hoverAt = localPoint(root, event);\n if (dragging) thumbScroll(hoverAt[1] - dragging.offset);\n if (options.pauseOnHover !== false && !hoverPaused) {\n hoverPaused = true;\n setPaused();\n }\n host.invalidate();\n };\n const onPointerLeave = () => {\n hoverAt = null;\n if (hoverPaused) {\n hoverPaused = false;\n setPaused();\n }\n host.invalidate();\n };\n const onPointerDown = (event: PointerEvent) => {\n const p = localPoint(root, event);\n if (inRect(p, layout.track) && !inRect(p, layout.badge)) {\n dragging = { offset: 0 };\n root.setPointerCapture?.(event.pointerId);\n thumbScroll(p[1]);\n event.preventDefault();\n }\n };\n const onPointerUp = (event: PointerEvent) => {\n if (!dragging) return;\n dragging = null;\n root.releasePointerCapture?.(event.pointerId);\n host.invalidate();\n };\n const onClick = (event: MouseEvent) => {\n const p = localPoint(root, event);\n if (inRect(p, layout.badge)) {\n instance.scrollToLatest();\n return;\n }\n if (inRect(p, layout.track) || p[1] < layout.top) return;\n const index = Math.floor((p[1] - layout.top) / layout.rh + view);\n const row = rowAt(index);\n if (row && index < count()) emitter.emit(\"tradeClick\", toEvent(row, index));\n };\n const onWheel = (event: WheelEvent) => {\n const n = count();\n const max = Math.max(0, n - layout.visible);\n const step =\n event.deltaMode === 1\n ? event.deltaY\n : event.deltaMode === 2\n ? event.deltaY * layout.visible\n : event.deltaY / layout.rh;\n // at the ends the page scrolls\n if ((step < 0 && target <= 0) || (step > 0 && target >= max)) return;\n event.preventDefault();\n scrollTo(target + (Math.abs(step) < 1 ? Math.sign(step) : step));\n };\n const onKeyDown = (event: KeyboardEvent) => {\n const n = count();\n if (!n) return;\n const page = Math.max(1, layout.visible - 1);\n const index = keySeq === null ? -1 : head - 1 - keySeq;\n const select = (next: number) => {\n const i = clamp(next, 0, n - 1);\n keySeq = head - 1 - i;\n // keep the selection on screen\n if (i < target) scrollTo(i);\n else if (i >= target + layout.visible) scrollTo(i - layout.visible + 1);\n else setPaused();\n host.invalidate();\n };\n switch (event.key) {\n case \"ArrowDown\":\n select(index + 1);\n break;\n case \"ArrowUp\":\n select(Math.max(0, index - 1));\n break;\n case \"PageDown\":\n select(Math.max(0, index) + page);\n break;\n case \"PageUp\":\n select(index - page);\n break;\n case \"Home\":\n keySeq = null;\n instance.scrollToLatest();\n break;\n case \"End\":\n select(n - 1);\n break;\n case \"Enter\":\n case \" \": {\n const row = index >= 0 ? rowAt(index) : null;\n if (row) emitter.emit(\"tradeClick\", toEvent(row, index));\n break;\n }\n case \"Escape\":\n keySeq = null;\n instance.scrollToLatest();\n break;\n default:\n return;\n }\n event.preventDefault();\n };\n const onBlur = () => {\n if (keySeq === null) return;\n keySeq = null;\n setPaused();\n host.invalidate();\n };\n root.addEventListener(\"pointermove\", onPointerMove);\n root.addEventListener(\"pointerleave\", onPointerLeave);\n root.addEventListener(\"pointerdown\", onPointerDown);\n root.addEventListener(\"pointerup\", onPointerUp);\n root.addEventListener(\"click\", onClick);\n root.addEventListener(\"wheel\", onWheel, { passive: false });\n root.addEventListener(\"keydown\", onKeyDown);\n root.addEventListener(\"blur\", onBlur);\n\n const nowMs = () =>\n typeof performance !== \"undefined\" ? performance.now() : Date.now();\n\n const reset = () => {\n raw = createRing(capacity);\n rows = createRing(capacity);\n open = null;\n head = closedTotal = 0;\n lastPrice = NaN;\n lastTick = 0;\n priceDecimals = sizeDecimals = 0;\n view = target = 0;\n userScrolled = false;\n keySeq = null;\n setPaused();\n refreshFormat();\n };\n\n const instance: TimeAndSalesInstance = {\n addTrades(trades) {\n const list = Array.isArray(trades)\n ? (trades as readonly MarketTrade[])\n : [trades as MarketTrade];\n if (!list.length) return;\n const before = head;\n const arrival = nowMs();\n for (const trade of list) addTrade(trade, arrival);\n advance(before);\n host.invalidate();\n },\n setTrades(trades) {\n reset();\n for (const trade of trades) addTrade(trade, -Infinity);\n head = count();\n host.invalidate();\n },\n clear() {\n reset();\n host.invalidate();\n },\n setOptions(next) {\n const previous = options;\n options = next;\n applyTexts();\n colors = sideColors(host.theme, options);\n const nextCapacity = Math.max(1, Math.round(options.capacity ?? 200000));\n if (nextCapacity !== capacity) {\n // keep the newest trades that fit\n const old = raw;\n capacity = nextCapacity;\n raw = createRing(capacity);\n for (let k = Math.max(0, old.length - capacity); k < old.length; k++) {\n const i = slot(old, k);\n const j = pushSlot(raw);\n raw.time[j] = old.time[i]!;\n raw.price[j] = old.price[i]!;\n raw.size[j] = old.size[i]!;\n raw.side[j] = old.side[i]!;\n raw.tick[j] = old.tick[i]!;\n }\n rebuild();\n } else if (\n (previous.minSize ?? 0) !== (next.minSize ?? 0) ||\n !previous.aggregate !== !next.aggregate\n ) {\n rebuild();\n }\n if (options.pauseOnHover === false && hoverPaused) hoverPaused = false;\n setPaused();\n refreshFormat();\n host.invalidate();\n },\n scrollToLatest() {\n keySeq = null;\n userScrolled = false;\n target = 0;\n setPaused();\n host.invalidate();\n },\n getCount: count,\n on: (event, handler) => emitter.on(event, handler),\n resize() {\n host.invalidate();\n },\n destroy() {\n root.removeEventListener(\"pointermove\", onPointerMove);\n root.removeEventListener(\"pointerleave\", onPointerLeave);\n root.removeEventListener(\"pointerdown\", onPointerDown);\n root.removeEventListener(\"pointerup\", onPointerUp);\n root.removeEventListener(\"click\", onClick);\n root.removeEventListener(\"wheel\", onWheel);\n root.removeEventListener(\"keydown\", onKeyDown);\n root.removeEventListener(\"blur\", onBlur);\n emitter.clear();\n host.destroy();\n },\n };\n applyTexts();\n colors = sideColors(host.theme, options);\n refreshFormat();\n host.invalidate();\n return instance;\n};\n"],"mappings":";;;;;;AA8BA,IAAMA,IAA8C;CAClD,IAAI;EACF,MAAM;EACN,OAAO;EACP,MAAM;EACN,MAAM;EACN,KAAK;EACL,MAAM;EACN,QAAQ;EACR,WAAW;EACX,MAAM;CACR;CACA,IAAI;EACF,MAAM;EACN,OAAO;EACP,MAAM;EACN,MAAM;EACN,KAAK;EACL,MAAM;EACN,QAAQ;EACR,WAAW;EACX,MAAM;CACR;CACA,IAAI;EACF,MAAM;EACN,OAAO;EACP,MAAM;EACN,MAAM;EACN,KAAK;EACL,MAAM;EACN,QAAQ;EACR,WAAW;EACX,MAAM;CACR;CACA,IAAI;EACF,MAAM;EACN,OAAO;EACP,MAAM;EACN,MAAM;EACN,KAAK;EACL,MAAM;EACN,QAAQ;EACR,WAAW;EACX,MAAM;CACR;AACF,GAEMC,IAAyC;CAAC;CAAQ;CAAS;AAAM,GACjEC,IAAM,GACNC,KAAO,GAEPC,IAAU,GACVC,KAAW,KAmBXC,KAAc,MAAsB;CACxC,IAAMC,IAAM,KAAK,IAAIC,GAAK,IAAI;CAC9B,OAAO;EACL,MAAM,IAAI,aAAaD,CAAG;EAC1B,OAAO,IAAI,aAAaA,CAAG;EAC3B,MAAM,IAAI,aAAaA,CAAG;EAC1B,MAAM,IAAI,WAAWA,CAAG;EACxB,MAAM,IAAI,UAAUA,CAAG;EACvB,OAAO,IAAI,YAAYA,CAAG;EAC1B,SAAS,IAAI,aAAaA,CAAG;EAC7B,OAAO;EACP,QAAQ;EACR;CACF;AACF,GAGME,KAAQ,GAAY,OAAeC,EAAK,QAAQC,KAAKD,EAAK,KAAK,QAG/DE,KAAY,MAAuB;CACvC,IAAML,IAAMG,EAAK,KAAK;CACtB,IAAIA,EAAK,SAASH,GAAK;EACrB,IAAMM,KAAKH,EAAK,QAAQA,EAAK,UAAUH;EAEvC,OADA,EAAK,UACEM;CACT;CACA,IAAIN,IAAMG,EAAK,KAAK;EAClB,IAAMI,IAAO,KAAK,IAAIJ,EAAK,KAAKH,IAAM,CAAC;EAUvC,KAAK,IAAMQ,KAAO;GARhB;GACA;GACA;GACA;GACA;GACA;GACA;EAEgB,GAAM;GACtB,IAAMC,IAAMN,EAAKK,IACXE,IAAQ,IAAKD,EAAI,YACrBF,CACF;GAIA,AAFAG,EAAM,IAAID,EAAI,SAASN,EAAK,KAAK,CAAU,GAC3CO,EAAM,IAAID,EAAI,SAAS,GAAGN,EAAK,KAAK,GAAYH,IAAMG,EAAK,KAAK,GAChE,EAA6CK,KAAOE;EACtD;EAGA,OAFA,EAAK,QAAQ,GACb,EAAK,UACEV;CACT;CAEA,IAAMM,IAAIH,EAAK;CAEf,OADA,EAAK,SAASA,EAAK,QAAQ,KAAKH,GACzBM;AACT,GAgBaK,KACX,GACA,IAA+B,CAAC,MACP;CACzB,IAAIC,IAAUC,GACRC,IAAUC,EAAoC,GAChDC,IAAW,KAAK,IAAI,GAAG,KAAK,MAAMJ,EAAQ,YAAY,GAAM,CAAC,GAC7DK,IAAMlB,EAAWiB,CAAQ,GACzBE,IAAOnB,EAAWiB,CAAQ,GAE1BG,IAAyB,MAEzBC,IAAO,GACPC,IAAc,GACdC,IAAY,KACZC,IAAW,GACXC,KAAkBC,EAAiBb,GAAS,GAAG,CAAC,GAChDc,IAAgB,GAChBC,IAAe,GACfC,IAAS;EAAE,IAAI;GAAC;GAAG;GAAG;GAAG;EAAC;EAAW,MAAM;GAAC;GAAG;GAAG;GAAG;EAAC;CAAU,GAGhEC,IAAO,GACPC,IAAS,GACTC,IAAe,IACfC,IAAc,IACdC,IAAS,IACTC,KAAY,KACZC,IAAmC,MAEnCC,IAAwB,MACxBC,KAAW,IACXC,IAAuC,MACvCC,IAAsC,MAEtCC,IAAS;EACX,KAAK;EACL,IAAI;EACJ,SAAS;EACT,OAAO;GAAC;GAAG;GAAG;GAAG;EAAC;EAClB,OAAO;GAAC;GAAG;GAAG;GAAG;EAAC;CACpB,GAEMC,IAAOC,EAAWC,GAAW;EACjC,WAAW;EACX;EACA,eAAe;GACb,IAASC,EAAWH,EAAK,OAAO7B,CAAO;EACzC;CACF,CAAC,GACK,EAAE,YAAS6B;CAGjB,AAFA,EAAK,WAAW,GAChBI,EAAK,aAAa,QAAQ,KAAK,GAC/BA,EAAK,aAAa,aAAa,KAAK;CAGpC,IAAIC,KAAQC,EAAatD,GAAQmB,EAAQ,QAAQA,EAAQ,MAAM,GACzDoC,WAAeF,IACfG,UAAmB;EAEvB,AADA,KAAQF,EAAatD,GAAQmB,EAAQ,QAAQA,EAAQ,MAAM,GAC3DiC,EAAK,aAAa,cAAcjC,EAAQ,aAAakC,GAAM,IAAI;CACjE,GACMI,WAAgB,KAAK,IAAI,GAAGtC,EAAQ,WAAW,CAAC,GAChDuC,WAAoBhC,MAAS,QAAQA,EAAK,QAAQ+B,GAAQ,GAC1DE,UAAclC,EAAK,SAAU,MAAY,GAEzCmC,UAAsB;EAC1B,KAAM5B,EAAiBb,GAASc,GAAeC,CAAY;CAC7D,GAEM2B,MAAS,MAAuB;EAEpC,IAAIrC,EAAI,SAAS,IAAI;EACrB,IAAMsC,IAAI,KAAK,IAAI,GAAGC,EAAWC,EAAM,KAAK,CAAC,GACvCC,IAAI,KAAK,IAAI,GAAGF,EAAWC,EAAM,IAAI,CAAC;EAC5C,CAAIF,IAAI7B,KAAiBgC,IAAI/B,OAC3B,IAAgB,KAAK,IAAID,GAAe6B,CAAC,GACzC,IAAe,KAAK,IAAI5B,GAAc+B,CAAC,GACvCL,EAAc;CAElB,GAEMM,MAAY,MAAiB;EACjC,IAAMrD,IAAID,EAASa,CAAI;EAQvB,AAPA,EAAK,KAAKZ,KAAKsD,EAAE,MACjB,EAAK,MAAMtD,KAAKsD,EAAE,OAClB,EAAK,KAAKtD,KAAKsD,EAAE,MACjB,EAAK,KAAKtD,KAAKsD,EAAE,MACjB,EAAK,KAAKtD,KAAKsD,EAAE,MACjB,EAAK,MAAMtD,KAAKsD,EAAE,OAClB,EAAK,QAAQtD,KAAKsD,EAAE,SACpB;CACF,GAGMC,MACJ,GACA,GACA,GACA,GACA,GACA,MACG;EACH,IAAIjD,EAAQ,WAAW;GACrB,IAAIO,KAAQA,EAAK,SAAS2C,KAAQ3C,EAAK,SAAS4C,GAAM;IAKpD,AAJA,EAAK,QAAQC,GACb,EAAK,QAAQC,GACb,EAAK,OAAOC,GACZ,EAAK,SACL,EAAK,UAAUC;IACf;GACF;GAEA,AADIhD,KAAQA,EAAK,QAAQ+B,GAAQ,KAAGS,GAASxC,CAAI,GACjD,IAAO;IAAE;IAAM;IAAO;IAAM;IAAM;IAAM,OAAO;IAAG;GAAQ;GAC1D;EACF;EACA,AAAI6C,KAAQd,GAAQ,KAClBS,GAAS;GAAE;GAAM;GAAO;GAAM;GAAM;GAAM,OAAO;GAAG;EAAQ,CAAC;CACjE,GAGMS,MAAW,MAAmB;EAClC,IAAMC,IAAQhD,IAAe,MAAY,GACnCiD,IAAQD,IAAQE;EAEtB,IADA,IAAOF,GACHC,KAAS,GAAG;EAEhB,AADA,KAAQA,GACJrC,IAAQ,KAAUqC,IACjB,AACAzC,IADIjB,EAAQ,YAAY,KAAckB,IAC/B,KAAK,IAAID,GAAMC,IAASjC,CAAO;EAC3C,IAAM2E,IAAIpB,EAAM;EAEhB,AADA,IAAS,KAAK,IAAItB,GAAQ,KAAK,IAAI,GAAG0C,IAAI,CAAC,CAAC,GAC5C,IAAO,KAAK,IAAI3C,GAAM,KAAK,IAAI,GAAG2C,IAAI,CAAC,CAAC;CAC1C,GAEMC,MAAY,GAAoB,MAAoB;EACxD,IAAM,EAAE,SAAM,UAAO,YAAShB;EAC9B,IAAI,CAAC,OAAO,SAASQ,CAAK,KAAK,CAAC,OAAO,SAASD,CAAI,KAAKA,KAAQ,GAAG;EACpE,GAAMP,CAAK;EACX,IAAMK,IAAOL,EAAM,SAAS,SAAS7D,KAAOD;EAG5C,AAFI,OAAO,SAAS2B,CAAS,KAAK2C,MAAU3C,MAC1C,IAAW2C,IAAQ3C,IAAY,IAAI,KACrC,IAAY2C;EACZ,IAAM3D,IAAID,EAASY,CAAG;EAMtB,AALA,EAAI,KAAKX,KAAKyD,GACd,EAAI,MAAMzD,KAAK2D,GACf,EAAI,KAAK3D,KAAK0D,GACd,EAAI,KAAK1D,KAAKwD,GACd,EAAI,KAAKxD,KAAKiB,GACdsC,GAAOE,GAAME,GAAOD,GAAMF,GAAMvC,GAAU4C,CAAO;CACnD,GAGMO,UAAgB;EAGpB,AAFA,IAAO3E,EAAWiB,CAAQ,GAC1B,IAAO,MACP,IAAc;EACd,KAAK,IAAIZ,IAAI,GAAGA,IAAIa,EAAI,QAAQ,KAAK;GACnC,IAAMX,IAAIJ,EAAKe,GAAKb,CAAC;GACrB,GACEa,EAAI,KAAKX,IACTW,EAAI,MAAMX,IACVW,EAAI,KAAKX,IACTW,EAAI,KAAKX,IACTW,EAAI,KAAKX,IACT,SACF;EACF;EAIA,AAHA,IAAO8C,EAAM,GACb,IAAO,IAAS,GAChB,IAAe,IACf,IAAS;CACX,GAGMuB,MAAS,MAAoC;EACjD,IAAIC,IAAQ,GAAG,OAAO;EACtB,IAAMC,IAAc1B,GAAY;EAChC,IAAI0B,KAAeD,MAAU,GAAG,OAAOzD;EACvC,IAAMf,IAAIc,EAAK,SAAS,KAAK0D,IAAS;EACtC,IAAIxE,IAAI,GAAG,OAAO;EAClB,IAAME,IAAIJ,EAAKgB,GAAMd,CAAC;EACtB,OAAO;GACL,MAAMc,EAAK,KAAKZ;GAChB,OAAOY,EAAK,MAAMZ;GAClB,MAAMY,EAAK,KAAKZ;GAChB,MAAMY,EAAK,KAAKZ;GAChB,MAAMY,EAAK,KAAKZ;GAChB,OAAOY,EAAK,MAAMZ;GAClB,SAASY,EAAK,QAAQZ;EACxB;CACF,GAEMwE,MAAW,GAAgB,OAAyC;EACxE,OAAO;GACL,MAAMC,EAAI;GACV,OAAOA,EAAI;GACX,MAAMA,EAAI;GACV,MAAMA,EAAI,SAASnF,KAAO,SAAS;EACrC;EACA,OAAOmF,EAAI;EACX;CACF,IAEMC,UAAkB;EACtB,IAAMzE,IAAOyB,KAAeD,KAAgBK,MAAW;EACvD,AAAI7B,MAAS0B,MACb,IAAS1B,GACJ0B,MAEH,IAAS,GACT,IAAO,KAAK,IAAIJ,GAAM,KAAK,IAAIhC,GAAS2C,EAAO,OAAO,CAAC,IAEzD1B,EAAQ,KAAK,SAASmB,CAAM;CAC9B,GAEMgD,KAAY,GAAqB,IAAO,OAAS;EACrD,IAAMhF,IAAM,KAAK,IAAI,GAAGmD,EAAM,IAAIZ,EAAO,OAAO;EAIhD,AAHA,IAAS0C,EAAM,KAAK,MAAMC,CAAW,GAAG,GAAGlF,CAAG,GAC1CmF,MAAM,IAAetD,IAAS,IAClCkD,EAAU,GACVvC,EAAK,WAAW;CAClB;CAEA,SAAS4C,GAAK,GAAsB;EAClC,IAAMC,IAAM7C,EAAK;EACjB,IAAI,CAAC6C,GAAK,OAAO;EACjB,IAAM,EAAE,UAAO,WAAQ,QAAK,aAAU7C,GAChC8C,IAAIvC,GAAO,GACXwC,IAAUC,IAAQ,KAClBC,IAAW9E,EAAQ,aAAa4E,IAAU,KAAK,KAC/CG,IAAK,KAAK,IAAI,IAAI/E,EAAQ,cAAc4E,IAAU,KAAK,GAAG,GAC1DI,IAAUhF,EAAQ,WAAW,KAAQ,IAAI+E,IAAK,GAC9CE,IAAMD,GACNE,IAAU,KAAK,IAAI,GAAG,KAAK,MAAMC,IAASF,KAAOF,CAAE,CAAC,GACpDnB,IAAIpB,EAAM,GACV4C,IAAK,OAAO,SAAS9D,EAAS,IAAI+D,IAAM/D,KAAY;EAC1D,KAAY+D;EAGZ,IAAIC,IAAY;EAShB,AARItF,EAAQ,YAAY,MAAS,CAAC,OAAO,SAASiB,CAAI,IAAG,IAAOC,KAE9D,MAASA,IAASD,KAAQsE,EAAKH,GAAI,EAAE,GACjC,KAAK,IAAInE,IAAOC,CAAM,IAAI,MAAM,IAAOA,IACtC,IAAY,KAGnBwD,EAAI,aAAac,GAAK,GAAG,GAAGA,GAAK,GAAG,CAAC,GACrCd,EAAI,UAAU,GAAG,GAAGG,GAAOM,CAAM;EACjC,IAAMM,IAAOC,EAAMC,EAAM,IAAI,GACvBC,IAAQF,EAAMC,EAAM,SAAS,GAC7BE,IAAMjB,IAAU,IAAI,IACpBkB,IAAYlC,IAAI,KAAK,OAAOuB,IAASF,KAAOF,CAAE,GAC9CgB,IAAQlB,IAAQgB,KAAOC,IAAY,IAAI,IAGvCE,KAAQhG,EAAQ,WAAWlB,EAAA,CAAS,QACvC,GAAG,GAAG,MAAQmH,EAAI,QAAQC,CAAC,MAAMxG,CACpC,GACMyG,IACJvB,KAAWoB,EAAK,SAAS,IAAIA,EAAK,QAAQ,MAAME,MAAM,MAAM,IAAIF,GAC5DI,IAA8C;GAClD,MAAMpG,EAAQ,iBAAiB,KAAQ,IAAI;GAC3C,OAAO;GACP,MAAM;GACN,MAAM;EACR,GACMqG,KAAcF,EAAU,QAAQ,GAAG,MAAMrD,IAAIsD,EAAQF,IAAI,CAAC,GAC1DI,IAAqB,CAAC,GACxBC,KAAMV;EACV,KAAK,IAAMK,KAAKC,GAEd,AADA,OAASJ,IAAQF,KAAOO,EAAQF,KAAMG,IACtCC,EAAS,KAAKC,EAAG;EAEnB,IAAMC,MAAW,MAAeC,MAAM,IAAIZ,IAAMS,EAASG,IAAI,IAEvDC,KAAa,GAAuB,MACxCD,MAAM,KAAKP,MAAM,QAGbS,KAAY3G,EAAQ,uBAAuB,UAC3C4G,KAAQ,KAAK,IAAI,GAAG,KAAK,MAAM3F,CAAI,CAAC,GACpC4F,KAAS5F,IAAO2F,IAChBE,KAAQ9G,EAAQ,YAAY;EAClC,IAAU;EACV,IAAI+G,KAAa;EAUjB,AATIxF,KAAWA,EAAQ,MAAM0D,IAC3B,KAAa,KAAK,OAAO1D,EAAQ,KAAK0D,KAAOF,IAAK9D,CAAI,IAC7CO,MAAW,SACpB,KAAahB,IAAO,IAAIgB,IAE1BkD,EAAI,KAAK,GACTA,EAAI,UAAU,GACdA,EAAI,KAAK,GAAGO,GAAKJ,GAAOM,IAASF,CAAG,GACpCP,EAAI,KAAK,GACT,EAAI,eAAe;EACnB,KAAK,IAAIsC,IAAI,GAAGA,KAAK9B,GAAS,KAAK;GACjC,IAAMlB,IAAQ4C,KAAQI;GACtB,IAAIhD,KAASJ,GAAG;GAChB,IAAMO,IAAMJ,GAAMC,CAAK;GACvB,IAAI,CAACG,GAAK;GACV,IAAM8C,IAAIhC,KAAO+B,IAAIH,MAAU9B;GAC/B,IAAIkC,IAAI9B,GAAQ;GAChB,IAAM+B,IAAO/C,EAAI,SAASnF,IACpBmI,IAAQD,IAAOlG,EAAO,OAAOA,EAAO,IACpCoG,IAAQjD,EAAI,QAAQwC;GAM1B,IALI3C,MAAU+C,OACZ,IAAU7C,GAAQC,GAAKH,CAAK,GAC5B,EAAI,YAAY0B,EAAMC,EAAM,MAAM,GAAI,GACtCjB,EAAI,SAAS,GAAGuC,GAAGpC,GAAOE,CAAE,IAE1BqC,GAAO;IAET,IAAM5H,IAAI8E,EAAM,KAAK,KAAKH,EAAI,OAAOwC,EAAS,IAAI,GAAG,GAAG,CAAC;IAazD,AAZA,EAAI,YAAYjB,EAAMyB,GAAO,MAAO,KAAM3H,CAAC,GAC3CkF,EAAI,SAAS,GAAGuC,IAAI,GAAGpC,GAAOE,IAAK,CAAC,GAEpC,EAAI,YAAYW,EAAMyB,CAAK,GAC3BzC,EAAI,UAAU,GACdA,EAAI,IACFmB,IAAM,GACNoB,IAAIlC,IAAK,GACT,KAAK,IAAI,KAAKc,IAAM,IAAI,CAAC,GACzB,GACA,KAAK,KAAK,CACZ,GACAnB,EAAI,KAAK;GACX;GACA,IAAIoC,MAAS,OAAO,SAAS3C,EAAI,OAAO,GAAG;IACzC,IAAMkD,KAAOhC,IAAMlB,EAAI,WAAWjF;IAClC,AAAImI,IAAM,KAAKA,KAAO,MACpB,EAAI,YAAY3B,EAAMyB,GAAO,OAAQ,IAAIE,MAAQ,IAAIA,EAAI,GACzD3C,EAAI,SAAS,GAAGuC,GAAGpC,GAAOE,CAAE,GAC5B,IAAY;GAEhB;GACA,IAAMuC,IAAKL,IAAIlC,IAAK,IAAI,IAClBwC,IAASH,IAAQ,MAAM;GAC7B,EAAU,SAAS,GAAG,MAAM;IAC1B,IAAMI,IAAOd,EAAUR,GAAGO,CAAC;IAC3B,EAAI,YAAYe,IAAO,SAAS;IAChC,IAAMC,IAAID,IAAOhB,GAAQC,CAAC,KAAKA,MAAM,KAAKW,IAAQ,IAAI,KAAKd,EAASG;IACpE,QAAQP,GAAR;KACE,KAAK;MAGH,AAFA,EAAI,OAAOwB,EAAO/B,GAAO3F,GAAS,KAAK8E,CAAQ,GAC/C,EAAI,YAAYc,GAChBlB,EAAI,SACF1E,EAAQ,aACJA,EAAQ,WAAWmE,EAAI,IAAI,IAC3BwD,EACExD,EAAI,MACJnE,EAAQ,iBAAiB,IACzBA,EAAQ,QACV,GACJyH,GACAH,CACF;MACA;KACF,KAAK,SAAS;MACZ,IAAMM,IACJzD,EAAI,OAAO,IAAInD,EAAO,KAAKmD,EAAI,OAAO,IAAInD,EAAO,OAAO;MAQ1D,AAPA,EAAI,OAAO0G,EAAO/B,GAAO3F,GAASoH,IAAQ,MAAM,KAAKtC,CAAQ,GAC7D,EAAI,YACF9E,EAAQ,eAAe,SACnB4H,IACElC,EAAMkC,CAAS,IACfnC,IACFC,EAAMyB,CAAK,GACjBzC,EAAI,SAAS9D,GAAI,MAAMuD,EAAI,KAAK,GAAGsD,GAAGH,CAAE;MACxC;KACF;KACA,KAAK,QAAQ;MAEX,AADA,EAAI,OAAOI,EAAO/B,GAAO3F,GAASuH,GAAQzC,CAAQ,GAClD,EAAI,YAAYsC,IAAQ1B,EAAMyB,CAAK,IAAI1B;MACvC,IAAMoC,IAAQjH,GAAI,KAAKuD,EAAI,IAAI;MAE/B,IADAO,EAAI,SAASmD,GAAOJ,GAAGH,CAAE,GACrBnD,EAAI,QAAQ,KAAK,CAACS,GAAS;OAE7B,IAAMkD,IAAIpD,EAAI,YAAYmD,CAAK,CAAC,CAAC;OAGjC,AAFA,EAAI,OAAOH,EAAO/B,GAAO3F,GAAS,KAAK8E,IAAW,CAAC,GACnD,EAAI,YAAYc,GAChBlB,EAAI,SAAS,IAAIP,EAAI,SAASsD,IAAIK,IAAI,GAAGR,CAAE;MAC7C;MACA;KACF;KACA,KAAK,QAGH,AAFA,EAAI,OAAOI,EAAO/B,GAAO3F,GAAS,KAAK8E,CAAQ,GAC/C,EAAI,YAAYY,EAAMyB,CAAK,GAC3BzC,EAAI,SAASwC,IAAOvC,EAAE,OAAOA,EAAE,KAAK8C,GAAGH,CAAE;IAE7C;GACF,CAAC;EACH;EAIA,AAHA5C,EAAI,QAAQ,GAGRM,MACF,EAAI,OAAO0C,EAAO/B,GAAO3F,GAAS,KAAK8E,IAAW,CAAC,GACnD,EAAI,YAAYc,GAChB,EAAI,eAAe,UACnBO,EAAU,SAAS,GAAG,MAAM;GAC1B,IAAMqB,IAAOd,EAAUR,GAAGO,CAAC;GAE3B,AADA,EAAI,YAAYe,IAAO,SAAS,SAChC9C,EAAI,SAASC,EAAEuB,IAAIsB,IAAOhB,GAAQC,CAAC,IAAIH,EAASG,IAAK1B,IAAK,IAAI,CAAC;EACjE,CAAC,GACD,EAAI,YAAYW,EAAMC,EAAM,IAAI,GAChCjB,EAAI,SAAS,GAAGM,IAAU,GAAGH,GAAO,CAAC;EAIvC,IAAMkD,IAAS5C,IAASF,IAAM,GAC1B+C,IAAQ;GAAC;GAAG;GAAG;GAAG;EAAC;EACvB,IAAIlC,KAAaiC,IAAS,IAAI;GAC5B,IAAME,IAAW,KAAK,IAAI,IAAI9C,IAASF,KAAOF,CAAE,GAC1CmD,IAAS,KAAK,IAAI,IAAKH,IAASE,IAAYrE,CAAC,GAC7CuE,IAAY,KAAK,IAAI,GAAGvE,IAAIqE,CAAQ,GACpCG,IACJnD,IAAM,KAAK8C,IAASG,KAAU5D,EAAMrD,IAAOkH,GAAW,GAAG,CAAC,GACtDE,IACJ1G,MAAa,QAASJ,MAAY,QAAQA,EAAQ,KAAKsD,IAAQ;GAIjE,AAHA,EAAI,YAAYa,EAAMC,EAAM,WAAW0C,IAAS,KAAM,GAAI,GAC1DC,EAAU5D,GAAKG,IAAQ,GAAGuD,GAAQ,GAAGF,GAAQ,CAAC,GAC9CxD,EAAI,KAAK,GACT,IAAQ;IAACG,IAAQ;IAAII;IAAK;IAAI8C,IAAS;GAAC;EAC1C;EAGA,IAAIQ,IAAQ;GAAC;GAAG;GAAG;GAAG;EAAC,GACjBC,KAAQ,KAAK,MAAMtH,CAAM;EAC/B,IAAIG,KAAUmH,KAAQ,GAAG;GACvB,IAAMC,IAAsB,CAAC;GAS7B,IARIrH,KAAe,CAACD,KAAcsH,EAAU,KAAK9D,EAAE,MAAM,GACrD6D,KAAQ,KACVC,EAAU,KACR9D,EAAE,UAAU,QACV,WACA6D,KAAQ,OAAO,UAAU,OAAOA,EAAK,CACvC,CACF,GACEC,EAAU,QAAQ;IACpB,IAAMZ,IAAQY,EAAU,KAAK,KAAK;IAClC,EAAI,OAAOf,EAAO/B,GAAO3F,GAAS,KAAK,KAAK,IAAI,IAAI8E,IAAW,CAAC,CAAC;IACjE,IAAM4D,IAAKhE,EAAI,YAAYmD,CAAK,CAAC,CAAC,QAAQ,IACpCc,IAAK,KAAK,IAAI,IAAI5D,IAAK,CAAC,GACxB6D,KAAM/D,IAAQ6D,KAAM,GACpBG,IAAK5D,IAAM;IAQjB,AAPA,EAAI,YAAYS,EAAMC,EAAM,SAAS,GAAI,GACzC2C,EAAU5D,GAAKkE,GAAIC,GAAIH,GAAIC,GAAIA,IAAK,CAAC,GACrCjE,EAAI,KAAK,GACT,EAAI,YAAY,QAChB,EAAI,YAAY,UAChB,EAAI,eAAe,UACnBA,EAAI,SAASmD,GAAOhD,IAAQ,GAAGgE,IAAKF,IAAK,IAAI,EAAG,GAChD,IAAQ;KAACC;KAAIC;KAAIH;KAAIC;IAAE;GACzB;EACF;EAQA,AAPA,IAAS;GACP;GACA;GACA,SAAS,KAAK,OAAOxD,IAASF,KAAOF,CAAE;GACvC;GACA;EACF,GACA,EAAK,MAAM,SACTwD,EAAM,MAAMhH,KAAWuH,GAAOvH,GAASgH,CAAK,IAAI,YAAY;EAG9D,IAAM3I,KAAM8B,IACR,GAAGlB,IAAO,IAAIkB,EAAQ,MAAM,GAAGA,EAAQ,MAAM,SAC7C;EACJ,AAAI9B,OAAQ6B,OACV,KAAW7B,IACXM,EAAQ,KAAK,SAASwB,CAAO;EAG/B,IAAMqH,IAAShF,GAAM,CAAC;EAKtB,OAJIgF,KACFlH,EAAK,SACH,GAAG7B,EAAQ,aAAa2E,EAAE,KAAK,IAAIoE,EAAO,SAAS/J,KAAO2F,EAAE,OAAOA,EAAE,IAAI,GAAG/D,GAAI,KAAKmI,EAAO,IAAI,EAAE,KAAKnI,GAAI,MAAMmI,EAAO,KAAK,EAAE,EACjI,GACKzD;CACT;CAEA,IAAMwD,MAAU,GAAsB,MACpC9B,EAAE,KAAM,KACRrE,EAAE,MAAOqE,EAAE,MACXrE,EAAE,MAAOqE,EAAE,KAAMA,EAAE,MACnBrE,EAAE,MAAOqE,EAAE,MACXrE,EAAE,MAAOqE,EAAE,KAAMA,EAAE,IAIfgC,MAAe,MAAc;EACjC,IAAM,GAAG1B,KAAM2B,KAAMrH,EAAO,OACtBgC,IAAIpB,EAAM,GACV0G,IAAQ5E,GAAO2C,IAAIK,KAAO,KAAK,IAAI,GAAG2B,CAAG,GAAG,GAAG,CAAC;EACtD,EAASC,IAAQ,KAAK,IAAI,GAAGtF,IAAIhC,EAAO,OAAO,CAAC;CAClD,GAEMuH,KAAiB,MAAwB;EAO7C,AANA,IAAUC,EAAWnH,GAAMoH,CAAK,GAC5B1H,KAAUqH,GAAYzH,EAAQ,KAAKI,EAAS,MAAM,GAClD3B,EAAQ,iBAAiB,MAAS,CAACoB,MACrC,IAAc,IACdgD,EAAU,IAEZvC,EAAK,WAAW;CAClB,GACMyH,WAAuB;EAM3B,AALA,IAAU,MACNlI,MACF,IAAc,IACdgD,EAAU,IAEZvC,EAAK,WAAW;CAClB,GACM0H,MAAiB,MAAwB;EAC7C,IAAM5G,IAAIyG,EAAWnH,GAAMoH,CAAK;EAChC,AAAIP,GAAOnG,GAAGf,EAAO,KAAK,KAAK,CAACkH,GAAOnG,GAAGf,EAAO,KAAK,MACpD,IAAW,EAAE,QAAQ,EAAE,GACvBK,EAAK,oBAAoBoH,EAAM,SAAS,GACxCL,GAAYrG,EAAE,EAAE,GAChB0G,EAAM,eAAe;CAEzB,GACMG,MAAe,MAAwB;EAC3C,AAAK7H,MACL,IAAW,MACXM,EAAK,wBAAwBoH,EAAM,SAAS,GAC5CxH,EAAK,WAAW;CAClB,GACM4H,MAAW,MAAsB;EACrC,IAAM9G,IAAIyG,EAAWnH,GAAMoH,CAAK;EAChC,IAAIP,GAAOnG,GAAGf,EAAO,KAAK,GAAG;GAC3B,GAAS,eAAe;GACxB;EACF;EACA,IAAIkH,GAAOnG,GAAGf,EAAO,KAAK,KAAKe,EAAE,KAAKf,EAAO,KAAK;EAClD,IAAMoC,IAAQ,KAAK,OAAOrB,EAAE,KAAKf,EAAO,OAAOA,EAAO,KAAKX,CAAI,GACzDkD,IAAMJ,GAAMC,CAAK;EACvB,AAAIG,KAAOH,IAAQxB,EAAM,KAAGtC,EAAQ,KAAK,cAAcgE,GAAQC,GAAKH,CAAK,CAAC;CAC5E,GACM0F,MAAW,MAAsB;EACrC,IAAM9F,IAAIpB,EAAM,GACVnD,IAAM,KAAK,IAAI,GAAGuE,IAAIhC,EAAO,OAAO,GACpC+H,IACJN,EAAM,cAAc,IAChBA,EAAM,SACNA,EAAM,cAAc,IAClBA,EAAM,SAASzH,EAAO,UACtByH,EAAM,SAASzH,EAAO;EAE9B,AAAK+H,IAAO,KAAKzI,KAAU,KAAOyI,IAAO,KAAKzI,KAAU7B,MACxDgK,EAAM,eAAe,GACrBhF,EAASnD,KAAU,KAAK,IAAIyI,CAAI,IAAI,IAAI,KAAK,KAAKA,CAAI,IAAIA,EAAK;CACjE,GACMC,MAAa,MAAyB;EAC1C,IAAMhG,IAAIpB,EAAM;EAChB,IAAI,CAACoB,GAAG;EACR,IAAMiG,IAAO,KAAK,IAAI,GAAGjI,EAAO,UAAU,CAAC,GACrCoC,IAAQxC,MAAW,OAAO,KAAKhB,IAAO,IAAIgB,GAC1CsI,KAAU,MAAiB;GAC/B,IAAMpK,IAAI4E,EAAM3E,GAAM,GAAGiE,IAAI,CAAC;GAM9B,AALA,IAASpD,IAAO,IAAId,GAEhBA,IAAIwB,IAAQmD,EAAS3E,CAAC,IACjBA,KAAKwB,IAASU,EAAO,UAASyC,EAAS3E,IAAIkC,EAAO,UAAU,CAAC,IACjEwC,EAAU,GACfvC,EAAK,WAAW;EAClB;EACA,QAAQwH,EAAM,KAAd;GACE,KAAK;IACH,EAAOrF,IAAQ,CAAC;IAChB;GACF,KAAK;IACH,EAAO,KAAK,IAAI,GAAGA,IAAQ,CAAC,CAAC;IAC7B;GACF,KAAK;IACH,EAAO,KAAK,IAAI,GAAGA,CAAK,IAAI6F,CAAI;IAChC;GACF,KAAK;IACH,EAAO7F,IAAQ6F,CAAI;IACnB;GACF,KAAK;IAEH,AADA,IAAS,MACTE,GAAS,eAAe;IACxB;GACF,KAAK;IACH,EAAOnG,IAAI,CAAC;IACZ;GACF,KAAK;GACL,KAAK,KAAK;IACR,IAAMO,IAAMH,KAAS,IAAID,GAAMC,CAAK,IAAI;IACxC,AAAIG,KAAKjE,EAAQ,KAAK,cAAcgE,GAAQC,GAAKH,CAAK,CAAC;IACvD;GACF;GACA,KAAK;IAEH,AADA,IAAS,MACT+F,GAAS,eAAe;IACxB;GACF,SACE;EACJ;EACA,EAAM,eAAe;CACvB,GACMC,WAAe;EACnB,AAAIxI,MAAW,SACf,IAAS,MACT4C,EAAU,GACVvC,EAAK,WAAW;CAClB;CAQA,AAPAI,EAAK,iBAAiB,eAAekH,CAAa,GAClDlH,EAAK,iBAAiB,gBAAgBqH,EAAc,GACpDrH,EAAK,iBAAiB,eAAesH,EAAa,GAClDtH,EAAK,iBAAiB,aAAauH,EAAW,GAC9CvH,EAAK,iBAAiB,SAASwH,EAAO,GACtCxH,EAAK,iBAAiB,SAASyH,IAAS,EAAE,SAAS,GAAM,CAAC,GAC1DzH,EAAK,iBAAiB,WAAW2H,EAAS,GAC1C3H,EAAK,iBAAiB,QAAQ+H,EAAM;CAEpC,IAAMC,WACJ,OAAO,cAAgB,MAAc,YAAY,IAAI,IAAI,KAAK,IAAI,GAE9DC,WAAc;EAYlB,AAXA,IAAM/K,EAAWiB,CAAQ,GACzB,IAAOjB,EAAWiB,CAAQ,GAC1B,IAAO,MACP,IAAO,IAAc,GACrB,IAAY,KACZ,IAAW,GACX,IAAgB,IAAe,GAC/B,IAAO,IAAS,GAChB,IAAe,IACf,IAAS,MACTgE,EAAU,GACV3B,EAAc;CAChB,GAEMsH,KAAiC;EACrC,UAAU,GAAQ;GAChB,IAAMI,IAAO,MAAM,QAAQC,CAAM,IAC5BA,IACD,CAACA,CAAqB;GAC1B,IAAI,CAACD,EAAK,QAAQ;GAClB,IAAMxG,IAASnD,GACT+C,IAAU0G,GAAM;GACtB,KAAK,IAAMpH,KAASsH,GAAM,GAAStH,GAAOU,CAAO;GAEjD,AADAC,GAAQG,CAAM,GACd9B,EAAK,WAAW;EAClB;EACA,UAAU,GAAQ;GAChB,GAAM;GACN,KAAK,IAAMgB,KAASuH,GAAQ,GAASvH,GAAO,SAAS;GAErD,AADA,IAAOL,EAAM,GACbX,EAAK,WAAW;EAClB;EACA,QAAQ;GAEN,AADAqI,GAAM,GACNrI,EAAK,WAAW;EAClB;EACA,WAAW,GAAM;GACf,IAAMwI,IAAWrK;GAGjB,AAFA,IAAUL,GACV0C,EAAW,GACX,IAASL,EAAWH,EAAK,OAAO7B,CAAO;GACvC,IAAMsK,IAAe,KAAK,IAAI,GAAG,KAAK,MAAMtK,EAAQ,YAAY,GAAM,CAAC;GACvE,IAAIsK,MAAiBlK,GAAU;IAE7B,IAAMP,IAAMQ;IAEZ,AADA,IAAWiK,GACX,IAAMnL,EAAWiB,CAAQ;IACzB,KAAK,IAAIZ,IAAI,KAAK,IAAI,GAAGK,EAAI,SAASO,CAAQ,GAAGZ,IAAIK,EAAI,QAAQ,KAAK;KACpE,IAAMH,IAAIJ,EAAKO,GAAKL,CAAC,GACfiH,IAAIhH,EAASY,CAAG;KAKtB,AAJA,EAAI,KAAKoG,KAAK5G,EAAI,KAAKH,IACvB,EAAI,MAAM+G,KAAK5G,EAAI,MAAMH,IACzB,EAAI,KAAK+G,KAAK5G,EAAI,KAAKH,IACvB,EAAI,KAAK+G,KAAK5G,EAAI,KAAKH,IACvB,EAAI,KAAK+G,KAAK5G,EAAI,KAAKH;IACzB;IACA,EAAQ;GACV,OAAO,EACJ2K,EAAS,WAAW,QAAQ1K,EAAK,WAAW,MAC7C,CAAC0K,EAAS,aAAc,CAAC1K,EAAK,cAE9BmE,EAAQ;GAKV,AAHI9D,EAAQ,iBAAiB,MAASoB,MAAa,IAAc,KACjEgD,EAAU,GACV3B,EAAc,GACdZ,EAAK,WAAW;EAClB;EACA,iBAAiB;GAKf,AAJA,IAAS,MACT,IAAe,IACf,IAAS,GACTuC,EAAU,GACVvC,EAAK,WAAW;EAClB;EACA,UAAUW;EACV,KAAK,GAAO,MAAYtC,EAAQ,GAAGmJ,GAAOkB,CAAO;EACjD,SAAS;GACP,EAAK,WAAW;EAClB;EACA,UAAU;GAUR,AATAtI,EAAK,oBAAoB,eAAekH,CAAa,GACrDlH,EAAK,oBAAoB,gBAAgBqH,EAAc,GACvDrH,EAAK,oBAAoB,eAAesH,EAAa,GACrDtH,EAAK,oBAAoB,aAAauH,EAAW,GACjDvH,EAAK,oBAAoB,SAASwH,EAAO,GACzCxH,EAAK,oBAAoB,SAASyH,EAAO,GACzCzH,EAAK,oBAAoB,WAAW2H,EAAS,GAC7C3H,EAAK,oBAAoB,QAAQ+H,EAAM,GACvC9J,EAAQ,MAAM,GACd2B,EAAK,QAAQ;EACf;CACF;CAKA,OAJAQ,EAAW,GACX,IAASL,EAAWH,EAAK,OAAO7B,CAAO,GACvCyC,EAAc,GACdZ,EAAK,WAAW,GACTkI;AACT"}
@@ -1,4 +1,4 @@
1
- import { ChartRendererKind, ChartRendererPreference } from '../types.cjs';
1
+ import { ChartRendererKind, ChartRendererPreference, ChartTimeZone } from '../types.cjs';
2
2
  /** One price level: `[price, size]` */
3
3
  export type OrderBookLevel = readonly [price: number, size: number];
4
4
  /** Price levels as two parallel columns (typed arrays welcome) */
@@ -466,6 +466,10 @@ export interface OrderBookHeatmapLabels {
466
466
  bid: string;
467
467
  /** Best ask, in the screen reader summary @default "Ask" */
468
468
  ask: string;
469
+ /** Side badge of a hovered bid row in the tooltip @default "Bid side" */
470
+ bidSide: string;
471
+ /** Side badge of a hovered ask row in the tooltip @default "Ask side" */
472
+ askSide: string;
469
473
  /** Accessible name (when `ariaLabel` is not set) @default "Liquidity heatmap" */
470
474
  name: string;
471
475
  }
@@ -508,9 +512,17 @@ export interface OrderBookHeatmapOptions extends OrderBookCommonOptions {
508
512
  * @default 1
509
513
  */
510
514
  contrast?: number;
511
- /** Size drawn with the hottest color; follows the data when omitted */
515
+ /**
516
+ * Size drawn with the hottest color; when omitted, the 98th percentile of
517
+ * the visible sizes (eased), so the whole ramp is used
518
+ */
512
519
  maxSize?: number;
513
- /** Color ramp, coldest first (the background color is prepended); a heat ramp suited to the theme when omitted */
520
+ /**
521
+ * Color ramp, coldest first, interpolated in OKLab. The first color also
522
+ * fills the cells without liquidity (the field is opaque, no holes): make
523
+ * it a dark color in dark themes and a pale one in light themes. A
524
+ * perceptual heat ramp suited to the theme when omitted
525
+ */
514
526
  colors?: readonly string[];
515
527
  /**
516
528
  * Trades drawn as bubbles sized by volume (buys / sells colors)
@@ -549,6 +561,12 @@ export interface OrderBookHeatmapOptions extends OrderBookCommonOptions {
549
561
  * @default "auto"
550
562
  */
551
563
  renderer?: ChartRendererPreference;
564
+ /**
565
+ * Clock of the time axis and the tooltip: the local time or UTC (the
566
+ * clock of most exchanges)
567
+ * @default "local"
568
+ */
569
+ timeZone?: ChartTimeZone;
552
570
  /**
553
571
  * Overrides of the built-in texts, which follow `locale` (English,
554
572
  * Chinese, Japanese and French built in)
@@ -686,6 +704,12 @@ export interface TimeAndSalesOptions extends OrderBookCommonOptions {
686
704
  * @default true
687
705
  */
688
706
  milliseconds?: boolean;
707
+ /**
708
+ * Clock of the default time format: the local time or UTC (the clock of
709
+ * most exchanges)
710
+ * @default "local"
711
+ */
712
+ timeZone?: ChartTimeZone;
689
713
  /** Formats the time of a trade (replaces the default `HH:MM:SS.mmm`) */
690
714
  formatTime?: (time: number) => string;
691
715
  /**
@@ -1,4 +1,4 @@
1
- import { ChartRendererKind, ChartRendererPreference } from '../types.js';
1
+ import { ChartRendererKind, ChartRendererPreference, ChartTimeZone } from '../types.js';
2
2
  /** One price level: `[price, size]` */
3
3
  export type OrderBookLevel = readonly [price: number, size: number];
4
4
  /** Price levels as two parallel columns (typed arrays welcome) */
@@ -466,6 +466,10 @@ export interface OrderBookHeatmapLabels {
466
466
  bid: string;
467
467
  /** Best ask, in the screen reader summary @default "Ask" */
468
468
  ask: string;
469
+ /** Side badge of a hovered bid row in the tooltip @default "Bid side" */
470
+ bidSide: string;
471
+ /** Side badge of a hovered ask row in the tooltip @default "Ask side" */
472
+ askSide: string;
469
473
  /** Accessible name (when `ariaLabel` is not set) @default "Liquidity heatmap" */
470
474
  name: string;
471
475
  }
@@ -508,9 +512,17 @@ export interface OrderBookHeatmapOptions extends OrderBookCommonOptions {
508
512
  * @default 1
509
513
  */
510
514
  contrast?: number;
511
- /** Size drawn with the hottest color; follows the data when omitted */
515
+ /**
516
+ * Size drawn with the hottest color; when omitted, the 98th percentile of
517
+ * the visible sizes (eased), so the whole ramp is used
518
+ */
512
519
  maxSize?: number;
513
- /** Color ramp, coldest first (the background color is prepended); a heat ramp suited to the theme when omitted */
520
+ /**
521
+ * Color ramp, coldest first, interpolated in OKLab. The first color also
522
+ * fills the cells without liquidity (the field is opaque, no holes): make
523
+ * it a dark color in dark themes and a pale one in light themes. A
524
+ * perceptual heat ramp suited to the theme when omitted
525
+ */
514
526
  colors?: readonly string[];
515
527
  /**
516
528
  * Trades drawn as bubbles sized by volume (buys / sells colors)
@@ -549,6 +561,12 @@ export interface OrderBookHeatmapOptions extends OrderBookCommonOptions {
549
561
  * @default "auto"
550
562
  */
551
563
  renderer?: ChartRendererPreference;
564
+ /**
565
+ * Clock of the time axis and the tooltip: the local time or UTC (the
566
+ * clock of most exchanges)
567
+ * @default "local"
568
+ */
569
+ timeZone?: ChartTimeZone;
552
570
  /**
553
571
  * Overrides of the built-in texts, which follow `locale` (English,
554
572
  * Chinese, Japanese and French built in)
@@ -686,6 +704,12 @@ export interface TimeAndSalesOptions extends OrderBookCommonOptions {
686
704
  * @default true
687
705
  */
688
706
  milliseconds?: boolean;
707
+ /**
708
+ * Clock of the default time format: the local time or UTC (the clock of
709
+ * most exchanges)
710
+ * @default "local"
711
+ */
712
+ timeZone?: ChartTimeZone;
689
713
  /** Formats the time of a trade (replaces the default `HH:MM:SS.mmm`) */
690
714
  formatTime?: (time: number) => string;
691
715
  /**
@@ -1,2 +1,2 @@
1
- const e=require("./color.cjs"),t=require("./layout.cjs");var n=(e,t=e.fontSize,n=400)=>`${n} ${t}px ${e.fontFamily}`,r=e=>Math.round(e)+.5,i=(e,n,r,i)=>{let{plot:a}=n,o=t.toScreen(n,e.x??0,e.y??0),s=n.horizontal?{x:e.y===void 0,y:e.x===void 0}:{x:e.x===void 0,y:e.y===void 0},c=s.x?a.x+a.width/2:o.x,l=s.y?a.y+a.height/2:o.y,u=c-r/2,d=l-i/2;return e.anchor===`top`?d=l+6:e.anchor===`bottom`?d=l-6-i:e.anchor===`left`?u=c+6:e.anchor===`right`&&(u=c-6-r),u=Math.max(a.x+6,Math.min(u,a.x+a.width-6-r)),d=Math.max(a.y+2,Math.min(d,a.y+a.height-2-i)),{x:u,y:d,width:r,height:i}},a=(e,n)=>{let{plot:r}=n,[i,a]=n.horizontal?[r.y,r.y+r.height]:[r.x,r.x+r.width],[o,s]=n.horizontal?[r.x,r.x+r.width]:[r.y,r.y+r.height],c=(e,t,n)=>e<t?t:e>n?n:e;return t.screenRect(n,c(n.xToPx(e.x0??-1/0),i,a),c(n.xToPx(e.x1??1/0),i,a),c(n.yToPx(e.y0??-1/0),o,s),c(n.yToPx(e.y1??1/0),o,s))},o=(e,t)=>({vertical:e.axis===`x`!==t.horizontal,at:e.axis===`x`?t.xToPx(e.value):t.yToPx(e.value)}),s=(t,i)=>{let{scales:o,theme:s,xTicks:c,yTicks:l}=i,{plot:u}=o,d=o.horizontal?i.y:i.x,f=o.horizontal?i.x:i.y,p=o.horizontal?l:c,m=o.horizontal?c:l,h=o.horizontal?o.yToPx:o.xToPx,g=o.horizontal?o.xToPx:o.yToPx;t.clearRect(0,0,i.width,i.height),t.save(),t.beginPath(),t.rect(u.x,u.y,u.width,u.height),t.clip();for(let n of i.annotations){if(n.type!==`rect`)continue;let r=a(n,o);r.width<=0||r.height<=0||(t.fillStyle=e.toCss(n.color,n.opacity),t.fillRect(r.x,r.y,r.width,r.height))}if(t.restore(),t.lineWidth=1,t.strokeStyle=e.toCss(s.grid),t.beginPath(),f.grid)for(let e of m.values){let n=r(g(e));n<u.y-1||n>u.y+u.height+1||(t.moveTo(u.x,n),t.lineTo(u.x+u.width,n))}if(d.grid)for(let e of p.values){let n=r(h(e));n<u.x-1||n>u.x+u.width+1||(t.moveTo(n,u.y),t.lineTo(n,u.y+u.height))}t.stroke();let _=Math.ceil(s.fontSize*1.4);if(t.font=n(s),t.fillStyle=e.toCss(s.textMuted),d.visible){t.strokeStyle=e.toCss(s.axis),t.beginPath();let a=r(u.y+u.height);t.moveTo(u.x,a),t.lineTo(u.x+u.width,a),t.stroke(),t.textBaseline=`top`,t.textAlign=`center`;let o=-1/0,c=p.values.map((e,t)=>({px:h(e),text:p.labels[t]})).sort((e,t)=>e.px-t.px);for(let{px:e,text:n}of c){if(e<u.x-.5||e>u.x+u.width+.5)continue;let r=t.measureText(n).width,a=Math.max(0,Math.min(i.width-r,e-r/2));a<o+6||(o=a+r,t.fillText(n,a+r/2,u.y+u.height+7))}d.title&&(t.font=n(s,s.fontSize+1,500),t.fillStyle=e.toCss(s.text,.8),t.fillText(d.title,u.x+u.width/2,u.y+u.height+_+10))}if(f.visible){t.font=n(s),t.fillStyle=e.toCss(s.textMuted),t.textAlign=`right`,t.textBaseline=`middle`;let r=-1/0,i=m.values.map((e,t)=>({py:g(e),text:m.labels[t]})).sort((e,t)=>e.py-t.py),a=s.fontSize+2;for(let{py:e,text:n}of i)if(!(e<u.y-.5||e>u.y+u.height+.5)){if(o.horizontal){if(e-a/2<r)continue;r=e+a/2}t.fillText(n,u.x-8,e)}f.title&&(t.save(),t.font=n(s,s.fontSize+1,500),t.fillStyle=e.toCss(s.text,.8),t.translate(_/2+4,u.y+u.height/2),t.rotate(-Math.PI/2),t.textAlign=`center`,t.fillText(f.title,0,0),t.restore())}let v=o.horizontal?null:i.y2,y=i.y2Ticks;if(v&&y&&v.visible){let r=u.x+u.width;t.font=n(s),t.fillStyle=e.toCss(s.textMuted),t.textAlign=`left`,t.textBaseline=`middle`,y.values.forEach((e,n)=>{let i=o.yToPx(e);i<u.y-.5||i>u.y+u.height+.5||t.fillText(y.labels[n],r+8,i)}),v.title&&(t.save(),t.font=n(s,s.fontSize+1,500),t.fillStyle=e.toCss(s.text,.8),t.translate(i.width-_/2-4,u.y+u.height/2),t.rotate(Math.PI/2),t.textAlign=`center`,t.fillText(v.title,0,0),t.restore())}},c=(e,t)=>e.x<t.x+t.width&&t.x<e.x+e.width&&e.y<t.y+t.height&&t.y<e.y+e.height,l=(e,t)=>e.x>=t.x&&e.y>=t.y&&e.x+e.width<=t.x+t.width&&e.y+e.height<=t.y+t.height,u=(e,t,n,r,i,a)=>{e.lineWidth=3,e.lineJoin=`round`,e.strokeStyle=a,e.strokeText(t,n,r),e.fillStyle=i,e.fillText(t,n,r)},d=(e,t,n,r,i=[])=>{let a=[];for(let o of e){let e=n(o.text),s=o.r+4,u={x:o.x-e/2,y:o.y-s-r,width:e,height:r},d={x:o.x-e/2,y:o.y+s,width:e,height:r},f={x:o.x+s,y:o.y-r/2,width:e,height:r},p={x:o.x-s-e,y:o.y-r/2,width:e,height:r},m=(o.placement===`above`?[u]:o.placement===`below`?[d]:o.placement===`right`?[f,p]:o.placement===`left`?[p,f]:[{x:o.x+s,y:o.y-r/2,width:e,height:r},{x:o.x-s-e,y:o.y-r/2,width:e,height:r},u,d]).find(e=>l(e,t)&&!i.some(t=>c(t,e)));m&&(i.push(m),a.push({label:o,box:m}))}return a},f=(t,s)=>{let{scales:c,theme:l}=s,{plot:f}=c;s.clear!==!1&&t.clearRect(0,0,s.width,s.height),t.save(),t.beginPath(),t.rect(f.x,f.y,f.width,f.height),t.clip();let p=e.toCss(l.background,.9),m=[],h=l.fontSize+4;for(let i of s.annotations){if(i.type!==`line`)continue;let a=e.toCss(i.color);t.strokeStyle=a,t.lineWidth=i.width,t.setLineDash(i.dash),t.beginPath();let s=o(i,c);if(s.vertical){let e=r(s.at);t.moveTo(e,f.y),t.lineTo(e,f.y+f.height),t.stroke(),i.label&&(t.setLineDash([]),t.font=n(l,l.fontSize,500),t.textAlign=`left`,t.textBaseline=`top`,u(t,i.label,e+5,f.y+5,a,p))}else{let e=r(s.at);t.moveTo(f.x,e),t.lineTo(f.x+f.width,e),t.stroke(),i.label&&(t.setLineDash([]),t.font=n(l,l.fontSize,500),t.textAlign=`right`,t.textBaseline=`bottom`,u(t,i.label,f.x+f.width-6,e-3,a,p))}}t.setLineDash([]),t.font=n(l,l.fontSize+1,600);for(let n of s.annotations){if(n.type!==`rect`||!n.label)continue;let r=a(n,c);if(r.width<=0||r.height<=0)continue;let i=t.measureText(n.label).width,o=n.labelPosition,s=o.endsWith(`left`)?r.x+10:o.endsWith(`right`)?r.x+r.width-10-i:r.x+(r.width-i)/2,l=o.startsWith(`top`)?r.y+10:o.startsWith(`bottom`)?r.y+r.height-10-h:r.y+(r.height-h)/2;t.textAlign=`left`,t.textBaseline=`top`,t.fillStyle=e.toCss(n.labelColor),t.fillText(n.label,s,l),m.push({x:s,y:l,width:i,height:h})}for(let r of s.annotations){if(r.type!==`text`||!r.text)continue;t.font=n(l,l.fontSize,r.weight);let a=i(r,c,t.measureText(r.text).width,h);t.textAlign=`left`,t.textBaseline=`middle`,u(t,r.text,a.x,a.y+a.height/2,e.toCss(r.color),p),m.push(a)}if(s.pointLabels.length){t.font=n(l),t.textAlign=`left`,t.textBaseline=`middle`;let r=e.toCss(l.text,.85),i=d(s.pointLabels,f,e=>t.measureText(e).width,h-2,m);for(let{label:e,box:n}of i)u(t,e.text,n.x,n.y+n.height/2,r,p)}t.restore()};exports.drawBackground=s,exports.drawForeground=f,exports.font=n,exports.lineOf=o,exports.placeLabels=d,exports.rectOf=a,exports.textBox=i;
1
+ const e=require("./color.cjs"),t=require("./layout.cjs");var n=(e,t=e.fontSize,n=400)=>`${n} ${t}px ${e.fontFamily}`,r=e=>Math.round(e)+.5,i=(e,n,r,i)=>{let{plot:a}=n,o=t.toScreen(n,e.x??0,e.y??0),s=n.horizontal?{x:e.y===void 0,y:e.x===void 0}:{x:e.x===void 0,y:e.y===void 0},c=s.x?a.x+a.width/2:o.x,l=s.y?a.y+a.height/2:o.y,u=c-r/2,d=l-i/2;return e.anchor===`top`?d=l+6:e.anchor===`bottom`?d=l-6-i:e.anchor===`left`?u=c+6:e.anchor===`right`&&(u=c-6-r),u=Math.max(a.x+6,Math.min(u,a.x+a.width-6-r)),d=Math.max(a.y+2,Math.min(d,a.y+a.height-2-i)),{x:u,y:d,width:r,height:i}},a=(e,n)=>{let{plot:r}=n,[i,a]=n.horizontal?[r.y,r.y+r.height]:[r.x,r.x+r.width],[o,s]=n.horizontal?[r.x,r.x+r.width]:[r.y,r.y+r.height],c=(e,t,n)=>e<t?t:e>n?n:e;return t.screenRect(n,c(n.xToPx(e.x0??-1/0),i,a),c(n.xToPx(e.x1??1/0),i,a),c(n.yToPx(e.y0??-1/0),o,s),c(n.yToPx(e.y1??1/0),o,s))},o=(e,t)=>({vertical:e.axis===`x`!==t.horizontal,at:e.axis===`x`?t.xToPx(e.value):t.yToPx(e.value)}),s=(t,i)=>{let{scales:o,theme:s,xTicks:c,yTicks:l}=i,{plot:u}=o,d=o.horizontal?i.y:i.x,f=o.horizontal?i.x:i.y,p=o.horizontal?l:c,m=o.horizontal?c:l,h=o.horizontal?o.yToPx:o.xToPx,g=o.horizontal?o.xToPx:o.yToPx;t.clearRect(0,0,i.width,i.height),t.save(),t.beginPath(),t.rect(u.x,u.y,u.width,u.height),t.clip();for(let n of i.annotations){if(n.type!==`rect`)continue;let r=a(n,o);r.width<=0||r.height<=0||(t.fillStyle=e.toCss(n.color,n.opacity),t.fillRect(r.x,r.y,r.width,r.height))}if(t.restore(),t.lineWidth=1,t.strokeStyle=e.toCss(s.grid),t.beginPath(),f.grid)for(let e of m.values){let n=r(g(e));n<u.y-1||n>u.y+u.height+1||(t.moveTo(u.x,n),t.lineTo(u.x+u.width,n))}if(d.grid)for(let e of p.values){let n=r(h(e));n<u.x-1||n>u.x+u.width+1||(t.moveTo(n,u.y),t.lineTo(n,u.y+u.height))}t.stroke();let _=Math.ceil(s.fontSize*1.4);if(t.font=n(s),t.fillStyle=e.toCss(s.textMuted),d.visible){t.strokeStyle=e.toCss(s.axis),t.beginPath();let a=r(u.y+u.height);t.moveTo(u.x,a),t.lineTo(u.x+u.width,a),t.stroke(),t.textBaseline=`top`,t.textAlign=`center`;let o=-1/0,c=p.values.map((e,t)=>({px:h(e),text:p.labels[t]})).sort((e,t)=>e.px-t.px);for(let{px:e,text:n}of c){if(e<u.x-.5||e>u.x+u.width+.5)continue;let r=t.measureText(n).width,a=Math.max(0,Math.min(i.width-r,e-r/2));a<o+6||(o=a+r,t.fillText(n,a+r/2,u.y+u.height+7))}d.title&&(t.font=n(s,s.fontSize+1,500),t.fillStyle=e.toCss(s.text,.8),t.fillText(d.title,u.x+u.width/2,u.y+u.height+_+10))}if(f.visible){t.font=n(s),t.fillStyle=e.toCss(s.textMuted),t.textAlign=`right`,t.textBaseline=`middle`;let r=-1/0,i=m.values.map((e,t)=>({py:g(e),text:m.labels[t]})).sort((e,t)=>e.py-t.py),a=s.fontSize+2;for(let{py:e,text:n}of i)if(!(e<u.y-.5||e>u.y+u.height+.5)){if(o.horizontal){if(e-a/2<r)continue;r=e+a/2}t.fillText(n,u.x-8,e)}f.title&&(t.save(),t.font=n(s,s.fontSize+1,500),t.fillStyle=e.toCss(s.text,.8),t.translate(_/2+4,u.y+u.height/2),t.rotate(-Math.PI/2),t.textAlign=`center`,t.fillText(f.title,0,0),t.restore())}let v=o.horizontal?null:i.y2,y=i.y2Ticks;if(v&&y&&v.visible){let r=u.x+u.width;t.font=n(s),t.fillStyle=e.toCss(s.textMuted),t.textAlign=`left`,t.textBaseline=`middle`,y.values.forEach((e,n)=>{let i=o.yToPx(e);i<u.y-.5||i>u.y+u.height+.5||t.fillText(y.labels[n],r+8,i)}),v.title&&(t.save(),t.font=n(s,s.fontSize+1,500),t.fillStyle=e.toCss(s.text,.8),t.translate(i.width-_/2-4,u.y+u.height/2),t.rotate(Math.PI/2),t.textAlign=`center`,t.fillText(v.title,0,0),t.restore())}},c=(e,t)=>e.x<t.x+t.width&&t.x<e.x+e.width&&e.y<t.y+t.height&&t.y<e.y+e.height,l=(e,t)=>e.x>=t.x&&e.y>=t.y&&e.x+e.width<=t.x+t.width&&e.y+e.height<=t.y+t.height,u=(e,t,n,r,i,a)=>{e.lineWidth=3,e.lineJoin=`round`,e.strokeStyle=a,e.strokeText(t,n,r),e.fillStyle=i,e.fillText(t,n,r)},d=(e,t,n,r,i=[])=>{let a=[];for(let o of e){let e=n(o.text),s=o.r+4,u={x:o.x-e/2,y:o.y-s-r,width:e,height:r},d={x:o.x-e/2,y:o.y+s,width:e,height:r},f={x:o.x+s,y:o.y-r/2,width:e,height:r},p={x:o.x-s-e,y:o.y-r/2,width:e,height:r},m=(o.placement===`above`?[u]:o.placement===`below`?[d]:o.placement===`right`?[f,p]:o.placement===`left`?[p,f]:[{x:o.x+s,y:o.y-r/2,width:e,height:r},{x:o.x-s-e,y:o.y-r/2,width:e,height:r},u,d]).find(e=>l(e,t)&&!i.some(t=>c(t,e)));m&&(i.push(m),a.push({label:o,box:m}))}return a},f=(e,t)=>{for(let n of t){let t=n.points,r=t[0];if(!r)continue;e.strokeStyle=n.color,e.fillStyle=n.color,e.lineWidth=n.width,e.lineJoin=`round`,e.setLineDash([]),e.beginPath(),e.moveTo(r.x,r.y);for(let n=1;n<t.length;n++){let r=t[n],i=t[n+1],a=t[n-1];if(i&&typeof e.arcTo==`function`){let t=Math.min(4,Math.hypot(r.x-a.x,r.y-a.y)/2,Math.hypot(i.x-r.x,i.y-r.y)/2);e.arcTo(r.x,r.y,i.x,i.y,t)}else e.lineTo(r.x,r.y)}e.stroke();let[i,a,o]=n.head;i&&a&&o&&(e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.lineTo(o.x,o.y),e.closePath(),e.fill())}},p=(t,s)=>{let{scales:c,theme:l}=s,{plot:p}=c;s.clear!==!1&&t.clearRect(0,0,s.width,s.height),t.save(),t.beginPath(),t.rect(p.x,p.y,p.width,p.height),t.clip();for(let e of s.connectors??[]){t.strokeStyle=e.color,t.lineWidth=e.width,t.setLineDash([...e.dash]),t.beginPath();let n=e.y0===e.y1,i=n?e.x0:r(e.x0),a=n?r(e.y0):e.y0;t.moveTo(i,a),t.lineTo(n?e.x1:i,n?a:e.y1),t.stroke()}t.setLineDash([]),s.arrows?.length&&f(t,s.arrows);let m=e.toCss(l.background,.9),h=[],g=l.fontSize+4;for(let i of s.annotations){if(i.type!==`line`)continue;let a=e.toCss(i.color);t.strokeStyle=a,t.lineWidth=i.width,t.setLineDash(i.dash),t.beginPath();let s=o(i,c);if(s.vertical){let e=r(s.at);t.moveTo(e,p.y),t.lineTo(e,p.y+p.height),t.stroke(),i.label&&(t.setLineDash([]),t.font=n(l,l.fontSize,500),t.textAlign=`left`,t.textBaseline=`top`,u(t,i.label,e+5,p.y+5,a,m))}else{let e=r(s.at);t.moveTo(p.x,e),t.lineTo(p.x+p.width,e),t.stroke(),i.label&&(t.setLineDash([]),t.font=n(l,l.fontSize,500),t.textAlign=`right`,t.textBaseline=`bottom`,u(t,i.label,p.x+p.width-6,e-3,a,m))}}t.setLineDash([]),t.font=n(l,l.fontSize+1,600);for(let n of s.annotations){if(n.type!==`rect`||!n.label)continue;let r=a(n,c);if(r.width<=0||r.height<=0)continue;let i=t.measureText(n.label).width,o=n.labelPosition,s=o.endsWith(`left`)?r.x+10:o.endsWith(`right`)?r.x+r.width-10-i:r.x+(r.width-i)/2,l=o.startsWith(`top`)?r.y+10:o.startsWith(`bottom`)?r.y+r.height-10-g:r.y+(r.height-g)/2;t.textAlign=`left`,t.textBaseline=`top`,t.fillStyle=e.toCss(n.labelColor),t.fillText(n.label,s,l),h.push({x:s,y:l,width:i,height:g})}for(let r of s.annotations){if(r.type!==`text`||!r.text)continue;t.font=n(l,l.fontSize,r.weight);let a=i(r,c,t.measureText(r.text).width,g);t.textAlign=`left`,t.textBaseline=`middle`,u(t,r.text,a.x,a.y+a.height/2,e.toCss(r.color),m),h.push(a)}if(s.pointLabels.length){t.font=n(l),t.textAlign=`left`,t.textBaseline=`middle`;let r=e.toCss(l.text,.85),i=d(s.pointLabels,p,e=>t.measureText(e).width,g-2,h);for(let{label:e,box:n}of i)u(t,e.text,n.x,n.y+n.height/2,r,m)}t.restore()};exports.drawArrows=f,exports.drawBackground=s,exports.drawForeground=p,exports.font=n,exports.lineOf=o,exports.placeLabels=d,exports.rectOf=a,exports.textBox=i;
2
2
  //# sourceMappingURL=overlay.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.cjs","names":["toScreen","screenRect","toCss","require_color","require_layout","font","theme","weight","size","crisp","v","textBox","s","at","a","free","px","plot","py","x","width","y","height","rectOf","xLo","xHi","yLo","yHi","along","lo","hi","lineOf","drawBackground","input","scales","bottomTicks","yTicks","xTicks","leftTicks","bottomPx","leftPx","ctx","line","base","lastRight","order","i","b","w","text","left","lastBottom","rows","rowHeight","y2","y2Ticks","right","overlaps","inside","r","haloText","halo","color","placeLabels","placed","label","labels","measure","gap","above","below","box","c","occupied","o","drawForeground","labelHeight","where","pos","tx","ty","textColor","t"],"sources":["../../../../charts/src/engine/overlay.ts"],"sourcesContent":["// Canvas2D layers around the data: background (areas, grid, axes, tick\n// labels) and foreground (reference lines, annotation and point labels).\n\nimport { toCss, type Rgba } from \"./color\";\nimport type { AxisTicks } from \"./axis\";\nimport { screenRect, toScreen, type Rect, type Scales } from \"./layout\";\nimport type { AxisModel } from \"./model\";\nimport type { ChartTheme } from \"./theme\";\nimport type { ChartLabelPosition } from \"./types\";\n\nexport interface ResolvedRect {\n type: \"rect\";\n x0?: number;\n x1?: number;\n y0?: number;\n y1?: number;\n color: Rgba;\n opacity: number;\n label?: string;\n labelPosition: ChartLabelPosition;\n labelColor: Rgba;\n}\n\nexport interface ResolvedLine {\n type: \"line\";\n axis: \"x\" | \"y\";\n value: number;\n color: Rgba;\n width: number;\n dash: number[];\n label?: string;\n}\n\nexport interface ResolvedText {\n type: \"text\";\n x?: number;\n y?: number;\n text: string;\n anchor: \"center\" | \"top\" | \"bottom\" | \"left\" | \"right\";\n color: Rgba;\n weight: number;\n}\n\nexport type ResolvedAnnotation = ResolvedRect | ResolvedLine | ResolvedText;\n\nexport interface PointLabel {\n x: number;\n y: number;\n /** Radius of the dot */\n r: number;\n text: string;\n /**\n * Fixed side (bar values: above / below, left / right of horizontal\n * bars); any free side around the dot otherwise\n */\n placement?: \"above\" | \"below\" | \"left\" | \"right\";\n}\n\nexport const font = (theme: ChartTheme, size = theme.fontSize, weight = 400) =>\n `${weight} ${size}px ${theme.fontFamily}`;\n\nconst crisp = (v: number) => Math.round(v) + 0.5;\n\n/** Box of a text annotation, kept inside the plot */\nexport const textBox = (\n a: ResolvedText,\n s: Scales,\n width: number,\n height: number,\n): Rect => {\n const { plot } = s;\n const at = toScreen(s, a.x ?? 0, a.y ?? 0);\n const free = s.horizontal\n ? { x: a.y === undefined, y: a.x === undefined }\n : { x: a.x === undefined, y: a.y === undefined };\n const px = free.x ? plot.x + plot.width / 2 : at.x;\n const py = free.y ? plot.y + plot.height / 2 : at.y;\n const gap = 6;\n let x = px - width / 2;\n let y = py - height / 2;\n if (a.anchor === \"top\") y = py + gap;\n else if (a.anchor === \"bottom\") y = py - gap - height;\n else if (a.anchor === \"left\") x = px + gap;\n else if (a.anchor === \"right\") x = px - gap - width;\n x = Math.max(plot.x + gap, Math.min(x, plot.x + plot.width - gap - width));\n y = Math.max(plot.y + 2, Math.min(y, plot.y + plot.height - 2 - height));\n return { x, y, width, height };\n};\n\n/** Screen box of an area annotation, clipped to the plot */\nexport const rectOf = (a: ResolvedRect, s: Scales): Rect => {\n const { plot } = s;\n // clamp every edge to the plot first: an open edge maps to ±Infinity and\n // `Infinity - Infinity` would make the size NaN (nothing drawn)\n const [xLo, xHi] = s.horizontal\n ? [plot.y, plot.y + plot.height]\n : [plot.x, plot.x + plot.width];\n const [yLo, yHi] = s.horizontal\n ? [plot.x, plot.x + plot.width]\n : [plot.y, plot.y + plot.height];\n const along = (px: number, lo: number, hi: number) =>\n px < lo ? lo : px > hi ? hi : px;\n return screenRect(\n s,\n along(s.xToPx(a.x0 ?? -Infinity), xLo, xHi),\n along(s.xToPx(a.x1 ?? Infinity), xLo, xHi),\n along(s.yToPx(a.y0 ?? -Infinity), yLo, yHi),\n along(s.yToPx(a.y1 ?? Infinity), yLo, yHi),\n );\n};\n\n/**\n * Where a reference line goes: `vertical` lines run at screen x `at`,\n * horizontal ones at screen y `at`\n */\nexport const lineOf = (\n a: ResolvedLine,\n s: Scales,\n): { vertical: boolean; at: number } => {\n const vertical = (a.axis === \"x\") !== s.horizontal;\n return {\n vertical,\n at: a.axis === \"x\" ? s.xToPx(a.value) : s.yToPx(a.value),\n };\n};\n\nexport interface BackgroundInput {\n width: number;\n height: number;\n scales: Scales;\n x: AxisModel;\n y: AxisModel;\n xTicks: AxisTicks;\n yTicks: AxisTicks;\n /** Right axis (dual axis charts) */\n y2?: AxisModel | null;\n y2Ticks?: AxisTicks | null;\n theme: ChartTheme;\n annotations: readonly ResolvedAnnotation[];\n}\n\nexport const drawBackground = (\n ctx: CanvasRenderingContext2D,\n input: BackgroundInput,\n) => {\n const { scales, theme, xTicks, yTicks } = input;\n const { plot } = scales;\n // horizontal charts: the value axis along the bottom, the x axis on the left\n const x = scales.horizontal ? input.y : input.x;\n const y = scales.horizontal ? input.x : input.y;\n const bottomTicks = scales.horizontal ? yTicks : xTicks;\n const leftTicks = scales.horizontal ? xTicks : yTicks;\n const bottomPx = scales.horizontal ? scales.yToPx : scales.xToPx;\n const leftPx = scales.horizontal ? scales.xToPx : scales.yToPx;\n ctx.clearRect(0, 0, input.width, input.height);\n\n // areas\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n for (const a of input.annotations) {\n if (a.type !== \"rect\") continue;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) continue;\n ctx.fillStyle = toCss(a.color, a.opacity);\n ctx.fillRect(r.x, r.y, r.width, r.height);\n }\n ctx.restore();\n\n // grid\n ctx.lineWidth = 1;\n ctx.strokeStyle = toCss(theme.grid);\n ctx.beginPath();\n if (y.grid) {\n for (const v of leftTicks.values) {\n const py = crisp(leftPx(v));\n if (py < plot.y - 1 || py > plot.y + plot.height + 1) continue;\n ctx.moveTo(plot.x, py);\n ctx.lineTo(plot.x + plot.width, py);\n }\n }\n if (x.grid) {\n for (const v of bottomTicks.values) {\n const px = crisp(bottomPx(v));\n if (px < plot.x - 1 || px > plot.x + plot.width + 1) continue;\n ctx.moveTo(px, plot.y);\n ctx.lineTo(px, plot.y + plot.height);\n }\n }\n ctx.stroke();\n\n const line = Math.ceil(theme.fontSize * 1.4);\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n\n // x axis\n if (x.visible) {\n ctx.strokeStyle = toCss(theme.axis);\n ctx.beginPath();\n const base = crisp(plot.y + plot.height);\n ctx.moveTo(plot.x, base);\n ctx.lineTo(plot.x + plot.width, base);\n ctx.stroke();\n ctx.textBaseline = \"top\";\n ctx.textAlign = \"center\";\n let lastRight = -Infinity;\n // left to right (reversed axes list their ticks right to left)\n const order = bottomTicks.values\n .map((v, i) => ({ px: bottomPx(v), text: bottomTicks.labels[i] }))\n .sort((a, b) => a.px - b.px);\n for (const { px, text } of order) {\n if (px < plot.x - 0.5 || px > plot.x + plot.width + 0.5) continue;\n const w = ctx.measureText(text).width;\n const left = Math.max(0, Math.min(input.width - w, px - w / 2));\n if (left < lastRight + 6) continue;\n lastRight = left + w;\n ctx.fillText(text, left + w / 2, plot.y + plot.height + 7);\n }\n if (x.title) {\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.fillText(\n x.title,\n plot.x + plot.width / 2,\n plot.y + plot.height + line + 10,\n );\n }\n }\n\n // y axis\n if (y.visible) {\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n let lastBottom = -Infinity;\n // top to bottom: category rows of horizontal charts never overlap\n const rows = leftTicks.values\n .map((v, i) => ({ py: leftPx(v), text: leftTicks.labels[i] }))\n .sort((a, b) => a.py - b.py);\n const rowHeight = theme.fontSize + 2;\n for (const { py, text } of rows) {\n if (py < plot.y - 0.5 || py > plot.y + plot.height + 0.5) continue;\n if (scales.horizontal) {\n if (py - rowHeight / 2 < lastBottom) continue;\n lastBottom = py + rowHeight / 2;\n }\n ctx.fillText(text, plot.x - 8, py);\n }\n if (y.title) {\n ctx.save();\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.translate(line / 2 + 4, plot.y + plot.height / 2);\n ctx.rotate(-Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.fillText(y.title, 0, 0);\n ctx.restore();\n }\n }\n\n // right axis\n const y2 = scales.horizontal ? null : input.y2;\n const y2Ticks = input.y2Ticks;\n if (y2 && y2Ticks && y2.visible) {\n const right = plot.x + plot.width;\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n y2Ticks.values.forEach((v, i) => {\n const py = scales.yToPx(v);\n if (py < plot.y - 0.5 || py > plot.y + plot.height + 0.5) return;\n ctx.fillText(y2Ticks.labels[i], right + 8, py);\n });\n if (y2.title) {\n ctx.save();\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.translate(input.width - line / 2 - 4, plot.y + plot.height / 2);\n ctx.rotate(Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.fillText(y2.title, 0, 0);\n ctx.restore();\n }\n }\n};\n\nconst overlaps = (a: Rect, b: Rect) =>\n a.x < b.x + b.width &&\n b.x < a.x + a.width &&\n a.y < b.y + b.height &&\n b.y < a.y + a.height;\n\nconst inside = (r: Rect, plot: Rect) =>\n r.x >= plot.x &&\n r.y >= plot.y &&\n r.x + r.width <= plot.x + plot.width &&\n r.y + r.height <= plot.y + plot.height;\n\n/** Text with a halo in the background color (readable over data) */\nconst haloText = (\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n color: string,\n halo: string,\n) => {\n ctx.lineWidth = 3;\n ctx.lineJoin = \"round\";\n ctx.strokeStyle = halo;\n ctx.strokeText(text, x, y);\n ctx.fillStyle = color;\n ctx.fillText(text, x, y);\n};\n\n/** Greedy placement: right, left, above, below the dot; skipped when no slot is free */\nexport const placeLabels = (\n labels: readonly PointLabel[],\n plot: Rect,\n measure: (text: string) => number,\n height: number,\n occupied: Rect[] = [],\n): { label: PointLabel; box: Rect }[] => {\n const placed: { label: PointLabel; box: Rect }[] = [];\n for (const label of labels) {\n const w = measure(label.text);\n const gap = label.r + 4;\n const above = {\n x: label.x - w / 2,\n y: label.y - gap - height,\n width: w,\n height,\n };\n const below = { x: label.x - w / 2, y: label.y + gap, width: w, height };\n const right = {\n x: label.x + gap,\n y: label.y - height / 2,\n width: w,\n height,\n };\n const left = {\n x: label.x - gap - w,\n y: label.y - height / 2,\n width: w,\n height,\n };\n const candidates: Rect[] =\n label.placement === \"above\"\n ? [above]\n : label.placement === \"below\"\n ? [below]\n : label.placement === \"right\"\n ? [right, left]\n : label.placement === \"left\"\n ? [left, right]\n : [\n {\n x: label.x + gap,\n y: label.y - height / 2,\n width: w,\n height,\n },\n {\n x: label.x - gap - w,\n y: label.y - height / 2,\n width: w,\n height,\n },\n above,\n below,\n ];\n const box = candidates.find(\n (c) => inside(c, plot) && !occupied.some((o) => overlaps(o, c)),\n );\n if (!box) continue;\n occupied.push(box);\n placed.push({ label, box });\n }\n return placed;\n};\n\nexport interface ForegroundInput {\n width: number;\n height: number;\n scales: Scales;\n theme: ChartTheme;\n annotations: readonly ResolvedAnnotation[];\n pointLabels: readonly PointLabel[];\n /**\n * Clears the canvas first (off when the layers share one canvas)\n * @default true\n */\n clear?: boolean;\n}\n\nexport const drawForeground = (\n ctx: CanvasRenderingContext2D,\n input: ForegroundInput,\n) => {\n const { scales, theme } = input;\n const { plot } = scales;\n if (input.clear !== false) ctx.clearRect(0, 0, input.width, input.height);\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n\n const halo = toCss(theme.background, 0.9);\n const occupied: Rect[] = [];\n const labelHeight = theme.fontSize + 4;\n\n for (const a of input.annotations) {\n if (a.type !== \"line\") continue;\n const color = toCss(a.color);\n ctx.strokeStyle = color;\n ctx.lineWidth = a.width;\n ctx.setLineDash(a.dash);\n ctx.beginPath();\n const where = lineOf(a, scales);\n if (!where.vertical) {\n const py = crisp(where.at);\n ctx.moveTo(plot.x, py);\n ctx.lineTo(plot.x + plot.width, py);\n ctx.stroke();\n if (a.label) {\n ctx.setLineDash([]);\n ctx.font = font(theme, theme.fontSize, 500);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"bottom\";\n haloText(ctx, a.label, plot.x + plot.width - 6, py - 3, color, halo);\n }\n } else {\n const px = crisp(where.at);\n ctx.moveTo(px, plot.y);\n ctx.lineTo(px, plot.y + plot.height);\n ctx.stroke();\n if (a.label) {\n ctx.setLineDash([]);\n ctx.font = font(theme, theme.fontSize, 500);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n haloText(ctx, a.label, px + 5, plot.y + 5, color, halo);\n }\n }\n }\n ctx.setLineDash([]);\n\n // labels of areas\n ctx.font = font(theme, theme.fontSize + 1, 600);\n for (const a of input.annotations) {\n if (a.type !== \"rect\" || !a.label) continue;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) continue;\n const pad = 10;\n const w = ctx.measureText(a.label).width;\n const pos = a.labelPosition;\n const tx = pos.endsWith(\"left\")\n ? r.x + pad\n : pos.endsWith(\"right\")\n ? r.x + r.width - pad - w\n : r.x + (r.width - w) / 2;\n const ty = pos.startsWith(\"top\")\n ? r.y + pad\n : pos.startsWith(\"bottom\")\n ? r.y + r.height - pad - labelHeight\n : r.y + (r.height - labelHeight) / 2;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n ctx.fillStyle = toCss(a.labelColor);\n ctx.fillText(a.label, tx, ty);\n occupied.push({ x: tx, y: ty, width: w, height: labelHeight });\n }\n\n // free texts\n for (const a of input.annotations) {\n if (a.type !== \"text\" || !a.text) continue;\n ctx.font = font(theme, theme.fontSize, a.weight);\n const box = textBox(a, scales, ctx.measureText(a.text).width, labelHeight);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n haloText(ctx, a.text, box.x, box.y + box.height / 2, toCss(a.color), halo);\n occupied.push(box);\n }\n\n // point labels\n if (input.pointLabels.length) {\n ctx.font = font(theme);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n const textColor = toCss(theme.text, 0.85);\n const placed = placeLabels(\n input.pointLabels,\n plot,\n (t) => ctx.measureText(t).width,\n labelHeight - 2,\n occupied,\n );\n for (const { label, box } of placed) {\n haloText(ctx, label.text, box.x, box.y + box.height / 2, textColor, halo);\n }\n }\n ctx.restore();\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"overlay.cjs","names":["toScreen","screenRect","toCss","require_color","require_layout","font","theme","weight","size","crisp","v","textBox","s","at","a","free","px","plot","py","x","width","y","height","rectOf","xLo","xHi","yLo","yHi","along","lo","hi","lineOf","drawBackground","input","scales","bottomTicks","yTicks","xTicks","leftTicks","bottomPx","leftPx","ctx","line","base","lastRight","order","i","b","w","text","left","lastBottom","rows","rowHeight","y2","y2Ticks","right","overlaps","inside","r","haloText","halo","color","placeLabels","placed","label","labels","measure","gap","above","below","box","c","occupied","o","drawArrows","arrows","pts","first","p","next","prev","tip","b0","b1","drawForeground","x0","y0","labelHeight","where","pos","tx","ty","textColor","t"],"sources":["../../../../charts/src/engine/overlay.ts"],"sourcesContent":["// Canvas2D layers around the data: background (areas, grid, axes, tick\n// labels) and foreground (reference lines, annotation and point labels).\n\nimport { toCss, type Rgba } from \"./color\";\nimport type { AxisTicks } from \"./axis\";\nimport { screenRect, toScreen, type Rect, type Scales } from \"./layout\";\nimport type { AxisModel } from \"./model\";\nimport type { ChartTheme } from \"./theme\";\nimport type { ChartLabelPosition } from \"./types\";\n\nexport interface ResolvedRect {\n type: \"rect\";\n x0?: number;\n x1?: number;\n y0?: number;\n y1?: number;\n color: Rgba;\n opacity: number;\n label?: string;\n labelPosition: ChartLabelPosition;\n labelColor: Rgba;\n}\n\nexport interface ResolvedLine {\n type: \"line\";\n axis: \"x\" | \"y\";\n value: number;\n color: Rgba;\n width: number;\n dash: number[];\n label?: string;\n}\n\nexport interface ResolvedText {\n type: \"text\";\n x?: number;\n y?: number;\n text: string;\n anchor: \"center\" | \"top\" | \"bottom\" | \"left\" | \"right\";\n color: Rgba;\n weight: number;\n}\n\nexport type ResolvedAnnotation = ResolvedRect | ResolvedLine | ResolvedText;\n\nexport interface PointLabel {\n x: number;\n y: number;\n /** Radius of the dot */\n r: number;\n text: string;\n /**\n * Fixed side (bar values: above / below, left / right of horizontal\n * bars); any free side around the dot otherwise\n */\n placement?: \"above\" | \"below\" | \"left\" | \"right\";\n}\n\nexport const font = (theme: ChartTheme, size = theme.fontSize, weight = 400) =>\n `${weight} ${size}px ${theme.fontFamily}`;\n\nconst crisp = (v: number) => Math.round(v) + 0.5;\n\n/** Box of a text annotation, kept inside the plot */\nexport const textBox = (\n a: ResolvedText,\n s: Scales,\n width: number,\n height: number,\n): Rect => {\n const { plot } = s;\n const at = toScreen(s, a.x ?? 0, a.y ?? 0);\n const free = s.horizontal\n ? { x: a.y === undefined, y: a.x === undefined }\n : { x: a.x === undefined, y: a.y === undefined };\n const px = free.x ? plot.x + plot.width / 2 : at.x;\n const py = free.y ? plot.y + plot.height / 2 : at.y;\n const gap = 6;\n let x = px - width / 2;\n let y = py - height / 2;\n if (a.anchor === \"top\") y = py + gap;\n else if (a.anchor === \"bottom\") y = py - gap - height;\n else if (a.anchor === \"left\") x = px + gap;\n else if (a.anchor === \"right\") x = px - gap - width;\n x = Math.max(plot.x + gap, Math.min(x, plot.x + plot.width - gap - width));\n y = Math.max(plot.y + 2, Math.min(y, plot.y + plot.height - 2 - height));\n return { x, y, width, height };\n};\n\n/** Screen box of an area annotation, clipped to the plot */\nexport const rectOf = (a: ResolvedRect, s: Scales): Rect => {\n const { plot } = s;\n // clamp every edge to the plot first: an open edge maps to ±Infinity and\n // `Infinity - Infinity` would make the size NaN (nothing drawn)\n const [xLo, xHi] = s.horizontal\n ? [plot.y, plot.y + plot.height]\n : [plot.x, plot.x + plot.width];\n const [yLo, yHi] = s.horizontal\n ? [plot.x, plot.x + plot.width]\n : [plot.y, plot.y + plot.height];\n const along = (px: number, lo: number, hi: number) =>\n px < lo ? lo : px > hi ? hi : px;\n return screenRect(\n s,\n along(s.xToPx(a.x0 ?? -Infinity), xLo, xHi),\n along(s.xToPx(a.x1 ?? Infinity), xLo, xHi),\n along(s.yToPx(a.y0 ?? -Infinity), yLo, yHi),\n along(s.yToPx(a.y1 ?? Infinity), yLo, yHi),\n );\n};\n\n/**\n * Where a reference line goes: `vertical` lines run at screen x `at`,\n * horizontal ones at screen y `at`\n */\nexport const lineOf = (\n a: ResolvedLine,\n s: Scales,\n): { vertical: boolean; at: number } => {\n const vertical = (a.axis === \"x\") !== s.horizontal;\n return {\n vertical,\n at: a.axis === \"x\" ? s.xToPx(a.value) : s.yToPx(a.value),\n };\n};\n\nexport interface BackgroundInput {\n width: number;\n height: number;\n scales: Scales;\n x: AxisModel;\n y: AxisModel;\n xTicks: AxisTicks;\n yTicks: AxisTicks;\n /** Right axis (dual axis charts) */\n y2?: AxisModel | null;\n y2Ticks?: AxisTicks | null;\n theme: ChartTheme;\n annotations: readonly ResolvedAnnotation[];\n}\n\nexport const drawBackground = (\n ctx: CanvasRenderingContext2D,\n input: BackgroundInput,\n) => {\n const { scales, theme, xTicks, yTicks } = input;\n const { plot } = scales;\n // horizontal charts: the value axis along the bottom, the x axis on the left\n const x = scales.horizontal ? input.y : input.x;\n const y = scales.horizontal ? input.x : input.y;\n const bottomTicks = scales.horizontal ? yTicks : xTicks;\n const leftTicks = scales.horizontal ? xTicks : yTicks;\n const bottomPx = scales.horizontal ? scales.yToPx : scales.xToPx;\n const leftPx = scales.horizontal ? scales.xToPx : scales.yToPx;\n ctx.clearRect(0, 0, input.width, input.height);\n\n // areas\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n for (const a of input.annotations) {\n if (a.type !== \"rect\") continue;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) continue;\n ctx.fillStyle = toCss(a.color, a.opacity);\n ctx.fillRect(r.x, r.y, r.width, r.height);\n }\n ctx.restore();\n\n // grid\n ctx.lineWidth = 1;\n ctx.strokeStyle = toCss(theme.grid);\n ctx.beginPath();\n if (y.grid) {\n for (const v of leftTicks.values) {\n const py = crisp(leftPx(v));\n if (py < plot.y - 1 || py > plot.y + plot.height + 1) continue;\n ctx.moveTo(plot.x, py);\n ctx.lineTo(plot.x + plot.width, py);\n }\n }\n if (x.grid) {\n for (const v of bottomTicks.values) {\n const px = crisp(bottomPx(v));\n if (px < plot.x - 1 || px > plot.x + plot.width + 1) continue;\n ctx.moveTo(px, plot.y);\n ctx.lineTo(px, plot.y + plot.height);\n }\n }\n ctx.stroke();\n\n const line = Math.ceil(theme.fontSize * 1.4);\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n\n // x axis\n if (x.visible) {\n ctx.strokeStyle = toCss(theme.axis);\n ctx.beginPath();\n const base = crisp(plot.y + plot.height);\n ctx.moveTo(plot.x, base);\n ctx.lineTo(plot.x + plot.width, base);\n ctx.stroke();\n ctx.textBaseline = \"top\";\n ctx.textAlign = \"center\";\n let lastRight = -Infinity;\n // left to right (reversed axes list their ticks right to left)\n const order = bottomTicks.values\n .map((v, i) => ({ px: bottomPx(v), text: bottomTicks.labels[i] }))\n .sort((a, b) => a.px - b.px);\n for (const { px, text } of order) {\n if (px < plot.x - 0.5 || px > plot.x + plot.width + 0.5) continue;\n const w = ctx.measureText(text).width;\n const left = Math.max(0, Math.min(input.width - w, px - w / 2));\n if (left < lastRight + 6) continue;\n lastRight = left + w;\n ctx.fillText(text, left + w / 2, plot.y + plot.height + 7);\n }\n if (x.title) {\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.fillText(\n x.title,\n plot.x + plot.width / 2,\n plot.y + plot.height + line + 10,\n );\n }\n }\n\n // y axis\n if (y.visible) {\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n let lastBottom = -Infinity;\n // top to bottom: category rows of horizontal charts never overlap\n const rows = leftTicks.values\n .map((v, i) => ({ py: leftPx(v), text: leftTicks.labels[i] }))\n .sort((a, b) => a.py - b.py);\n const rowHeight = theme.fontSize + 2;\n for (const { py, text } of rows) {\n if (py < plot.y - 0.5 || py > plot.y + plot.height + 0.5) continue;\n if (scales.horizontal) {\n if (py - rowHeight / 2 < lastBottom) continue;\n lastBottom = py + rowHeight / 2;\n }\n ctx.fillText(text, plot.x - 8, py);\n }\n if (y.title) {\n ctx.save();\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.translate(line / 2 + 4, plot.y + plot.height / 2);\n ctx.rotate(-Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.fillText(y.title, 0, 0);\n ctx.restore();\n }\n }\n\n // right axis\n const y2 = scales.horizontal ? null : input.y2;\n const y2Ticks = input.y2Ticks;\n if (y2 && y2Ticks && y2.visible) {\n const right = plot.x + plot.width;\n ctx.font = font(theme);\n ctx.fillStyle = toCss(theme.textMuted);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n y2Ticks.values.forEach((v, i) => {\n const py = scales.yToPx(v);\n if (py < plot.y - 0.5 || py > plot.y + plot.height + 0.5) return;\n ctx.fillText(y2Ticks.labels[i], right + 8, py);\n });\n if (y2.title) {\n ctx.save();\n ctx.font = font(theme, theme.fontSize + 1, 500);\n ctx.fillStyle = toCss(theme.text, 0.8);\n ctx.translate(input.width - line / 2 - 4, plot.y + plot.height / 2);\n ctx.rotate(Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.fillText(y2.title, 0, 0);\n ctx.restore();\n }\n }\n};\n\nconst overlaps = (a: Rect, b: Rect) =>\n a.x < b.x + b.width &&\n b.x < a.x + a.width &&\n a.y < b.y + b.height &&\n b.y < a.y + a.height;\n\nconst inside = (r: Rect, plot: Rect) =>\n r.x >= plot.x &&\n r.y >= plot.y &&\n r.x + r.width <= plot.x + plot.width &&\n r.y + r.height <= plot.y + plot.height;\n\n/** Text with a halo in the background color (readable over data) */\nconst haloText = (\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n color: string,\n halo: string,\n) => {\n ctx.lineWidth = 3;\n ctx.lineJoin = \"round\";\n ctx.strokeStyle = halo;\n ctx.strokeText(text, x, y);\n ctx.fillStyle = color;\n ctx.fillText(text, x, y);\n};\n\n/** Greedy placement: right, left, above, below the dot; skipped when no slot is free */\nexport const placeLabels = (\n labels: readonly PointLabel[],\n plot: Rect,\n measure: (text: string) => number,\n height: number,\n occupied: Rect[] = [],\n): { label: PointLabel; box: Rect }[] => {\n const placed: { label: PointLabel; box: Rect }[] = [];\n for (const label of labels) {\n const w = measure(label.text);\n const gap = label.r + 4;\n const above = {\n x: label.x - w / 2,\n y: label.y - gap - height,\n width: w,\n height,\n };\n const below = { x: label.x - w / 2, y: label.y + gap, width: w, height };\n const right = {\n x: label.x + gap,\n y: label.y - height / 2,\n width: w,\n height,\n };\n const left = {\n x: label.x - gap - w,\n y: label.y - height / 2,\n width: w,\n height,\n };\n const candidates: Rect[] =\n label.placement === \"above\"\n ? [above]\n : label.placement === \"below\"\n ? [below]\n : label.placement === \"right\"\n ? [right, left]\n : label.placement === \"left\"\n ? [left, right]\n : [\n {\n x: label.x + gap,\n y: label.y - height / 2,\n width: w,\n height,\n },\n {\n x: label.x - gap - w,\n y: label.y - height / 2,\n width: w,\n height,\n },\n above,\n below,\n ];\n const box = candidates.find(\n (c) => inside(c, plot) && !occupied.some((o) => overlaps(o, c)),\n );\n if (!box) continue;\n occupied.push(box);\n placed.push({ label, box });\n }\n return placed;\n};\n\nexport interface ForegroundInput {\n width: number;\n height: number;\n scales: Scales;\n theme: ChartTheme;\n annotations: readonly ResolvedAnnotation[];\n pointLabels: readonly PointLabel[];\n /**\n * Clears the canvas first (off when the layers share one canvas)\n * @default true\n */\n clear?: boolean;\n /** Lines between consecutive bars (waterfall connectors), drawn first */\n connectors?: readonly {\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n color: string;\n width: number;\n dash: readonly number[];\n }[];\n /** Dependency arrows (Gantt charts), drawn over the connectors */\n arrows?: readonly ArrowPath[];\n}\n\n/** An elbow arrow in stage pixels (see `dependencyArrows`) */\nexport interface ArrowPath {\n points: readonly { x: number; y: number }[];\n head: readonly { x: number; y: number }[];\n color: string;\n width: number;\n}\n\n/** Elbow arrows: polylines with rounded corners and filled heads */\nexport const drawArrows = (\n ctx: CanvasRenderingContext2D,\n arrows: readonly ArrowPath[],\n) => {\n for (const a of arrows) {\n const pts = a.points;\n const first = pts[0];\n if (!first) continue;\n ctx.strokeStyle = a.color;\n ctx.fillStyle = a.color;\n ctx.lineWidth = a.width;\n ctx.lineJoin = \"round\";\n ctx.setLineDash([]);\n ctx.beginPath();\n ctx.moveTo(first.x, first.y);\n for (let i = 1; i < pts.length; i++) {\n const p = pts[i]!;\n const next = pts[i + 1];\n const prev = pts[i - 1]!;\n if (next && typeof ctx.arcTo === \"function\") {\n // rounded elbow, at most half of the shorter leg\n const r = Math.min(\n 4,\n Math.hypot(p.x - prev.x, p.y - prev.y) / 2,\n Math.hypot(next.x - p.x, next.y - p.y) / 2,\n );\n ctx.arcTo(p.x, p.y, next.x, next.y, r);\n } else {\n ctx.lineTo(p.x, p.y);\n }\n }\n ctx.stroke();\n const [tip, b0, b1] = a.head;\n if (tip && b0 && b1) {\n ctx.beginPath();\n ctx.moveTo(tip.x, tip.y);\n ctx.lineTo(b0.x, b0.y);\n ctx.lineTo(b1.x, b1.y);\n ctx.closePath();\n ctx.fill();\n }\n }\n};\n\nexport const drawForeground = (\n ctx: CanvasRenderingContext2D,\n input: ForegroundInput,\n) => {\n const { scales, theme } = input;\n const { plot } = scales;\n if (input.clear !== false) ctx.clearRect(0, 0, input.width, input.height);\n ctx.save();\n ctx.beginPath();\n ctx.rect(plot.x, plot.y, plot.width, plot.height);\n ctx.clip();\n\n for (const c of input.connectors ?? []) {\n ctx.strokeStyle = c.color;\n ctx.lineWidth = c.width;\n ctx.setLineDash([...c.dash]);\n ctx.beginPath();\n // crisp hairlines along the pixel grid\n const along = c.y0 === c.y1;\n const x0 = along ? c.x0 : crisp(c.x0);\n const y0 = along ? crisp(c.y0) : c.y0;\n ctx.moveTo(x0, y0);\n ctx.lineTo(along ? c.x1 : x0, along ? y0 : c.y1);\n ctx.stroke();\n }\n ctx.setLineDash([]);\n if (input.arrows?.length) drawArrows(ctx, input.arrows);\n\n const halo = toCss(theme.background, 0.9);\n const occupied: Rect[] = [];\n const labelHeight = theme.fontSize + 4;\n\n for (const a of input.annotations) {\n if (a.type !== \"line\") continue;\n const color = toCss(a.color);\n ctx.strokeStyle = color;\n ctx.lineWidth = a.width;\n ctx.setLineDash(a.dash);\n ctx.beginPath();\n const where = lineOf(a, scales);\n if (!where.vertical) {\n const py = crisp(where.at);\n ctx.moveTo(plot.x, py);\n ctx.lineTo(plot.x + plot.width, py);\n ctx.stroke();\n if (a.label) {\n ctx.setLineDash([]);\n ctx.font = font(theme, theme.fontSize, 500);\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"bottom\";\n haloText(ctx, a.label, plot.x + plot.width - 6, py - 3, color, halo);\n }\n } else {\n const px = crisp(where.at);\n ctx.moveTo(px, plot.y);\n ctx.lineTo(px, plot.y + plot.height);\n ctx.stroke();\n if (a.label) {\n ctx.setLineDash([]);\n ctx.font = font(theme, theme.fontSize, 500);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n haloText(ctx, a.label, px + 5, plot.y + 5, color, halo);\n }\n }\n }\n ctx.setLineDash([]);\n\n // labels of areas\n ctx.font = font(theme, theme.fontSize + 1, 600);\n for (const a of input.annotations) {\n if (a.type !== \"rect\" || !a.label) continue;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) continue;\n const pad = 10;\n const w = ctx.measureText(a.label).width;\n const pos = a.labelPosition;\n const tx = pos.endsWith(\"left\")\n ? r.x + pad\n : pos.endsWith(\"right\")\n ? r.x + r.width - pad - w\n : r.x + (r.width - w) / 2;\n const ty = pos.startsWith(\"top\")\n ? r.y + pad\n : pos.startsWith(\"bottom\")\n ? r.y + r.height - pad - labelHeight\n : r.y + (r.height - labelHeight) / 2;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n ctx.fillStyle = toCss(a.labelColor);\n ctx.fillText(a.label, tx, ty);\n occupied.push({ x: tx, y: ty, width: w, height: labelHeight });\n }\n\n // free texts\n for (const a of input.annotations) {\n if (a.type !== \"text\" || !a.text) continue;\n ctx.font = font(theme, theme.fontSize, a.weight);\n const box = textBox(a, scales, ctx.measureText(a.text).width, labelHeight);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n haloText(ctx, a.text, box.x, box.y + box.height / 2, toCss(a.color), halo);\n occupied.push(box);\n }\n\n // point labels\n if (input.pointLabels.length) {\n ctx.font = font(theme);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n const textColor = toCss(theme.text, 0.85);\n const placed = placeLabels(\n input.pointLabels,\n plot,\n (t) => ctx.measureText(t).width,\n labelHeight - 2,\n occupied,\n );\n for (const { label, box } of placed) {\n haloText(ctx, label.text, box.x, box.y + box.height / 2, textColor, halo);\n }\n }\n ctx.restore();\n};\n"],"mappings":"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"}
@@ -92,5 +92,32 @@ export interface ForegroundInput {
92
92
  * @default true
93
93
  */
94
94
  clear?: boolean;
95
+ /** Lines between consecutive bars (waterfall connectors), drawn first */
96
+ connectors?: readonly {
97
+ x0: number;
98
+ y0: number;
99
+ x1: number;
100
+ y1: number;
101
+ color: string;
102
+ width: number;
103
+ dash: readonly number[];
104
+ }[];
105
+ /** Dependency arrows (Gantt charts), drawn over the connectors */
106
+ arrows?: readonly ArrowPath[];
95
107
  }
108
+ /** An elbow arrow in stage pixels (see `dependencyArrows`) */
109
+ export interface ArrowPath {
110
+ points: readonly {
111
+ x: number;
112
+ y: number;
113
+ }[];
114
+ head: readonly {
115
+ x: number;
116
+ y: number;
117
+ }[];
118
+ color: string;
119
+ width: number;
120
+ }
121
+ /** Elbow arrows: polylines with rounded corners and filled heads */
122
+ export declare const drawArrows: (ctx: CanvasRenderingContext2D, arrows: readonly ArrowPath[]) => void;
96
123
  export declare const drawForeground: (ctx: CanvasRenderingContext2D, input: ForegroundInput) => void;
@@ -92,5 +92,32 @@ export interface ForegroundInput {
92
92
  * @default true
93
93
  */
94
94
  clear?: boolean;
95
+ /** Lines between consecutive bars (waterfall connectors), drawn first */
96
+ connectors?: readonly {
97
+ x0: number;
98
+ y0: number;
99
+ x1: number;
100
+ y1: number;
101
+ color: string;
102
+ width: number;
103
+ dash: readonly number[];
104
+ }[];
105
+ /** Dependency arrows (Gantt charts), drawn over the connectors */
106
+ arrows?: readonly ArrowPath[];
95
107
  }
108
+ /** An elbow arrow in stage pixels (see `dependencyArrows`) */
109
+ export interface ArrowPath {
110
+ points: readonly {
111
+ x: number;
112
+ y: number;
113
+ }[];
114
+ head: readonly {
115
+ x: number;
116
+ y: number;
117
+ }[];
118
+ color: string;
119
+ width: number;
120
+ }
121
+ /** Elbow arrows: polylines with rounded corners and filled heads */
122
+ export declare const drawArrows: (ctx: CanvasRenderingContext2D, arrows: readonly ArrowPath[]) => void;
96
123
  export declare const drawForeground: (ctx: CanvasRenderingContext2D, input: ForegroundInput) => void;