minerva-design 1.4.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (824) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +21 -21
  3. package/custom-elements.json +3072 -611
  4. package/dist/angular/fesm2022/minerva-angular.mjs +1491 -5
  5. package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
  6. package/dist/angular/types/minerva-angular.d.ts +595 -5
  7. package/dist/charts/canvas.d.cts +4 -3
  8. package/dist/charts/canvas.d.ts +4 -3
  9. package/dist/charts/core.cjs +1 -1
  10. package/dist/charts/core.d.cts +6 -4
  11. package/dist/charts/core.d.ts +6 -4
  12. package/dist/charts/core.js +24 -16
  13. package/dist/charts/engine/axis.cjs +1 -1
  14. package/dist/charts/engine/axis.cjs.map +1 -1
  15. package/dist/charts/engine/axis.js +42 -19
  16. package/dist/charts/engine/axis.js.map +1 -1
  17. package/dist/charts/engine/canvas.cjs +1 -1
  18. package/dist/charts/engine/canvas.cjs.map +1 -1
  19. package/dist/charts/engine/canvas.js +155 -127
  20. package/dist/charts/engine/canvas.js.map +1 -1
  21. package/dist/charts/engine/chart.cjs +1 -1
  22. package/dist/charts/engine/chart.cjs.map +1 -1
  23. package/dist/charts/engine/chart.js +370 -255
  24. package/dist/charts/engine/chart.js.map +1 -1
  25. package/dist/charts/engine/color.cjs +1 -1
  26. package/dist/charts/engine/color.cjs.map +1 -1
  27. package/dist/charts/engine/color.d.cts +18 -0
  28. package/dist/charts/engine/color.d.ts +18 -0
  29. package/dist/charts/engine/color.js +48 -2
  30. package/dist/charts/engine/color.js.map +1 -1
  31. package/dist/charts/engine/controller.cjs +2 -2
  32. package/dist/charts/engine/controller.cjs.map +1 -1
  33. package/dist/charts/engine/controller.d.cts +34 -1
  34. package/dist/charts/engine/controller.d.ts +34 -1
  35. package/dist/charts/engine/controller.js +318 -273
  36. package/dist/charts/engine/controller.js.map +1 -1
  37. package/dist/charts/engine/data.cjs +1 -1
  38. package/dist/charts/engine/data.cjs.map +1 -1
  39. package/dist/charts/engine/data.d.cts +3 -1
  40. package/dist/charts/engine/data.d.ts +3 -1
  41. package/dist/charts/engine/data.js +6 -4
  42. package/dist/charts/engine/data.js.map +1 -1
  43. package/dist/charts/engine/defaults.cjs +2 -0
  44. package/dist/charts/engine/defaults.cjs.map +1 -0
  45. package/dist/charts/engine/defaults.d.cts +20 -0
  46. package/dist/charts/engine/defaults.d.ts +20 -0
  47. package/dist/charts/engine/defaults.js +35 -0
  48. package/dist/charts/engine/defaults.js.map +1 -0
  49. package/dist/charts/engine/format.cjs +1 -1
  50. package/dist/charts/engine/format.cjs.map +1 -1
  51. package/dist/charts/engine/format.d.cts +6 -0
  52. package/dist/charts/engine/format.d.ts +6 -0
  53. package/dist/charts/engine/format.js +15 -2
  54. package/dist/charts/engine/format.js.map +1 -1
  55. package/dist/charts/engine/graph/chart.cjs +2 -0
  56. package/dist/charts/engine/graph/chart.cjs.map +1 -0
  57. package/dist/charts/engine/graph/chart.d.cts +3 -0
  58. package/dist/charts/engine/graph/chart.d.ts +3 -0
  59. package/dist/charts/engine/graph/chart.js +1708 -0
  60. package/dist/charts/engine/graph/chart.js.map +1 -0
  61. package/dist/charts/engine/graph/circular.cjs +2 -0
  62. package/dist/charts/engine/graph/circular.cjs.map +1 -0
  63. package/dist/charts/engine/graph/circular.d.cts +16 -0
  64. package/dist/charts/engine/graph/circular.d.ts +16 -0
  65. package/dist/charts/engine/graph/circular.js +62 -0
  66. package/dist/charts/engine/graph/circular.js.map +1 -0
  67. package/dist/charts/engine/graph/dag.cjs +2 -0
  68. package/dist/charts/engine/graph/dag.cjs.map +1 -0
  69. package/dist/charts/engine/graph/dag.d.cts +34 -0
  70. package/dist/charts/engine/graph/dag.d.ts +34 -0
  71. package/dist/charts/engine/graph/dag.js +339 -0
  72. package/dist/charts/engine/graph/dag.js.map +1 -0
  73. package/dist/charts/engine/graph/dom.cjs +2 -0
  74. package/dist/charts/engine/graph/dom.cjs.map +1 -0
  75. package/dist/charts/engine/graph/dom.d.cts +23 -0
  76. package/dist/charts/engine/graph/dom.d.ts +23 -0
  77. package/dist/charts/engine/graph/dom.js +158 -0
  78. package/dist/charts/engine/graph/dom.js.map +1 -0
  79. package/dist/charts/engine/graph/force.cjs +2 -0
  80. package/dist/charts/engine/graph/force.cjs.map +1 -0
  81. package/dist/charts/engine/graph/force.d.cts +76 -0
  82. package/dist/charts/engine/graph/force.d.ts +76 -0
  83. package/dist/charts/engine/graph/force.js +423 -0
  84. package/dist/charts/engine/graph/force.js.map +1 -0
  85. package/dist/charts/engine/graph/geometry.cjs +2 -0
  86. package/dist/charts/engine/graph/geometry.cjs.map +1 -0
  87. package/dist/charts/engine/graph/geometry.d.cts +50 -0
  88. package/dist/charts/engine/graph/geometry.d.ts +50 -0
  89. package/dist/charts/engine/graph/geometry.js +197 -0
  90. package/dist/charts/engine/graph/geometry.js.map +1 -0
  91. package/dist/charts/engine/graph/index.cjs +1 -0
  92. package/dist/charts/engine/graph/index.d.cts +6 -0
  93. package/dist/charts/engine/graph/index.d.ts +6 -0
  94. package/dist/charts/engine/graph/index.js +6 -0
  95. package/dist/charts/engine/graph/labels.cjs +2 -0
  96. package/dist/charts/engine/graph/labels.cjs.map +1 -0
  97. package/dist/charts/engine/graph/labels.d.cts +12 -0
  98. package/dist/charts/engine/graph/labels.d.ts +12 -0
  99. package/dist/charts/engine/graph/labels.js +128 -0
  100. package/dist/charts/engine/graph/labels.js.map +1 -0
  101. package/dist/charts/engine/graph/model.cjs +2 -0
  102. package/dist/charts/engine/graph/model.cjs.map +1 -0
  103. package/dist/charts/engine/graph/model.d.cts +52 -0
  104. package/dist/charts/engine/graph/model.d.ts +52 -0
  105. package/dist/charts/engine/graph/model.js +108 -0
  106. package/dist/charts/engine/graph/model.js.map +1 -0
  107. package/dist/charts/engine/graph/sizing.cjs +2 -0
  108. package/dist/charts/engine/graph/sizing.cjs.map +1 -0
  109. package/dist/charts/engine/graph/sizing.d.cts +33 -0
  110. package/dist/charts/engine/graph/sizing.d.ts +33 -0
  111. package/dist/charts/engine/graph/sizing.js +60 -0
  112. package/dist/charts/engine/graph/sizing.js.map +1 -0
  113. package/dist/charts/engine/graph/tree.cjs +2 -0
  114. package/dist/charts/engine/graph/tree.cjs.map +1 -0
  115. package/dist/charts/engine/graph/tree.d.cts +30 -0
  116. package/dist/charts/engine/graph/tree.d.ts +30 -0
  117. package/dist/charts/engine/graph/tree.js +218 -0
  118. package/dist/charts/engine/graph/tree.js.map +1 -0
  119. package/dist/charts/engine/graph/types.d.cts +640 -0
  120. package/dist/charts/engine/graph/types.d.ts +640 -0
  121. package/dist/charts/engine/graph/worker.cjs +52 -0
  122. package/dist/charts/engine/graph/worker.cjs.map +1 -0
  123. package/dist/charts/engine/graph/worker.d.cts +36 -0
  124. package/dist/charts/engine/graph/worker.d.ts +36 -0
  125. package/dist/charts/engine/graph/worker.js +135 -0
  126. package/dist/charts/engine/graph/worker.js.map +1 -0
  127. package/dist/charts/engine/items.cjs +1 -1
  128. package/dist/charts/engine/items.cjs.map +1 -1
  129. package/dist/charts/engine/items.d.cts +15 -2
  130. package/dist/charts/engine/items.d.ts +15 -2
  131. package/dist/charts/engine/items.js +131 -112
  132. package/dist/charts/engine/items.js.map +1 -1
  133. package/dist/charts/engine/labels.cjs +1 -1
  134. package/dist/charts/engine/labels.cjs.map +1 -1
  135. package/dist/charts/engine/labels.d.cts +17 -0
  136. package/dist/charts/engine/labels.d.ts +17 -0
  137. package/dist/charts/engine/labels.js +28 -4
  138. package/dist/charts/engine/labels.js.map +1 -1
  139. package/dist/charts/engine/layout.cjs +1 -1
  140. package/dist/charts/engine/layout.cjs.map +1 -1
  141. package/dist/charts/engine/layout.d.cts +9 -0
  142. package/dist/charts/engine/layout.d.ts +9 -0
  143. package/dist/charts/engine/layout.js +11 -2
  144. package/dist/charts/engine/layout.js.map +1 -1
  145. package/dist/charts/engine/model.cjs +1 -1
  146. package/dist/charts/engine/model.cjs.map +1 -1
  147. package/dist/charts/engine/model.d.cts +73 -3
  148. package/dist/charts/engine/model.d.ts +73 -3
  149. package/dist/charts/engine/model.js +258 -154
  150. package/dist/charts/engine/model.js.map +1 -1
  151. package/dist/charts/engine/orderbook/field.cjs +37 -0
  152. package/dist/charts/engine/orderbook/field.cjs.map +1 -0
  153. package/dist/charts/engine/orderbook/field.d.cts +92 -0
  154. package/dist/charts/engine/orderbook/field.d.ts +92 -0
  155. package/dist/charts/engine/orderbook/field.js +297 -0
  156. package/dist/charts/engine/orderbook/field.js.map +1 -0
  157. package/dist/charts/engine/orderbook/format.cjs +1 -1
  158. package/dist/charts/engine/orderbook/format.cjs.map +1 -1
  159. package/dist/charts/engine/orderbook/format.d.cts +3 -2
  160. package/dist/charts/engine/orderbook/format.d.ts +3 -2
  161. package/dist/charts/engine/orderbook/format.js +5 -5
  162. package/dist/charts/engine/orderbook/format.js.map +1 -1
  163. package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
  164. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
  165. package/dist/charts/engine/orderbook/heatmap.js +566 -475
  166. package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
  167. package/dist/charts/engine/orderbook/host.cjs +1 -1
  168. package/dist/charts/engine/orderbook/host.cjs.map +1 -1
  169. package/dist/charts/engine/orderbook/host.d.cts +8 -1
  170. package/dist/charts/engine/orderbook/host.d.ts +8 -1
  171. package/dist/charts/engine/orderbook/host.js +27 -5
  172. package/dist/charts/engine/orderbook/host.js.map +1 -1
  173. package/dist/charts/engine/orderbook/ladder.cjs +1 -1
  174. package/dist/charts/engine/orderbook/ladder.cjs.map +1 -1
  175. package/dist/charts/engine/orderbook/ladder.js +1 -1
  176. package/dist/charts/engine/orderbook/ladder.js.map +1 -1
  177. package/dist/charts/engine/orderbook/layout.cjs +2 -0
  178. package/dist/charts/engine/orderbook/layout.cjs.map +1 -0
  179. package/dist/charts/engine/orderbook/layout.d.cts +42 -0
  180. package/dist/charts/engine/orderbook/layout.d.ts +42 -0
  181. package/dist/charts/engine/orderbook/layout.js +76 -0
  182. package/dist/charts/engine/orderbook/layout.js.map +1 -0
  183. package/dist/charts/engine/orderbook/tape.cjs +1 -1
  184. package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
  185. package/dist/charts/engine/orderbook/tape.js +4 -4
  186. package/dist/charts/engine/orderbook/tape.js.map +1 -1
  187. package/dist/charts/engine/orderbook/types.d.cts +27 -3
  188. package/dist/charts/engine/orderbook/types.d.ts +27 -3
  189. package/dist/charts/engine/overlay.cjs +1 -1
  190. package/dist/charts/engine/overlay.cjs.map +1 -1
  191. package/dist/charts/engine/overlay.d.cts +27 -0
  192. package/dist/charts/engine/overlay.d.ts +27 -0
  193. package/dist/charts/engine/overlay.js +34 -12
  194. package/dist/charts/engine/overlay.js.map +1 -1
  195. package/dist/charts/engine/presets.cjs +2 -2
  196. package/dist/charts/engine/presets.cjs.map +1 -1
  197. package/dist/charts/engine/presets.d.cts +35 -3
  198. package/dist/charts/engine/presets.d.ts +35 -3
  199. package/dist/charts/engine/presets.js +121 -101
  200. package/dist/charts/engine/presets.js.map +1 -1
  201. package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
  202. package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
  203. package/dist/charts/engine/renderers/canvas2d.js +13 -9
  204. package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
  205. package/dist/charts/engine/renderers/detect.cjs +1 -1
  206. package/dist/charts/engine/renderers/detect.cjs.map +1 -1
  207. package/dist/charts/engine/renderers/detect.d.cts +2 -1
  208. package/dist/charts/engine/renderers/detect.d.ts +2 -1
  209. package/dist/charts/engine/renderers/detect.js +23 -21
  210. package/dist/charts/engine/renderers/detect.js.map +1 -1
  211. package/dist/charts/engine/renderers/follow.cjs +2 -0
  212. package/dist/charts/engine/renderers/follow.cjs.map +1 -0
  213. package/dist/charts/engine/renderers/follow.d.cts +8 -0
  214. package/dist/charts/engine/renderers/follow.d.ts +8 -0
  215. package/dist/charts/engine/renderers/follow.js +10 -0
  216. package/dist/charts/engine/renderers/follow.js.map +1 -0
  217. package/dist/charts/engine/renderers/gl-budget.cjs +2 -0
  218. package/dist/charts/engine/renderers/gl-budget.cjs.map +1 -0
  219. package/dist/charts/engine/renderers/gl-budget.d.cts +32 -0
  220. package/dist/charts/engine/renderers/gl-budget.d.ts +32 -0
  221. package/dist/charts/engine/renderers/gl-budget.js +95 -0
  222. package/dist/charts/engine/renderers/gl-budget.js.map +1 -0
  223. package/dist/charts/engine/renderers/gl.cjs +1 -1
  224. package/dist/charts/engine/renderers/gl.cjs.map +1 -1
  225. package/dist/charts/engine/renderers/gl.js +1 -1
  226. package/dist/charts/engine/renderers/gl.js.map +1 -1
  227. package/dist/charts/engine/renderers/shaders.cjs +9 -6
  228. package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
  229. package/dist/charts/engine/renderers/shaders.d.cts +1 -1
  230. package/dist/charts/engine/renderers/shaders.d.ts +1 -1
  231. package/dist/charts/engine/renderers/shaders.js +9 -6
  232. package/dist/charts/engine/renderers/shaders.js.map +1 -1
  233. package/dist/charts/engine/renderers/types.cjs.map +1 -1
  234. package/dist/charts/engine/renderers/types.d.cts +2 -0
  235. package/dist/charts/engine/renderers/types.d.ts +2 -0
  236. package/dist/charts/engine/renderers/types.js.map +1 -1
  237. package/dist/charts/engine/renderers/webgl.cjs +1 -1
  238. package/dist/charts/engine/renderers/webgl.cjs.map +1 -1
  239. package/dist/charts/engine/renderers/webgl.js +85 -64
  240. package/dist/charts/engine/renderers/webgl.js.map +1 -1
  241. package/dist/charts/engine/renderers/webgl2.cjs +1 -1
  242. package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
  243. package/dist/charts/engine/renderers/webgl2.js +72 -58
  244. package/dist/charts/engine/renderers/webgl2.js.map +1 -1
  245. package/dist/charts/engine/renderers/webgpu.cjs +1 -1
  246. package/dist/charts/engine/renderers/webgpu.cjs.map +1 -1
  247. package/dist/charts/engine/renderers/webgpu.js +1 -1
  248. package/dist/charts/engine/renderers/webgpu.js.map +1 -1
  249. package/dist/charts/engine/scene.cjs +1 -1
  250. package/dist/charts/engine/scene.cjs.map +1 -1
  251. package/dist/charts/engine/scene.d.cts +104 -4
  252. package/dist/charts/engine/scene.d.ts +104 -4
  253. package/dist/charts/engine/scene.js +412 -193
  254. package/dist/charts/engine/scene.js.map +1 -1
  255. package/dist/charts/engine/shapes/bullet.cjs +1 -1
  256. package/dist/charts/engine/shapes/bullet.cjs.map +1 -1
  257. package/dist/charts/engine/shapes/bullet.js +110 -110
  258. package/dist/charts/engine/shapes/bullet.js.map +1 -1
  259. package/dist/charts/engine/shapes/chart.cjs +1 -1
  260. package/dist/charts/engine/shapes/chart.cjs.map +1 -1
  261. package/dist/charts/engine/shapes/chart.js +4 -1
  262. package/dist/charts/engine/shapes/chart.js.map +1 -1
  263. package/dist/charts/engine/shapes/chord.cjs +2 -0
  264. package/dist/charts/engine/shapes/chord.cjs.map +1 -0
  265. package/dist/charts/engine/shapes/chord.d.cts +18 -0
  266. package/dist/charts/engine/shapes/chord.d.ts +18 -0
  267. package/dist/charts/engine/shapes/chord.js +419 -0
  268. package/dist/charts/engine/shapes/chord.js.map +1 -0
  269. package/dist/charts/engine/shapes/draw.cjs +1 -1
  270. package/dist/charts/engine/shapes/draw.cjs.map +1 -1
  271. package/dist/charts/engine/shapes/draw.d.cts +5 -1
  272. package/dist/charts/engine/shapes/draw.d.ts +5 -1
  273. package/dist/charts/engine/shapes/draw.js +47 -17
  274. package/dist/charts/engine/shapes/draw.js.map +1 -1
  275. package/dist/charts/engine/shapes/hit.cjs +1 -1
  276. package/dist/charts/engine/shapes/hit.cjs.map +1 -1
  277. package/dist/charts/engine/shapes/hit.d.cts +3 -1
  278. package/dist/charts/engine/shapes/hit.d.ts +3 -1
  279. package/dist/charts/engine/shapes/hit.js +75 -46
  280. package/dist/charts/engine/shapes/hit.js.map +1 -1
  281. package/dist/charts/engine/shapes/index.d.cts +3 -2
  282. package/dist/charts/engine/shapes/index.d.ts +3 -2
  283. package/dist/charts/engine/shapes/labels.cjs +1 -1
  284. package/dist/charts/engine/shapes/labels.cjs.map +1 -1
  285. package/dist/charts/engine/shapes/labels.js +12 -4
  286. package/dist/charts/engine/shapes/labels.js.map +1 -1
  287. package/dist/charts/engine/shapes/layout.cjs +2 -2
  288. package/dist/charts/engine/shapes/layout.cjs.map +1 -1
  289. package/dist/charts/engine/shapes/layout.d.cts +3 -1
  290. package/dist/charts/engine/shapes/layout.d.ts +3 -1
  291. package/dist/charts/engine/shapes/layout.js +106 -78
  292. package/dist/charts/engine/shapes/layout.js.map +1 -1
  293. package/dist/charts/engine/shapes/scene.cjs +1 -1
  294. package/dist/charts/engine/shapes/scene.cjs.map +1 -1
  295. package/dist/charts/engine/shapes/scene.d.cts +33 -3
  296. package/dist/charts/engine/shapes/scene.d.ts +33 -3
  297. package/dist/charts/engine/shapes/scene.js +62 -19
  298. package/dist/charts/engine/shapes/scene.js.map +1 -1
  299. package/dist/charts/engine/shapes/types.d.cts +121 -8
  300. package/dist/charts/engine/shapes/types.d.ts +121 -8
  301. package/dist/charts/engine/signature.cjs +1 -1
  302. package/dist/charts/engine/signature.cjs.map +1 -1
  303. package/dist/charts/engine/signature.js +1 -1
  304. package/dist/charts/engine/signature.js.map +1 -1
  305. package/dist/charts/engine/three-d/canvas2d.cjs +1 -1
  306. package/dist/charts/engine/three-d/canvas2d.cjs.map +1 -1
  307. package/dist/charts/engine/three-d/canvas2d.d.cts +41 -3
  308. package/dist/charts/engine/three-d/canvas2d.d.ts +41 -3
  309. package/dist/charts/engine/three-d/canvas2d.js +166 -67
  310. package/dist/charts/engine/three-d/canvas2d.js.map +1 -1
  311. package/dist/charts/engine/three-d/chart.cjs +1 -1
  312. package/dist/charts/engine/three-d/chart.cjs.map +1 -1
  313. package/dist/charts/engine/three-d/chart.js +219 -215
  314. package/dist/charts/engine/three-d/chart.js.map +1 -1
  315. package/dist/charts/engine/three-d/detect.cjs +1 -1
  316. package/dist/charts/engine/three-d/detect.cjs.map +1 -1
  317. package/dist/charts/engine/three-d/detect.d.cts +3 -2
  318. package/dist/charts/engine/three-d/detect.d.ts +3 -2
  319. package/dist/charts/engine/three-d/detect.js +22 -20
  320. package/dist/charts/engine/three-d/detect.js.map +1 -1
  321. package/dist/charts/engine/three-d/geometry.cjs +1 -1
  322. package/dist/charts/engine/three-d/geometry.cjs.map +1 -1
  323. package/dist/charts/engine/three-d/geometry.d.cts +6 -0
  324. package/dist/charts/engine/three-d/geometry.d.ts +6 -0
  325. package/dist/charts/engine/three-d/geometry.js +106 -90
  326. package/dist/charts/engine/three-d/geometry.js.map +1 -1
  327. package/dist/charts/engine/three-d/model.cjs +1 -1
  328. package/dist/charts/engine/three-d/model.cjs.map +1 -1
  329. package/dist/charts/engine/three-d/model.d.cts +2 -0
  330. package/dist/charts/engine/three-d/model.d.ts +2 -0
  331. package/dist/charts/engine/three-d/model.js +2 -0
  332. package/dist/charts/engine/three-d/model.js.map +1 -1
  333. package/dist/charts/engine/three-d/oit.cjs +109 -0
  334. package/dist/charts/engine/three-d/oit.cjs.map +1 -0
  335. package/dist/charts/engine/three-d/oit.d.cts +34 -0
  336. package/dist/charts/engine/three-d/oit.d.ts +34 -0
  337. package/dist/charts/engine/three-d/oit.js +111 -0
  338. package/dist/charts/engine/three-d/oit.js.map +1 -0
  339. package/dist/charts/engine/three-d/overlay.cjs +1 -1
  340. package/dist/charts/engine/three-d/overlay.cjs.map +1 -1
  341. package/dist/charts/engine/three-d/overlay.js +43 -36
  342. package/dist/charts/engine/three-d/overlay.js.map +1 -1
  343. package/dist/charts/engine/three-d/render-types.cjs +1 -1
  344. package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
  345. package/dist/charts/engine/three-d/render-types.d.cts +37 -3
  346. package/dist/charts/engine/three-d/render-types.d.ts +37 -3
  347. package/dist/charts/engine/three-d/render-types.js +6 -10
  348. package/dist/charts/engine/three-d/render-types.js.map +1 -1
  349. package/dist/charts/engine/three-d/shaders.cjs +109 -48
  350. package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
  351. package/dist/charts/engine/three-d/shaders.d.cts +12 -5
  352. package/dist/charts/engine/three-d/shaders.d.ts +12 -5
  353. package/dist/charts/engine/three-d/shaders.js +118 -55
  354. package/dist/charts/engine/three-d/shaders.js.map +1 -1
  355. package/dist/charts/engine/three-d/sort.cjs +1 -1
  356. package/dist/charts/engine/three-d/sort.cjs.map +1 -1
  357. package/dist/charts/engine/three-d/sort.d.cts +18 -5
  358. package/dist/charts/engine/three-d/sort.d.ts +18 -5
  359. package/dist/charts/engine/three-d/sort.js +129 -43
  360. package/dist/charts/engine/three-d/sort.js.map +1 -1
  361. package/dist/charts/engine/three-d/types.d.cts +36 -0
  362. package/dist/charts/engine/three-d/types.d.ts +36 -0
  363. package/dist/charts/engine/three-d/webgl.cjs +1 -1
  364. package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
  365. package/dist/charts/engine/three-d/webgl.d.cts +9 -0
  366. package/dist/charts/engine/three-d/webgl.d.ts +9 -0
  367. package/dist/charts/engine/three-d/webgl.js +199 -74
  368. package/dist/charts/engine/three-d/webgl.js.map +1 -1
  369. package/dist/charts/engine/three-d/webgpu.cjs +1 -1
  370. package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
  371. package/dist/charts/engine/three-d/webgpu.js +231 -94
  372. package/dist/charts/engine/three-d/webgpu.js.map +1 -1
  373. package/dist/charts/engine/trading/chart.cjs +1 -1
  374. package/dist/charts/engine/trading/chart.cjs.map +1 -1
  375. package/dist/charts/engine/trading/chart.d.cts +10 -1
  376. package/dist/charts/engine/trading/chart.d.ts +10 -1
  377. package/dist/charts/engine/trading/chart.js +1677 -813
  378. package/dist/charts/engine/trading/chart.js.map +1 -1
  379. package/dist/charts/engine/trading/drawings.cjs +2 -1
  380. package/dist/charts/engine/trading/drawings.cjs.map +1 -1
  381. package/dist/charts/engine/trading/drawings.d.cts +53 -9
  382. package/dist/charts/engine/trading/drawings.d.ts +53 -9
  383. package/dist/charts/engine/trading/drawings.js +346 -71
  384. package/dist/charts/engine/trading/drawings.js.map +1 -1
  385. package/dist/charts/engine/trading/format.cjs +1 -1
  386. package/dist/charts/engine/trading/format.cjs.map +1 -1
  387. package/dist/charts/engine/trading/format.d.cts +19 -0
  388. package/dist/charts/engine/trading/format.d.ts +19 -0
  389. package/dist/charts/engine/trading/format.js +65 -21
  390. package/dist/charts/engine/trading/format.js.map +1 -1
  391. package/dist/charts/engine/trading/geometry.cjs +1 -1
  392. package/dist/charts/engine/trading/geometry.cjs.map +1 -1
  393. package/dist/charts/engine/trading/geometry.d.cts +16 -0
  394. package/dist/charts/engine/trading/geometry.d.ts +16 -0
  395. package/dist/charts/engine/trading/geometry.js +19 -4
  396. package/dist/charts/engine/trading/geometry.js.map +1 -1
  397. package/dist/charts/engine/trading/index.cjs +1 -1
  398. package/dist/charts/engine/trading/index.d.cts +2 -1
  399. package/dist/charts/engine/trading/index.d.ts +2 -1
  400. package/dist/charts/engine/trading/index.js +4 -3
  401. package/dist/charts/engine/trading/indicators.cjs +1 -1
  402. package/dist/charts/engine/trading/indicators.cjs.map +1 -1
  403. package/dist/charts/engine/trading/indicators.d.cts +180 -10
  404. package/dist/charts/engine/trading/indicators.d.ts +180 -10
  405. package/dist/charts/engine/trading/indicators.js +449 -173
  406. package/dist/charts/engine/trading/indicators.js.map +1 -1
  407. package/dist/charts/engine/trading/labels.cjs +1 -1
  408. package/dist/charts/engine/trading/labels.cjs.map +1 -1
  409. package/dist/charts/engine/trading/labels.js +104 -4
  410. package/dist/charts/engine/trading/labels.js.map +1 -1
  411. package/dist/charts/engine/trading/store.cjs +1 -1
  412. package/dist/charts/engine/trading/store.cjs.map +1 -1
  413. package/dist/charts/engine/trading/store.d.cts +21 -0
  414. package/dist/charts/engine/trading/store.d.ts +21 -0
  415. package/dist/charts/engine/trading/store.js +22 -1
  416. package/dist/charts/engine/trading/store.js.map +1 -1
  417. package/dist/charts/engine/trading/studies.cjs +1 -1
  418. package/dist/charts/engine/trading/studies.cjs.map +1 -1
  419. package/dist/charts/engine/trading/studies.d.cts +49 -8
  420. package/dist/charts/engine/trading/studies.d.ts +49 -8
  421. package/dist/charts/engine/trading/studies.js +352 -93
  422. package/dist/charts/engine/trading/studies.js.map +1 -1
  423. package/dist/charts/engine/trading/sync.cjs +2 -0
  424. package/dist/charts/engine/trading/sync.cjs.map +1 -0
  425. package/dist/charts/engine/trading/sync.d.cts +8 -0
  426. package/dist/charts/engine/trading/sync.d.ts +8 -0
  427. package/dist/charts/engine/trading/sync.js +25 -0
  428. package/dist/charts/engine/trading/sync.js.map +1 -0
  429. package/dist/charts/engine/trading/types.d.cts +514 -16
  430. package/dist/charts/engine/trading/types.d.ts +514 -16
  431. package/dist/charts/engine/types.d.cts +106 -11
  432. package/dist/charts/engine/types.d.ts +106 -11
  433. package/dist/charts/index.cjs +1 -1
  434. package/dist/charts/index.d.cts +3 -2
  435. package/dist/charts/index.d.ts +3 -2
  436. package/dist/charts/index.js +30 -22
  437. package/dist/charts/react/charts.cjs +1 -1
  438. package/dist/charts/react/charts.cjs.map +1 -1
  439. package/dist/charts/react/charts.js +51 -34
  440. package/dist/charts/react/charts.js.map +1 -1
  441. package/dist/charts/react/graph.cjs +2 -0
  442. package/dist/charts/react/graph.cjs.map +1 -0
  443. package/dist/charts/react/graph.d.cts +219 -0
  444. package/dist/charts/react/graph.d.ts +219 -0
  445. package/dist/charts/react/graph.js +160 -0
  446. package/dist/charts/react/graph.js.map +1 -0
  447. package/dist/charts/react/orderbook.cjs +1 -1
  448. package/dist/charts/react/orderbook.cjs.map +1 -1
  449. package/dist/charts/react/orderbook.d.cts +3 -1
  450. package/dist/charts/react/orderbook.d.ts +3 -1
  451. package/dist/charts/react/orderbook.js +1 -0
  452. package/dist/charts/react/orderbook.js.map +1 -1
  453. package/dist/charts/react/shapes.cjs +1 -1
  454. package/dist/charts/react/shapes.cjs.map +1 -1
  455. package/dist/charts/react/shapes.d.cts +88 -4
  456. package/dist/charts/react/shapes.d.ts +88 -4
  457. package/dist/charts/react/shapes.js +55 -12
  458. package/dist/charts/react/shapes.js.map +1 -1
  459. package/dist/charts/react/three-d.cjs +1 -1
  460. package/dist/charts/react/three-d.cjs.map +1 -1
  461. package/dist/charts/react/three-d.d.cts +7 -0
  462. package/dist/charts/react/three-d.d.ts +7 -0
  463. package/dist/charts/react/three-d.js +14 -13
  464. package/dist/charts/react/three-d.js.map +1 -1
  465. package/dist/charts/react/trading.cjs +1 -1
  466. package/dist/charts/react/trading.cjs.map +1 -1
  467. package/dist/charts/react/trading.d.cts +54 -2
  468. package/dist/charts/react/trading.d.ts +54 -2
  469. package/dist/charts/react/trading.js +68 -37
  470. package/dist/charts/react/trading.js.map +1 -1
  471. package/dist/charts/react/types.d.cts +11 -0
  472. package/dist/charts/react/types.d.ts +11 -0
  473. package/dist/core/contracts.cjs +1 -1
  474. package/dist/core/contracts.cjs.map +1 -1
  475. package/dist/core/contracts.js +1 -1
  476. package/dist/core/contracts.js.map +1 -1
  477. package/dist/native/charts/src/canvas.cjs +1 -1
  478. package/dist/native/charts/src/canvas.js +5 -4
  479. package/dist/native/charts/src/engine/axis.cjs +1 -1
  480. package/dist/native/charts/src/engine/axis.cjs.map +1 -1
  481. package/dist/native/charts/src/engine/axis.js +42 -19
  482. package/dist/native/charts/src/engine/axis.js.map +1 -1
  483. package/dist/native/charts/src/engine/color.cjs +1 -1
  484. package/dist/native/charts/src/engine/color.cjs.map +1 -1
  485. package/dist/native/charts/src/engine/color.js +47 -5
  486. package/dist/native/charts/src/engine/color.js.map +1 -1
  487. package/dist/native/charts/src/engine/controller.cjs +2 -2
  488. package/dist/native/charts/src/engine/controller.cjs.map +1 -1
  489. package/dist/native/charts/src/engine/controller.js +296 -251
  490. package/dist/native/charts/src/engine/controller.js.map +1 -1
  491. package/dist/native/charts/src/engine/data.cjs +1 -1
  492. package/dist/native/charts/src/engine/data.cjs.map +1 -1
  493. package/dist/native/charts/src/engine/data.js +6 -4
  494. package/dist/native/charts/src/engine/data.js.map +1 -1
  495. package/dist/native/charts/src/engine/format.cjs +1 -1
  496. package/dist/native/charts/src/engine/format.cjs.map +1 -1
  497. package/dist/native/charts/src/engine/format.js +15 -2
  498. package/dist/native/charts/src/engine/format.js.map +1 -1
  499. package/dist/native/charts/src/engine/labels.cjs +1 -1
  500. package/dist/native/charts/src/engine/labels.cjs.map +1 -1
  501. package/dist/native/charts/src/engine/labels.js +42 -5
  502. package/dist/native/charts/src/engine/labels.js.map +1 -1
  503. package/dist/native/charts/src/engine/layout.cjs +1 -1
  504. package/dist/native/charts/src/engine/layout.cjs.map +1 -1
  505. package/dist/native/charts/src/engine/layout.js +11 -2
  506. package/dist/native/charts/src/engine/layout.js.map +1 -1
  507. package/dist/native/charts/src/engine/model.cjs +1 -1
  508. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  509. package/dist/native/charts/src/engine/model.js +278 -174
  510. package/dist/native/charts/src/engine/model.js.map +1 -1
  511. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  512. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  513. package/dist/native/charts/src/engine/presets.cjs +2 -2
  514. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  515. package/dist/native/charts/src/engine/presets.js +110 -90
  516. package/dist/native/charts/src/engine/presets.js.map +1 -1
  517. package/dist/native/charts/src/engine/scene.cjs +1 -1
  518. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  519. package/dist/native/charts/src/engine/scene.js +421 -202
  520. package/dist/native/charts/src/engine/scene.js.map +1 -1
  521. package/dist/native/charts/src/engine/shapes/bullet.cjs +1 -1
  522. package/dist/native/charts/src/engine/shapes/bullet.cjs.map +1 -1
  523. package/dist/native/charts/src/engine/shapes/bullet.js +110 -110
  524. package/dist/native/charts/src/engine/shapes/bullet.js.map +1 -1
  525. package/dist/native/charts/src/engine/shapes/calendar.cjs +1 -1
  526. package/dist/native/charts/src/engine/shapes/calendar.cjs.map +1 -1
  527. package/dist/native/charts/src/engine/shapes/calendar.js +21 -16
  528. package/dist/native/charts/src/engine/shapes/calendar.js.map +1 -1
  529. package/dist/native/charts/src/engine/shapes/chord.cjs +2 -0
  530. package/dist/native/charts/src/engine/shapes/chord.cjs.map +1 -0
  531. package/dist/native/charts/src/engine/shapes/chord.js +419 -0
  532. package/dist/native/charts/src/engine/shapes/chord.js.map +1 -0
  533. package/dist/native/charts/src/engine/shapes/draw.cjs +1 -1
  534. package/dist/native/charts/src/engine/shapes/draw.cjs.map +1 -1
  535. package/dist/native/charts/src/engine/shapes/draw.js +47 -17
  536. package/dist/native/charts/src/engine/shapes/draw.js.map +1 -1
  537. package/dist/native/charts/src/engine/shapes/hit.cjs +1 -1
  538. package/dist/native/charts/src/engine/shapes/hit.cjs.map +1 -1
  539. package/dist/native/charts/src/engine/shapes/hit.js +73 -44
  540. package/dist/native/charts/src/engine/shapes/hit.js.map +1 -1
  541. package/dist/native/charts/src/engine/shapes/labels.cjs +1 -1
  542. package/dist/native/charts/src/engine/shapes/labels.cjs.map +1 -1
  543. package/dist/native/charts/src/engine/shapes/labels.js +12 -4
  544. package/dist/native/charts/src/engine/shapes/labels.js.map +1 -1
  545. package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
  546. package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
  547. package/dist/native/charts/src/engine/shapes/layout.js +136 -94
  548. package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
  549. package/dist/native/charts/src/engine/shapes/scene.cjs +1 -1
  550. package/dist/native/charts/src/engine/shapes/scene.cjs.map +1 -1
  551. package/dist/native/charts/src/engine/shapes/scene.js +62 -19
  552. package/dist/native/charts/src/engine/shapes/scene.js.map +1 -1
  553. package/dist/native/components/Chart/ChartBase.cjs +1 -1
  554. package/dist/native/components/Chart/ChartBase.cjs.map +1 -1
  555. package/dist/native/components/Chart/ChartBase.js +127 -115
  556. package/dist/native/components/Chart/ChartBase.js.map +1 -1
  557. package/dist/native/components/Chart/charts.cjs +1 -1
  558. package/dist/native/components/Chart/charts.cjs.map +1 -1
  559. package/dist/native/components/Chart/charts.js +8 -5
  560. package/dist/native/components/Chart/charts.js.map +1 -1
  561. package/dist/native/components/Chart/scene.cjs +1 -1
  562. package/dist/native/components/Chart/scene.cjs.map +1 -1
  563. package/dist/native/components/Chart/scene.d.cts +6 -1
  564. package/dist/native/components/Chart/scene.d.ts +6 -1
  565. package/dist/native/components/Chart/scene.js +226 -108
  566. package/dist/native/components/Chart/scene.js.map +1 -1
  567. package/dist/native/components/Chart/types.d.cts +7 -1
  568. package/dist/native/components/Chart/types.d.ts +7 -1
  569. package/dist/native/components/Charts/charts.cjs +1 -1
  570. package/dist/native/components/Charts/charts.cjs.map +1 -1
  571. package/dist/native/components/Charts/charts.js +60 -43
  572. package/dist/native/components/Charts/charts.js.map +1 -1
  573. package/dist/native/components/Charts/types.d.cts +11 -0
  574. package/dist/native/components/Charts/types.d.ts +11 -0
  575. package/dist/native/components/ShapeChart/ShapeChartBase.cjs +1 -1
  576. package/dist/native/components/ShapeChart/ShapeChartBase.cjs.map +1 -1
  577. package/dist/native/components/ShapeChart/ShapeChartBase.d.cts +1 -1
  578. package/dist/native/components/ShapeChart/ShapeChartBase.d.ts +1 -1
  579. package/dist/native/components/ShapeChart/ShapeChartBase.js +97 -106
  580. package/dist/native/components/ShapeChart/ShapeChartBase.js.map +1 -1
  581. package/dist/native/components/ShapeChart/charts.cjs +1 -1
  582. package/dist/native/components/ShapeChart/charts.cjs.map +1 -1
  583. package/dist/native/components/ShapeChart/charts.d.cts +6 -1
  584. package/dist/native/components/ShapeChart/charts.d.ts +6 -1
  585. package/dist/native/components/ShapeChart/charts.js +138 -96
  586. package/dist/native/components/ShapeChart/charts.js.map +1 -1
  587. package/dist/native/components/ShapeChart/draw.cjs +1 -1
  588. package/dist/native/components/ShapeChart/draw.cjs.map +1 -1
  589. package/dist/native/components/ShapeChart/draw.d.cts +1 -1
  590. package/dist/native/components/ShapeChart/draw.d.ts +1 -1
  591. package/dist/native/components/ShapeChart/draw.js +26 -17
  592. package/dist/native/components/ShapeChart/draw.js.map +1 -1
  593. package/dist/native/components/ShapeChart/geometry.cjs +1 -1
  594. package/dist/native/components/ShapeChart/geometry.cjs.map +1 -1
  595. package/dist/native/components/ShapeChart/geometry.js +233 -70
  596. package/dist/native/components/ShapeChart/geometry.js.map +1 -1
  597. package/dist/native/components/ShapeChart/index.cjs +1 -1
  598. package/dist/native/components/ShapeChart/index.d.cts +1 -1
  599. package/dist/native/components/ShapeChart/index.d.ts +1 -1
  600. package/dist/native/components/ShapeChart/index.js +2 -2
  601. package/dist/native/components/ShapeChart/recorder.cjs +1 -1
  602. package/dist/native/components/ShapeChart/recorder.cjs.map +1 -1
  603. package/dist/native/components/ShapeChart/recorder.d.cts +10 -1
  604. package/dist/native/components/ShapeChart/recorder.d.ts +10 -1
  605. package/dist/native/components/ShapeChart/recorder.js +19 -10
  606. package/dist/native/components/ShapeChart/recorder.js.map +1 -1
  607. package/dist/native/components/ShapeChart/types.d.cts +95 -8
  608. package/dist/native/components/ShapeChart/types.d.ts +95 -8
  609. package/dist/native/index.cjs +1 -1
  610. package/dist/native/index.js +2 -2
  611. package/dist/native/source/components/Chart/ChartBase.tsx +19 -6
  612. package/dist/native/source/components/Chart/charts.tsx +10 -3
  613. package/dist/native/source/components/Chart/scene.tsx +243 -14
  614. package/dist/native/source/components/Chart/types.ts +7 -0
  615. package/dist/native/source/components/Charts/charts.tsx +37 -2
  616. package/dist/native/source/components/Charts/types.ts +11 -0
  617. package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +10 -34
  618. package/dist/native/source/components/ShapeChart/charts.tsx +91 -35
  619. package/dist/native/source/components/ShapeChart/draw.tsx +39 -8
  620. package/dist/native/source/components/ShapeChart/geometry.ts +376 -25
  621. package/dist/native/source/components/ShapeChart/index.ts +1 -0
  622. package/dist/native/source/components/ShapeChart/recorder.ts +20 -5
  623. package/dist/native/source/components/ShapeChart/types.ts +99 -6
  624. package/dist/native/source/manifest.ts +1 -0
  625. package/dist/taro/chart-a11y.d.ts +7 -0
  626. package/dist/taro/charts.d.ts +29 -6
  627. package/dist/taro/index.js +3129 -1902
  628. package/dist/taro/shape-charts.d.ts +99 -5
  629. package/dist/uni/AreaChart.vue +2 -1
  630. package/dist/uni/AreaChart.vue.d.ts +5 -1
  631. package/dist/uni/Badge.vue.d.ts +1 -1
  632. package/dist/uni/BarChart.vue +2 -1
  633. package/dist/uni/BarChart.vue.d.ts +5 -1
  634. package/dist/uni/BoxPlotChart.vue +2 -1
  635. package/dist/uni/BoxPlotChart.vue.d.ts +8 -0
  636. package/dist/uni/BubbleChart.vue +2 -1
  637. package/dist/uni/BubbleChart.vue.d.ts +4 -0
  638. package/dist/uni/BulletChart.vue.d.ts +4 -0
  639. package/dist/uni/CalendarHeatmap.vue.d.ts +2 -0
  640. package/dist/uni/CandlestickChart.vue +2 -1
  641. package/dist/uni/CandlestickChart.vue.d.ts +4 -0
  642. package/dist/uni/Chart.vue +2 -1
  643. package/dist/uni/Chart.vue.d.ts +4 -0
  644. package/dist/uni/ChordChart.vue +93 -0
  645. package/dist/uni/ChordChart.vue.d.ts +136 -0
  646. package/dist/uni/Divider.vue.d.ts +1 -1
  647. package/dist/uni/DonutChart.vue.d.ts +5 -1
  648. package/dist/uni/FunnelChart.vue.d.ts +4 -0
  649. package/dist/uni/GanttChart.vue +2 -1
  650. package/dist/uni/GanttChart.vue.d.ts +15 -0
  651. package/dist/uni/GaugeChart.vue.d.ts +5 -1
  652. package/dist/uni/HeatmapChart.vue +2 -1
  653. package/dist/uni/HeatmapChart.vue.d.ts +8 -2
  654. package/dist/uni/HistogramChart.vue +2 -1
  655. package/dist/uni/HistogramChart.vue.d.ts +4 -0
  656. package/dist/uni/HorizontalBarChart.vue +2 -1
  657. package/dist/uni/HorizontalBarChart.vue.d.ts +3 -1
  658. package/dist/uni/LineChart.vue +2 -1
  659. package/dist/uni/LineChart.vue.d.ts +4 -0
  660. package/dist/uni/MixedChart.vue +2 -1
  661. package/dist/uni/MixedChart.vue.d.ts +4 -0
  662. package/dist/uni/PieChart.vue.d.ts +5 -1
  663. package/dist/uni/QuadrantChart.vue +2 -1
  664. package/dist/uni/QuadrantChart.vue.d.ts +4 -0
  665. package/dist/uni/RadarChart.vue.d.ts +4 -0
  666. package/dist/uni/RadialBarChart.vue.d.ts +4 -0
  667. package/dist/uni/RangeAreaChart.vue +2 -1
  668. package/dist/uni/RangeAreaChart.vue.d.ts +4 -0
  669. package/dist/uni/SankeyChart.vue.d.ts +4 -0
  670. package/dist/uni/ScatterChart.vue +2 -1
  671. package/dist/uni/ScatterChart.vue.d.ts +4 -0
  672. package/dist/uni/Sparkline.vue +2 -1
  673. package/dist/uni/Sparkline.vue.d.ts +4 -0
  674. package/dist/uni/SunburstChart.vue.d.ts +4 -0
  675. package/dist/uni/ToastProvider.vue.d.ts +1 -1
  676. package/dist/uni/TreemapChart.vue.d.ts +4 -0
  677. package/dist/uni/WaterfallChart.vue +2 -1
  678. package/dist/uni/WaterfallChart.vue.d.ts +9 -0
  679. package/dist/uni/chart-a11y.d.ts +7 -0
  680. package/dist/uni/chart-a11y.js +29 -0
  681. package/dist/uni/chart-canvas.d.ts +12 -0
  682. package/dist/uni/chart-canvas.js +15 -1
  683. package/dist/uni/chart-types.d.ts +36 -5
  684. package/dist/uni/chart-types.js +31 -3
  685. package/dist/uni/charts-canvas.js +3 -2
  686. package/dist/uni/index.d.ts +2 -1
  687. package/dist/uni/index.js +1 -0
  688. package/dist/uni/manifest.d.ts +7 -0
  689. package/dist/uni/manifest.js +10 -0
  690. package/dist/uni/named-chart-options.d.ts +11 -2
  691. package/dist/uni/named-chart-options.js +21 -1
  692. package/dist/uni/shape-chart-canvas.d.ts +3 -3
  693. package/dist/uni/shape-chart-canvas.js +17 -58
  694. package/dist/uni/shape-chart-types.d.ts +53 -3
  695. package/dist/uni/shape-chart-types.js +45 -1
  696. package/dist/vue/charts-global.d.ts +48 -0
  697. package/dist/vue/charts.d.ts +18 -0
  698. package/dist/vue/charts.js +56 -0
  699. package/dist/vue/charts.js.map +1 -0
  700. package/dist/vue/components/Chart/Bar3DChart.vue.d.ts +2 -0
  701. package/dist/vue/components/Chart/BoxPlotChart.vue.d.ts +8 -0
  702. package/dist/vue/components/Chart/BoxPlotChart.vue.js.map +1 -1
  703. package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js +8 -2
  704. package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  705. package/dist/vue/components/Chart/ChordChart.vue.d.ts +153 -0
  706. package/dist/vue/components/Chart/ChordChart.vue.js +7 -0
  707. package/dist/vue/components/Chart/ChordChart.vue.js.map +1 -0
  708. package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js +81 -0
  709. package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  710. package/dist/vue/components/Chart/DependencyGraph.vue.d.ts +181 -0
  711. package/dist/vue/components/Chart/DependencyGraph.vue.js +7 -0
  712. package/dist/vue/components/Chart/DependencyGraph.vue.js.map +1 -0
  713. package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js +65 -0
  714. package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js.map +1 -0
  715. package/dist/vue/components/Chart/GanttChart.vue.d.ts +19 -0
  716. package/dist/vue/components/Chart/GanttChart.vue.js.map +1 -1
  717. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js +12 -1
  718. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  719. package/dist/vue/components/Chart/GraphChart.vue.d.ts +186 -0
  720. package/dist/vue/components/Chart/GraphChart.vue.js +7 -0
  721. package/dist/vue/components/Chart/GraphChart.vue.js.map +1 -0
  722. package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js +62 -0
  723. package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  724. package/dist/vue/components/Chart/HeatmapChart.vue.d.ts +9 -5
  725. package/dist/vue/components/Chart/HeatmapChart.vue.js.map +1 -1
  726. package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js +3 -1
  727. package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  728. package/dist/vue/components/Chart/Line3DChart.vue.d.ts +2 -0
  729. package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +2 -0
  730. package/dist/vue/components/Chart/Scatter3DChart.vue.d.ts +2 -0
  731. package/dist/vue/components/Chart/Surface3DChart.vue.d.ts +2 -0
  732. package/dist/vue/components/Chart/TimeAndSales.vue.d.ts +2 -0
  733. package/dist/vue/components/Chart/TradingChart.vue.d.ts +58 -1
  734. package/dist/vue/components/Chart/TradingChart.vue.js.map +1 -1
  735. package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js +31 -0
  736. package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  737. package/dist/vue/components/Chart/TreeChart.vue.d.ts +174 -0
  738. package/dist/vue/components/Chart/TreeChart.vue.js +7 -0
  739. package/dist/vue/components/Chart/TreeChart.vue.js.map +1 -0
  740. package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js +56 -0
  741. package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  742. package/dist/vue/components/Chart/WaterfallChart.vue.d.ts +12 -1
  743. package/dist/vue/components/Chart/WaterfallChart.vue.js.map +1 -1
  744. package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js +8 -2
  745. package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  746. package/dist/vue/components/Chart/graph.d.ts +156 -0
  747. package/dist/vue/components/Chart/graph.js +137 -0
  748. package/dist/vue/components/Chart/graph.js.map +1 -0
  749. package/dist/vue/components/Chart/index.d.ts +5 -1
  750. package/dist/vue/components/Chart/index.js +5 -1
  751. package/dist/vue/components/Chart/orderbook.d.ts +5 -1
  752. package/dist/vue/components/Chart/orderbook.js +2 -0
  753. package/dist/vue/components/Chart/orderbook.js.map +1 -1
  754. package/dist/vue/components/Chart/three-d.d.ts +3 -0
  755. package/dist/vue/components/Chart/three-d.js +2 -0
  756. package/dist/vue/components/Chart/three-d.js.map +1 -1
  757. package/dist/vue/components/Chart/trading.d.ts +30 -3
  758. package/dist/vue/components/Chart/trading.js +9 -0
  759. package/dist/vue/components/Chart/trading.js.map +1 -1
  760. package/dist/vue/components/Chart/types.d.ts +74 -2
  761. package/dist/vue/global.d.ts +2 -38
  762. package/dist/vue/groups/charts.js +10 -2
  763. package/dist/vue/groups/charts.js.map +1 -1
  764. package/dist/vue/index.js +6 -2
  765. package/dist/vue/internal/register.d.ts +7 -0
  766. package/dist/vue/internal/register.js +14 -0
  767. package/dist/vue/internal/register.js.map +1 -0
  768. package/dist/vue/plugin.d.ts +9 -4
  769. package/dist/vue/plugin.js +6 -11
  770. package/dist/vue/plugin.js.map +1 -1
  771. package/dist/weapp/area-chart/index.wxml +1 -1
  772. package/dist/weapp/bar-chart/index.wxml +1 -1
  773. package/dist/weapp/box-plot-chart/index.wxml +1 -1
  774. package/dist/weapp/bubble-chart/index.wxml +1 -1
  775. package/dist/weapp/candlestick-chart/index.wxml +1 -1
  776. package/dist/weapp/chart/index.wxml +1 -1
  777. package/dist/weapp/charts/canvas.js +1987 -175
  778. package/dist/weapp/charts/core.js +3 -0
  779. package/dist/weapp/chord-chart/index.js +1 -0
  780. package/dist/weapp/chord-chart/index.json +1 -0
  781. package/dist/weapp/chord-chart/index.wxml +1 -0
  782. package/dist/weapp/chord-chart/index.wxss +1 -0
  783. package/dist/weapp/controls.js +148 -57
  784. package/dist/weapp/gantt-chart/index.wxml +1 -1
  785. package/dist/weapp/heatmap-chart/index.wxml +1 -1
  786. package/dist/weapp/histogram-chart/index.wxml +1 -1
  787. package/dist/weapp/horizontal-bar-chart/index.wxml +1 -1
  788. package/dist/weapp/line-chart/index.wxml +1 -1
  789. package/dist/weapp/mixed-chart/index.wxml +1 -1
  790. package/dist/weapp/quadrant-chart/index.wxml +1 -1
  791. package/dist/weapp/range-area-chart/index.wxml +1 -1
  792. package/dist/weapp/scatter-chart/index.wxml +1 -1
  793. package/dist/weapp/sparkline/index.wxml +1 -1
  794. package/dist/weapp/types.d.ts +96 -4
  795. package/dist/weapp/waterfall-chart/index.wxml +1 -1
  796. package/dist/web-components/components/chart/charts.d.ts +4 -2
  797. package/dist/web-components/components/chart/charts.js +8 -1
  798. package/dist/web-components/components/chart/charts.js.map +1 -1
  799. package/dist/web-components/components/chart/extended.d.ts +21 -7
  800. package/dist/web-components/components/chart/extended.js +29 -9
  801. package/dist/web-components/components/chart/extended.js.map +1 -1
  802. package/dist/web-components/components/chart/shapes-extended.d.ts +37 -1
  803. package/dist/web-components/components/chart/shapes-extended.js +27 -1
  804. package/dist/web-components/components/chart/shapes-extended.js.map +1 -1
  805. package/dist/web-components/components/chart-3d/chart-3d.d.ts +1 -1
  806. package/dist/web-components/components/chart-3d/chart-3d.js.map +1 -1
  807. package/dist/web-components/components/graph/graph.d.ts +156 -0
  808. package/dist/web-components/components/graph/graph.js +150 -0
  809. package/dist/web-components/components/graph/graph.js.map +1 -0
  810. package/dist/web-components/components/trading-chart/trading-chart.d.ts +49 -2
  811. package/dist/web-components/components/trading-chart/trading-chart.js +62 -0
  812. package/dist/web-components/components/trading-chart/trading-chart.js.map +1 -1
  813. package/dist/web-components/elements/chart.d.ts +1 -1
  814. package/dist/web-components/elements/chart.js +6 -5
  815. package/dist/web-components/elements/chart.js.map +1 -1
  816. package/dist/web-components/elements/graph.d.ts +2 -0
  817. package/dist/web-components/elements/graph.js +12 -0
  818. package/dist/web-components/elements/graph.js.map +1 -0
  819. package/dist/web-components/html-custom-data.json +318 -4
  820. package/dist/web-components/types/react.d.ts +63 -4
  821. package/dist/web-components/types/solid.d.ts +55 -8
  822. package/dist/web-components/types/svelte.d.ts +55 -8
  823. package/dist/web-components/types/vue.d.ts +55 -4
  824. package/package.json +16 -1
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.cjs","names":["toCss","toWorld","project","linearTicks","require_color","require_scale","require_model","require_math","overlayStyle","theme","dark","AXES","gridPositions","axis","out","i","farWalls","frame","half","axes","at","p","rest","value","drawWalls","h","walls","P","a","b","c","base","corner","sb","sc","quad","ctx","q","style","along","across","w","p0","p1","s0","s1","overlaps","pad","labelEdge","eye","best","left","sx","sy","drawAxes","center","placed","size","labelFont","titleFont","edge","e0","e1","dx","dy","length","ox","oy","mx","my","align","baseline","labels","s","tick","text","x","y","step","kept","l","o","extent","distance","tx","ty","tw","th","bounds","top","drawColorBar","gradient","rect","lut","min","max","domain","span","ticks","t","format","title","right","drawHighlight","shape","pts","bit","z","floor"],"sources":["../../../../../charts/src/engine/three-d/overlay.ts"],"sourcesContent":["// 2D overlay of the 3D charts: the far walls of the axis box with their grid\n// lines (below the data), then the tick labels, axis titles, color bar and\n// hover highlight (above the data). Text is always horizontal (screen\n// aligned) so it stays readable whatever the camera.\n\nimport { toCss, type Rgba } from \"../color\";\nimport { linearTicks } from \"../scale\";\nimport type { ColorLut } from \"./colormap\";\nimport { project, type CameraFrame, type Vec3 } from \"./math\";\nimport { toWorld, type AxisModel, type Model3D } from \"./model\";\n\nexport interface OverlayStyle {\n text: string;\n muted: string;\n grid: string;\n axis: string;\n /** Tint of the walls */\n wall: string;\n /** Background (rings of the hover marker) */\n background: string;\n font: string;\n fontSize: number;\n}\n\nexport const overlayStyle = (\n theme: {\n text: Rgba;\n textMuted: Rgba;\n grid: Rgba;\n axis: Rgba;\n background: Rgba;\n fontFamily: string;\n fontSize: number;\n },\n dark: boolean,\n): OverlayStyle => ({\n text: toCss(theme.text),\n muted: toCss(theme.textMuted),\n grid: toCss(theme.grid),\n axis: toCss(theme.axis),\n wall: toCss(theme.text, dark ? 0.045 : 0.025),\n background: toCss(theme.background),\n font: theme.fontFamily,\n fontSize: theme.fontSize,\n});\n\ntype Axes = Pick<Model3D, \"x\" | \"y\" | \"z\">;\n\nconst AXES: readonly (\"x\" | \"y\" | \"z\")[] = [\"x\", \"y\", \"z\"];\n\n/** World positions of the grid lines of an axis (category axes: between the categories) */\nexport const gridPositions = (axis: AxisModel): number[] => {\n if (axis.categories) {\n const out: number[] = [];\n for (let i = 0; i < axis.categories.length - 1; i++)\n out.push(toWorld(axis, i + 0.5));\n return out;\n }\n return axis.ticks\n .filter((t) => t > axis.domain[0] && t < axis.domain[1])\n .map((t) => toWorld(axis, t));\n};\n\n/** Side (-1 / 1) of the far wall perpendicular to every axis */\nexport const farWalls = (frame: CameraFrame): [number, number, number] => [\n frame.eye[0] >= 0 ? -1 : 1,\n frame.eye[1] >= 0 ? -1 : 1,\n frame.eye[2] >= 0 ? -1 : 1,\n];\n\nconst half = (axes: Axes): Vec3 => [axes.x.half, axes.y.half, axes.z.half];\n\nconst at = (axis: number, value: number, rest: Vec3): Vec3 => {\n const p: Vec3 = [rest[0], rest[1], rest[2]];\n p[axis] = value;\n return p;\n};\n\n/** Far walls, their grid lines and borders */\nexport const drawWalls = (\n ctx: CanvasRenderingContext2D,\n frame: CameraFrame,\n axes: Axes,\n style: OverlayStyle,\n): void => {\n const h = half(axes);\n const walls = farWalls(frame);\n const P = (p: Vec3) => project(frame, p[0], p[1], p[2]);\n ctx.lineWidth = 1;\n for (let a = 0; a < 3; a++) {\n const b = (a + 1) % 3;\n const c = (a + 2) % 3;\n const base: Vec3 = [0, 0, 0];\n base[a] = walls[a] * h[a];\n const corner = (sb: number, sc: number) => {\n const p: Vec3 = [base[0], base[1], base[2]];\n p[b] = sb * h[b];\n p[c] = sc * h[c];\n return P(p);\n };\n const quad = [corner(-1, -1), corner(1, -1), corner(1, 1), corner(-1, 1)];\n ctx.beginPath();\n quad.forEach((q, i) => (i ? ctx.lineTo(q.x, q.y) : ctx.moveTo(q.x, q.y)));\n ctx.closePath();\n ctx.fillStyle = style.wall;\n ctx.fill();\n // grid lines of the two axes spanning the wall\n ctx.beginPath();\n for (const [along, across] of [\n [b, c],\n [c, b],\n ] as const) {\n const axis = axes[AXES[along]!];\n if (!axis.grid) continue;\n for (const w of gridPositions(axis)) {\n const p0 = at(along, w, base);\n const p1 = at(along, w, base);\n p0[across] = -h[across];\n p1[across] = h[across];\n const s0 = P(p0);\n const s1 = P(p1);\n ctx.moveTo(s0.x, s0.y);\n ctx.lineTo(s1.x, s1.y);\n }\n }\n ctx.strokeStyle = style.grid;\n ctx.stroke();\n ctx.beginPath();\n quad.forEach((q, i) => (i ? ctx.lineTo(q.x, q.y) : ctx.moveTo(q.x, q.y)));\n ctx.closePath();\n ctx.strokeStyle = style.axis;\n ctx.stroke();\n }\n};\n\ninterface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nconst overlaps = (a: Rect, b: Rect, pad = 2) =>\n a.x < b.x + b.w + pad &&\n b.x < a.x + a.w + pad &&\n a.y < b.y + b.h + pad &&\n b.y < a.y + a.h + pad;\n\n/** Edge (fixed coordinates of the two other axes) carrying the labels of an axis */\nexport const labelEdge = (\n frame: CameraFrame,\n axes: Axes,\n axis: number,\n): Vec3 => {\n const h = half(axes);\n const eye = frame.eye;\n if (axis === 0) return [0, (eye[1] >= 0 ? 1 : -1) * h[1], -h[2]];\n if (axis === 1) return [(eye[0] >= 0 ? 1 : -1) * h[0], 0, -h[2]];\n // vertical axis: the leftmost vertical edge on screen\n let best: Vec3 = [-h[0], -h[1], 0];\n let left = Infinity;\n for (const sx of [-1, 1]) {\n for (const sy of [-1, 1]) {\n const p = project(frame, sx * h[0], sy * h[1], 0);\n if (p.x < left) {\n left = p.x;\n best = [sx * h[0], sy * h[1], 0];\n }\n }\n }\n return best;\n};\n\n/** Area the labels and titles must stay in (CSS pixels of the stage) */\nexport interface OverlayBounds {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\n/** Tick labels and titles of the three axes */\nexport const drawAxes = (\n ctx: CanvasRenderingContext2D,\n frame: CameraFrame,\n axes: Axes,\n style: OverlayStyle,\n bounds: OverlayBounds = {\n left: 0,\n top: 0,\n right: frame.width,\n bottom: frame.height,\n },\n): void => {\n const center = project(frame, 0, 0, 0);\n const placed: Rect[] = [];\n const size = style.fontSize;\n const labelFont = `${size}px ${style.font}`;\n const titleFont = `600 ${size + 1}px ${style.font}`;\n for (let a = 0; a < 3; a++) {\n const axis = axes[AXES[a]!];\n if (!axis.visible) continue;\n const edge = labelEdge(frame, axes, a);\n const e0 = project(frame, ...at(a, -axis.half, edge));\n const e1 = project(frame, ...at(a, axis.half, edge));\n let dx = e1.x - e0.x;\n let dy = e1.y - e0.y;\n const length = Math.hypot(dx, dy);\n // seen end-on: no room for labels\n if (length < 24) continue;\n dx /= length;\n dy /= length;\n let ox = -dy;\n let oy = dx;\n const mx = (e0.x + e1.x) / 2;\n const my = (e0.y + e1.y) / 2;\n if (ox * (mx - center.x) + oy * (my - center.y) < 0) {\n ox = -ox;\n oy = -oy;\n }\n // vertical axis: labels go sideways\n if (a === 2) {\n ox = mx < center.x ? -1 : 1;\n oy = 0;\n }\n const align: CanvasTextAlign =\n ox > 0.35 ? \"left\" : ox < -0.35 ? \"right\" : \"center\";\n const baseline: CanvasTextBaseline =\n oy > 0.35 ? \"top\" : oy < -0.35 ? \"bottom\" : \"middle\";\n ctx.font = labelFont;\n ctx.textAlign = align;\n ctx.textBaseline = baseline;\n const gap = 8;\n const labels = axis.ticks.map((tick, i) => {\n const s = project(frame, ...at(a, toWorld(axis, tick), edge));\n const text = axis.labels[i] ?? \"\";\n const w = ctx.measureText(text).width;\n const x = s.x + ox * gap;\n const y = s.y + oy * gap;\n const rx = align === \"left\" ? x : align === \"right\" ? x - w : x - w / 2;\n const ry =\n baseline === \"top\"\n ? y\n : baseline === \"bottom\"\n ? y - size\n : y - size / 2;\n return { tick: s, text, x, y, rect: { x: rx, y: ry, w, h: size } };\n });\n // thin the labels until they do not overlap\n let step = 1;\n for (; step < labels.length; step++) {\n const kept = labels.filter((_, i) => i % step === 0);\n if (\n kept.every(\n (l, i) => !kept.slice(0, i).some((o) => overlaps(l.rect, o.rect)),\n )\n ) {\n break;\n }\n }\n let extent = 0;\n ctx.beginPath();\n labels.forEach((l, i) => {\n if (i % step) return;\n if (placed.some((o) => overlaps(l.rect, o))) return;\n placed.push(l.rect);\n ctx.moveTo(l.tick.x, l.tick.y);\n ctx.lineTo(l.tick.x + ox * 4, l.tick.y + oy * 4);\n extent = Math.max(\n extent,\n Math.abs(ox) * l.rect.w + Math.abs(oy) * l.rect.h,\n );\n });\n ctx.strokeStyle = style.axis;\n ctx.lineWidth = 1;\n ctx.stroke();\n ctx.fillStyle = style.muted;\n labels.forEach((l, i) => {\n if (i % step || !placed.includes(l.rect)) return;\n ctx.fillText(l.text, l.x, l.y);\n });\n if (!axis.title) continue;\n const distance = gap + extent + 10;\n let tx = mx + ox * distance;\n let ty = my + oy * distance;\n ctx.font = titleFont;\n ctx.fillStyle = style.text;\n const tw = ctx.measureText(axis.title).width;\n const th = size + 1;\n if (a === 2) {\n tx = Math.max(bounds.left + th, Math.min(bounds.right - th, tx));\n ty = Math.max(bounds.top + tw / 2, Math.min(bounds.bottom - tw / 2, ty));\n ctx.save();\n ctx.translate(tx, ty);\n ctx.rotate(-Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.textBaseline = ox < 0 ? \"bottom\" : \"top\";\n ctx.fillText(axis.title, 0, 0);\n ctx.restore();\n } else {\n // keep the whole title inside the bounds\n const left =\n align === \"left\" ? tx : align === \"right\" ? tx - tw : tx - tw / 2;\n const top =\n baseline === \"top\" ? ty : baseline === \"bottom\" ? ty - th : ty - th / 2;\n tx +=\n Math.max(0, bounds.left - left) - Math.max(0, left + tw - bounds.right);\n ty +=\n Math.max(0, bounds.top - top) - Math.max(0, top + th - bounds.bottom);\n ctx.textAlign = align;\n ctx.textBaseline = baseline;\n ctx.fillText(axis.title, tx, ty);\n }\n }\n};\n\n/** Vertical color bar with its ticks and title */\nexport const drawColorBar = (\n ctx: CanvasRenderingContext2D,\n rect: Rect,\n lut: ColorLut,\n domain: readonly [number, number],\n format: (value: number) => string,\n title: string,\n style: OverlayStyle,\n /** Right end of the stage: the title is shifted left to fit */\n right = Infinity,\n): void => {\n const gradient = ctx.createLinearGradient(0, rect.y + rect.h, 0, rect.y);\n const samples = 24;\n for (let i = 0; i <= samples; i++) {\n const c = lut.rgba[Math.round((i / samples) * (lut.rgba.length - 1))];\n if (c) gradient.addColorStop(i / samples, toCss(c));\n }\n ctx.fillStyle = gradient;\n ctx.beginPath();\n if (typeof ctx.roundRect === \"function\")\n ctx.roundRect(rect.x, rect.y, rect.w, rect.h, 3);\n else ctx.rect(rect.x, rect.y, rect.w, rect.h);\n ctx.fill();\n ctx.strokeStyle = style.axis;\n ctx.lineWidth = 1;\n ctx.stroke();\n const [min, max] = domain;\n const span = max - min || 1;\n ctx.font = `${style.fontSize}px ${style.font}`;\n ctx.fillStyle = style.muted;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n const ticks = linearTicks(min, max, Math.max(2, Math.round(rect.h / 40)));\n ctx.beginPath();\n for (const t of ticks) {\n const y = rect.y + rect.h - ((t - min) / span) * rect.h;\n if (y < rect.y - 0.5 || y > rect.y + rect.h + 0.5) continue;\n ctx.moveTo(rect.x + rect.w, y);\n ctx.lineTo(rect.x + rect.w + 4, y);\n ctx.fillText(format(t), rect.x + rect.w + 7, y);\n }\n ctx.strokeStyle = style.axis;\n ctx.stroke();\n if (title) {\n ctx.font = `600 ${style.fontSize}px ${style.font}`;\n ctx.fillStyle = style.text;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"bottom\";\n const w = ctx.measureText(title).width;\n ctx.fillText(\n title,\n Math.max(4, Math.min(rect.x, right - 4 - w)),\n rect.y - 8,\n );\n }\n};\n\n/** Highlight of the hovered item */\nexport type HighlightShape =\n | { kind: \"point\"; x: number; y: number; radius: number; color: string }\n | { kind: \"box\"; min: Vec3; max: Vec3; color: string }\n | { kind: \"vertex\"; world: Vec3; color: string };\n\nexport const drawHighlight = (\n ctx: CanvasRenderingContext2D,\n frame: CameraFrame,\n axes: Axes,\n shape: HighlightShape,\n style: OverlayStyle,\n): void => {\n ctx.save();\n if (shape.kind === \"point\") {\n ctx.beginPath();\n ctx.arc(shape.x, shape.y, shape.radius + 3, 0, Math.PI * 2);\n ctx.lineWidth = 3;\n ctx.strokeStyle = style.background;\n ctx.stroke();\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = style.text;\n ctx.stroke();\n } else if (shape.kind === \"box\") {\n const { min, max } = shape;\n const corner = (i: number) =>\n project(\n frame,\n i & 1 ? max[0] : min[0],\n i & 2 ? max[1] : min[1],\n i & 4 ? max[2] : min[2],\n );\n const pts = Array.from({ length: 8 }, (_, i) => corner(i));\n ctx.beginPath();\n for (let i = 0; i < 8; i++) {\n for (const bit of [1, 2, 4]) {\n if (i & bit) continue;\n const a = pts[i]!;\n const b = pts[i | bit]!;\n ctx.moveTo(a.x, a.y);\n ctx.lineTo(b.x, b.y);\n }\n }\n ctx.lineJoin = \"round\";\n ctx.lineWidth = 3.5;\n ctx.strokeStyle = style.background;\n ctx.stroke();\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = style.text;\n ctx.stroke();\n } else {\n const [x, y, z] = shape.world;\n const top = project(frame, x, y, z);\n const floor = project(frame, x, y, -axes.z.half);\n ctx.beginPath();\n ctx.setLineDash([3, 3]);\n ctx.moveTo(top.x, top.y);\n ctx.lineTo(floor.x, floor.y);\n ctx.lineWidth = 1;\n ctx.strokeStyle = style.text;\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.beginPath();\n ctx.arc(floor.x, floor.y, 2.5, 0, Math.PI * 2);\n ctx.fillStyle = style.text;\n ctx.fill();\n ctx.beginPath();\n ctx.arc(top.x, top.y, 5, 0, Math.PI * 2);\n ctx.fillStyle = shape.color;\n ctx.fill();\n ctx.lineWidth = 2;\n ctx.strokeStyle = style.background;\n ctx.stroke();\n ctx.beginPath();\n ctx.arc(top.x, top.y, 7, 0, Math.PI * 2);\n ctx.lineWidth = 1.25;\n ctx.strokeStyle = style.text;\n ctx.stroke();\n }\n ctx.restore();\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"overlay.cjs","names":["toCss","toWorld","project","linearTicks","require_color","require_scale","require_model","require_math","overlayStyle","theme","dark","AXES","gridPositions","axis","out","i","farWalls","frame","half","axes","at","p","rest","value","drawWalls","h","walls","P","a","b","c","base","corner","sb","sc","quad","ctx","q","style","along","across","w","p0","p1","s0","s1","overlaps","pad","CROSS_AXIS_GAP","labelEdge","eye","best","left","sx","sy","drawAxes","center","placed","size","labelFont","titleFont","edge","e0","e1","dx","dy","length","ox","oy","mx","my","align","baseline","labels","s","tick","text","x","y","step","kept","l","o","extent","distance","tx","ty","tw","th","bounds","rectAt","k","top","drawColorBar","gradient","rect","lut","min","max","domain","span","ticks","t","format","title","right","drawHighlight","shape","pts","bit","z","floor"],"sources":["../../../../../charts/src/engine/three-d/overlay.ts"],"sourcesContent":["// 2D overlay of the 3D charts: the far walls of the axis box with their grid\n// lines (below the data), then the tick labels, axis titles, color bar and\n// hover highlight (above the data). Text is always horizontal (screen\n// aligned) so it stays readable whatever the camera.\n\nimport { toCss, type Rgba } from \"../color\";\nimport { linearTicks } from \"../scale\";\nimport type { ColorLut } from \"./colormap\";\nimport { project, type CameraFrame, type Vec3 } from \"./math\";\nimport { toWorld, type AxisModel, type Model3D } from \"./model\";\n\nexport interface OverlayStyle {\n text: string;\n muted: string;\n grid: string;\n axis: string;\n /** Tint of the walls */\n wall: string;\n /** Background (rings of the hover marker) */\n background: string;\n font: string;\n fontSize: number;\n}\n\nexport const overlayStyle = (\n theme: {\n text: Rgba;\n textMuted: Rgba;\n grid: Rgba;\n axis: Rgba;\n background: Rgba;\n fontFamily: string;\n fontSize: number;\n },\n dark: boolean,\n): OverlayStyle => ({\n text: toCss(theme.text),\n muted: toCss(theme.textMuted),\n grid: toCss(theme.grid),\n axis: toCss(theme.axis),\n wall: toCss(theme.text, dark ? 0.045 : 0.025),\n background: toCss(theme.background),\n font: theme.fontFamily,\n fontSize: theme.fontSize,\n});\n\ntype Axes = Pick<Model3D, \"x\" | \"y\" | \"z\">;\n\nconst AXES: readonly (\"x\" | \"y\" | \"z\")[] = [\"x\", \"y\", \"z\"];\n\n/** World positions of the grid lines of an axis (category axes: between the categories) */\nexport const gridPositions = (axis: AxisModel): number[] => {\n if (axis.categories) {\n const out: number[] = [];\n for (let i = 0; i < axis.categories.length - 1; i++)\n out.push(toWorld(axis, i + 0.5));\n return out;\n }\n return axis.ticks\n .filter((t) => t > axis.domain[0] && t < axis.domain[1])\n .map((t) => toWorld(axis, t));\n};\n\n/** Side (-1 / 1) of the far wall perpendicular to every axis */\nexport const farWalls = (frame: CameraFrame): [number, number, number] => [\n frame.eye[0] >= 0 ? -1 : 1,\n frame.eye[1] >= 0 ? -1 : 1,\n frame.eye[2] >= 0 ? -1 : 1,\n];\n\nconst half = (axes: Axes): Vec3 => [axes.x.half, axes.y.half, axes.z.half];\n\nconst at = (axis: number, value: number, rest: Vec3): Vec3 => {\n const p: Vec3 = [rest[0], rest[1], rest[2]];\n p[axis] = value;\n return p;\n};\n\n/** Far walls, their grid lines and borders */\nexport const drawWalls = (\n ctx: CanvasRenderingContext2D,\n frame: CameraFrame,\n axes: Axes,\n style: OverlayStyle,\n): void => {\n const h = half(axes);\n const walls = farWalls(frame);\n const P = (p: Vec3) => project(frame, p[0], p[1], p[2]);\n ctx.lineWidth = 1;\n for (let a = 0; a < 3; a++) {\n const b = (a + 1) % 3;\n const c = (a + 2) % 3;\n const base: Vec3 = [0, 0, 0];\n base[a] = walls[a] * h[a];\n const corner = (sb: number, sc: number) => {\n const p: Vec3 = [base[0], base[1], base[2]];\n p[b] = sb * h[b];\n p[c] = sc * h[c];\n return P(p);\n };\n const quad = [corner(-1, -1), corner(1, -1), corner(1, 1), corner(-1, 1)];\n ctx.beginPath();\n quad.forEach((q, i) => (i ? ctx.lineTo(q.x, q.y) : ctx.moveTo(q.x, q.y)));\n ctx.closePath();\n ctx.fillStyle = style.wall;\n ctx.fill();\n // grid lines of the two axes spanning the wall\n ctx.beginPath();\n for (const [along, across] of [\n [b, c],\n [c, b],\n ] as const) {\n const axis = axes[AXES[along]!];\n if (!axis.grid) continue;\n for (const w of gridPositions(axis)) {\n const p0 = at(along, w, base);\n const p1 = at(along, w, base);\n p0[across] = -h[across];\n p1[across] = h[across];\n const s0 = P(p0);\n const s1 = P(p1);\n ctx.moveTo(s0.x, s0.y);\n ctx.lineTo(s1.x, s1.y);\n }\n }\n ctx.strokeStyle = style.grid;\n ctx.stroke();\n ctx.beginPath();\n quad.forEach((q, i) => (i ? ctx.lineTo(q.x, q.y) : ctx.moveTo(q.x, q.y)));\n ctx.closePath();\n ctx.strokeStyle = style.axis;\n ctx.stroke();\n }\n};\n\ninterface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nconst overlaps = (a: Rect, b: Rect, pad = 2) =>\n a.x < b.x + b.w + pad &&\n b.x < a.x + a.w + pad &&\n a.y < b.y + b.h + pad &&\n b.y < a.y + a.h + pad;\n\n/** Smallest gap (px) between tick labels of different axes */\nconst CROSS_AXIS_GAP = 10;\n\n/** Edge (fixed coordinates of the two other axes) carrying the labels of an axis */\nexport const labelEdge = (\n frame: CameraFrame,\n axes: Axes,\n axis: number,\n): Vec3 => {\n const h = half(axes);\n const eye = frame.eye;\n if (axis === 0) return [0, (eye[1] >= 0 ? 1 : -1) * h[1], -h[2]];\n if (axis === 1) return [(eye[0] >= 0 ? 1 : -1) * h[0], 0, -h[2]];\n // vertical axis: the leftmost vertical edge on screen\n let best: Vec3 = [-h[0], -h[1], 0];\n let left = Infinity;\n for (const sx of [-1, 1]) {\n for (const sy of [-1, 1]) {\n const p = project(frame, sx * h[0], sy * h[1], 0);\n if (p.x < left) {\n left = p.x;\n best = [sx * h[0], sy * h[1], 0];\n }\n }\n }\n return best;\n};\n\n/** Area the labels and titles must stay in (CSS pixels of the stage) */\nexport interface OverlayBounds {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\n/** Tick labels and titles of the three axes */\nexport const drawAxes = (\n ctx: CanvasRenderingContext2D,\n frame: CameraFrame,\n axes: Axes,\n style: OverlayStyle,\n bounds: OverlayBounds = {\n left: 0,\n top: 0,\n right: frame.width,\n bottom: frame.height,\n },\n): void => {\n const center = project(frame, 0, 0, 0);\n const placed: Rect[] = [];\n const size = style.fontSize;\n const labelFont = `${size}px ${style.font}`;\n const titleFont = `600 ${size + 1}px ${style.font}`;\n for (let a = 0; a < 3; a++) {\n const axis = axes[AXES[a]!];\n if (!axis.visible) continue;\n const edge = labelEdge(frame, axes, a);\n const e0 = project(frame, ...at(a, -axis.half, edge));\n const e1 = project(frame, ...at(a, axis.half, edge));\n let dx = e1.x - e0.x;\n let dy = e1.y - e0.y;\n const length = Math.hypot(dx, dy);\n // seen end-on: no room for labels\n if (length < 24) continue;\n dx /= length;\n dy /= length;\n let ox = -dy;\n let oy = dx;\n const mx = (e0.x + e1.x) / 2;\n const my = (e0.y + e1.y) / 2;\n if (ox * (mx - center.x) + oy * (my - center.y) < 0) {\n ox = -ox;\n oy = -oy;\n }\n // vertical axis: labels go sideways\n if (a === 2) {\n ox = mx < center.x ? -1 : 1;\n oy = 0;\n }\n const align: CanvasTextAlign =\n ox > 0.35 ? \"left\" : ox < -0.35 ? \"right\" : \"center\";\n const baseline: CanvasTextBaseline =\n oy > 0.35 ? \"top\" : oy < -0.35 ? \"bottom\" : \"middle\";\n ctx.font = labelFont;\n ctx.textAlign = align;\n ctx.textBaseline = baseline;\n const gap = 8;\n const labels = axis.ticks.map((tick, i) => {\n const s = project(frame, ...at(a, toWorld(axis, tick), edge));\n const text = axis.labels[i] ?? \"\";\n const w = ctx.measureText(text).width;\n const x = s.x + ox * gap;\n const y = s.y + oy * gap;\n const rx = align === \"left\" ? x : align === \"right\" ? x - w : x - w / 2;\n const ry =\n baseline === \"top\"\n ? y\n : baseline === \"bottom\"\n ? y - size\n : y - size / 2;\n return { tick: s, text, x, y, rect: { x: rx, y: ry, w, h: size } };\n });\n // thin the labels until they do not overlap\n let step = 1;\n for (; step < labels.length; step++) {\n const kept = labels.filter((_, i) => i % step === 0);\n if (\n kept.every(\n (l, i) => !kept.slice(0, i).some((o) => overlaps(l.rect, o.rect)),\n )\n ) {\n break;\n }\n }\n let extent = 0;\n ctx.beginPath();\n labels.forEach((l, i) => {\n if (i % step) return;\n // wider gap to the labels of the other axes: at the shared corner, two\n // labels side by side would read as one (\"-2 -2\")\n if (placed.some((o) => overlaps(l.rect, o, CROSS_AXIS_GAP))) return;\n placed.push(l.rect);\n ctx.moveTo(l.tick.x, l.tick.y);\n ctx.lineTo(l.tick.x + ox * 4, l.tick.y + oy * 4);\n extent = Math.max(\n extent,\n Math.abs(ox) * l.rect.w + Math.abs(oy) * l.rect.h,\n );\n });\n ctx.strokeStyle = style.axis;\n ctx.lineWidth = 1;\n ctx.stroke();\n ctx.fillStyle = style.muted;\n labels.forEach((l, i) => {\n if (i % step || !placed.includes(l.rect)) return;\n ctx.fillText(l.text, l.x, l.y);\n });\n if (!axis.title) continue;\n const distance = gap + extent + 10;\n let tx = mx + ox * distance;\n let ty = my + oy * distance;\n ctx.font = titleFont;\n ctx.fillStyle = style.text;\n const tw = ctx.measureText(axis.title).width;\n const th = size + 1;\n if (a === 2) {\n tx = Math.max(bounds.left + th, Math.min(bounds.right - th, tx));\n ty = Math.max(bounds.top + tw / 2, Math.min(bounds.bottom - tw / 2, ty));\n ctx.save();\n ctx.translate(tx, ty);\n ctx.rotate(-Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.textBaseline = ox < 0 ? \"bottom\" : \"top\";\n ctx.fillText(axis.title, 0, 0);\n ctx.restore();\n } else {\n const rectAt = (x: number, y: number): Rect => ({\n x: align === \"left\" ? x : align === \"right\" ? x - tw : x - tw / 2,\n y: baseline === \"top\" ? y : baseline === \"bottom\" ? y - th : y - th / 2,\n w: tw,\n h: th,\n });\n // slanted axes: long titles move out until they clear the labels\n for (\n let k = 0;\n k < 12 && placed.some((o) => overlaps(rectAt(tx, ty), o));\n k++\n ) {\n tx += ox * 3;\n ty += oy * 3;\n }\n // keep the whole title inside the bounds\n const { x: left, y: top } = rectAt(tx, ty);\n tx +=\n Math.max(0, bounds.left - left) - Math.max(0, left + tw - bounds.right);\n ty +=\n Math.max(0, bounds.top - top) - Math.max(0, top + th - bounds.bottom);\n placed.push(rectAt(tx, ty));\n ctx.textAlign = align;\n ctx.textBaseline = baseline;\n ctx.fillText(axis.title, tx, ty);\n }\n }\n};\n\n/** Vertical color bar with its ticks and title */\nexport const drawColorBar = (\n ctx: CanvasRenderingContext2D,\n rect: Rect,\n lut: ColorLut,\n domain: readonly [number, number],\n format: (value: number) => string,\n title: string,\n style: OverlayStyle,\n /** Right end of the stage: the title is shifted left to fit */\n right = Infinity,\n): void => {\n const gradient = ctx.createLinearGradient(0, rect.y + rect.h, 0, rect.y);\n const samples = 24;\n for (let i = 0; i <= samples; i++) {\n const c = lut.rgba[Math.round((i / samples) * (lut.rgba.length - 1))];\n if (c) gradient.addColorStop(i / samples, toCss(c));\n }\n ctx.fillStyle = gradient;\n ctx.beginPath();\n if (typeof ctx.roundRect === \"function\")\n ctx.roundRect(rect.x, rect.y, rect.w, rect.h, 3);\n else ctx.rect(rect.x, rect.y, rect.w, rect.h);\n ctx.fill();\n ctx.strokeStyle = style.axis;\n ctx.lineWidth = 1;\n ctx.stroke();\n const [min, max] = domain;\n const span = max - min || 1;\n ctx.font = `${style.fontSize}px ${style.font}`;\n ctx.fillStyle = style.muted;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n const ticks = linearTicks(min, max, Math.max(2, Math.round(rect.h / 40)));\n ctx.beginPath();\n for (const t of ticks) {\n const y = rect.y + rect.h - ((t - min) / span) * rect.h;\n if (y < rect.y - 0.5 || y > rect.y + rect.h + 0.5) continue;\n ctx.moveTo(rect.x + rect.w, y);\n ctx.lineTo(rect.x + rect.w + 4, y);\n ctx.fillText(format(t), rect.x + rect.w + 7, y);\n }\n ctx.strokeStyle = style.axis;\n ctx.stroke();\n if (title) {\n ctx.font = `600 ${style.fontSize}px ${style.font}`;\n ctx.fillStyle = style.text;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"bottom\";\n const w = ctx.measureText(title).width;\n ctx.fillText(\n title,\n Math.max(4, Math.min(rect.x, right - 4 - w)),\n rect.y - 8,\n );\n }\n};\n\n/** Highlight of the hovered item */\nexport type HighlightShape =\n | { kind: \"point\"; x: number; y: number; radius: number; color: string }\n | { kind: \"box\"; min: Vec3; max: Vec3; color: string }\n | { kind: \"vertex\"; world: Vec3; color: string };\n\nexport const drawHighlight = (\n ctx: CanvasRenderingContext2D,\n frame: CameraFrame,\n axes: Axes,\n shape: HighlightShape,\n style: OverlayStyle,\n): void => {\n ctx.save();\n if (shape.kind === \"point\") {\n ctx.beginPath();\n ctx.arc(shape.x, shape.y, shape.radius + 3, 0, Math.PI * 2);\n ctx.lineWidth = 3;\n ctx.strokeStyle = style.background;\n ctx.stroke();\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = style.text;\n ctx.stroke();\n } else if (shape.kind === \"box\") {\n const { min, max } = shape;\n const corner = (i: number) =>\n project(\n frame,\n i & 1 ? max[0] : min[0],\n i & 2 ? max[1] : min[1],\n i & 4 ? max[2] : min[2],\n );\n const pts = Array.from({ length: 8 }, (_, i) => corner(i));\n ctx.beginPath();\n for (let i = 0; i < 8; i++) {\n for (const bit of [1, 2, 4]) {\n if (i & bit) continue;\n const a = pts[i]!;\n const b = pts[i | bit]!;\n ctx.moveTo(a.x, a.y);\n ctx.lineTo(b.x, b.y);\n }\n }\n ctx.lineJoin = \"round\";\n ctx.lineWidth = 3.5;\n ctx.strokeStyle = style.background;\n ctx.stroke();\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = style.text;\n ctx.stroke();\n } else {\n const [x, y, z] = shape.world;\n const top = project(frame, x, y, z);\n const floor = project(frame, x, y, -axes.z.half);\n ctx.beginPath();\n ctx.setLineDash([3, 3]);\n ctx.moveTo(top.x, top.y);\n ctx.lineTo(floor.x, floor.y);\n ctx.lineWidth = 1;\n ctx.strokeStyle = style.text;\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.beginPath();\n ctx.arc(floor.x, floor.y, 2.5, 0, Math.PI * 2);\n ctx.fillStyle = style.text;\n ctx.fill();\n ctx.beginPath();\n ctx.arc(top.x, top.y, 5, 0, Math.PI * 2);\n ctx.fillStyle = shape.color;\n ctx.fill();\n ctx.lineWidth = 2;\n ctx.strokeStyle = style.background;\n ctx.stroke();\n ctx.beginPath();\n ctx.arc(top.x, top.y, 7, 0, Math.PI * 2);\n ctx.lineWidth = 1.25;\n ctx.strokeStyle = style.text;\n ctx.stroke();\n }\n ctx.restore();\n};\n"],"mappings":"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"}
@@ -73,7 +73,7 @@ var i = (t, n) => ({
73
73
  }
74
74
  e.strokeStyle = i.grid, e.stroke(), e.beginPath(), m.forEach((t, n) => n ? e.lineTo(t.x, t.y) : e.moveTo(t.x, t.y)), e.closePath(), e.strokeStyle = i.axis, e.stroke();
75
75
  }
