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
@@ -0,0 +1,297 @@
1
+ import { resolveRendererPreference as e } from "../defaults.js";
2
+ import { compileProgram as t, glContextAttributes as n, isSoftwareRenderer as r } from "../renderers/gl.js";
3
+ import { claimGlSlot as i } from "../renderers/gl-budget.js";
4
+ import { rendererCandidates as a } from "../renderers/detect.js";
5
+ //#region src/engine/orderbook/field.ts
6
+ var o = 1024, s = (e, t) => {
7
+ let n = /* @__PURE__ */ new Uint32Array(1025), r = e.length - 1;
8
+ for (let i = 0; i <= o; i++) {
9
+ let a = Math.min(1, Math.max(0, t(i / o)));
10
+ n[i] = e[Math.round(a * r)] ?? 0;
11
+ }
12
+ return n;
13
+ }, c = (e, t, n = 16384) => {
14
+ let r = e.length, i = Math.min(r, Math.max(1, n)), a = r % 7919 ? 7919 : 7907, o = (t) => e[i === r ? t : t * a % r], s = 0;
15
+ for (let e = 0; e < i; e++) o(e) > 0 && s++;
16
+ if (!s) return NaN;
17
+ let c = new Float64Array(s), l = 0;
18
+ for (let e = 0; e < i; e++) {
19
+ let t = o(e);
20
+ t > 0 && (c[l++] = t);
21
+ }
22
+ c.sort();
23
+ let u = Math.min(s - 1, Math.max(0, t * (s - 1))), d = Math.floor(u), f = Math.min(s - 1, d + 1);
24
+ return c[d] + (c[f] - c[d]) * (u - d);
25
+ }, l = (e, t) => {
26
+ let { sources: n, step: r, tick: i, x0: a, x1: o, y0: s, y1: c, end: l } = e;
27
+ if (!(r > 0) || !(i > 0) || !(o > a) || !(c > s) || !Number.isFinite(a + o + s + c)) return null;
28
+ let u = r * Math.max(1, Math.ceil((o - a) / r / Math.max(1, e.maxWidth))), d = Math.floor(a / u) * u, f = Math.max(1, Math.ceil((o - d) / u)), p = Math.round(s / i), m = Math.round(c / i), h = Math.max(1, Math.ceil((m - p + 1) / Math.max(1, e.maxHeight))), g = Math.floor(p / h) * h, _ = Math.max(1, Math.ceil((m + 1 - g) / h)), v = f * _, y = t && t.cells.length === v ? t.cells.fill(0) : new Float32Array(v), b = (e, t) => {
29
+ let { bins: n, sizes: r } = e;
30
+ for (let e = 0; e < r.length; e++) {
31
+ let i = r[e];
32
+ if (!(i > 0)) continue;
33
+ let a = Math.floor((n[e] - g) / h);
34
+ if (a < 0 || a >= _) continue;
35
+ let o = (_ - 1 - a) * f + t;
36
+ i > y[o] && (y[o] = i);
37
+ }
38
+ }, x = (e) => {
39
+ for (let t = 0, n = e; t < _; t++, n += f) y[n] = y[n - 1];
40
+ }, S = 0, C = n.length;
41
+ for (; S < C;) {
42
+ let e = S + C >>> 1;
43
+ n[e].time < d ? S = e + 1 : C = e;
44
+ }
45
+ let w = S, T = S > 0 ? n[S - 1] : null;
46
+ for (let e = 0; e < f; e++) {
47
+ let t = d + e * u;
48
+ if (t >= l) break;
49
+ let r = t + u, i = !1;
50
+ for (; w < n.length && n[w].time < r;) b(n[w], e), T = n[w], i = !0, w++;
51
+ !i && T && (e === 0 ? b(T, 0) : x(e));
52
+ }
53
+ return {
54
+ width: f,
55
+ height: _,
56
+ pixels: t && t.pixels.length === v ? t.pixels : new Uint32Array(v),
57
+ cells: y,
58
+ t0: d,
59
+ t1: d + f * u,
60
+ p0: (g - .5) * i,
61
+ p1: (g + _ * h - .5) * i,
62
+ version: (t?.version ?? 0) + 1
63
+ };
64
+ }, u = (e, t, n) => {
65
+ let { cells: r, pixels: i } = e, a = t.length - 1, o = t[0] ?? 0, s = n > 0 && Number.isFinite(n) ? n : 0;
66
+ for (let e = 0; e < r.length; e++) {
67
+ let n = r[e] * s;
68
+ i[e] = n > 0 ? t[n >= a ? a : n | 0] : o;
69
+ }
70
+ e.version++;
71
+ }, d = "\nattribute vec2 a_corner;\nuniform vec4 u_rect;\nvarying vec2 v_uv;\nvoid main() {\n v_uv = a_corner;\n gl_Position = vec4(mix(u_rect.x, u_rect.z, a_corner.x), mix(u_rect.y, u_rect.w, a_corner.y), 0.0, 1.0);\n}", f = "\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\nuniform sampler2D u_texture;\nvarying vec2 v_uv;\nvoid main() {\n gl_FragColor = vec4(texture2D(u_texture, v_uv).rgb, 1.0);\n}", p = (e, t, n) => [
72
+ e[0] / t * 2 - 1,
73
+ 1 - e[1] / n * 2,
74
+ e[2] / t * 2 - 1,
75
+ 1 - e[3] / n * 2
76
+ ], m = (e) => new Uint8Array(e.pixels.buffer, e.pixels.byteOffset, e.width * e.height * 4), h = (e, a, o, s = !1) => {
77
+ let c = {
78
+ ...n(s),
79
+ alpha: !1,
80
+ premultipliedAlpha: !1
81
+ }, l = e.getContext(a, c);
82
+ if (!l) return null;
83
+ let u = () => (l.getExtension("WEBGL_lose_context")?.loseContext(), null);
84
+ if (s && r(l)) return u();
85
+ let h = () => {
86
+ let e = t(l, {
87
+ vertex: d,
88
+ fragment: f
89
+ }, ["a_corner"]);
90
+ if (!e) return null;
91
+ let n = l.createBuffer();
92
+ l.bindBuffer(l.ARRAY_BUFFER, n), l.bufferData(l.ARRAY_BUFFER, new Float32Array([
93
+ 0,
94
+ 0,
95
+ 1,
96
+ 0,
97
+ 0,
98
+ 1,
99
+ 1,
100
+ 1
101
+ ]), l.STATIC_DRAW);
102
+ let r = l.createTexture();
103
+ return l.bindTexture(l.TEXTURE_2D, r), l.texParameteri(l.TEXTURE_2D, l.TEXTURE_MIN_FILTER, l.NEAREST), l.texParameteri(l.TEXTURE_2D, l.TEXTURE_MAG_FILTER, l.NEAREST), l.texParameteri(l.TEXTURE_2D, l.TEXTURE_WRAP_S, l.CLAMP_TO_EDGE), l.texParameteri(l.TEXTURE_2D, l.TEXTURE_WRAP_T, l.CLAMP_TO_EDGE), {
104
+ program: e,
105
+ rectAt: l.getUniformLocation(e.program, "u_rect"),
106
+ textureAt: l.getUniformLocation(e.program, "u_texture"),
107
+ corners: n,
108
+ texture: r
109
+ };
110
+ }, g = h();
111
+ if (!g) return u();
112
+ let _ = null, v = -1, y = [0, 0], b = !1, x = !1, S = null, C = () => {
113
+ g = null, _ = null, v = -1, y = [0, 0];
114
+ }, w = i(e, l, {
115
+ suspend: C,
116
+ restore: () => {
117
+ C(), g = h(), g ? S && T(S.grid, S.rect, S.clear) : (x = !0, b || o());
118
+ },
119
+ lost: () => {
120
+ x = !0, b || o();
121
+ }
122
+ }), T = (t, n, r) => {
123
+ if (!g) return;
124
+ let { program: i, rectAt: a, textureAt: o, corners: s, texture: c } = g, u = e.width, d = e.height;
125
+ l.viewport(0, 0, u, d), l.disable(l.BLEND), l.clearColor(r[0], r[1], r[2], 1), l.clear(l.COLOR_BUFFER_BIT), t && (l.useProgram(i.program), l.activeTexture(l.TEXTURE0), l.bindTexture(l.TEXTURE_2D, c), (t !== _ || t.version !== v) && (l.pixelStorei(l.UNPACK_ALIGNMENT, 4), l.pixelStorei(l.UNPACK_FLIP_Y_WEBGL, !1), l.pixelStorei(l.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !1), y[0] === t.width && y[1] === t.height ? l.texSubImage2D(l.TEXTURE_2D, 0, 0, 0, t.width, t.height, l.RGBA, l.UNSIGNED_BYTE, m(t)) : (l.texImage2D(l.TEXTURE_2D, 0, l.RGBA, t.width, t.height, 0, l.RGBA, l.UNSIGNED_BYTE, m(t)), y = [t.width, t.height]), _ = t, v = t.version), l.uniform1i(o, 0), l.uniform4fv(a, p(n, u, d)), l.bindBuffer(l.ARRAY_BUFFER, s), l.enableVertexAttribArray(0), l.vertexAttribPointer(0, 2, l.FLOAT, !1, 0, 0), l.drawArrays(l.TRIANGLE_STRIP, 0, 4));
126
+ };
127
+ return {
128
+ kind: a,
129
+ canvas: e,
130
+ resize(t, n) {
131
+ e.width = Math.max(1, t), e.height = Math.max(1, n);
132
+ },
133
+ render(e, t, n) {
134
+ b || (S = {
135
+ grid: e,
136
+ rect: t,
137
+ clear: n
138
+ }, !(x || !w.use() || l.isContextLost()) && T(e, t, n));
139
+ },
140
+ destroy() {
141
+ b = !0, S = null, w.release(), g && !l.isContextLost() && (l.deleteTexture(g.texture), l.deleteBuffer(g.corners), l.deleteProgram(g.program.program), l.getExtension("WEBGL_lose_context")?.loseContext()), g = null;
142
+ }
143
+ };
144
+ }, g = "\nstruct Uniforms { rect: vec4f };\n@group(0) @binding(0) var<uniform> u: Uniforms;\n@group(0) @binding(1) var heat: texture_2d<f32>;\n@group(0) @binding(2) var nearest: sampler;\nstruct Varyings {\n @builtin(position) position: vec4f,\n @location(0) uv: vec2f,\n};\n@vertex fn vs(@builtin(vertex_index) i: u32) -> Varyings {\n let c = vec2f(f32(i & 1u), f32(i >> 1u));\n var out: Varyings;\n out.position = vec4f(mix(u.rect.x, u.rect.z, c.x), mix(u.rect.y, u.rect.w, c.y), 0.0, 1.0);\n out.uv = c;\n return out;\n}\n@fragment fn fs(v: Varyings) -> @location(0) vec4f {\n return vec4f(textureSample(heat, nearest, v.uv).rgb, 1.0);\n}", _ = 1, v = 2, y = async (e, t, n = !1) => {
145
+ let r = typeof navigator < "u" ? navigator.gpu : void 0;
146
+ if (!r) return null;
147
+ let i = await r.requestAdapter();
148
+ if (!i) return null;
149
+ let a = i;
150
+ if (n && (a.info?.isFallbackAdapter || a.isFallbackAdapter)) return null;
151
+ let o = await i.requestDevice(), s = e.getContext("webgpu");
152
+ if (!s) return o.destroy(), null;
153
+ let c = r.getPreferredCanvasFormat();
154
+ s.configure({
155
+ device: o,
156
+ format: c,
157
+ alphaMode: "opaque"
158
+ });
159
+ let l = !1;
160
+ o.lost.then(() => {
161
+ l || t();
162
+ });
163
+ let u = o.createBindGroupLayout({ entries: [
164
+ {
165
+ binding: 0,
166
+ visibility: _,
167
+ buffer: { type: "uniform" }
168
+ },
169
+ {
170
+ binding: 1,
171
+ visibility: v,
172
+ texture: {}
173
+ },
174
+ {
175
+ binding: 2,
176
+ visibility: v,
177
+ sampler: {}
178
+ }
179
+ ] }), d = o.createShaderModule({ code: g }), f = o.createRenderPipeline({
180
+ layout: o.createPipelineLayout({ bindGroupLayouts: [u] }),
181
+ vertex: {
182
+ module: d,
183
+ entryPoint: "vs"
184
+ },
185
+ fragment: {
186
+ module: d,
187
+ entryPoint: "fs",
188
+ targets: [{ format: c }]
189
+ },
190
+ primitive: { topology: "triangle-strip" }
191
+ }), h = o.createSampler({
192
+ magFilter: "nearest",
193
+ minFilter: "nearest",
194
+ addressModeU: "clamp-to-edge",
195
+ addressModeV: "clamp-to-edge"
196
+ }), y = o.createBuffer({
197
+ size: 16,
198
+ usage: 72
199
+ }), b = null, x = null, S = null, C = -1;
200
+ return {
201
+ kind: "webgpu",
202
+ canvas: e,
203
+ resize(t, n) {
204
+ e.width = Math.max(1, t), e.height = Math.max(1, n);
205
+ },
206
+ render(t, n, r) {
207
+ if (l) return;
208
+ t && (t !== S || t.version !== C) && ((!b || b.width !== t.width || b.height !== t.height) && (b?.destroy(), b = o.createTexture({
209
+ size: {
210
+ width: t.width,
211
+ height: t.height
212
+ },
213
+ format: "rgba8unorm",
214
+ usage: 6
215
+ }), x = o.createBindGroup({
216
+ layout: u,
217
+ entries: [
218
+ {
219
+ binding: 0,
220
+ resource: { buffer: y }
221
+ },
222
+ {
223
+ binding: 1,
224
+ resource: b.createView()
225
+ },
226
+ {
227
+ binding: 2,
228
+ resource: h
229
+ }
230
+ ]
231
+ })), o.queue.writeTexture({ texture: b }, m(t), {
232
+ bytesPerRow: t.width * 4,
233
+ rowsPerImage: t.height
234
+ }, {
235
+ width: t.width,
236
+ height: t.height
237
+ }), S = t, C = t.version), o.queue.writeBuffer(y, 0, new Float32Array(p(n, e.width, e.height)));
238
+ let i = o.createCommandEncoder(), a = i.beginRenderPass({ colorAttachments: [{
239
+ view: s.getCurrentTexture().createView(),
240
+ clearValue: {
241
+ r: r[0],
242
+ g: r[1],
243
+ b: r[2],
244
+ a: 1
245
+ },
246
+ loadOp: "clear",
247
+ storeOp: "store"
248
+ }] });
249
+ t && x && (a.setPipeline(f), a.setBindGroup(0, x), a.draw(4)), a.end(), o.queue.submit([i.finish()]);
250
+ },
251
+ destroy() {
252
+ l = !0, b?.destroy(), y.destroy(), s.unconfigure(), o.destroy();
253
+ }
254
+ };
255
+ }, b = (e) => {
256
+ let t = e.getContext("2d", { alpha: !1 });
257
+ if (!t) return null;
258
+ let n = e.ownerDocument.createElement("canvas"), r = n.getContext("2d"), i = null, a = -1;
259
+ return {
260
+ kind: "canvas2d",
261
+ canvas: e,
262
+ resize(t, n) {
263
+ e.width = Math.max(1, t), e.height = Math.max(1, n);
264
+ },
265
+ render(o, s, c) {
266
+ if (t.setTransform(1, 0, 0, 1, 0, 0), t.fillStyle = `rgb(${Math.round(c[0] * 255)}, ${Math.round(c[1] * 255)}, ${Math.round(c[2] * 255)})`, t.fillRect(0, 0, e.width, e.height), o && r) {
267
+ if (o !== i || o.version !== a) {
268
+ n.width !== o.width && (n.width = o.width), n.height !== o.height && (n.height = o.height);
269
+ let e = r.createImageData?.(o.width, o.height);
270
+ if (!e?.data) return;
271
+ e.data.set(m(o)), r.putImageData(e, 0, 0), i = o, a = o.version;
272
+ }
273
+ t.imageSmoothingEnabled = !1, t.drawImage(n, s[0], s[1], s[2] - s[0], s[3] - s[1]);
274
+ }
275
+ },
276
+ destroy() {
277
+ i = null;
278
+ }
279
+ };
280
+ }, x = async (t, n, r, i) => {
281
+ let o = e(t);
282
+ for (let e of a(o, i)) {
283
+ let t = o === "auto" || o !== e, i;
284
+ try {
285
+ let a = n(), o = () => r(e);
286
+ i = e === "webgpu" ? await y(a, o, t) : e === "canvas2d" ? b(a) : h(a, e, o, t);
287
+ } catch {
288
+ i = null;
289
+ }
290
+ if (i) return i;
291
+ }
292
+ return null;
293
+ };
294
+ //#endregion
295
+ export { o as HEAT_TABLE_SIZE, l as buildHeatGrid, b as createCanvasHeatField, h as createGlHeatField, x as createHeatFieldRenderer, y as createWebGpuHeatField, s as heatTable, u as paintHeatGrid, c as percentile };
296
+
297
+ //# sourceMappingURL=field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field.js","names":["HEAT_TABLE_SIZE","heatTable","table","last","lut","j","t","curve","percentile","len","values","m","limit","prime","value","n","sorted","k","v","at","q","lo","hi","buildHeatGrid","input","step","tick","x1","x0","y1","y0","g","gs","width","binLo","binHi","ry","base","height","count","cells","reuse","plot","source","sizes","s","r","bins","idx","i","repeat","sources","mid","previous","start","end","stop","hit","paintHeatGrid","grid","cold","scale","GLSL_VERTEX","GLSL_FRAGMENT","clipRect","rect","bytesOf","createGlHeatField","attributes","glContextAttributes","requireHardware","gl","canvas","kind","reject","isSoftwareRenderer","setup","program","compileProgram","corners","texture","objects","uploaded","uploadedVersion","size","destroyed","lost","forget","slot","claimGlSlot","draw","onLost","w","h","clear","textureAt","rectAt","WGSL","STAGE_VERTEX","STAGE_FRAGMENT","createWebGpuHeatField","gpu","adapter","info","device","context","format","layout","module","pipeline","sampler","uniform","bindGroup","encoder","pass","createCanvasHeatField","ctx","image","imageCtx","data","createHeatFieldRenderer","preference","resolveRendererPreference","requested","rendererCandidates","exclude","field","makeCanvas"],"sources":["../../../../../charts/src/engine/orderbook/field.ts"],"sourcesContent":["// Heat field of the order book heatmap. The liquidity of the visible\n// window is rasterized on the CPU into a small image, one texel per column\n// (sampling interval) and price row (tick), and drawn as ONE textured quad\n// with nearest filtering over a clear of the coldest color:\n// - rows and columns abut by construction (every device pixel samples\n// exactly one texel), so there are no anti-aliased seams between cells;\n// - a column fills until the next snapshot (gaps repeat the last book) and\n// the live one fills to the right edge;\n// - empty cells are the cold end of the ramp, never a transparent hole;\n// - the output is opaque (no blending), the same on every backend.\n// The backends mirror the chart engine's (WebGPU -> WebGL2 -> WebGL ->\n// Canvas2D, software GPUs skipped with `auto`), but with their own tiny\n// pipelines: a canvas only ever holds one context type.\n\nimport { resolveRendererPreference } from \"../defaults\";\nimport type { Rgba } from \"../color\";\nimport { rendererCandidates } from \"../renderers/detect\";\nimport {\n compileProgram,\n glContextAttributes,\n isSoftwareRenderer,\n type GlContext,\n} from \"../renderers/gl\";\nimport { claimGlSlot } from \"../renderers/gl-budget\";\nimport type { ChartRendererKind, ChartRendererPreference } from \"../types\";\n\n/** One sampled book: price rows (price / tick) and their resting sizes */\nexport interface HeatSource {\n /** Start time of the column */\n time: number;\n bins: ArrayLike<number>;\n sizes: ArrayLike<number>;\n}\n\n/** The rasterized field: packed RGBA texels, row 0 at the top (highest prices) */\nexport interface HeatGrid {\n width: number;\n height: number;\n pixels: Uint32Array;\n /** Resting size of every texel (max-pooled), same layout as `pixels` */\n cells: Float32Array;\n /** Times at the left / right edges of the image */\n t0: number;\n t1: number;\n /** Prices at the bottom / top edges of the image */\n p0: number;\n p1: number;\n /** Bumped on every rebuild (uploads are skipped while unchanged) */\n version: number;\n}\n\nexport interface HeatGridInput {\n /** Columns sorted by time (the live book last) */\n sources: readonly HeatSource[];\n /** Sampling interval (ms) */\n step: number;\n /** Price row height */\n tick: number;\n /** Visible time / price ranges */\n x0: number;\n x1: number;\n y0: number;\n y1: number;\n /** End of the data (the live time): texels starting later stay cold */\n end: number;\n /** Largest image (texels); denser data is max-pooled, walls stay visible */\n maxWidth: number;\n maxHeight: number;\n}\n\n/** Entries of a heat table (resolution of the size → color mapping) */\nexport const HEAT_TABLE_SIZE = 1024;\n\n/**\n * Size → color table of a ramp: entry `j` is the color of the relative size\n * `j / HEAT_TABLE_SIZE` through `curve` (0-1 → 0-1). Entry 0 is the cold end.\n */\nexport const heatTable = (\n lut: Uint32Array,\n curve: (r: number) => number,\n): Uint32Array => {\n const table = new Uint32Array(HEAT_TABLE_SIZE + 1);\n const last = lut.length - 1;\n for (let j = 0; j <= HEAT_TABLE_SIZE; j++) {\n const t = Math.min(1, Math.max(0, curve(j / HEAT_TABLE_SIZE)));\n table[j] = lut[Math.round(t * last)] ?? 0;\n }\n return table;\n};\n\n/**\n * `q`-quantile (0-1) of the positive values, NaN without any. Arrays longer\n * than `limit` are sampled (a prime stride, so a grid's rows and columns\n * are both covered).\n */\nexport const percentile = (\n values: ArrayLike<number>,\n q: number,\n limit = 16384,\n): number => {\n const len = values.length;\n const m = Math.min(len, Math.max(1, limit));\n const prime = len % 7919 ? 7919 : 7907;\n const value = (j: number) => values[m === len ? j : (j * prime) % len]!;\n let n = 0;\n for (let j = 0; j < m; j++) if (value(j) > 0) n++;\n if (!n) return NaN;\n const sorted = new Float64Array(n);\n let k = 0;\n for (let j = 0; j < m; j++) {\n const v = value(j);\n if (v > 0) sorted[k++] = v;\n }\n sorted.sort();\n const at = Math.min(n - 1, Math.max(0, q * (n - 1)));\n const lo = Math.floor(at);\n const hi = Math.min(n - 1, lo + 1);\n return sorted[lo]! + (sorted[hi]! - sorted[lo]!) * (at - lo);\n};\n\n/**\n * Rasterizes the visible liquidity into `cells` (the colors are set by\n * `paintHeatGrid`). Pass the previous grid as `reuse` to recycle its\n * buffers. Returns `null` without a valid range.\n */\nexport const buildHeatGrid = (\n input: HeatGridInput,\n reuse?: HeatGrid | null,\n): HeatGrid | null => {\n const { sources, step, tick, x0, x1, y0, y1, end } = input;\n if (\n !(step > 0) ||\n !(tick > 0) ||\n !(x1 > x0) ||\n !(y1 > y0) ||\n !Number.isFinite(x0 + x1 + y0 + y1)\n )\n return null;\n // time texels: `cx` columns each\n const cx = Math.max(\n 1,\n Math.ceil((x1 - x0) / step / Math.max(1, input.maxWidth)),\n );\n const g = step * cx;\n const gs = Math.floor(x0 / g) * g;\n const width = Math.max(1, Math.ceil((x1 - gs) / g));\n // price texels: `ry` rows each; a row covers [bin - ½, bin + ½) × tick\n const binLo = Math.round(y0 / tick);\n const binHi = Math.round(y1 / tick);\n const ry = Math.max(\n 1,\n Math.ceil((binHi - binLo + 1) / Math.max(1, input.maxHeight)),\n );\n const base = Math.floor(binLo / ry) * ry;\n const height = Math.max(1, Math.ceil((binHi + 1 - base) / ry));\n const count = width * height;\n\n const cells =\n reuse && reuse.cells.length === count\n ? reuse.cells.fill(0)\n : new Float32Array(count);\n const plot = (source: HeatSource, i: number) => {\n const { bins, sizes } = source;\n for (let k = 0; k < sizes.length; k++) {\n const s = sizes[k]!;\n if (!(s > 0)) continue;\n const r = Math.floor((bins[k]! - base) / ry);\n if (r < 0 || r >= height) continue;\n const idx = (height - 1 - r) * width + i;\n if (s > cells[idx]!) cells[idx] = s;\n }\n };\n const repeat = (i: number) => {\n for (let r = 0, idx = i; r < height; r++, idx += width)\n cells[idx] = cells[idx - 1]!;\n };\n\n // first source inside the image, and the one before (filled forward)\n let lo = 0;\n let hi = sources.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (sources[mid]!.time < gs) lo = mid + 1;\n else hi = mid;\n }\n let s = lo;\n let previous: HeatSource | null = lo > 0 ? sources[lo - 1]! : null;\n for (let i = 0; i < width; i++) {\n const start = gs + i * g;\n if (start >= end) break;\n const stop = start + g;\n let hit = false;\n while (s < sources.length && sources[s]!.time < stop) {\n plot(sources[s]!, i);\n previous = sources[s]!;\n hit = true;\n s++;\n }\n if (hit || !previous) continue;\n if (i === 0) plot(previous, 0);\n else repeat(i);\n }\n\n const pixels =\n reuse && reuse.pixels.length === count\n ? reuse.pixels\n : new Uint32Array(count);\n return {\n width,\n height,\n pixels,\n cells,\n t0: gs,\n t1: gs + width * g,\n p0: (base - 0.5) * tick,\n p1: (base + height * ry - 0.5) * tick,\n version: (reuse?.version ?? 0) + 1,\n };\n};\n\n/**\n * Colors the cells of a grid: `table[min(last, floor(size × scale))]`\n * (see `heatTable`), empty cells the cold end. Bumps the version.\n */\nexport const paintHeatGrid = (\n grid: HeatGrid,\n table: Uint32Array,\n scale: number,\n): void => {\n const { cells, pixels } = grid;\n const last = table.length - 1;\n const cold = table[0] ?? 0;\n const k = scale > 0 && Number.isFinite(scale) ? scale : 0;\n for (let idx = 0; idx < cells.length; idx++) {\n const v = cells[idx]! * k;\n pixels[idx] = v > 0 ? table[v >= last ? last : v | 0]! : cold;\n }\n grid.version++;\n};\n\n// ------------------------------------------------------------- renderers\n\n/** Draws heat grids on its own canvas (sized and placed by the caller) */\nexport interface HeatFieldRenderer {\n readonly kind: ChartRendererKind;\n readonly canvas: HTMLCanvasElement;\n /** Sets the size of the drawing buffer (device pixels) */\n resize(width: number, height: number): void;\n /**\n * Clears to `clear` (opaque) and draws `grid` stretched over `rect`\n * ([left, top, right, bottom] in device pixels, y down)\n */\n render(\n grid: HeatGrid | null,\n rect: readonly [number, number, number, number],\n clear: Rgba,\n ): void;\n destroy(): void;\n}\n\nconst GLSL_VERTEX = `\nattribute vec2 a_corner;\nuniform vec4 u_rect;\nvarying vec2 v_uv;\nvoid main() {\n v_uv = a_corner;\n gl_Position = vec4(mix(u_rect.x, u_rect.z, a_corner.x), mix(u_rect.y, u_rect.w, a_corner.y), 0.0, 1.0);\n}`;\nconst GLSL_FRAGMENT = `\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\nuniform sampler2D u_texture;\nvarying vec2 v_uv;\nvoid main() {\n gl_FragColor = vec4(texture2D(u_texture, v_uv).rgb, 1.0);\n}`;\n\n/** Clip-space rectangle of a pixel rectangle (y up) */\nconst clipRect = (\n rect: readonly [number, number, number, number],\n width: number,\n height: number,\n): [number, number, number, number] => [\n (rect[0] / width) * 2 - 1,\n 1 - (rect[1] / height) * 2,\n (rect[2] / width) * 2 - 1,\n 1 - (rect[3] / height) * 2,\n];\n\nconst bytesOf = (grid: HeatGrid) =>\n new Uint8Array(\n grid.pixels.buffer,\n grid.pixels.byteOffset,\n grid.width * grid.height * 4,\n );\n\n/** WebGL2 / WebGL backend (GLSL ES 1.00 runs on both) */\nexport const createGlHeatField = (\n canvas: HTMLCanvasElement,\n kind: \"webgl2\" | \"webgl\",\n onLost: () => void,\n requireHardware = false,\n): HeatFieldRenderer | null => {\n const attributes: WebGLContextAttributes = {\n ...glContextAttributes(requireHardware),\n alpha: false,\n premultipliedAlpha: false,\n };\n const gl = canvas.getContext(kind, attributes) as GlContext | null;\n if (!gl) return null;\n // a rejected context is freed now, not at garbage collection\n const reject = () => {\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n return null;\n };\n if (requireHardware && isSoftwareRenderer(gl)) return reject();\n\n /** Program, quad and texture: built again when a suspended context returns */\n const setup = () => {\n const program = compileProgram(\n gl,\n { vertex: GLSL_VERTEX, fragment: GLSL_FRAGMENT },\n [\"a_corner\"],\n );\n if (!program) return null;\n const corners = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, corners);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]),\n gl.STATIC_DRAW,\n );\n const texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n return {\n program,\n rectAt: gl.getUniformLocation(program.program, \"u_rect\"),\n textureAt: gl.getUniformLocation(program.program, \"u_texture\"),\n corners,\n texture,\n };\n };\n let objects = setup();\n if (!objects) return reject();\n let uploaded: HeatGrid | null = null;\n let uploadedVersion = -1;\n let size = [0, 0];\n let destroyed = false;\n let lost = false;\n let last: {\n grid: HeatGrid | null;\n rect: readonly [number, number, number, number];\n clear: Rgba;\n } | null = null;\n\n const forget = () => {\n objects = null;\n uploaded = null;\n uploadedVersion = -1;\n size = [0, 0];\n };\n // past the page-wide context budget the context may be suspended while\n // off-screen: its GPU objects go, and come back (with the last frame)\n // when it is restored\n const slot = claimGlSlot(canvas, gl, {\n suspend: forget,\n restore: () => {\n forget();\n objects = setup();\n if (!objects) {\n lost = true;\n if (!destroyed) onLost();\n } else if (last) draw(last.grid, last.rect, last.clear);\n },\n lost: () => {\n lost = true;\n if (!destroyed) onLost();\n },\n });\n\n const draw = (\n grid: HeatGrid | null,\n rect: readonly [number, number, number, number],\n clear: Rgba,\n ) => {\n if (!objects) return;\n const { program, rectAt, textureAt, corners, texture } = objects;\n const w = canvas.width;\n const h = canvas.height;\n gl.viewport(0, 0, w, h);\n gl.disable(gl.BLEND);\n gl.clearColor(clear[0], clear[1], clear[2], 1);\n gl.clear(gl.COLOR_BUFFER_BIT);\n if (!grid) return;\n gl.useProgram(program.program);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n if (grid !== uploaded || grid.version !== uploadedVersion) {\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 4);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);\n if (size[0] === grid.width && size[1] === grid.height) {\n gl.texSubImage2D(\n gl.TEXTURE_2D,\n 0,\n 0,\n 0,\n grid.width,\n grid.height,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n bytesOf(grid),\n );\n } else {\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n grid.width,\n grid.height,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n bytesOf(grid),\n );\n size = [grid.width, grid.height];\n }\n uploaded = grid;\n uploadedVersion = grid.version;\n }\n gl.uniform1i(textureAt, 0);\n gl.uniform4fv(rectAt, clipRect(rect, w, h));\n gl.bindBuffer(gl.ARRAY_BUFFER, corners);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n };\n\n return {\n kind,\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(grid, rect, clear) {\n if (destroyed) return;\n last = { grid, rect, clear };\n if (lost || !slot.use() || gl.isContextLost()) return;\n draw(grid, rect, clear);\n },\n destroy() {\n destroyed = true;\n last = null;\n slot.release();\n if (objects && !gl.isContextLost()) {\n gl.deleteTexture(objects.texture);\n gl.deleteBuffer(objects.corners);\n gl.deleteProgram(objects.program.program);\n // frees the context now instead of at garbage collection\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n }\n objects = null;\n },\n };\n};\n\nconst WGSL = `\nstruct Uniforms { rect: vec4f };\n@group(0) @binding(0) var<uniform> u: Uniforms;\n@group(0) @binding(1) var heat: texture_2d<f32>;\n@group(0) @binding(2) var nearest: sampler;\nstruct Varyings {\n @builtin(position) position: vec4f,\n @location(0) uv: vec2f,\n};\n@vertex fn vs(@builtin(vertex_index) i: u32) -> Varyings {\n let c = vec2f(f32(i & 1u), f32(i >> 1u));\n var out: Varyings;\n out.position = vec4f(mix(u.rect.x, u.rect.z, c.x), mix(u.rect.y, u.rect.w, c.y), 0.0, 1.0);\n out.uv = c;\n return out;\n}\n@fragment fn fs(v: Varyings) -> @location(0) vec4f {\n return vec4f(textureSample(heat, nearest, v.uv).rgb, 1.0);\n}`;\n\ntype GpuNavigator = Navigator & { gpu?: GPU };\n\n// lib.dom has the WebGPU interfaces but not these constant objects\nconst BUFFER_UNIFORM = 0x40;\nconst BUFFER_COPY_DST = 0x08;\nconst TEXTURE_COPY_DST = 0x02;\nconst TEXTURE_BINDING = 0x04;\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\n/** WebGPU backend */\nexport const createWebGpuHeatField = async (\n canvas: HTMLCanvasElement,\n onLost: () => void,\n requireHardware = false,\n): Promise<HeatFieldRenderer | null> => {\n const gpu =\n typeof navigator !== \"undefined\"\n ? (navigator as GpuNavigator).gpu\n : undefined;\n if (!gpu) return null;\n const adapter = await gpu.requestAdapter();\n if (!adapter) return null;\n const info = adapter as GPUAdapter & {\n isFallbackAdapter?: boolean;\n info?: { isFallbackAdapter?: boolean };\n };\n if (\n requireHardware &&\n (info.info?.isFallbackAdapter || info.isFallbackAdapter)\n )\n return null;\n const device = await adapter.requestDevice();\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) {\n device.destroy();\n return null;\n }\n const format = gpu.getPreferredCanvasFormat();\n context.configure({ device, format, alphaMode: \"opaque\" });\n let destroyed = false;\n void device.lost.then(() => {\n if (!destroyed) onLost();\n });\n\n const layout = device.createBindGroupLayout({\n entries: [\n { binding: 0, visibility: STAGE_VERTEX, buffer: { type: \"uniform\" } },\n { binding: 1, visibility: STAGE_FRAGMENT, texture: {} },\n { binding: 2, visibility: STAGE_FRAGMENT, sampler: {} },\n ],\n });\n const module = device.createShaderModule({ code: WGSL });\n const pipeline = device.createRenderPipeline({\n layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),\n vertex: { module, entryPoint: \"vs\" },\n fragment: { module, entryPoint: \"fs\", targets: [{ format }] },\n primitive: { topology: \"triangle-strip\" },\n });\n const sampler = device.createSampler({\n magFilter: \"nearest\",\n minFilter: \"nearest\",\n addressModeU: \"clamp-to-edge\",\n addressModeV: \"clamp-to-edge\",\n });\n const uniform = device.createBuffer({\n size: 16,\n usage: BUFFER_UNIFORM | BUFFER_COPY_DST,\n });\n let texture: GPUTexture | null = null;\n let bindGroup: GPUBindGroup | null = null;\n let uploaded: HeatGrid | null = null;\n let uploadedVersion = -1;\n\n return {\n kind: \"webgpu\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(grid, rect, clear) {\n if (destroyed) return;\n if (grid && (grid !== uploaded || grid.version !== uploadedVersion)) {\n if (\n !texture ||\n texture.width !== grid.width ||\n texture.height !== grid.height\n ) {\n texture?.destroy();\n texture = device.createTexture({\n size: { width: grid.width, height: grid.height },\n format: \"rgba8unorm\",\n usage: TEXTURE_COPY_DST | TEXTURE_BINDING,\n });\n bindGroup = device.createBindGroup({\n layout,\n entries: [\n { binding: 0, resource: { buffer: uniform } },\n { binding: 1, resource: texture.createView() },\n { binding: 2, resource: sampler },\n ],\n });\n }\n device.queue.writeTexture(\n { texture },\n bytesOf(grid),\n { bytesPerRow: grid.width * 4, rowsPerImage: grid.height },\n { width: grid.width, height: grid.height },\n );\n uploaded = grid;\n uploadedVersion = grid.version;\n }\n device.queue.writeBuffer(\n uniform,\n 0,\n new Float32Array(clipRect(rect, canvas.width, canvas.height)),\n );\n const encoder = device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: context.getCurrentTexture().createView(),\n clearValue: { r: clear[0], g: clear[1], b: clear[2], a: 1 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n if (grid && bindGroup) {\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, bindGroup);\n pass.draw(4);\n }\n pass.end();\n device.queue.submit([encoder.finish()]);\n },\n destroy() {\n destroyed = true;\n texture?.destroy();\n uniform.destroy();\n context.unconfigure();\n device.destroy();\n },\n };\n};\n\n/** Canvas2D backend: the image drawn with nearest-neighbour scaling */\nexport const createCanvasHeatField = (\n canvas: HTMLCanvasElement,\n): HeatFieldRenderer | null => {\n const ctx = canvas.getContext(\"2d\", { alpha: false });\n if (!ctx) return null;\n const image = canvas.ownerDocument.createElement(\"canvas\");\n const imageCtx = image.getContext(\"2d\");\n let uploaded: HeatGrid | null = null;\n let uploadedVersion = -1;\n return {\n kind: \"canvas2d\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(grid, rect, clear) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.fillStyle = `rgb(${Math.round(clear[0] * 255)}, ${Math.round(clear[1] * 255)}, ${Math.round(clear[2] * 255)})`;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n if (!grid || !imageCtx) return;\n if (grid !== uploaded || grid.version !== uploadedVersion) {\n if (image.width !== grid.width) image.width = grid.width;\n if (image.height !== grid.height) image.height = grid.height;\n const data = imageCtx.createImageData?.(grid.width, grid.height);\n if (!data?.data) return;\n data.data.set(bytesOf(grid));\n imageCtx.putImageData(data, 0, 0);\n uploaded = grid;\n uploadedVersion = grid.version;\n }\n ctx.imageSmoothingEnabled = false;\n ctx.drawImage(\n image,\n rect[0],\n rect[1],\n rect[2] - rect[0],\n rect[3] - rect[1],\n );\n },\n destroy() {\n uploaded = null;\n },\n };\n};\n\n/**\n * Creates the first heat field backend that works, in the chart engine's\n * order and with its preference rules (`auto` follows the global default\n * and skips software GPUs). Every attempt gets a fresh canvas.\n */\nexport const createHeatFieldRenderer = async (\n requested: ChartRendererPreference,\n makeCanvas: () => HTMLCanvasElement,\n onLost: (kind: ChartRendererKind) => void,\n exclude?: ReadonlySet<ChartRendererKind>,\n): Promise<HeatFieldRenderer | null> => {\n const preference = resolveRendererPreference(requested);\n for (const kind of rendererCandidates(preference, exclude)) {\n const requireHardware = preference === \"auto\" || preference !== kind;\n let field: HeatFieldRenderer | null;\n try {\n const canvas = makeCanvas();\n const lost = () => onLost(kind);\n field =\n kind === \"webgpu\"\n ? await createWebGpuHeatField(canvas, lost, requireHardware)\n : kind === \"canvas2d\"\n ? createCanvasHeatField(canvas)\n : createGlHeatField(canvas, kind, lost, requireHardware);\n } catch {\n field = null;\n }\n if (field) return field;\n }\n return null;\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require("../locale.cjs");var t=(t,n)=>{let r=Math.max(0,Math.min(12,Math.round(n)));return e.numberFormat(e.resolveLocale(t),{minimumFractionDigits:r,maximumFractionDigits:r})},n=(t,n,r=2)=>{if(!Number.isFinite(t))return`–`;let i=e.resolveLocale(n),a=Math.abs(t);for(let[n,o]of e.compactUnits(i))if(a>=n)return e.numberFormat(i,{maximumFractionDigits:r}).format(t/n)+o;return e.numberFormat(i,{maximumFractionDigits:a>=100?0:a>=1?2:4}).format(t)},r=(t,n,r=2,i=!0)=>{if(!Number.isFinite(t))return`–`;let a=Math.max(0,Math.min(6,Math.round(r)));return e.numberFormat(e.resolveLocale(n),{style:`percent`,minimumFractionDigits:a,maximumFractionDigits:a,signDisplay:i?`exceptZero`:`auto`}).format(t)},i=(i,a,o)=>{let s=e.resolveLocale(i.locale),c=i.pricePrecision??a,l=i.sizePrecision??o,u=t(s,c),d=t(s,l),f=e=>t=>Number.isFinite(t)?e(t):`–`,p=f(i.formatSize??(e=>d.format(e))),m=e=>n(e,s,2);return{price:f(i.formatPrice??(e=>u.format(e))),size:p,total:f(e=>Math.abs(e)>=1e6?m(e):p(e)),notional:f(e=>Math.abs(e)>=1e4?m(e):t(s,2).format(e)),compact:f(m),fixed:(e,n)=>Number.isFinite(e)?t(s,n).format(e):`–`,percent:(e,t=2,n=!0)=>r(e,s,t,n),locale:s,priceDecimals:c,sizeDecimals:l}},a=(e,t=2)=>String(e).padStart(t,`0`),o=(e,t=!0)=>{let n=new Date(e);if(Number.isNaN(n.getTime()))return`–`;let r=`${a(n.getHours())}:${a(n.getMinutes())}:${a(n.getSeconds())}`;return t?`${r}.${a(n.getMilliseconds(),3)}`:r},s=`var(--success-color, #16a34a)`,c=`var(--danger-color, #dc2626)`,l=[.09,.64,.29,1],u=[.86,.15,.15,1],d=(e,t)=>{let n=(t,n)=>e.resolve?e.resolve(t,n):n,r=t.colorConvention===`red-up`;return{up:n(t.upColor??(r?`var(--danger-color, #dc2626)`:`var(--success-color, #16a34a)`),r?u:l),down:n(t.downColor??(r?`var(--success-color, #16a34a)`:`var(--danger-color, #dc2626)`),r?l:u)}},f=(e,t,n=400,r)=>`${n} ${r??t.fontSize??12}px ${t.fontFamily??e.fontFamily}`,p=(e,t)=>t<=0?1:1-Math.exp(-Math.max(0,e)/t),m=(e,t,n)=>e<t?t:e>n?n:e,h=(e,t,n,r,i,a)=>{let o=Math.max(0,Math.min(a,r/2,i/2));e.beginPath(),e.moveTo(t+o,n),e.arcTo(t+r,n,t+r,n+i,o),e.arcTo(t+r,n+i,t,n+i,o),e.arcTo(t,n+i,t,n,o),e.arcTo(t,n,t+r,n,o),e.closePath()};exports.DEFAULT_DOWN=c,exports.DEFAULT_UP=s,exports.clamp=m,exports.createFormatters=i,exports.ease=p,exports.fontOf=f,exports.formatClock=o,exports.formatCompactNumber=n,exports.formatPercent=r,exports.numberFormat=t,exports.roundRect=h,exports.sideColors=d;
1
+ const e=require("../locale.cjs");var t=(t,n)=>{let r=Math.max(0,Math.min(12,Math.round(n)));return e.numberFormat(e.resolveLocale(t),{minimumFractionDigits:r,maximumFractionDigits:r})},n=(t,n,r=2)=>{if(!Number.isFinite(t))return`–`;let i=e.resolveLocale(n),a=Math.abs(t);for(let[n,o]of e.compactUnits(i))if(a>=n)return e.numberFormat(i,{maximumFractionDigits:r}).format(t/n)+o;return e.numberFormat(i,{maximumFractionDigits:a>=100?0:a>=1?2:4}).format(t)},r=(t,n,r=2,i=!0)=>{if(!Number.isFinite(t))return`–`;let a=Math.max(0,Math.min(6,Math.round(r)));return e.numberFormat(e.resolveLocale(n),{style:`percent`,minimumFractionDigits:a,maximumFractionDigits:a,signDisplay:i?`exceptZero`:`auto`}).format(t)},i=(i,a,o)=>{let s=e.resolveLocale(i.locale),c=i.pricePrecision??a,l=i.sizePrecision??o,u=t(s,c),d=t(s,l),f=e=>t=>Number.isFinite(t)?e(t):`–`,p=f(i.formatSize??(e=>d.format(e))),m=e=>n(e,s,2);return{price:f(i.formatPrice??(e=>u.format(e))),size:p,total:f(e=>Math.abs(e)>=1e6?m(e):p(e)),notional:f(e=>Math.abs(e)>=1e4?m(e):t(s,2).format(e)),compact:f(m),fixed:(e,n)=>Number.isFinite(e)?t(s,n).format(e):`–`,percent:(e,t=2,n=!0)=>r(e,s,t,n),locale:s,priceDecimals:c,sizeDecimals:l}},a=(e,t=2)=>String(e).padStart(t,`0`),o=(e,t=!0,n=`local`)=>{let r=new Date(e);if(Number.isNaN(r.getTime()))return`–`;let i=n===`utc`,o=i?`${a(r.getUTCHours())}:${a(r.getUTCMinutes())}:${a(r.getUTCSeconds())}`:`${a(r.getHours())}:${a(r.getMinutes())}:${a(r.getSeconds())}`;return t?`${o}.${a(i?r.getUTCMilliseconds():r.getMilliseconds(),3)}`:o},s=`var(--success-color, #16a34a)`,c=`var(--danger-color, #dc2626)`,l=[.09,.64,.29,1],u=[.86,.15,.15,1],d=(e,t)=>{let n=(t,n)=>e.resolve?e.resolve(t,n):n,r=t.colorConvention===`red-up`;return{up:n(t.upColor??(r?`var(--danger-color, #dc2626)`:`var(--success-color, #16a34a)`),r?u:l),down:n(t.downColor??(r?`var(--success-color, #16a34a)`:`var(--danger-color, #dc2626)`),r?l:u)}},f=(e,t,n=400,r)=>`${n} ${r??t.fontSize??12}px ${t.fontFamily??e.fontFamily}`,p=(e,t)=>t<=0?1:1-Math.exp(-Math.max(0,e)/t),m=(e,t,n)=>e<t?t:e>n?n:e,h=(e,t,n,r,i,a)=>{let o=Math.max(0,Math.min(a,r/2,i/2));e.beginPath(),e.moveTo(t+o,n),e.arcTo(t+r,n,t+r,n+i,o),e.arcTo(t+r,n+i,t,n+i,o),e.arcTo(t,n+i,t,n,o),e.arcTo(t,n,t+r,n,o),e.closePath()};exports.DEFAULT_DOWN=c,exports.DEFAULT_UP=s,exports.clamp=m,exports.createFormatters=i,exports.ease=p,exports.fontOf=f,exports.formatClock=o,exports.formatCompactNumber=n,exports.formatPercent=r,exports.numberFormat=t,exports.roundRect=h,exports.sideColors=d;
2
2
  //# sourceMappingURL=format.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.cjs","names":["intlNumberFormat","resolveLocale","compactUnits","require_locale","numberFormat","d","decimals","locale","formatCompactNumber","value","resolved","abs","unit","suffix","maxDecimals","formatPercent","fraction","signed","createFormatters","options","priceDecimals","inferredPrice","sizeDecimals","inferredSize","priceFormat","sizeFormat","finite","fn","size","v","compact","pad","length","formatClock","time","base","milliseconds","DEFAULT_UP","DEFAULT_DOWN","UP_FALLBACK","DOWN_FALLBACK","sideColors","resolve","theme","fallback","redUp","fontOf","weight","ease","tau","dt","clamp","min","max","roundRect","radius","r","w","h","ctx","x","y"],"sources":["../../../../../charts/src/engine/orderbook/format.ts"],"sourcesContent":["// Number, time and color helpers shared by the order book widgets.\n\nimport type { ChartTheme } from \"../theme\";\nimport type { Rgba } from \"../color\";\nimport {\n compactUnits,\n numberFormat as intlNumberFormat,\n resolveLocale,\n} from \"../locale\";\nimport type { OrderBookCommonOptions } from \"./types\";\n\n/** Cached `Intl.NumberFormat` with fixed decimals (page language when `locale` is omitted) */\nexport const numberFormat = (\n locale: string | undefined,\n decimals: number,\n): Intl.NumberFormat => {\n const d = Math.max(0, Math.min(12, Math.round(decimals)));\n return intlNumberFormat(resolveLocale(locale), {\n minimumFractionDigits: d,\n maximumFractionDigits: d,\n });\n};\n\n/**\n * Compact number in the units of the language (12.4k, 1.25 M, 3.2万, 1.5億),\n * with the locale's decimal separator\n */\nexport const formatCompactNumber = (\n value: number,\n locale?: string,\n maxDecimals = 2,\n): string => {\n if (!Number.isFinite(value)) return \"–\";\n const resolved = resolveLocale(locale);\n const abs = Math.abs(value);\n for (const [unit, suffix] of compactUnits(resolved)) {\n if (abs >= unit)\n return (\n intlNumberFormat(resolved, {\n maximumFractionDigits: maxDecimals,\n }).format(value / unit) + suffix\n );\n }\n return intlNumberFormat(resolved, {\n maximumFractionDigits: abs >= 100 ? 0 : abs >= 1 ? 2 : 4,\n }).format(value);\n};\n\n/** Signed percentage of a fraction (`+0.125%`), in the locale */\nexport const formatPercent = (\n fraction: number,\n locale?: string,\n decimals = 2,\n signed = true,\n): string => {\n if (!Number.isFinite(fraction)) return \"–\";\n const d = Math.max(0, Math.min(6, Math.round(decimals)));\n return intlNumberFormat(resolveLocale(locale), {\n style: \"percent\",\n minimumFractionDigits: d,\n maximumFractionDigits: d,\n signDisplay: signed ? \"exceptZero\" : \"auto\",\n }).format(fraction);\n};\n\nexport interface Formatters {\n price: (value: number) => string;\n size: (value: number) => string;\n /** Large totals: compact (12.4k, 124万) above a million */\n total: (value: number) => string;\n /** Notional values: compact above ten thousand */\n notional: (value: number) => string;\n /** Axis values: always compact when large */\n compact: (value: number) => string;\n /** Fixed decimals in the locale (basis points, shares) */\n fixed: (value: number, decimals: number) => string;\n /** Percentage of a fraction (signed by default) */\n percent: (fraction: number, decimals?: number, signed?: boolean) => string;\n /** Resolved locale (`locale` option or page language) */\n locale: string;\n priceDecimals: number;\n sizeDecimals: number;\n}\n\n/** Formatters of the options, with inferred decimals as fallbacks */\nexport const createFormatters = (\n options: OrderBookCommonOptions,\n inferredPrice: number,\n inferredSize: number,\n): Formatters => {\n const locale = resolveLocale(options.locale);\n const priceDecimals = options.pricePrecision ?? inferredPrice;\n const sizeDecimals = options.sizePrecision ?? inferredSize;\n const priceFormat = numberFormat(locale, priceDecimals);\n const sizeFormat = numberFormat(locale, sizeDecimals);\n const finite =\n (fn: (value: number) => string) =>\n (value: number): string =>\n Number.isFinite(value) ? fn(value) : \"–\";\n const size = finite(options.formatSize ?? ((v) => sizeFormat.format(v)));\n const compact = (v: number) => formatCompactNumber(v, locale, 2);\n return {\n price: finite(options.formatPrice ?? ((v) => priceFormat.format(v))),\n size,\n total: finite((v) => (Math.abs(v) >= 1e6 ? compact(v) : size(v))),\n notional: finite((v) =>\n Math.abs(v) >= 1e4 ? compact(v) : numberFormat(locale, 2).format(v),\n ),\n compact: finite(compact),\n fixed: (v, decimals) =>\n Number.isFinite(v) ? numberFormat(locale, decimals).format(v) : \"–\",\n percent: (fraction, decimals = 2, signed = true) =>\n formatPercent(fraction, locale, decimals, signed),\n locale,\n priceDecimals,\n sizeDecimals,\n };\n};\n\nconst pad = (value: number, length = 2) => String(value).padStart(length, \"0\");\n\n/** `HH:MM:SS` or `HH:MM:SS.mmm`, local time */\nexport const formatClock = (time: number, milliseconds = true): string => {\n const d = new Date(time);\n if (Number.isNaN(d.getTime())) return \"–\";\n const base = `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n return milliseconds ? `${base}.${pad(d.getMilliseconds(), 3)}` : base;\n};\n\nexport const DEFAULT_UP = \"var(--success-color, #16a34a)\";\nexport const DEFAULT_DOWN = \"var(--danger-color, #dc2626)\";\nconst UP_FALLBACK: Rgba = [0.09, 0.64, 0.29, 1];\nconst DOWN_FALLBACK: Rgba = [0.86, 0.15, 0.15, 1];\n\n/** Colors of the bids / buys (`up`) and asks / sells (`down`) */\nexport const sideColors = (\n theme: ChartTheme,\n options: OrderBookCommonOptions,\n): { up: Rgba; down: Rgba } => {\n const resolve = (value: string, fallback: Rgba) =>\n theme.resolve ? theme.resolve(value, fallback) : fallback;\n const redUp = options.colorConvention === \"red-up\";\n return {\n up: resolve(\n options.upColor ?? (redUp ? DEFAULT_DOWN : DEFAULT_UP),\n redUp ? DOWN_FALLBACK : UP_FALLBACK,\n ),\n down: resolve(\n options.downColor ?? (redUp ? DEFAULT_UP : DEFAULT_DOWN),\n redUp ? UP_FALLBACK : DOWN_FALLBACK,\n ),\n };\n};\n\n/** Canvas font of the options */\nexport const fontOf = (\n theme: ChartTheme,\n options: OrderBookCommonOptions,\n weight: number | string = 400,\n size?: number,\n): string =>\n `${weight} ${size ?? options.fontSize ?? 12}px ${options.fontFamily ?? theme.fontFamily}`;\n\n/** Exponential smoothing factor for a frame of `dt` ms */\nexport const ease = (dt: number, tau: number): number =>\n tau <= 0 ? 1 : 1 - Math.exp(-Math.max(0, dt) / tau);\n\nexport const clamp = (value: number, min: number, max: number): number =>\n value < min ? min : value > max ? max : value;\n\n/** Rounded rectangle path (`roundRect` is missing in older browsers) */\nexport const roundRect = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n) => {\n const radius = Math.max(0, Math.min(r, w / 2, h / 2));\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.arcTo(x + w, y, x + w, y + h, radius);\n ctx.arcTo(x + w, y + h, x, y + h, radius);\n ctx.arcTo(x, y + h, x, y, radius);\n ctx.arcTo(x, y, x + w, y, radius);\n ctx.closePath();\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"format.cjs","names":["intlNumberFormat","resolveLocale","compactUnits","require_locale","numberFormat","d","decimals","locale","formatCompactNumber","value","resolved","abs","unit","suffix","maxDecimals","formatPercent","fraction","signed","createFormatters","options","priceDecimals","inferredPrice","sizeDecimals","inferredSize","priceFormat","sizeFormat","finite","fn","size","v","compact","pad","length","formatClock","time","utc","timeZone","base","milliseconds","DEFAULT_UP","DEFAULT_DOWN","UP_FALLBACK","DOWN_FALLBACK","sideColors","resolve","theme","fallback","redUp","fontOf","weight","ease","tau","dt","clamp","min","max","roundRect","radius","r","w","h","ctx","x","y"],"sources":["../../../../../charts/src/engine/orderbook/format.ts"],"sourcesContent":["// Number, time and color helpers shared by the order book widgets.\n\nimport type { ChartTheme } from \"../theme\";\nimport type { Rgba } from \"../color\";\nimport type { ChartTimeZone } from \"../types\";\nimport {\n compactUnits,\n numberFormat as intlNumberFormat,\n resolveLocale,\n} from \"../locale\";\nimport type { OrderBookCommonOptions } from \"./types\";\n\n/** Cached `Intl.NumberFormat` with fixed decimals (page language when `locale` is omitted) */\nexport const numberFormat = (\n locale: string | undefined,\n decimals: number,\n): Intl.NumberFormat => {\n const d = Math.max(0, Math.min(12, Math.round(decimals)));\n return intlNumberFormat(resolveLocale(locale), {\n minimumFractionDigits: d,\n maximumFractionDigits: d,\n });\n};\n\n/**\n * Compact number in the units of the language (12.4k, 1.25 M, 3.2万, 1.5億),\n * with the locale's decimal separator\n */\nexport const formatCompactNumber = (\n value: number,\n locale?: string,\n maxDecimals = 2,\n): string => {\n if (!Number.isFinite(value)) return \"–\";\n const resolved = resolveLocale(locale);\n const abs = Math.abs(value);\n for (const [unit, suffix] of compactUnits(resolved)) {\n if (abs >= unit)\n return (\n intlNumberFormat(resolved, {\n maximumFractionDigits: maxDecimals,\n }).format(value / unit) + suffix\n );\n }\n return intlNumberFormat(resolved, {\n maximumFractionDigits: abs >= 100 ? 0 : abs >= 1 ? 2 : 4,\n }).format(value);\n};\n\n/** Signed percentage of a fraction (`+0.125%`), in the locale */\nexport const formatPercent = (\n fraction: number,\n locale?: string,\n decimals = 2,\n signed = true,\n): string => {\n if (!Number.isFinite(fraction)) return \"–\";\n const d = Math.max(0, Math.min(6, Math.round(decimals)));\n return intlNumberFormat(resolveLocale(locale), {\n style: \"percent\",\n minimumFractionDigits: d,\n maximumFractionDigits: d,\n signDisplay: signed ? \"exceptZero\" : \"auto\",\n }).format(fraction);\n};\n\nexport interface Formatters {\n price: (value: number) => string;\n size: (value: number) => string;\n /** Large totals: compact (12.4k, 124万) above a million */\n total: (value: number) => string;\n /** Notional values: compact above ten thousand */\n notional: (value: number) => string;\n /** Axis values: always compact when large */\n compact: (value: number) => string;\n /** Fixed decimals in the locale (basis points, shares) */\n fixed: (value: number, decimals: number) => string;\n /** Percentage of a fraction (signed by default) */\n percent: (fraction: number, decimals?: number, signed?: boolean) => string;\n /** Resolved locale (`locale` option or page language) */\n locale: string;\n priceDecimals: number;\n sizeDecimals: number;\n}\n\n/** Formatters of the options, with inferred decimals as fallbacks */\nexport const createFormatters = (\n options: OrderBookCommonOptions,\n inferredPrice: number,\n inferredSize: number,\n): Formatters => {\n const locale = resolveLocale(options.locale);\n const priceDecimals = options.pricePrecision ?? inferredPrice;\n const sizeDecimals = options.sizePrecision ?? inferredSize;\n const priceFormat = numberFormat(locale, priceDecimals);\n const sizeFormat = numberFormat(locale, sizeDecimals);\n const finite =\n (fn: (value: number) => string) =>\n (value: number): string =>\n Number.isFinite(value) ? fn(value) : \"–\";\n const size = finite(options.formatSize ?? ((v) => sizeFormat.format(v)));\n const compact = (v: number) => formatCompactNumber(v, locale, 2);\n return {\n price: finite(options.formatPrice ?? ((v) => priceFormat.format(v))),\n size,\n total: finite((v) => (Math.abs(v) >= 1e6 ? compact(v) : size(v))),\n notional: finite((v) =>\n Math.abs(v) >= 1e4 ? compact(v) : numberFormat(locale, 2).format(v),\n ),\n compact: finite(compact),\n fixed: (v, decimals) =>\n Number.isFinite(v) ? numberFormat(locale, decimals).format(v) : \"–\",\n percent: (fraction, decimals = 2, signed = true) =>\n formatPercent(fraction, locale, decimals, signed),\n locale,\n priceDecimals,\n sizeDecimals,\n };\n};\n\nconst pad = (value: number, length = 2) => String(value).padStart(length, \"0\");\n\n/** `HH:MM:SS` or `HH:MM:SS.mmm`, in the local time or UTC */\nexport const formatClock = (\n time: number,\n milliseconds = true,\n timeZone: ChartTimeZone = \"local\",\n): string => {\n const d = new Date(time);\n if (Number.isNaN(d.getTime())) return \"–\";\n const utc = timeZone === \"utc\";\n const base = utc\n ? `${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}`\n : `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n return milliseconds\n ? `${base}.${pad(utc ? d.getUTCMilliseconds() : d.getMilliseconds(), 3)}`\n : base;\n};\n\nexport const DEFAULT_UP = \"var(--success-color, #16a34a)\";\nexport const DEFAULT_DOWN = \"var(--danger-color, #dc2626)\";\nconst UP_FALLBACK: Rgba = [0.09, 0.64, 0.29, 1];\nconst DOWN_FALLBACK: Rgba = [0.86, 0.15, 0.15, 1];\n\n/** Colors of the bids / buys (`up`) and asks / sells (`down`) */\nexport const sideColors = (\n theme: ChartTheme,\n options: OrderBookCommonOptions,\n): { up: Rgba; down: Rgba } => {\n const resolve = (value: string, fallback: Rgba) =>\n theme.resolve ? theme.resolve(value, fallback) : fallback;\n const redUp = options.colorConvention === \"red-up\";\n return {\n up: resolve(\n options.upColor ?? (redUp ? DEFAULT_DOWN : DEFAULT_UP),\n redUp ? DOWN_FALLBACK : UP_FALLBACK,\n ),\n down: resolve(\n options.downColor ?? (redUp ? DEFAULT_UP : DEFAULT_DOWN),\n redUp ? UP_FALLBACK : DOWN_FALLBACK,\n ),\n };\n};\n\n/** Canvas font of the options */\nexport const fontOf = (\n theme: ChartTheme,\n options: OrderBookCommonOptions,\n weight: number | string = 400,\n size?: number,\n): string =>\n `${weight} ${size ?? options.fontSize ?? 12}px ${options.fontFamily ?? theme.fontFamily}`;\n\n/** Exponential smoothing factor for a frame of `dt` ms */\nexport const ease = (dt: number, tau: number): number =>\n tau <= 0 ? 1 : 1 - Math.exp(-Math.max(0, dt) / tau);\n\nexport const clamp = (value: number, min: number, max: number): number =>\n value < min ? min : value > max ? max : value;\n\n/** Rounded rectangle path (`roundRect` is missing in older browsers) */\nexport const roundRect = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n) => {\n const radius = Math.max(0, Math.min(r, w / 2, h / 2));\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.arcTo(x + w, y, x + w, y + h, radius);\n ctx.arcTo(x + w, y + h, x, y + h, radius);\n ctx.arcTo(x, y + h, x, y, radius);\n ctx.arcTo(x, y, x + w, y, radius);\n ctx.closePath();\n};\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { ChartTheme } from '../theme.cjs';
