minerva-design 1.1.0 → 1.3.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 (385) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/charts/canvas.d.cts +10 -0
  3. package/dist/charts/canvas.d.ts +10 -0
  4. package/dist/charts/core.cjs +1 -1
  5. package/dist/charts/core.d.cts +8 -1
  6. package/dist/charts/core.d.ts +8 -1
  7. package/dist/charts/core.js +6 -1
  8. package/dist/charts/engine/canvas.cjs +2 -0
  9. package/dist/charts/engine/canvas.cjs.map +1 -0
  10. package/dist/charts/engine/canvas.d.cts +85 -0
  11. package/dist/charts/engine/canvas.d.ts +85 -0
  12. package/dist/charts/engine/canvas.js +177 -0
  13. package/dist/charts/engine/canvas.js.map +1 -0
  14. package/dist/charts/engine/chart.cjs +1 -2
  15. package/dist/charts/engine/chart.cjs.map +1 -1
  16. package/dist/charts/engine/chart.js +450 -489
  17. package/dist/charts/engine/chart.js.map +1 -1
  18. package/dist/charts/engine/color.cjs +1 -1
  19. package/dist/charts/engine/color.cjs.map +1 -1
  20. package/dist/charts/engine/color.d.cts +27 -0
  21. package/dist/charts/engine/color.d.ts +27 -0
  22. package/dist/charts/engine/color.js +100 -4
  23. package/dist/charts/engine/color.js.map +1 -1
  24. package/dist/charts/engine/controller.cjs +3 -0
  25. package/dist/charts/engine/controller.cjs.map +1 -0
  26. package/dist/charts/engine/controller.d.cts +188 -0
  27. package/dist/charts/engine/controller.d.ts +188 -0
  28. package/dist/charts/engine/controller.js +592 -0
  29. package/dist/charts/engine/controller.js.map +1 -0
  30. package/dist/charts/engine/curve.cjs +2 -0
  31. package/dist/charts/engine/curve.cjs.map +1 -0
  32. package/dist/charts/engine/curve.d.cts +15 -0
  33. package/dist/charts/engine/curve.d.ts +15 -0
  34. package/dist/charts/engine/curve.js +56 -0
  35. package/dist/charts/engine/curve.js.map +1 -0
  36. package/dist/charts/engine/data.cjs +1 -1
  37. package/dist/charts/engine/data.cjs.map +1 -1
  38. package/dist/charts/engine/data.d.cts +15 -2
  39. package/dist/charts/engine/data.d.ts +15 -2
  40. package/dist/charts/engine/data.js +98 -38
  41. package/dist/charts/engine/data.js.map +1 -1
  42. package/dist/charts/engine/dom.cjs +1 -1
  43. package/dist/charts/engine/dom.cjs.map +1 -1
  44. package/dist/charts/engine/dom.d.cts +5 -3
  45. package/dist/charts/engine/dom.d.ts +5 -3
  46. package/dist/charts/engine/dom.js +27 -22
  47. package/dist/charts/engine/dom.js.map +1 -1
  48. package/dist/charts/engine/items.cjs +1 -1
  49. package/dist/charts/engine/items.cjs.map +1 -1
  50. package/dist/charts/engine/items.js +132 -61
  51. package/dist/charts/engine/items.js.map +1 -1
  52. package/dist/charts/engine/model.cjs +1 -1
  53. package/dist/charts/engine/model.cjs.map +1 -1
  54. package/dist/charts/engine/model.d.cts +32 -5
  55. package/dist/charts/engine/model.d.ts +32 -5
  56. package/dist/charts/engine/model.js +226 -109
  57. package/dist/charts/engine/model.js.map +1 -1
  58. package/dist/charts/engine/overlay.cjs +1 -1
  59. package/dist/charts/engine/overlay.cjs.map +1 -1
  60. package/dist/charts/engine/overlay.d.cts +19 -1
  61. package/dist/charts/engine/overlay.d.ts +19 -1
  62. package/dist/charts/engine/overlay.js +77 -63
  63. package/dist/charts/engine/overlay.js.map +1 -1
  64. package/dist/charts/engine/presets.cjs +3 -0
  65. package/dist/charts/engine/presets.cjs.map +1 -0
  66. package/dist/charts/engine/presets.d.cts +169 -0
  67. package/dist/charts/engine/presets.d.ts +169 -0
  68. package/dist/charts/engine/presets.js +240 -0
  69. package/dist/charts/engine/presets.js.map +1 -0
  70. package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
  71. package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
  72. package/dist/charts/engine/renderers/canvas2d.d.cts +17 -1
  73. package/dist/charts/engine/renderers/canvas2d.d.ts +17 -1
  74. package/dist/charts/engine/renderers/canvas2d.js +176 -101
  75. package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
  76. package/dist/charts/engine/renderers/range.cjs +1 -1
  77. package/dist/charts/engine/renderers/range.cjs.map +1 -1
  78. package/dist/charts/engine/renderers/range.js +4 -4
  79. package/dist/charts/engine/renderers/range.js.map +1 -1
  80. package/dist/charts/engine/renderers/shaders.cjs +37 -19
  81. package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
  82. package/dist/charts/engine/renderers/shaders.d.cts +2 -2
  83. package/dist/charts/engine/renderers/shaders.d.ts +2 -2
  84. package/dist/charts/engine/renderers/shaders.js +37 -19
  85. package/dist/charts/engine/renderers/shaders.js.map +1 -1
  86. package/dist/charts/engine/renderers/types.cjs.map +1 -1
  87. package/dist/charts/engine/renderers/types.d.cts +11 -4
  88. package/dist/charts/engine/renderers/types.d.ts +11 -4
  89. package/dist/charts/engine/renderers/types.js.map +1 -1
  90. package/dist/charts/engine/renderers/webgl2.cjs +1 -1
  91. package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
  92. package/dist/charts/engine/renderers/webgl2.js +33 -12
  93. package/dist/charts/engine/renderers/webgl2.js.map +1 -1
  94. package/dist/charts/engine/renderers/webgpu.cjs +1 -1
  95. package/dist/charts/engine/renderers/webgpu.cjs.map +1 -1
  96. package/dist/charts/engine/renderers/webgpu.js +18 -15
  97. package/dist/charts/engine/renderers/webgpu.js.map +1 -1
  98. package/dist/charts/engine/scene.cjs +2 -0
  99. package/dist/charts/engine/scene.cjs.map +1 -0
  100. package/dist/charts/engine/scene.d.cts +102 -0
  101. package/dist/charts/engine/scene.d.ts +102 -0
  102. package/dist/charts/engine/scene.js +353 -0
  103. package/dist/charts/engine/scene.js.map +1 -0
  104. package/dist/charts/engine/shapes/canvas.cjs +2 -0
  105. package/dist/charts/engine/shapes/canvas.cjs.map +1 -0
  106. package/dist/charts/engine/shapes/canvas.d.cts +58 -0
  107. package/dist/charts/engine/shapes/canvas.d.ts +58 -0
  108. package/dist/charts/engine/shapes/canvas.js +159 -0
  109. package/dist/charts/engine/shapes/canvas.js.map +1 -0
  110. package/dist/charts/engine/shapes/chart.cjs +2 -0
  111. package/dist/charts/engine/shapes/chart.cjs.map +1 -0
  112. package/dist/charts/engine/shapes/chart.d.cts +6 -0
  113. package/dist/charts/engine/shapes/chart.d.ts +6 -0
  114. package/dist/charts/engine/shapes/chart.js +273 -0
  115. package/dist/charts/engine/shapes/chart.js.map +1 -0
  116. package/dist/charts/engine/shapes/draw.cjs +2 -0
  117. package/dist/charts/engine/shapes/draw.cjs.map +1 -0
  118. package/dist/charts/engine/shapes/draw.d.cts +20 -0
  119. package/dist/charts/engine/shapes/draw.d.ts +20 -0
  120. package/dist/charts/engine/shapes/draw.js +152 -0
  121. package/dist/charts/engine/shapes/draw.js.map +1 -0
  122. package/dist/charts/engine/shapes/funnel.cjs +2 -0
  123. package/dist/charts/engine/shapes/funnel.cjs.map +1 -0
  124. package/dist/charts/engine/shapes/funnel.d.cts +6 -0
  125. package/dist/charts/engine/shapes/funnel.d.ts +6 -0
  126. package/dist/charts/engine/shapes/funnel.js +149 -0
  127. package/dist/charts/engine/shapes/funnel.js.map +1 -0
  128. package/dist/charts/engine/shapes/gauge.cjs +2 -0
  129. package/dist/charts/engine/shapes/gauge.cjs.map +1 -0
  130. package/dist/charts/engine/shapes/gauge.d.cts +7 -0
  131. package/dist/charts/engine/shapes/gauge.d.ts +7 -0
  132. package/dist/charts/engine/shapes/gauge.js +173 -0
  133. package/dist/charts/engine/shapes/gauge.js.map +1 -0
  134. package/dist/charts/engine/shapes/hit.cjs +2 -0
  135. package/dist/charts/engine/shapes/hit.cjs.map +1 -0
  136. package/dist/charts/engine/shapes/hit.d.cts +28 -0
  137. package/dist/charts/engine/shapes/hit.d.ts +28 -0
  138. package/dist/charts/engine/shapes/hit.js +124 -0
  139. package/dist/charts/engine/shapes/hit.js.map +1 -0
  140. package/dist/charts/engine/shapes/index.d.cts +9 -0
  141. package/dist/charts/engine/shapes/index.d.ts +9 -0
  142. package/dist/charts/engine/shapes/layout.cjs +3 -0
  143. package/dist/charts/engine/shapes/layout.cjs.map +1 -0
  144. package/dist/charts/engine/shapes/layout.d.cts +88 -0
  145. package/dist/charts/engine/shapes/layout.d.ts +88 -0
  146. package/dist/charts/engine/shapes/layout.js +266 -0
  147. package/dist/charts/engine/shapes/layout.js.map +1 -0
  148. package/dist/charts/engine/shapes/pie.cjs +2 -0
  149. package/dist/charts/engine/shapes/pie.cjs.map +1 -0
  150. package/dist/charts/engine/shapes/pie.d.cts +20 -0
  151. package/dist/charts/engine/shapes/pie.d.ts +20 -0
  152. package/dist/charts/engine/shapes/pie.js +302 -0
  153. package/dist/charts/engine/shapes/pie.js.map +1 -0
  154. package/dist/charts/engine/shapes/radar.cjs +2 -0
  155. package/dist/charts/engine/shapes/radar.cjs.map +1 -0
  156. package/dist/charts/engine/shapes/radar.d.cts +8 -0
  157. package/dist/charts/engine/shapes/radar.d.ts +8 -0
  158. package/dist/charts/engine/shapes/radar.js +197 -0
  159. package/dist/charts/engine/shapes/radar.js.map +1 -0
  160. package/dist/charts/engine/shapes/runtime.cjs +2 -0
  161. package/dist/charts/engine/shapes/runtime.cjs.map +1 -0
  162. package/dist/charts/engine/shapes/runtime.d.cts +29 -0
  163. package/dist/charts/engine/shapes/runtime.d.ts +29 -0
  164. package/dist/charts/engine/shapes/runtime.js +97 -0
  165. package/dist/charts/engine/shapes/runtime.js.map +1 -0
  166. package/dist/charts/engine/shapes/scene.cjs +2 -0
  167. package/dist/charts/engine/shapes/scene.cjs.map +1 -0
  168. package/dist/charts/engine/shapes/scene.d.cts +257 -0
  169. package/dist/charts/engine/shapes/scene.d.ts +257 -0
  170. package/dist/charts/engine/shapes/scene.js +123 -0
  171. package/dist/charts/engine/shapes/scene.js.map +1 -0
  172. package/dist/charts/engine/shapes/treemap.cjs +2 -0
  173. package/dist/charts/engine/shapes/treemap.cjs.map +1 -0
  174. package/dist/charts/engine/shapes/treemap.d.cts +14 -0
  175. package/dist/charts/engine/shapes/treemap.d.ts +14 -0
  176. package/dist/charts/engine/shapes/treemap.js +213 -0
  177. package/dist/charts/engine/shapes/treemap.js.map +1 -0
  178. package/dist/charts/engine/shapes/types.d.cts +292 -0
  179. package/dist/charts/engine/shapes/types.d.ts +292 -0
  180. package/dist/charts/engine/signature.cjs +2 -0
  181. package/dist/charts/engine/signature.cjs.map +1 -0
  182. package/dist/charts/engine/signature.d.cts +9 -0
  183. package/dist/charts/engine/signature.d.ts +9 -0
  184. package/dist/charts/engine/signature.js +13 -0
  185. package/dist/charts/engine/signature.js.map +1 -0
  186. package/dist/charts/engine/theme.cjs +1 -1
  187. package/dist/charts/engine/theme.cjs.map +1 -1
  188. package/dist/charts/engine/theme.d.cts +35 -2
  189. package/dist/charts/engine/theme.d.ts +35 -2
  190. package/dist/charts/engine/theme.js +66 -26
  191. package/dist/charts/engine/theme.js.map +1 -1
  192. package/dist/charts/engine/types.d.cts +139 -11
  193. package/dist/charts/engine/types.d.ts +139 -11
  194. package/dist/charts/index.cjs +1 -1
  195. package/dist/charts/index.d.cts +4 -2
  196. package/dist/charts/index.d.ts +4 -2
  197. package/dist/charts/index.js +8 -2
  198. package/dist/charts/react/Chart.cjs +1 -1
  199. package/dist/charts/react/Chart.cjs.map +1 -1
  200. package/dist/charts/react/Chart.d.cts +18 -4
  201. package/dist/charts/react/Chart.d.ts +18 -4
  202. package/dist/charts/react/Chart.js +102 -41
  203. package/dist/charts/react/Chart.js.map +1 -1
  204. package/dist/charts/react/charts.cjs +1 -1
  205. package/dist/charts/react/charts.cjs.map +1 -1
  206. package/dist/charts/react/charts.d.cts +11 -3
  207. package/dist/charts/react/charts.d.ts +11 -3
  208. package/dist/charts/react/charts.js +221 -144
  209. package/dist/charts/react/charts.js.map +1 -1
  210. package/dist/charts/react/shapes.cjs +2 -0
  211. package/dist/charts/react/shapes.cjs.map +1 -0
  212. package/dist/charts/react/shapes.d.cts +255 -0
  213. package/dist/charts/react/shapes.d.ts +255 -0
  214. package/dist/charts/react/shapes.js +242 -0
  215. package/dist/charts/react/shapes.js.map +1 -0
  216. package/dist/charts/react/types.d.cts +100 -63
  217. package/dist/charts/react/types.d.ts +100 -63
  218. package/dist/native/charts/src/canvas.cjs +1 -0
  219. package/dist/native/charts/src/canvas.js +6 -0
  220. package/dist/native/charts/src/engine/axis.cjs +2 -0
  221. package/dist/native/charts/src/engine/axis.cjs.map +1 -0
  222. package/dist/native/charts/src/engine/axis.js +38 -0
  223. package/dist/native/charts/src/engine/axis.js.map +1 -0
  224. package/dist/native/charts/src/engine/canvas.cjs +1 -0
  225. package/dist/native/charts/src/engine/canvas.js +1 -0
  226. package/dist/native/charts/src/engine/color.cjs +2 -0
  227. package/dist/native/charts/src/engine/color.cjs.map +1 -0
  228. package/dist/native/charts/src/engine/color.js +139 -0
  229. package/dist/native/charts/src/engine/color.js.map +1 -0
  230. package/dist/native/charts/src/engine/controller.cjs +3 -0
  231. package/dist/native/charts/src/engine/controller.cjs.map +1 -0
  232. package/dist/native/charts/src/engine/controller.js +592 -0
  233. package/dist/native/charts/src/engine/controller.js.map +1 -0
  234. package/dist/native/charts/src/engine/curve.cjs +2 -0
  235. package/dist/native/charts/src/engine/curve.cjs.map +1 -0
  236. package/dist/native/charts/src/engine/curve.js +56 -0
  237. package/dist/native/charts/src/engine/curve.js.map +1 -0
  238. package/dist/native/charts/src/engine/data.cjs +2 -0
  239. package/dist/native/charts/src/engine/data.cjs.map +1 -0
  240. package/dist/native/charts/src/engine/data.js +164 -0
  241. package/dist/native/charts/src/engine/data.js.map +1 -0
  242. package/dist/native/charts/src/engine/decimate.cjs +2 -0
  243. package/dist/native/charts/src/engine/decimate.cjs.map +1 -0
  244. package/dist/native/charts/src/engine/decimate.js +28 -0
  245. package/dist/native/charts/src/engine/decimate.js.map +1 -0
  246. package/dist/native/charts/src/engine/format.cjs +2 -0
  247. package/dist/native/charts/src/engine/format.cjs.map +1 -0
  248. package/dist/native/charts/src/engine/format.js +34 -0
  249. package/dist/native/charts/src/engine/format.js.map +1 -0
  250. package/dist/native/charts/src/engine/layout.cjs +2 -0
  251. package/dist/native/charts/src/engine/layout.cjs.map +1 -0
  252. package/dist/native/charts/src/engine/layout.js +26 -0
  253. package/dist/native/charts/src/engine/layout.js.map +1 -0
  254. package/dist/native/charts/src/engine/model.cjs +2 -0
  255. package/dist/native/charts/src/engine/model.cjs.map +1 -0
  256. package/dist/native/charts/src/engine/model.js +292 -0
  257. package/dist/native/charts/src/engine/model.js.map +1 -0
  258. package/dist/native/charts/src/engine/overlay.cjs +2 -0
  259. package/dist/native/charts/src/engine/overlay.cjs.map +1 -0
  260. package/dist/native/charts/src/engine/overlay.js +49 -0
  261. package/dist/native/charts/src/engine/overlay.js.map +1 -0
  262. package/dist/native/charts/src/engine/presets.cjs +3 -0
  263. package/dist/native/charts/src/engine/presets.cjs.map +1 -0
  264. package/dist/native/charts/src/engine/presets.js +154 -0
  265. package/dist/native/charts/src/engine/presets.js.map +1 -0
  266. package/dist/native/charts/src/engine/scale.cjs +2 -0
  267. package/dist/native/charts/src/engine/scale.cjs.map +1 -0
  268. package/dist/native/charts/src/engine/scale.js +37 -0
  269. package/dist/native/charts/src/engine/scale.js.map +1 -0
  270. package/dist/native/charts/src/engine/scene.cjs +2 -0
  271. package/dist/native/charts/src/engine/scene.cjs.map +1 -0
  272. package/dist/native/charts/src/engine/scene.js +353 -0
  273. package/dist/native/charts/src/engine/scene.js.map +1 -0
  274. package/dist/native/charts/src/engine/spatial.cjs +2 -0
  275. package/dist/native/charts/src/engine/spatial.cjs.map +1 -0
  276. package/dist/native/charts/src/engine/spatial.js +53 -0
  277. package/dist/native/charts/src/engine/spatial.js.map +1 -0
  278. package/dist/native/charts/src/engine/theme.cjs +2 -0
  279. package/dist/native/charts/src/engine/theme.cjs.map +1 -0
  280. package/dist/native/charts/src/engine/theme.js +62 -0
  281. package/dist/native/charts/src/engine/theme.js.map +1 -0
  282. package/dist/native/charts/src/engine/time.cjs +2 -0
  283. package/dist/native/charts/src/engine/time.cjs.map +1 -0
  284. package/dist/native/charts/src/engine/time.js +189 -0
  285. package/dist/native/charts/src/engine/time.js.map +1 -0
  286. package/dist/native/charts/src/engine/viewport.cjs +2 -0
  287. package/dist/native/charts/src/engine/viewport.cjs.map +1 -0
  288. package/dist/native/charts/src/engine/viewport.js +12 -0
  289. package/dist/native/charts/src/engine/viewport.js.map +1 -0
  290. package/dist/native/components/Chart/ChartBase.cjs +2 -0
  291. package/dist/native/components/Chart/ChartBase.cjs.map +1 -0
  292. package/dist/native/components/Chart/ChartBase.d.cts +29 -0
  293. package/dist/native/components/Chart/ChartBase.d.ts +29 -0
  294. package/dist/native/components/Chart/ChartBase.js +287 -0
  295. package/dist/native/components/Chart/ChartBase.js.map +1 -0
  296. package/dist/native/components/Chart/charts.cjs +2 -0
  297. package/dist/native/components/Chart/charts.cjs.map +1 -0
  298. package/dist/native/components/Chart/charts.d.cts +19 -0
  299. package/dist/native/components/Chart/charts.d.ts +19 -0
  300. package/dist/native/components/Chart/charts.js +173 -0
  301. package/dist/native/components/Chart/charts.js.map +1 -0
  302. package/dist/native/components/Chart/index.cjs +1 -0
  303. package/dist/native/components/Chart/index.d.cts +2 -0
  304. package/dist/native/components/Chart/index.d.ts +2 -0
  305. package/dist/native/components/Chart/index.js +2 -0
  306. package/dist/native/components/Chart/measure.cjs +2 -0
  307. package/dist/native/components/Chart/measure.cjs.map +1 -0
  308. package/dist/native/components/Chart/measure.d.cts +5 -0
  309. package/dist/native/components/Chart/measure.d.ts +5 -0
  310. package/dist/native/components/Chart/measure.js +11 -0
  311. package/dist/native/components/Chart/measure.js.map +1 -0
  312. package/dist/native/components/Chart/scene.cjs +2 -0
  313. package/dist/native/components/Chart/scene.cjs.map +1 -0
  314. package/dist/native/components/Chart/scene.d.cts +41 -0
  315. package/dist/native/components/Chart/scene.d.ts +41 -0
  316. package/dist/native/components/Chart/scene.js +431 -0
  317. package/dist/native/components/Chart/scene.js.map +1 -0
  318. package/dist/native/components/Chart/theme.cjs +2 -0
  319. package/dist/native/components/Chart/theme.cjs.map +1 -0
  320. package/dist/native/components/Chart/theme.d.cts +10 -0
  321. package/dist/native/components/Chart/theme.d.ts +10 -0
  322. package/dist/native/components/Chart/theme.js +10 -0
  323. package/dist/native/components/Chart/theme.js.map +1 -0
  324. package/dist/native/components/Chart/types.d.cts +129 -0
  325. package/dist/native/components/Chart/types.d.ts +129 -0
  326. package/dist/native/index.cjs +1 -1
  327. package/dist/native/index.d.cts +1 -0
  328. package/dist/native/index.d.ts +1 -0
  329. package/dist/native/index.js +6 -4
  330. package/dist/native/manifest.d.cts +7 -0
  331. package/dist/native/manifest.d.ts +7 -0
  332. package/dist/native/source/components/Chart/ChartBase.tsx +545 -0
  333. package/dist/native/source/components/Chart/charts.tsx +291 -0
  334. package/dist/native/source/components/Chart/index.ts +8 -0
  335. package/dist/native/source/components/Chart/measure.ts +50 -0
  336. package/dist/native/source/components/Chart/scene.tsx +1021 -0
  337. package/dist/native/source/components/Chart/theme.ts +16 -0
  338. package/dist/native/source/components/Chart/types.ts +194 -0
  339. package/dist/native/source/index.ts +1 -0
  340. package/dist/native/source/manifest.ts +14 -0
  341. package/dist/taro/charts.d.ts +144 -0
  342. package/dist/taro/index.d.ts +1 -0
  343. package/dist/taro/index.js +3544 -618
  344. package/dist/uni/BarChart.vue +75 -0
  345. package/dist/uni/BarChart.vue.d.ts +111 -0
  346. package/dist/uni/Chart.vue +68 -0
  347. package/dist/uni/Chart.vue.d.ts +100 -0
  348. package/dist/uni/LineChart.vue +75 -0
  349. package/dist/uni/LineChart.vue.d.ts +111 -0
  350. package/dist/uni/ProgressIndicator.vue.d.ts +1 -1
  351. package/dist/uni/QuadrantChart.vue +184 -0
  352. package/dist/uni/QuadrantChart.vue.d.ts +173 -0
  353. package/dist/uni/ScatterChart.vue +69 -0
  354. package/dist/uni/ScatterChart.vue.d.ts +100 -0
  355. package/dist/uni/chart-canvas.d.ts +68 -0
  356. package/dist/uni/chart-canvas.js +363 -0
  357. package/dist/uni/chart-types.d.ts +135 -0
  358. package/dist/uni/chart-types.js +84 -0
  359. package/dist/uni/charts-canvas.d.ts +1 -0
  360. package/dist/uni/charts-canvas.js +10 -0
  361. package/dist/uni/index.d.ts +6 -0
  362. package/dist/uni/index.js +6 -0
  363. package/dist/weapp/bar-chart/index.js +1 -0
  364. package/dist/weapp/bar-chart/index.json +1 -0
  365. package/dist/weapp/bar-chart/index.wxml +1 -0
  366. package/dist/weapp/bar-chart/index.wxss +1 -0
  367. package/dist/weapp/chart/index.js +1 -0
  368. package/dist/weapp/chart/index.json +1 -0
  369. package/dist/weapp/chart/index.wxml +1 -0
  370. package/dist/weapp/chart/index.wxss +1 -0
  371. package/dist/weapp/controls.js +4760 -266
  372. package/dist/weapp/line-chart/index.js +1 -0
  373. package/dist/weapp/line-chart/index.json +1 -0
  374. package/dist/weapp/line-chart/index.wxml +1 -0
  375. package/dist/weapp/line-chart/index.wxss +1 -0
  376. package/dist/weapp/quadrant-chart/index.js +1 -0
  377. package/dist/weapp/quadrant-chart/index.json +1 -0
  378. package/dist/weapp/quadrant-chart/index.wxml +1 -0
  379. package/dist/weapp/quadrant-chart/index.wxss +1 -0
  380. package/dist/weapp/scatter-chart/index.js +1 -0
  381. package/dist/weapp/scatter-chart/index.json +1 -0
  382. package/dist/weapp/scatter-chart/index.wxml +1 -0
  383. package/dist/weapp/scatter-chart/index.wxss +1 -0
  384. package/dist/weapp/types.d.ts +295 -0
  385. package/package.json +21 -1
