minerva-design 1.5.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 (457) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/custom-elements.json +122 -5
  3. package/dist/angular/fesm2022/minerva-angular.mjs +55 -0
  4. package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
  5. package/dist/angular/types/minerva-angular.d.ts +23 -2
  6. package/dist/charts/canvas.d.cts +2 -1
  7. package/dist/charts/canvas.d.ts +2 -1
  8. package/dist/charts/core.d.cts +1 -1
  9. package/dist/charts/core.d.ts +1 -1
  10. package/dist/charts/engine/canvas.cjs +1 -1
  11. package/dist/charts/engine/canvas.cjs.map +1 -1
  12. package/dist/charts/engine/canvas.js +2 -1
  13. package/dist/charts/engine/canvas.js.map +1 -1
  14. package/dist/charts/engine/chart.cjs +1 -1
  15. package/dist/charts/engine/chart.cjs.map +1 -1
  16. package/dist/charts/engine/chart.js +144 -143
  17. package/dist/charts/engine/chart.js.map +1 -1
  18. package/dist/charts/engine/controller.cjs +2 -2
  19. package/dist/charts/engine/controller.cjs.map +1 -1
  20. package/dist/charts/engine/controller.d.cts +3 -1
  21. package/dist/charts/engine/controller.d.ts +3 -1
  22. package/dist/charts/engine/controller.js +130 -132
  23. package/dist/charts/engine/controller.js.map +1 -1
  24. package/dist/charts/engine/defaults.cjs.map +1 -1
  25. package/dist/charts/engine/defaults.d.cts +4 -4
  26. package/dist/charts/engine/defaults.d.ts +4 -4
  27. package/dist/charts/engine/defaults.js.map +1 -1
  28. package/dist/charts/engine/graph/chart.cjs +1 -1
  29. package/dist/charts/engine/graph/chart.cjs.map +1 -1
  30. package/dist/charts/engine/graph/chart.js +740 -597
  31. package/dist/charts/engine/graph/chart.js.map +1 -1
  32. package/dist/charts/engine/graph/dag.cjs +1 -1
  33. package/dist/charts/engine/graph/dag.cjs.map +1 -1
  34. package/dist/charts/engine/graph/dag.js +191 -166
  35. package/dist/charts/engine/graph/dag.js.map +1 -1
  36. package/dist/charts/engine/graph/force.cjs +1 -1
  37. package/dist/charts/engine/graph/force.cjs.map +1 -1
  38. package/dist/charts/engine/graph/force.d.cts +9 -0
  39. package/dist/charts/engine/graph/force.d.ts +9 -0
  40. package/dist/charts/engine/graph/force.js +279 -181
  41. package/dist/charts/engine/graph/force.js.map +1 -1
  42. package/dist/charts/engine/graph/geometry.cjs +1 -1
  43. package/dist/charts/engine/graph/geometry.cjs.map +1 -1
  44. package/dist/charts/engine/graph/geometry.d.cts +14 -1
  45. package/dist/charts/engine/graph/geometry.d.ts +14 -1
  46. package/dist/charts/engine/graph/geometry.js +77 -24
  47. package/dist/charts/engine/graph/geometry.js.map +1 -1
  48. package/dist/charts/engine/graph/model.cjs +1 -1
  49. package/dist/charts/engine/graph/model.cjs.map +1 -1
  50. package/dist/charts/engine/graph/model.d.cts +9 -0
  51. package/dist/charts/engine/graph/model.d.ts +9 -0
  52. package/dist/charts/engine/graph/model.js +63 -43
  53. package/dist/charts/engine/graph/model.js.map +1 -1
  54. package/dist/charts/engine/graph/types.d.cts +14 -0
  55. package/dist/charts/engine/graph/types.d.ts +14 -0
  56. package/dist/charts/engine/graph/worker.cjs +12 -6
  57. package/dist/charts/engine/graph/worker.cjs.map +1 -1
  58. package/dist/charts/engine/graph/worker.js +12 -6
  59. package/dist/charts/engine/graph/worker.js.map +1 -1
  60. package/dist/charts/engine/labels.cjs.map +1 -1
  61. package/dist/charts/engine/labels.d.cts +17 -0
  62. package/dist/charts/engine/labels.d.ts +17 -0
  63. package/dist/charts/engine/labels.js.map +1 -1
  64. package/dist/charts/engine/model.cjs +1 -1
  65. package/dist/charts/engine/model.cjs.map +1 -1
  66. package/dist/charts/engine/model.d.cts +33 -0
  67. package/dist/charts/engine/model.d.ts +33 -0
  68. package/dist/charts/engine/model.js +149 -126
  69. package/dist/charts/engine/model.js.map +1 -1
  70. package/dist/charts/engine/orderbook/field.cjs +37 -0
  71. package/dist/charts/engine/orderbook/field.cjs.map +1 -0
  72. package/dist/charts/engine/orderbook/field.d.cts +92 -0
  73. package/dist/charts/engine/orderbook/field.d.ts +92 -0
  74. package/dist/charts/engine/orderbook/field.js +297 -0
  75. package/dist/charts/engine/orderbook/field.js.map +1 -0
  76. package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
  77. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
  78. package/dist/charts/engine/orderbook/heatmap.js +413 -441
  79. package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
  80. package/dist/charts/engine/orderbook/host.cjs +1 -1
  81. package/dist/charts/engine/orderbook/host.cjs.map +1 -1
  82. package/dist/charts/engine/orderbook/host.d.cts +8 -1
  83. package/dist/charts/engine/orderbook/host.d.ts +8 -1
  84. package/dist/charts/engine/orderbook/host.js +27 -5
  85. package/dist/charts/engine/orderbook/host.js.map +1 -1
  86. package/dist/charts/engine/orderbook/ladder.cjs +1 -1
  87. package/dist/charts/engine/orderbook/ladder.cjs.map +1 -1
  88. package/dist/charts/engine/orderbook/ladder.js +1 -1
  89. package/dist/charts/engine/orderbook/ladder.js.map +1 -1
  90. package/dist/charts/engine/orderbook/layout.cjs +1 -1
  91. package/dist/charts/engine/orderbook/layout.cjs.map +1 -1
  92. package/dist/charts/engine/orderbook/layout.d.cts +5 -0
  93. package/dist/charts/engine/orderbook/layout.d.ts +5 -0
  94. package/dist/charts/engine/orderbook/layout.js +8 -2
  95. package/dist/charts/engine/orderbook/layout.js.map +1 -1
  96. package/dist/charts/engine/orderbook/tape.cjs +1 -1
  97. package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
  98. package/dist/charts/engine/orderbook/tape.js +3 -3
  99. package/dist/charts/engine/orderbook/tape.js.map +1 -1
  100. package/dist/charts/engine/orderbook/types.d.cts +12 -4
  101. package/dist/charts/engine/orderbook/types.d.ts +12 -4
  102. package/dist/charts/engine/overlay.cjs +1 -1
  103. package/dist/charts/engine/overlay.cjs.map +1 -1
  104. package/dist/charts/engine/overlay.d.cts +17 -0
  105. package/dist/charts/engine/overlay.d.ts +17 -0
  106. package/dist/charts/engine/overlay.js +29 -13
  107. package/dist/charts/engine/overlay.js.map +1 -1
  108. package/dist/charts/engine/presets.cjs +1 -1
  109. package/dist/charts/engine/presets.cjs.map +1 -1
  110. package/dist/charts/engine/presets.d.cts +12 -2
  111. package/dist/charts/engine/presets.d.ts +12 -2
  112. package/dist/charts/engine/presets.js +8 -2
  113. package/dist/charts/engine/presets.js.map +1 -1
  114. package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
  115. package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
  116. package/dist/charts/engine/renderers/canvas2d.js +13 -9
  117. package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
  118. package/dist/charts/engine/renderers/follow.cjs +2 -0
  119. package/dist/charts/engine/renderers/follow.cjs.map +1 -0
  120. package/dist/charts/engine/renderers/follow.d.cts +8 -0
  121. package/dist/charts/engine/renderers/follow.d.ts +8 -0
  122. package/dist/charts/engine/renderers/follow.js +10 -0
  123. package/dist/charts/engine/renderers/follow.js.map +1 -0
  124. package/dist/charts/engine/renderers/gl-budget.cjs +2 -0
  125. package/dist/charts/engine/renderers/gl-budget.cjs.map +1 -0
  126. package/dist/charts/engine/renderers/gl-budget.d.cts +32 -0
  127. package/dist/charts/engine/renderers/gl-budget.d.ts +32 -0
  128. package/dist/charts/engine/renderers/gl-budget.js +95 -0
  129. package/dist/charts/engine/renderers/gl-budget.js.map +1 -0
  130. package/dist/charts/engine/renderers/gl.cjs +1 -1
  131. package/dist/charts/engine/renderers/gl.cjs.map +1 -1
  132. package/dist/charts/engine/renderers/gl.js +1 -1
  133. package/dist/charts/engine/renderers/gl.js.map +1 -1
  134. package/dist/charts/engine/renderers/shaders.cjs +9 -6
  135. package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
  136. package/dist/charts/engine/renderers/shaders.d.cts +1 -1
  137. package/dist/charts/engine/renderers/shaders.d.ts +1 -1
  138. package/dist/charts/engine/renderers/shaders.js +9 -6
  139. package/dist/charts/engine/renderers/shaders.js.map +1 -1
  140. package/dist/charts/engine/renderers/types.cjs.map +1 -1
  141. package/dist/charts/engine/renderers/types.d.cts +2 -0
  142. package/dist/charts/engine/renderers/types.d.ts +2 -0
  143. package/dist/charts/engine/renderers/types.js.map +1 -1
  144. package/dist/charts/engine/renderers/webgl.cjs +1 -1
  145. package/dist/charts/engine/renderers/webgl.cjs.map +1 -1
  146. package/dist/charts/engine/renderers/webgl.js +85 -64
  147. package/dist/charts/engine/renderers/webgl.js.map +1 -1
  148. package/dist/charts/engine/renderers/webgl2.cjs +1 -1
  149. package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
  150. package/dist/charts/engine/renderers/webgl2.js +72 -58
  151. package/dist/charts/engine/renderers/webgl2.js.map +1 -1
  152. package/dist/charts/engine/renderers/webgpu.cjs +1 -1
  153. package/dist/charts/engine/renderers/webgpu.cjs.map +1 -1
  154. package/dist/charts/engine/renderers/webgpu.js +1 -1
  155. package/dist/charts/engine/renderers/webgpu.js.map +1 -1
  156. package/dist/charts/engine/scene.cjs +1 -1
  157. package/dist/charts/engine/scene.cjs.map +1 -1
  158. package/dist/charts/engine/scene.d.cts +51 -4
  159. package/dist/charts/engine/scene.d.ts +51 -4
  160. package/dist/charts/engine/scene.js +188 -122
  161. package/dist/charts/engine/scene.js.map +1 -1
  162. package/dist/charts/engine/shapes/chord.cjs +1 -1
  163. package/dist/charts/engine/shapes/chord.cjs.map +1 -1
  164. package/dist/charts/engine/shapes/chord.js +108 -103
  165. package/dist/charts/engine/shapes/chord.js.map +1 -1
  166. package/dist/charts/engine/shapes/types.d.cts +5 -3
  167. package/dist/charts/engine/shapes/types.d.ts +5 -3
  168. package/dist/charts/engine/three-d/canvas2d.cjs +1 -1
  169. package/dist/charts/engine/three-d/canvas2d.cjs.map +1 -1
  170. package/dist/charts/engine/three-d/canvas2d.d.cts +36 -1
  171. package/dist/charts/engine/three-d/canvas2d.d.ts +36 -1
  172. package/dist/charts/engine/three-d/canvas2d.js +155 -80
  173. package/dist/charts/engine/three-d/canvas2d.js.map +1 -1
  174. package/dist/charts/engine/three-d/chart.cjs +1 -1
  175. package/dist/charts/engine/three-d/chart.cjs.map +1 -1
  176. package/dist/charts/engine/three-d/chart.js +219 -215
  177. package/dist/charts/engine/three-d/chart.js.map +1 -1
  178. package/dist/charts/engine/three-d/oit.cjs +109 -0
  179. package/dist/charts/engine/three-d/oit.cjs.map +1 -0
  180. package/dist/charts/engine/three-d/oit.d.cts +34 -0
  181. package/dist/charts/engine/three-d/oit.d.ts +34 -0
  182. package/dist/charts/engine/three-d/oit.js +111 -0
  183. package/dist/charts/engine/three-d/oit.js.map +1 -0
  184. package/dist/charts/engine/three-d/render-types.cjs +1 -1
  185. package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
  186. package/dist/charts/engine/three-d/render-types.d.cts +16 -3
  187. package/dist/charts/engine/three-d/render-types.d.ts +16 -3
  188. package/dist/charts/engine/three-d/render-types.js +6 -9
  189. package/dist/charts/engine/three-d/render-types.js.map +1 -1
  190. package/dist/charts/engine/three-d/shaders.cjs +52 -26
  191. package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
  192. package/dist/charts/engine/three-d/shaders.d.cts +11 -3
  193. package/dist/charts/engine/three-d/shaders.d.ts +11 -3
  194. package/dist/charts/engine/three-d/shaders.js +84 -40
  195. package/dist/charts/engine/three-d/shaders.js.map +1 -1
  196. package/dist/charts/engine/three-d/sort.cjs +1 -1
  197. package/dist/charts/engine/three-d/sort.cjs.map +1 -1
  198. package/dist/charts/engine/three-d/sort.d.cts +6 -4
  199. package/dist/charts/engine/three-d/sort.d.ts +6 -4
  200. package/dist/charts/engine/three-d/sort.js +51 -39
  201. package/dist/charts/engine/three-d/sort.js.map +1 -1
  202. package/dist/charts/engine/three-d/types.d.cts +9 -0
  203. package/dist/charts/engine/three-d/types.d.ts +9 -0
  204. package/dist/charts/engine/three-d/webgl.cjs +1 -1
  205. package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
  206. package/dist/charts/engine/three-d/webgl.d.cts +9 -0
  207. package/dist/charts/engine/three-d/webgl.d.ts +9 -0
  208. package/dist/charts/engine/three-d/webgl.js +199 -76
  209. package/dist/charts/engine/three-d/webgl.js.map +1 -1
  210. package/dist/charts/engine/three-d/webgpu.cjs +1 -1
  211. package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
  212. package/dist/charts/engine/three-d/webgpu.js +225 -99
  213. package/dist/charts/engine/three-d/webgpu.js.map +1 -1
  214. package/dist/charts/engine/trading/chart.cjs +1 -1
  215. package/dist/charts/engine/trading/chart.cjs.map +1 -1
  216. package/dist/charts/engine/trading/chart.d.cts +0 -1
  217. package/dist/charts/engine/trading/chart.d.ts +0 -1
  218. package/dist/charts/engine/trading/chart.js +1048 -883
  219. package/dist/charts/engine/trading/chart.js.map +1 -1
  220. package/dist/charts/engine/trading/drawings.cjs +2 -2
  221. package/dist/charts/engine/trading/drawings.cjs.map +1 -1
  222. package/dist/charts/engine/trading/drawings.d.cts +6 -0
  223. package/dist/charts/engine/trading/drawings.d.ts +6 -0
  224. package/dist/charts/engine/trading/drawings.js +100 -88
  225. package/dist/charts/engine/trading/drawings.js.map +1 -1
  226. package/dist/charts/engine/trading/format.cjs +1 -1
  227. package/dist/charts/engine/trading/format.cjs.map +1 -1
  228. package/dist/charts/engine/trading/format.d.cts +6 -0
  229. package/dist/charts/engine/trading/format.d.ts +6 -0
  230. package/dist/charts/engine/trading/format.js +42 -30
  231. package/dist/charts/engine/trading/format.js.map +1 -1
  232. package/dist/charts/engine/trading/geometry.cjs +1 -1
  233. package/dist/charts/engine/trading/geometry.cjs.map +1 -1
  234. package/dist/charts/engine/trading/geometry.d.cts +16 -0
  235. package/dist/charts/engine/trading/geometry.d.ts +16 -0
  236. package/dist/charts/engine/trading/geometry.js +19 -4
  237. package/dist/charts/engine/trading/geometry.js.map +1 -1
  238. package/dist/charts/engine/trading/labels.cjs +1 -1
  239. package/dist/charts/engine/trading/labels.cjs.map +1 -1
  240. package/dist/charts/engine/trading/labels.js +24 -4
  241. package/dist/charts/engine/trading/labels.js.map +1 -1
  242. package/dist/charts/engine/trading/studies.cjs +1 -1
  243. package/dist/charts/engine/trading/studies.cjs.map +1 -1
  244. package/dist/charts/engine/trading/studies.d.cts +8 -0
  245. package/dist/charts/engine/trading/studies.d.ts +8 -0
  246. package/dist/charts/engine/trading/studies.js +4 -1
  247. package/dist/charts/engine/trading/studies.js.map +1 -1
  248. package/dist/charts/engine/trading/types.d.cts +34 -11
  249. package/dist/charts/engine/trading/types.d.ts +34 -11
  250. package/dist/charts/engine/types.d.cts +25 -4
  251. package/dist/charts/engine/types.d.ts +25 -4
  252. package/dist/charts/react/charts.cjs +1 -1
  253. package/dist/charts/react/charts.cjs.map +1 -1
  254. package/dist/charts/react/charts.js +20 -15
  255. package/dist/charts/react/charts.js.map +1 -1
  256. package/dist/charts/react/graph.cjs +1 -1
  257. package/dist/charts/react/graph.cjs.map +1 -1
  258. package/dist/charts/react/graph.d.cts +6 -0
  259. package/dist/charts/react/graph.d.ts +6 -0
  260. package/dist/charts/react/graph.js +28 -27
  261. package/dist/charts/react/graph.js.map +1 -1
  262. package/dist/charts/react/orderbook.cjs +1 -1
  263. package/dist/charts/react/orderbook.cjs.map +1 -1
  264. package/dist/charts/react/orderbook.d.cts +3 -1
  265. package/dist/charts/react/orderbook.d.ts +3 -1
  266. package/dist/charts/react/orderbook.js +1 -0
  267. package/dist/charts/react/orderbook.js.map +1 -1
  268. package/dist/charts/react/shapes.cjs.map +1 -1
  269. package/dist/charts/react/shapes.d.cts +4 -3
  270. package/dist/charts/react/shapes.d.ts +4 -3
  271. package/dist/charts/react/shapes.js.map +1 -1
  272. package/dist/charts/react/three-d.cjs +1 -1
  273. package/dist/charts/react/three-d.cjs.map +1 -1
  274. package/dist/charts/react/three-d.d.cts +7 -0
  275. package/dist/charts/react/three-d.d.ts +7 -0
  276. package/dist/charts/react/three-d.js +14 -13
  277. package/dist/charts/react/three-d.js.map +1 -1
  278. package/dist/charts/react/trading.cjs.map +1 -1
  279. package/dist/charts/react/trading.d.cts +3 -3
  280. package/dist/charts/react/trading.d.ts +3 -3
  281. package/dist/charts/react/trading.js.map +1 -1
  282. package/dist/core/contracts.cjs +1 -1
  283. package/dist/core/contracts.cjs.map +1 -1
  284. package/dist/core/contracts.js +1 -1
  285. package/dist/core/contracts.js.map +1 -1
  286. package/dist/native/charts/src/canvas.cjs +1 -1
  287. package/dist/native/charts/src/canvas.js +4 -3
  288. package/dist/native/charts/src/engine/controller.cjs +2 -2
  289. package/dist/native/charts/src/engine/controller.cjs.map +1 -1
  290. package/dist/native/charts/src/engine/controller.js +102 -104
  291. package/dist/native/charts/src/engine/controller.js.map +1 -1
  292. package/dist/native/charts/src/engine/labels.cjs +1 -1
  293. package/dist/native/charts/src/engine/labels.cjs.map +1 -1
  294. package/dist/native/charts/src/engine/labels.js +14 -1
  295. package/dist/native/charts/src/engine/labels.js.map +1 -1
  296. package/dist/native/charts/src/engine/model.cjs +1 -1
  297. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  298. package/dist/native/charts/src/engine/model.js +180 -157
  299. package/dist/native/charts/src/engine/model.js.map +1 -1
  300. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  301. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  302. package/dist/native/charts/src/engine/presets.cjs +1 -1
  303. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  304. package/dist/native/charts/src/engine/presets.js +8 -2
  305. package/dist/native/charts/src/engine/presets.js.map +1 -1
  306. package/dist/native/charts/src/engine/scene.cjs +1 -1
  307. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  308. package/dist/native/charts/src/engine/scene.js +188 -122
  309. package/dist/native/charts/src/engine/scene.js.map +1 -1
  310. package/dist/native/charts/src/engine/shapes/chord.cjs +1 -1
  311. package/dist/native/charts/src/engine/shapes/chord.cjs.map +1 -1
  312. package/dist/native/charts/src/engine/shapes/chord.js +108 -103
  313. package/dist/native/charts/src/engine/shapes/chord.js.map +1 -1
  314. package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
  315. package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
  316. package/dist/native/charts/src/engine/shapes/layout.js +88 -73
  317. package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
  318. package/dist/native/components/Chart/ChartBase.cjs +1 -1
  319. package/dist/native/components/Chart/ChartBase.cjs.map +1 -1
  320. package/dist/native/components/Chart/ChartBase.js +127 -115
  321. package/dist/native/components/Chart/ChartBase.js.map +1 -1
  322. package/dist/native/components/Chart/charts.cjs +1 -1
  323. package/dist/native/components/Chart/charts.cjs.map +1 -1
  324. package/dist/native/components/Chart/charts.js +8 -5
  325. package/dist/native/components/Chart/charts.js.map +1 -1
  326. package/dist/native/components/Chart/scene.cjs +1 -1
  327. package/dist/native/components/Chart/scene.cjs.map +1 -1
  328. package/dist/native/components/Chart/scene.d.cts +6 -1
  329. package/dist/native/components/Chart/scene.d.ts +6 -1
  330. package/dist/native/components/Chart/scene.js +99 -50
  331. package/dist/native/components/Chart/scene.js.map +1 -1
  332. package/dist/native/components/Chart/types.d.cts +7 -1
  333. package/dist/native/components/Chart/types.d.ts +7 -1
  334. package/dist/native/components/Charts/charts.cjs +1 -1
  335. package/dist/native/components/Charts/charts.cjs.map +1 -1
  336. package/dist/native/components/Charts/charts.js +23 -18
  337. package/dist/native/components/Charts/charts.js.map +1 -1
  338. package/dist/native/components/ShapeChart/ShapeChartBase.cjs +1 -1
  339. package/dist/native/components/ShapeChart/ShapeChartBase.cjs.map +1 -1
  340. package/dist/native/components/ShapeChart/ShapeChartBase.d.cts +1 -1
  341. package/dist/native/components/ShapeChart/ShapeChartBase.d.ts +1 -1
  342. package/dist/native/components/ShapeChart/ShapeChartBase.js +97 -107
  343. package/dist/native/components/ShapeChart/ShapeChartBase.js.map +1 -1
  344. package/dist/native/components/ShapeChart/geometry.cjs +1 -1
  345. package/dist/native/components/ShapeChart/geometry.cjs.map +1 -1
  346. package/dist/native/components/ShapeChart/geometry.js +120 -36
  347. package/dist/native/components/ShapeChart/geometry.js.map +1 -1
  348. package/dist/native/components/ShapeChart/types.d.cts +6 -4
  349. package/dist/native/components/ShapeChart/types.d.ts +6 -4
  350. package/dist/native/source/components/Chart/ChartBase.tsx +19 -6
  351. package/dist/native/source/components/Chart/charts.tsx +10 -3
  352. package/dist/native/source/components/Chart/scene.tsx +85 -0
  353. package/dist/native/source/components/Chart/types.ts +7 -0
  354. package/dist/native/source/components/Charts/charts.tsx +7 -0
  355. package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +10 -36
  356. package/dist/native/source/components/ShapeChart/geometry.ts +188 -18
  357. package/dist/native/source/components/ShapeChart/types.ts +6 -4
  358. package/dist/taro/chart-a11y.d.ts +7 -0
  359. package/dist/taro/charts.d.ts +4 -1
  360. package/dist/taro/index.js +3212 -3049
  361. package/dist/taro/shape-charts.d.ts +6 -4
  362. package/dist/uni/AreaChart.vue +2 -1
  363. package/dist/uni/AreaChart.vue.d.ts +1 -1
  364. package/dist/uni/BarChart.vue +2 -1
  365. package/dist/uni/BarChart.vue.d.ts +1 -1
  366. package/dist/uni/BoxPlotChart.vue +2 -1
  367. package/dist/uni/BubbleChart.vue +2 -1
  368. package/dist/uni/CandlestickChart.vue +2 -1
  369. package/dist/uni/Chart.vue +2 -1
  370. package/dist/uni/Divider.vue.d.ts +1 -1
  371. package/dist/uni/DonutChart.vue.d.ts +1 -1
  372. package/dist/uni/GanttChart.vue +2 -1
  373. package/dist/uni/GanttChart.vue.d.ts +11 -0
  374. package/dist/uni/GaugeChart.vue.d.ts +1 -1
  375. package/dist/uni/HeatmapChart.vue +2 -1
  376. package/dist/uni/HistogramChart.vue +2 -1
  377. package/dist/uni/HorizontalBarChart.vue +2 -1
  378. package/dist/uni/HorizontalBarChart.vue.d.ts +1 -1
  379. package/dist/uni/LineChart.vue +2 -1
  380. package/dist/uni/MixedChart.vue +2 -1
  381. package/dist/uni/PieChart.vue.d.ts +1 -1
  382. package/dist/uni/QuadrantChart.vue +2 -1
  383. package/dist/uni/RangeAreaChart.vue +2 -1
  384. package/dist/uni/ScatterChart.vue +2 -1
  385. package/dist/uni/Sparkline.vue +2 -1
  386. package/dist/uni/WaterfallChart.vue +2 -1
  387. package/dist/uni/chart-a11y.d.ts +7 -0
  388. package/dist/uni/chart-a11y.js +29 -0
  389. package/dist/uni/chart-canvas.d.ts +9 -0
  390. package/dist/uni/chart-canvas.js +11 -1
  391. package/dist/uni/chart-types.d.ts +8 -1
  392. package/dist/uni/chart-types.js +5 -1
  393. package/dist/uni/charts-canvas.js +2 -1
  394. package/dist/uni/named-chart-options.d.ts +2 -0
  395. package/dist/uni/named-chart-options.js +3 -0
  396. package/dist/uni/shape-chart-canvas.d.ts +0 -2
  397. package/dist/uni/shape-chart-canvas.js +4 -36
  398. package/dist/uni/shape-chart-types.d.ts +2 -2
  399. package/dist/uni/shape-chart-types.js +2 -2
  400. package/dist/vue/components/Chart/Bar3DChart.vue.d.ts +2 -0
  401. package/dist/vue/components/Chart/DependencyGraph.vue.d.ts +2 -0
  402. package/dist/vue/components/Chart/GanttChart.vue.d.ts +15 -0
  403. package/dist/vue/components/Chart/GanttChart.vue.js.map +1 -1
  404. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js +8 -0
  405. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  406. package/dist/vue/components/Chart/GraphChart.vue.d.ts +2 -0
  407. package/dist/vue/components/Chart/Line3DChart.vue.d.ts +2 -0
  408. package/dist/vue/components/Chart/Scatter3DChart.vue.d.ts +2 -0
  409. package/dist/vue/components/Chart/Surface3DChart.vue.d.ts +2 -0
  410. package/dist/vue/components/Chart/TradingChart.vue.d.ts +9 -0
  411. package/dist/vue/components/Chart/TreeChart.vue.d.ts +2 -0
  412. package/dist/vue/components/Chart/graph.d.ts +3 -0
  413. package/dist/vue/components/Chart/graph.js +2 -0
  414. package/dist/vue/components/Chart/graph.js.map +1 -1
  415. package/dist/vue/components/Chart/three-d.d.ts +3 -0
  416. package/dist/vue/components/Chart/three-d.js +2 -0
  417. package/dist/vue/components/Chart/three-d.js.map +1 -1
  418. package/dist/vue/components/Chart/trading.d.ts +7 -2
  419. package/dist/vue/components/Chart/trading.js +1 -0
  420. package/dist/vue/components/Chart/trading.js.map +1 -1
  421. package/dist/weapp/area-chart/index.wxml +1 -1
  422. package/dist/weapp/bar-chart/index.wxml +1 -1
  423. package/dist/weapp/box-plot-chart/index.wxml +1 -1
  424. package/dist/weapp/bubble-chart/index.wxml +1 -1
  425. package/dist/weapp/candlestick-chart/index.wxml +1 -1
  426. package/dist/weapp/chart/index.wxml +1 -1
  427. package/dist/weapp/charts/canvas.js +326 -54
  428. package/dist/weapp/charts/core.js +2 -0
  429. package/dist/weapp/controls.js +58 -27
  430. package/dist/weapp/gantt-chart/index.wxml +1 -1
  431. package/dist/weapp/heatmap-chart/index.wxml +1 -1
  432. package/dist/weapp/histogram-chart/index.wxml +1 -1
  433. package/dist/weapp/horizontal-bar-chart/index.wxml +1 -1
  434. package/dist/weapp/line-chart/index.wxml +1 -1
  435. package/dist/weapp/mixed-chart/index.wxml +1 -1
  436. package/dist/weapp/quadrant-chart/index.wxml +1 -1
  437. package/dist/weapp/range-area-chart/index.wxml +1 -1
  438. package/dist/weapp/scatter-chart/index.wxml +1 -1
  439. package/dist/weapp/sparkline/index.wxml +1 -1
  440. package/dist/weapp/types.d.ts +11 -2
  441. package/dist/weapp/waterfall-chart/index.wxml +1 -1
  442. package/dist/web-components/components/chart/extended.d.ts +4 -0
  443. package/dist/web-components/components/chart/extended.js +8 -2
  444. package/dist/web-components/components/chart/extended.js.map +1 -1
  445. package/dist/web-components/components/chart-3d/chart-3d.d.ts +1 -1
  446. package/dist/web-components/components/chart-3d/chart-3d.js.map +1 -1
  447. package/dist/web-components/components/graph/graph.d.ts +2 -0
  448. package/dist/web-components/components/graph/graph.js +3 -2
  449. package/dist/web-components/components/graph/graph.js.map +1 -1
  450. package/dist/web-components/components/trading-chart/trading-chart.d.ts +1 -1
  451. package/dist/web-components/components/trading-chart/trading-chart.js.map +1 -1
  452. package/dist/web-components/html-custom-data.json +45 -0
  453. package/dist/web-components/types/react.d.ts +4 -4
  454. package/dist/web-components/types/solid.d.ts +8 -8
  455. package/dist/web-components/types/svelte.d.ts +8 -8
  456. package/dist/web-components/types/vue.d.ts +4 -4
  457. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"canvas2d.js","names":["unpack","SCATTER_PIXEL_THRESHOLD","rgba","c","alpha","isGap","v","lowerBoundX","lo","hi","count","mid","points","stride","value","decimateArea","out","end","start","length","push","i","col","first","min","max","last","flush","picks","a","b","prev","y","column","createCanvas2dPainter","scratch","mapper","frame","w","h","x","xScale","xOffset","yScale","yOffset","visiblePoints","item","m","x0","x1","result","decimateMinMax","GAP","drawLine","pen","ctx","drawArea","gradient","runStart","close","k","drawBars","dpr","minHalf","rawHalf","r","u","pad","groups","packed","list","rounded","unpackColor","cx","rawHh","fade","inset","half","hh","cy","radius","drawScatterCells","f","cell","cols","rows","owner","cells","drawScatterPixels","scratchCanvas","sctx","image","data","size","s","y0","g","py","px","o","da","outA","drawScatter","stroke","color","left","top","items","createCanvas2dRenderer","canvas","painter","width","height"],"sources":["../../../../../charts/src/engine/renderers/canvas2d.ts"],"sourcesContent":["// Canvas2D backend: the fallback without GPU. Lines are decimated to a few\n// points per pixel column and very large scatter sets are written pixel by\n// pixel, so it stays usable with large data sets.\n\nimport { decimateMinMax } from \"../decimate\";\nimport { unpackColor as unpack, type Rgba } from \"../color\";\nimport {\n AREA_STRIDE,\n GAP,\n type AreaItem,\n type BarItem,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type ScatterItem,\n} from \"./types\";\n\n/** Scatter sets above this size are rasterized through ImageData */\nexport const SCATTER_PIXEL_THRESHOLD = 20000;\n\nconst rgba = (c: Rgba, alpha: number) =>\n `rgba(${Math.round(c[0] * 255)},${Math.round(c[1] * 255)},${Math.round(c[2] * 255)},${c[3] * alpha})`;\n\nconst isGap = (v: number) => !Number.isFinite(v) || Math.abs(v) >= GAP * 0.5;\n\n/** First point index whose relative x is >= value (sorted, interleaved) */\nconst lowerBoundX = (\n points: Float32Array,\n count: number,\n value: number,\n stride = 2,\n) => {\n let lo = 0;\n let hi = count;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (points[mid * stride] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\n/**\n * Min-max decimation of area points (x, top, bottom): per pixel column the\n * first, lowest, highest and last tops are kept with their bottoms\n */\nconst decimateArea = (\n points: Float32Array,\n start: number,\n end: number,\n column: (x: number) => number,\n): { points: Float64Array; length: number } => {\n const out = new Float64Array(Math.max(0, end - start) * AREA_STRIDE);\n let length = 0;\n const push = (i: number) => {\n out[length * 3] = points[i * 3];\n out[length * 3 + 1] = points[i * 3 + 1];\n out[length * 3 + 2] = points[i * 3 + 2];\n length++;\n };\n let col = NaN;\n let first = -1;\n let min = -1;\n let max = -1;\n let last = -1;\n const flush = () => {\n if (first < 0) return;\n const picks = [first, min, max, last].sort((a, b) => a - b);\n let prev = -1;\n for (const i of picks) {\n if (i !== prev) push(i);\n prev = i;\n }\n first = -1;\n };\n for (let i = start; i < end; i++) {\n const y = points[i * 3 + 1];\n if (isGap(points[i * 3]) || isGap(y) || isGap(points[i * 3 + 2])) {\n flush();\n col = NaN;\n push(i);\n continue;\n }\n const c = Math.floor(column(points[i * 3]));\n if (c !== col || first < 0) {\n flush();\n col = c;\n first = min = max = last = i;\n } else {\n if (y < points[min * 3 + 1]) min = i;\n if (y > points[max * 3 + 1]) max = i;\n last = i;\n }\n }\n flush();\n return { points: out, length };\n};\n\nexport interface Canvas2dPainter {\n /**\n * Draws the items in a `frame.width` x `frame.height` device-pixel area\n * whose top-left corner is at (`left`, `top`) device pixels; nothing is\n * cleared\n */\n paint(\n items: readonly RenderItem[],\n frame: RenderFrame,\n left?: number,\n top?: number,\n ): void;\n destroy(): void;\n}\n\n/**\n * Data layer drawn with any 2D context (browser canvases, mini-program\n * canvases, OffscreenCanvas). `scratchCanvas` creates the canvas used to\n * rasterize very large scatter sets; without it they are drawn as one\n * square per occupied pixel cell.\n */\nexport const createCanvas2dPainter = (\n ctx: CanvasRenderingContext2D,\n scratchCanvas?: () => HTMLCanvasElement | null,\n): Canvas2dPainter => {\n let scratch: HTMLCanvasElement | null = null;\n\n const mapper = (frame: RenderFrame) => {\n const { xScale, xOffset, yScale, yOffset } = frame.transform;\n const w = frame.width;\n const h = frame.height;\n return {\n px: (x: number) => ((x * xScale + xOffset) * 0.5 + 0.5) * w,\n py: (y: number) => (1 - ((y * yScale + yOffset) * 0.5 + 0.5)) * h,\n /** Visible relative x range */\n xRange: (): [number, number] => {\n const a = (-1 - xOffset) / xScale;\n const b = (1 - xOffset) / xScale;\n return a < b ? [a, b] : [b, a];\n },\n };\n };\n\n /** Points actually drawn: decimated when there are many per pixel */\n const visiblePoints = (\n item: Extract<RenderItem, { kind: \"line\" }>,\n frame: RenderFrame,\n ): { points: ArrayLike<number>; length: number } => {\n if (!item.sorted || item.count <= frame.width * 2) {\n return { points: item.points, length: item.count };\n }\n const m = mapper(frame);\n const [x0, x1] = m.xRange();\n const start = Math.max(0, lowerBoundX(item.points, item.count, x0) - 1);\n const end = Math.min(\n item.count,\n lowerBoundX(item.points, item.count, x1) + 1,\n );\n const result = decimateMinMax(item.points, start, end, m.px, GAP * 0.5);\n return { points: result.points, length: result.length };\n };\n\n const drawLine = (\n item: Extract<RenderItem, { kind: \"line\" }>,\n frame: RenderFrame,\n ) => {\n const m = mapper(frame);\n const { points, length } = visiblePoints(item, frame);\n ctx.beginPath();\n let pen = false;\n for (let i = 0; i < length; i++) {\n const x = points[i * 2];\n const y = points[i * 2 + 1];\n if (isGap(x) || isGap(y)) {\n pen = false;\n continue;\n }\n if (pen) ctx.lineTo(m.px(x), m.py(y));\n else ctx.moveTo(m.px(x), m.py(y));\n pen = true;\n }\n ctx.lineWidth = item.width * frame.dpr;\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n ctx.strokeStyle = rgba(item.color, 1);\n ctx.stroke();\n };\n\n const drawArea = (item: AreaItem, frame: RenderFrame) => {\n const m = mapper(frame);\n let points: ArrayLike<number> = item.points;\n let length = item.count;\n if (item.sorted && item.count > frame.width * 2) {\n const [x0, x1] = m.xRange();\n const start = Math.max(\n 0,\n lowerBoundX(item.points, item.count, x0, AREA_STRIDE) - 1,\n );\n const end = Math.min(\n item.count,\n lowerBoundX(item.points, item.count, x1, AREA_STRIDE) + 1,\n );\n ({ points, length } = decimateArea(item.points, start, end, m.px));\n }\n const gradient = ctx.createLinearGradient(0, 0, 0, frame.height);\n gradient.addColorStop(0, rgba(item.color, item.opacity));\n gradient.addColorStop(1, rgba(item.color, item.opacity * 0.25));\n ctx.fillStyle = gradient;\n ctx.beginPath();\n // each run without gaps: along the tops, back along the bottoms\n let runStart = -1;\n const close = (end: number) => {\n if (runStart < 0) return;\n for (let k = end - 1; k >= runStart; k--) {\n ctx.lineTo(m.px(points[k * 3]), m.py(points[k * 3 + 2]));\n }\n ctx.closePath();\n runStart = -1;\n };\n for (let i = 0; i < length; i++) {\n const x = points[i * 3];\n const y = points[i * 3 + 1];\n if (isGap(x) || isGap(y) || isGap(points[i * 3 + 2])) {\n close(i);\n continue;\n }\n if (runStart < 0) {\n runStart = i;\n ctx.moveTo(m.px(x), m.py(y));\n } else {\n ctx.lineTo(m.px(x), m.py(y));\n }\n }\n close(length);\n ctx.fill();\n };\n\n const drawBars = (item: BarItem, frame: RenderFrame) => {\n const m = mapper(frame);\n const dpr = frame.dpr;\n const minHalf = item.minHalf * dpr;\n const rawHalf =\n Math.abs(item.halfWidth * frame.transform.xScale) * 0.5 * frame.width;\n const r = item.radius * dpr;\n const f = new Float32Array(item.instances, 0, item.count * 4);\n const u = new Uint32Array(item.instances, 0, item.count * 4);\n const [x0, x1] = m.xRange();\n const pad = Math.abs(item.halfWidth);\n // one path per color\n const groups = new Map<number, number[]>();\n for (let i = 0; i < item.count; i++) {\n const x = f[i * 4];\n if (isGap(x) || isGap(f[i * 4 + 1]) || isGap(f[i * 4 + 2])) continue;\n if (x < x0 - pad || x > x1 + pad) continue;\n const packed = u[i * 4 + 3];\n let list = groups.get(packed);\n if (!list) groups.set(packed, (list = []));\n list.push(i);\n }\n const rounded = typeof ctx.roundRect === \"function\";\n for (const [packed, list] of groups) {\n ctx.fillStyle = rgba(unpack(packed), 1);\n ctx.beginPath();\n for (const i of list) {\n const cx = m.px(f[i * 4]);\n const a = m.py(f[i * 4 + 1]);\n const b = m.py(f[i * 4 + 2]);\n const rawHh = Math.abs(a - b) / 2;\n // the gap between cells fades out on small cells (like the shaders)\n const fade = Math.min(\n 1,\n Math.max(0, (Math.min(rawHalf, rawHh) - 3 * dpr) / (2 * dpr)),\n );\n const inset =\n item.inset * dpr * fade - (item.inset > 0 ? 0.5 * (1 - fade) : 0);\n const half = Math.max(rawHalf - inset, 0.5, minHalf);\n const hh = Math.max(rawHh - inset, minHalf);\n if (hh <= 0) continue;\n const cy = (a + b) / 2;\n const radius = Math.min(r, half, hh);\n if (radius > 0.5 && rounded) {\n ctx.roundRect(cx - half, cy - hh, half * 2, hh * 2, radius);\n } else {\n ctx.rect(cx - half, cy - hh, half * 2, hh * 2);\n }\n }\n ctx.fill();\n }\n };\n\n /** One square per occupied cell (the last point of a cell wins, like the GPU) */\n const drawScatterCells = (item: ScatterItem, frame: RenderFrame) => {\n const m = mapper(frame);\n const w = frame.width;\n const h = frame.height;\n const f = new Float32Array(item.instances, 0, item.count * 4);\n const u = new Uint32Array(item.instances, 0, item.count * 4);\n let cell = 0;\n for (let i = 0; i < Math.min(item.count, 64); i++)\n cell = Math.max(cell, f[i * 4 + 2]);\n cell = Math.max(1, Math.round((cell || 2) * frame.dpr * 0.8));\n const cols = Math.ceil(w / cell);\n const rows = Math.ceil(h / cell);\n const owner = new Int32Array(cols * rows).fill(-1);\n for (let i = 0; i < item.count; i++) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n if (isGap(x) || isGap(y) || !(f[i * 4 + 2] > 0)) continue;\n const cx = Math.floor(m.px(x) / cell);\n const cy = Math.floor(m.py(y) / cell);\n if (cx < 0 || cy < 0 || cx >= cols || cy >= rows) continue;\n owner[cy * cols + cx] = i;\n }\n const groups = new Map<number, number[]>();\n for (let c = 0; c < owner.length; c++) {\n const i = owner[c];\n if (i < 0) continue;\n const packed = u[i * 4 + 3];\n let list = groups.get(packed);\n if (!list) groups.set(packed, (list = []));\n list.push(c);\n }\n for (const [packed, cells] of groups) {\n ctx.fillStyle = rgba(unpack(packed), Math.max(item.opacity, 0.6));\n for (const c of cells) {\n ctx.fillRect(\n (c % cols) * cell,\n Math.floor(c / cols) * cell,\n cell,\n cell,\n );\n }\n }\n };\n\n const drawScatterPixels = (item: ScatterItem, frame: RenderFrame) => {\n const m = mapper(frame);\n const w = frame.width;\n const h = frame.height;\n scratch ??= scratchCanvas?.() ?? null;\n if (!scratch) {\n drawScatterCells(item, frame);\n return;\n }\n scratch.width = w;\n scratch.height = h;\n const sctx = scratch.getContext(\"2d\");\n if (!sctx) return;\n const image = sctx.createImageData(w, h);\n const data = image.data;\n const f = new Float32Array(item.instances, 0, item.count * 4);\n const u = new Uint32Array(item.instances, 0, item.count * 4);\n for (let i = 0; i < item.count; i++) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n const size = f[i * 4 + 2];\n if (isGap(x) || isGap(y) || !(size > 0)) continue;\n const cx = m.px(x);\n const cy = m.py(y);\n const s = Math.max(1, Math.round(size * frame.dpr * 0.8));\n const x0 = Math.round(cx - s / 2);\n const y0 = Math.round(cy - s / 2);\n const packed = u[i * 4 + 3];\n const alpha =\n (((packed >>> 24) & 0xff) / 255) * Math.max(item.opacity, 0.6);\n const r = packed & 0xff;\n const g = (packed >>> 8) & 0xff;\n const b = (packed >>> 16) & 0xff;\n for (let py = Math.max(0, y0); py < Math.min(h, y0 + s); py++) {\n for (let px = Math.max(0, x0); px < Math.min(w, x0 + s); px++) {\n const o = (py * w + px) * 4;\n const da = data[o + 3] / 255;\n const outA = alpha + da * (1 - alpha);\n // straight-alpha \"over\"\n data[o] = (r * alpha + data[o] * da * (1 - alpha)) / outA;\n data[o + 1] = (g * alpha + data[o + 1] * da * (1 - alpha)) / outA;\n data[o + 2] = (b * alpha + data[o + 2] * da * (1 - alpha)) / outA;\n data[o + 3] = outA * 255;\n }\n }\n }\n sctx.putImageData(image, 0, 0);\n ctx.drawImage(scratch, 0, 0);\n };\n\n const drawScatter = (item: ScatterItem, frame: RenderFrame) => {\n if (item.count > SCATTER_PIXEL_THRESHOLD) {\n drawScatterPixels(item, frame);\n return;\n }\n const m = mapper(frame);\n const f = new Float32Array(item.instances, 0, item.count * 4);\n const u = new Uint32Array(item.instances, 0, item.count * 4);\n const groups = new Map<number, number[]>();\n for (let i = 0; i < item.count; i++) {\n const packed = u[i * 4 + 3];\n let list = groups.get(packed);\n if (!list) groups.set(packed, (list = []));\n list.push(i);\n }\n const stroke = item.stroke * frame.dpr;\n for (const [packed, list] of groups) {\n const color = unpack(packed);\n ctx.beginPath();\n for (const i of list) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n const size = f[i * 4 + 2];\n if (isGap(x) || isGap(y) || !(size > 0)) continue;\n const cx = m.px(x);\n const cy = m.py(y);\n const r = (size * frame.dpr) / 2;\n ctx.moveTo(cx + r, cy);\n ctx.arc(cx, cy, r, 0, Math.PI * 2);\n }\n ctx.fillStyle = rgba(color, item.opacity);\n ctx.fill();\n if (stroke > 0) {\n ctx.beginPath();\n for (const i of list) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n const size = f[i * 4 + 2];\n if (isGap(x) || isGap(y) || !(size > 0)) continue;\n const r = Math.max(0, (size * frame.dpr) / 2 - stroke / 2);\n const cx = m.px(x);\n const cy = m.py(y);\n ctx.moveTo(cx + r, cy);\n ctx.arc(cx, cy, r, 0, Math.PI * 2);\n }\n ctx.lineWidth = stroke;\n ctx.strokeStyle = rgba(color, 1);\n ctx.stroke();\n }\n }\n };\n\n return {\n paint(items, frame, left = 0, top = 0) {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, left, top);\n ctx.beginPath();\n ctx.rect(0, 0, frame.width, frame.height);\n ctx.clip();\n for (const item of items) {\n switch (item.kind) {\n case \"line\":\n if (item.count > 1) drawLine(item, frame);\n break;\n case \"area\":\n if (item.count > 1) drawArea(item, frame);\n break;\n case \"bar\":\n drawBars(item, frame);\n break;\n default:\n drawScatter(item, frame);\n break;\n }\n }\n ctx.restore();\n },\n destroy() {\n scratch = null;\n },\n };\n};\n\nexport const createCanvas2dRenderer = (\n canvas: HTMLCanvasElement,\n): ChartRenderer | null => {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n const painter = createCanvas2dPainter(ctx, () =>\n typeof document === \"undefined\" ? null : document.createElement(\"canvas\"),\n );\n return {\n kind: \"canvas2d\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n painter.paint(items, frame);\n },\n destroy() {\n painter.destroy();\n canvas.width = 0;\n canvas.height = 0;\n },\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"canvas2d.js","names":["unpack","SCATTER_PIXEL_THRESHOLD","rgba","c","alpha","isGap","v","lowerBoundX","lo","hi","count","mid","points","stride","value","decimateArea","out","end","start","length","push","i","col","first","min","max","last","flush","picks","a","b","prev","y","column","createCanvas2dPainter","scratch","mapper","frame","w","h","x","xScale","xOffset","yScale","yOffset","visiblePoints","item","m","x0","x1","result","decimateMinMax","GAP","drawLine","pen","ctx","drawArea","gradient","runStart","close","k","drawBars","dpr","minHalf","rawHalf","r","u","pad","groups","packed","list","rounded","unpackColor","cx","rawHh","fade","inset","half","hh","cy","radius","drawScatterCells","f","cell","cols","rows","owner","cells","drawScatterPixels","scratchCanvas","sctx","image","data","size","s","y0","g","py","px","o","da","outA","drawScatter","stroke","color","left","top","items","createCanvas2dRenderer","canvas","painter","width","height"],"sources":["../../../../../charts/src/engine/renderers/canvas2d.ts"],"sourcesContent":["// Canvas2D backend: the fallback without GPU. Lines are decimated to a few\n// points per pixel column and very large scatter sets are written pixel by\n// pixel, so it stays usable with large data sets.\n\nimport { decimateMinMax } from \"../decimate\";\nimport { unpackColor as unpack, type Rgba } from \"../color\";\nimport {\n AREA_STRIDE,\n GAP,\n type AreaItem,\n type BarItem,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type ScatterItem,\n} from \"./types\";\n\n/** Scatter sets above this size are rasterized through ImageData */\nexport const SCATTER_PIXEL_THRESHOLD = 20000;\n\nconst rgba = (c: Rgba, alpha: number) =>\n `rgba(${Math.round(c[0] * 255)},${Math.round(c[1] * 255)},${Math.round(c[2] * 255)},${c[3] * alpha})`;\n\nconst isGap = (v: number) => !Number.isFinite(v) || Math.abs(v) >= GAP * 0.5;\n\n/** First point index whose relative x is >= value (sorted, interleaved) */\nconst lowerBoundX = (\n points: Float32Array,\n count: number,\n value: number,\n stride = 2,\n) => {\n let lo = 0;\n let hi = count;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (points[mid * stride] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\n/**\n * Min-max decimation of area points (x, top, bottom): per pixel column the\n * first, lowest, highest and last tops are kept with their bottoms\n */\nconst decimateArea = (\n points: Float32Array,\n start: number,\n end: number,\n column: (x: number) => number,\n): { points: Float64Array; length: number } => {\n const out = new Float64Array(Math.max(0, end - start) * AREA_STRIDE);\n let length = 0;\n const push = (i: number) => {\n out[length * 3] = points[i * 3];\n out[length * 3 + 1] = points[i * 3 + 1];\n out[length * 3 + 2] = points[i * 3 + 2];\n length++;\n };\n let col = NaN;\n let first = -1;\n let min = -1;\n let max = -1;\n let last = -1;\n const flush = () => {\n if (first < 0) return;\n const picks = [first, min, max, last].sort((a, b) => a - b);\n let prev = -1;\n for (const i of picks) {\n if (i !== prev) push(i);\n prev = i;\n }\n first = -1;\n };\n for (let i = start; i < end; i++) {\n const y = points[i * 3 + 1];\n if (isGap(points[i * 3]) || isGap(y) || isGap(points[i * 3 + 2])) {\n flush();\n col = NaN;\n push(i);\n continue;\n }\n const c = Math.floor(column(points[i * 3]));\n if (c !== col || first < 0) {\n flush();\n col = c;\n first = min = max = last = i;\n } else {\n if (y < points[min * 3 + 1]) min = i;\n if (y > points[max * 3 + 1]) max = i;\n last = i;\n }\n }\n flush();\n return { points: out, length };\n};\n\nexport interface Canvas2dPainter {\n /**\n * Draws the items in a `frame.width` x `frame.height` device-pixel area\n * whose top-left corner is at (`left`, `top`) device pixels; nothing is\n * cleared\n */\n paint(\n items: readonly RenderItem[],\n frame: RenderFrame,\n left?: number,\n top?: number,\n ): void;\n destroy(): void;\n}\n\n/**\n * Data layer drawn with any 2D context (browser canvases, mini-program\n * canvases, OffscreenCanvas). `scratchCanvas` creates the canvas used to\n * rasterize very large scatter sets; without it they are drawn as one\n * square per occupied pixel cell.\n */\nexport const createCanvas2dPainter = (\n ctx: CanvasRenderingContext2D,\n scratchCanvas?: () => HTMLCanvasElement | null,\n): Canvas2dPainter => {\n let scratch: HTMLCanvasElement | null = null;\n\n const mapper = (frame: RenderFrame) => {\n const { xScale, xOffset, yScale, yOffset } = frame.transform;\n const w = frame.width;\n const h = frame.height;\n return {\n px: (x: number) => ((x * xScale + xOffset) * 0.5 + 0.5) * w,\n py: (y: number) => (1 - ((y * yScale + yOffset) * 0.5 + 0.5)) * h,\n /** Visible relative x range */\n xRange: (): [number, number] => {\n const a = (-1 - xOffset) / xScale;\n const b = (1 - xOffset) / xScale;\n return a < b ? [a, b] : [b, a];\n },\n };\n };\n\n /** Points actually drawn: decimated when there are many per pixel */\n const visiblePoints = (\n item: Extract<RenderItem, { kind: \"line\" }>,\n frame: RenderFrame,\n ): { points: ArrayLike<number>; length: number } => {\n if (!item.sorted || item.count <= frame.width * 2) {\n return { points: item.points, length: item.count };\n }\n const m = mapper(frame);\n const [x0, x1] = m.xRange();\n const start = Math.max(0, lowerBoundX(item.points, item.count, x0) - 1);\n const end = Math.min(\n item.count,\n lowerBoundX(item.points, item.count, x1) + 1,\n );\n const result = decimateMinMax(item.points, start, end, m.px, GAP * 0.5);\n return { points: result.points, length: result.length };\n };\n\n const drawLine = (\n item: Extract<RenderItem, { kind: \"line\" }>,\n frame: RenderFrame,\n ) => {\n const m = mapper(frame);\n const { points, length } = visiblePoints(item, frame);\n ctx.beginPath();\n let pen = false;\n for (let i = 0; i < length; i++) {\n const x = points[i * 2];\n const y = points[i * 2 + 1];\n if (isGap(x) || isGap(y)) {\n pen = false;\n continue;\n }\n if (pen) ctx.lineTo(m.px(x), m.py(y));\n else ctx.moveTo(m.px(x), m.py(y));\n pen = true;\n }\n ctx.lineWidth = item.width * frame.dpr;\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n ctx.strokeStyle = rgba(item.color, 1);\n ctx.stroke();\n };\n\n const drawArea = (item: AreaItem, frame: RenderFrame) => {\n const m = mapper(frame);\n let points: ArrayLike<number> = item.points;\n let length = item.count;\n if (item.sorted && item.count > frame.width * 2) {\n const [x0, x1] = m.xRange();\n const start = Math.max(\n 0,\n lowerBoundX(item.points, item.count, x0, AREA_STRIDE) - 1,\n );\n const end = Math.min(\n item.count,\n lowerBoundX(item.points, item.count, x1, AREA_STRIDE) + 1,\n );\n ({ points, length } = decimateArea(item.points, start, end, m.px));\n }\n if (item.flat) ctx.fillStyle = rgba(item.color, item.opacity);\n else {\n const gradient = ctx.createLinearGradient(0, 0, 0, frame.height);\n gradient.addColorStop(0, rgba(item.color, item.opacity));\n gradient.addColorStop(1, rgba(item.color, item.opacity * 0.25));\n ctx.fillStyle = gradient;\n }\n ctx.beginPath();\n // each run without gaps: along the tops, back along the bottoms\n let runStart = -1;\n const close = (end: number) => {\n if (runStart < 0) return;\n for (let k = end - 1; k >= runStart; k--) {\n ctx.lineTo(m.px(points[k * 3]), m.py(points[k * 3 + 2]));\n }\n ctx.closePath();\n runStart = -1;\n };\n for (let i = 0; i < length; i++) {\n const x = points[i * 3];\n const y = points[i * 3 + 1];\n if (isGap(x) || isGap(y) || isGap(points[i * 3 + 2])) {\n close(i);\n continue;\n }\n if (runStart < 0) {\n runStart = i;\n ctx.moveTo(m.px(x), m.py(y));\n } else {\n ctx.lineTo(m.px(x), m.py(y));\n }\n }\n close(length);\n ctx.fill();\n };\n\n const drawBars = (item: BarItem, frame: RenderFrame) => {\n const m = mapper(frame);\n const dpr = frame.dpr;\n const minHalf = item.minHalf * dpr;\n const rawHalf =\n Math.abs(item.halfWidth * frame.transform.xScale) * 0.5 * frame.width;\n const r = item.radius * dpr;\n const f = new Float32Array(item.instances, 0, item.count * 4);\n const u = new Uint32Array(item.instances, 0, item.count * 4);\n const [x0, x1] = m.xRange();\n const pad = Math.abs(item.halfWidth);\n // one path per color\n const groups = new Map<number, number[]>();\n for (let i = 0; i < item.count; i++) {\n const x = f[i * 4];\n if (isGap(x) || isGap(f[i * 4 + 1]) || isGap(f[i * 4 + 2])) continue;\n if (x < x0 - pad || x > x1 + pad) continue;\n const packed = u[i * 4 + 3];\n let list = groups.get(packed);\n if (!list) groups.set(packed, (list = []));\n list.push(i);\n }\n const rounded = typeof ctx.roundRect === \"function\";\n for (const [packed, list] of groups) {\n ctx.fillStyle = rgba(unpack(packed), 1);\n ctx.beginPath();\n for (const i of list) {\n const cx = m.px(f[i * 4]);\n const a = m.py(f[i * 4 + 1]);\n const b = m.py(f[i * 4 + 2]);\n const rawHh = Math.abs(a - b) / 2;\n // the gap between cells fades out on small cells (like the shaders)\n const fade = Math.min(\n 1,\n Math.max(0, (Math.min(rawHalf, rawHh) - 3 * dpr) / (2 * dpr)),\n );\n const inset =\n item.inset * dpr * fade - (item.inset > 0 ? 0.5 * (1 - fade) : 0);\n const half = Math.max(rawHalf - inset, 0.5, minHalf);\n const hh = Math.max(rawHh - inset, minHalf);\n if (hh <= 0) continue;\n const cy = (a + b) / 2;\n const radius = Math.min(r, half, hh);\n if (radius > 0.5 && rounded) {\n ctx.roundRect(cx - half, cy - hh, half * 2, hh * 2, radius);\n } else {\n ctx.rect(cx - half, cy - hh, half * 2, hh * 2);\n }\n }\n ctx.fill();\n }\n };\n\n /** One square per occupied cell (the last point of a cell wins, like the GPU) */\n const drawScatterCells = (item: ScatterItem, frame: RenderFrame) => {\n const m = mapper(frame);\n const w = frame.width;\n const h = frame.height;\n const f = new Float32Array(item.instances, 0, item.count * 4);\n const u = new Uint32Array(item.instances, 0, item.count * 4);\n let cell = 0;\n for (let i = 0; i < Math.min(item.count, 64); i++)\n cell = Math.max(cell, f[i * 4 + 2]);\n cell = Math.max(1, Math.round((cell || 2) * frame.dpr * 0.8));\n const cols = Math.ceil(w / cell);\n const rows = Math.ceil(h / cell);\n const owner = new Int32Array(cols * rows).fill(-1);\n for (let i = 0; i < item.count; i++) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n if (isGap(x) || isGap(y) || !(f[i * 4 + 2] > 0)) continue;\n const cx = Math.floor(m.px(x) / cell);\n const cy = Math.floor(m.py(y) / cell);\n if (cx < 0 || cy < 0 || cx >= cols || cy >= rows) continue;\n owner[cy * cols + cx] = i;\n }\n const groups = new Map<number, number[]>();\n for (let c = 0; c < owner.length; c++) {\n const i = owner[c];\n if (i < 0) continue;\n const packed = u[i * 4 + 3];\n let list = groups.get(packed);\n if (!list) groups.set(packed, (list = []));\n list.push(c);\n }\n for (const [packed, cells] of groups) {\n ctx.fillStyle = rgba(unpack(packed), Math.max(item.opacity, 0.6));\n for (const c of cells) {\n ctx.fillRect(\n (c % cols) * cell,\n Math.floor(c / cols) * cell,\n cell,\n cell,\n );\n }\n }\n };\n\n const drawScatterPixels = (item: ScatterItem, frame: RenderFrame) => {\n const m = mapper(frame);\n const w = frame.width;\n const h = frame.height;\n scratch ??= scratchCanvas?.() ?? null;\n if (!scratch) {\n drawScatterCells(item, frame);\n return;\n }\n scratch.width = w;\n scratch.height = h;\n const sctx = scratch.getContext(\"2d\");\n if (!sctx) return;\n const image = sctx.createImageData(w, h);\n const data = image.data;\n const f = new Float32Array(item.instances, 0, item.count * 4);\n const u = new Uint32Array(item.instances, 0, item.count * 4);\n for (let i = 0; i < item.count; i++) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n const size = f[i * 4 + 2];\n if (isGap(x) || isGap(y) || !(size > 0)) continue;\n const cx = m.px(x);\n const cy = m.py(y);\n const s = Math.max(1, Math.round(size * frame.dpr * 0.8));\n const x0 = Math.round(cx - s / 2);\n const y0 = Math.round(cy - s / 2);\n const packed = u[i * 4 + 3];\n const alpha =\n (((packed >>> 24) & 0xff) / 255) * Math.max(item.opacity, 0.6);\n const r = packed & 0xff;\n const g = (packed >>> 8) & 0xff;\n const b = (packed >>> 16) & 0xff;\n for (let py = Math.max(0, y0); py < Math.min(h, y0 + s); py++) {\n for (let px = Math.max(0, x0); px < Math.min(w, x0 + s); px++) {\n const o = (py * w + px) * 4;\n const da = data[o + 3] / 255;\n const outA = alpha + da * (1 - alpha);\n // straight-alpha \"over\"\n data[o] = (r * alpha + data[o] * da * (1 - alpha)) / outA;\n data[o + 1] = (g * alpha + data[o + 1] * da * (1 - alpha)) / outA;\n data[o + 2] = (b * alpha + data[o + 2] * da * (1 - alpha)) / outA;\n data[o + 3] = outA * 255;\n }\n }\n }\n sctx.putImageData(image, 0, 0);\n ctx.drawImage(scratch, 0, 0);\n };\n\n const drawScatter = (item: ScatterItem, frame: RenderFrame) => {\n if (item.count > SCATTER_PIXEL_THRESHOLD) {\n drawScatterPixels(item, frame);\n return;\n }\n const m = mapper(frame);\n const f = new Float32Array(item.instances, 0, item.count * 4);\n const u = new Uint32Array(item.instances, 0, item.count * 4);\n const groups = new Map<number, number[]>();\n for (let i = 0; i < item.count; i++) {\n const packed = u[i * 4 + 3];\n let list = groups.get(packed);\n if (!list) groups.set(packed, (list = []));\n list.push(i);\n }\n const stroke = item.stroke * frame.dpr;\n for (const [packed, list] of groups) {\n const color = unpack(packed);\n ctx.beginPath();\n for (const i of list) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n const size = f[i * 4 + 2];\n if (isGap(x) || isGap(y) || !(size > 0)) continue;\n const cx = m.px(x);\n const cy = m.py(y);\n const r = (size * frame.dpr) / 2;\n ctx.moveTo(cx + r, cy);\n ctx.arc(cx, cy, r, 0, Math.PI * 2);\n }\n ctx.fillStyle = rgba(color, item.opacity);\n ctx.fill();\n if (stroke > 0) {\n ctx.beginPath();\n for (const i of list) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n const size = f[i * 4 + 2];\n if (isGap(x) || isGap(y) || !(size > 0)) continue;\n const r = Math.max(0, (size * frame.dpr) / 2 - stroke / 2);\n const cx = m.px(x);\n const cy = m.py(y);\n ctx.moveTo(cx + r, cy);\n ctx.arc(cx, cy, r, 0, Math.PI * 2);\n }\n ctx.lineWidth = stroke;\n ctx.strokeStyle = rgba(color, 1);\n ctx.stroke();\n }\n }\n };\n\n return {\n paint(items, frame, left = 0, top = 0) {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, left, top);\n ctx.beginPath();\n ctx.rect(0, 0, frame.width, frame.height);\n ctx.clip();\n for (const item of items) {\n switch (item.kind) {\n case \"line\":\n if (item.count > 1) drawLine(item, frame);\n break;\n case \"area\":\n if (item.count > 1) drawArea(item, frame);\n break;\n case \"bar\":\n drawBars(item, frame);\n break;\n default:\n drawScatter(item, frame);\n break;\n }\n }\n ctx.restore();\n },\n destroy() {\n scratch = null;\n },\n };\n};\n\nexport const createCanvas2dRenderer = (\n canvas: HTMLCanvasElement,\n): ChartRenderer | null => {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n const painter = createCanvas2dPainter(ctx, () =>\n typeof document === \"undefined\" ? null : document.createElement(\"canvas\"),\n );\n return {\n kind: \"canvas2d\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n painter.paint(items, frame);\n },\n destroy() {\n painter.destroy();\n canvas.width = 0;\n canvas.height = 0;\n },\n };\n};\n"],"mappings":";;;;AAkBA,IAAaC,IAA0B,KAEjCC,KAAQ,GAAS,MACrB,QAAQ,KAAK,MAAMC,EAAE,KAAK,GAAG,EAAE,GAAG,KAAK,MAAMA,EAAE,KAAK,GAAG,EAAE,GAAG,KAAK,MAAMA,EAAE,KAAK,GAAG,EAAE,GAAGA,EAAE,KAAKC,EAAM,IAE/FC,KAAS,MAAc,CAAC,OAAO,SAASC,CAAC,KAAK,KAAK,IAAIA,CAAC,KAAA,OAGxDC,KACJ,GACA,GACA,GACA,IAAS,MACN;CACH,IAAIC,IAAK,GACLC,IAAKC;CACT,OAAOF,IAAKC,IAAI;EACd,IAAME,IAAOH,IAAKC,MAAQ;EAC1B,AAAIG,EAAOD,IAAME,KAAUC,IAAO,IAAKH,IAAM,IACxC,IAAKA;CACZ;CACA,OAAOH;AACT,GAMMO,KACJ,GACA,GACA,GACA,MAC6C;CAC7C,IAAMC,IAAM,IAAI,aAAa,KAAK,IAAI,GAAGC,IAAMC,CAAK,IAAA,CAAe,GAC/DC,IAAS,GACPC,KAAQ,MAAc;EAI1B,AAHA,EAAID,IAAS,KAAKP,EAAOS,IAAI,IAC7B,EAAIF,IAAS,IAAI,KAAKP,EAAOS,IAAI,IAAI,IACrC,EAAIF,IAAS,IAAI,KAAKP,EAAOS,IAAI,IAAI,IACrC;CACF,GACIC,IAAM,KACNC,IAAQ,IACRC,IAAM,IACNC,IAAM,IACNC,IAAO,IACLC,UAAc;EAClB,IAAIJ,IAAQ,GAAG;EACf,IAAMK,IAAQ;GAACL;GAAOC;GAAKC;GAAKC;EAAI,CAAC,CAAC,MAAM,GAAG,MAAMG,IAAIC,CAAC,GACtDC,IAAO;EACX,KAAK,IAAMV,KAAKO,GAEd,AADIP,MAAMU,KAAMX,EAAKC,CAAC,GACtB,IAAOA;EAET,IAAQ;CACV;CACA,KAAK,IAAI,IAAIH,GAAO,IAAID,GAAK,KAAK;EAChC,IAAMe,IAAIpB,EAAO,IAAI,IAAI;EACzB,IAAIP,EAAMO,EAAO,IAAI,EAAE,KAAKP,EAAM2B,CAAC,KAAK3B,EAAMO,EAAO,IAAI,IAAI,EAAE,GAAG;GAGhE,AAFAe,EAAM,GACN,IAAM,KACNP,EAAK,CAAC;GACN;EACF;EACA,IAAMjB,IAAI,KAAK,MAAM8B,EAAOrB,EAAO,IAAI,EAAE,CAAC;EAC1C,AAAIT,MAAMmB,KAAOC,IAAQ,KACvBI,EAAM,GACN,IAAMxB,GACN,IAAQ,IAAM,IAAM,IAAO,MAEvB6B,IAAIpB,EAAOY,IAAM,IAAI,OAAI,IAAM,IAC/BQ,IAAIpB,EAAOa,IAAM,IAAI,OAAI,IAAM,IACnC,IAAO;CAEX;CAEA,OADAE,EAAM,GACC;EAAE,QAAQX;EAAK;CAAO;AAC/B,GAuBakB,KACX,GACA,MACoB;CACpB,IAAIC,IAAoC,MAElCC,KAAU,MAAuB;EACrC,IAAM,EAAE,WAAQ,YAAS,WAAQ,eAAYC,EAAM,WAC7CC,IAAID,EAAM,OACVE,IAAIF,EAAM;EAChB,OAAO;GACL,KAAK,QAAgBG,IAAIC,IAASC,KAAW,KAAM,MAAOJ;GAC1D,KAAK,OAAe,MAAMN,IAAIW,IAASC,KAAW,KAAM,OAAQL;GAEhE,cAAgC;IAC9B,IAAMV,KAAK,KAAKa,KAAWD,GACrBX,KAAK,IAAIY,KAAWD;IAC1B,OAAOZ,IAAIC,IAAI,CAACD,GAAGC,CAAC,IAAI,CAACA,GAAGD,CAAC;GAC/B;EACF;CACF,GAGMgB,KACJ,GACA,MACkD;EAClD,IAAI,CAACC,EAAK,UAAUA,EAAK,SAAST,EAAM,QAAQ,GAC9C,OAAO;GAAE,QAAQS,EAAK;GAAQ,QAAQA,EAAK;EAAM;EAEnD,IAAMC,IAAIX,EAAOC,CAAK,GAChB,CAACW,GAAIC,KAAMF,EAAE,OAAO,GACpB7B,IAAQ,KAAK,IAAI,GAAGX,EAAYuC,EAAK,QAAQA,EAAK,OAAOE,CAAE,IAAI,CAAC,GAChE/B,IAAM,KAAK,IACf6B,EAAK,OACLvC,EAAYuC,EAAK,QAAQA,EAAK,OAAOG,CAAE,IAAI,CAC7C,GACMC,IAASC,EAAeL,EAAK,QAAQ5B,GAAOD,GAAK8B,EAAE,IAAIK,IAAM,EAAG;EACtE,OAAO;GAAE,QAAQF,EAAO;GAAQ,QAAQA,EAAO;EAAO;CACxD,GAEMG,KACJ,GACA,MACG;EACH,IAAMN,IAAIX,EAAOC,CAAK,GAChB,EAAE,WAAQ,cAAWQ,EAAcC,GAAMT,CAAK;EACpD,EAAI,UAAU;EACd,IAAIiB,IAAM;EACV,KAAK,IAAIjC,IAAI,GAAGA,IAAIF,GAAQ,KAAK;GAC/B,IAAMqB,IAAI5B,EAAOS,IAAI,IACfW,IAAIpB,EAAOS,IAAI,IAAI;GACzB,IAAIhB,EAAMmC,CAAC,KAAKnC,EAAM2B,CAAC,GAAG;IACxB,IAAM;IACN;GACF;GAGA,AAFIsB,IAAKC,EAAI,OAAOR,EAAE,GAAGP,CAAC,GAAGO,EAAE,GAAGf,CAAC,CAAC,IAC/BuB,EAAI,OAAOR,EAAE,GAAGP,CAAC,GAAGO,EAAE,GAAGf,CAAC,CAAC,GAChC,IAAM;EACR;EAKA,AAJA,EAAI,YAAYc,EAAK,QAAQT,EAAM,KACnC,EAAI,WAAW,SACf,EAAI,UAAU,SACd,EAAI,cAAcnC,EAAK4C,EAAK,OAAO,CAAC,GACpCS,EAAI,OAAO;CACb,GAEMC,KAAY,GAAgB,MAAuB;EACvD,IAAMT,IAAIX,EAAOC,CAAK,GAClBzB,IAA4BkC,EAAK,QACjC3B,IAAS2B,EAAK;EAClB,IAAIA,EAAK,UAAUA,EAAK,QAAQT,EAAM,QAAQ,GAAG;GAC/C,IAAM,CAACW,GAAIC,KAAMF,EAAE,OAAO,GACpB7B,IAAQ,KAAK,IACjB,GACAX,EAAYuC,EAAK,QAAQA,EAAK,OAAOE,GAAA,CAAe,IAAI,CAC1D,GACM/B,IAAM,KAAK,IACf6B,EAAK,OACLvC,EAAYuC,EAAK,QAAQA,EAAK,OAAOG,GAAA,CAAe,IAAI,CAC1D;GACA,CAAC,yBAAqBlC,EAAa+B,EAAK,QAAQ5B,GAAOD,GAAK8B,EAAE,EAAE;EAClE;EACA,IAAID,EAAK,MAAM,EAAI,YAAY5C,EAAK4C,EAAK,OAAOA,EAAK,OAAO;OACvD;GACH,IAAMW,IAAWF,EAAI,qBAAqB,GAAG,GAAG,GAAGlB,EAAM,MAAM;GAG/D,AAFAoB,EAAS,aAAa,GAAGvD,EAAK4C,EAAK,OAAOA,EAAK,OAAO,CAAC,GACvDW,EAAS,aAAa,GAAGvD,EAAK4C,EAAK,OAAOA,EAAK,UAAU,GAAI,CAAC,GAC9D,EAAI,YAAYW;EAClB;EACA,EAAI,UAAU;EAEd,IAAIC,IAAW,IACTC,KAAS,MAAgB;GAC7B,IAAI,MAAW,IACf;SAAK,IAAIC,IAAI3C,IAAM,GAAG2C,KAAKF,GAAU,KACnC,EAAI,OAAOX,EAAE,GAAGnC,EAAOgD,IAAI,EAAE,GAAGb,EAAE,GAAGnC,EAAOgD,IAAI,IAAI,EAAE,CAAC;IAGzD,AADAL,EAAI,UAAU,GACd,IAAW;GAH8C;EAI3D;EACA,KAAK,IAAIlC,IAAI,GAAGA,IAAIF,GAAQ,KAAK;GAC/B,IAAMqB,IAAI5B,EAAOS,IAAI,IACfW,IAAIpB,EAAOS,IAAI,IAAI;GACzB,IAAIhB,EAAMmC,CAAC,KAAKnC,EAAM2B,CAAC,KAAK3B,EAAMO,EAAOS,IAAI,IAAI,EAAE,GAAG;IACpD,EAAMA,CAAC;IACP;GACF;GACA,AAAIqC,IAAW,KACb,IAAWrC,GACXkC,EAAI,OAAOR,EAAE,GAAGP,CAAC,GAAGO,EAAE,GAAGf,CAAC,CAAC,KAE3BuB,EAAI,OAAOR,EAAE,GAAGP,CAAC,GAAGO,EAAE,GAAGf,CAAC,CAAC;EAE/B;EAEA,AADA2B,EAAMxC,CAAM,GACZoC,EAAI,KAAK;CACX,GAEMM,KAAY,GAAe,MAAuB;EACtD,IAAMd,IAAIX,EAAOC,CAAK,GAChByB,IAAMzB,EAAM,KACZ0B,IAAUjB,EAAK,UAAUgB,GACzBE,IACJ,KAAK,IAAIlB,EAAK,YAAYT,EAAM,UAAU,MAAM,IAAI,KAAMA,EAAM,OAC5D4B,IAAInB,EAAK,SAASgB,GAClB,IAAI,IAAI,aAAahB,EAAK,WAAW,GAAGA,EAAK,QAAQ,CAAC,GACtDoB,IAAI,IAAI,YAAYpB,EAAK,WAAW,GAAGA,EAAK,QAAQ,CAAC,GACrD,CAACE,GAAIC,KAAMF,EAAE,OAAO,GACpBoB,IAAM,KAAK,IAAIrB,EAAK,SAAS,GAE7BsB,oBAAS,IAAI,IAAsB;EACzC,KAAK,IAAI/C,IAAI,GAAGA,IAAIyB,EAAK,OAAO,KAAK;GACnC,IAAMN,IAAI,EAAEnB,IAAI;GAEhB,IADIhB,EAAMmC,CAAC,KAAKnC,EAAM,EAAEgB,IAAI,IAAI,EAAE,KAAKhB,EAAM,EAAEgB,IAAI,IAAI,EAAE,KACrDmB,IAAIQ,IAAKmB,KAAO3B,IAAIS,IAAKkB,GAAK;GAClC,IAAME,IAASH,EAAE7C,IAAI,IAAI,IACrBiD,IAAOF,EAAO,IAAIC,CAAM;GAE5B,AADKC,KAAMF,EAAO,IAAIC,GAAS,IAAO,CAAC,CAAE,GACzCC,EAAK,KAAKjD,CAAC;EACb;EACA,IAAMkD,IAAU,OAAOhB,EAAI,aAAc;EACzC,KAAK,IAAM,CAACc,GAAQC,MAASF,GAAQ;GAEnC,AADA,EAAI,YAAYlE,EAAKF,EAAOqE,CAAM,GAAG,CAAC,GACtCd,EAAI,UAAU;GACd,KAAK,IAAMlC,KAAKiD,GAAM;IACpB,IAAMG,IAAK1B,EAAE,GAAG,EAAE1B,IAAI,EAAE,GAClBQ,IAAIkB,EAAE,GAAG,EAAE1B,IAAI,IAAI,EAAE,GACrBS,IAAIiB,EAAE,GAAG,EAAE1B,IAAI,IAAI,EAAE,GACrBqD,IAAQ,KAAK,IAAI7C,IAAIC,CAAC,IAAI,GAE1B6C,IAAO,KAAK,IAChB,GACA,KAAK,IAAI,IAAI,KAAK,IAAIX,GAASU,CAAK,IAAI,IAAIZ,MAAQ,IAAIA,EAAI,CAC9D,GACMc,IACJ9B,EAAK,QAAQgB,IAAMa,KAAQ7B,EAAK,QAAQ,IAAI,MAAO,IAAI6B,KAAQ,IAC3DE,IAAO,KAAK,IAAIb,IAAUY,GAAO,IAAKb,CAAO,GAC7Ce,IAAK,KAAK,IAAIJ,IAAQE,GAAOb,CAAO;IAC1C,IAAIe,KAAM,GAAG;IACb,IAAMC,KAAMlD,IAAIC,KAAK,GACfkD,IAAS,KAAK,IAAIf,GAAGY,GAAMC,CAAE;IACnC,AAAIE,IAAS,MAAOT,IAClBhB,EAAI,UAAUkB,IAAKI,GAAME,IAAKD,GAAID,IAAO,GAAGC,IAAK,GAAGE,CAAM,IAE1DzB,EAAI,KAAKkB,IAAKI,GAAME,IAAKD,GAAID,IAAO,GAAGC,IAAK,CAAC;GAEjD;GACA,EAAI,KAAK;EACX;CACF,GAGMG,KAAoB,GAAmB,MAAuB;EAClE,IAAMlC,IAAIX,EAAOC,CAAK,GAChBC,IAAID,EAAM,OACVE,IAAIF,EAAM,QACV6C,IAAI,IAAI,aAAapC,EAAK,WAAW,GAAGA,EAAK,QAAQ,CAAC,GACtDoB,IAAI,IAAI,YAAYpB,EAAK,WAAW,GAAGA,EAAK,QAAQ,CAAC,GACvDqC,IAAO;EACX,KAAK,IAAI9D,IAAI,GAAGA,IAAI,KAAK,IAAIyB,EAAK,OAAO,EAAE,GAAG,KAC5C,IAAO,KAAK,IAAIqC,GAAMD,EAAE7D,IAAI,IAAI,EAAE;EACpC,IAAO,KAAK,IAAI,GAAG,KAAK,OAAO8D,KAAQ,KAAK9C,EAAM,MAAM,EAAG,CAAC;EAC5D,IAAM+C,IAAO,KAAK,KAAK9C,IAAI6C,CAAI,GACzBE,IAAO,KAAK,KAAK9C,IAAI4C,CAAI,GACzBG,IAAQ,IAAI,WAAWF,IAAOC,CAAI,CAAC,CAAC,KAAK,EAAE;EACjD,KAAK,IAAIhE,IAAI,GAAGA,IAAIyB,EAAK,OAAO,KAAK;GACnC,IAAMN,IAAI0C,EAAE7D,IAAI,IACVW,IAAIkD,EAAE7D,IAAI,IAAI;GACpB,IAAIhB,EAAMmC,CAAC,KAAKnC,EAAM2B,CAAC,KAAK,EAAEkD,EAAE7D,IAAI,IAAI,KAAK,IAAI;GACjD,IAAMoD,IAAK,KAAK,MAAM1B,EAAE,GAAGP,CAAC,IAAI2C,CAAI,GAC9BJ,IAAK,KAAK,MAAMhC,EAAE,GAAGf,CAAC,IAAImD,CAAI;GACpC,AAAIV,IAAK,KAAKM,IAAK,KAAKN,KAAMW,KAAQL,KAAMM,MAC5C,EAAMN,IAAKK,IAAOX,KAAMpD;EAC1B;EACA,IAAM+C,oBAAS,IAAI,IAAsB;EACzC,KAAK,IAAIjE,IAAI,GAAGA,IAAImF,EAAM,QAAQ,KAAK;GACrC,IAAMjE,IAAIiE,EAAMnF;GAChB,IAAIkB,IAAI,GAAG;GACX,IAAMgD,IAASH,EAAE7C,IAAI,IAAI,IACrBiD,IAAOF,EAAO,IAAIC,CAAM;GAE5B,AADKC,KAAMF,EAAO,IAAIC,GAAS,IAAO,CAAC,CAAE,GACzCC,EAAK,KAAKnE,CAAC;EACb;EACA,KAAK,IAAM,CAACkE,GAAQkB,MAAUnB,GAAQ;GACpC,EAAI,YAAYlE,EAAKF,EAAOqE,CAAM,GAAG,KAAK,IAAIvB,EAAK,SAAS,EAAG,CAAC;GAChE,KAAK,IAAM3C,KAAKoF,GACd,EAAI,SACDpF,IAAIiF,IAAQD,GACb,KAAK,MAAMhF,IAAIiF,CAAI,IAAID,GACvBA,GACAA,CACF;EAEJ;CACF,GAEMK,KAAqB,GAAmB,MAAuB;EACnE,IAAMzC,IAAIX,EAAOC,CAAK,GAChBC,IAAID,EAAM,OACVE,IAAIF,EAAM;EAEhB,IADAF,MAAA,IAAYsD,IAAgB,KAAK,OAC7B,CAACtD,GAAS;GACZ,EAAiBW,GAAMT,CAAK;GAC5B;EACF;EAEA,AADA,EAAQ,QAAQC,GAChB,EAAQ,SAASC;EACjB,IAAMmD,IAAOvD,EAAQ,WAAW,IAAI;EACpC,IAAI,CAACuD,GAAM;EACX,IAAMC,IAAQD,EAAK,gBAAgBpD,GAAGC,CAAC,GACjCqD,IAAOD,EAAM,MACbT,IAAI,IAAI,aAAapC,EAAK,WAAW,GAAGA,EAAK,QAAQ,CAAC,GACtDoB,IAAI,IAAI,YAAYpB,EAAK,WAAW,GAAGA,EAAK,QAAQ,CAAC;EAC3D,KAAK,IAAIzB,IAAI,GAAGA,IAAIyB,EAAK,OAAO,KAAK;GACnC,IAAMN,IAAI0C,EAAE7D,IAAI,IACVW,IAAIkD,EAAE7D,IAAI,IAAI,IACdwE,IAAOX,EAAE7D,IAAI,IAAI;GACvB,IAAIhB,EAAMmC,CAAC,KAAKnC,EAAM2B,CAAC,KAAK,EAAE6D,IAAO,IAAI;GACzC,IAAMpB,IAAK1B,EAAE,GAAGP,CAAC,GACXuC,IAAKhC,EAAE,GAAGf,CAAC,GACX8D,IAAI,KAAK,IAAI,GAAG,KAAK,MAAMD,IAAOxD,EAAM,MAAM,EAAG,CAAC,GAClDW,IAAK,KAAK,MAAMyB,IAAKqB,IAAI,CAAC,GAC1BC,IAAK,KAAK,MAAMhB,IAAKe,IAAI,CAAC,GAC1BzB,IAASH,EAAE7C,IAAI,IAAI,IACnBjB,KACDiE,MAAW,KAAM,OAAQ,MAAO,KAAK,IAAIvB,EAAK,SAAS,EAAG,GACzDmB,IAAII,IAAS,KACb2B,IAAK3B,MAAW,IAAK,KACrBvC,IAAKuC,MAAW,KAAM;GAC5B,KAAK,IAAI4B,IAAK,KAAK,IAAI,GAAGF,CAAE,GAAGE,IAAK,KAAK,IAAI1D,GAAGwD,IAAKD,CAAC,GAAG,KACvD,KAAK,IAAII,IAAK,KAAK,IAAI,GAAGlD,CAAE,GAAGkD,IAAK,KAAK,IAAI5D,GAAGU,IAAK8C,CAAC,GAAG,KAAM;IAC7D,IAAMK,KAAKF,IAAK3D,IAAI4D,KAAM,GACpBE,IAAKR,EAAKO,IAAI,KAAK,KACnBE,IAAOjG,IAAQgG,KAAM,IAAIhG;IAK/B,AAHA,EAAK+F,MAAMlC,IAAI7D,IAAQwF,EAAKO,KAAKC,KAAM,IAAIhG,MAAUiG,GACrD,EAAKF,IAAI,MAAMH,IAAI5F,IAAQwF,EAAKO,IAAI,KAAKC,KAAM,IAAIhG,MAAUiG,GAC7D,EAAKF,IAAI,MAAMrE,IAAI1B,IAAQwF,EAAKO,IAAI,KAAKC,KAAM,IAAIhG,MAAUiG,GAC7D,EAAKF,IAAI,KAAKE,IAAO;GACvB;EAEJ;EAEA,AADAX,EAAK,aAAaC,GAAO,GAAG,CAAC,GAC7BpC,EAAI,UAAUpB,GAAS,GAAG,CAAC;CAC7B,GAEMmE,KAAe,GAAmB,MAAuB;EAC7D,IAAIxD,EAAK,QAAA,KAAiC;GACxC,EAAkBA,GAAMT,CAAK;GAC7B;EACF;EACA,IAAMU,IAAIX,EAAOC,CAAK,GAChB6C,IAAI,IAAI,aAAapC,EAAK,WAAW,GAAGA,EAAK,QAAQ,CAAC,GACtDoB,IAAI,IAAI,YAAYpB,EAAK,WAAW,GAAGA,EAAK,QAAQ,CAAC,GACrDsB,oBAAS,IAAI,IAAsB;EACzC,KAAK,IAAI/C,IAAI,GAAGA,IAAIyB,EAAK,OAAO,KAAK;GACnC,IAAMuB,IAASH,EAAE7C,IAAI,IAAI,IACrBiD,IAAOF,EAAO,IAAIC,CAAM;GAE5B,AADKC,KAAMF,EAAO,IAAIC,GAAS,IAAO,CAAC,CAAE,GACzCC,EAAK,KAAKjD,CAAC;EACb;EACA,IAAMkF,IAASzD,EAAK,SAAST,EAAM;EACnC,KAAK,IAAM,CAACgC,GAAQC,MAASF,GAAQ;GACnC,IAAMoC,IAAQxG,EAAOqE,CAAM;GAC3B,EAAI,UAAU;GACd,KAAK,IAAMhD,KAAKiD,GAAM;IACpB,IAAM9B,IAAI0C,EAAE7D,IAAI,IACVW,IAAIkD,EAAE7D,IAAI,IAAI,IACdwE,IAAOX,EAAE7D,IAAI,IAAI;IACvB,IAAIhB,EAAMmC,CAAC,KAAKnC,EAAM2B,CAAC,KAAK,EAAE6D,IAAO,IAAI;IACzC,IAAMpB,IAAK1B,EAAE,GAAGP,CAAC,GACXuC,IAAKhC,EAAE,GAAGf,CAAC,GACXiC,IAAK4B,IAAOxD,EAAM,MAAO;IAE/B,AADAkB,EAAI,OAAOkB,IAAKR,GAAGc,CAAE,GACrBxB,EAAI,IAAIkB,GAAIM,GAAId,GAAG,GAAG,KAAK,KAAK,CAAC;GACnC;GAGA,IAFA,EAAI,YAAY/D,EAAKsG,GAAO1D,EAAK,OAAO,GACxCS,EAAI,KAAK,GACLgD,IAAS,GAAG;IACd,EAAI,UAAU;IACd,KAAK,IAAMlF,KAAKiD,GAAM;KACpB,IAAM9B,IAAI0C,EAAE7D,IAAI,IACVW,IAAIkD,EAAE7D,IAAI,IAAI,IACdwE,IAAOX,EAAE7D,IAAI,IAAI;KACvB,IAAIhB,EAAMmC,CAAC,KAAKnC,EAAM2B,CAAC,KAAK,EAAE6D,IAAO,IAAI;KACzC,IAAM5B,IAAI,KAAK,IAAI,GAAI4B,IAAOxD,EAAM,MAAO,IAAIkE,IAAS,CAAC,GACnD9B,IAAK1B,EAAE,GAAGP,CAAC,GACXuC,IAAKhC,EAAE,GAAGf,CAAC;KAEjB,AADAuB,EAAI,OAAOkB,IAAKR,GAAGc,CAAE,GACrBxB,EAAI,IAAIkB,GAAIM,GAAId,GAAG,GAAG,KAAK,KAAK,CAAC;IACnC;IAGA,AAFA,EAAI,YAAYsC,GAChB,EAAI,cAAcrG,EAAKsG,GAAO,CAAC,GAC/BjD,EAAI,OAAO;GACb;EACF;CACF;CAEA,OAAO;EACL,MAAM,GAAO,GAAO,IAAO,GAAG,IAAM,GAAG;GAKrC,AAJAA,EAAI,KAAK,GACTA,EAAI,aAAa,GAAG,GAAG,GAAG,GAAGkD,GAAMC,CAAG,GACtCnD,EAAI,UAAU,GACdA,EAAI,KAAK,GAAG,GAAGlB,EAAM,OAAOA,EAAM,MAAM,GACxCkB,EAAI,KAAK;GACT,KAAK,IAAMT,KAAQ6D,GACjB,QAAQ7D,EAAK,MAAb;IACE,KAAK;KACH,AAAIA,EAAK,QAAQ,KAAGO,EAASP,GAAMT,CAAK;KACxC;IACF,KAAK;KACH,AAAIS,EAAK,QAAQ,KAAGU,EAASV,GAAMT,CAAK;KACxC;IACF,KAAK;KACH,EAASS,GAAMT,CAAK;KACpB;IACF,SACE,EAAYS,GAAMT,CAAK;GAE3B;GAEF,EAAI,QAAQ;EACd;EACA,UAAU;GACR,IAAU;EACZ;CACF;AACF,GAEauE,KACX,MACyB;CACzB,IAAMrD,IAAMsD,EAAO,WAAW,IAAI;CAClC,IAAI,CAACtD,GAAK,OAAO;CACjB,IAAMuD,IAAU5E,EAAsBqB,SACpC,OAAO,WAAa,MAAc,OAAO,SAAS,cAAc,QAAQ,CAC1E;CACA,OAAO;EACL,MAAM;EACN;EACA,OAAO,GAAO,GAAQ;GAEpB,AADA,EAAO,QAAQ,KAAK,IAAI,GAAGwD,CAAK,GAChC,EAAO,SAAS,KAAK,IAAI,GAAGC,CAAM;EACpC;EACA,OAAO,GAAO,GAAO;GAGnB,AAFAzD,EAAI,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GACjCA,EAAI,UAAU,GAAG,GAAGsD,EAAO,OAAOA,EAAO,MAAM,GAC/CC,EAAQ,MAAMH,GAAOtE,CAAK;EAC5B;EACA,UAAU;GAGR,AAFAyE,EAAQ,QAAQ,GAChB,EAAO,QAAQ,GACf,EAAO,SAAS;EAClB;CACF;AACF"}
@@ -0,0 +1,2 @@
1
+ const e=require("../defaults.cjs");var t=(t,n)=>e.subscribeDefaultChartRenderer(()=>{let e=t();(!e||e===`auto`)&&n()});exports.followDefaultRenderer=t;
2
+ //# sourceMappingURL=follow.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follow.cjs","names":["subscribeDefaultChartRenderer","require_defaults","followDefaultRenderer","own","preference","recreate"],"sources":["../../../../../charts/src/engine/renderers/follow.ts"],"sourcesContent":["// Live switching: charts whose own `renderer` is unset or \"auto\" recreate\n// their backend when the global default (`setDefaultChartRenderer`) changes.\n\nimport { subscribeDefaultChartRenderer } from \"../defaults\";\nimport type { ChartRendererPreference } from \"../types\";\n\n/**\n * Calls `recreate` on every change of the default renderer while\n * `preference()` (read at change time, so `setOptions` is honoured) is unset\n * or \"auto\". Charts with an explicit backend are left alone. Returns the\n * unsubscribe function to call on destroy.\n */\nexport const followDefaultRenderer = (\n preference: () => ChartRendererPreference | undefined,\n recreate: () => void,\n): (() => void) =>\n subscribeDefaultChartRenderer(() => {\n const own = preference();\n if (!own || own === \"auto\") recreate();\n });\n"],"mappings":"mCAYA,IAAaE,GACX,EACA,IAEAF,EAAAA,kCAAoC,CAClC,IAAMG,EAAMC,EAAW,GACnB,CAACD,GAAOA,IAAQ,SAAQE,EAAS,CACvC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { ChartRendererPreference } from '../types.cjs';
2
+ /**
3
+ * Calls `recreate` on every change of the default renderer while
4
+ * `preference()` (read at change time, so `setOptions` is honoured) is unset
5
+ * or "auto". Charts with an explicit backend are left alone. Returns the
6
+ * unsubscribe function to call on destroy.
7
+ */
8
+ export declare const followDefaultRenderer: (preference: () => ChartRendererPreference | undefined, recreate: () => void) => (() => void);
@@ -0,0 +1,8 @@
1
+ import { ChartRendererPreference } from '../types.js';
2
+ /**
3
+ * Calls `recreate` on every change of the default renderer while
4
+ * `preference()` (read at change time, so `setOptions` is honoured) is unset
5
+ * or "auto". Charts with an explicit backend are left alone. Returns the
6
+ * unsubscribe function to call on destroy.
7
+ */
8
+ export declare const followDefaultRenderer: (preference: () => ChartRendererPreference | undefined, recreate: () => void) => (() => void);
@@ -0,0 +1,10 @@
1
+ import { subscribeDefaultChartRenderer as e } from "../defaults.js";
2
+ //#region src/engine/renderers/follow.ts
3
+ var t = (t, n) => e(() => {
4
+ let e = t();
5
+ (!e || e === "auto") && n();
6
+ });
7
+ //#endregion
8
+ export { t as followDefaultRenderer };
9
+
10
+ //# sourceMappingURL=follow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follow.js","names":["followDefaultRenderer","subscribeDefaultChartRenderer","own","preference","recreate"],"sources":["../../../../../charts/src/engine/renderers/follow.ts"],"sourcesContent":["// Live switching: charts whose own `renderer` is unset or \"auto\" recreate\n// their backend when the global default (`setDefaultChartRenderer`) changes.\n\nimport { subscribeDefaultChartRenderer } from \"../defaults\";\nimport type { ChartRendererPreference } from \"../types\";\n\n/**\n * Calls `recreate` on every change of the default renderer while\n * `preference()` (read at change time, so `setOptions` is honoured) is unset\n * or \"auto\". Charts with an explicit backend are left alone. Returns the\n * unsubscribe function to call on destroy.\n */\nexport const followDefaultRenderer = (\n preference: () => ChartRendererPreference | undefined,\n recreate: () => void,\n): (() => void) =>\n subscribeDefaultChartRenderer(() => {\n const own = preference();\n if (!own || own === \"auto\") recreate();\n });\n"],"mappings":";;AAYA,IAAaA,KACX,GACA,MAEAC,QAAoC;CAClC,IAAMC,IAAMC,EAAW;CACvB,CAAI,CAACD,KAAOA,MAAQ,WAAQE,EAAS;AACvC,CAAC"}
@@ -0,0 +1,2 @@
1
+ var e=Symbol.for(`minerva-design.charts.gl-budget`),t=()=>typeof navigator<`u`&&/Android|iPhone|iPad|Mobile/i.test(navigator.userAgent??``)?6:12,n=()=>{let n=globalThis;return n[e]??(n[e]={budget:t(),entries:new Set,observer:void 0,byCanvas:new WeakMap,clock:0})},r=3e3,i=e=>(e.observer===void 0&&(e.observer=typeof IntersectionObserver==`function`?new IntersectionObserver(t=>{for(let n of t){let t=e.byCanvas.get(n.target);t&&(t.visible=n.isIntersecting)}u(e)},{rootMargin:`200px`}):null),e.observer),a=e=>!e.suspended||e.restoring,o=e=>{e.suspended=!0,e.lostSeen=!1,e.hooks.suspend(),e.gl.isContextLost()||e.ext.loseContext()},s=(e,t,n)=>{let r=[...e.entries].filter(e=>e!==t&&a(e)),i=r.length+ +!!t-e.budget;if(i<=0)return!0;let s=r.filter(e=>!e.restoring&&(n||!e.visible)).sort((e,t)=>e.visible===t.visible?e.lastUsed-t.lastUsed:e.visible?1:-1);if(!n&&s.length<i)return!1;for(let e of s){if(i--<=0)break;o(e)}return i<=0},c=(e,t)=>{f(e,t),t.hooks.lost()};function l(e,t){t.suspended&&!t.restoring&&t.visible&&s(e,t,!1)&&(t.restoring=!0,t.lostSeen&&d(e,t))}function u(e){for(let t of[...e.entries].sort((e,t)=>t.lastUsed-e.lastUsed))t.suspended&&t.visible&&l(e,t)}var d=(e,t)=>{t.requested=!0,t.timer=setTimeout(()=>c(e,t),r);try{t.ext.restoreContext()}catch{c(e,t)}};function f(e,t){e.entries.delete(t)&&(t.timer!==void 0&&clearTimeout(t.timer),t.timer=void 0,t.canvas.removeEventListener(`webglcontextlost`,t.onLost),t.canvas.removeEventListener(`webglcontextrestored`,t.onRestored),t.requested&&t.restoring&&t.canvas.addEventListener(`webglcontextrestored`,()=>t.ext.loseContext(),{once:!0}),e.observer?.unobserve(t.canvas),e.byCanvas.delete(t.canvas),u(e))}var p=(e,t,r)=>{let a=n(),o=t.getExtension(`WEBGL_lose_context`);if(!o){let n=e=>{e.preventDefault(),r.lost()};return e.addEventListener(`webglcontextlost`,n),{use:()=>!t.isContextLost(),release:()=>e.removeEventListener(`webglcontextlost`,n)}}let u={canvas:e,gl:t,ext:o,hooks:r,lastUsed:++a.clock,visible:!0,suspended:!1,lostSeen:!1,restoring:!1,requested:!1,timer:void 0,onLost(e){if(e.preventDefault(),!u.suspended){c(a,u);return}u.lostSeen=!0,u.restoring&&!u.requested&&setTimeout(()=>{u.restoring&&!u.requested&&a.entries.has(u)&&d(a,u)})},onRestored(){u.restoring&&(u.timer!==void 0&&clearTimeout(u.timer),u.timer=void 0,u.restoring=!1,u.requested=!1,u.suspended=!1,u.hooks.restore())}};return e.addEventListener(`webglcontextlost`,u.onLost),e.addEventListener(`webglcontextrestored`,u.onRestored),a.entries.add(u),a.byCanvas.set(e,u),i(a)?.observe(e),s(a,u,!0),{use(){return u.lastUsed=++a.clock,u.suspended?(l(a,u),!1):!t.isContextLost()},release:()=>f(a,u)}};exports.claimGlSlot=p;
2
+ //# sourceMappingURL=gl-budget.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gl-budget.cjs","names":["KEY","defaultBudget","state","host","RESTORE_TIMEOUT","observer","s","record","records","entry","resumeWaiting","isActive","suspend","makeRoom","others","keep","excess","victims","onScreenToo","a","b","victim","fail","leave","resume","requestRestore","claimGlSlot","ext","gl","onLost","event","hooks","canvas"],"sources":["../../../../../charts/src/engine/renderers/gl-budget.ts"],"sourcesContent":["// Page-wide budget of live WebGL contexts. Browsers keep about 16 per page\n// (fewer on mobile) and silently lose the oldest beyond that, which a chart\n// takes for a GPU failure (it falls back to the next backend for good). A\n// dashboard or a docs page easily has more GPU charts than that, so past the\n// budget the backends suspend the least recently drawn off-screen contexts\n// themselves (WEBGL_lose_context frees the slot) and restore them when they\n// are drawn again or scroll back into view, then redraw their last frame.\n// The state lives on globalThis: every copy of the engine shares the budget.\n\n/** What a backend does around a suspension */\nexport interface GlSlotHooks {\n /** The context is about to be suspended: forget its GPU objects */\n suspend(): void;\n /** The context is back: rebuild the programs and redraw the last frame */\n restore(): void;\n /** A real loss (GPU reset, eviction by the browser, failed restore) */\n lost(): void;\n}\n\nexport interface GlSlot {\n /**\n * Marks the context as used now. False while it is suspended: a restore\n * is then under way and `restore()` redraws once it is done.\n */\n use(): boolean;\n /** Leaves the budget (destroy) */\n release(): void;\n}\n\ninterface Entry {\n canvas: HTMLCanvasElement;\n gl: WebGLRenderingContext | WebGL2RenderingContext;\n ext: WEBGL_lose_context;\n hooks: GlSlotHooks;\n lastUsed: number;\n /** On or near the screen (always true without IntersectionObserver) */\n visible: boolean;\n /** Lost on purpose by the budget */\n suspended: boolean;\n /** The lost event of the suspension was dispatched (restore is allowed) */\n lostSeen: boolean;\n /** Restore wanted, waiting for the lost event or `webglcontextrestored` */\n restoring: boolean;\n /** restoreContext() was called */\n requested: boolean;\n timer: ReturnType<typeof setTimeout> | undefined;\n onLost(event: Event): void;\n onRestored(): void;\n}\n\ninterface BudgetState {\n budget: number;\n entries: Set<Entry>;\n observer: IntersectionObserver | null | undefined;\n byCanvas: WeakMap<Element, Entry>;\n clock: number;\n}\n\nconst KEY = Symbol.for(\"minerva-design.charts.gl-budget\");\n\n/** Chromium keeps 16 contexts per page (8 on Android): leave room for others */\nconst defaultBudget = () =>\n typeof navigator !== \"undefined\" &&\n /Android|iPhone|iPad|Mobile/i.test(navigator.userAgent ?? \"\")\n ? 6\n : 12;\n\nconst state = (): BudgetState => {\n const host = globalThis as unknown as Record<symbol, BudgetState>;\n return (host[KEY] ??= {\n budget: defaultBudget(),\n entries: new Set(),\n observer: undefined,\n byCanvas: new WeakMap(),\n clock: 0,\n });\n};\n\n/** A restore that doesn't come back in time is a real loss */\nconst RESTORE_TIMEOUT = 3000;\n\nconst observer = (s: BudgetState): IntersectionObserver | null => {\n if (s.observer !== undefined) return s.observer;\n s.observer =\n typeof IntersectionObserver === \"function\"\n ? new IntersectionObserver(\n (records) => {\n for (const record of records) {\n const entry = s.byCanvas.get(record.target);\n if (entry) entry.visible = record.isIntersecting;\n }\n // scrolled back near the screen: restore before it is needed\n resumeWaiting(s);\n },\n { rootMargin: \"200px\" },\n )\n : null;\n return s.observer;\n};\n\nconst isActive = (entry: Entry) => !entry.suspended || entry.restoring;\n\nconst suspend = (entry: Entry) => {\n entry.suspended = true;\n entry.lostSeen = false;\n entry.hooks.suspend();\n // already lost by the browser (event pending): it becomes a suspension\n if (!entry.gl.isContextLost()) entry.ext.loseContext();\n};\n\n/**\n * Suspends other contexts until `keep` (or nothing) fits in the budget:\n * off-screen ones first, then the least recently drawn. With\n * `onScreenToo` false, only off-screen contexts may go, and nothing is\n * suspended (false is returned) when that isn't enough.\n */\nconst makeRoom = (\n s: BudgetState,\n keep: Entry | null,\n onScreenToo: boolean,\n): boolean => {\n const others = [...s.entries].filter((e) => e !== keep && isActive(e));\n let excess = others.length + (keep ? 1 : 0) - s.budget;\n if (excess <= 0) return true;\n const victims = others\n .filter((e) => !e.restoring && (onScreenToo || !e.visible))\n .sort((a, b) =>\n a.visible === b.visible ? a.lastUsed - b.lastUsed : a.visible ? 1 : -1,\n );\n if (!onScreenToo && victims.length < excess) return false;\n for (const victim of victims) {\n if (excess-- <= 0) break;\n suspend(victim);\n }\n return excess <= 0;\n};\n\nconst fail = (s: BudgetState, entry: Entry) => {\n leave(s, entry);\n entry.hooks.lost();\n};\n\n/**\n * Restores a suspended context that is on screen, if a slot can be freed\n * without suspending another on-screen chart (no ping-pong between charts)\n */\nfunction resume(s: BudgetState, entry: Entry) {\n if (!entry.suspended || entry.restoring || !entry.visible) return;\n if (!makeRoom(s, entry, false)) return;\n entry.restoring = true;\n // restoreContext only works once the lost event was dispatched\n if (entry.lostSeen) requestRestore(s, entry);\n}\n\n/** Visible suspended contexts waiting for a slot */\nfunction resumeWaiting(s: BudgetState) {\n for (const entry of [...s.entries].sort((a, b) => b.lastUsed - a.lastUsed)) {\n if (entry.suspended && entry.visible) resume(s, entry);\n }\n}\n\nconst requestRestore = (s: BudgetState, entry: Entry) => {\n entry.requested = true;\n entry.timer = setTimeout(() => fail(s, entry), RESTORE_TIMEOUT);\n try {\n entry.ext.restoreContext();\n } catch {\n fail(s, entry);\n }\n};\n\nfunction leave(s: BudgetState, entry: Entry) {\n if (!s.entries.delete(entry)) return;\n if (entry.timer !== undefined) clearTimeout(entry.timer);\n entry.timer = undefined;\n entry.canvas.removeEventListener(\"webglcontextlost\", entry.onLost);\n entry.canvas.removeEventListener(\"webglcontextrestored\", entry.onRestored);\n // a restore still on its way would bring back a context nobody uses\n if (entry.requested && entry.restoring) {\n entry.canvas.addEventListener(\n \"webglcontextrestored\",\n () => entry.ext.loseContext(),\n { once: true },\n );\n }\n s.observer?.unobserve(entry.canvas);\n s.byCanvas.delete(entry.canvas);\n resumeWaiting(s);\n}\n\n/**\n * Enters the context of `canvas` into the page-wide budget (suspending\n * others if needed) and takes over its lost / restored events: suspensions\n * stay internal, real losses reach `hooks.lost`. Without WEBGL_lose_context\n * the context is left unmanaged (the browser's own limit applies).\n */\nexport const claimGlSlot = (\n canvas: HTMLCanvasElement,\n gl: WebGLRenderingContext | WebGL2RenderingContext,\n hooks: GlSlotHooks,\n): GlSlot => {\n const s = state();\n const ext = gl.getExtension(\"WEBGL_lose_context\");\n if (!ext) {\n const onLost = (event: Event) => {\n event.preventDefault();\n hooks.lost();\n };\n canvas.addEventListener(\"webglcontextlost\", onLost);\n return {\n use: () => !gl.isContextLost(),\n release: () => canvas.removeEventListener(\"webglcontextlost\", onLost),\n };\n }\n const entry: Entry = {\n canvas,\n gl,\n ext,\n hooks,\n lastUsed: ++s.clock,\n visible: true,\n suspended: false,\n lostSeen: false,\n restoring: false,\n requested: false,\n timer: undefined,\n onLost(event) {\n // always: keeps restoreContext possible\n event.preventDefault();\n if (!entry.suspended) {\n fail(s, entry);\n return;\n }\n entry.lostSeen = true;\n // after the dispatch: the browser allows the restore once it returns\n if (entry.restoring && !entry.requested) {\n setTimeout(() => {\n if (entry.restoring && !entry.requested && s.entries.has(entry)) {\n requestRestore(s, entry);\n }\n });\n }\n },\n onRestored() {\n if (!entry.restoring) return;\n if (entry.timer !== undefined) clearTimeout(entry.timer);\n entry.timer = undefined;\n entry.restoring = false;\n entry.requested = false;\n entry.suspended = false;\n entry.hooks.restore();\n },\n };\n canvas.addEventListener(\"webglcontextlost\", entry.onLost);\n canvas.addEventListener(\"webglcontextrestored\", entry.onRestored);\n s.entries.add(entry);\n s.byCanvas.set(canvas, entry);\n observer(s)?.observe(canvas);\n // a new chart always gets its context (it was just created)\n makeRoom(s, entry, true);\n return {\n use() {\n entry.lastUsed = ++s.clock;\n if (!entry.suspended) return !gl.isContextLost();\n // drawn while suspended: restored now if on screen, else when it\n // scrolls back (its last frame is redrawn then)\n resume(s, entry);\n return false;\n },\n release: () => leave(s, entry),\n };\n};\n\n/** Live contexts allowed on the page (tests, embedders with other WebGL users) */\nexport const setGlContextBudget = (budget: number): void => {\n const s = state();\n s.budget = Math.max(1, Math.floor(budget));\n makeRoom(s, null, true);\n resumeWaiting(s);\n};\n\n/** Contexts in the budget, and how many are suspended (tests, diagnostics) */\nexport const glContextUsage = (): { total: number; suspended: number } => {\n const entries = [...state().entries];\n return {\n total: entries.length,\n suspended: entries.filter((entry) => !isActive(entry)).length,\n };\n};\n"],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /** What a backend does around a suspension */
2
+ export interface GlSlotHooks {
3
+ /** The context is about to be suspended: forget its GPU objects */
4
+ suspend(): void;
5
+ /** The context is back: rebuild the programs and redraw the last frame */
6
+ restore(): void;
7
+ /** A real loss (GPU reset, eviction by the browser, failed restore) */
8
+ lost(): void;
9
+ }
10
+ export interface GlSlot {
11
+ /**
12
+ * Marks the context as used now. False while it is suspended: a restore
13
+ * is then under way and `restore()` redraws once it is done.
14
+ */
15
+ use(): boolean;
16
+ /** Leaves the budget (destroy) */
17
+ release(): void;
18
+ }
19
+ /**
20
+ * Enters the context of `canvas` into the page-wide budget (suspending
21
+ * others if needed) and takes over its lost / restored events: suspensions
22
+ * stay internal, real losses reach `hooks.lost`. Without WEBGL_lose_context
23
+ * the context is left unmanaged (the browser's own limit applies).
24
+ */
25
+ export declare const claimGlSlot: (canvas: HTMLCanvasElement, gl: WebGLRenderingContext | WebGL2RenderingContext, hooks: GlSlotHooks) => GlSlot;
26
+ /** Live contexts allowed on the page (tests, embedders with other WebGL users) */
27
+ export declare const setGlContextBudget: (budget: number) => void;
28
+ /** Contexts in the budget, and how many are suspended (tests, diagnostics) */
29
+ export declare const glContextUsage: () => {
30
+ total: number;
31
+ suspended: number;
32
+ };
@@ -0,0 +1,32 @@
1
+ /** What a backend does around a suspension */
2
+ export interface GlSlotHooks {
3
+ /** The context is about to be suspended: forget its GPU objects */
4
+ suspend(): void;
5
+ /** The context is back: rebuild the programs and redraw the last frame */
6
+ restore(): void;
7
+ /** A real loss (GPU reset, eviction by the browser, failed restore) */
8
+ lost(): void;
9
+ }
10
+ export interface GlSlot {
11
+ /**
12
+ * Marks the context as used now. False while it is suspended: a restore
13
+ * is then under way and `restore()` redraws once it is done.
14
+ */
15
+ use(): boolean;
16
+ /** Leaves the budget (destroy) */
17
+ release(): void;
18
+ }
19
+ /**
20
+ * Enters the context of `canvas` into the page-wide budget (suspending
21
+ * others if needed) and takes over its lost / restored events: suspensions
22
+ * stay internal, real losses reach `hooks.lost`. Without WEBGL_lose_context
23
+ * the context is left unmanaged (the browser's own limit applies).
24
+ */
25
+ export declare const claimGlSlot: (canvas: HTMLCanvasElement, gl: WebGLRenderingContext | WebGL2RenderingContext, hooks: GlSlotHooks) => GlSlot;
26
+ /** Live contexts allowed on the page (tests, embedders with other WebGL users) */
27
+ export declare const setGlContextBudget: (budget: number) => void;
28
+ /** Contexts in the budget, and how many are suspended (tests, diagnostics) */
29
+ export declare const glContextUsage: () => {
30
+ total: number;
31
+ suspended: number;
32
+ };
@@ -0,0 +1,95 @@
1
+ //#region src/engine/renderers/gl-budget.ts
2
+ var e = Symbol.for("minerva-design.charts.gl-budget"), t = () => typeof navigator < "u" && /Android|iPhone|iPad|Mobile/i.test(navigator.userAgent ?? "") ? 6 : 12, n = () => {
3
+ let n = globalThis;
4
+ return n[e] ?? (n[e] = {
5
+ budget: t(),
6
+ entries: /* @__PURE__ */ new Set(),
7
+ observer: void 0,
8
+ byCanvas: /* @__PURE__ */ new WeakMap(),
9
+ clock: 0
10
+ });
11
+ }, r = 3e3, i = (e) => (e.observer === void 0 && (e.observer = typeof IntersectionObserver == "function" ? new IntersectionObserver((t) => {
12
+ for (let n of t) {
13
+ let t = e.byCanvas.get(n.target);
14
+ t && (t.visible = n.isIntersecting);
15
+ }
16
+ u(e);
17
+ }, { rootMargin: "200px" }) : null), e.observer), a = (e) => !e.suspended || e.restoring, o = (e) => {
18
+ e.suspended = !0, e.lostSeen = !1, e.hooks.suspend(), e.gl.isContextLost() || e.ext.loseContext();
19
+ }, s = (e, t, n) => {
20
+ let r = [...e.entries].filter((e) => e !== t && a(e)), i = r.length + +!!t - e.budget;
21
+ if (i <= 0) return !0;
22
+ let s = r.filter((e) => !e.restoring && (n || !e.visible)).sort((e, t) => e.visible === t.visible ? e.lastUsed - t.lastUsed : e.visible ? 1 : -1);
23
+ if (!n && s.length < i) return !1;
24
+ for (let e of s) {
25
+ if (i-- <= 0) break;
26
+ o(e);
27
+ }
28
+ return i <= 0;
29
+ }, c = (e, t) => {
30
+ f(e, t), t.hooks.lost();
31
+ };
32
+ function l(e, t) {
33
+ t.suspended && !t.restoring && t.visible && s(e, t, !1) && (t.restoring = !0, t.lostSeen && d(e, t));
34
+ }
35
+ function u(e) {
36
+ for (let t of [...e.entries].sort((e, t) => t.lastUsed - e.lastUsed)) t.suspended && t.visible && l(e, t);
37
+ }
38
+ var d = (e, t) => {
39
+ t.requested = !0, t.timer = setTimeout(() => c(e, t), r);
40
+ try {
41
+ t.ext.restoreContext();
42
+ } catch {
43
+ c(e, t);
44
+ }
45
+ };
46
+ function f(e, t) {
47
+ e.entries.delete(t) && (t.timer !== void 0 && clearTimeout(t.timer), t.timer = void 0, t.canvas.removeEventListener("webglcontextlost", t.onLost), t.canvas.removeEventListener("webglcontextrestored", t.onRestored), t.requested && t.restoring && t.canvas.addEventListener("webglcontextrestored", () => t.ext.loseContext(), { once: !0 }), e.observer?.unobserve(t.canvas), e.byCanvas.delete(t.canvas), u(e));
48
+ }
49
+ var p = (e, t, r) => {
50
+ let a = n(), o = t.getExtension("WEBGL_lose_context");
51
+ if (!o) {
52
+ let n = (e) => {
53
+ e.preventDefault(), r.lost();
54
+ };
55
+ return e.addEventListener("webglcontextlost", n), {
56
+ use: () => !t.isContextLost(),
57
+ release: () => e.removeEventListener("webglcontextlost", n)
58
+ };
59
+ }
60
+ let u = {
61
+ canvas: e,
62
+ gl: t,
63
+ ext: o,
64
+ hooks: r,
65
+ lastUsed: ++a.clock,
66
+ visible: !0,
67
+ suspended: !1,
68
+ lostSeen: !1,
69
+ restoring: !1,
70
+ requested: !1,
71
+ timer: void 0,
72
+ onLost(e) {
73
+ if (e.preventDefault(), !u.suspended) {
74
+ c(a, u);
75
+ return;
76
+ }
77
+ u.lostSeen = !0, u.restoring && !u.requested && setTimeout(() => {
78
+ u.restoring && !u.requested && a.entries.has(u) && d(a, u);
79
+ });
80
+ },
81
+ onRestored() {
82
+ u.restoring && (u.timer !== void 0 && clearTimeout(u.timer), u.timer = void 0, u.restoring = !1, u.requested = !1, u.suspended = !1, u.hooks.restore());
83
+ }
84
+ };
85
+ return e.addEventListener("webglcontextlost", u.onLost), e.addEventListener("webglcontextrestored", u.onRestored), a.entries.add(u), a.byCanvas.set(e, u), i(a)?.observe(e), s(a, u, !0), {
86
+ use() {
87
+ return u.lastUsed = ++a.clock, u.suspended ? (l(a, u), !1) : !t.isContextLost();
88
+ },
89
+ release: () => f(a, u)
90
+ };
91
+ };
92
+ //#endregion
93
+ export { p as claimGlSlot };
94
+
95
+ //# sourceMappingURL=gl-budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gl-budget.js","names":["KEY","defaultBudget","state","host","RESTORE_TIMEOUT","observer","s","record","records","entry","isActive","suspend","makeRoom","others","keep","excess","victims","onScreenToo","a","b","victim","fail","leave","resume","requestRestore","resumeWaiting","claimGlSlot","ext","gl","onLost","event","hooks","canvas"],"sources":["../../../../../charts/src/engine/renderers/gl-budget.ts"],"sourcesContent":["// Page-wide budget of live WebGL contexts. Browsers keep about 16 per page\n// (fewer on mobile) and silently lose the oldest beyond that, which a chart\n// takes for a GPU failure (it falls back to the next backend for good). A\n// dashboard or a docs page easily has more GPU charts than that, so past the\n// budget the backends suspend the least recently drawn off-screen contexts\n// themselves (WEBGL_lose_context frees the slot) and restore them when they\n// are drawn again or scroll back into view, then redraw their last frame.\n// The state lives on globalThis: every copy of the engine shares the budget.\n\n/** What a backend does around a suspension */\nexport interface GlSlotHooks {\n /** The context is about to be suspended: forget its GPU objects */\n suspend(): void;\n /** The context is back: rebuild the programs and redraw the last frame */\n restore(): void;\n /** A real loss (GPU reset, eviction by the browser, failed restore) */\n lost(): void;\n}\n\nexport interface GlSlot {\n /**\n * Marks the context as used now. False while it is suspended: a restore\n * is then under way and `restore()` redraws once it is done.\n */\n use(): boolean;\n /** Leaves the budget (destroy) */\n release(): void;\n}\n\ninterface Entry {\n canvas: HTMLCanvasElement;\n gl: WebGLRenderingContext | WebGL2RenderingContext;\n ext: WEBGL_lose_context;\n hooks: GlSlotHooks;\n lastUsed: number;\n /** On or near the screen (always true without IntersectionObserver) */\n visible: boolean;\n /** Lost on purpose by the budget */\n suspended: boolean;\n /** The lost event of the suspension was dispatched (restore is allowed) */\n lostSeen: boolean;\n /** Restore wanted, waiting for the lost event or `webglcontextrestored` */\n restoring: boolean;\n /** restoreContext() was called */\n requested: boolean;\n timer: ReturnType<typeof setTimeout> | undefined;\n onLost(event: Event): void;\n onRestored(): void;\n}\n\ninterface BudgetState {\n budget: number;\n entries: Set<Entry>;\n observer: IntersectionObserver | null | undefined;\n byCanvas: WeakMap<Element, Entry>;\n clock: number;\n}\n\nconst KEY = Symbol.for(\"minerva-design.charts.gl-budget\");\n\n/** Chromium keeps 16 contexts per page (8 on Android): leave room for others */\nconst defaultBudget = () =>\n typeof navigator !== \"undefined\" &&\n /Android|iPhone|iPad|Mobile/i.test(navigator.userAgent ?? \"\")\n ? 6\n : 12;\n\nconst state = (): BudgetState => {\n const host = globalThis as unknown as Record<symbol, BudgetState>;\n return (host[KEY] ??= {\n budget: defaultBudget(),\n entries: new Set(),\n observer: undefined,\n byCanvas: new WeakMap(),\n clock: 0,\n });\n};\n\n/** A restore that doesn't come back in time is a real loss */\nconst RESTORE_TIMEOUT = 3000;\n\nconst observer = (s: BudgetState): IntersectionObserver | null => {\n if (s.observer !== undefined) return s.observer;\n s.observer =\n typeof IntersectionObserver === \"function\"\n ? new IntersectionObserver(\n (records) => {\n for (const record of records) {\n const entry = s.byCanvas.get(record.target);\n if (entry) entry.visible = record.isIntersecting;\n }\n // scrolled back near the screen: restore before it is needed\n resumeWaiting(s);\n },\n { rootMargin: \"200px\" },\n )\n : null;\n return s.observer;\n};\n\nconst isActive = (entry: Entry) => !entry.suspended || entry.restoring;\n\nconst suspend = (entry: Entry) => {\n entry.suspended = true;\n entry.lostSeen = false;\n entry.hooks.suspend();\n // already lost by the browser (event pending): it becomes a suspension\n if (!entry.gl.isContextLost()) entry.ext.loseContext();\n};\n\n/**\n * Suspends other contexts until `keep` (or nothing) fits in the budget:\n * off-screen ones first, then the least recently drawn. With\n * `onScreenToo` false, only off-screen contexts may go, and nothing is\n * suspended (false is returned) when that isn't enough.\n */\nconst makeRoom = (\n s: BudgetState,\n keep: Entry | null,\n onScreenToo: boolean,\n): boolean => {\n const others = [...s.entries].filter((e) => e !== keep && isActive(e));\n let excess = others.length + (keep ? 1 : 0) - s.budget;\n if (excess <= 0) return true;\n const victims = others\n .filter((e) => !e.restoring && (onScreenToo || !e.visible))\n .sort((a, b) =>\n a.visible === b.visible ? a.lastUsed - b.lastUsed : a.visible ? 1 : -1,\n );\n if (!onScreenToo && victims.length < excess) return false;\n for (const victim of victims) {\n if (excess-- <= 0) break;\n suspend(victim);\n }\n return excess <= 0;\n};\n\nconst fail = (s: BudgetState, entry: Entry) => {\n leave(s, entry);\n entry.hooks.lost();\n};\n\n/**\n * Restores a suspended context that is on screen, if a slot can be freed\n * without suspending another on-screen chart (no ping-pong between charts)\n */\nfunction resume(s: BudgetState, entry: Entry) {\n if (!entry.suspended || entry.restoring || !entry.visible) return;\n if (!makeRoom(s, entry, false)) return;\n entry.restoring = true;\n // restoreContext only works once the lost event was dispatched\n if (entry.lostSeen) requestRestore(s, entry);\n}\n\n/** Visible suspended contexts waiting for a slot */\nfunction resumeWaiting(s: BudgetState) {\n for (const entry of [...s.entries].sort((a, b) => b.lastUsed - a.lastUsed)) {\n if (entry.suspended && entry.visible) resume(s, entry);\n }\n}\n\nconst requestRestore = (s: BudgetState, entry: Entry) => {\n entry.requested = true;\n entry.timer = setTimeout(() => fail(s, entry), RESTORE_TIMEOUT);\n try {\n entry.ext.restoreContext();\n } catch {\n fail(s, entry);\n }\n};\n\nfunction leave(s: BudgetState, entry: Entry) {\n if (!s.entries.delete(entry)) return;\n if (entry.timer !== undefined) clearTimeout(entry.timer);\n entry.timer = undefined;\n entry.canvas.removeEventListener(\"webglcontextlost\", entry.onLost);\n entry.canvas.removeEventListener(\"webglcontextrestored\", entry.onRestored);\n // a restore still on its way would bring back a context nobody uses\n if (entry.requested && entry.restoring) {\n entry.canvas.addEventListener(\n \"webglcontextrestored\",\n () => entry.ext.loseContext(),\n { once: true },\n );\n }\n s.observer?.unobserve(entry.canvas);\n s.byCanvas.delete(entry.canvas);\n resumeWaiting(s);\n}\n\n/**\n * Enters the context of `canvas` into the page-wide budget (suspending\n * others if needed) and takes over its lost / restored events: suspensions\n * stay internal, real losses reach `hooks.lost`. Without WEBGL_lose_context\n * the context is left unmanaged (the browser's own limit applies).\n */\nexport const claimGlSlot = (\n canvas: HTMLCanvasElement,\n gl: WebGLRenderingContext | WebGL2RenderingContext,\n hooks: GlSlotHooks,\n): GlSlot => {\n const s = state();\n const ext = gl.getExtension(\"WEBGL_lose_context\");\n if (!ext) {\n const onLost = (event: Event) => {\n event.preventDefault();\n hooks.lost();\n };\n canvas.addEventListener(\"webglcontextlost\", onLost);\n return {\n use: () => !gl.isContextLost(),\n release: () => canvas.removeEventListener(\"webglcontextlost\", onLost),\n };\n }\n const entry: Entry = {\n canvas,\n gl,\n ext,\n hooks,\n lastUsed: ++s.clock,\n visible: true,\n suspended: false,\n lostSeen: false,\n restoring: false,\n requested: false,\n timer: undefined,\n onLost(event) {\n // always: keeps restoreContext possible\n event.preventDefault();\n if (!entry.suspended) {\n fail(s, entry);\n return;\n }\n entry.lostSeen = true;\n // after the dispatch: the browser allows the restore once it returns\n if (entry.restoring && !entry.requested) {\n setTimeout(() => {\n if (entry.restoring && !entry.requested && s.entries.has(entry)) {\n requestRestore(s, entry);\n }\n });\n }\n },\n onRestored() {\n if (!entry.restoring) return;\n if (entry.timer !== undefined) clearTimeout(entry.timer);\n entry.timer = undefined;\n entry.restoring = false;\n entry.requested = false;\n entry.suspended = false;\n entry.hooks.restore();\n },\n };\n canvas.addEventListener(\"webglcontextlost\", entry.onLost);\n canvas.addEventListener(\"webglcontextrestored\", entry.onRestored);\n s.entries.add(entry);\n s.byCanvas.set(canvas, entry);\n observer(s)?.observe(canvas);\n // a new chart always gets its context (it was just created)\n makeRoom(s, entry, true);\n return {\n use() {\n entry.lastUsed = ++s.clock;\n if (!entry.suspended) return !gl.isContextLost();\n // drawn while suspended: restored now if on screen, else when it\n // scrolls back (its last frame is redrawn then)\n resume(s, entry);\n return false;\n },\n release: () => leave(s, entry),\n };\n};\n\n/** Live contexts allowed on the page (tests, embedders with other WebGL users) */\nexport const setGlContextBudget = (budget: number): void => {\n const s = state();\n s.budget = Math.max(1, Math.floor(budget));\n makeRoom(s, null, true);\n resumeWaiting(s);\n};\n\n/** Contexts in the budget, and how many are suspended (tests, diagnostics) */\nexport const glContextUsage = (): { total: number; suspended: number } => {\n const entries = [...state().entries];\n return {\n total: entries.length,\n suspended: entries.filter((entry) => !isActive(entry)).length,\n };\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- var e=e=>({alpha:!0,premultipliedAlpha:!0,antialias:!1,depth:!1,stencil:!1,preserveDrawingBuffer:!1,failIfMajorPerformanceCaveat:e}),t=(e,t,n)=>{let r=(t,n)=>{let r=e.createShader(t);return r?(e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)?r:(e.deleteShader(r),null)):null},i=r(e.VERTEX_SHADER,t.vertex),a=r(e.FRAGMENT_SHADER,t.fragment),o=e.createProgram();return!i||!a||!o?null:(e.attachShader(o,i),e.attachShader(o,a),n.forEach((t,n)=>e.bindAttribLocation(o,n,t)),e.linkProgram(o),e.deleteShader(i),e.deleteShader(a),e.getProgramParameter(o,e.LINK_STATUS)?{program:o,xform:e.getUniformLocation(o,`u_xform`),viewport:e.getUniformLocation(o,`u_viewport`),color:e.getUniformLocation(o,`u_color`),params:e.getUniformLocation(o,`u_params`)}:(e.deleteProgram(o),null))},n=/swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i,r=e=>{let t=e.getExtension(`WEBGL_debug_renderer_info`),r=t?e.getParameter(t.UNMASKED_RENDERER_WEBGL):e.getParameter(e.RENDERER);return n.test(String(r??``))},i=(e,t)=>{switch(e.kind){case`line`:return[e.width*t.dpr/2,0,0,0];case`area`:return[0,e.opacity,0,0];case`bar`:return[e.halfWidth,e.radius,e.inset,e.minHalf];default:return[e.opacity,e.stroke,0,0]}};exports.SOFTWARE_RENDERER=n,exports.compileProgram=t,exports.glContextAttributes=e,exports.isSoftwareRenderer=r,exports.itemParams=i;
1
+ var e=e=>({alpha:!0,premultipliedAlpha:!0,antialias:!1,depth:!1,stencil:!1,preserveDrawingBuffer:!1,failIfMajorPerformanceCaveat:e}),t=(e,t,n)=>{let r=(t,n)=>{let r=e.createShader(t);return r?(e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)?r:(e.deleteShader(r),null)):null},i=r(e.VERTEX_SHADER,t.vertex),a=r(e.FRAGMENT_SHADER,t.fragment),o=e.createProgram();return!i||!a||!o?null:(e.attachShader(o,i),e.attachShader(o,a),n.forEach((t,n)=>e.bindAttribLocation(o,n,t)),e.linkProgram(o),e.deleteShader(i),e.deleteShader(a),e.getProgramParameter(o,e.LINK_STATUS)?{program:o,xform:e.getUniformLocation(o,`u_xform`),viewport:e.getUniformLocation(o,`u_viewport`),color:e.getUniformLocation(o,`u_color`),params:e.getUniformLocation(o,`u_params`)}:(e.deleteProgram(o),null))},n=/swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i,r=e=>{let t=e.getExtension(`WEBGL_debug_renderer_info`),r=t?e.getParameter(t.UNMASKED_RENDERER_WEBGL):e.getParameter(e.RENDERER);return n.test(String(r??``))},i=(e,t)=>{switch(e.kind){case`line`:return[e.width*t.dpr/2,0,0,0];case`area`:return[+!!e.flat,e.opacity,0,0];case`bar`:return[e.halfWidth,e.radius,e.inset,e.minHalf];default:return[e.opacity,e.stroke,0,0]}};exports.SOFTWARE_RENDERER=n,exports.compileProgram=t,exports.glContextAttributes=e,exports.isSoftwareRenderer=r,exports.itemParams=i;
2
2
  //# sourceMappingURL=gl.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"gl.cjs","names":["glContextAttributes","requireHardware","compileProgram","shader","s","gl","type","code","vs","source","fs","program","attributes","i","name","SOFTWARE_RENDERER","isSoftwareRenderer","info","itemParams","item","frame"],"sources":["../../../../../charts/src/engine/renderers/gl.ts"],"sourcesContent":["// Helpers shared by the WebGL2 and WebGL (1) backends.\n\nimport type { RenderFrame, RenderItem } from \"./types\";\n\nexport type GlContext = WebGLRenderingContext | WebGL2RenderingContext;\n\nexport interface GlProgram {\n program: WebGLProgram;\n xform: WebGLUniformLocation | null;\n viewport: WebGLUniformLocation | null;\n color: WebGLUniformLocation | null;\n params: WebGLUniformLocation | null;\n}\n\n/** Context attributes of the data layer (premultiplied, no MSAA: the shaders anti-alias) */\nexport const glContextAttributes = (\n requireHardware: boolean,\n): WebGLContextAttributes => ({\n alpha: true,\n premultipliedAlpha: true,\n antialias: false,\n depth: false,\n stencil: false,\n preserveDrawingBuffer: false,\n failIfMajorPerformanceCaveat: requireHardware,\n});\n\n/** Compiles and links a program; `attributes[i]` is bound to location `i` */\nexport const compileProgram = (\n gl: GlContext,\n source: { vertex: string; fragment: string },\n attributes: readonly string[],\n): GlProgram | null => {\n const shader = (type: number, code: string) => {\n const s = gl.createShader(type);\n if (!s) return null;\n gl.shaderSource(s, code);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n gl.deleteShader(s);\n return null;\n }\n return s;\n };\n const vs = shader(gl.VERTEX_SHADER, source.vertex);\n const fs = shader(gl.FRAGMENT_SHADER, source.fragment);\n const program = gl.createProgram();\n if (!vs || !fs || !program) return null;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n attributes.forEach((name, i) => gl.bindAttribLocation(program, i, name));\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return null;\n }\n return {\n program,\n xform: gl.getUniformLocation(program, \"u_xform\"),\n viewport: gl.getUniformLocation(program, \"u_viewport\"),\n color: gl.getUniformLocation(program, \"u_color\"),\n params: gl.getUniformLocation(program, \"u_params\"),\n };\n};\n\nexport const SOFTWARE_RENDERER =\n /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i;\n\n/** Software rasterizer (SwiftShader, llvmpipe, ...) behind the WebGL context */\nexport const isSoftwareRenderer = (gl: GlContext): boolean => {\n const info = gl.getExtension(\"WEBGL_debug_renderer_info\");\n const name = info\n ? gl.getParameter(info.UNMASKED_RENDERER_WEBGL)\n : gl.getParameter(gl.RENDERER);\n return SOFTWARE_RENDERER.test(String(name ?? \"\"));\n};\n\n/** `u_params` of an item (see the uniform layout in shaders.ts) */\nexport const itemParams = (\n item: RenderItem,\n frame: RenderFrame,\n): [number, number, number, number] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0, 0, 0];\n case \"area\":\n return [0, item.opacity, 0, 0];\n case \"bar\":\n return [item.halfWidth, item.radius, item.inset, item.minHalf];\n default:\n return [item.opacity, item.stroke, 0, 0];\n }\n};\n"],"mappings":"AAeA,IAAaA,EACX,IAC4B,CAC5B,MAAO,GACP,mBAAoB,GACpB,UAAW,GACX,MAAO,GACP,QAAS,GACT,sBAAuB,GACvB,6BAA8BC,CAChC,GAGaC,GACX,EACA,EACA,IACqB,CACrB,IAAMC,GAAU,EAAc,IAAiB,CAC7C,IAAMC,EAAIC,EAAG,aAAaC,CAAI,EAQ9B,OAPKF,GACLC,EAAG,aAAaD,EAAGG,CAAI,EACvBF,EAAG,cAAcD,CAAC,EACbC,EAAG,mBAAmBD,EAAGC,EAAG,cAAc,EAIxCD,GAHLC,EAAG,aAAaD,CAAC,EACV,OALM,IAQjB,EACMI,EAAKL,EAAOE,EAAG,cAAeI,EAAO,MAAM,EAC3CC,EAAKP,EAAOE,EAAG,gBAAiBI,EAAO,QAAQ,EAC/CE,EAAUN,EAAG,cAAc,EAYjC,MAXI,CAACG,GAAM,CAACE,GAAM,CAACC,EAAgB,MACnCN,EAAG,aAAaM,EAASH,CAAE,EAC3BH,EAAG,aAAaM,EAASD,CAAE,EAC3BE,EAAW,SAAS,EAAM,IAAMP,EAAG,mBAAmBM,EAASE,EAAGC,CAAI,CAAC,EACvET,EAAG,YAAYM,CAAO,EACtBN,EAAG,aAAaG,CAAE,EAClBH,EAAG,aAAaK,CAAE,EACbL,EAAG,oBAAoBM,EAASN,EAAG,WAAW,EAI5C,CACL,UACA,MAAOA,EAAG,mBAAmBM,EAAS,SAAS,EAC/C,SAAUN,EAAG,mBAAmBM,EAAS,YAAY,EACrD,MAAON,EAAG,mBAAmBM,EAAS,SAAS,EAC/C,OAAQN,EAAG,mBAAmBM,EAAS,UAAU,CACnD,GATEN,EAAG,cAAcM,CAAO,EACjB,MASX,EAEaI,EACX,8EAGWC,EAAsB,GAA2B,CAC5D,IAAMC,EAAOZ,EAAG,aAAa,2BAA2B,EAClDS,EAAOG,EACTZ,EAAG,aAAaY,EAAK,uBAAuB,EAC5CZ,EAAG,aAAaA,EAAG,QAAQ,EAC/B,OAAOU,EAAkB,KAAK,OAAOD,GAAQ,EAAE,CAAC,CAClD,EAGaI,GACX,EACA,IACqC,CACrC,OAAQC,EAAK,KAAb,CACE,IAAK,OACH,MAAO,CAAEA,EAAK,MAAQC,EAAM,IAAO,EAAG,EAAG,EAAG,CAAC,EAC/C,IAAK,OACH,MAAO,CAAC,EAAGD,EAAK,QAAS,EAAG,CAAC,EAC/B,IAAK,MACH,MAAO,CAACA,EAAK,UAAWA,EAAK,OAAQA,EAAK,MAAOA,EAAK,OAAO,EAC/D,QACE,MAAO,CAACA,EAAK,QAASA,EAAK,OAAQ,EAAG,CAAC,CAC3C,CACF"}