2
2
  import { Rgba } from '../color.cjs';
3
+ import { ChartTimeZone } from '../types.cjs';
3
4
  import { OrderBookCommonOptions } from './types.cjs';
4
5
  /** Cached `Intl.NumberFormat` with fixed decimals (page language when `locale` is omitted) */
5
6
  export declare const numberFormat: (locale: string | undefined, decimals: number) => Intl.NumberFormat;
@@ -30,8 +31,8 @@ export interface Formatters {
30
31
  }
31
32
  /** Formatters of the options, with inferred decimals as fallbacks */
32
33
  export declare const createFormatters: (options: OrderBookCommonOptions, inferredPrice: number, inferredSize: number) => Formatters;
33
- /** `HH:MM:SS` or `HH:MM:SS.mmm`, local time */
34
- export declare const formatClock: (time: number, milliseconds?: boolean) => string;
34
+ /** `HH:MM:SS` or `HH:MM:SS.mmm`, in the local time or UTC */
35
+ export declare const formatClock: (time: number, milliseconds?: boolean, timeZone?: ChartTimeZone) => string;
35
36
  export declare const DEFAULT_UP = "var(--success-color, #16a34a)";
36
37
  export declare const DEFAULT_DOWN = "var(--danger-color, #dc2626)";
37
38
  /** Colors of the bids / buys (`up`) and asks / sells (`down`) */