@@ -0,0 +1,34 @@
1
+ import { stepDecimals as e } from "./scale.js";
2
+ //#region ../charts/src/engine/format.ts
3
+ var t = [
4
+ [0xe8d4a51000, "T"],
5
+ [1e9, "B"],
6
+ [1e6, "M"],
7
+ [1e3, "k"]
8
+ ], n = (e) => e.includes(".") ? e.replace(/\.?0+$/, "") : e, r = (r, i = 2) => {
9
+ if (!Number.isFinite(r)) return String(r);
10
+ if (Object.is(r, -0) || r === 0) return "0";
11
+ let a = Math.abs(r);
12
+ for (let [e, o] of t) if (a >= e) return n((r / e).toFixed(i)) + o;
13
+ if (a < 1e-4) return r.toExponential(1);
14
+ let o = Math.min(6, Math.max(i, e(a) + 2));
15
+ return n(r.toFixed(o));
16
+ }, i = (n, i) => {
17
+ if (i >= 1e4) {
18
+ let a = t.find(([e]) => i >= e)?.[0] ?? 1, o = Math.min(3, e(n / a));
19
+ return (e) => r(e, o);
20
+ }
21
+ let a = e(n);
22
+ return (e) => {
23
+ let t = e.toFixed(a);
24
+ return /^-0(\.0*)?$/.test(t) ? t.slice(1) : t;
25
+ };
26
+ }, a = (e) => {
27
+ if (!Number.isFinite(e)) return "–";
28
+ let t = Math.abs(e);
29
+ return t >= 1e6 ? r(e, 2) : Number.isInteger(e) ? e.toLocaleString("en-US") : n(e.toFixed(t >= 100 ? 2 : t >= 1 ? 3 : 4));
30
+ };
31
+ //#endregion
32
+ export { r as formatCompact, a as formatValue, i as tickFormatter };
33
+
34
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","names":["UNITS","trim","text","formatCompact","value","abs","unit","suffix","maxDecimals","decimals","stepDecimals","tickFormatter","maxAbs","u","step","formatValue"],"sources":["../../../../../../charts/src/engine/format.ts"],"sourcesContent":["// Number formatting of tick labels and tooltip values.\n\nimport { stepDecimals } from \"./scale\";\n\nconst UNITS: readonly [number, string][] = [\n [1e12, \"T\"],\n [1e9, \"B\"],\n [1e6, \"M\"],\n [1e3, \"k\"],\n];\n\nconst trim = (text: string) =>\n text.includes(\".\") ? text.replace(/\\.?0+$/, \"\") : text;\n\n/** `1234567` -> `1.23M`, `0.5` -> `0.5`; `-0` is printed as `0` */\nexport const formatCompact = (value: number, maxDecimals = 2): string => {\n if (!Number.isFinite(value)) return String(value);\n if (Object.is(value, -0) || value === 0) return \"0\";\n const abs = Math.abs(value);\n for (const [unit, suffix] of UNITS) {\n if (abs >= unit) return trim((value / unit).toFixed(maxDecimals)) + suffix;\n }\n if (abs < 1e-4) return value.toExponential(1);\n const decimals = Math.min(6, Math.max(maxDecimals, stepDecimals(abs) + 2));\n return trim(value.toFixed(decimals));\n};\n\n/**\n * Formatter of the ticks of a linear axis: enough decimals to tell the\n * ticks apart; compact units (k, M, ...) when the values are large.\n */\nexport const tickFormatter = (step: number, maxAbs: number) => {\n if (maxAbs >= 1e4) {\n const unit = UNITS.find(([u]) => maxAbs >= u)?.[0] ?? 1;\n const decimals = Math.min(3, stepDecimals(step / unit));\n return (value: number) => formatCompact(value, decimals);\n }\n const decimals = stepDecimals(step);\n return (value: number) => {\n const text = value.toFixed(decimals);\n return /^-0(\\.0*)?$/.test(text) ? text.slice(1) : text;\n };\n};\n\n/** Value of a tooltip: up to 4 significant decimals */\nexport const formatValue = (value: number): string => {\n if (!Number.isFinite(value)) return \"–\";\n const abs = Math.abs(value);\n if (abs >= 1e6) return formatCompact(value, 2);\n if (Number.isInteger(value)) return value.toLocaleString(\"en-US\");\n return trim(value.toFixed(abs >= 100 ? 2 : abs >= 1 ? 3 : 4));\n};\n"],"mappings":";;AAIA,IAAMA,IAAqC;CACzC,CAAC,cAAM,GAAG;CACV,CAAC,KAAK,GAAG;CACT,CAAC,KAAK,GAAG;CACT,CAAC,KAAK,GAAG;AACX,GAEMC,KAAQ,MACZC,EAAK,SAAS,GAAG,IAAIA,EAAK,QAAQ,UAAU,EAAE,IAAIA,GAGvCC,KAAiB,GAAe,IAAc,MAAc;CACvE,IAAI,CAAC,OAAO,SAASC,CAAK,GAAG,OAAO,OAAOA,CAAK;CAChD,IAAI,OAAO,GAAGA,GAAO,EAAE,KAAKA,MAAU,GAAG,OAAO;CAChD,IAAMC,IAAM,KAAK,IAAID,CAAK;CAC1B,KAAK,IAAM,CAACE,GAAMC,MAAWP,GAC3B,IAAIK,KAAOC,GAAM,OAAOL,GAAMG,IAAQE,EAAA,CAAM,QAAQE,CAAW,CAAC,IAAID;CAEtE,IAAIF,IAAM,MAAM,OAAOD,EAAM,cAAc,CAAC;CAC5C,IAAMK,IAAW,KAAK,IAAI,GAAG,KAAK,IAAID,GAAaE,EAAaL,CAAG,IAAI,CAAC,CAAC;CACzE,OAAOJ,EAAKG,EAAM,QAAQK,CAAQ,CAAC;AACrC,GAMaE,KAAiB,GAAc,MAAmB;CAC7D,IAAIC,KAAU,KAAK;EACjB,IAAMN,IAAON,EAAM,MAAM,CAACa,OAAOD,KAAUC,CAAC,CAAC,GAAG,MAAM,GAChDJ,IAAW,KAAK,IAAI,GAAGC,EAAaI,IAAOR,CAAI,CAAC;EACtD,QAAQ,MAAkBH,EAAcC,GAAOK,CAAQ;CACzD;CACA,IAAMA,IAAWC,EAAaI,CAAI;CAClC,QAAQ,MAAkB;EACxB,IAAMZ,IAAOE,EAAM,QAAQK,CAAQ;EACnC,OAAO,cAAc,KAAKP,CAAI,IAAIA,EAAK,MAAM,CAAC,IAAIA;CACpD;AACF,GAGaa,KAAe,MAA0B;CACpD,IAAI,CAAC,OAAO,SAASX,CAAK,GAAG,OAAO;CACpC,IAAMC,IAAM,KAAK,IAAID,CAAK;CAG1B,OAFIC,KAAO,MAAYF,EAAcC,GAAO,CAAC,IACzC,OAAO,UAAUA,CAAK,IAAUA,EAAM,eAAe,OAAO,IACzDH,EAAKG,EAAM,QAAQC,KAAO,MAAM,IAAIA,KAAO,IAAI,IAAI,CAAC,CAAC;AAC9D"}
@@ -0,0 +1,2 @@
1
+ var e=(e,t,n,r)=>{let[i,a]=t.x,[o,s]=t.y,c=e.width/(a-i||1),l=e.height/(s-o||1),u=e.x,d=e.x+e.width,f=e.y,p=e.y+e.height;return{plot:e,view:t,xToPx:n?e=>d-(e-i)*c:e=>u+(e-i)*c,yToPx:r?e=>f+(e-o)*l:e=>p-(e-o)*l,pxToX:n?e=>i+(d-e)/c:e=>i+(e-u)/c,pxToY:r?e=>o+(e-f)/l:e=>o+(p-e)/l,xPerPx:1/c,yPerPx:1/l}},t=e=>{let{width:t,height:n,padding:r,fontSize:i}=e,a=Math.ceil(i*1.4),o=r.left+(e.yLabelWidth>0?e.yLabelWidth+8:0)+(e.yTitle?a+6:0),s=r.bottom+(e.xAxisVisible?a+8:0)+(e.xTitle?a+4:0),c=r.top,l=r.right;return{x:Math.round(o),y:Math.round(c),width:Math.max(10,Math.round(t-o-l)),height:Math.max(10,Math.round(n-c-s))}};exports.computePlot=t,exports.createScales=e;
2
+ //# sourceMappingURL=layout.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.cjs","names":["createScales","x0","x1","view","y0","y1","xs","plot","ys","left","right","top","bottom","reverseX","v","reverseY","p","computePlot","input","line","fontSize","padding","width","height"],"sources":["../../../../../../charts/src/engine/layout.ts"],"sourcesContent":["// Plot rectangle and data <-> pixel mappings (CSS pixels of the stage).\n\nimport type { ChartView } from \"./types\";\n\nexport interface Rect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface Scales {\n plot: Rect;\n view: ChartView;\n xToPx(value: number): number;\n yToPx(value: number): number;\n pxToX(px: number): number;\n pxToY(px: number): number;\n /** Data units per CSS pixel */\n xPerPx: number;\n yPerPx: number;\n}\n\nexport const createScales = (\n plot: Rect,\n view: ChartView,\n reverseX: boolean,\n reverseY: boolean,\n): Scales => {\n const [x0, x1] = view.x;\n const [y0, y1] = view.y;\n const xs = plot.width / (x1 - x0 || 1);\n const ys = plot.height / (y1 - y0 || 1);\n const left = plot.x;\n const right = plot.x + plot.width;\n const top = plot.y;\n const bottom = plot.y + plot.height;\n return {\n plot,\n view,\n xToPx: reverseX\n ? (v) => right - (v - x0) * xs\n : (v) => left + (v - x0) * xs,\n yToPx: reverseY\n ? (v) => top + (v - y0) * ys\n : (v) => bottom - (v - y0) * ys,\n pxToX: reverseX\n ? (p) => x0 + (right - p) / xs\n : (p) => x0 + (p - left) / xs,\n pxToY: reverseY\n ? (p) => y0 + (p - top) / ys\n : (p) => y0 + (bottom - p) / ys,\n xPerPx: 1 / xs,\n yPerPx: 1 / ys,\n };\n};\n\nexport interface LayoutInput {\n width: number;\n height: number;\n padding: { top: number; right: number; bottom: number; left: number };\n /** Width of the widest y tick label (0 when the axis is hidden) */\n yLabelWidth: number;\n xAxisVisible: boolean;\n xTitle: boolean;\n yTitle: boolean;\n fontSize: number;\n}\n\n/** Room for the axes, then the plot area */\nexport const computePlot = (input: LayoutInput): Rect => {\n const { width, height, padding, fontSize } = input;\n const line = Math.ceil(fontSize * 1.4);\n const left =\n padding.left +\n (input.yLabelWidth > 0 ? input.yLabelWidth + 8 : 0) +\n (input.yTitle ? line + 6 : 0);\n const bottom =\n padding.bottom +\n (input.xAxisVisible ? line + 8 : 0) +\n (input.xTitle ? line + 4 : 0);\n const top = padding.top;\n const right = padding.right;\n return {\n x: Math.round(left),\n y: Math.round(top),\n width: Math.max(10, Math.round(width - left - right)),\n height: Math.max(10, Math.round(height - top - bottom)),\n };\n};\n"],"mappings":"AAuBA,IAAaA,GACX,EACA,EACA,EACA,IACW,CACX,GAAM,CAACC,EAAIC,GAAMC,EAAK,EAChB,CAACC,EAAIC,GAAMF,EAAK,EAChBG,EAAKC,EAAK,OAASL,EAAKD,GAAM,GAC9BO,EAAKD,EAAK,QAAUF,EAAKD,GAAM,GAC/BK,EAAOF,EAAK,EACZG,EAAQH,EAAK,EAAIA,EAAK,MACtBI,EAAMJ,EAAK,EACXK,EAASL,EAAK,EAAIA,EAAK,OAC7B,MAAO,CACL,OACA,OACA,MAAOM,EACF,GAAMH,GAASI,EAAIb,GAAMK,EACzB,GAAMG,GAAQK,EAAIb,GAAMK,EAC7B,MAAOS,EACF,GAAMJ,GAAOG,EAAIV,GAAMI,EACvB,GAAMI,GAAUE,EAAIV,GAAMI,EAC/B,MAAOK,EACF,GAAMZ,GAAMS,EAAQM,GAAKV,EACzB,GAAML,GAAMe,EAAIP,GAAQH,EAC7B,MAAOS,EACF,GAAMX,GAAMY,EAAIL,GAAOH,EACvB,GAAMJ,GAAMQ,EAASI,GAAKR,EAC/B,OAAQ,EAAIF,EACZ,OAAQ,EAAIE,CACd,CACF,EAeaS,EAAe,GAA6B,CACvD,GAAM,CAAE,QAAO,SAAQ,UAAS,YAAaC,EACvCC,EAAO,KAAK,KAAKC,EAAW,GAAG,EAC/BX,EACJY,EAAQ,MACPH,EAAM,YAAc,EAAIA,EAAM,YAAc,EAAI,IAChDA,EAAM,OAASC,EAAO,EAAI,GACvBP,EACJS,EAAQ,QACPH,EAAM,aAAeC,EAAO,EAAI,IAChCD,EAAM,OAASC,EAAO,EAAI,GACvBR,EAAMU,EAAQ,IACdX,EAAQW,EAAQ,MACtB,MAAO,CACL,EAAG,KAAK,MAAMZ,CAAI,EAClB,EAAG,KAAK,MAAME,CAAG,EACjB,MAAO,KAAK,IAAI,GAAI,KAAK,MAAMW,EAAQb,EAAOC,CAAK,CAAC,EACpD,OAAQ,KAAK,IAAI,GAAI,KAAK,MAAMa,EAASZ,EAAMC,CAAM,CAAC,CACxD,CACF"}
@@ -0,0 +1,26 @@
1
+ //#region ../charts/src/engine/layout.ts
2
+ var e = (e, t, n, r) => {
3
+ let [i, a] = t.x, [o, s] = t.y, c = e.width / (a - i || 1), l = e.height / (s - o || 1), u = e.x, d = e.x + e.width, f = e.y, p = e.y + e.height;
4
+ return {
5
+ plot: e,
6
+ view: t,
7
+ xToPx: n ? (e) => d - (e - i) * c : (e) => u + (e - i) * c,
8
+ yToPx: r ? (e) => f + (e - o) * l : (e) => p - (e - o) * l,
9
+ pxToX: n ? (e) => i + (d - e) / c : (e) => i + (e - u) / c,
10
+ pxToY: r ? (e) => o + (e - f) / l : (e) => o + (p - e) / l,
11
+ xPerPx: 1 / c,
12
+ yPerPx: 1 / l
13
+ };
14
+ }, t = (e) => {
15
+ let { width: t, height: n, padding: r, fontSize: i } = e, a = Math.ceil(i * 1.4), o = r.left + (e.yLabelWidth > 0 ? e.yLabelWidth + 8 : 0) + (e.yTitle ? a + 6 : 0), s = r.bottom + (e.xAxisVisible ? a + 8 : 0) + (e.xTitle ? a + 4 : 0), c = r.top, l = r.right;
16
+ return {
17
+ x: Math.round(o),
18
+ y: Math.round(c),
19
+ width: Math.max(10, Math.round(t - o - l)),
20
+ height: Math.max(10, Math.round(n - c - s))
21
+ };
22
+ };
23
+ //#endregion
24
+ export { t as computePlot, e as createScales };
25
+
26
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","names":["createScales","x0","x1","view","y0","y1","xs","plot","ys","left","right","top","bottom","reverseX","v","reverseY","p","computePlot","input","line","fontSize","padding","width","height"],"sources":["../../../../../../charts/src/engine/layout.ts"],"sourcesContent":["// Plot rectangle and data <-> pixel mappings (CSS pixels of the stage).\n\nimport type { ChartView } from \"./types\";\n\nexport interface Rect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface Scales {\n plot: Rect;\n view: ChartView;\n xToPx(value: number): number;\n yToPx(value: number): number;\n pxToX(px: number): number;\n pxToY(px: number): number;\n /** Data units per CSS pixel */\n xPerPx: number;\n yPerPx: number;\n}\n\nexport const createScales = (\n plot: Rect,\n view: ChartView,\n reverseX: boolean,\n reverseY: boolean,\n): Scales => {\n const [x0, x1] = view.x;\n const [y0, y1] = view.y;\n const xs = plot.width / (x1 - x0 || 1);\n const ys = plot.height / (y1 - y0 || 1);\n const left = plot.x;\n const right = plot.x + plot.width;\n const top = plot.y;\n const bottom = plot.y + plot.height;\n return {\n plot,\n view,\n xToPx: reverseX\n ? (v) => right - (v - x0) * xs\n : (v) => left + (v - x0) * xs,\n yToPx: reverseY\n ? (v) => top + (v - y0) * ys\n : (v) => bottom - (v - y0) * ys,\n pxToX: reverseX\n ? (p) => x0 + (right - p) / xs\n : (p) => x0 + (p - left) / xs,\n pxToY: reverseY\n ? (p) => y0 + (p - top) / ys\n : (p) => y0 + (bottom - p) / ys,\n xPerPx: 1 / xs,\n yPerPx: 1 / ys,\n };\n};\n\nexport interface LayoutInput {\n width: number;\n height: number;\n padding: { top: number; right: number; bottom: number; left: number };\n /** Width of the widest y tick label (0 when the axis is hidden) */\n yLabelWidth: number;\n xAxisVisible: boolean;\n xTitle: boolean;\n yTitle: boolean;\n fontSize: number;\n}\n\n/** Room for the axes, then the plot area */\nexport const computePlot = (input: LayoutInput): Rect => {\n const { width, height, padding, fontSize } = input;\n const line = Math.ceil(fontSize * 1.4);\n const left =\n padding.left +\n (input.yLabelWidth > 0 ? input.yLabelWidth + 8 : 0) +\n (input.yTitle ? line + 6 : 0);\n const bottom =\n padding.bottom +\n (input.xAxisVisible ? line + 8 : 0) +\n (input.xTitle ? line + 4 : 0);\n const top = padding.top;\n const right = padding.right;\n return {\n x: Math.round(left),\n y: Math.round(top),\n width: Math.max(10, Math.round(width - left - right)),\n height: Math.max(10, Math.round(height - top - bottom)),\n };\n};\n"],"mappings":";AAuBA,IAAaA,KACX,GACA,GACA,GACA,MACW;CACX,IAAM,CAACC,GAAIC,KAAMC,EAAK,GAChB,CAACC,GAAIC,KAAMF,EAAK,GAChBG,IAAKC,EAAK,SAASL,IAAKD,KAAM,IAC9BO,IAAKD,EAAK,UAAUF,IAAKD,KAAM,IAC/BK,IAAOF,EAAK,GACZG,IAAQH,EAAK,IAAIA,EAAK,OACtBI,IAAMJ,EAAK,GACXK,IAASL,EAAK,IAAIA,EAAK;CAC7B,OAAO;EACL;EACA;EACA,OAAOM,KACF,MAAMH,KAASI,IAAIb,KAAMK,KACzB,MAAMG,KAAQK,IAAIb,KAAMK;EAC7B,OAAOS,KACF,MAAMJ,KAAOG,IAAIV,KAAMI,KACvB,MAAMI,KAAUE,IAAIV,KAAMI;EAC/B,OAAOK,KACF,MAAMZ,KAAMS,IAAQM,KAAKV,KACzB,MAAML,KAAMe,IAAIP,KAAQH;EAC7B,OAAOS,KACF,MAAMX,KAAMY,IAAIL,KAAOH,KACvB,MAAMJ,KAAMQ,IAASI,KAAKR;EAC/B,QAAQ,IAAIF;EACZ,QAAQ,IAAIE;CACd;AACF,GAeaS,KAAe,MAA6B;CACvD,IAAM,EAAE,UAAO,WAAQ,YAAS,gBAAaC,GACvCC,IAAO,KAAK,KAAKC,IAAW,GAAG,GAC/BX,IACJY,EAAQ,QACPH,EAAM,cAAc,IAAIA,EAAM,cAAc,IAAI,MAChDA,EAAM,SAASC,IAAO,IAAI,IACvBP,IACJS,EAAQ,UACPH,EAAM,eAAeC,IAAO,IAAI,MAChCD,EAAM,SAASC,IAAO,IAAI,IACvBR,IAAMU,EAAQ,KACdX,IAAQW,EAAQ;CACtB,OAAO;EACL,GAAG,KAAK,MAAMZ,CAAI;EAClB,GAAG,KAAK,MAAME,CAAG;EACjB,OAAO,KAAK,IAAI,IAAI,KAAK,MAAMW,IAAQb,IAAOC,CAAK,CAAC;EACpD,QAAQ,KAAK,IAAI,IAAI,KAAK,MAAMa,IAASZ,IAAMC,CAAM,CAAC;CACxD;AACF"}
@@ -0,0 +1,2 @@
1
+ const e=require("./color.cjs"),t=require("./data.cjs"),n=require("./scale.cjs"),r=require("./spatial.cjs");var i=e=>{if(typeof e==`object`&&e&&!(`length`in e)){let t=e.x;return t&&t.length?t[0]:void 0}let t=e;for(let e=0;e<Math.min(t.length,8);e++){let n=t[e];if(Array.isArray(n))return n[0];if(n&&typeof n==`object`)return n.x}},a=e=>{for(let t of e){let e=i(t);if(e instanceof Date)return`time`;if(typeof e==`string`)return`category`}return`linear`},o=(e,t,n,r)=>({type:t,reverse:!!e?.reverse,categories:n,title:e?.title,format:e?.format,grid:e?.grid??r,visible:e?.visible??!0,tickCount:e?.tickCount}),s=e=>{let t=1/0,n=-1/0;for(let r=0;r<e.length;r++){let i=e[r];Number.isFinite(i)&&(i<t&&(t=i),i>n&&(n=i))}return[t,n]},c=(e,t)=>{let n=1/0;return e.forEach((e,r)=>{let i=t[r]?e:Float64Array.from(e).sort();for(let e=1;e<i.length;e++){let t=i[e]-i[e-1];t>0&&t<n&&(n=t)}}),n},l=(e,t,n)=>{if(n)return 1;let r=c(e.map(e=>t===`x`?e.cols.x:e.cols.y),e.map(e=>t===`x`&&e.cols.sorted));return Number.isFinite(r)?r:1},u=(e,t)=>{let n=new Map;if(t)for(let{s:t,stack:r}of e){let e=n.get(r);e||n.set(r,e=new Map);let{x:i,y:a,count:o}=t.cols;for(let t=0;t<o;t++){let n=a[t];if(!Number.isFinite(n))continue;let r=e.get(i[t])??[0,0];n>=0?r[0]+=n:r[1]-=n,e.set(i[t],r)}}let r=new Map,i=new Map;for(let{stack:t}of e)i.set(t,(i.get(t)??0)+1);return e.map(({s:e,stack:a})=>{let{x:o,y:s,count:c}=e.cols;if(!t&&i.get(a)===1){let e=new Float64Array(c),t=new Float64Array(c);for(let n=0;n<c;n++){let r=s[n],i=Number.isFinite(r);e[n]=i?0:NaN,t[n]=i?r:NaN}return{base:e,top:t}}let l=r.get(a);l||r.set(a,l=new Map);let u=n.get(a),d=new Float64Array(c),f=new Float64Array(c);for(let e=0;e<c;e++){let t=s[e];if(!Number.isFinite(t)){d[e]=NaN,f[e]=NaN;continue}if(u){let n=u.get(o[e]),r=n?t>=0?n[0]:n[1]:0;t=r>0?t/r*100:0}let n=l.get(o[e])??[0,0],r=t>=0?n[0]:n[1];d[e]=r,f[e]=r+t,t>=0?n[0]+=t:n[1]+=t,l.set(o[e],n)}return{base:d,top:f}})},d=`var(--success-color, #16a34a)`,f=`var(--danger-color, #dc2626)`,p=(r,i,c,p,m=null)=>{let h=m??i.resolve??((t,n)=>e.resolveStaticColor(t,{},n)),g=r.series,_=g.map(e=>e.data),v=r.xAxis?.type??a(_),y=v===`category`?[...r.xAxis?.categories??t.collectCategories(_)]:[],b=new Map(y.map((e,t)=>[e,t])),x=t.xResolver(v,e=>b.get(e)??NaN),S=r.yAxis,C=g.filter(e=>e.type===`heatmap`).map(e=>e.data),w=S?.type===`category`||!S?.type&&C.length?[...S?.categories??t.collectYCategories(C)]:[],T=S?.type===`category`||w.length?`category`:S?.type===`time`?`time`:`linear`,E=new Map(w.map((e,t)=>[e,t])),D=e=>typeof e==`number`?e:typeof e==`string`?T===`category`?E.get(e)??NaN:Number(e):NaN,O=`${v}|${y.join(``)}|${T}|${w.join(``)}`,k=r.stackMode===`percent`,A=new Set,j=g.map((n,r)=>{let a=n.id??`#${r}`;for(;A.has(a);)a+=`'`;A.add(a);let o=p.get(a);(!o||o.data!==n.data||o.resolverKey!==O)&&(o={data:n.data,resolverKey:O,cols:t.normalizeData(n.data,x,D)},p.set(a,o));let s=n.type??`line`,l=i.palette[r%i.palette.length],u=n.color?h(n.color,l):l,m=o.cols,g=null;if((s===`scatter`||s===`bar`)&&m.colors){let e=new Map;g=m.colors.map(t=>{if(t===void 0)return;let n=e.get(t);return n||e.set(t,n=h(t,u)),n})}let _=[],v=[0,1],y=null;if(s===`heatmap`){_=n.colorScale&&n.colorScale.length?n.colorScale.map(e=>h(e,u)):[e.mix(i.background,u,.08),u],v=n.valueRange?[n.valueRange[0],n.valueRange[1]]:[m.valueMin,m.valueMax],Number.isFinite(v[0])||(v=[0,1]);let t=m.value??m.y,[r,a]=v,o=a-r||1;y=new Uint32Array(m.count);for(let n=0;n<m.count;n++){let i=t[n];Number.isFinite(i)&&Number.isFinite(m.y[n])&&(y[n]=e.packColor(e.rampColor(_,(i-r)/o)))}}let b=n.id??String(r);return{index:r,key:a,id:b,name:n.name??`Series ${r+1}`,type:s,color:u,colorCss:e.toCss(u),lineWidth:n.lineWidth??(s===`candlestick`?1:2),pointSize:n.pointSize??8,opacity:n.opacity??(s===`area`?.28:s===`scatter`?.78:1),hidden:!!n.hidden||c.has(b),showLabels:!!n.showLabels,curve:n.curve??`linear`,cols:m,barOffset:0,barHalfWidth:0,barBase:null,barTop:null,stackBase:null,stackTop:null,pointColors:g,upColor:s===`candlestick`?h(n.upColor??d,[.09,.64,.29,1]):u,downColor:s===`candlestick`?h(n.downColor??f,[.86,.15,.15,1]):u,cellColors:y,cellHalf:{x:.5,y:.5},colorScale:_,valueRange:v,radius:n.radius??(s===`heatmap`?2:3),format:n.format}}),M=j.filter(e=>!e.hidden),N=j.length>0&&j.every(e=>e.type===`scatter`||e.type===`heatmap`),P=M.filter(e=>e.type===`bar`),F=l(P,`x`,v===`category`);if(P.length){let e=new Map,t=e=>g[e.index].stack??`\u0000${e.key}`;for(let n of P)e.has(t(n))||e.set(t(n),e.size);let n=F*(e.size>1?.78:.62),r=n/e.size,i=u(P.map(e=>({s:e,stack:t(e)})),!1),a=k?u(P.filter(e=>g[e.index].stack!==void 0).map(e=>({s:e,stack:t(e)})),!0):[],o=0;P.forEach((s,c)=>{let l=e.get(t(s))??0;s.barOffset=-n/2+r*(l+.5),s.barHalfWidth=r/2*(e.size>1?.86:1);let u=k&&g[s.index].stack!==void 0?a[o++]:i[c];s.barBase=u.base,s.barTop=u.top})}let I=M.filter(e=>(e.type===`line`||e.type===`area`)&&g[e.index].stack!==void 0);if(I.length){let e=u(I.map(e=>({s:e,stack:g[e.index].stack??``})),k);I.forEach((t,n)=>{t.stackBase=e[n].base,t.stackTop=e[n].top})}let L=M.filter(e=>e.type===`candlestick`),R=l(L,`x`,v===`category`);for(let e of L)e.barHalfWidth=R*.3;let z=M.filter(e=>e.type===`heatmap`);if(z.length){let e=l(z,`x`,v===`category`)/2,t=l(z,`y`,T===`category`)/2;for(let n of z)n.cellHalf={x:e,y:t}}let B=r.xAxis,V;if(v===`category`)V=[-.5,Math.max(1,y.length)-.5];else{let e=[];for(let t of M){e.push(t.cols.xMin,t.cols.xMax);let n=t.type===`bar`?F/2:t.type===`candlestick`?R/2:t.type===`heatmap`?t.cellHalf.x:0;n&&e.push(t.cols.xMin-n,t.cols.xMax+n)}V=n.ensureSpan(...s(e),v===`time`?[Date.now()-864e5,Date.now()]:[0,1]);let t=j.every(e=>e.type===`scatter`);if(t){let e=(V[1]-V[0])*.04;V=[V[0]-e,V[1]+e]}(B?.nice??(t&&v===`linear`))&&v===`linear`&&(V=n.niceDomain(V[0],V[1],B?.tickCount??6))}B?.min!==void 0&&(V[0]=B.min),B?.max!==void 0&&(V[1]=B.max),V=n.ensureSpan(V[0],V[1]);let H;if(T===`category`)H=[-.5,Math.max(1,w.length)-.5];else{let e=[];for(let t of M)t.type===`bar`&&t.barBase&&t.barTop?e.push(...s(t.barBase),...s(t.barTop)):t.stackBase&&t.stackTop?e.push(...s(t.stackBase),...s(t.stackTop)):t.type===`heatmap`?e.push(t.cols.yMin-t.cellHalf.y,t.cols.yMax+t.cellHalf.y):e.push(t.cols.yMin,t.cols.yMax);let t=P.length>0||M.some(e=>e.type===`area`);if((P.length||S?.zero)&&e.push(0),P.some(e=>e.showLabels)){let[t,n]=s(e);n>0&&e.push(n+(n-Math.min(0,t))*.1),t<0&&e.push(t-(Math.max(0,n)-t)*.1)}if(H=n.ensureSpan(...s(e)),j.every(e=>e.type===`scatter`)){let e=(H[1]-H[0])*.06;H=[H[0]-e,H[1]+e]}else if(L.length&&!P.length){let e=(H[1]-H[0])*.04;H=[H[0]-e,H[1]+e]}(S?.nice??!z.length)&&T===`linear`&&(H=n.niceDomain(H[0],H[1],S?.tickCount??5)),k&&(P.length||I.length)&&(H=[s(e)[0]<0?-100:0,100]),t&&!S?.zero&&H[0]<0&&s(e)[0]>=0&&(H[0]=0)}S?.min!==void 0&&(H[0]=S.min),S?.max!==void 0&&(H[1]=S.max),H=n.ensureSpan(H[0],H[1]);let U=r.interaction===!1?!1:r.interaction===!0||r.interaction===void 0?!0:r.interaction.zoom??!0,W=U===!1?{x:!1,y:!1}:U===!0?{x:!0,y:N}:{x:U.includes(`x`),y:U.includes(`y`)},G=typeof r.tooltip==`object`?r.tooltip:void 0,K=S?.format??(k&&(P.length||I.length)?e=>`${+e.toFixed(1)}%`:void 0);return{series:j,x:o(B,v,y,!1),y:{...o(S,T,w,T!==`category`),format:K},base:{x:V,y:H},allScatter:N,zoom:W,tooltipMode:G?.mode??(N?`nearest`:`axis`),baseline:Math.min(Math.max(0,H[0]),H[1]),minSpan:{x:v===`category`?1:(V[1]-V[0])*1e-7,y:T===`category`?1:(H[1]-H[0])*1e-7},percent:k,stacks:g.map(e=>e.stack!==void 0&&(e.type===`bar`||e.type===`line`||e.type===`area`||!e.type)?`${e.type===`bar`?`bar`:`line`}:${e.stack}`:null)}},m=(e,t)=>e.barTop?e.barTop[t]:e.stackTop?e.stackTop[t]:e.cols.y[t],h=new WeakMap,g=e=>{let t=h.get(e.cols);return t||(t=new r.GridIndex(e.cols.x,e.cols.y,e.cols.count),h.set(e.cols,t)),t};exports.buildModel=p,exports.detectXType=a,exports.gridOf=g,exports.plottedY=m;
2
+ //# sourceMappingURL=model.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.cjs","names":["resolveStaticColor","collectCategories","xResolver","collectYCategories","normalizeData","mix","packColor","rampColor","toCss","ensureSpan","niceDomain","GridIndex","require_color","require_data","require_scale","require_spatial","firstX","data","xs","list","i","item","detectXType","datas","x","axisModel","options","gridDefault","extent","min","max","values","v","smallestStep","step","columns","sorted","k","d","bandOf","category","axis","s","stackValues","totals","percent","byX","stack","count","y","t","running","members","base","top","valid","sums","total","b","DEFAULT_UP","DEFAULT_DOWN","buildModel","resolve","resolver","theme","value","fallback","input","xType","categories","categoryMap","c","resolveX","name","yOpts","heatmapData","yCategories","yType","yCategoryMap","resolveY","resolverKey","usedKeys","series","key","index","entry","cache","type","paletteColor","color","cols","pointColors","resolved","rgba","colorScale","valueRange","cellColors","lo","hi","span","id","hidden","visible","allScatter","bars","band","slots","stackId","group","slotWidth","stacked","percentStacked","p","slot","stackedLines","candles","candleBand","heatmaps","cx","cy","xOpts","xRange","pad","pointsOnly","yRange","yValues","filled","zoomOption","zoomAxes","tooltip","yFormat","plottedY","grids","gridOf","grid"],"sources":["../../../../../../charts/src/engine/model.ts"],"sourcesContent":["// Options -> chart model: normalized data, colors, bar layout, stacks and\n// the full ranges of the axes. Pure (colors go through the theme's resolver).\n\nimport {\n mix,\n packColor,\n rampColor,\n resolveStaticColor,\n toCss,\n type ColorResolver,\n type Rgba,\n} from \"./color\";\nimport {\n collectCategories,\n collectYCategories,\n normalizeData,\n xResolver,\n type SeriesColumns,\n type YResolver,\n} from \"./data\";\nimport { ensureSpan, niceDomain } from \"./scale\";\nimport { GridIndex } from \"./spatial\";\nimport type { ChartTheme } from \"./theme\";\nimport type {\n ChartAxisOptions,\n ChartAxisType,\n ChartCurve,\n ChartOptions,\n ChartSeries,\n ChartSeriesData,\n ChartSeriesType,\n} from \"./types\";\nimport type { Range } from \"./viewport\";\n\nexport interface AxisModel {\n type: ChartAxisType;\n reverse: boolean;\n categories: string[];\n title?: string;\n format?: (value: number) => string;\n grid: boolean;\n visible: boolean;\n tickCount?: number;\n}\n\nexport interface SeriesModel {\n index: number;\n /** Key of the GPU resources and of the data cache */\n key: string;\n id: string;\n name: string;\n type: ChartSeriesType;\n color: Rgba;\n colorCss: string;\n lineWidth: number;\n pointSize: number;\n opacity: number;\n hidden: boolean;\n showLabels: boolean;\n curve: ChartCurve;\n cols: SeriesColumns;\n /** Bars / candlesticks: x offset of the series inside a group and half of the bar width */\n barOffset: number;\n barHalfWidth: number;\n /** Bars: bottom / top of every bar (stacks included) */\n barBase: Float64Array | null;\n barTop: Float64Array | null;\n /** Stacked lines / areas: bottom / top of every point */\n stackBase: Float64Array | null;\n stackTop: Float64Array | null;\n /** Scatter / bar: resolved per-point colors */\n pointColors: (Rgba | undefined)[] | null;\n /** Candlesticks: colors of the rising / falling candles */\n upColor: Rgba;\n downColor: Rgba;\n /** Heatmaps: packed color of every cell (0 = no cell) and half of a cell, in data units */\n cellColors: Uint32Array | null;\n cellHalf: { x: number; y: number };\n /** Heatmaps: ramp of the colors and the values at its ends */\n colorScale: Rgba[];\n valueRange: Range;\n /** Corner radius in CSS pixels (bars, heatmap cells) */\n radius: number;\n /** Tooltip format of the values */\n format?: (value: number) => string;\n}\n\nexport interface ChartModel {\n series: SeriesModel[];\n x: AxisModel;\n y: AxisModel;\n /** Full ranges (zoomed out) */\n base: { x: Range; y: Range };\n /** Every series is a scatter (or a heatmap): nearest tooltips, xy zoom */\n allScatter: boolean;\n zoom: { x: boolean; y: boolean };\n tooltipMode: \"nearest\" | \"axis\";\n /** Y value the areas are filled to */\n baseline: number;\n /** Smallest zoomed spans */\n minSpan: { x: number; y: number };\n /** Stacks are scaled to 100% */\n percent: boolean;\n /** Stack id of every series (`null` when not stacked) */\n stacks: (string | null)[];\n}\n\nexport interface DataCacheEntry {\n data: ChartSeriesData;\n resolverKey: string;\n cols: SeriesColumns;\n}\n\nexport type DataCache = Map<string, DataCacheEntry>;\n\nconst firstX = (data: ChartSeriesData): unknown => {\n if (typeof data === \"object\" && data !== null && !(\"length\" in data)) {\n const xs = (data as { x?: ArrayLike<unknown> }).x;\n return xs && xs.length ? xs[0] : undefined;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < Math.min(list.length, 8); i++) {\n const item = list[i];\n if (Array.isArray(item)) return item[0];\n if (item && typeof item === \"object\") return (item as { x?: unknown }).x;\n }\n return undefined;\n};\n\n/** Axis type when not given: dates -> time, strings -> category */\nexport const detectXType = (\n datas: readonly ChartSeriesData[],\n): ChartAxisType => {\n for (const data of datas) {\n const x = firstX(data);\n if (x instanceof Date) return \"time\";\n if (typeof x === \"string\") return \"category\";\n }\n return \"linear\";\n};\n\nconst axisModel = (\n options: ChartAxisOptions | undefined,\n type: ChartAxisType,\n categories: string[],\n gridDefault: boolean,\n): AxisModel => ({\n type,\n reverse: !!options?.reverse,\n categories,\n title: options?.title,\n format: options?.format,\n grid: options?.grid ?? gridDefault,\n visible: options?.visible ?? true,\n tickCount: options?.tickCount,\n});\n\nconst extent = (values: ArrayLike<number>): Range => {\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (!Number.isFinite(v)) continue;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n return [min, max];\n};\n\n/** Smallest positive gap between consecutive values (bar width on numeric axes) */\nconst smallestStep = (columns: ArrayLike<number>[], sorted: boolean[]) => {\n let step = Infinity;\n columns.forEach((values, k) => {\n const xs = sorted[k] ? values : Float64Array.from(values).sort();\n for (let i = 1; i < xs.length; i++) {\n const d = xs[i] - xs[i - 1];\n if (d > 0 && d < step) step = d;\n }\n });\n return step;\n};\n\nconst bandOf = (list: SeriesModel[], axis: \"x\" | \"y\", category: boolean) => {\n if (category) return 1;\n const step = smallestStep(\n list.map((s) => (axis === \"x\" ? s.cols.x : s.cols.y)),\n list.map((s) => axis === \"x\" && s.cols.sorted),\n );\n return Number.isFinite(step) ? step : 1;\n};\n\n/**\n * Stacks the y values of series sharing a stack id (positive and negative\n * values separately); `percent` scales every stack to 100 at each x\n */\nconst stackValues = (\n list: { s: SeriesModel; stack: string }[],\n percent: boolean,\n): { base: Float64Array; top: Float64Array }[] => {\n const totals = new Map<string, Map<number, [number, number]>>();\n if (percent) {\n for (const { s, stack } of list) {\n let byX = totals.get(stack);\n if (!byX) totals.set(stack, (byX = new Map()));\n const { x, y, count } = s.cols;\n for (let i = 0; i < count; i++) {\n const v = y[i];\n if (!Number.isFinite(v)) continue;\n const t = byX.get(x[i]) ?? [0, 0];\n if (v >= 0) t[0] += v;\n else t[1] -= v;\n byX.set(x[i], t);\n }\n }\n }\n const running = new Map<string, Map<number, [number, number]>>();\n const members = new Map<string, number>();\n for (const { stack } of list)\n members.set(stack, (members.get(stack) ?? 0) + 1);\n return list.map(({ s, stack }) => {\n const { x, y, count } = s.cols;\n if (!percent && members.get(stack) === 1) {\n // alone in its stack (e.g. grouped bars): from zero, no bookkeeping\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n const v = y[i];\n const valid = Number.isFinite(v);\n base[i] = valid ? 0 : NaN;\n top[i] = valid ? v : NaN;\n }\n return { base, top };\n }\n let byX = running.get(stack);\n if (!byX) running.set(stack, (byX = new Map()));\n const sums = totals.get(stack);\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n let v = y[i];\n if (!Number.isFinite(v)) {\n base[i] = NaN;\n top[i] = NaN;\n continue;\n }\n if (sums) {\n const t = sums.get(x[i]);\n const total = t ? (v >= 0 ? t[0] : t[1]) : 0;\n v = total > 0 ? (v / total) * 100 : 0;\n }\n const t = byX.get(x[i]) ?? [0, 0];\n const b = v >= 0 ? t[0] : t[1];\n base[i] = b;\n top[i] = b + v;\n if (v >= 0) t[0] += v;\n else t[1] += v;\n byX.set(x[i], t);\n }\n return { base, top };\n });\n};\n\nconst DEFAULT_UP = \"var(--success-color, #16a34a)\";\nconst DEFAULT_DOWN = \"var(--danger-color, #dc2626)\";\n\nexport const buildModel = (\n options: ChartOptions,\n theme: ChartTheme,\n hidden: ReadonlySet<string>,\n cache: DataCache,\n resolver: ColorResolver | null = null,\n): ChartModel => {\n const resolve: ColorResolver =\n resolver ??\n theme.resolve ??\n ((value, fallback) => resolveStaticColor(value, {}, fallback));\n const input = options.series;\n const datas = input.map((s) => s.data);\n const xType = options.xAxis?.type ?? detectXType(datas);\n const categories =\n xType === \"category\"\n ? [...(options.xAxis?.categories ?? collectCategories(datas))]\n : [];\n const categoryMap = new Map(categories.map((c, i) => [c, i]));\n const resolveX = xResolver(xType, (name) => categoryMap.get(name) ?? NaN);\n\n // category y axis (heatmap rows): explicit, or detected from string y values\n const yOpts = options.yAxis;\n const heatmapData = input\n .filter((s) => s.type === \"heatmap\")\n .map((s) => s.data);\n const yCategories =\n yOpts?.type === \"category\" || (!yOpts?.type && heatmapData.length)\n ? [...(yOpts?.categories ?? collectYCategories(heatmapData))]\n : [];\n const yType: ChartAxisType =\n yOpts?.type === \"category\" || yCategories.length\n ? \"category\"\n : yOpts?.type === \"time\"\n ? \"time\"\n : \"linear\";\n const yCategoryMap = new Map(yCategories.map((c, i) => [c, i]));\n const resolveY: YResolver = (v) =>\n typeof v === \"number\"\n ? v\n : typeof v === \"string\"\n ? yType === \"category\"\n ? (yCategoryMap.get(v) ?? NaN)\n : Number(v)\n : NaN;\n const resolverKey = `${xType}|${categories.join(\"\\u0001\")}|${yType}|${yCategories.join(\"\\u0001\")}`;\n const percent = options.stackMode === \"percent\";\n\n const usedKeys = new Set<string>();\n const series: SeriesModel[] = input.map((s: ChartSeries, index) => {\n let key = s.id ?? `#${index}`;\n while (usedKeys.has(key)) key += \"'\";\n usedKeys.add(key);\n let entry = cache.get(key);\n if (!entry || entry.data !== s.data || entry.resolverKey !== resolverKey) {\n entry = {\n data: s.data,\n resolverKey,\n cols: normalizeData(s.data, resolveX, resolveY),\n };\n cache.set(key, entry);\n }\n const type = s.type ?? \"line\";\n const paletteColor = theme.palette[index % theme.palette.length];\n const color = s.color ? resolve(s.color, paletteColor) : paletteColor;\n const cols = entry.cols;\n let pointColors: (Rgba | undefined)[] | null = null;\n if ((type === \"scatter\" || type === \"bar\") && cols.colors) {\n const resolved = new Map<string, Rgba>();\n pointColors = cols.colors.map((c) => {\n if (c === undefined) return undefined;\n let rgba = resolved.get(c);\n if (!rgba) resolved.set(c, (rgba = resolve(c, color)));\n return rgba;\n });\n }\n let colorScale: Rgba[] = [];\n let valueRange: Range = [0, 1];\n let cellColors: Uint32Array | null = null;\n if (type === \"heatmap\") {\n colorScale =\n s.colorScale && s.colorScale.length\n ? s.colorScale.map((c) => resolve(c, color))\n : [mix(theme.background, color, 0.08), color];\n valueRange = s.valueRange\n ? [s.valueRange[0], s.valueRange[1]]\n : [cols.valueMin, cols.valueMax];\n if (!Number.isFinite(valueRange[0])) valueRange = [0, 1];\n const values = cols.value ?? cols.y;\n const [lo, hi] = valueRange;\n const span = hi - lo || 1;\n cellColors = new Uint32Array(cols.count);\n for (let i = 0; i < cols.count; i++) {\n const v = values[i];\n if (!Number.isFinite(v) || !Number.isFinite(cols.y[i])) continue;\n // 0 means \"no cell\": a fully transparent color packs to 0 as well\n cellColors[i] = packColor(rampColor(colorScale, (v - lo) / span));\n }\n }\n const id = s.id ?? String(index);\n return {\n index,\n key,\n id,\n name: s.name ?? `Series ${index + 1}`,\n type,\n color,\n colorCss: toCss(color),\n lineWidth: s.lineWidth ?? (type === \"candlestick\" ? 1 : 2),\n pointSize: s.pointSize ?? 8,\n opacity:\n s.opacity ?? (type === \"area\" ? 0.28 : type === \"scatter\" ? 0.78 : 1),\n hidden: !!s.hidden || hidden.has(id),\n showLabels: !!s.showLabels,\n curve: s.curve ?? \"linear\",\n cols,\n barOffset: 0,\n barHalfWidth: 0,\n barBase: null,\n barTop: null,\n stackBase: null,\n stackTop: null,\n pointColors,\n upColor:\n type === \"candlestick\"\n ? resolve(s.upColor ?? DEFAULT_UP, [0.09, 0.64, 0.29, 1])\n : color,\n downColor:\n type === \"candlestick\"\n ? resolve(s.downColor ?? DEFAULT_DOWN, [0.86, 0.15, 0.15, 1])\n : color,\n cellColors,\n cellHalf: { x: 0.5, y: 0.5 },\n colorScale,\n valueRange,\n radius: s.radius ?? (type === \"heatmap\" ? 2 : 3),\n format: s.format,\n };\n });\n\n const visible = series.filter((s) => !s.hidden);\n const allScatter =\n series.length > 0 &&\n series.every((s) => s.type === \"scatter\" || s.type === \"heatmap\");\n\n // Bars: groups (one slot per stack) and stacking\n const bars = visible.filter((s) => s.type === \"bar\");\n const band = bandOf(bars, \"x\", xType === \"category\");\n if (bars.length) {\n const slots = new Map<string, number>();\n const stackId = (s: SeriesModel) =>\n input[s.index].stack ?? `\\u0000${s.key}`;\n for (const s of bars) {\n if (!slots.has(stackId(s))) slots.set(stackId(s), slots.size);\n }\n const group = band * (slots.size > 1 ? 0.78 : 0.62);\n const slotWidth = group / slots.size;\n const stacked = stackValues(\n bars.map((s) => ({ s, stack: stackId(s) })),\n false,\n );\n const percentStacked = percent\n ? stackValues(\n bars\n .filter((s) => input[s.index].stack !== undefined)\n .map((s) => ({ s, stack: stackId(s) })),\n true,\n )\n : [];\n let p = 0;\n bars.forEach((s, k) => {\n const slot = slots.get(stackId(s)) ?? 0;\n s.barOffset = -group / 2 + slotWidth * (slot + 0.5);\n s.barHalfWidth = (slotWidth / 2) * (slots.size > 1 ? 0.86 : 1);\n const values =\n percent && input[s.index].stack !== undefined\n ? percentStacked[p++]\n : stacked[k];\n s.barBase = values.base;\n s.barTop = values.top;\n });\n }\n\n // Stacked lines / areas\n const stackedLines = visible.filter(\n (s) =>\n (s.type === \"line\" || s.type === \"area\") &&\n input[s.index].stack !== undefined,\n );\n if (stackedLines.length) {\n const values = stackValues(\n stackedLines.map((s) => ({ s, stack: input[s.index].stack ?? \"\" })),\n percent,\n );\n stackedLines.forEach((s, k) => {\n s.stackBase = values[k].base;\n s.stackTop = values[k].top;\n });\n }\n\n // Candlesticks: one band per x, bodies of 60%\n const candles = visible.filter((s) => s.type === \"candlestick\");\n const candleBand = bandOf(candles, \"x\", xType === \"category\");\n for (const s of candles) s.barHalfWidth = candleBand * 0.3;\n\n // Heatmaps: cells of the size of the smallest step\n const heatmaps = visible.filter((s) => s.type === \"heatmap\");\n if (heatmaps.length) {\n const cx = bandOf(heatmaps, \"x\", xType === \"category\") / 2;\n const cy = bandOf(heatmaps, \"y\", yType === \"category\") / 2;\n for (const s of heatmaps) s.cellHalf = { x: cx, y: cy };\n }\n\n // X range\n const xOpts = options.xAxis;\n let xRange: Range;\n if (xType === \"category\") {\n xRange = [-0.5, Math.max(1, categories.length) - 0.5];\n } else {\n const values: number[] = [];\n for (const s of visible) {\n values.push(s.cols.xMin, s.cols.xMax);\n const pad =\n s.type === \"bar\"\n ? band / 2\n : s.type === \"candlestick\"\n ? candleBand / 2\n : s.type === \"heatmap\"\n ? s.cellHalf.x\n : 0;\n if (pad) values.push(s.cols.xMin - pad, s.cols.xMax + pad);\n }\n xRange = ensureSpan(\n ...extent(values),\n xType === \"time\" ? [Date.now() - 86400000, Date.now()] : [0, 1],\n );\n const pointsOnly = series.every((s) => s.type === \"scatter\");\n if (pointsOnly) {\n const pad = (xRange[1] - xRange[0]) * 0.04;\n xRange = [xRange[0] - pad, xRange[1] + pad];\n }\n const nice = xOpts?.nice ?? (pointsOnly && xType === \"linear\");\n if (nice && xType === \"linear\") {\n xRange = niceDomain(xRange[0], xRange[1], xOpts?.tickCount ?? 6);\n }\n }\n if (xOpts?.min !== undefined) xRange[0] = xOpts.min;\n if (xOpts?.max !== undefined) xRange[1] = xOpts.max;\n xRange = ensureSpan(xRange[0], xRange[1]);\n\n // Y range\n let yRange: Range;\n if (yType === \"category\") {\n yRange = [-0.5, Math.max(1, yCategories.length) - 0.5];\n } else {\n const yValues: number[] = [];\n for (const s of visible) {\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n yValues.push(...extent(s.barBase), ...extent(s.barTop));\n } else if (s.stackBase && s.stackTop) {\n yValues.push(...extent(s.stackBase), ...extent(s.stackTop));\n } else if (s.type === \"heatmap\") {\n yValues.push(s.cols.yMin - s.cellHalf.y, s.cols.yMax + s.cellHalf.y);\n } else {\n yValues.push(s.cols.yMin, s.cols.yMax);\n }\n }\n const filled = bars.length > 0 || visible.some((s) => s.type === \"area\");\n if (bars.length || yOpts?.zero) yValues.push(0);\n if (bars.some((s) => s.showLabels)) {\n // room for the value labels above the tallest bar\n const [lo, hi] = extent(yValues);\n if (hi > 0) yValues.push(hi + (hi - Math.min(0, lo)) * 0.1);\n if (lo < 0) yValues.push(lo - (Math.max(0, hi) - lo) * 0.1);\n }\n yRange = ensureSpan(...extent(yValues));\n if (series.every((s) => s.type === \"scatter\")) {\n const pad = (yRange[1] - yRange[0]) * 0.06;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n } else if (candles.length && !bars.length) {\n // room above / below the wicks\n const pad = (yRange[1] - yRange[0]) * 0.04;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n }\n if ((yOpts?.nice ?? !heatmaps.length) && yType === \"linear\") {\n yRange = niceDomain(yRange[0], yRange[1], yOpts?.tickCount ?? 5);\n }\n if (percent && (bars.length || stackedLines.length)) {\n // 100% stacks: exactly 0-100 (or -100-100)\n yRange = [extent(yValues)[0] < 0 ? -100 : 0, 100];\n }\n if (filled && !yOpts?.zero) {\n // bars start at zero: no padding below / above it\n if (yRange[0] < 0 && extent(yValues)[0] >= 0) yRange[0] = 0;\n }\n }\n if (yOpts?.min !== undefined) yRange[0] = yOpts.min;\n if (yOpts?.max !== undefined) yRange[1] = yOpts.max;\n yRange = ensureSpan(yRange[0], yRange[1]);\n\n const zoomOption =\n options.interaction === false\n ? false\n : options.interaction === true || options.interaction === undefined\n ? true\n : (options.interaction.zoom ?? true);\n const zoomAxes =\n zoomOption === false\n ? { x: false, y: false }\n : zoomOption === true\n ? { x: true, y: allScatter }\n : { x: zoomOption.includes(\"x\"), y: zoomOption.includes(\"y\") };\n\n const tooltip =\n typeof options.tooltip === \"object\" ? options.tooltip : undefined;\n\n const yFormat =\n yOpts?.format ??\n (percent && (bars.length || stackedLines.length)\n ? (v: number) => `${+v.toFixed(1)}%`\n : undefined);\n\n return {\n series,\n x: axisModel(xOpts, xType, categories, false),\n y: {\n ...axisModel(yOpts, yType, yCategories, yType !== \"category\"),\n format: yFormat,\n },\n base: { x: xRange, y: yRange },\n allScatter,\n zoom: zoomAxes,\n tooltipMode: tooltip?.mode ?? (allScatter ? \"nearest\" : \"axis\"),\n baseline: Math.min(Math.max(0, yRange[0]), yRange[1]),\n minSpan: {\n x: xType === \"category\" ? 1 : (xRange[1] - xRange[0]) * 1e-7,\n y: yType === \"category\" ? 1 : (yRange[1] - yRange[0]) * 1e-7,\n },\n percent,\n stacks: input.map((s) =>\n s.stack !== undefined &&\n (s.type === \"bar\" || s.type === \"line\" || s.type === \"area\" || !s.type)\n ? `${s.type === \"bar\" ? \"bar\" : \"line\"}:${s.stack}`\n : null,\n ),\n };\n};\n\n/** Y value drawn for a point: its stacked top for stacks, the close for candles */\nexport const plottedY = (s: SeriesModel, i: number): number =>\n s.barTop ? s.barTop[i] : s.stackTop ? s.stackTop[i] : s.cols.y[i];\n\nconst grids = new WeakMap<SeriesColumns, GridIndex>();\n\n/** Spatial index of a scatter series, built on first use and kept with its data */\nexport const gridOf = (s: SeriesModel): GridIndex => {\n let grid = grids.get(s.cols);\n if (!grid) {\n grid = new GridIndex(s.cols.x, s.cols.y, s.cols.count);\n grids.set(s.cols, grid);\n }\n return grid;\n};\n"],"mappings":"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"}
@@ -0,0 +1,292 @@
1
+ import { mix as e, packColor as t, rampColor as n, resolveStaticColor as r, toCss as i } from "./color.js";
2
+ import { collectCategories as a, collectYCategories as o, normalizeData as s, xResolver as c } from "./data.js";
3
+ import { ensureSpan as l, niceDomain as u } from "./scale.js";
4
+ import { GridIndex as d } from "./spatial.js";
5
+ //#region ../charts/src/engine/model.ts
6
+ var f = (e) => {
7
+ if (typeof e == "object" && e && !("length" in e)) {
8
+ let t = e.x;
9
+ return t && t.length ? t[0] : void 0;
10
+ }
11
+ let t = e;
12
+ for (let e = 0; e < Math.min(t.length, 8); e++) {
13
+ let n = t[e];
14
+ if (Array.isArray(n)) return n[0];
15
+ if (n && typeof n == "object") return n.x;
16
+ }
17
+ }, p = (e) => {
18
+ for (let t of e) {
19
+ let e = f(t);
20
+ if (e instanceof Date) return "time";
21
+ if (typeof e == "string") return "category";
22
+ }
23
+ return "linear";
24
+ }, m = (e, t, n, r) => ({
25
+ type: t,
26
+ reverse: !!e?.reverse,
27
+ categories: n,
28
+ title: e?.title,
29
+ format: e?.format,
30
+ grid: e?.grid ?? r,
31
+ visible: e?.visible ?? !0,
32
+ tickCount: e?.tickCount
33
+ }), h = (e) => {
34
+ let t = Infinity, n = -Infinity;
35
+ for (let r = 0; r < e.length; r++) {
36
+ let i = e[r];
37
+ Number.isFinite(i) && (i < t && (t = i), i > n && (n = i));
38
+ }
39
+ return [t, n];
40
+ }, g = (e, t) => {
41
+ let n = Infinity;
42
+ return e.forEach((e, r) => {
43
+ let i = t[r] ? e : Float64Array.from(e).sort();
44
+ for (let e = 1; e < i.length; e++) {
45
+ let t = i[e] - i[e - 1];
46
+ t > 0 && t < n && (n = t);
47
+ }
48
+ }), n;
49
+ }, _ = (e, t, n) => {
50
+ if (n) return 1;
51
+ let r = g(e.map((e) => t === "x" ? e.cols.x : e.cols.y), e.map((e) => t === "x" && e.cols.sorted));
52
+ return Number.isFinite(r) ? r : 1;
53
+ }, v = (e, t) => {
54
+ let n = /* @__PURE__ */ new Map();
55
+ if (t) for (let { s: t, stack: r } of e) {
56
+ let e = n.get(r);
57
+ e || n.set(r, e = /* @__PURE__ */ new Map());
58
+ let { x: i, y: a, count: o } = t.cols;
59
+ for (let t = 0; t < o; t++) {
60
+ let n = a[t];
61
+ if (!Number.isFinite(n)) continue;
62
+ let r = e.get(i[t]) ?? [0, 0];
63
+ n >= 0 ? r[0] += n : r[1] -= n, e.set(i[t], r);
64
+ }
65
+ }
66
+ let r = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Map();
67
+ for (let { stack: t } of e) i.set(t, (i.get(t) ?? 0) + 1);
68
+ return e.map(({ s: e, stack: a }) => {
69
+ let { x: o, y: s, count: c } = e.cols;
70
+ if (!t && i.get(a) === 1) {
71
+ let e = new Float64Array(c), t = new Float64Array(c);
72
+ for (let n = 0; n < c; n++) {
73
+ let r = s[n], i = Number.isFinite(r);
74
+ e[n] = i ? 0 : NaN, t[n] = i ? r : NaN;
75
+ }
76
+ return {
77
+ base: e,
78
+ top: t
79
+ };
80
+ }
81
+ let l = r.get(a);
82
+ l || r.set(a, l = /* @__PURE__ */ new Map());
83
+ let u = n.get(a), d = new Float64Array(c), f = new Float64Array(c);
84
+ for (let e = 0; e < c; e++) {
85
+ let t = s[e];
86
+ if (!Number.isFinite(t)) {
87
+ d[e] = NaN, f[e] = NaN;
88
+ continue;
89
+ }
90
+ if (u) {
91
+ let n = u.get(o[e]), r = n ? t >= 0 ? n[0] : n[1] : 0;
92
+ t = r > 0 ? t / r * 100 : 0;
93
+ }
94
+ let n = l.get(o[e]) ?? [0, 0], r = t >= 0 ? n[0] : n[1];
95
+ d[e] = r, f[e] = r + t, t >= 0 ? n[0] += t : n[1] += t, l.set(o[e], n);
96
+ }
97
+ return {
98
+ base: d,
99
+ top: f
100
+ };
101
+ });
102
+ }, y = "var(--success-color, #16a34a)", b = "var(--danger-color, #dc2626)", x = (d, f, g, x, S = null) => {
103
+ let C = S ?? f.resolve ?? ((e, t) => r(e, {}, t)), w = d.series, T = w.map((e) => e.data), E = d.xAxis?.type ?? p(T), D = E === "category" ? [...d.xAxis?.categories ?? a(T)] : [], O = new Map(D.map((e, t) => [e, t])), k = c(E, (e) => O.get(e) ?? NaN), A = d.yAxis, j = w.filter((e) => e.type === "heatmap").map((e) => e.data), M = A?.type === "category" || !A?.type && j.length ? [...A?.categories ?? o(j)] : [], N = A?.type === "category" || M.length ? "category" : A?.type === "time" ? "time" : "linear", P = new Map(M.map((e, t) => [e, t])), F = (e) => typeof e == "number" ? e : typeof e == "string" ? N === "category" ? P.get(e) ?? NaN : Number(e) : NaN, I = `${E}|${D.join("")}|${N}|${M.join("")}`, L = d.stackMode === "percent", R = /* @__PURE__ */ new Set(), z = w.map((r, a) => {
104
+ let o = r.id ?? `#${a}`;
105
+ for (; R.has(o);) o += "'";
106
+ R.add(o);
107
+ let c = x.get(o);
108
+ (!c || c.data !== r.data || c.resolverKey !== I) && (c = {
109
+ data: r.data,
110
+ resolverKey: I,
111
+ cols: s(r.data, k, F)
112
+ }, x.set(o, c));
113
+ let l = r.type ?? "line", u = f.palette[a % f.palette.length], d = r.color ? C(r.color, u) : u, p = c.cols, m = null;
114
+ if ((l === "scatter" || l === "bar") && p.colors) {
115
+ let e = /* @__PURE__ */ new Map();
116
+ m = p.colors.map((t) => {
117
+ if (t === void 0) return;
118
+ let n = e.get(t);
119
+ return n || e.set(t, n = C(t, d)), n;
120
+ });
121
+ }
122
+ let h = [], _ = [0, 1], v = null;
123
+ if (l === "heatmap") {
124
+ h = r.colorScale && r.colorScale.length ? r.colorScale.map((e) => C(e, d)) : [e(f.background, d, .08), d], _ = r.valueRange ? [r.valueRange[0], r.valueRange[1]] : [p.valueMin, p.valueMax], Number.isFinite(_[0]) || (_ = [0, 1]);
125
+ let i = p.value ?? p.y, [a, o] = _, s = o - a || 1;
126
+ v = new Uint32Array(p.count);
127
+ for (let e = 0; e < p.count; e++) {
128
+ let r = i[e];
129
+ Number.isFinite(r) && Number.isFinite(p.y[e]) && (v[e] = t(n(h, (r - a) / s)));
130
+ }
131
+ }
132
+ let S = r.id ?? String(a);
133
+ return {
134
+ index: a,
135
+ key: o,
136
+ id: S,
137
+ name: r.name ?? `Series ${a + 1}`,
138
+ type: l,
139
+ color: d,
140
+ colorCss: i(d),
141
+ lineWidth: r.lineWidth ?? (l === "candlestick" ? 1 : 2),
142
+ pointSize: r.pointSize ?? 8,
143
+ opacity: r.opacity ?? (l === "area" ? .28 : l === "scatter" ? .78 : 1),
144
+ hidden: !!r.hidden || g.has(S),
145
+ showLabels: !!r.showLabels,
146
+ curve: r.curve ?? "linear",
147
+ cols: p,
148
+ barOffset: 0,
149
+ barHalfWidth: 0,
150
+ barBase: null,
151
+ barTop: null,
152
+ stackBase: null,
153
+ stackTop: null,
154
+ pointColors: m,
155
+ upColor: l === "candlestick" ? C(r.upColor ?? y, [
156
+ .09,
157
+ .64,
158
+ .29,
159
+ 1
160
+ ]) : d,
161
+ downColor: l === "candlestick" ? C(r.downColor ?? b, [
162
+ .86,
163
+ .15,
164
+ .15,
165
+ 1
166
+ ]) : d,
167
+ cellColors: v,
168
+ cellHalf: {
169
+ x: .5,
170
+ y: .5
171
+ },
172
+ colorScale: h,
173
+ valueRange: _,
174
+ radius: r.radius ?? (l === "heatmap" ? 2 : 3),
175
+ format: r.format
176
+ };
177
+ }), B = z.filter((e) => !e.hidden), V = z.length > 0 && z.every((e) => e.type === "scatter" || e.type === "heatmap"), H = B.filter((e) => e.type === "bar"), U = _(H, "x", E === "category");
178
+ if (H.length) {
179
+ let e = /* @__PURE__ */ new Map(), t = (e) => w[e.index].stack ?? `\u0000${e.key}`;
180
+ for (let n of H) e.has(t(n)) || e.set(t(n), e.size);
181
+ let n = U * (e.size > 1 ? .78 : .62), r = n / e.size, i = v(H.map((e) => ({
182
+ s: e,
183
+ stack: t(e)
184
+ })), !1), a = L ? v(H.filter((e) => w[e.index].stack !== void 0).map((e) => ({
185
+ s: e,
186
+ stack: t(e)
187
+ })), !0) : [], o = 0;
188
+ H.forEach((s, c) => {
189
+ let l = e.get(t(s)) ?? 0;
190
+ s.barOffset = -n / 2 + r * (l + .5), s.barHalfWidth = r / 2 * (e.size > 1 ? .86 : 1);
191
+ let u = L && w[s.index].stack !== void 0 ? a[o++] : i[c];
192
+ s.barBase = u.base, s.barTop = u.top;
193
+ });
194
+ }
195
+ let W = B.filter((e) => (e.type === "line" || e.type === "area") && w[e.index].stack !== void 0);
196
+ if (W.length) {
197
+ let e = v(W.map((e) => ({
198
+ s: e,
199
+ stack: w[e.index].stack ?? ""
200
+ })), L);
201
+ W.forEach((t, n) => {
202
+ t.stackBase = e[n].base, t.stackTop = e[n].top;
203
+ });
204
+ }
205
+ let G = B.filter((e) => e.type === "candlestick"), K = _(G, "x", E === "category");
206
+ for (let e of G) e.barHalfWidth = K * .3;
207
+ let q = B.filter((e) => e.type === "heatmap");
208
+ if (q.length) {
209
+ let e = _(q, "x", E === "category") / 2, t = _(q, "y", N === "category") / 2;
210
+ for (let n of q) n.cellHalf = {
211
+ x: e,
212
+ y: t
213
+ };
214
+ }
215
+ let J = d.xAxis, Y;
216
+ if (E === "category") Y = [-.5, Math.max(1, D.length) - .5];
217
+ else {
218
+ let e = [];
219
+ for (let t of B) {
220
+ e.push(t.cols.xMin, t.cols.xMax);
221
+ let n = t.type === "bar" ? U / 2 : t.type === "candlestick" ? K / 2 : t.type === "heatmap" ? t.cellHalf.x : 0;
222
+ n && e.push(t.cols.xMin - n, t.cols.xMax + n);
223
+ }
224
+ Y = l(...h(e), E === "time" ? [Date.now() - 864e5, Date.now()] : [0, 1]);
225
+ let t = z.every((e) => e.type === "scatter");
226
+ if (t) {
227
+ let e = (Y[1] - Y[0]) * .04;
228
+ Y = [Y[0] - e, Y[1] + e];
229
+ }
230
+ (J?.nice ?? (t && E === "linear")) && E === "linear" && (Y = u(Y[0], Y[1], J?.tickCount ?? 6));
231
+ }
232
+ J?.min !== void 0 && (Y[0] = J.min), J?.max !== void 0 && (Y[1] = J.max), Y = l(Y[0], Y[1]);
233
+ let X;
234
+ if (N === "category") X = [-.5, Math.max(1, M.length) - .5];
235
+ else {
236
+ let e = [];
237
+ for (let t of B) t.type === "bar" && t.barBase && t.barTop ? e.push(...h(t.barBase), ...h(t.barTop)) : t.stackBase && t.stackTop ? e.push(...h(t.stackBase), ...h(t.stackTop)) : t.type === "heatmap" ? e.push(t.cols.yMin - t.cellHalf.y, t.cols.yMax + t.cellHalf.y) : e.push(t.cols.yMin, t.cols.yMax);
238
+ let t = H.length > 0 || B.some((e) => e.type === "area");
239
+ if ((H.length || A?.zero) && e.push(0), H.some((e) => e.showLabels)) {
240
+ let [t, n] = h(e);
241
+ n > 0 && e.push(n + (n - Math.min(0, t)) * .1), t < 0 && e.push(t - (Math.max(0, n) - t) * .1);
242
+ }
243
+ if (X = l(...h(e)), z.every((e) => e.type === "scatter")) {
244
+ let e = (X[1] - X[0]) * .06;
245
+ X = [X[0] - e, X[1] + e];
246
+ } else if (G.length && !H.length) {
247
+ let e = (X[1] - X[0]) * .04;
248
+ X = [X[0] - e, X[1] + e];
249
+ }
250
+ (A?.nice ?? !q.length) && N === "linear" && (X = u(X[0], X[1], A?.tickCount ?? 5)), L && (H.length || W.length) && (X = [h(e)[0] < 0 ? -100 : 0, 100]), t && !A?.zero && X[0] < 0 && h(e)[0] >= 0 && (X[0] = 0);
251
+ }
252
+ A?.min !== void 0 && (X[0] = A.min), A?.max !== void 0 && (X[1] = A.max), X = l(X[0], X[1]);
253
+ let Z = d.interaction === !1 ? !1 : d.interaction === !0 || d.interaction === void 0 ? !0 : d.interaction.zoom ?? !0, Q = Z === !1 ? {
254
+ x: !1,
255
+ y: !1
256
+ } : Z === !0 ? {
257
+ x: !0,
258
+ y: V
259
+ } : {
260
+ x: Z.includes("x"),
261
+ y: Z.includes("y")
262
+ }, $ = typeof d.tooltip == "object" ? d.tooltip : void 0, ee = A?.format ?? (L && (H.length || W.length) ? (e) => `${+e.toFixed(1)}%` : void 0);
263
+ return {
264
+ series: z,
265
+ x: m(J, E, D, !1),
266
+ y: {
267
+ ...m(A, N, M, N !== "category"),
268
+ format: ee
269
+ },
270
+ base: {
271
+ x: Y,
272
+ y: X
273
+ },
274
+ allScatter: V,
275
+ zoom: Q,
276
+ tooltipMode: $?.mode ?? (V ? "nearest" : "axis"),
277
+ baseline: Math.min(Math.max(0, X[0]), X[1]),
278
+ minSpan: {
279
+ x: E === "category" ? 1 : (Y[1] - Y[0]) * 1e-7,
280
+ y: N === "category" ? 1 : (X[1] - X[0]) * 1e-7
281
+ },
282
+ percent: L,
283
+ stacks: w.map((e) => e.stack !== void 0 && (e.type === "bar" || e.type === "line" || e.type === "area" || !e.type) ? `${e.type === "bar" ? "bar" : "line"}:${e.stack}` : null)
284
+ };
285
+ }, S = (e, t) => e.barTop ? e.barTop[t] : e.stackTop ? e.stackTop[t] : e.cols.y[t], C = /* @__PURE__ */ new WeakMap(), w = (e) => {
286
+ let t = C.get(e.cols);
287
+ return t || (t = new d(e.cols.x, e.cols.y, e.cols.count), C.set(e.cols, t)), t;
288
+ };
289
+ //#endregion
290
+ export { x as buildModel, p as detectXType, w as gridOf, S as plottedY };
291
+
292
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","names":["firstX","data","xs","list","i","item","detectXType","datas","x","axisModel","options","gridDefault","extent","min","max","values","v","smallestStep","step","columns","sorted","k","d","bandOf","category","axis","s","stackValues","totals","percent","byX","stack","count","y","t","running","members","base","top","valid","sums","total","b","DEFAULT_UP","DEFAULT_DOWN","buildModel","resolve","resolver","theme","resolveStaticColor","value","fallback","input","xType","categories","collectCategories","categoryMap","c","resolveX","xResolver","name","yOpts","heatmapData","yCategories","collectYCategories","yType","yCategoryMap","resolveY","resolverKey","usedKeys","series","key","index","entry","cache","normalizeData","type","paletteColor","color","cols","pointColors","resolved","rgba","colorScale","valueRange","cellColors","mix","lo","hi","span","packColor","rampColor","id","toCss","hidden","visible","allScatter","bars","band","slots","stackId","group","slotWidth","stacked","percentStacked","p","slot","stackedLines","candles","candleBand","heatmaps","cx","cy","xOpts","xRange","pad","ensureSpan","pointsOnly","niceDomain","yRange","yValues","filled","zoomOption","zoomAxes","tooltip","yFormat","plottedY","grids","gridOf","grid","GridIndex"],"sources":["../../../../../../charts/src/engine/model.ts"],"sourcesContent":["// Options -> chart model: normalized data, colors, bar layout, stacks and\n// the full ranges of the axes. Pure (colors go through the theme's resolver).\n\nimport {\n mix,\n packColor,\n rampColor,\n resolveStaticColor,\n toCss,\n type ColorResolver,\n type Rgba,\n} from \"./color\";\nimport {\n collectCategories,\n collectYCategories,\n normalizeData,\n xResolver,\n type SeriesColumns,\n type YResolver,\n} from \"./data\";\nimport { ensureSpan, niceDomain } from \"./scale\";\nimport { GridIndex } from \"./spatial\";\nimport type { ChartTheme } from \"./theme\";\nimport type {\n ChartAxisOptions,\n ChartAxisType,\n ChartCurve,\n ChartOptions,\n ChartSeries,\n ChartSeriesData,\n ChartSeriesType,\n} from \"./types\";\nimport type { Range } from \"./viewport\";\n\nexport interface AxisModel {\n type: ChartAxisType;\n reverse: boolean;\n categories: string[];\n title?: string;\n format?: (value: number) => string;\n grid: boolean;\n visible: boolean;\n tickCount?: number;\n}\n\nexport interface SeriesModel {\n index: number;\n /** Key of the GPU resources and of the data cache */\n key: string;\n id: string;\n name: string;\n type: ChartSeriesType;\n color: Rgba;\n colorCss: string;\n lineWidth: number;\n pointSize: number;\n opacity: number;\n hidden: boolean;\n showLabels: boolean;\n curve: ChartCurve;\n cols: SeriesColumns;\n /** Bars / candlesticks: x offset of the series inside a group and half of the bar width */\n barOffset: number;\n barHalfWidth: number;\n /** Bars: bottom / top of every bar (stacks included) */\n barBase: Float64Array | null;\n barTop: Float64Array | null;\n /** Stacked lines / areas: bottom / top of every point */\n stackBase: Float64Array | null;\n stackTop: Float64Array | null;\n /** Scatter / bar: resolved per-point colors */\n pointColors: (Rgba | undefined)[] | null;\n /** Candlesticks: colors of the rising / falling candles */\n upColor: Rgba;\n downColor: Rgba;\n /** Heatmaps: packed color of every cell (0 = no cell) and half of a cell, in data units */\n cellColors: Uint32Array | null;\n cellHalf: { x: number; y: number };\n /** Heatmaps: ramp of the colors and the values at its ends */\n colorScale: Rgba[];\n valueRange: Range;\n /** Corner radius in CSS pixels (bars, heatmap cells) */\n radius: number;\n /** Tooltip format of the values */\n format?: (value: number) => string;\n}\n\nexport interface ChartModel {\n series: SeriesModel[];\n x: AxisModel;\n y: AxisModel;\n /** Full ranges (zoomed out) */\n base: { x: Range; y: Range };\n /** Every series is a scatter (or a heatmap): nearest tooltips, xy zoom */\n allScatter: boolean;\n zoom: { x: boolean; y: boolean };\n tooltipMode: \"nearest\" | \"axis\";\n /** Y value the areas are filled to */\n baseline: number;\n /** Smallest zoomed spans */\n minSpan: { x: number; y: number };\n /** Stacks are scaled to 100% */\n percent: boolean;\n /** Stack id of every series (`null` when not stacked) */\n stacks: (string | null)[];\n}\n\nexport interface DataCacheEntry {\n data: ChartSeriesData;\n resolverKey: string;\n cols: SeriesColumns;\n}\n\nexport type DataCache = Map<string, DataCacheEntry>;\n\nconst firstX = (data: ChartSeriesData): unknown => {\n if (typeof data === \"object\" && data !== null && !(\"length\" in data)) {\n const xs = (data as { x?: ArrayLike<unknown> }).x;\n return xs && xs.length ? xs[0] : undefined;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < Math.min(list.length, 8); i++) {\n const item = list[i];\n if (Array.isArray(item)) return item[0];\n if (item && typeof item === \"object\") return (item as { x?: unknown }).x;\n }\n return undefined;\n};\n\n/** Axis type when not given: dates -> time, strings -> category */\nexport const detectXType = (\n datas: readonly ChartSeriesData[],\n): ChartAxisType => {\n for (const data of datas) {\n const x = firstX(data);\n if (x instanceof Date) return \"time\";\n if (typeof x === \"string\") return \"category\";\n }\n return \"linear\";\n};\n\nconst axisModel = (\n options: ChartAxisOptions | undefined,\n type: ChartAxisType,\n categories: string[],\n gridDefault: boolean,\n): AxisModel => ({\n type,\n reverse: !!options?.reverse,\n categories,\n title: options?.title,\n format: options?.format,\n grid: options?.grid ?? gridDefault,\n visible: options?.visible ?? true,\n tickCount: options?.tickCount,\n});\n\nconst extent = (values: ArrayLike<number>): Range => {\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (!Number.isFinite(v)) continue;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n return [min, max];\n};\n\n/** Smallest positive gap between consecutive values (bar width on numeric axes) */\nconst smallestStep = (columns: ArrayLike<number>[], sorted: boolean[]) => {\n let step = Infinity;\n columns.forEach((values, k) => {\n const xs = sorted[k] ? values : Float64Array.from(values).sort();\n for (let i = 1; i < xs.length; i++) {\n const d = xs[i] - xs[i - 1];\n if (d > 0 && d < step) step = d;\n }\n });\n return step;\n};\n\nconst bandOf = (list: SeriesModel[], axis: \"x\" | \"y\", category: boolean) => {\n if (category) return 1;\n const step = smallestStep(\n list.map((s) => (axis === \"x\" ? s.cols.x : s.cols.y)),\n list.map((s) => axis === \"x\" && s.cols.sorted),\n );\n return Number.isFinite(step) ? step : 1;\n};\n\n/**\n * Stacks the y values of series sharing a stack id (positive and negative\n * values separately); `percent` scales every stack to 100 at each x\n */\nconst stackValues = (\n list: { s: SeriesModel; stack: string }[],\n percent: boolean,\n): { base: Float64Array; top: Float64Array }[] => {\n const totals = new Map<string, Map<number, [number, number]>>();\n if (percent) {\n for (const { s, stack } of list) {\n let byX = totals.get(stack);\n if (!byX) totals.set(stack, (byX = new Map()));\n const { x, y, count } = s.cols;\n for (let i = 0; i < count; i++) {\n const v = y[i];\n if (!Number.isFinite(v)) continue;\n const t = byX.get(x[i]) ?? [0, 0];\n if (v >= 0) t[0] += v;\n else t[1] -= v;\n byX.set(x[i], t);\n }\n }\n }\n const running = new Map<string, Map<number, [number, number]>>();\n const members = new Map<string, number>();\n for (const { stack } of list)\n members.set(stack, (members.get(stack) ?? 0) + 1);\n return list.map(({ s, stack }) => {\n const { x, y, count } = s.cols;\n if (!percent && members.get(stack) === 1) {\n // alone in its stack (e.g. grouped bars): from zero, no bookkeeping\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n const v = y[i];\n const valid = Number.isFinite(v);\n base[i] = valid ? 0 : NaN;\n top[i] = valid ? v : NaN;\n }\n return { base, top };\n }\n let byX = running.get(stack);\n if (!byX) running.set(stack, (byX = new Map()));\n const sums = totals.get(stack);\n const base = new Float64Array(count);\n const top = new Float64Array(count);\n for (let i = 0; i < count; i++) {\n let v = y[i];\n if (!Number.isFinite(v)) {\n base[i] = NaN;\n top[i] = NaN;\n continue;\n }\n if (sums) {\n const t = sums.get(x[i]);\n const total = t ? (v >= 0 ? t[0] : t[1]) : 0;\n v = total > 0 ? (v / total) * 100 : 0;\n }\n const t = byX.get(x[i]) ?? [0, 0];\n const b = v >= 0 ? t[0] : t[1];\n base[i] = b;\n top[i] = b + v;\n if (v >= 0) t[0] += v;\n else t[1] += v;\n byX.set(x[i], t);\n }\n return { base, top };\n });\n};\n\nconst DEFAULT_UP = \"var(--success-color, #16a34a)\";\nconst DEFAULT_DOWN = \"var(--danger-color, #dc2626)\";\n\nexport const buildModel = (\n options: ChartOptions,\n theme: ChartTheme,\n hidden: ReadonlySet<string>,\n cache: DataCache,\n resolver: ColorResolver | null = null,\n): ChartModel => {\n const resolve: ColorResolver =\n resolver ??\n theme.resolve ??\n ((value, fallback) => resolveStaticColor(value, {}, fallback));\n const input = options.series;\n const datas = input.map((s) => s.data);\n const xType = options.xAxis?.type ?? detectXType(datas);\n const categories =\n xType === \"category\"\n ? [...(options.xAxis?.categories ?? collectCategories(datas))]\n : [];\n const categoryMap = new Map(categories.map((c, i) => [c, i]));\n const resolveX = xResolver(xType, (name) => categoryMap.get(name) ?? NaN);\n\n // category y axis (heatmap rows): explicit, or detected from string y values\n const yOpts = options.yAxis;\n const heatmapData = input\n .filter((s) => s.type === \"heatmap\")\n .map((s) => s.data);\n const yCategories =\n yOpts?.type === \"category\" || (!yOpts?.type && heatmapData.length)\n ? [...(yOpts?.categories ?? collectYCategories(heatmapData))]\n : [];\n const yType: ChartAxisType =\n yOpts?.type === \"category\" || yCategories.length\n ? \"category\"\n : yOpts?.type === \"time\"\n ? \"time\"\n : \"linear\";\n const yCategoryMap = new Map(yCategories.map((c, i) => [c, i]));\n const resolveY: YResolver = (v) =>\n typeof v === \"number\"\n ? v\n : typeof v === \"string\"\n ? yType === \"category\"\n ? (yCategoryMap.get(v) ?? NaN)\n : Number(v)\n : NaN;\n const resolverKey = `${xType}|${categories.join(\"\\u0001\")}|${yType}|${yCategories.join(\"\\u0001\")}`;\n const percent = options.stackMode === \"percent\";\n\n const usedKeys = new Set<string>();\n const series: SeriesModel[] = input.map((s: ChartSeries, index) => {\n let key = s.id ?? `#${index}`;\n while (usedKeys.has(key)) key += \"'\";\n usedKeys.add(key);\n let entry = cache.get(key);\n if (!entry || entry.data !== s.data || entry.resolverKey !== resolverKey) {\n entry = {\n data: s.data,\n resolverKey,\n cols: normalizeData(s.data, resolveX, resolveY),\n };\n cache.set(key, entry);\n }\n const type = s.type ?? \"line\";\n const paletteColor = theme.palette[index % theme.palette.length];\n const color = s.color ? resolve(s.color, paletteColor) : paletteColor;\n const cols = entry.cols;\n let pointColors: (Rgba | undefined)[] | null = null;\n if ((type === \"scatter\" || type === \"bar\") && cols.colors) {\n const resolved = new Map<string, Rgba>();\n pointColors = cols.colors.map((c) => {\n if (c === undefined) return undefined;\n let rgba = resolved.get(c);\n if (!rgba) resolved.set(c, (rgba = resolve(c, color)));\n return rgba;\n });\n }\n let colorScale: Rgba[] = [];\n let valueRange: Range = [0, 1];\n let cellColors: Uint32Array | null = null;\n if (type === \"heatmap\") {\n colorScale =\n s.colorScale && s.colorScale.length\n ? s.colorScale.map((c) => resolve(c, color))\n : [mix(theme.background, color, 0.08), color];\n valueRange = s.valueRange\n ? [s.valueRange[0], s.valueRange[1]]\n : [cols.valueMin, cols.valueMax];\n if (!Number.isFinite(valueRange[0])) valueRange = [0, 1];\n const values = cols.value ?? cols.y;\n const [lo, hi] = valueRange;\n const span = hi - lo || 1;\n cellColors = new Uint32Array(cols.count);\n for (let i = 0; i < cols.count; i++) {\n const v = values[i];\n if (!Number.isFinite(v) || !Number.isFinite(cols.y[i])) continue;\n // 0 means \"no cell\": a fully transparent color packs to 0 as well\n cellColors[i] = packColor(rampColor(colorScale, (v - lo) / span));\n }\n }\n const id = s.id ?? String(index);\n return {\n index,\n key,\n id,\n name: s.name ?? `Series ${index + 1}`,\n type,\n color,\n colorCss: toCss(color),\n lineWidth: s.lineWidth ?? (type === \"candlestick\" ? 1 : 2),\n pointSize: s.pointSize ?? 8,\n opacity:\n s.opacity ?? (type === \"area\" ? 0.28 : type === \"scatter\" ? 0.78 : 1),\n hidden: !!s.hidden || hidden.has(id),\n showLabels: !!s.showLabels,\n curve: s.curve ?? \"linear\",\n cols,\n barOffset: 0,\n barHalfWidth: 0,\n barBase: null,\n barTop: null,\n stackBase: null,\n stackTop: null,\n pointColors,\n upColor:\n type === \"candlestick\"\n ? resolve(s.upColor ?? DEFAULT_UP, [0.09, 0.64, 0.29, 1])\n : color,\n downColor:\n type === \"candlestick\"\n ? resolve(s.downColor ?? DEFAULT_DOWN, [0.86, 0.15, 0.15, 1])\n : color,\n cellColors,\n cellHalf: { x: 0.5, y: 0.5 },\n colorScale,\n valueRange,\n radius: s.radius ?? (type === \"heatmap\" ? 2 : 3),\n format: s.format,\n };\n });\n\n const visible = series.filter((s) => !s.hidden);\n const allScatter =\n series.length > 0 &&\n series.every((s) => s.type === \"scatter\" || s.type === \"heatmap\");\n\n // Bars: groups (one slot per stack) and stacking\n const bars = visible.filter((s) => s.type === \"bar\");\n const band = bandOf(bars, \"x\", xType === \"category\");\n if (bars.length) {\n const slots = new Map<string, number>();\n const stackId = (s: SeriesModel) =>\n input[s.index].stack ?? `\\u0000${s.key}`;\n for (const s of bars) {\n if (!slots.has(stackId(s))) slots.set(stackId(s), slots.size);\n }\n const group = band * (slots.size > 1 ? 0.78 : 0.62);\n const slotWidth = group / slots.size;\n const stacked = stackValues(\n bars.map((s) => ({ s, stack: stackId(s) })),\n false,\n );\n const percentStacked = percent\n ? stackValues(\n bars\n .filter((s) => input[s.index].stack !== undefined)\n .map((s) => ({ s, stack: stackId(s) })),\n true,\n )\n : [];\n let p = 0;\n bars.forEach((s, k) => {\n const slot = slots.get(stackId(s)) ?? 0;\n s.barOffset = -group / 2 + slotWidth * (slot + 0.5);\n s.barHalfWidth = (slotWidth / 2) * (slots.size > 1 ? 0.86 : 1);\n const values =\n percent && input[s.index].stack !== undefined\n ? percentStacked[p++]\n : stacked[k];\n s.barBase = values.base;\n s.barTop = values.top;\n });\n }\n\n // Stacked lines / areas\n const stackedLines = visible.filter(\n (s) =>\n (s.type === \"line\" || s.type === \"area\") &&\n input[s.index].stack !== undefined,\n );\n if (stackedLines.length) {\n const values = stackValues(\n stackedLines.map((s) => ({ s, stack: input[s.index].stack ?? \"\" })),\n percent,\n );\n stackedLines.forEach((s, k) => {\n s.stackBase = values[k].base;\n s.stackTop = values[k].top;\n });\n }\n\n // Candlesticks: one band per x, bodies of 60%\n const candles = visible.filter((s) => s.type === \"candlestick\");\n const candleBand = bandOf(candles, \"x\", xType === \"category\");\n for (const s of candles) s.barHalfWidth = candleBand * 0.3;\n\n // Heatmaps: cells of the size of the smallest step\n const heatmaps = visible.filter((s) => s.type === \"heatmap\");\n if (heatmaps.length) {\n const cx = bandOf(heatmaps, \"x\", xType === \"category\") / 2;\n const cy = bandOf(heatmaps, \"y\", yType === \"category\") / 2;\n for (const s of heatmaps) s.cellHalf = { x: cx, y: cy };\n }\n\n // X range\n const xOpts = options.xAxis;\n let xRange: Range;\n if (xType === \"category\") {\n xRange = [-0.5, Math.max(1, categories.length) - 0.5];\n } else {\n const values: number[] = [];\n for (const s of visible) {\n values.push(s.cols.xMin, s.cols.xMax);\n const pad =\n s.type === \"bar\"\n ? band / 2\n : s.type === \"candlestick\"\n ? candleBand / 2\n : s.type === \"heatmap\"\n ? s.cellHalf.x\n : 0;\n if (pad) values.push(s.cols.xMin - pad, s.cols.xMax + pad);\n }\n xRange = ensureSpan(\n ...extent(values),\n xType === \"time\" ? [Date.now() - 86400000, Date.now()] : [0, 1],\n );\n const pointsOnly = series.every((s) => s.type === \"scatter\");\n if (pointsOnly) {\n const pad = (xRange[1] - xRange[0]) * 0.04;\n xRange = [xRange[0] - pad, xRange[1] + pad];\n }\n const nice = xOpts?.nice ?? (pointsOnly && xType === \"linear\");\n if (nice && xType === \"linear\") {\n xRange = niceDomain(xRange[0], xRange[1], xOpts?.tickCount ?? 6);\n }\n }\n if (xOpts?.min !== undefined) xRange[0] = xOpts.min;\n if (xOpts?.max !== undefined) xRange[1] = xOpts.max;\n xRange = ensureSpan(xRange[0], xRange[1]);\n\n // Y range\n let yRange: Range;\n if (yType === \"category\") {\n yRange = [-0.5, Math.max(1, yCategories.length) - 0.5];\n } else {\n const yValues: number[] = [];\n for (const s of visible) {\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n yValues.push(...extent(s.barBase), ...extent(s.barTop));\n } else if (s.stackBase && s.stackTop) {\n yValues.push(...extent(s.stackBase), ...extent(s.stackTop));\n } else if (s.type === \"heatmap\") {\n yValues.push(s.cols.yMin - s.cellHalf.y, s.cols.yMax + s.cellHalf.y);\n } else {\n yValues.push(s.cols.yMin, s.cols.yMax);\n }\n }\n const filled = bars.length > 0 || visible.some((s) => s.type === \"area\");\n if (bars.length || yOpts?.zero) yValues.push(0);\n if (bars.some((s) => s.showLabels)) {\n // room for the value labels above the tallest bar\n const [lo, hi] = extent(yValues);\n if (hi > 0) yValues.push(hi + (hi - Math.min(0, lo)) * 0.1);\n if (lo < 0) yValues.push(lo - (Math.max(0, hi) - lo) * 0.1);\n }\n yRange = ensureSpan(...extent(yValues));\n if (series.every((s) => s.type === \"scatter\")) {\n const pad = (yRange[1] - yRange[0]) * 0.06;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n } else if (candles.length && !bars.length) {\n // room above / below the wicks\n const pad = (yRange[1] - yRange[0]) * 0.04;\n yRange = [yRange[0] - pad, yRange[1] + pad];\n }\n if ((yOpts?.nice ?? !heatmaps.length) && yType === \"linear\") {\n yRange = niceDomain(yRange[0], yRange[1], yOpts?.tickCount ?? 5);\n }\n if (percent && (bars.length || stackedLines.length)) {\n // 100% stacks: exactly 0-100 (or -100-100)\n yRange = [extent(yValues)[0] < 0 ? -100 : 0, 100];\n }\n if (filled && !yOpts?.zero) {\n // bars start at zero: no padding below / above it\n if (yRange[0] < 0 && extent(yValues)[0] >= 0) yRange[0] = 0;\n }\n }\n if (yOpts?.min !== undefined) yRange[0] = yOpts.min;\n if (yOpts?.max !== undefined) yRange[1] = yOpts.max;\n yRange = ensureSpan(yRange[0], yRange[1]);\n\n const zoomOption =\n options.interaction === false\n ? false\n : options.interaction === true || options.interaction === undefined\n ? true\n : (options.interaction.zoom ?? true);\n const zoomAxes =\n zoomOption === false\n ? { x: false, y: false }\n : zoomOption === true\n ? { x: true, y: allScatter }\n : { x: zoomOption.includes(\"x\"), y: zoomOption.includes(\"y\") };\n\n const tooltip =\n typeof options.tooltip === \"object\" ? options.tooltip : undefined;\n\n const yFormat =\n yOpts?.format ??\n (percent && (bars.length || stackedLines.length)\n ? (v: number) => `${+v.toFixed(1)}%`\n : undefined);\n\n return {\n series,\n x: axisModel(xOpts, xType, categories, false),\n y: {\n ...axisModel(yOpts, yType, yCategories, yType !== \"category\"),\n format: yFormat,\n },\n base: { x: xRange, y: yRange },\n allScatter,\n zoom: zoomAxes,\n tooltipMode: tooltip?.mode ?? (allScatter ? \"nearest\" : \"axis\"),\n baseline: Math.min(Math.max(0, yRange[0]), yRange[1]),\n minSpan: {\n x: xType === \"category\" ? 1 : (xRange[1] - xRange[0]) * 1e-7,\n y: yType === \"category\" ? 1 : (yRange[1] - yRange[0]) * 1e-7,\n },\n percent,\n stacks: input.map((s) =>\n s.stack !== undefined &&\n (s.type === \"bar\" || s.type === \"line\" || s.type === \"area\" || !s.type)\n ? `${s.type === \"bar\" ? \"bar\" : \"line\"}:${s.stack}`\n : null,\n ),\n };\n};\n\n/** Y value drawn for a point: its stacked top for stacks, the close for candles */\nexport const plottedY = (s: SeriesModel, i: number): number =>\n s.barTop ? s.barTop[i] : s.stackTop ? s.stackTop[i] : s.cols.y[i];\n\nconst grids = new WeakMap<SeriesColumns, GridIndex>();\n\n/** Spatial index of a scatter series, built on first use and kept with its data */\nexport const gridOf = (s: SeriesModel): GridIndex => {\n let grid = grids.get(s.cols);\n if (!grid) {\n grid = new GridIndex(s.cols.x, s.cols.y, s.cols.count);\n grids.set(s.cols, grid);\n }\n return grid;\n};\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ var e=(e,t=e.fontSize,n=400)=>`${n} ${t}px ${e.fontFamily}`,t=(e,t,n,r)=>{let{plot:i}=t,a=e.x===void 0?i.x+i.width/2:t.xToPx(e.x),o=e.y===void 0?i.y+i.height/2:t.yToPx(e.y),s=a-n/2,c=o-r/2;return e.anchor===`top`?c=o+6:e.anchor===`bottom`?c=o-6-r:e.anchor===`left`?s=a+6:e.anchor===`right`&&(s=a-6-n),s=Math.max(i.x+6,Math.min(s,i.x+i.width-6-n)),c=Math.max(i.y+2,Math.min(c,i.y+i.height-2-r)),{x:s,y:c,width:n,height:r}},n=(e,t)=>e.x<t.x+t.width&&t.x<e.x+e.width&&e.y<t.y+t.height&&t.y<e.y+e.height,r=(e,t)=>e.x>=t.x&&e.y>=t.y&&e.x+e.width<=t.x+t.width&&e.y+e.height<=t.y+t.height,i=(e,t,i,a,o=[])=>{let s=[];for(let c of e){let e=i(c.text),l=c.r+4,u={x:c.x-e/2,y:c.y-l-a,width:e,height:a},d={x:c.x-e/2,y:c.y+l,width:e,height:a},f=(c.placement===`above`?[u]:c.placement===`below`?[d]:[{x:c.x+l,y:c.y-a/2,width:e,height:a},{x:c.x-l-e,y:c.y-a/2,width:e,height:a},u,d]).find(e=>r(e,t)&&!o.some(t=>n(t,e)));f&&(o.push(f),s.push({label:c,box:f}))}return s};exports.font=e,exports.placeLabels=i,exports.textBox=t;
2
+ //# sourceMappingURL=overlay.cjs.map