1
+ {"version":3,"file":"gl.cjs","names":["glContextAttributes","requireHardware","compileProgram","shader","s","gl","type","code","vs","source","fs","program","attributes","i","name","SOFTWARE_RENDERER","isSoftwareRenderer","info","itemParams","item","frame"],"sources":["../../../../../charts/src/engine/renderers/gl.ts"],"sourcesContent":["// Helpers shared by the WebGL2 and WebGL (1) backends.\n\nimport type { RenderFrame, RenderItem } from \"./types\";\n\nexport type GlContext = WebGLRenderingContext | WebGL2RenderingContext;\n\nexport interface GlProgram {\n program: WebGLProgram;\n xform: WebGLUniformLocation | null;\n viewport: WebGLUniformLocation | null;\n color: WebGLUniformLocation | null;\n params: WebGLUniformLocation | null;\n}\n\n/** Context attributes of the data layer (premultiplied, no MSAA: the shaders anti-alias) */\nexport const glContextAttributes = (\n requireHardware: boolean,\n): WebGLContextAttributes => ({\n alpha: true,\n premultipliedAlpha: true,\n antialias: false,\n depth: false,\n stencil: false,\n preserveDrawingBuffer: false,\n failIfMajorPerformanceCaveat: requireHardware,\n});\n\n/** Compiles and links a program; `attributes[i]` is bound to location `i` */\nexport const compileProgram = (\n gl: GlContext,\n source: { vertex: string; fragment: string },\n attributes: readonly string[],\n): GlProgram | null => {\n const shader = (type: number, code: string) => {\n const s = gl.createShader(type);\n if (!s) return null;\n gl.shaderSource(s, code);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n gl.deleteShader(s);\n return null;\n }\n return s;\n };\n const vs = shader(gl.VERTEX_SHADER, source.vertex);\n const fs = shader(gl.FRAGMENT_SHADER, source.fragment);\n const program = gl.createProgram();\n if (!vs || !fs || !program) return null;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n attributes.forEach((name, i) => gl.bindAttribLocation(program, i, name));\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return null;\n }\n return {\n program,\n xform: gl.getUniformLocation(program, \"u_xform\"),\n viewport: gl.getUniformLocation(program, \"u_viewport\"),\n color: gl.getUniformLocation(program, \"u_color\"),\n params: gl.getUniformLocation(program, \"u_params\"),\n };\n};\n\nexport const SOFTWARE_RENDERER =\n /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i;\n\n/** Software rasterizer (SwiftShader, llvmpipe, ...) behind the WebGL context */\nexport const isSoftwareRenderer = (gl: GlContext): boolean => {\n const info = gl.getExtension(\"WEBGL_debug_renderer_info\");\n const name = info\n ? gl.getParameter(info.UNMASKED_RENDERER_WEBGL)\n : gl.getParameter(gl.RENDERER);\n return SOFTWARE_RENDERER.test(String(name ?? \"\"));\n};\n\n/** `u_params` of an item (see the uniform layout in shaders.ts) */\nexport const itemParams = (\n item: RenderItem,\n frame: RenderFrame,\n): [number, number, number, number] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0, 0, 0];\n case \"area\":\n return [item.flat ? 1 : 0, item.opacity, 0, 0];\n case \"bar\":\n return [item.halfWidth, item.radius, item.inset, item.minHalf];\n default:\n return [item.opacity, item.stroke, 0, 0];\n }\n};\n"],"mappings":"AAeA,IAAaA,EACX,IAC4B,CAC5B,MAAO,GACP,mBAAoB,GACpB,UAAW,GACX,MAAO,GACP,QAAS,GACT,sBAAuB,GACvB,6BAA8BC,CAChC,GAGaC,GACX,EACA,EACA,IACqB,CACrB,IAAMC,GAAU,EAAc,IAAiB,CAC7C,IAAMC,EAAIC,EAAG,aAAaC,CAAI,EAQ9B,OAPKF,GACLC,EAAG,aAAaD,EAAGG,CAAI,EACvBF,EAAG,cAAcD,CAAC,EACbC,EAAG,mBAAmBD,EAAGC,EAAG,cAAc,EAIxCD,GAHLC,EAAG,aAAaD,CAAC,EACV,OALM,IAQjB,EACMI,EAAKL,EAAOE,EAAG,cAAeI,EAAO,MAAM,EAC3CC,EAAKP,EAAOE,EAAG,gBAAiBI,EAAO,QAAQ,EAC/CE,EAAUN,EAAG,cAAc,EAYjC,MAXI,CAACG,GAAM,CAACE,GAAM,CAACC,EAAgB,MACnCN,EAAG,aAAaM,EAASH,CAAE,EAC3BH,EAAG,aAAaM,EAASD,CAAE,EAC3BE,EAAW,SAAS,EAAM,IAAMP,EAAG,mBAAmBM,EAASE,EAAGC,CAAI,CAAC,EACvET,EAAG,YAAYM,CAAO,EACtBN,EAAG,aAAaG,CAAE,EAClBH,EAAG,aAAaK,CAAE,EACbL,EAAG,oBAAoBM,EAASN,EAAG,WAAW,EAI5C,CACL,UACA,MAAOA,EAAG,mBAAmBM,EAAS,SAAS,EAC/C,SAAUN,EAAG,mBAAmBM,EAAS,YAAY,EACrD,MAAON,EAAG,mBAAmBM,EAAS,SAAS,EAC/C,OAAQN,EAAG,mBAAmBM,EAAS,UAAU,CACnD,GATEN,EAAG,cAAcM,CAAO,EACjB,MASX,EAEaI,EACX,8EAGWC,EAAsB,GAA2B,CAC5D,IAAMC,EAAOZ,EAAG,aAAa,2BAA2B,EAClDS,EAAOG,EACTZ,EAAG,aAAaY,EAAK,uBAAuB,EAC5CZ,EAAG,aAAaA,EAAG,QAAQ,EAC/B,OAAOU,EAAkB,KAAK,OAAOD,GAAQ,EAAE,CAAC,CAClD,EAGaI,GACX,EACA,IACqC,CACrC,OAAQC,EAAK,KAAb,CACE,IAAK,OACH,MAAO,CAAEA,EAAK,MAAQC,EAAM,IAAO,EAAG,EAAG,EAAG,CAAC,EAC/C,IAAK,OACH,MAAO,CAAC,KAAK,KAAcD,EAAK,QAAS,EAAG,CAAC,EAC/C,IAAK,MACH,MAAO,CAACA,EAAK,UAAWA,EAAK,OAAQA,EAAK,MAAOA,EAAK,OAAO,EAC/D,QACE,MAAO,CAACA,EAAK,QAASA,EAAK,OAAQ,EAAG,CAAC,CAC3C,CACF"}
@@ -31,7 +31,7 @@ var e = (e) => ({
31
31
  0
32
32
  ];
33
33
  case "area": return [
34
- 0,
34
+ +!!e.flat,
35
35
  e.opacity,
36
36
  0,
37
37
  0
@@ -1 +1 @@
1
- {"version":3,"file":"gl.js","names":["glContextAttributes","requireHardware","compileProgram","shader","s","gl","type","code","vs","source","fs","program","attributes","i","name","SOFTWARE_RENDERER","isSoftwareRenderer","info","itemParams","item","frame"],"sources":["../../../../../charts/src/engine/renderers/gl.ts"],"sourcesContent":["// Helpers shared by the WebGL2 and WebGL (1) backends.\n\nimport type { RenderFrame, RenderItem } from \"./types\";\n\nexport type GlContext = WebGLRenderingContext | WebGL2RenderingContext;\n\nexport interface GlProgram {\n program: WebGLProgram;\n xform: WebGLUniformLocation | null;\n viewport: WebGLUniformLocation | null;\n color: WebGLUniformLocation | null;\n params: WebGLUniformLocation | null;\n}\n\n/** Context attributes of the data layer (premultiplied, no MSAA: the shaders anti-alias) */\nexport const glContextAttributes = (\n requireHardware: boolean,\n): WebGLContextAttributes => ({\n alpha: true,\n premultipliedAlpha: true,\n antialias: false,\n depth: false,\n stencil: false,\n preserveDrawingBuffer: false,\n failIfMajorPerformanceCaveat: requireHardware,\n});\n\n/** Compiles and links a program; `attributes[i]` is bound to location `i` */\nexport const compileProgram = (\n gl: GlContext,\n source: { vertex: string; fragment: string },\n attributes: readonly string[],\n): GlProgram | null => {\n const shader = (type: number, code: string) => {\n const s = gl.createShader(type);\n if (!s) return null;\n gl.shaderSource(s, code);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n gl.deleteShader(s);\n return null;\n }\n return s;\n };\n const vs = shader(gl.VERTEX_SHADER, source.vertex);\n const fs = shader(gl.FRAGMENT_SHADER, source.fragment);\n const program = gl.createProgram();\n if (!vs || !fs || !program) return null;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n attributes.forEach((name, i) => gl.bindAttribLocation(program, i, name));\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return null;\n }\n return {\n program,\n xform: gl.getUniformLocation(program, \"u_xform\"),\n viewport: gl.getUniformLocation(program, \"u_viewport\"),\n color: gl.getUniformLocation(program, \"u_color\"),\n params: gl.getUniformLocation(program, \"u_params\"),\n };\n};\n\nexport const SOFTWARE_RENDERER =\n /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i;\n\n/** Software rasterizer (SwiftShader, llvmpipe, ...) behind the WebGL context */\nexport const isSoftwareRenderer = (gl: GlContext): boolean => {\n const info = gl.getExtension(\"WEBGL_debug_renderer_info\");\n const name = info\n ? gl.getParameter(info.UNMASKED_RENDERER_WEBGL)\n : gl.getParameter(gl.RENDERER);\n return SOFTWARE_RENDERER.test(String(name ?? \"\"));\n};\n\n/** `u_params` of an item (see the uniform layout in shaders.ts) */\nexport const itemParams = (\n item: RenderItem,\n frame: RenderFrame,\n): [number, number, number, number] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0, 0, 0];\n case \"area\":\n return [0, item.opacity, 0, 0];\n case \"bar\":\n return [item.halfWidth, item.radius, item.inset, item.minHalf];\n default:\n return [item.opacity, item.stroke, 0, 0];\n }\n};\n"],"mappings":";AAeA,IAAaA,KACX,OAC4B;CAC5B,OAAO;CACP,oBAAoB;CACpB,WAAW;CACX,OAAO;CACP,SAAS;CACT,uBAAuB;CACvB,8BAA8BC;AAChC,IAGaC,KACX,GACA,GACA,MACqB;CACrB,IAAMC,KAAU,GAAc,MAAiB;EAC7C,IAAMC,IAAIC,EAAG,aAAaC,CAAI;EAQ9B,OAPKF,KACLC,EAAG,aAAaD,GAAGG,CAAI,GACvBF,EAAG,cAAcD,CAAC,GACbC,EAAG,mBAAmBD,GAAGC,EAAG,cAAc,IAIxCD,KAHLC,EAAG,aAAaD,CAAC,GACV,SALM;CAQjB,GACMI,IAAKL,EAAOE,EAAG,eAAeI,EAAO,MAAM,GAC3CC,IAAKP,EAAOE,EAAG,iBAAiBI,EAAO,QAAQ,GAC/CE,IAAUN,EAAG,cAAc;CAYjC,OAXI,CAACG,KAAM,CAACE,KAAM,CAACC,IAAgB,QACnCN,EAAG,aAAaM,GAASH,CAAE,GAC3BH,EAAG,aAAaM,GAASD,CAAE,GAC3BE,EAAW,SAAS,GAAM,MAAMP,EAAG,mBAAmBM,GAASE,GAAGC,CAAI,CAAC,GACvET,EAAG,YAAYM,CAAO,GACtBN,EAAG,aAAaG,CAAE,GAClBH,EAAG,aAAaK,CAAE,GACbL,EAAG,oBAAoBM,GAASN,EAAG,WAAW,IAI5C;EACL;EACA,OAAOA,EAAG,mBAAmBM,GAAS,SAAS;EAC/C,UAAUN,EAAG,mBAAmBM,GAAS,YAAY;EACrD,OAAON,EAAG,mBAAmBM,GAAS,SAAS;EAC/C,QAAQN,EAAG,mBAAmBM,GAAS,UAAU;CACnD,KATEN,EAAG,cAAcM,CAAO,GACjB;AASX,GAEaI,IACX,+EAGWC,KAAsB,MAA2B;CAC5D,IAAMC,IAAOZ,EAAG,aAAa,2BAA2B,GAClDS,IAAOG,IACTZ,EAAG,aAAaY,EAAK,uBAAuB,IAC5CZ,EAAG,aAAaA,EAAG,QAAQ;CAC/B,OAAOU,EAAkB,KAAK,OAAOD,KAAQ,EAAE,CAAC;AAClD,GAGaI,KACX,GACA,MACqC;CACrC,QAAQC,EAAK,MAAb;EACE,KAAK,QACH,OAAO;GAAEA,EAAK,QAAQC,EAAM,MAAO;GAAG;GAAG;GAAG;EAAC;EAC/C,KAAK,QACH,OAAO;GAAC;GAAGD,EAAK;GAAS;GAAG;EAAC;EAC/B,KAAK,OACH,OAAO;GAACA,EAAK;GAAWA,EAAK;GAAQA,EAAK;GAAOA,EAAK;EAAO;EAC/D,SACE,OAAO;GAACA,EAAK;GAASA,EAAK;GAAQ;GAAG;EAAC;CAC3C;AACF"}
1
+ {"version":3,"file":"gl.js","names":["glContextAttributes","requireHardware","compileProgram","shader","s","gl","type","code","vs","source","fs","program","attributes","i","name","SOFTWARE_RENDERER","isSoftwareRenderer","info","itemParams","item","frame"],"sources":["../../../../../charts/src/engine/renderers/gl.ts"],"sourcesContent":["// Helpers shared by the WebGL2 and WebGL (1) backends.\n\nimport type { RenderFrame, RenderItem } from \"./types\";\n\nexport type GlContext = WebGLRenderingContext | WebGL2RenderingContext;\n\nexport interface GlProgram {\n program: WebGLProgram;\n xform: WebGLUniformLocation | null;\n viewport: WebGLUniformLocation | null;\n color: WebGLUniformLocation | null;\n params: WebGLUniformLocation | null;\n}\n\n/** Context attributes of the data layer (premultiplied, no MSAA: the shaders anti-alias) */\nexport const glContextAttributes = (\n requireHardware: boolean,\n): WebGLContextAttributes => ({\n alpha: true,\n premultipliedAlpha: true,\n antialias: false,\n depth: false,\n stencil: false,\n preserveDrawingBuffer: false,\n failIfMajorPerformanceCaveat: requireHardware,\n});\n\n/** Compiles and links a program; `attributes[i]` is bound to location `i` */\nexport const compileProgram = (\n gl: GlContext,\n source: { vertex: string; fragment: string },\n attributes: readonly string[],\n): GlProgram | null => {\n const shader = (type: number, code: string) => {\n const s = gl.createShader(type);\n if (!s) return null;\n gl.shaderSource(s, code);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n gl.deleteShader(s);\n return null;\n }\n return s;\n };\n const vs = shader(gl.VERTEX_SHADER, source.vertex);\n const fs = shader(gl.FRAGMENT_SHADER, source.fragment);\n const program = gl.createProgram();\n if (!vs || !fs || !program) return null;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n attributes.forEach((name, i) => gl.bindAttribLocation(program, i, name));\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return null;\n }\n return {\n program,\n xform: gl.getUniformLocation(program, \"u_xform\"),\n viewport: gl.getUniformLocation(program, \"u_viewport\"),\n color: gl.getUniformLocation(program, \"u_color\"),\n params: gl.getUniformLocation(program, \"u_params\"),\n };\n};\n\nexport const SOFTWARE_RENDERER =\n /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i;\n\n/** Software rasterizer (SwiftShader, llvmpipe, ...) behind the WebGL context */\nexport const isSoftwareRenderer = (gl: GlContext): boolean => {\n const info = gl.getExtension(\"WEBGL_debug_renderer_info\");\n const name = info\n ? gl.getParameter(info.UNMASKED_RENDERER_WEBGL)\n : gl.getParameter(gl.RENDERER);\n return SOFTWARE_RENDERER.test(String(name ?? \"\"));\n};\n\n/** `u_params` of an item (see the uniform layout in shaders.ts) */\nexport const itemParams = (\n item: RenderItem,\n frame: RenderFrame,\n): [number, number, number, number] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0, 0, 0];\n case \"area\":\n return [item.flat ? 1 : 0, item.opacity, 0, 0];\n case \"bar\":\n return [item.halfWidth, item.radius, item.inset, item.minHalf];\n default:\n return [item.opacity, item.stroke, 0, 0];\n }\n};\n"],"mappings":";AAeA,IAAaA,KACX,OAC4B;CAC5B,OAAO;CACP,oBAAoB;CACpB,WAAW;CACX,OAAO;CACP,SAAS;CACT,uBAAuB;CACvB,8BAA8BC;AAChC,IAGaC,KACX,GACA,GACA,MACqB;CACrB,IAAMC,KAAU,GAAc,MAAiB;EAC7C,IAAMC,IAAIC,EAAG,aAAaC,CAAI;EAQ9B,OAPKF,KACLC,EAAG,aAAaD,GAAGG,CAAI,GACvBF,EAAG,cAAcD,CAAC,GACbC,EAAG,mBAAmBD,GAAGC,EAAG,cAAc,IAIxCD,KAHLC,EAAG,aAAaD,CAAC,GACV,SALM;CAQjB,GACMI,IAAKL,EAAOE,EAAG,eAAeI,EAAO,MAAM,GAC3CC,IAAKP,EAAOE,EAAG,iBAAiBI,EAAO,QAAQ,GAC/CE,IAAUN,EAAG,cAAc;CAYjC,OAXI,CAACG,KAAM,CAACE,KAAM,CAACC,IAAgB,QACnCN,EAAG,aAAaM,GAASH,CAAE,GAC3BH,EAAG,aAAaM,GAASD,CAAE,GAC3BE,EAAW,SAAS,GAAM,MAAMP,EAAG,mBAAmBM,GAASE,GAAGC,CAAI,CAAC,GACvET,EAAG,YAAYM,CAAO,GACtBN,EAAG,aAAaG,CAAE,GAClBH,EAAG,aAAaK,CAAE,GACbL,EAAG,oBAAoBM,GAASN,EAAG,WAAW,IAI5C;EACL;EACA,OAAOA,EAAG,mBAAmBM,GAAS,SAAS;EAC/C,UAAUN,EAAG,mBAAmBM,GAAS,YAAY;EACrD,OAAON,EAAG,mBAAmBM,GAAS,SAAS;EAC/C,QAAQN,EAAG,mBAAmBM,GAAS,UAAU;CACnD,KATEN,EAAG,cAAcM,CAAO,GACjB;AASX,GAEaI,IACX,+EAGWC,KAAsB,MAA2B;CAC5D,IAAMC,IAAOZ,EAAG,aAAa,2BAA2B,GAClDS,IAAOG,IACTZ,EAAG,aAAaY,EAAK,uBAAuB,IAC5CZ,EAAG,aAAaA,EAAG,QAAQ;CAC/B,OAAOU,EAAkB,KAAK,OAAOD,KAAQ,EAAE,CAAC;AAClD,GAGaI,KACX,GACA,MACqC;CACrC,QAAQC,EAAK,MAAb;EACE,KAAK,QACH,OAAO;GAAEA,EAAK,QAAQC,EAAM,MAAO;GAAG;GAAG;GAAG;EAAC;EAC/C,KAAK,QACH,OAAO;GAAC,KAAK;GAAcD,EAAK;GAAS;GAAG;EAAC;EAC/C,KAAK,OACH,OAAO;GAACA,EAAK;GAAWA,EAAK;GAAQA,EAAK;GAAOA,EAAK;EAAO;EAC/D,SACE,OAAO;GAACA,EAAK;GAASA,EAAK;GAAQ;GAAG;EAAC;CAC3C;AACF"}
@@ -72,11 +72,12 @@ struct Out {
72
72
  let p = select(a, b, c.y > 0.5);
73
73
  let y = select(p.z, p.y, c.x > 0.5);
74
74
  out.pos = vec4f(toClip(vec2f(p.x, y)), 0.0, 1.0);
75
- out.t = c.x;
75
+ // one vertical gradient over the canvas, like Canvas2D (no per-column fade)
76
+ out.t = select((out.pos.y + 1.0) * 0.5, 1.0, u.params.x > 0.5);
76
77
  return out;
77
78
  }
78
79
  @fragment fn fs(v: Out) -> @location(0) vec4f {
79
- let a = u.color.a * u.params.y * (0.25 + 0.75 * v.t * v.t);
80
+ let a = u.color.a * u.params.y * (0.25 + 0.75 * clamp(v.t, 0.0, 1.0));
80
81
  return vec4f(u.color.rgb * a, a);
81
82
  }
82
83
  `,r=`${e}
@@ -205,12 +206,13 @@ void main() {
205
206
  vec3 p = c.y > 0.5 ? a_b : a_a;
206
207
  float y = c.x > 0.5 ? p.y : p.z;
207
208
  gl_Position = vec4(toClip(vec2(p.x, y)), 0.0, 1.0);
208
- v_t = c.x;
209
+ // one vertical gradient over the canvas, like Canvas2D (no per-column fade)
210
+ v_t = u_params.x > 0.5 ? 1.0 : (gl_Position.y + 1.0) * 0.5;
209
211
  }`,fragment:`${a}
210
212
  in float v_t;
211
213
  out vec4 outColor;
212
214
  void main() {
213
- float a = u_color.a * u_params.y * (0.25 + 0.75 * v_t * v_t);
215
+ float a = u_color.a * u_params.y * (0.25 + 0.75 * clamp(v_t, 0.0, 1.0));
214
216
  outColor = vec4(u_color.rgb * a, a);
215
217
  }`},l={vertex:`${o}
216
218
  in vec3 a_inst;
@@ -343,12 +345,13 @@ void main() {
343
345
  vec3 p = a_corner.y > 0.5 ? a_b : a_a;
344
346
  float y = a_corner.x > 0.5 ? p.y : p.z;
345
347
  gl_Position = vec4(toClip(vec2(p.x, y)), 0.0, 1.0);
346
- v_t = a_corner.x;
348
+ // one vertical gradient over the canvas, like Canvas2D (no per-column fade)
349
+ v_t = u_params.x > 0.5 ? 1.0 : (gl_Position.y + 1.0) * 0.5;
347
350
  }`,fragment:`${f}
348
351
  varying float v_t;
349
352
  varying vec4 v_color;
350
353
  void main() {
351
- float a = v_color.a * (0.25 + 0.75 * v_t * v_t);
354
+ float a = v_color.a * (0.25 + 0.75 * clamp(v_t, 0.0, 1.0));
352
355
  gl_FragColor = vec4(v_color.rgb * a, a);
353
356
  }`},h={vertex:`${d}
354
357
  attribute vec3 a_inst;