@@ -1,5 +1,6 @@
1
1
  import { ChartTheme } from '../theme.js';
2
2
  import { Rgba } from '../color.js';
3
+ import { ChartTimeZone } from '../types.js';
3
4
  import { OrderBookCommonOptions } from './types.js';
4
5
  /** Cached `Intl.NumberFormat` with fixed decimals (page language when `locale` is omitted) */
5
6
  export declare const numberFormat: (locale: string | undefined, decimals: number) => Intl.NumberFormat;
@@ -30,8 +31,8 @@ export interface Formatters {
30
31
  }
31
32
  /** Formatters of the options, with inferred decimals as fallbacks */
32
33
  export declare const createFormatters: (options: OrderBookCommonOptions, inferredPrice: number, inferredSize: number) => Formatters;
33
- /** `HH:MM:SS` or `HH:MM:SS.mmm`, local time */
34
- export declare const formatClock: (time: number, milliseconds?: boolean) => string;
34
+ /** `HH:MM:SS` or `HH:MM:SS.mmm`, in the local time or UTC */
35
+ export declare const formatClock: (time: number, milliseconds?: boolean, timeZone?: ChartTimeZone) => string;
35
36
  export declare const DEFAULT_UP = "var(--success-color, #16a34a)";
36
37
  export declare const DEFAULT_DOWN = "var(--danger-color, #dc2626)";