76
- }, d = (e, t, n = 2) => e.x < t.x + t.w + n && t.x < e.x + e.w + n && e.y < t.y + t.h + n && t.y < e.y + e.h + n, f = (e, t, n) => {
76
+ }, d = (e, t, n = 2) => e.x < t.x + t.w + n && t.x < e.x + e.w + n && e.y < t.y + t.h + n && t.y < e.y + e.h + n, f = 10, p = (e, t, n) => {
77
77
  let i = c(t), a = e.eye;
78
78
  if (n === 0) return [
79
79
  0,
@@ -99,58 +99,65 @@ var i = (t, n) => ({
99
99
  ]);
100
100
  }
101
101
  return o;
102
- }, p = (e, t, i, o, s = {
102
+ }, m = (e, t, i, o, s = {
103
103
  left: 0,
104
104
  top: 0,
105
105
  right: t.width,
106
106
  bottom: t.height
107
107
  }) => {
108
- let c = r(t, 0, 0, 0), u = [], p = o.fontSize, m = `${p}px ${o.font}`, h = `600 ${p + 1}px ${o.font}`;
109
- for (let g = 0; g < 3; g++) {
110
- let _ = i[a[g]];
111
- if (!_.visible) continue;
112
- let v = f(t, i, g), y = r(t, ...l(g, -_.half, v)), b = r(t, ...l(g, _.half, v)), x = b.x - y.x, S = b.y - y.y, C = Math.hypot(x, S);
113
- if (C < 24) continue;
114
- x /= C, S /= C;
115
- let w = -S, T = x, E = (y.x + b.x) / 2, D = (y.y + b.y) / 2;
116
- w * (E - c.x) + T * (D - c.y) < 0 && (w = -w, T = -T), g === 2 && (w = E < c.x ? -1 : 1, T = 0);
117
- let O = w > .35 ? "left" : w < -.35 ? "right" : "center", k = T > .35 ? "top" : T < -.35 ? "bottom" : "middle";
118
- e.font = m, e.textAlign = O, e.textBaseline = k;
119
- let A = _.ticks.map((i, a) => {
120
- let o = r(t, ...l(g, n(_, i), v)), s = _.labels[a] ?? "", c = e.measureText(s).width, u = o.x + w * 8, d = o.y + T * 8;
108
+ let c = r(t, 0, 0, 0), u = [], m = o.fontSize, h = `${m}px ${o.font}`, g = `600 ${m + 1}px ${o.font}`;
109
+ for (let _ = 0; _ < 3; _++) {
110
+ let v = i[a[_]];
111
+ if (!v.visible) continue;
112
+ let y = p(t, i, _), b = r(t, ...l(_, -v.half, y)), x = r(t, ...l(_, v.half, y)), S = x.x - b.x, C = x.y - b.y, w = Math.hypot(S, C);
113
+ if (w < 24) continue;
114
+ S /= w, C /= w;
115
+ let T = -C, E = S, D = (b.x + x.x) / 2, O = (b.y + x.y) / 2;
116
+ T * (D - c.x) + E * (O - c.y) < 0 && (T = -T, E = -E), _ === 2 && (T = D < c.x ? -1 : 1, E = 0);
117
+ let k = T > .35 ? "left" : T < -.35 ? "right" : "center", A = E > .35 ? "top" : E < -.35 ? "bottom" : "middle";
118
+ e.font = h, e.textAlign = k, e.textBaseline = A;
119
+ let j = v.ticks.map((i, a) => {
120
+ let o = r(t, ...l(_, n(v, i), y)), s = v.labels[a] ?? "", c = e.measureText(s).width, u = o.x + T * 8, d = o.y + E * 8;
121
121
  return {
122
122
  tick: o,
123
123
  text: s,
124
124
  x: u,
125
125
  y: d,
126
126
  rect: {
127
- x: O === "left" ? u : O === "right" ? u - c : u - c / 2,
128
- y: k === "top" ? d : k === "bottom" ? d - p : d - p / 2,
127
+ x: k === "left" ? u : k === "right" ? u - c : u - c / 2,
128
+ y: A === "top" ? d : A === "bottom" ? d - m : d - m / 2,
129
129
  w: c,
130
- h: p
130
+ h: m
131
131
  }
132
132
  };
133
- }), j = 1;
134
- for (; j < A.length; j++) {
135
- let e = A.filter((e, t) => t % j === 0);
133
+ }), M = 1;
134
+ for (; M < j.length; M++) {
135
+ let e = j.filter((e, t) => t % M === 0);
136
136
  if (e.every((t, n) => !e.slice(0, n).some((e) => d(t.rect, e.rect)))) break;
137
137
  }
138
- let M = 0;
139
- if (e.beginPath(), A.forEach((t, n) => {
140
- n % j || u.some((e) => d(t.rect, e)) || (u.push(t.rect), e.moveTo(t.tick.x, t.tick.y), e.lineTo(t.tick.x + w * 4, t.tick.y + T * 4), M = Math.max(M, Math.abs(w) * t.rect.w + Math.abs(T) * t.rect.h));
141
- }), e.strokeStyle = o.axis, e.lineWidth = 1, e.stroke(), e.fillStyle = o.muted, A.forEach((t, n) => {
142
- n % j || !u.includes(t.rect) || e.fillText(t.text, t.x, t.y);
143
- }), !_.title) continue;
144
- let N = 8 + M + 10, P = E + w * N, F = D + T * N;
145
- e.font = h, e.fillStyle = o.text;
146
- let I = e.measureText(_.title).width, L = p + 1;
147
- if (g === 2) P = Math.max(s.left + L, Math.min(s.right - L, P)), F = Math.max(s.top + I / 2, Math.min(s.bottom - I / 2, F)), e.save(), e.translate(P, F), e.rotate(-Math.PI / 2), e.textAlign = "center", e.textBaseline = w < 0 ? "bottom" : "top", e.fillText(_.title, 0, 0), e.restore();
138
+ let N = 0;
139
+ if (e.beginPath(), j.forEach((t, n) => {
140
+ n % M || u.some((e) => d(t.rect, e, f)) || (u.push(t.rect), e.moveTo(t.tick.x, t.tick.y), e.lineTo(t.tick.x + T * 4, t.tick.y + E * 4), N = Math.max(N, Math.abs(T) * t.rect.w + Math.abs(E) * t.rect.h));
141
+ }), e.strokeStyle = o.axis, e.lineWidth = 1, e.stroke(), e.fillStyle = o.muted, j.forEach((t, n) => {
142
+ n % M || !u.includes(t.rect) || e.fillText(t.text, t.x, t.y);
143
+ }), !v.title) continue;
144
+ let P = 8 + N + 10, F = D + T * P, I = O + E * P;
145
+ e.font = g, e.fillStyle = o.text;
146
+ let L = e.measureText(v.title).width, R = m + 1;
147
+ if (_ === 2) F = Math.max(s.left + R, Math.min(s.right - R, F)), I = Math.max(s.top + L / 2, Math.min(s.bottom - L / 2, I)), e.save(), e.translate(F, I), e.rotate(-Math.PI / 2), e.textAlign = "center", e.textBaseline = T < 0 ? "bottom" : "top", e.fillText(v.title, 0, 0), e.restore();
148
148
  else {
149
- let t = O === "left" ? P : O === "right" ? P - I : P - I / 2, n = k === "top" ? F : k === "bottom" ? F - L : F - L / 2;
150
- P += Math.max(0, s.left - t) - Math.max(0, t + I - s.right), F += Math.max(0, s.top - n) - Math.max(0, n + L - s.bottom), e.textAlign = O, e.textBaseline = k, e.fillText(_.title, P, F);
149
+ let t = (e, t) => ({
150
+ x: k === "left" ? e : k === "right" ? e - L : e - L / 2,
151
+ y: A === "top" ? t : A === "bottom" ? t - R : t - R / 2,
152
+ w: L,
153
+ h: R
154
+ });
155
+ for (let e = 0; e < 12 && u.some((e) => d(t(F, I), e)); e++) F += T * 3, I += E * 3;
156
+ let { x: n, y: r } = t(F, I);
157
+ F += Math.max(0, s.left - n) - Math.max(0, n + L - s.right), I += Math.max(0, s.top - r) - Math.max(0, r + R - s.bottom), u.push(t(F, I)), e.textAlign = k, e.textBaseline = A, e.fillText(v.title, F, I);
151
158
  }
152
159
  }
153
- }, m = (n, r, i, a, o, s, c, l = Infinity) => {
160
+ }, h = (n, r, i, a, o, s, c, l = Infinity) => {
154
161
  let u = n.createLinearGradient(0, r.y + r.h, 0, r.y);
155
162
  for (let t = 0; t <= 24; t++) {
156
163
  let n = i.rgba[Math.round(t / 24 * (i.rgba.length - 1))];
@@ -170,7 +177,7 @@ var i = (t, n) => ({
170
177
  let e = n.measureText(s).width;
171
178
  n.fillText(s, Math.max(4, Math.min(r.x, l - 4 - e)), r.y - 8);
172
179
  }
173
- }, h = (e, t, n, i, a) => {
180
+ }, g = (e, t, n, i, a) => {
174
181
  if (e.save(), i.kind === "point") e.beginPath(), e.arc(i.x, i.y, i.radius + 3, 0, Math.PI * 2), e.lineWidth = 3, e.strokeStyle = a.background, e.stroke(), e.lineWidth = 1.5, e.strokeStyle = a.text, e.stroke();
175
182
  else if (i.kind === "box") {
176
183
  let { min: n, max: o } = i, s = (e) => r(t, e & 1 ? o[0] : n[0], e & 2 ? o[1] : n[1], e & 4 ? o[2] : n[2]), c = Array.from({ length: 8 }, (e, t) => s(t));
@@ -192,6 +199,6 @@ var i = (t, n) => ({
192
199
  e.restore();
193
200
  };
194
201
  //#endregion
195
- export { p as drawAxes, m as drawColorBar, h as drawHighlight, u as drawWalls, s as farWalls, o as gridPositions, f as labelEdge, i as overlayStyle };
202
+ export { m as drawAxes, h as drawColorBar, g as drawHighlight, u as drawWalls, s as farWalls, o as gridPositions, p as labelEdge, i as overlayStyle };
196
203
 
197
204
  //# sourceMappingURL=overlay.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.js","names":["overlayStyle","toCss","theme","dark","AXES","gridPositions","axis","out","i","toWorld","farWalls","frame","half","axes","at","p","rest","value","drawWalls","h","walls","P","project","a","b","c","base","corner","sb","sc","quad","ctx","q","style","along","across","w","p0","p1","s0","s1","overlaps","pad","labelEdge","eye","best","left","sx","sy","drawAxes","center","placed","size","labelFont","titleFont","edge","e0","e1","dx","dy","length","ox","oy","mx","my","align","baseline","labels","s","tick","text","x","y","step","kept","l","o","extent","distance","tx","ty","tw","th","bounds","top","drawColorBar","gradient","rect","lut","min","max","domain","span","ticks","linearTicks","t","format","title","right","drawHighlight","shape","pts","bit","z","floor"],"sources":["../../../../../charts/src/engine/three-d/overlay.ts"],"sourcesContent":["// 2D overlay of the 3D charts: the far walls of the axis box with their grid\n// lines (below the data), then the tick labels, axis titles, color bar and\n// hover highlight (above the data). Text is always horizontal (screen\n// aligned) so it stays readable whatever the camera.\n\nimport { toCss, type Rgba } from \"../color\";\nimport { linearTicks } from \"../scale\";\nimport type { ColorLut } from \"./colormap\";\nimport { project, type CameraFrame, type Vec3 } from \"./math\";\nimport { toWorld, type AxisModel, type Model3D } from \"./model\";\n\nexport interface OverlayStyle {\n text: string;\n muted: string;\n grid: string;\n axis: string;\n /** Tint of the walls */\n wall: string;\n /** Background (rings of the hover marker) */\n background: string;\n font: string;\n fontSize: number;\n}\n\nexport const overlayStyle = (\n theme: {\n text: Rgba;\n textMuted: Rgba;\n grid: Rgba;\n axis: Rgba;\n background: Rgba;\n fontFamily: string;\n fontSize: number;\n },\n dark: boolean,\n): OverlayStyle => ({\n text: toCss(theme.text),\n muted: toCss(theme.textMuted),\n grid: toCss(theme.grid),\n axis: toCss(theme.axis),\n wall: toCss(theme.text, dark ? 0.045 : 0.025),\n background: toCss(theme.background),\n font: theme.fontFamily,\n fontSize: theme.fontSize,\n});\n\ntype Axes = Pick<Model3D, \"x\" | \"y\" | \"z\">;\n\nconst AXES: readonly (\"x\" | \"y\" | \"z\")[] = [\"x\", \"y\", \"z\"];\n\n/** World positions of the grid lines of an axis (category axes: between the categories) */\nexport const gridPositions = (axis: AxisModel): number[] => {\n if (axis.categories) {\n const out: number[] = [];\n for (let i = 0; i < axis.categories.length - 1; i++)\n out.push(toWorld(axis, i + 0.5));\n return out;\n }\n return axis.ticks\n .filter((t) => t > axis.domain[0] && t < axis.domain[1])\n .map((t) => toWorld(axis, t));\n};\n\n/** Side (-1 / 1) of the far wall perpendicular to every axis */\nexport const farWalls = (frame: CameraFrame): [number, number, number] => [\n frame.eye[0] >= 0 ? -1 : 1,\n frame.eye[1] >= 0 ? -1 : 1,\n frame.eye[2] >= 0 ? -1 : 1,\n];\n\nconst half = (axes: Axes): Vec3 => [axes.x.half, axes.y.half, axes.z.half];\n\nconst at = (axis: number, value: number, rest: Vec3): Vec3 => {\n const p: Vec3 = [rest[0], rest[1], rest[2]];\n p[axis] = value;\n return p;\n};\n\n/** Far walls, their grid lines and borders */\nexport const drawWalls = (\n ctx: CanvasRenderingContext2D,\n frame: CameraFrame,\n axes: Axes,\n style: OverlayStyle,\n): void => {\n const h = half(axes);\n const walls = farWalls(frame);\n const P = (p: Vec3) => project(frame, p[0], p[1], p[2]);\n ctx.lineWidth = 1;\n for (let a = 0; a < 3; a++) {\n const b = (a + 1) % 3;\n const c = (a + 2) % 3;\n const base: Vec3 = [0, 0, 0];\n base[a] = walls[a] * h[a];\n const corner = (sb: number, sc: number) => {\n const p: Vec3 = [base[0], base[1], base[2]];\n p[b] = sb * h[b];\n p[c] = sc * h[c];\n return P(p);\n };\n const quad = [corner(-1, -1), corner(1, -1), corner(1, 1), corner(-1, 1)];\n ctx.beginPath();\n quad.forEach((q, i) => (i ? ctx.lineTo(q.x, q.y) : ctx.moveTo(q.x, q.y)));\n ctx.closePath();\n ctx.fillStyle = style.wall;\n ctx.fill();\n // grid lines of the two axes spanning the wall\n ctx.beginPath();\n for (const [along, across] of [\n [b, c],\n [c, b],\n ] as const) {\n const axis = axes[AXES[along]!];\n if (!axis.grid) continue;\n for (const w of gridPositions(axis)) {\n const p0 = at(along, w, base);\n const p1 = at(along, w, base);\n p0[across] = -h[across];\n p1[across] = h[across];\n const s0 = P(p0);\n const s1 = P(p1);\n ctx.moveTo(s0.x, s0.y);\n ctx.lineTo(s1.x, s1.y);\n }\n }\n ctx.strokeStyle = style.grid;\n ctx.stroke();\n ctx.beginPath();\n quad.forEach((q, i) => (i ? ctx.lineTo(q.x, q.y) : ctx.moveTo(q.x, q.y)));\n ctx.closePath();\n ctx.strokeStyle = style.axis;\n ctx.stroke();\n }\n};\n\ninterface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nconst overlaps = (a: Rect, b: Rect, pad = 2) =>\n a.x < b.x + b.w + pad &&\n b.x < a.x + a.w + pad &&\n a.y < b.y + b.h + pad &&\n b.y < a.y + a.h + pad;\n\n/** Edge (fixed coordinates of the two other axes) carrying the labels of an axis */\nexport const labelEdge = (\n frame: CameraFrame,\n axes: Axes,\n axis: number,\n): Vec3 => {\n const h = half(axes);\n const eye = frame.eye;\n if (axis === 0) return [0, (eye[1] >= 0 ? 1 : -1) * h[1], -h[2]];\n if (axis === 1) return [(eye[0] >= 0 ? 1 : -1) * h[0], 0, -h[2]];\n // vertical axis: the leftmost vertical edge on screen\n let best: Vec3 = [-h[0], -h[1], 0];\n let left = Infinity;\n for (const sx of [-1, 1]) {\n for (const sy of [-1, 1]) {\n const p = project(frame, sx * h[0], sy * h[1], 0);\n if (p.x < left) {\n left = p.x;\n best = [sx * h[0], sy * h[1], 0];\n }\n }\n }\n return best;\n};\n\n/** Area the labels and titles must stay in (CSS pixels of the stage) */\nexport interface OverlayBounds {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\n/** Tick labels and titles of the three axes */\nexport const drawAxes = (\n ctx: CanvasRenderingContext2D,\n frame: CameraFrame,\n axes: Axes,\n style: OverlayStyle,\n bounds: OverlayBounds = {\n left: 0,\n top: 0,\n right: frame.width,\n bottom: frame.height,\n },\n): void => {\n const center = project(frame, 0, 0, 0);\n const placed: Rect[] = [];\n const size = style.fontSize;\n const labelFont = `${size}px ${style.font}`;\n const titleFont = `600 ${size + 1}px ${style.font}`;\n for (let a = 0; a < 3; a++) {\n const axis = axes[AXES[a]!];\n if (!axis.visible) continue;\n const edge = labelEdge(frame, axes, a);\n const e0 = project(frame, ...at(a, -axis.half, edge));\n const e1 = project(frame, ...at(a, axis.half, edge));\n let dx = e1.x - e0.x;\n let dy = e1.y - e0.y;\n const length = Math.hypot(dx, dy);\n // seen end-on: no room for labels\n if (length < 24) continue;\n dx /= length;\n dy /= length;\n let ox = -dy;\n let oy = dx;\n const mx = (e0.x + e1.x) / 2;\n const my = (e0.y + e1.y) / 2;\n if (ox * (mx - center.x) + oy * (my - center.y) < 0) {\n ox = -ox;\n oy = -oy;\n }\n // vertical axis: labels go sideways\n if (a === 2) {\n ox = mx < center.x ? -1 : 1;\n oy = 0;\n }\n const align: CanvasTextAlign =\n ox > 0.35 ? \"left\" : ox < -0.35 ? \"right\" : \"center\";\n const baseline: CanvasTextBaseline =\n oy > 0.35 ? \"top\" : oy < -0.35 ? \"bottom\" : \"middle\";\n ctx.font = labelFont;\n ctx.textAlign = align;\n ctx.textBaseline = baseline;\n const gap = 8;\n const labels = axis.ticks.map((tick, i) => {\n const s = project(frame, ...at(a, toWorld(axis, tick), edge));\n const text = axis.labels[i] ?? \"\";\n const w = ctx.measureText(text).width;\n const x = s.x + ox * gap;\n const y = s.y + oy * gap;\n const rx = align === \"left\" ? x : align === \"right\" ? x - w : x - w / 2;\n const ry =\n baseline === \"top\"\n ? y\n : baseline === \"bottom\"\n ? y - size\n : y - size / 2;\n return { tick: s, text, x, y, rect: { x: rx, y: ry, w, h: size } };\n });\n // thin the labels until they do not overlap\n let step = 1;\n for (; step < labels.length; step++) {\n const kept = labels.filter((_, i) => i % step === 0);\n if (\n kept.every(\n (l, i) => !kept.slice(0, i).some((o) => overlaps(l.rect, o.rect)),\n )\n ) {\n break;\n }\n }\n let extent = 0;\n ctx.beginPath();\n labels.forEach((l, i) => {\n if (i % step) return;\n if (placed.some((o) => overlaps(l.rect, o))) return;\n placed.push(l.rect);\n ctx.moveTo(l.tick.x, l.tick.y);\n ctx.lineTo(l.tick.x + ox * 4, l.tick.y + oy * 4);\n extent = Math.max(\n extent,\n Math.abs(ox) * l.rect.w + Math.abs(oy) * l.rect.h,\n );\n });\n ctx.strokeStyle = style.axis;\n ctx.lineWidth = 1;\n ctx.stroke();\n ctx.fillStyle = style.muted;\n labels.forEach((l, i) => {\n if (i % step || !placed.includes(l.rect)) return;\n ctx.fillText(l.text, l.x, l.y);\n });\n if (!axis.title) continue;\n const distance = gap + extent + 10;\n let tx = mx + ox * distance;\n let ty = my + oy * distance;\n ctx.font = titleFont;\n ctx.fillStyle = style.text;\n const tw = ctx.measureText(axis.title).width;\n const th = size + 1;\n if (a === 2) {\n tx = Math.max(bounds.left + th, Math.min(bounds.right - th, tx));\n ty = Math.max(bounds.top + tw / 2, Math.min(bounds.bottom - tw / 2, ty));\n ctx.save();\n ctx.translate(tx, ty);\n ctx.rotate(-Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.textBaseline = ox < 0 ? \"bottom\" : \"top\";\n ctx.fillText(axis.title, 0, 0);\n ctx.restore();\n } else {\n // keep the whole title inside the bounds\n const left =\n align === \"left\" ? tx : align === \"right\" ? tx - tw : tx - tw / 2;\n const top =\n baseline === \"top\" ? ty : baseline === \"bottom\" ? ty - th : ty - th / 2;\n tx +=\n Math.max(0, bounds.left - left) - Math.max(0, left + tw - bounds.right);\n ty +=\n Math.max(0, bounds.top - top) - Math.max(0, top + th - bounds.bottom);\n ctx.textAlign = align;\n ctx.textBaseline = baseline;\n ctx.fillText(axis.title, tx, ty);\n }\n }\n};\n\n/** Vertical color bar with its ticks and title */\nexport const drawColorBar = (\n ctx: CanvasRenderingContext2D,\n rect: Rect,\n lut: ColorLut,\n domain: readonly [number, number],\n format: (value: number) => string,\n title: string,\n style: OverlayStyle,\n /** Right end of the stage: the title is shifted left to fit */\n right = Infinity,\n): void => {\n const gradient = ctx.createLinearGradient(0, rect.y + rect.h, 0, rect.y);\n const samples = 24;\n for (let i = 0; i <= samples; i++) {\n const c = lut.rgba[Math.round((i / samples) * (lut.rgba.length - 1))];\n if (c) gradient.addColorStop(i / samples, toCss(c));\n }\n ctx.fillStyle = gradient;\n ctx.beginPath();\n if (typeof ctx.roundRect === \"function\")\n ctx.roundRect(rect.x, rect.y, rect.w, rect.h, 3);\n else ctx.rect(rect.x, rect.y, rect.w, rect.h);\n ctx.fill();\n ctx.strokeStyle = style.axis;\n ctx.lineWidth = 1;\n ctx.stroke();\n const [min, max] = domain;\n const span = max - min || 1;\n ctx.font = `${style.fontSize}px ${style.font}`;\n ctx.fillStyle = style.muted;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n const ticks = linearTicks(min, max, Math.max(2, Math.round(rect.h / 40)));\n ctx.beginPath();\n for (const t of ticks) {\n const y = rect.y + rect.h - ((t - min) / span) * rect.h;\n if (y < rect.y - 0.5 || y > rect.y + rect.h + 0.5) continue;\n ctx.moveTo(rect.x + rect.w, y);\n ctx.lineTo(rect.x + rect.w + 4, y);\n ctx.fillText(format(t), rect.x + rect.w + 7, y);\n }\n ctx.strokeStyle = style.axis;\n ctx.stroke();\n if (title) {\n ctx.font = `600 ${style.fontSize}px ${style.font}`;\n ctx.fillStyle = style.text;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"bottom\";\n const w = ctx.measureText(title).width;\n ctx.fillText(\n title,\n Math.max(4, Math.min(rect.x, right - 4 - w)),\n rect.y - 8,\n );\n }\n};\n\n/** Highlight of the hovered item */\nexport type HighlightShape =\n | { kind: \"point\"; x: number; y: number; radius: number; color: string }\n | { kind: \"box\"; min: Vec3; max: Vec3; color: string }\n | { kind: \"vertex\"; world: Vec3; color: string };\n\nexport const drawHighlight = (\n ctx: CanvasRenderingContext2D,\n frame: CameraFrame,\n axes: Axes,\n shape: HighlightShape,\n style: OverlayStyle,\n): void => {\n ctx.save();\n if (shape.kind === \"point\") {\n ctx.beginPath();\n ctx.arc(shape.x, shape.y, shape.radius + 3, 0, Math.PI * 2);\n ctx.lineWidth = 3;\n ctx.strokeStyle = style.background;\n ctx.stroke();\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = style.text;\n ctx.stroke();\n } else if (shape.kind === \"box\") {\n const { min, max } = shape;\n const corner = (i: number) =>\n project(\n frame,\n i & 1 ? max[0] : min[0],\n i & 2 ? max[1] : min[1],\n i & 4 ? max[2] : min[2],\n );\n const pts = Array.from({ length: 8 }, (_, i) => corner(i));\n ctx.beginPath();\n for (let i = 0; i < 8; i++) {\n for (const bit of [1, 2, 4]) {\n if (i & bit) continue;\n const a = pts[i]!;\n const b = pts[i | bit]!;\n ctx.moveTo(a.x, a.y);\n ctx.lineTo(b.x, b.y);\n }\n }\n ctx.lineJoin = \"round\";\n ctx.lineWidth = 3.5;\n ctx.strokeStyle = style.background;\n ctx.stroke();\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = style.text;\n ctx.stroke();\n } else {\n const [x, y, z] = shape.world;\n const top = project(frame, x, y, z);\n const floor = project(frame, x, y, -axes.z.half);\n ctx.beginPath();\n ctx.setLineDash([3, 3]);\n ctx.moveTo(top.x, top.y);\n ctx.lineTo(floor.x, floor.y);\n ctx.lineWidth = 1;\n ctx.strokeStyle = style.text;\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.beginPath();\n ctx.arc(floor.x, floor.y, 2.5, 0, Math.PI * 2);\n ctx.fillStyle = style.text;\n ctx.fill();\n ctx.beginPath();\n ctx.arc(top.x, top.y, 5, 0, Math.PI * 2);\n ctx.fillStyle = shape.color;\n ctx.fill();\n ctx.lineWidth = 2;\n ctx.strokeStyle = style.background;\n ctx.stroke();\n ctx.beginPath();\n ctx.arc(top.x, top.y, 7, 0, Math.PI * 2);\n ctx.lineWidth = 1.25;\n ctx.strokeStyle = style.text;\n ctx.stroke();\n }\n ctx.restore();\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"overlay.js","names":["overlayStyle","toCss","theme","dark","AXES","gridPositions","axis","out","i","toWorld","farWalls","frame","half","axes","at","p","rest","value","drawWalls","h","walls","P","project","a","b","c","base","corner","sb","sc","quad","ctx","q","style","along","across","w","p0","p1","s0","s1","overlaps","pad","CROSS_AXIS_GAP","labelEdge","eye","best","left","sx","sy","drawAxes","center","placed","size","labelFont","titleFont","edge","e0","e1","dx","dy","length","ox","oy","mx","my","align","baseline","labels","s","tick","text","x","y","step","kept","l","o","extent","distance","tx","ty","tw","th","bounds","rectAt","k","top","drawColorBar","gradient","rect","lut","min","max","domain","span","ticks","linearTicks","t","format","title","right","drawHighlight","shape","pts","bit","z","floor"],"sources":["../../../../../charts/src/engine/three-d/overlay.ts"],"sourcesContent":["// 2D overlay of the 3D charts: the far walls of the axis box with their grid\n// lines (below the data), then the tick labels, axis titles, color bar and\n// hover highlight (above the data). Text is always horizontal (screen\n// aligned) so it stays readable whatever the camera.\n\nimport { toCss, type Rgba } from \"../color\";\nimport { linearTicks } from \"../scale\";\nimport type { ColorLut } from \"./colormap\";\nimport { project, type CameraFrame, type Vec3 } from \"./math\";\nimport { toWorld, type AxisModel, type Model3D } from \"./model\";\n\nexport interface OverlayStyle {\n text: string;\n muted: string;\n grid: string;\n axis: string;\n /** Tint of the walls */\n wall: string;\n /** Background (rings of the hover marker) */\n background: string;\n font: string;\n fontSize: number;\n}\n\nexport const overlayStyle = (\n theme: {\n text: Rgba;\n textMuted: Rgba;\n grid: Rgba;\n axis: Rgba;\n background: Rgba;\n fontFamily: string;\n fontSize: number;\n },\n dark: boolean,\n): OverlayStyle => ({\n text: toCss(theme.text),\n muted: toCss(theme.textMuted),\n grid: toCss(theme.grid),\n axis: toCss(theme.axis),\n wall: toCss(theme.text, dark ? 0.045 : 0.025),\n background: toCss(theme.background),\n font: theme.fontFamily,\n fontSize: theme.fontSize,\n});\n\ntype Axes = Pick<Model3D, \"x\" | \"y\" | \"z\">;\n\nconst AXES: readonly (\"x\" | \"y\" | \"z\")[] = [\"x\", \"y\", \"z\"];\n\n/** World positions of the grid lines of an axis (category axes: between the categories) */\nexport const gridPositions = (axis: AxisModel): number[] => {\n if (axis.categories) {\n const out: number[] = [];\n for (let i = 0; i < axis.categories.length - 1; i++)\n out.push(toWorld(axis, i + 0.5));\n return out;\n }\n return axis.ticks\n .filter((t) => t > axis.domain[0] && t < axis.domain[1])\n .map((t) => toWorld(axis, t));\n};\n\n/** Side (-1 / 1) of the far wall perpendicular to every axis */\nexport const farWalls = (frame: CameraFrame): [number, number, number] => [\n frame.eye[0] >= 0 ? -1 : 1,\n frame.eye[1] >= 0 ? -1 : 1,\n frame.eye[2] >= 0 ? -1 : 1,\n];\n\nconst half = (axes: Axes): Vec3 => [axes.x.half, axes.y.half, axes.z.half];\n\nconst at = (axis: number, value: number, rest: Vec3): Vec3 => {\n const p: Vec3 = [rest[0], rest[1], rest[2]];\n p[axis] = value;\n return p;\n};\n\n/** Far walls, their grid lines and borders */\nexport const drawWalls = (\n ctx: CanvasRenderingContext2D,\n frame: CameraFrame,\n axes: Axes,\n style: OverlayStyle,\n): void => {\n const h = half(axes);\n const walls = farWalls(frame);\n const P = (p: Vec3) => project(frame, p[0], p[1], p[2]);\n ctx.lineWidth = 1;\n for (let a = 0; a < 3; a++) {\n const b = (a + 1) % 3;\n const c = (a + 2) % 3;\n const base: Vec3 = [0, 0, 0];\n base[a] = walls[a] * h[a];\n const corner = (sb: number, sc: number) => {\n const p: Vec3 = [base[0], base[1], base[2]];\n p[b] = sb * h[b];\n p[c] = sc * h[c];\n return P(p);\n };\n const quad = [corner(-1, -1), corner(1, -1), corner(1, 1), corner(-1, 1)];\n ctx.beginPath();\n quad.forEach((q, i) => (i ? ctx.lineTo(q.x, q.y) : ctx.moveTo(q.x, q.y)));\n ctx.closePath();\n ctx.fillStyle = style.wall;\n ctx.fill();\n // grid lines of the two axes spanning the wall\n ctx.beginPath();\n for (const [along, across] of [\n [b, c],\n [c, b],\n ] as const) {\n const axis = axes[AXES[along]!];\n if (!axis.grid) continue;\n for (const w of gridPositions(axis)) {\n const p0 = at(along, w, base);\n const p1 = at(along, w, base);\n p0[across] = -h[across];\n p1[across] = h[across];\n const s0 = P(p0);\n const s1 = P(p1);\n ctx.moveTo(s0.x, s0.y);\n ctx.lineTo(s1.x, s1.y);\n }\n }\n ctx.strokeStyle = style.grid;\n ctx.stroke();\n ctx.beginPath();\n quad.forEach((q, i) => (i ? ctx.lineTo(q.x, q.y) : ctx.moveTo(q.x, q.y)));\n ctx.closePath();\n ctx.strokeStyle = style.axis;\n ctx.stroke();\n }\n};\n\ninterface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nconst overlaps = (a: Rect, b: Rect, pad = 2) =>\n a.x < b.x + b.w + pad &&\n b.x < a.x + a.w + pad &&\n a.y < b.y + b.h + pad &&\n b.y < a.y + a.h + pad;\n\n/** Smallest gap (px) between tick labels of different axes */\nconst CROSS_AXIS_GAP = 10;\n\n/** Edge (fixed coordinates of the two other axes) carrying the labels of an axis */\nexport const labelEdge = (\n frame: CameraFrame,\n axes: Axes,\n axis: number,\n): Vec3 => {\n const h = half(axes);\n const eye = frame.eye;\n if (axis === 0) return [0, (eye[1] >= 0 ? 1 : -1) * h[1], -h[2]];\n if (axis === 1) return [(eye[0] >= 0 ? 1 : -1) * h[0], 0, -h[2]];\n // vertical axis: the leftmost vertical edge on screen\n let best: Vec3 = [-h[0], -h[1], 0];\n let left = Infinity;\n for (const sx of [-1, 1]) {\n for (const sy of [-1, 1]) {\n const p = project(frame, sx * h[0], sy * h[1], 0);\n if (p.x < left) {\n left = p.x;\n best = [sx * h[0], sy * h[1], 0];\n }\n }\n }\n return best;\n};\n\n/** Area the labels and titles must stay in (CSS pixels of the stage) */\nexport interface OverlayBounds {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\n/** Tick labels and titles of the three axes */\nexport const drawAxes = (\n ctx: CanvasRenderingContext2D,\n frame: CameraFrame,\n axes: Axes,\n style: OverlayStyle,\n bounds: OverlayBounds = {\n left: 0,\n top: 0,\n right: frame.width,\n bottom: frame.height,\n },\n): void => {\n const center = project(frame, 0, 0, 0);\n const placed: Rect[] = [];\n const size = style.fontSize;\n const labelFont = `${size}px ${style.font}`;\n const titleFont = `600 ${size + 1}px ${style.font}`;\n for (let a = 0; a < 3; a++) {\n const axis = axes[AXES[a]!];\n if (!axis.visible) continue;\n const edge = labelEdge(frame, axes, a);\n const e0 = project(frame, ...at(a, -axis.half, edge));\n const e1 = project(frame, ...at(a, axis.half, edge));\n let dx = e1.x - e0.x;\n let dy = e1.y - e0.y;\n const length = Math.hypot(dx, dy);\n // seen end-on: no room for labels\n if (length < 24) continue;\n dx /= length;\n dy /= length;\n let ox = -dy;\n let oy = dx;\n const mx = (e0.x + e1.x) / 2;\n const my = (e0.y + e1.y) / 2;\n if (ox * (mx - center.x) + oy * (my - center.y) < 0) {\n ox = -ox;\n oy = -oy;\n }\n // vertical axis: labels go sideways\n if (a === 2) {\n ox = mx < center.x ? -1 : 1;\n oy = 0;\n }\n const align: CanvasTextAlign =\n ox > 0.35 ? \"left\" : ox < -0.35 ? \"right\" : \"center\";\n const baseline: CanvasTextBaseline =\n oy > 0.35 ? \"top\" : oy < -0.35 ? \"bottom\" : \"middle\";\n ctx.font = labelFont;\n ctx.textAlign = align;\n ctx.textBaseline = baseline;\n const gap = 8;\n const labels = axis.ticks.map((tick, i) => {\n const s = project(frame, ...at(a, toWorld(axis, tick), edge));\n const text = axis.labels[i] ?? \"\";\n const w = ctx.measureText(text).width;\n const x = s.x + ox * gap;\n const y = s.y + oy * gap;\n const rx = align === \"left\" ? x : align === \"right\" ? x - w : x - w / 2;\n const ry =\n baseline === \"top\"\n ? y\n : baseline === \"bottom\"\n ? y - size\n : y - size / 2;\n return { tick: s, text, x, y, rect: { x: rx, y: ry, w, h: size } };\n });\n // thin the labels until they do not overlap\n let step = 1;\n for (; step < labels.length; step++) {\n const kept = labels.filter((_, i) => i % step === 0);\n if (\n kept.every(\n (l, i) => !kept.slice(0, i).some((o) => overlaps(l.rect, o.rect)),\n )\n ) {\n break;\n }\n }\n let extent = 0;\n ctx.beginPath();\n labels.forEach((l, i) => {\n if (i % step) return;\n // wider gap to the labels of the other axes: at the shared corner, two\n // labels side by side would read as one (\"-2 -2\")\n if (placed.some((o) => overlaps(l.rect, o, CROSS_AXIS_GAP))) return;\n placed.push(l.rect);\n ctx.moveTo(l.tick.x, l.tick.y);\n ctx.lineTo(l.tick.x + ox * 4, l.tick.y + oy * 4);\n extent = Math.max(\n extent,\n Math.abs(ox) * l.rect.w + Math.abs(oy) * l.rect.h,\n );\n });\n ctx.strokeStyle = style.axis;\n ctx.lineWidth = 1;\n ctx.stroke();\n ctx.fillStyle = style.muted;\n labels.forEach((l, i) => {\n if (i % step || !placed.includes(l.rect)) return;\n ctx.fillText(l.text, l.x, l.y);\n });\n if (!axis.title) continue;\n const distance = gap + extent + 10;\n let tx = mx + ox * distance;\n let ty = my + oy * distance;\n ctx.font = titleFont;\n ctx.fillStyle = style.text;\n const tw = ctx.measureText(axis.title).width;\n const th = size + 1;\n if (a === 2) {\n tx = Math.max(bounds.left + th, Math.min(bounds.right - th, tx));\n ty = Math.max(bounds.top + tw / 2, Math.min(bounds.bottom - tw / 2, ty));\n ctx.save();\n ctx.translate(tx, ty);\n ctx.rotate(-Math.PI / 2);\n ctx.textAlign = \"center\";\n ctx.textBaseline = ox < 0 ? \"bottom\" : \"top\";\n ctx.fillText(axis.title, 0, 0);\n ctx.restore();\n } else {\n const rectAt = (x: number, y: number): Rect => ({\n x: align === \"left\" ? x : align === \"right\" ? x - tw : x - tw / 2,\n y: baseline === \"top\" ? y : baseline === \"bottom\" ? y - th : y - th / 2,\n w: tw,\n h: th,\n });\n // slanted axes: long titles move out until they clear the labels\n for (\n let k = 0;\n k < 12 && placed.some((o) => overlaps(rectAt(tx, ty), o));\n k++\n ) {\n tx += ox * 3;\n ty += oy * 3;\n }\n // keep the whole title inside the bounds\n const { x: left, y: top } = rectAt(tx, ty);\n tx +=\n Math.max(0, bounds.left - left) - Math.max(0, left + tw - bounds.right);\n ty +=\n Math.max(0, bounds.top - top) - Math.max(0, top + th - bounds.bottom);\n placed.push(rectAt(tx, ty));\n ctx.textAlign = align;\n ctx.textBaseline = baseline;\n ctx.fillText(axis.title, tx, ty);\n }\n }\n};\n\n/** Vertical color bar with its ticks and title */\nexport const drawColorBar = (\n ctx: CanvasRenderingContext2D,\n rect: Rect,\n lut: ColorLut,\n domain: readonly [number, number],\n format: (value: number) => string,\n title: string,\n style: OverlayStyle,\n /** Right end of the stage: the title is shifted left to fit */\n right = Infinity,\n): void => {\n const gradient = ctx.createLinearGradient(0, rect.y + rect.h, 0, rect.y);\n const samples = 24;\n for (let i = 0; i <= samples; i++) {\n const c = lut.rgba[Math.round((i / samples) * (lut.rgba.length - 1))];\n if (c) gradient.addColorStop(i / samples, toCss(c));\n }\n ctx.fillStyle = gradient;\n ctx.beginPath();\n if (typeof ctx.roundRect === \"function\")\n ctx.roundRect(rect.x, rect.y, rect.w, rect.h, 3);\n else ctx.rect(rect.x, rect.y, rect.w, rect.h);\n ctx.fill();\n ctx.strokeStyle = style.axis;\n ctx.lineWidth = 1;\n ctx.stroke();\n const [min, max] = domain;\n const span = max - min || 1;\n ctx.font = `${style.fontSize}px ${style.font}`;\n ctx.fillStyle = style.muted;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n const ticks = linearTicks(min, max, Math.max(2, Math.round(rect.h / 40)));\n ctx.beginPath();\n for (const t of ticks) {\n const y = rect.y + rect.h - ((t - min) / span) * rect.h;\n if (y < rect.y - 0.5 || y > rect.y + rect.h + 0.5) continue;\n ctx.moveTo(rect.x + rect.w, y);\n ctx.lineTo(rect.x + rect.w + 4, y);\n ctx.fillText(format(t), rect.x + rect.w + 7, y);\n }\n ctx.strokeStyle = style.axis;\n ctx.stroke();\n if (title) {\n ctx.font = `600 ${style.fontSize}px ${style.font}`;\n ctx.fillStyle = style.text;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"bottom\";\n const w = ctx.measureText(title).width;\n ctx.fillText(\n title,\n Math.max(4, Math.min(rect.x, right - 4 - w)),\n rect.y - 8,\n );\n }\n};\n\n/** Highlight of the hovered item */\nexport type HighlightShape =\n | { kind: \"point\"; x: number; y: number; radius: number; color: string }\n | { kind: \"box\"; min: Vec3; max: Vec3; color: string }\n | { kind: \"vertex\"; world: Vec3; color: string };\n\nexport const drawHighlight = (\n ctx: CanvasRenderingContext2D,\n frame: CameraFrame,\n axes: Axes,\n shape: HighlightShape,\n style: OverlayStyle,\n): void => {\n ctx.save();\n if (shape.kind === \"point\") {\n ctx.beginPath();\n ctx.arc(shape.x, shape.y, shape.radius + 3, 0, Math.PI * 2);\n ctx.lineWidth = 3;\n ctx.strokeStyle = style.background;\n ctx.stroke();\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = style.text;\n ctx.stroke();\n } else if (shape.kind === \"box\") {\n const { min, max } = shape;\n const corner = (i: number) =>\n project(\n frame,\n i & 1 ? max[0] : min[0],\n i & 2 ? max[1] : min[1],\n i & 4 ? max[2] : min[2],\n );\n const pts = Array.from({ length: 8 }, (_, i) => corner(i));\n ctx.beginPath();\n for (let i = 0; i < 8; i++) {\n for (const bit of [1, 2, 4]) {\n if (i & bit) continue;\n const a = pts[i]!;\n const b = pts[i | bit]!;\n ctx.moveTo(a.x, a.y);\n ctx.lineTo(b.x, b.y);\n }\n }\n ctx.lineJoin = \"round\";\n ctx.lineWidth = 3.5;\n ctx.strokeStyle = style.background;\n ctx.stroke();\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = style.text;\n ctx.stroke();\n } else {\n const [x, y, z] = shape.world;\n const top = project(frame, x, y, z);\n const floor = project(frame, x, y, -axes.z.half);\n ctx.beginPath();\n ctx.setLineDash([3, 3]);\n ctx.moveTo(top.x, top.y);\n ctx.lineTo(floor.x, floor.y);\n ctx.lineWidth = 1;\n ctx.strokeStyle = style.text;\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.beginPath();\n ctx.arc(floor.x, floor.y, 2.5, 0, Math.PI * 2);\n ctx.fillStyle = style.text;\n ctx.fill();\n ctx.beginPath();\n ctx.arc(top.x, top.y, 5, 0, Math.PI * 2);\n ctx.fillStyle = shape.color;\n ctx.fill();\n ctx.lineWidth = 2;\n ctx.strokeStyle = style.background;\n ctx.stroke();\n ctx.beginPath();\n ctx.arc(top.x, top.y, 7, 0, Math.PI * 2);\n ctx.lineWidth = 1.25;\n ctx.strokeStyle = style.text;\n ctx.stroke();\n }\n ctx.restore();\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- var e=e=>{let t=e=>e.kind===`mesh`?e.opacity<1?2:0:e.kind===`points`?1:3;return e.map((e,n)=>({item:e,i:n,r:t(e)})).sort((e,t)=>e.r-t.r||e.i-t.i).map(e=>e.item)};exports.drawOrder=e;
1
+ var e=e=>e.opacity<1?!1:e.kind===`mesh`?!e.transparent:e.kind!==`points`||!e.additive&&e.style!==2,t=t=>t.kind===`lines`?3:e(t)?t.kind===`mesh`?0:1:2,n=e=>e.map((e,n)=>({item:e,i:n,r:t(e)})).sort((e,t)=>e.r-t.r||e.i-t.i).map(e=>e.item);exports.drawOrder=n,exports.drawRank=t,exports.writesDepth=e;
2
2
  //# sourceMappingURL=render-types.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"render-types.cjs","names":["drawOrder","rank","item","items","a","b"],"sources":["../../../../../charts/src/engine/three-d/render-types.ts"],"sourcesContent":["// Contract between the 3D chart and its data-layer backends.\n\nimport type { Rgba } from \"../color\";\nimport type { ChartRendererKind } from \"../types\";\nimport type { Vec3 } from \"./math\";\n\n/** Bytes per point instance: x, y, z f32, diameter (CSS px) f32, color unorm8x4 */\nexport const POINT_STRIDE = 20;\n/** Bytes per mesh vertex: position f32x3, normal f32x3, color unorm8x4 */\nexport const VERTEX_STRIDE = 28;\n/** Bytes per line segment instance: a f32x3, b f32x3, color unorm8x4 */\nexport const SEGMENT_STRIDE = 28;\n\ninterface ItemBase {\n /** Identifies the GPU resources of the item */\n key: string;\n /** Changes when the buffers must be uploaded again */\n version: number;\n /** 0-1; below 1 the item is drawn without writing depth */\n opacity: number;\n}\n\n/** Instanced billboards shaded as small spheres */\nexport interface PointsItem extends ItemBase {\n kind: \"points\";\n data: ArrayBuffer;\n count: number;\n /** Scales the dots with the distance (perspective) */\n perspective: boolean;\n}\n\n/** Lit triangles (surfaces, bars) */\nexport interface MeshItem extends ItemBase {\n kind: \"mesh\";\n vertices: ArrayBuffer;\n vertexCount: number;\n indices: Uint32Array;\n /**\n * Changes when only the order of the triangles changed (transparent meshes\n * sorted back to front): the index buffer is rewritten, same length\n */\n order?: number;\n}\n\n/** Screen-space wide segments (wireframes, contours, polylines) */\nexport interface LinesItem extends ItemBase {\n kind: \"lines\";\n data: ArrayBuffer;\n count: number;\n /** CSS pixels */\n width: number;\n /** Pulls the lines towards the camera (wireframes over their surface) */\n bias: number;\n}\n\nexport type Item3D = PointsItem | MeshItem | LinesItem;\n\nexport interface Frame3D {\n /** World -> clip (OpenGL convention) */\n viewProj: Float32Array;\n eye: Vec3;\n /** Unit vector towards the light, in world space */\n light: Vec3;\n orthographic: boolean;\n /** Distance of the camera to the box center (reference of the point sizes) */\n distance: number;\n /** Radius of the sphere around the box (depth cue range) */\n radius: number;\n /** Drawing buffer size in device pixels */\n width: number;\n height: number;\n dpr: number;\n /** ambient, diffuse, specular, shininess */\n lighting: readonly [number, number, number, number];\n /** Background color: far points fade towards it */\n fog: Rgba;\n}\n\nexport interface Renderer3D {\n readonly kind: ChartRendererKind;\n readonly canvas: HTMLCanvasElement;\n /** Drawing buffer size in device pixels */\n resize(width: number, height: number): void;\n render(items: readonly Item3D[], frame: Frame3D): void;\n destroy(): void;\n}\n\n/**\n * Order of the draws: opaque meshes, points, transparent meshes, then lines\n * (wireframes and contours stay visible over transparent surfaces)\n */\nexport const drawOrder = (items: readonly Item3D[]): Item3D[] => {\n const rank = (item: Item3D) =>\n item.kind === \"mesh\"\n ? item.opacity < 1\n ? 2\n : 0\n : item.kind === \"points\"\n ? 1\n : 3;\n return items\n .map((item, i) => ({ item, i, r: rank(item) }))\n .sort((a, b) => a.r - b.r || a.i - b.i)\n .map((e) => e.item);\n};\n"],"mappings":"AA2FA,IAAaA,EAAa,GAAuC,CAC/D,IAAMC,EAAQ,GACZC,EAAK,OAAS,OACVA,EAAK,QAAU,EACb,EACA,EACFA,EAAK,OAAS,SACZ,EACA,EACR,OAAOC,EACJ,KAAK,EAAM,KAAO,CAAE,OAAM,IAAG,EAAGF,EAAKC,CAAI,CAAE,EAAE,CAAC,CAC9C,MAAM,EAAG,IAAME,EAAE,EAAIC,EAAE,GAAKD,EAAE,EAAIC,EAAE,CAAC,CAAC,CACtC,IAAK,GAAM,EAAE,IAAI,CACtB"}
1
+ {"version":3,"file":"render-types.cjs","names":["writesDepth","item","drawRank","drawOrder","items","a","b"],"sources":["../../../../../charts/src/engine/three-d/render-types.ts"],"sourcesContent":["// Contract between the 3D chart and its data-layer backends.\n\nimport type { Rgba } from \"../color\";\nimport type { ChartRendererKind } from \"../types\";\nimport type { Vec3 } from \"./math\";\n\n/** Bytes per point instance: x, y, z f32, diameter (CSS px) f32, color unorm8x4 */\nexport const POINT_STRIDE = 20;\n/** Bytes per mesh vertex: position f32x3, normal f32x3, color unorm8x4 */\nexport const VERTEX_STRIDE = 28;\n/** Bytes per line segment instance: a f32x3, b f32x3, color unorm8x4 */\nexport const SEGMENT_STRIDE = 28;\n\ninterface ItemBase {\n /** Identifies the GPU resources of the item */\n key: string;\n /** Changes when the buffers must be uploaded again */\n version: number;\n /** 0-1; below 1 the item is drawn without writing depth */\n opacity: number;\n}\n\n/** Shapes of the points (`PointsItem.style`) */\nexport const POINT_SPHERE = 0;\nexport const POINT_DISC = 1;\nexport const POINT_GLOW = 2;\n\n/** Instanced billboards: shaded spheres, flat discs or glowing discs */\nexport interface PointsItem extends ItemBase {\n kind: \"points\";\n data: ArrayBuffer;\n count: number;\n /** Scales the dots with the distance (perspective) */\n perspective: boolean;\n /** `POINT_SPHERE`, `POINT_DISC` or `POINT_GLOW` (sphere when omitted) */\n style?: number;\n /** Adds the light of the dots (no depth writes, order independent) */\n additive?: boolean;\n /**\n * The data was thinned to 1 point out of `thinned` (CPU backend): the\n * drawn dots get denser to keep the look of the cloud\n */\n thinned?: number;\n}\n\n/** Lit triangles (surfaces, bars) */\nexport interface MeshItem extends ItemBase {\n kind: \"mesh\";\n vertices: ArrayBuffer;\n vertexCount: number;\n indices: Uint32Array;\n /**\n * Changes when only the order of the triangles changed (transparent meshes\n * sorted back to front): the index buffer is rewritten, same length\n */\n order?: number;\n /**\n * Blended without writing depth whatever its `opacity` (merged transparent\n * meshes: their opacity is baked into the vertex colors)\n */\n transparent?: boolean;\n}\n\n/** Screen-space wide segments (wireframes, contours, polylines) */\nexport interface LinesItem extends ItemBase {\n kind: \"lines\";\n data: ArrayBuffer;\n count: number;\n /** CSS pixels */\n width: number;\n /** Pulls the lines towards the camera (wireframes over their surface) */\n bias: number;\n}\n\nexport type Item3D = PointsItem | MeshItem | LinesItem;\n\nexport interface Frame3D {\n /** World -> clip (OpenGL convention) */\n viewProj: Float32Array;\n eye: Vec3;\n /** Unit vector towards the light, in world space */\n light: Vec3;\n orthographic: boolean;\n /** Distance of the camera to the box center (reference of the point sizes) */\n distance: number;\n /** Radius of the sphere around the box (depth cue range) */\n radius: number;\n /** Drawing buffer size in device pixels */\n width: number;\n height: number;\n dpr: number;\n /** ambient, diffuse, specular, shininess */\n lighting: readonly [number, number, number, number];\n /** Background color: far points fade towards it */\n fog: Rgba;\n /** Scale of the light of the additive points (tone mapped when possible) */\n exposure: number;\n}\n\nexport interface Renderer3D {\n readonly kind: ChartRendererKind;\n readonly canvas: HTMLCanvasElement;\n /**\n * Blends the transparent items in any order (weighted blended\n * order-independent transparency): they need no depth sorting\n */\n readonly orderIndependent?: boolean;\n /** Drawing buffer size in device pixels */\n resize(width: number, height: number): void;\n render(items: readonly Item3D[], frame: Frame3D): void;\n destroy(): void;\n}\n\n/** Whether an item writes the depth buffer (opaque items) */\nexport const writesDepth = (item: Item3D): boolean => {\n if (item.opacity < 1) return false;\n if (item.kind === \"mesh\") return !item.transparent;\n if (item.kind === \"points\")\n return !item.additive && item.style !== POINT_GLOW;\n return true;\n};\n\n/**\n * Draw passes of the items: 0 opaque meshes, 1 opaque points, 2 blended\n * items (transparent meshes and points: order independent, or sorted back to\n * front together), 3 lines (wireframes and contours stay visible over\n * transparent surfaces)\n */\nexport const drawRank = (item: Item3D): number =>\n item.kind === \"lines\"\n ? 3\n : !writesDepth(item)\n ? 2\n : item.kind === \"mesh\"\n ? 0\n : 1;\n\n/**\n * Order of the draws (`drawRank`). Stable: items of a rank keep their order\n * (the back-to-front order of the depth sorter for the blended items).\n */\nexport const drawOrder = (items: readonly Item3D[]): Item3D[] =>\n items\n .map((item, i) => ({ item, i, r: drawRank(item) }))\n .sort((a, b) => a.r - b.r || a.i - b.i)\n .map((e) => e.item);\n"],"mappings":"AAkHA,IAAaA,EAAe,GACtBC,EAAK,QAAU,EAAU,GACzBA,EAAK,OAAS,OAAe,CAACA,EAAK,YACnCA,EAAK,OAAS,UACT,CAACA,EAAK,UAAYA,EAAK,QAAA,EAUrBC,EAAY,GACvBD,EAAK,OAAS,QACV,EACCD,EAAYC,CAAI,EAEfA,EAAK,OAAS,OACZ,EACA,EAHF,EASKE,EAAa,GACxBC,EACG,KAAK,EAAM,KAAO,CAAE,OAAM,IAAG,EAAGF,EAASD,CAAI,CAAE,EAAE,CAAC,CAClD,MAAM,EAAG,IAAMI,EAAE,EAAIC,EAAE,GAAKD,EAAE,EAAIC,EAAE,CAAC,CAAC,CACtC,IAAK,GAAM,EAAE,IAAI"}
@@ -15,13 +15,26 @@ interface ItemBase {
15
15
  /** 0-1; below 1 the item is drawn without writing depth */
16
16
  opacity: number;
17
17
  }
18
- /** Instanced billboards shaded as small spheres */
18
+ /** Shapes of the points (`PointsItem.style`) */
19
+ export declare const POINT_SPHERE = 0;
20
+ export declare const POINT_DISC = 1;
21
+ export declare const POINT_GLOW = 2;
22
+ /** Instanced billboards: shaded spheres, flat discs or glowing discs */
19
23
  export interface PointsItem extends ItemBase {
20
24
  kind: "points";
21
25
  data: ArrayBuffer;
22
26
  count: number;
23
27
  /** Scales the dots with the distance (perspective) */
24
28
  perspective: boolean;
29
+ /** `POINT_SPHERE`, `POINT_DISC` or `POINT_GLOW` (sphere when omitted) */
30
+ style?: number;
31
+ /** Adds the light of the dots (no depth writes, order independent) */
32
+ additive?: boolean;
33
+ /**
34
+ * The data was thinned to 1 point out of `thinned` (CPU backend): the
35
+ * drawn dots get denser to keep the look of the cloud
36
+ */
37
+ thinned?: number;
25
38
  }
26
39
  /** Lit triangles (surfaces, bars) */
27
40
  export interface MeshItem extends ItemBase {
@@ -34,6 +47,11 @@ export interface MeshItem extends ItemBase {
34
47
  * sorted back to front): the index buffer is rewritten, same length
35
48
  */
36
49
  order?: number;
50
+ /**
51
+ * Blended without writing depth whatever its `opacity` (merged transparent
52
+ * meshes: their opacity is baked into the vertex colors)
53
+ */
54
+ transparent?: boolean;
37
55
  }
38
56
  /** Screen-space wide segments (wireframes, contours, polylines) */
39
57
  export interface LinesItem extends ItemBase {
@@ -65,18 +83,34 @@ export interface Frame3D {
65
83
  lighting: readonly [number, number, number, number];
66
84
  /** Background color: far points fade towards it */
67
85
  fog: Rgba;
86
+ /** Scale of the light of the additive points (tone mapped when possible) */
87
+ exposure: number;
68
88
  }
69
89
  export interface Renderer3D {
70
90
  readonly kind: ChartRendererKind;
71
91
  readonly canvas: HTMLCanvasElement;
92
+ /**
93
+ * Blends the transparent items in any order (weighted blended
94
+ * order-independent transparency): they need no depth sorting
95
+ */
96
+ readonly orderIndependent?: boolean;
72
97
  /** Drawing buffer size in device pixels */
73
98
  resize(width: number, height: number): void;
74
99
  render(items: readonly Item3D[], frame: Frame3D): void;
75
100
  destroy(): void;
76
101
  }
102
+ /** Whether an item writes the depth buffer (opaque items) */
103
+ export declare const writesDepth: (item: Item3D) => boolean;
104
+ /**
105
+ * Draw passes of the items: 0 opaque meshes, 1 opaque points, 2 blended
106
+ * items (transparent meshes and points: order independent, or sorted back to
107
+ * front together), 3 lines (wireframes and contours stay visible over
108
+ * transparent surfaces)
109
+ */
110
+ export declare const drawRank: (item: Item3D) => number;
77
111
  /**
78
- * Order of the draws: opaque meshes, points, transparent meshes, then lines
79
- * (wireframes and contours stay visible over transparent surfaces)
112
+ * Order of the draws (`drawRank`). Stable: items of a rank keep their order
113
+ * (the back-to-front order of the depth sorter for the blended items).
80
114
  */
81
115
  export declare const drawOrder: (items: readonly Item3D[]) => Item3D[];
82
116
  export {};
@@ -15,13 +15,26 @@ interface ItemBase {
15
15
  /** 0-1; below 1 the item is drawn without writing depth */
16
16
  opacity: number;
17
17
  }
18
- /** Instanced billboards shaded as small spheres */
18
+ /** Shapes of the points (`PointsItem.style`) */
19
+ export declare const POINT_SPHERE = 0;
20
+ export declare const POINT_DISC = 1;
21
+ export declare const POINT_GLOW = 2;
22
+ /** Instanced billboards: shaded spheres, flat discs or glowing discs */
19
23
  export interface PointsItem extends ItemBase {
20
24
  kind: "points";
21
25
  data: ArrayBuffer;
22
26
  count: number;
23
27
  /** Scales the dots with the distance (perspective) */
24
28
  perspective: boolean;
29
+ /** `POINT_SPHERE`, `POINT_DISC` or `POINT_GLOW` (sphere when omitted) */
30
+ style?: number;
31
+ /** Adds the light of the dots (no depth writes, order independent) */
32
+ additive?: boolean;
33
+ /**
34
+ * The data was thinned to 1 point out of `thinned` (CPU backend): the
35
+ * drawn dots get denser to keep the look of the cloud
36
+ */
37
+ thinned?: number;
25
38
  }
26
39
  /** Lit triangles (surfaces, bars) */
27
40
  export interface MeshItem extends ItemBase {
@@ -34,6 +47,11 @@ export interface MeshItem extends ItemBase {
34
47
  * sorted back to front): the index buffer is rewritten, same length
35
48
  */
36
49
  order?: number;
50
+ /**
51
+ * Blended without writing depth whatever its `opacity` (merged transparent
52
+ * meshes: their opacity is baked into the vertex colors)
53
+ */
54
+ transparent?: boolean;
37
55
  }
38
56
  /** Screen-space wide segments (wireframes, contours, polylines) */
39
57
  export interface LinesItem extends ItemBase {
@@ -65,18 +83,34 @@ export interface Frame3D {
65
83
  lighting: readonly [number, number, number, number];
66
84
  /** Background color: far points fade towards it */
67
85
  fog: Rgba;
86
+ /** Scale of the light of the additive points (tone mapped when possible) */
87
+ exposure: number;
68
88
  }
69
89
  export interface Renderer3D {
70
90
  readonly kind: ChartRendererKind;
71
91
  readonly canvas: HTMLCanvasElement;
92
+ /**
93
+ * Blends the transparent items in any order (weighted blended
94
+ * order-independent transparency): they need no depth sorting
95
+ */
96
+ readonly orderIndependent?: boolean;
72
97
  /** Drawing buffer size in device pixels */
73
98
  resize(width: number, height: number): void;
74
99
  render(items: readonly Item3D[], frame: Frame3D): void;
75
100
  destroy(): void;
76
101
  }
102
+ /** Whether an item writes the depth buffer (opaque items) */
103
+ export declare const writesDepth: (item: Item3D) => boolean;
104
+ /**
105
+ * Draw passes of the items: 0 opaque meshes, 1 opaque points, 2 blended
106
+ * items (transparent meshes and points: order independent, or sorted back to
107
+ * front together), 3 lines (wireframes and contours stay visible over
108
+ * transparent surfaces)
109
+ */
110
+ export declare const drawRank: (item: Item3D) => number;
77
111
  /**
78
- * Order of the draws: opaque meshes, points, transparent meshes, then lines
79
- * (wireframes and contours stay visible over transparent surfaces)
112
+ * Order of the draws (`drawRank`). Stable: items of a rank keep their order
113
+ * (the back-to-front order of the depth sorter for the blended items).
80
114
  */
81
115
  export declare const drawOrder: (items: readonly Item3D[]) => Item3D[];
82
116
  export {};
@@ -1,13 +1,9 @@
1
- //#region src/engine/three-d/render-types.ts
2
- var e = (e) => {
3
- let t = (e) => e.kind === "mesh" ? e.opacity < 1 ? 2 : 0 : e.kind === "points" ? 1 : 3;
4
- return e.map((e, n) => ({
5
- item: e,
6
- i: n,
7
- r: t(e)
8
- })).sort((e, t) => e.r - t.r || e.i - t.i).map((e) => e.item);
9
- };
1
+ var e = (e) => e.opacity < 1 ? !1 : e.kind === "mesh" ? !e.transparent : e.kind !== "points" || !e.additive && e.style !== 2, t = (t) => t.kind === "lines" ? 3 : e(t) ? t.kind === "mesh" ? 0 : 1 : 2, n = (e) => e.map((e, n) => ({
2
+ item: e,
3
+ i: n,
4
+ r: t(e)
5
+ })).sort((e, t) => e.r - t.r || e.i - t.i).map((e) => e.item);
10
6
  //#endregion
11
- export { e as drawOrder };
7
+ export { n as drawOrder, t as drawRank, e as writesDepth };
12
8
 
13
9
  //# sourceMappingURL=render-types.js.map