37
38
  /** Colors of the bids / buys (`up`) and asks / sells (`down`) */
@@ -34,11 +34,11 @@ var r = (e, r) => {
34
34
  priceDecimals: c,
35
35
  sizeDecimals: l
36
36
  };
37
- }, s = (e, t = 2) => String(e).padStart(t, "0"), c = (e, t = !0) => {
38
- let n = new Date(e);
39
- if (Number.isNaN(n.getTime())) return "–";
40
- let r = `${s(n.getHours())}:${s(n.getMinutes())}:${s(n.getSeconds())}`;
41
- return t ? `${r}.${s(n.getMilliseconds(), 3)}` : r;
37
+ }, s = (e, t = 2) => String(e).padStart(t, "0"), c = (e, t = !0, n = "local") => {
38
+ let r = new Date(e);
39
+ if (Number.isNaN(r.getTime())) return "–";
40
+ let i = n === "utc", a = i ? `${s(r.getUTCHours())}:${s(r.getUTCMinutes())}:${s(r.getUTCSeconds())}` : `${s(r.getHours())}:${s(r.getMinutes())}:${s(r.getSeconds())}`;
41
+ return t ? `${a}.${s(i ? r.getUTCMilliseconds() : r.getMilliseconds(), 3)}` : a;
42
42
  }, l = "var(--success-color, #16a34a)", u = "var(--danger-color, #dc2626)", d = [
43
43
  .09,
44
44
  .64,
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","names":["intlNumberFormat","numberFormat$1","numberFormat","d","decimals","resolveLocale","locale","formatCompactNumber","value","resolved","abs","unit","suffix","compactUnits","maxDecimals","formatPercent","fraction","signed","createFormatters","options","priceDecimals","inferredPrice","sizeDecimals","inferredSize","priceFormat","sizeFormat","finite","fn","size","v","compact","pad","length","formatClock","time","base","milliseconds","DEFAULT_UP","DEFAULT_DOWN","UP_FALLBACK","DOWN_FALLBACK","sideColors","resolve","theme","fallback","redUp","fontOf","weight","ease","tau","dt","clamp","min","max","roundRect","radius","r","w","h","ctx","x","y"],"sources":["../../../../../charts/src/engine/orderbook/format.ts"],"sourcesContent":["// Number, time and color helpers shared by the order book widgets.\n\nimport type { ChartTheme } from \"../theme\";\nimport type { Rgba } from \"../color\";\nimport {\n compactUnits,\n numberFormat as intlNumberFormat,\n resolveLocale,\n} from \"../locale\";\nimport type { OrderBookCommonOptions } from \"./types\";\n\n/** Cached `Intl.NumberFormat` with fixed decimals (page language when `locale` is omitted) */\nexport const numberFormat = (\n locale: string | undefined,\n decimals: number,\n): Intl.NumberFormat => {\n const d = Math.max(0, Math.min(12, Math.round(decimals)));\n return intlNumberFormat(resolveLocale(locale), {\n minimumFractionDigits: d,\n maximumFractionDigits: d,\n });\n};\n\n/**\n * Compact number in the units of the language (12.4k, 1.25 M, 3.2万, 1.5億),\n * with the locale's decimal separator\n */\nexport const formatCompactNumber = (\n value: number,\n locale?: string,\n maxDecimals = 2,\n): string => {\n if (!Number.isFinite(value)) return \"–\";\n const resolved = resolveLocale(locale);\n const abs = Math.abs(value);\n for (const [unit, suffix] of compactUnits(resolved)) {\n if (abs >= unit)\n return (\n intlNumberFormat(resolved, {\n maximumFractionDigits: maxDecimals,\n }).format(value / unit) + suffix\n );\n }\n return intlNumberFormat(resolved, {\n maximumFractionDigits: abs >= 100 ? 0 : abs >= 1 ? 2 : 4,\n }).format(value);\n};\n\n/** Signed percentage of a fraction (`+0.125%`), in the locale */\nexport const formatPercent = (\n fraction: number,\n locale?: string,\n decimals = 2,\n signed = true,\n): string => {\n if (!Number.isFinite(fraction)) return \"–\";\n const d = Math.max(0, Math.min(6, Math.round(decimals)));\n return intlNumberFormat(resolveLocale(locale), {\n style: \"percent\",\n minimumFractionDigits: d,\n maximumFractionDigits: d,\n signDisplay: signed ? \"exceptZero\" : \"auto\",\n }).format(fraction);\n};\n\nexport interface Formatters {\n price: (value: number) => string;\n size: (value: number) => string;\n /** Large totals: compact (12.4k, 124万) above a million */\n total: (value: number) => string;\n /** Notional values: compact above ten thousand */\n notional: (value: number) => string;\n /** Axis values: always compact when large */\n compact: (value: number) => string;\n /** Fixed decimals in the locale (basis points, shares) */\n fixed: (value: number, decimals: number) => string;\n /** Percentage of a fraction (signed by default) */\n percent: (fraction: number, decimals?: number, signed?: boolean) => string;\n /** Resolved locale (`locale` option or page language) */\n locale: string;\n priceDecimals: number;\n sizeDecimals: number;\n}\n\n/** Formatters of the options, with inferred decimals as fallbacks */\nexport const createFormatters = (\n options: OrderBookCommonOptions,\n inferredPrice: number,\n inferredSize: number,\n): Formatters => {\n const locale = resolveLocale(options.locale);\n const priceDecimals = options.pricePrecision ?? inferredPrice;\n const sizeDecimals = options.sizePrecision ?? inferredSize;\n const priceFormat = numberFormat(locale, priceDecimals);\n const sizeFormat = numberFormat(locale, sizeDecimals);\n const finite =\n (fn: (value: number) => string) =>\n (value: number): string =>\n Number.isFinite(value) ? fn(value) : \"–\";\n const size = finite(options.formatSize ?? ((v) => sizeFormat.format(v)));\n const compact = (v: number) => formatCompactNumber(v, locale, 2);\n return {\n price: finite(options.formatPrice ?? ((v) => priceFormat.format(v))),\n size,\n total: finite((v) => (Math.abs(v) >= 1e6 ? compact(v) : size(v))),\n notional: finite((v) =>\n Math.abs(v) >= 1e4 ? compact(v) : numberFormat(locale, 2).format(v),\n ),\n compact: finite(compact),\n fixed: (v, decimals) =>\n Number.isFinite(v) ? numberFormat(locale, decimals).format(v) : \"–\",\n percent: (fraction, decimals = 2, signed = true) =>\n formatPercent(fraction, locale, decimals, signed),\n locale,\n priceDecimals,\n sizeDecimals,\n };\n};\n\nconst pad = (value: number, length = 2) => String(value).padStart(length, \"0\");\n\n/** `HH:MM:SS` or `HH:MM:SS.mmm`, local time */\nexport const formatClock = (time: number, milliseconds = true): string => {\n const d = new Date(time);\n if (Number.isNaN(d.getTime())) return \"–\";\n const base = `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n return milliseconds ? `${base}.${pad(d.getMilliseconds(), 3)}` : base;\n};\n\nexport const DEFAULT_UP = \"var(--success-color, #16a34a)\";\nexport const DEFAULT_DOWN = \"var(--danger-color, #dc2626)\";\nconst UP_FALLBACK: Rgba = [0.09, 0.64, 0.29, 1];\nconst DOWN_FALLBACK: Rgba = [0.86, 0.15, 0.15, 1];\n\n/** Colors of the bids / buys (`up`) and asks / sells (`down`) */\nexport const sideColors = (\n theme: ChartTheme,\n options: OrderBookCommonOptions,\n): { up: Rgba; down: Rgba } => {\n const resolve = (value: string, fallback: Rgba) =>\n theme.resolve ? theme.resolve(value, fallback) : fallback;\n const redUp = options.colorConvention === \"red-up\";\n return {\n up: resolve(\n options.upColor ?? (redUp ? DEFAULT_DOWN : DEFAULT_UP),\n redUp ? DOWN_FALLBACK : UP_FALLBACK,\n ),\n down: resolve(\n options.downColor ?? (redUp ? DEFAULT_UP : DEFAULT_DOWN),\n redUp ? UP_FALLBACK : DOWN_FALLBACK,\n ),\n };\n};\n\n/** Canvas font of the options */\nexport const fontOf = (\n theme: ChartTheme,\n options: OrderBookCommonOptions,\n weight: number | string = 400,\n size?: number,\n): string =>\n `${weight} ${size ?? options.fontSize ?? 12}px ${options.fontFamily ?? theme.fontFamily}`;\n\n/** Exponential smoothing factor for a frame of `dt` ms */\nexport const ease = (dt: number, tau: number): number =>\n tau <= 0 ? 1 : 1 - Math.exp(-Math.max(0, dt) / tau);\n\nexport const clamp = (value: number, min: number, max: number): number =>\n value < min ? min : value > max ? max : value;\n\n/** Rounded rectangle path (`roundRect` is missing in older browsers) */\nexport const roundRect = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n) => {\n const radius = Math.max(0, Math.min(r, w / 2, h / 2));\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.arcTo(x + w, y, x + w, y + h, radius);\n ctx.arcTo(x + w, y + h, x, y + h, radius);\n ctx.arcTo(x, y + h, x, y, radius);\n ctx.arcTo(x, y, x + w, y, radius);\n ctx.closePath();\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"format.js","names":["intlNumberFormat","numberFormat$1","numberFormat","d","decimals","resolveLocale","locale","formatCompactNumber","value","resolved","abs","unit","suffix","compactUnits","maxDecimals","formatPercent","fraction","signed","createFormatters","options","priceDecimals","inferredPrice","sizeDecimals","inferredSize","priceFormat","sizeFormat","finite","fn","size","v","compact","pad","length","formatClock","time","utc","timeZone","base","milliseconds","DEFAULT_UP","DEFAULT_DOWN","UP_FALLBACK","DOWN_FALLBACK","sideColors","resolve","theme","fallback","redUp","fontOf","weight","ease","tau","dt","clamp","min","max","roundRect","radius","r","w","h","ctx","x","y"],"sources":["../../../../../charts/src/engine/orderbook/format.ts"],"sourcesContent":["// Number, time and color helpers shared by the order book widgets.\n\nimport type { ChartTheme } from \"../theme\";\nimport type { Rgba } from \"../color\";\nimport type { ChartTimeZone } from \"../types\";\nimport {\n compactUnits,\n numberFormat as intlNumberFormat,\n resolveLocale,\n} from \"../locale\";\nimport type { OrderBookCommonOptions } from \"./types\";\n\n/** Cached `Intl.NumberFormat` with fixed decimals (page language when `locale` is omitted) */\nexport const numberFormat = (\n locale: string | undefined,\n decimals: number,\n): Intl.NumberFormat => {\n const d = Math.max(0, Math.min(12, Math.round(decimals)));\n return intlNumberFormat(resolveLocale(locale), {\n minimumFractionDigits: d,\n maximumFractionDigits: d,\n });\n};\n\n/**\n * Compact number in the units of the language (12.4k, 1.25 M, 3.2万, 1.5億),\n * with the locale's decimal separator\n */\nexport const formatCompactNumber = (\n value: number,\n locale?: string,\n maxDecimals = 2,\n): string => {\n if (!Number.isFinite(value)) return \"–\";\n const resolved = resolveLocale(locale);\n const abs = Math.abs(value);\n for (const [unit, suffix] of compactUnits(resolved)) {\n if (abs >= unit)\n return (\n intlNumberFormat(resolved, {\n maximumFractionDigits: maxDecimals,\n }).format(value / unit) + suffix\n );\n }\n return intlNumberFormat(resolved, {\n maximumFractionDigits: abs >= 100 ? 0 : abs >= 1 ? 2 : 4,\n }).format(value);\n};\n\n/** Signed percentage of a fraction (`+0.125%`), in the locale */\nexport const formatPercent = (\n fraction: number,\n locale?: string,\n decimals = 2,\n signed = true,\n): string => {\n if (!Number.isFinite(fraction)) return \"–\";\n const d = Math.max(0, Math.min(6, Math.round(decimals)));\n return intlNumberFormat(resolveLocale(locale), {\n style: \"percent\",\n minimumFractionDigits: d,\n maximumFractionDigits: d,\n signDisplay: signed ? \"exceptZero\" : \"auto\",\n }).format(fraction);\n};\n\nexport interface Formatters {\n price: (value: number) => string;\n size: (value: number) => string;\n /** Large totals: compact (12.4k, 124万) above a million */\n total: (value: number) => string;\n /** Notional values: compact above ten thousand */\n notional: (value: number) => string;\n /** Axis values: always compact when large */\n compact: (value: number) => string;\n /** Fixed decimals in the locale (basis points, shares) */\n fixed: (value: number, decimals: number) => string;\n /** Percentage of a fraction (signed by default) */\n percent: (fraction: number, decimals?: number, signed?: boolean) => string;\n /** Resolved locale (`locale` option or page language) */\n locale: string;\n priceDecimals: number;\n sizeDecimals: number;\n}\n\n/** Formatters of the options, with inferred decimals as fallbacks */\nexport const createFormatters = (\n options: OrderBookCommonOptions,\n inferredPrice: number,\n inferredSize: number,\n): Formatters => {\n const locale = resolveLocale(options.locale);\n const priceDecimals = options.pricePrecision ?? inferredPrice;\n const sizeDecimals = options.sizePrecision ?? inferredSize;\n const priceFormat = numberFormat(locale, priceDecimals);\n const sizeFormat = numberFormat(locale, sizeDecimals);\n const finite =\n (fn: (value: number) => string) =>\n (value: number): string =>\n Number.isFinite(value) ? fn(value) : \"–\";\n const size = finite(options.formatSize ?? ((v) => sizeFormat.format(v)));\n const compact = (v: number) => formatCompactNumber(v, locale, 2);\n return {\n price: finite(options.formatPrice ?? ((v) => priceFormat.format(v))),\n size,\n total: finite((v) => (Math.abs(v) >= 1e6 ? compact(v) : size(v))),\n notional: finite((v) =>\n Math.abs(v) >= 1e4 ? compact(v) : numberFormat(locale, 2).format(v),\n ),\n compact: finite(compact),\n fixed: (v, decimals) =>\n Number.isFinite(v) ? numberFormat(locale, decimals).format(v) : \"–\",\n percent: (fraction, decimals = 2, signed = true) =>\n formatPercent(fraction, locale, decimals, signed),\n locale,\n priceDecimals,\n sizeDecimals,\n };\n};\n\nconst pad = (value: number, length = 2) => String(value).padStart(length, \"0\");\n\n/** `HH:MM:SS` or `HH:MM:SS.mmm`, in the local time or UTC */\nexport const formatClock = (\n time: number,\n milliseconds = true,\n timeZone: ChartTimeZone = \"local\",\n): string => {\n const d = new Date(time);\n if (Number.isNaN(d.getTime())) return \"–\";\n const utc = timeZone === \"utc\";\n const base = utc\n ? `${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}`\n : `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n return milliseconds\n ? `${base}.${pad(utc ? d.getUTCMilliseconds() : d.getMilliseconds(), 3)}`\n : base;\n};\n\nexport const DEFAULT_UP = \"var(--success-color, #16a34a)\";\nexport const DEFAULT_DOWN = \"var(--danger-color, #dc2626)\";\nconst UP_FALLBACK: Rgba = [0.09, 0.64, 0.29, 1];\nconst DOWN_FALLBACK: Rgba = [0.86, 0.15, 0.15, 1];\n\n/** Colors of the bids / buys (`up`) and asks / sells (`down`) */\nexport const sideColors = (\n theme: ChartTheme,\n options: OrderBookCommonOptions,\n): { up: Rgba; down: Rgba } => {\n const resolve = (value: string, fallback: Rgba) =>\n theme.resolve ? theme.resolve(value, fallback) : fallback;\n const redUp = options.colorConvention === \"red-up\";\n return {\n up: resolve(\n options.upColor ?? (redUp ? DEFAULT_DOWN : DEFAULT_UP),\n redUp ? DOWN_FALLBACK : UP_FALLBACK,\n ),\n down: resolve(\n options.downColor ?? (redUp ? DEFAULT_UP : DEFAULT_DOWN),\n redUp ? UP_FALLBACK : DOWN_FALLBACK,\n ),\n };\n};\n\n/** Canvas font of the options */\nexport const fontOf = (\n theme: ChartTheme,\n options: OrderBookCommonOptions,\n weight: number | string = 400,\n size?: number,\n): string =>\n `${weight} ${size ?? options.fontSize ?? 12}px ${options.fontFamily ?? theme.fontFamily}`;\n\n/** Exponential smoothing factor for a frame of `dt` ms */\nexport const ease = (dt: number, tau: number): number =>\n tau <= 0 ? 1 : 1 - Math.exp(-Math.max(0, dt) / tau);\n\nexport const clamp = (value: number, min: number, max: number): number =>\n value < min ? min : value > max ? max : value;\n\n/** Rounded rectangle path (`roundRect` is missing in older browsers) */\nexport const roundRect = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n) => {\n const radius = Math.max(0, Math.min(r, w / 2, h / 2));\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.arcTo(x + w, y, x + w, y + h, radius);\n ctx.arcTo(x + w, y + h, x, y + h, radius);\n ctx.arcTo(x, y + h, x, y, radius);\n ctx.arcTo(x, y, x + w, y, radius);\n ctx.closePath();\n};\n"],"mappings":"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"}