@primeui/chart-core 0.0.1-alpha.1

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 (299) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +1 -0
  3. package/dist/animations/index.d.mts +136 -0
  4. package/dist/animations/index.mjs +18 -0
  5. package/dist/annotation.utils-Bm0lOO1o.d.mts +290 -0
  6. package/dist/borderRadius.utils-Cz73LLR_.d.mts +54 -0
  7. package/dist/canvas-D4vigq47.d.mts +34 -0
  8. package/dist/canvas.utils-D2WHi2gL.d.mts +167 -0
  9. package/dist/cartesian/index.d.mts +94 -0
  10. package/dist/cartesian/index.mjs +93 -0
  11. package/dist/chunk-22ST6YPP.mjs +304 -0
  12. package/dist/chunk-2QK2KOBN.mjs +10 -0
  13. package/dist/chunk-2QRS4YQ5.mjs +18 -0
  14. package/dist/chunk-3FFJEX4A.mjs +261 -0
  15. package/dist/chunk-3IYSJ2U7.mjs +567 -0
  16. package/dist/chunk-3OZLP4I4.mjs +190 -0
  17. package/dist/chunk-3WEMHXZI.mjs +198 -0
  18. package/dist/chunk-3Z62EUJN.mjs +138 -0
  19. package/dist/chunk-4C6EVJ54.mjs +362 -0
  20. package/dist/chunk-53HW45JB.mjs +102 -0
  21. package/dist/chunk-55Y3WI6S.mjs +186 -0
  22. package/dist/chunk-5JCI2DEB.mjs +97 -0
  23. package/dist/chunk-66T4MRC5.mjs +113 -0
  24. package/dist/chunk-6HSEJLSR.mjs +376 -0
  25. package/dist/chunk-6STOLMCA.mjs +187 -0
  26. package/dist/chunk-7CMVDIOU.mjs +54 -0
  27. package/dist/chunk-7QQ6ETB4.mjs +228 -0
  28. package/dist/chunk-A6ZQZFL2.mjs +272 -0
  29. package/dist/chunk-ADKLH73T.mjs +1 -0
  30. package/dist/chunk-AGU3NG6D.mjs +22 -0
  31. package/dist/chunk-AHYIS6EB.mjs +230 -0
  32. package/dist/chunk-AP3UYWYT.mjs +4 -0
  33. package/dist/chunk-ARB5T6MP.mjs +326 -0
  34. package/dist/chunk-ARRGOEFX.mjs +585 -0
  35. package/dist/chunk-AUF4CHDP.mjs +422 -0
  36. package/dist/chunk-B4FTADAZ.mjs +561 -0
  37. package/dist/chunk-BABQKA6K.mjs +339 -0
  38. package/dist/chunk-BETFQBM2.mjs +197 -0
  39. package/dist/chunk-BKP26M4K.mjs +413 -0
  40. package/dist/chunk-BZN2QHGP.mjs +200 -0
  41. package/dist/chunk-C36VWQ7A.mjs +86 -0
  42. package/dist/chunk-CHW4RKY3.mjs +16 -0
  43. package/dist/chunk-CINXJIRR.mjs +120 -0
  44. package/dist/chunk-DN6AXQYZ.mjs +667 -0
  45. package/dist/chunk-DP2IZNN3.mjs +92 -0
  46. package/dist/chunk-DTWTCFRG.mjs +119 -0
  47. package/dist/chunk-EAMUNLRU.mjs +172 -0
  48. package/dist/chunk-EDAKJLNA.mjs +17 -0
  49. package/dist/chunk-ERVQB2VZ.mjs +59 -0
  50. package/dist/chunk-FFMT6OCO.mjs +92 -0
  51. package/dist/chunk-FHTC2YDB.mjs +102 -0
  52. package/dist/chunk-FRST55HY.mjs +16 -0
  53. package/dist/chunk-HDFGCN2F.mjs +132 -0
  54. package/dist/chunk-IEGLX7VL.mjs +42 -0
  55. package/dist/chunk-ILUWFYGY.mjs +220 -0
  56. package/dist/chunk-IXOWSEHO.mjs +114 -0
  57. package/dist/chunk-J4RI2C2G.mjs +172 -0
  58. package/dist/chunk-J65DBT4R.mjs +13 -0
  59. package/dist/chunk-JGOVWSKH.mjs +179 -0
  60. package/dist/chunk-JO7VACY2.mjs +25 -0
  61. package/dist/chunk-JWFBOPM6.mjs +122 -0
  62. package/dist/chunk-KNDZP446.mjs +895 -0
  63. package/dist/chunk-KP2TWD4Z.mjs +90 -0
  64. package/dist/chunk-KQIFO5I3.mjs +225 -0
  65. package/dist/chunk-KVDEROP6.mjs +59 -0
  66. package/dist/chunk-LKC7MZKK.mjs +87 -0
  67. package/dist/chunk-LVMDQ4OJ.mjs +305 -0
  68. package/dist/chunk-M7B3JF43.mjs +90 -0
  69. package/dist/chunk-MTGMXRNF.mjs +136 -0
  70. package/dist/chunk-N3TIT3OH.mjs +1040 -0
  71. package/dist/chunk-NHRK5KU2.mjs +890 -0
  72. package/dist/chunk-NKUYIWAP.mjs +243 -0
  73. package/dist/chunk-NPDZLYIF.mjs +238 -0
  74. package/dist/chunk-O2X6FF45.mjs +499 -0
  75. package/dist/chunk-OGJ6IIBW.mjs +176 -0
  76. package/dist/chunk-OHGCZZPZ.mjs +403 -0
  77. package/dist/chunk-OWW3K55O.mjs +351 -0
  78. package/dist/chunk-OXTFAWSK.mjs +60 -0
  79. package/dist/chunk-PLSDU3C2.mjs +890 -0
  80. package/dist/chunk-PRDVPOZX.mjs +223 -0
  81. package/dist/chunk-Q6PPVIHU.mjs +21 -0
  82. package/dist/chunk-QQBXUDM4.mjs +885 -0
  83. package/dist/chunk-QS76E3TD.mjs +111 -0
  84. package/dist/chunk-QWQ6HY4I.mjs +209 -0
  85. package/dist/chunk-R6Y3R7EW.mjs +135 -0
  86. package/dist/chunk-RBLZRT5K.mjs +190 -0
  87. package/dist/chunk-RO4N6YFS.mjs +167 -0
  88. package/dist/chunk-RQ3CKQOX.mjs +984 -0
  89. package/dist/chunk-SALTGZFR.mjs +208 -0
  90. package/dist/chunk-SANZPAJ4.mjs +14 -0
  91. package/dist/chunk-SDBPQ5CF.mjs +624 -0
  92. package/dist/chunk-SSLTFJ3U.mjs +364 -0
  93. package/dist/chunk-SXHVDJGF.mjs +77 -0
  94. package/dist/chunk-TA4MVAEX.mjs +243 -0
  95. package/dist/chunk-TAHCOZHF.mjs +1772 -0
  96. package/dist/chunk-TQ6S34QZ.mjs +152 -0
  97. package/dist/chunk-UPRXABX5.mjs +90 -0
  98. package/dist/chunk-VGLSBZDN.mjs +71 -0
  99. package/dist/chunk-VN7CKCSE.mjs +364 -0
  100. package/dist/chunk-VVI3OBPJ.mjs +524 -0
  101. package/dist/chunk-VWF57TS3.mjs +62 -0
  102. package/dist/chunk-WA3OVISZ.mjs +179 -0
  103. package/dist/chunk-WCG35U6M.mjs +964 -0
  104. package/dist/chunk-WFTX4AQJ.mjs +194 -0
  105. package/dist/chunk-WFVOQ2QZ.mjs +18 -0
  106. package/dist/chunk-WH3C3Y7P.mjs +149 -0
  107. package/dist/chunk-WPFUV7K3.mjs +488 -0
  108. package/dist/chunk-WRULPWHD.mjs +492 -0
  109. package/dist/chunk-WS64BZXT.mjs +1 -0
  110. package/dist/chunk-WY4AURRE.mjs +2419 -0
  111. package/dist/chunk-WYLILAOO.mjs +167 -0
  112. package/dist/chunk-X4D7FKUS.mjs +62 -0
  113. package/dist/chunk-X7T34OLW.mjs +139 -0
  114. package/dist/chunk-XIHBK5D3.mjs +68 -0
  115. package/dist/chunk-XQQCGFYB.mjs +50 -0
  116. package/dist/chunk-XTVE4P3L.mjs +214 -0
  117. package/dist/chunk-XUAASRXW.mjs +579 -0
  118. package/dist/chunk-Y3L3D4GQ.mjs +685 -0
  119. package/dist/chunk-YBJ56XJS.mjs +132 -0
  120. package/dist/chunk-ZQFK6CAE.mjs +1 -0
  121. package/dist/chunk-ZT2Z7ERM.mjs +874 -0
  122. package/dist/chunk-ZTL2FQEW.mjs +714 -0
  123. package/dist/circular/arc/index.d.mts +8 -0
  124. package/dist/circular/arc/index.mjs +3 -0
  125. package/dist/circular/index.d.mts +44 -0
  126. package/dist/circular/index.mjs +13 -0
  127. package/dist/collect.utils-DiKB4ciO.d.mts +12 -0
  128. package/dist/computeChartState-BTVIqwyO.d.mts +304 -0
  129. package/dist/controller-BJE1AZ3q.d.mts +82 -0
  130. package/dist/controller-BoNigQJr.d.mts +63 -0
  131. package/dist/controllers/index.d.mts +16 -0
  132. package/dist/controllers/index.mjs +110 -0
  133. package/dist/datalabel.utils-CkjGeB8S.d.mts +122 -0
  134. package/dist/decimation.utils-CcvJVhI4.d.mts +244 -0
  135. package/dist/geometry-DUUQJXVM.d.mts +60 -0
  136. package/dist/index-DseIZa1j.d.mts +167 -0
  137. package/dist/index.d.mts +88 -0
  138. package/dist/index.mjs +110 -0
  139. package/dist/orchestrator/index.d.mts +264 -0
  140. package/dist/orchestrator/index.mjs +33 -0
  141. package/dist/plugins/index.d.mts +18 -0
  142. package/dist/plugins/index.mjs +1 -0
  143. package/dist/property-animations-D433wXzz.d.mts +580 -0
  144. package/dist/property-store-NORUWFND.d.mts +17 -0
  145. package/dist/radial/index.d.mts +14 -0
  146. package/dist/radial/index.mjs +37 -0
  147. package/dist/renderers/axis/index.d.mts +39 -0
  148. package/dist/renderers/axis/index.mjs +8 -0
  149. package/dist/renderers/circular/index.d.mts +13 -0
  150. package/dist/renderers/circular/index.mjs +13 -0
  151. package/dist/renderers/index.d.mts +83 -0
  152. package/dist/renderers/index.mjs +75 -0
  153. package/dist/renderers/navigator/index.d.mts +103 -0
  154. package/dist/renderers/navigator/index.mjs +8 -0
  155. package/dist/resize.utils-D_2qm6rv.d.mts +142 -0
  156. package/dist/ring.utils-DXvrxMkU.d.mts +138 -0
  157. package/dist/scale-KFv30jqZ.d.mts +307 -0
  158. package/dist/scales-Drf8AIhL.d.mts +75 -0
  159. package/dist/series/bar/canvas/index.d.mts +8 -0
  160. package/dist/series/bar/canvas/index.mjs +10 -0
  161. package/dist/series/bar/controller/index.d.mts +105 -0
  162. package/dist/series/bar/controller/index.mjs +44 -0
  163. package/dist/series/bar/controller-canvas/index.d.mts +7 -0
  164. package/dist/series/bar/controller-canvas/index.mjs +49 -0
  165. package/dist/series/bar/controller-svg/index.d.mts +7 -0
  166. package/dist/series/bar/controller-svg/index.mjs +49 -0
  167. package/dist/series/bar/index.d.mts +60 -0
  168. package/dist/series/bar/index.mjs +13 -0
  169. package/dist/series/bar/svg/index.d.mts +8 -0
  170. package/dist/series/bar/svg/index.mjs +11 -0
  171. package/dist/series/candlestick/canvas/index.d.mts +8 -0
  172. package/dist/series/candlestick/canvas/index.mjs +8 -0
  173. package/dist/series/candlestick/controller/index.d.mts +123 -0
  174. package/dist/series/candlestick/controller/index.mjs +40 -0
  175. package/dist/series/candlestick/controller-canvas/index.d.mts +7 -0
  176. package/dist/series/candlestick/controller-canvas/index.mjs +45 -0
  177. package/dist/series/candlestick/controller-svg/index.d.mts +7 -0
  178. package/dist/series/candlestick/controller-svg/index.mjs +45 -0
  179. package/dist/series/candlestick/index.d.mts +11 -0
  180. package/dist/series/candlestick/index.mjs +10 -0
  181. package/dist/series/candlestick/svg/index.d.mts +8 -0
  182. package/dist/series/candlestick/svg/index.mjs +8 -0
  183. package/dist/series/heatmap/canvas/index.d.mts +16 -0
  184. package/dist/series/heatmap/canvas/index.mjs +9 -0
  185. package/dist/series/heatmap/controller/index.d.mts +110 -0
  186. package/dist/series/heatmap/controller/index.mjs +23 -0
  187. package/dist/series/heatmap/controller-canvas/index.d.mts +7 -0
  188. package/dist/series/heatmap/controller-canvas/index.mjs +28 -0
  189. package/dist/series/heatmap/controller-svg/index.d.mts +7 -0
  190. package/dist/series/heatmap/controller-svg/index.mjs +28 -0
  191. package/dist/series/heatmap/index.d.mts +34 -0
  192. package/dist/series/heatmap/index.mjs +13 -0
  193. package/dist/series/heatmap/svg/index.d.mts +15 -0
  194. package/dist/series/heatmap/svg/index.mjs +10 -0
  195. package/dist/series/line/canvas/index.d.mts +6 -0
  196. package/dist/series/line/canvas/index.mjs +9 -0
  197. package/dist/series/line/controller/index.d.mts +111 -0
  198. package/dist/series/line/controller/index.mjs +47 -0
  199. package/dist/series/line/controller-canvas/index.d.mts +7 -0
  200. package/dist/series/line/controller-canvas/index.mjs +54 -0
  201. package/dist/series/line/controller-svg/index.d.mts +7 -0
  202. package/dist/series/line/controller-svg/index.mjs +54 -0
  203. package/dist/series/line/index.d.mts +49 -0
  204. package/dist/series/line/index.mjs +13 -0
  205. package/dist/series/line/svg/index.d.mts +6 -0
  206. package/dist/series/line/svg/index.mjs +9 -0
  207. package/dist/series/pie/canvas/index.d.mts +8 -0
  208. package/dist/series/pie/canvas/index.mjs +10 -0
  209. package/dist/series/pie/controller/index.d.mts +174 -0
  210. package/dist/series/pie/controller/index.mjs +110 -0
  211. package/dist/series/pie/controller-canvas/index.d.mts +8 -0
  212. package/dist/series/pie/controller-canvas/index.mjs +119 -0
  213. package/dist/series/pie/controller-svg/index.d.mts +8 -0
  214. package/dist/series/pie/controller-svg/index.mjs +118 -0
  215. package/dist/series/pie/index.d.mts +59 -0
  216. package/dist/series/pie/index.mjs +15 -0
  217. package/dist/series/pie/svg/index.d.mts +6 -0
  218. package/dist/series/pie/svg/index.mjs +11 -0
  219. package/dist/series/polar/canvas/index.d.mts +6 -0
  220. package/dist/series/polar/canvas/index.mjs +7 -0
  221. package/dist/series/polar/controller/index.d.mts +102 -0
  222. package/dist/series/polar/controller/index.mjs +46 -0
  223. package/dist/series/polar/controller-canvas/index.d.mts +8 -0
  224. package/dist/series/polar/controller-canvas/index.mjs +52 -0
  225. package/dist/series/polar/controller-svg/index.d.mts +8 -0
  226. package/dist/series/polar/controller-svg/index.mjs +52 -0
  227. package/dist/series/polar/index.d.mts +25 -0
  228. package/dist/series/polar/index.mjs +16 -0
  229. package/dist/series/polar/svg/index.d.mts +10 -0
  230. package/dist/series/polar/svg/index.mjs +8 -0
  231. package/dist/series/radar/canvas/index.d.mts +6 -0
  232. package/dist/series/radar/canvas/index.mjs +8 -0
  233. package/dist/series/radar/controller/index.d.mts +121 -0
  234. package/dist/series/radar/controller/index.mjs +43 -0
  235. package/dist/series/radar/controller-canvas/index.d.mts +8 -0
  236. package/dist/series/radar/controller-canvas/index.mjs +51 -0
  237. package/dist/series/radar/controller-svg/index.d.mts +8 -0
  238. package/dist/series/radar/controller-svg/index.mjs +51 -0
  239. package/dist/series/radar/index.d.mts +40 -0
  240. package/dist/series/radar/index.mjs +13 -0
  241. package/dist/series/radar/svg/index.d.mts +12 -0
  242. package/dist/series/radar/svg/index.mjs +9 -0
  243. package/dist/series/scatter/canvas/index.d.mts +8 -0
  244. package/dist/series/scatter/canvas/index.mjs +11 -0
  245. package/dist/series/scatter/controller/index.d.mts +124 -0
  246. package/dist/series/scatter/controller/index.mjs +44 -0
  247. package/dist/series/scatter/controller-canvas/index.d.mts +7 -0
  248. package/dist/series/scatter/controller-canvas/index.mjs +51 -0
  249. package/dist/series/scatter/controller-svg/index.d.mts +7 -0
  250. package/dist/series/scatter/controller-svg/index.mjs +51 -0
  251. package/dist/series/scatter/index.d.mts +25 -0
  252. package/dist/series/scatter/index.mjs +14 -0
  253. package/dist/series/scatter/svg/index.d.mts +8 -0
  254. package/dist/series/scatter/svg/index.mjs +12 -0
  255. package/dist/series/treemap/canvas/index.d.mts +50 -0
  256. package/dist/series/treemap/canvas/index.mjs +10 -0
  257. package/dist/series/treemap/controller/index.d.mts +130 -0
  258. package/dist/series/treemap/controller/index.mjs +20 -0
  259. package/dist/series/treemap/controller-canvas/index.d.mts +7 -0
  260. package/dist/series/treemap/controller-canvas/index.mjs +25 -0
  261. package/dist/series/treemap/controller-svg/index.d.mts +7 -0
  262. package/dist/series/treemap/controller-svg/index.mjs +25 -0
  263. package/dist/series/treemap/index.d.mts +15 -0
  264. package/dist/series/treemap/index.mjs +12 -0
  265. package/dist/series/treemap/svg/index.d.mts +15 -0
  266. package/dist/series/treemap/svg/index.mjs +9 -0
  267. package/dist/slices-DtewiwJx.d.mts +72 -0
  268. package/dist/spatialIndex.utils-B_GJkotZ.d.mts +5 -0
  269. package/dist/squarify.utils-B9CQBpa1.d.mts +50 -0
  270. package/dist/stacking-CChuAcLN.d.mts +319 -0
  271. package/dist/streaming.utils-DH-g1gNP.d.mts +49 -0
  272. package/dist/sync/index.d.mts +130 -0
  273. package/dist/sync/index.mjs +5 -0
  274. package/dist/tooltip.renderer-D5wpSlBa.d.mts +210 -0
  275. package/dist/utils/color/index.d.mts +58 -0
  276. package/dist/utils/color/index.mjs +4 -0
  277. package/dist/utils/data/index.d.mts +180 -0
  278. package/dist/utils/data/index.mjs +7 -0
  279. package/dist/utils/export/index.d.mts +14 -0
  280. package/dist/utils/export/index.mjs +6 -0
  281. package/dist/utils/index.d.mts +49 -0
  282. package/dist/utils/index.mjs +29 -0
  283. package/dist/utils/interaction/index.d.mts +255 -0
  284. package/dist/utils/interaction/index.mjs +9 -0
  285. package/dist/utils/layout/index.d.mts +3 -0
  286. package/dist/utils/layout/index.mjs +10 -0
  287. package/dist/utils/math/index.d.mts +162 -0
  288. package/dist/utils/math/index.mjs +1 -0
  289. package/dist/utils/render/index.d.mts +19 -0
  290. package/dist/utils/render/index.mjs +3 -0
  291. package/dist/utils/specialized/index.d.mts +37 -0
  292. package/dist/utils/specialized/index.mjs +66 -0
  293. package/dist/utils/text/index.d.mts +39 -0
  294. package/dist/utils/text/index.mjs +8 -0
  295. package/dist/utils/theme/index.d.mts +295 -0
  296. package/dist/utils/theme/index.mjs +5 -0
  297. package/dist/utils/zoom/index.d.mts +90 -0
  298. package/dist/utils/zoom/index.mjs +3 -0
  299. package/package.json +56 -0
@@ -0,0 +1,97 @@
1
+ // src/utils/interaction/interaction.utils.ts
2
+ function hitTest(regions, x, y) {
3
+ for (const region of regions) {
4
+ if (region.contains(x, y)) {
5
+ return region;
6
+ }
7
+ }
8
+ return null;
9
+ }
10
+ function hitTestAll(regions, x, y) {
11
+ const hits = [];
12
+ for (const region of regions) {
13
+ if (region.contains(x, y)) {
14
+ hits.push(region);
15
+ }
16
+ }
17
+ return hits;
18
+ }
19
+ function createSliceRegion(data, datasetId, index, cx, cy, outerRadius, startAngle, endAngle, innerRadius = 0) {
20
+ const arcSpan = endAngle - startAngle;
21
+ const isFullCircle = arcSpan >= 359.9;
22
+ return {
23
+ data,
24
+ datasetId,
25
+ index,
26
+ contains(x, y) {
27
+ if (outerRadius <= 0) return false;
28
+ const dx = x - cx;
29
+ const dy = y - cy;
30
+ const distanceSq = dx * dx + dy * dy;
31
+ const outerRadiusSq = outerRadius * outerRadius;
32
+ const innerRadiusSq = innerRadius * innerRadius;
33
+ if (distanceSq > outerRadiusSq) return false;
34
+ if (innerRadius > 0 && distanceSq < innerRadiusSq) return false;
35
+ if (isFullCircle) return true;
36
+ let angle = Math.atan2(dy, dx) * (180 / Math.PI);
37
+ if (angle < 0) angle += 360;
38
+ const start = (startAngle % 360 + 360) % 360;
39
+ const end = (endAngle % 360 + 360) % 360;
40
+ if (start <= end) {
41
+ return angle >= start && angle <= end;
42
+ }
43
+ return angle >= start || angle <= end;
44
+ }
45
+ };
46
+ }
47
+ function createRectRegion(data, datasetId, index, x, y, width, height) {
48
+ return {
49
+ data,
50
+ datasetId,
51
+ index,
52
+ contains(px, py) {
53
+ return px >= x && px <= x + width && py >= y && py <= y + height;
54
+ }
55
+ };
56
+ }
57
+ function createCircleRegion(data, datasetId, index, cx, cy, radius) {
58
+ const radiusSq = radius * radius;
59
+ return {
60
+ data,
61
+ datasetId,
62
+ index,
63
+ contains(x, y) {
64
+ const dx = x - cx;
65
+ const dy = y - cy;
66
+ return dx * dx + dy * dy <= radiusSq;
67
+ }
68
+ };
69
+ }
70
+ function createLineRegion(data, datasetId, index, x1, y1, x2, y2, hitWidth = 6) {
71
+ const halfWidth = hitWidth / 2;
72
+ return {
73
+ data,
74
+ datasetId,
75
+ index,
76
+ contains(px, py) {
77
+ const dx = x2 - x1;
78
+ const dy = y2 - y1;
79
+ const lengthSq = dx * dx + dy * dy;
80
+ if (lengthSq === 0) {
81
+ const d = Math.sqrt((px - x1) ** 2 + (py - y1) ** 2);
82
+ return d <= halfWidth;
83
+ }
84
+ const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lengthSq));
85
+ const projX = x1 + t * dx;
86
+ const projY = y1 + t * dy;
87
+ const distance = Math.sqrt((px - projX) ** 2 + (py - projY) ** 2);
88
+ return distance <= halfWidth;
89
+ }
90
+ };
91
+ }
92
+ function isIndexVisible(visibility, index) {
93
+ if (!visibility) return true;
94
+ return visibility.get(index) ?? true;
95
+ }
96
+
97
+ export { createCircleRegion, createLineRegion, createRectRegion, createSliceRegion, hitTest, hitTestAll, isIndexVisible };
@@ -0,0 +1,113 @@
1
+ import { computeBarLabelPosition } from './chunk-AUF4CHDP.mjs';
2
+ import { formatDataLabelText } from './chunk-OXTFAWSK.mjs';
3
+ import { DEFAULT_LABEL_SPACING } from './chunk-NKUYIWAP.mjs';
4
+ import { makeItemContext, resolveAccessor } from './chunk-O2X6FF45.mjs';
5
+
6
+ // src/cartesian/label.ts
7
+ var BASELINE_TO_CANVAS = { central: "middle", hanging: "top", auto: "alphabetic" };
8
+ function resolveBarLabels(bars, colors, datasetTotal, orientation, config, isPercentStacked, seriesName, data) {
9
+ const labels = [];
10
+ const fontSizeAccessor = config.fontSizeAccessor;
11
+ const colorAccessor = config.colorAccessor;
12
+ const needsCtx = fontSizeAccessor !== void 0 || colorAccessor !== void 0;
13
+ for (const bar of bars) {
14
+ if (orientation === "vertical" ? bar.height < 2 : bar.width < 2) continue;
15
+ const percentage = isPercentStacked ? bar.value : datasetTotal > 0 ? Math.abs(bar.value) / datasetTotal * 100 : 0;
16
+ if (config.minPercentage > 0 && percentage < config.minPercentage) continue;
17
+ const text = formatDataLabelText(bar.value, percentage, config.display, config.formatter);
18
+ if (!text) continue;
19
+ const pos = computeBarLabelPosition(bar, orientation, DEFAULT_LABEL_SPACING);
20
+ const labelCtx = needsCtx ? makeItemContext(data?.[bar.dataIndex], bar.dataIndex) : null;
21
+ const perLabelFontSize = fontSizeAccessor && labelCtx ? resolveAccessor(fontSizeAccessor, labelCtx, { arrayMode: "cycle" }) : void 0;
22
+ const perLabelColorRaw = colorAccessor && labelCtx ? resolveAccessor(colorAccessor, labelCtx, { arrayMode: "cycle" }) : void 0;
23
+ const perLabelColor = typeof perLabelColorRaw === "string" ? perLabelColorRaw : void 0;
24
+ labels.push({
25
+ dataIndex: bar.dataIndex,
26
+ value: bar.value,
27
+ percentage,
28
+ text,
29
+ category: bar.category ?? "",
30
+ seriesName,
31
+ color: String(colors[bar.dataIndex % colors.length] ?? config.color ?? ""),
32
+ x: Math.round(pos.x),
33
+ y: Math.round(pos.y),
34
+ textAnchor: pos.textAnchor,
35
+ baseline: pos.baseline,
36
+ canvasTextAlign: pos.textAnchor === "middle" ? "center" : pos.textAnchor,
37
+ canvasTextBaseline: BASELINE_TO_CANVAS[pos.baseline] ?? "alphabetic",
38
+ fontSize: perLabelFontSize,
39
+ textColor: perLabelColor
40
+ });
41
+ }
42
+ return labels;
43
+ }
44
+ function resolveScatterLabels(points, seriesColor, config, seriesName, data) {
45
+ const labels = [];
46
+ const fontSizeAccessor = config.fontSizeAccessor;
47
+ const colorAccessor = config.colorAccessor;
48
+ const needsCtx = fontSizeAccessor !== void 0 || colorAccessor !== void 0;
49
+ for (const pt of points) {
50
+ if (!Number.isFinite(pt.yValue) || !Number.isFinite(pt.py)) continue;
51
+ const text = formatDataLabelText(pt.yValue, 0, config.display, config.formatter);
52
+ if (!text) continue;
53
+ const labelCtx = needsCtx ? makeItemContext(data?.[pt.dataIndex], pt.dataIndex) : null;
54
+ const perLabelFontSize = fontSizeAccessor && labelCtx ? resolveAccessor(fontSizeAccessor, labelCtx, { arrayMode: "cycle" }) : void 0;
55
+ const perLabelColorRaw = colorAccessor && labelCtx ? resolveAccessor(colorAccessor, labelCtx, { arrayMode: "cycle" }) : void 0;
56
+ const perLabelColor = typeof perLabelColorRaw === "string" ? perLabelColorRaw : void 0;
57
+ labels.push({
58
+ dataIndex: pt.dataIndex,
59
+ value: pt.yValue,
60
+ percentage: 0,
61
+ text,
62
+ category: "",
63
+ seriesName,
64
+ color: seriesColor,
65
+ x: Math.round(pt.px),
66
+ y: Math.round(pt.py - pt.radius - DEFAULT_LABEL_SPACING),
67
+ textAnchor: "middle",
68
+ baseline: "auto",
69
+ canvasTextAlign: "center",
70
+ canvasTextBaseline: "alphabetic",
71
+ fontSize: perLabelFontSize,
72
+ textColor: perLabelColor
73
+ });
74
+ }
75
+ return labels;
76
+ }
77
+ function resolvePointLabels(points, seriesColor, datasetTotal, config, seriesName, data) {
78
+ const labels = [];
79
+ const fontSizeAccessor = config.fontSizeAccessor;
80
+ const colorAccessor = config.colorAccessor;
81
+ const needsCtx = fontSizeAccessor !== void 0 || colorAccessor !== void 0;
82
+ for (const pt of points) {
83
+ if (pt.value == null || Number.isNaN(pt.y)) continue;
84
+ const percentage = datasetTotal > 0 ? Math.abs(pt.value) / datasetTotal * 100 : 0;
85
+ if (config.minPercentage > 0 && percentage < config.minPercentage) continue;
86
+ const text = formatDataLabelText(pt.value, percentage, config.display, config.formatter);
87
+ if (!text) continue;
88
+ const labelCtx = needsCtx ? makeItemContext(data?.[pt.dataIndex], pt.dataIndex) : null;
89
+ const perLabelFontSize = fontSizeAccessor && labelCtx ? resolveAccessor(fontSizeAccessor, labelCtx, { arrayMode: "cycle" }) : void 0;
90
+ const perLabelColorRaw = colorAccessor && labelCtx ? resolveAccessor(colorAccessor, labelCtx, { arrayMode: "cycle" }) : void 0;
91
+ const perLabelColor = typeof perLabelColorRaw === "string" ? perLabelColorRaw : void 0;
92
+ labels.push({
93
+ dataIndex: pt.dataIndex,
94
+ value: pt.value,
95
+ percentage,
96
+ text,
97
+ category: pt.category ?? "",
98
+ seriesName,
99
+ color: seriesColor,
100
+ x: Math.round(pt.x),
101
+ y: Math.round(pt.y - DEFAULT_LABEL_SPACING),
102
+ textAnchor: "middle",
103
+ baseline: "auto",
104
+ canvasTextAlign: "center",
105
+ canvasTextBaseline: "alphabetic",
106
+ fontSize: perLabelFontSize,
107
+ textColor: perLabelColor
108
+ });
109
+ }
110
+ return labels;
111
+ }
112
+
113
+ export { BASELINE_TO_CANVAS, resolveBarLabels, resolvePointLabels, resolveScatterLabels };
@@ -0,0 +1,376 @@
1
+ import { createSvgLinePathBuilder, traceCurve, reversedBaseEdge, invertCurveForReverse } from './chunk-HDFGCN2F.mjs';
2
+ import { batchResolveRequired, resolveAccessor, makeItemContext } from './chunk-O2X6FF45.mjs';
3
+ import { createBandScale, calculateNiceDomain, createLinearScale } from './chunk-RQ3CKQOX.mjs';
4
+
5
+ // src/series/line/geometry.ts
6
+ var DEFAULT_CURVE = "linear";
7
+ var DEFAULT_TENSION = 0.5;
8
+ var DEFAULT_CONNECT_NULLS = "gap";
9
+ function buildLinePath(points, curve, tension) {
10
+ if (points.length === 0) return "";
11
+ const builder = createSvgLinePathBuilder();
12
+ builder.moveTo(points[0].x, points[0].y);
13
+ traceCurve(builder, points, curve, tension);
14
+ return builder.build();
15
+ }
16
+ function buildFillPath(points, curve, baselineY, tension) {
17
+ if (points.length === 0) return "";
18
+ const builder = createSvgLinePathBuilder();
19
+ builder.moveTo(points[0].x, points[0].y);
20
+ traceCurve(builder, points, curve, tension);
21
+ builder.lineTo(points[points.length - 1].x, baselineY);
22
+ builder.lineTo(points[0].x, baselineY);
23
+ builder.closePath();
24
+ return builder.build();
25
+ }
26
+ function buildStackedFillPath(points, curve, tension) {
27
+ if (points.length === 0) return "";
28
+ const builder = createSvgLinePathBuilder();
29
+ builder.moveTo(points[0].x, points[0].y);
30
+ traceCurve(builder, points, curve, tension);
31
+ const basePoints = reversedBaseEdge(points);
32
+ builder.lineTo(basePoints[0].x, basePoints[0].y);
33
+ traceCurve(builder, basePoints, invertCurveForReverse(curve), tension);
34
+ builder.closePath();
35
+ return builder.build();
36
+ }
37
+ function applyTipExtension(layout, progress) {
38
+ const curve = layout.curve;
39
+ const tension = layout.tension;
40
+ const pts = layout.visiblePoints;
41
+ if (pts.length < 2) return null;
42
+ const last = pts[pts.length - 1];
43
+ const prev = pts[pts.length - 2];
44
+ const origX = last.x;
45
+ const origY = last.y;
46
+ last.x = prev.x + (origX - prev.x) * progress;
47
+ last.y = prev.y + (origY - prev.y) * progress;
48
+ let segIndex = -1;
49
+ for (let i = layout.segments.length - 1; i >= 0; i--) {
50
+ if (layout.segments[i].points.length > 0) {
51
+ segIndex = i;
52
+ break;
53
+ }
54
+ }
55
+ if (segIndex < 0) {
56
+ last.x = origX;
57
+ last.y = origY;
58
+ return null;
59
+ }
60
+ const seg = layout.segments[segIndex];
61
+ const origLinePath = seg.linePath;
62
+ const origFillPath = seg.fillPath;
63
+ seg.linePath = buildLinePath(seg.points, curve, tension);
64
+ if (origFillPath && seg.points.length > 0) {
65
+ const baselineY = seg.points[0].baseY ?? layout.chartArea.y + layout.chartArea.height;
66
+ seg.fillPath = buildFillPath(seg.points, curve, baselineY, tension);
67
+ }
68
+ return { lastPoint: last, origX, origY, segIndex, origLinePath, origFillPath };
69
+ }
70
+ function restoreTipExtension(layout, state) {
71
+ state.lastPoint.x = state.origX;
72
+ state.lastPoint.y = state.origY;
73
+ const seg = layout.segments[state.segIndex];
74
+ seg.linePath = state.origLinePath;
75
+ seg.fillPath = state.origFillPath;
76
+ }
77
+ function buildRangeFillPath(pointsA, pointsB, curve, tension = DEFAULT_TENSION) {
78
+ if (pointsA.length < 2 || pointsB.length < 2) return null;
79
+ const builder = createSvgLinePathBuilder();
80
+ builder.moveTo(pointsA[0].x, pointsA[0].y);
81
+ traceCurve(builder, pointsA, curve, tension);
82
+ const reversedB = [];
83
+ for (let i = pointsB.length - 1; i >= 0; i--) {
84
+ reversedB.push(pointsB[i]);
85
+ }
86
+ builder.lineTo(reversedB[0].x, reversedB[0].y);
87
+ traceCurve(builder, reversedB, invertCurveForReverse(curve), tension);
88
+ builder.closePath();
89
+ return builder.build();
90
+ }
91
+ function buildDualRangeFillPaths(pointsA, pointsB, curve = "linear", tension = DEFAULT_TENSION) {
92
+ const len = Math.min(pointsA.length, pointsB.length);
93
+ if (len < 2) return null;
94
+ const abovePaths = [];
95
+ const belowPaths = [];
96
+ let segVertices = [{ xA: pointsA[0].x, yA: pointsA[0].y, xB: pointsB[0].x, yB: pointsB[0].y }];
97
+ let segAbove = pointsA[0].y <= pointsB[0].y;
98
+ for (let i = 0; i < len - 1; i++) {
99
+ const ax0 = pointsA[i].x, ay0 = pointsA[i].y;
100
+ const ax1 = pointsA[i + 1].x, ay1 = pointsA[i + 1].y;
101
+ const by0 = pointsB[i].y;
102
+ const bx1 = pointsB[i + 1].x, by1 = pointsB[i + 1].y;
103
+ if (isNaN(ay0) || isNaN(ay1) || isNaN(by0) || isNaN(by1)) {
104
+ if (segVertices.length >= 2) {
105
+ flushSegment(segVertices, segAbove, abovePaths, belowPaths, curve, tension);
106
+ }
107
+ if (i + 1 < len) {
108
+ segVertices = [{ xA: ax1, yA: ay1, xB: bx1, yB: by1 }];
109
+ segAbove = ay1 <= by1;
110
+ }
111
+ continue;
112
+ }
113
+ const dA = ay0 - by0;
114
+ const dB = ay1 - by1;
115
+ if (dA * dB < 0) {
116
+ const t = dA / (dA - dB);
117
+ const ix = ax0 + (ax1 - ax0) * t;
118
+ const iy = ay0 + (ay1 - ay0) * t;
119
+ segVertices.push({ xA: ix, yA: iy, xB: ix, yB: iy });
120
+ flushSegment(segVertices, segAbove, abovePaths, belowPaths, curve, tension);
121
+ segAbove = !segAbove;
122
+ segVertices = [{ xA: ix, yA: iy, xB: ix, yB: iy }];
123
+ } else if (dA === 0 && dB !== 0) {
124
+ const newAbove = dB < 0;
125
+ if (newAbove !== segAbove) {
126
+ flushSegment(segVertices, segAbove, abovePaths, belowPaths, curve, tension);
127
+ segAbove = newAbove;
128
+ segVertices = [{ xA: ax0, yA: ay0, xB: ax0, yB: by0 }];
129
+ }
130
+ }
131
+ segVertices.push({ xA: ax1, yA: ay1, xB: bx1, yB: by1 });
132
+ }
133
+ if (segVertices.length >= 2) {
134
+ flushSegment(segVertices, segAbove, abovePaths, belowPaths, curve, tension);
135
+ }
136
+ if (abovePaths.length === 0 && belowPaths.length === 0) return null;
137
+ return { abovePaths, belowPaths };
138
+ }
139
+ function flushSegment(vertices, isAbove, abovePaths, belowPaths, curve, tension) {
140
+ if (vertices.length < 2) return;
141
+ const builder = createSvgLinePathBuilder();
142
+ const ptsA = vertices.map((v) => ({ x: v.xA, y: v.yA, dataIndex: 0, value: 0, visible: true, category: "" }));
143
+ builder.moveTo(ptsA[0].x, ptsA[0].y);
144
+ traceCurve(builder, ptsA, curve, tension);
145
+ const ptsB = [];
146
+ for (let i = vertices.length - 1; i >= 0; i--) {
147
+ ptsB.push({ x: vertices[i].xB, y: vertices[i].yB, dataIndex: 0, value: 0, visible: true, category: "" });
148
+ }
149
+ builder.lineTo(ptsB[0].x, ptsB[0].y);
150
+ traceCurve(builder, ptsB, invertCurveForReverse(curve), tension);
151
+ builder.closePath();
152
+ const path = builder.build();
153
+ if (isAbove) {
154
+ abovePaths.push(path);
155
+ } else {
156
+ belowPaths.push(path);
157
+ }
158
+ }
159
+ function splitSegments(points, connectNulls) {
160
+ const bridge = connectNulls === true || connectNulls === "connect" || connectNulls === "zero";
161
+ if (bridge) {
162
+ const valid = points.filter((p) => p.visible && !isNaN(p.y));
163
+ return valid.length > 0 ? [valid] : [];
164
+ }
165
+ const segments = [];
166
+ let current = [];
167
+ for (const pt of points) {
168
+ if (pt.visible && pt.value !== null && !isNaN(pt.y) && !isNaN(pt.x)) {
169
+ current.push(pt);
170
+ } else if (current.length > 0) {
171
+ segments.push(current);
172
+ current = [];
173
+ }
174
+ }
175
+ if (current.length > 0) segments.push(current);
176
+ return segments;
177
+ }
178
+ function resolveStyleValue(value, ctx) {
179
+ if (value === void 0) return void 0;
180
+ if (typeof value === "function") return value(ctx);
181
+ return value;
182
+ }
183
+ function resolveSegmentStyle(overrides, ctx) {
184
+ return {
185
+ segmentColor: resolveStyleValue(overrides.segmentColor, ctx),
186
+ segmentStrokeWidth: resolveStyleValue(overrides.segmentStrokeWidth, ctx),
187
+ segmentDash: resolveStyleValue(overrides.segmentDash, ctx),
188
+ segmentFillColor: resolveStyleValue(overrides.segmentFillColor, ctx)
189
+ };
190
+ }
191
+ function segmentStyleKey(s) {
192
+ return `${s.segmentColor ?? ""}|${s.segmentStrokeWidth ?? ""}|${(s.segmentDash ?? []).join(",")}|${s.segmentFillColor ?? ""}`;
193
+ }
194
+ function splitSegmentByStyle(segPts, overrides, curve, tension, isArea, isStacked, baselineY, data, seriesId, seriesIndex) {
195
+ if (segPts.length < 2) {
196
+ return [
197
+ {
198
+ points: segPts,
199
+ linePath: buildLinePath(segPts, curve, tension),
200
+ fillPath: isArea ? isStacked ? buildStackedFillPath(segPts, curve, tension) : buildFillPath(segPts, curve, baselineY, tension) : void 0
201
+ }
202
+ ];
203
+ }
204
+ const hasCallback = typeof overrides.segmentColor === "function" || typeof overrides.segmentStrokeWidth === "function" || typeof overrides.segmentDash === "function" || typeof overrides.segmentFillColor === "function";
205
+ if (!hasCallback) {
206
+ const style = resolveSegmentStyle(overrides, {
207
+ p0: segPts[0],
208
+ p1: segPts[1],
209
+ p0DataIndex: segPts[0].dataIndex,
210
+ p1DataIndex: segPts[1].dataIndex,
211
+ datum0: data[segPts[0].dataIndex],
212
+ datum1: data[segPts[1].dataIndex],
213
+ seriesId,
214
+ seriesIndex
215
+ });
216
+ return [
217
+ {
218
+ points: segPts,
219
+ linePath: buildLinePath(segPts, curve, tension),
220
+ fillPath: isArea ? isStacked ? buildStackedFillPath(segPts, curve, tension) : buildFillPath(segPts, curve, baselineY, tension) : void 0,
221
+ style
222
+ }
223
+ ];
224
+ }
225
+ const pairStyles = [];
226
+ for (let i = 0; i < segPts.length - 1; i++) {
227
+ const p0 = segPts[i];
228
+ const p1 = segPts[i + 1];
229
+ const ctx = {
230
+ p0,
231
+ p1,
232
+ p0DataIndex: p0.dataIndex,
233
+ p1DataIndex: p1.dataIndex,
234
+ datum0: data[p0.dataIndex],
235
+ datum1: data[p1.dataIndex],
236
+ seriesId,
237
+ seriesIndex
238
+ };
239
+ pairStyles.push(resolveSegmentStyle(overrides, ctx));
240
+ }
241
+ const runs = [];
242
+ let runStart = 0;
243
+ let runKey = segmentStyleKey(pairStyles[0]);
244
+ for (let i = 1; i < pairStyles.length; i++) {
245
+ const key = segmentStyleKey(pairStyles[i]);
246
+ if (key !== runKey) {
247
+ runs.push({ startIdx: runStart, endIdx: i, style: pairStyles[runStart] });
248
+ runStart = i;
249
+ runKey = key;
250
+ }
251
+ }
252
+ runs.push({ startIdx: runStart, endIdx: pairStyles.length, style: pairStyles[runStart] });
253
+ return runs.map((run) => {
254
+ const pts = segPts.slice(run.startIdx, run.endIdx + 1);
255
+ return {
256
+ points: pts,
257
+ linePath: buildLinePath(pts, curve, tension),
258
+ fillPath: isArea ? isStacked ? buildStackedFillPath(pts, curve, tension) : buildFillPath(pts, curve, baselineY, tension) : void 0,
259
+ style: run.style
260
+ };
261
+ });
262
+ }
263
+ function calculateLineLayout(props, chartArea, config) {
264
+ const { data = [] } = props;
265
+ const curve = props.curve ?? DEFAULT_CURVE;
266
+ const tension = props.tension ?? DEFAULT_TENSION;
267
+ const connectNulls = props.connectNulls ?? DEFAULT_CONNECT_NULLS;
268
+ const fillOpacity = props.fillOpacity;
269
+ const isArea = typeof fillOpacity === "number" && fillOpacity > 0;
270
+ const categoryAccessor = props.categoryField;
271
+ const valueAccessor = props.valueField;
272
+ const categories = categoryAccessor ? batchResolveRequired(categoryAccessor, data, "categoryField") : data.map((_, i) => String(i));
273
+ const rawValues = valueAccessor ? batchResolveRequired(valueAccessor, data, "valueField") : data.map((d) => {
274
+ const v = d["value"];
275
+ return v != null && !isNaN(Number(v)) ? Number(v) : null;
276
+ });
277
+ const categoryScale = config?.categoryScale ?? createBandScale(categories, [chartArea.x, chartArea.x + chartArea.width]);
278
+ const numericValues = rawValues.filter((v) => v !== null && v !== void 0 && !isNaN(Number(v)));
279
+ const valueDomain = config?.valueScale?.domain() ?? calculateNiceDomain(numericValues.length > 0 ? numericValues : [0, 1], {
280
+ includeZero: true
281
+ });
282
+ const valueScale = config?.valueScale ?? createLinearScale(valueDomain, [chartArea.y + chartArea.height, chartArea.y]);
283
+ const baselineY = Math.min(Math.max(valueScale(0), chartArea.y), chartArea.y + chartArea.height);
284
+ const lineColor = props.color != null && data.length > 0 ? resolveAccessor(props.color, makeItemContext(data[0], 0)) : props.color;
285
+ const seriesIdx = props.order ?? 0;
286
+ const stackBases = config?.stackBases;
287
+ const transformedValues = config?.transformedValues;
288
+ const treatNullAsZero = connectNulls === "zero";
289
+ const points = data.map((_, i) => {
290
+ const category = categories[i] ?? String(i);
291
+ const rawVal = rawValues[i];
292
+ const value = rawVal !== null && rawVal !== void 0 && !isNaN(Number(rawVal)) ? Number(rawVal) : null;
293
+ const visible = props.visibility ? props.visibility.get(i) !== false : true;
294
+ const bandLeft = categoryScale(category);
295
+ const centerX = bandLeft + categoryScale.bandwidth() / 2;
296
+ const stackBase = stackBases?.[i] ?? 0;
297
+ const effectiveValue = transformedValues ? transformedValues[i] : value;
298
+ const isNullPoint = effectiveValue === null || effectiveValue === void 0 || typeof effectiveValue === "number" && isNaN(effectiveValue);
299
+ const y = !isNullPoint ? valueScale(stackBase + effectiveValue) : treatNullAsZero ? valueScale(stackBase) : NaN;
300
+ return {
301
+ dataIndex: i,
302
+ x: centerX,
303
+ y,
304
+ value,
305
+ category,
306
+ visible,
307
+ ...stackBases && { baseY: valueScale(stackBase) }
308
+ };
309
+ });
310
+ const step = categoryScale.step();
311
+ if (step > 0) {
312
+ for (let i = 0; i < points.length; i++) {
313
+ const pt = points[i];
314
+ if (isNaN(pt.x) && pt.visible && pt.value !== null && !isNaN(pt.y)) {
315
+ const next = points[i + 1];
316
+ const prev = points[i - 1];
317
+ if (next && !isNaN(next.x) && next.visible && next.value !== null && !isNaN(next.y)) {
318
+ pt.x = next.x - step;
319
+ }
320
+ if (prev && !isNaN(prev.x) && prev.visible && prev.value !== null && !isNaN(prev.y)) {
321
+ pt.x = prev.x + step;
322
+ }
323
+ }
324
+ }
325
+ }
326
+ const visiblePoints = points.filter((p) => p.visible && p.value !== null && !isNaN(p.y) && !isNaN(p.x));
327
+ const pointGroups = splitSegments(points, connectNulls);
328
+ const isStacked = stackBases !== void 0;
329
+ const segmentOverrides = props.segmentColor || props.segmentStrokeWidth || props.segmentDash || props.segmentFillColor ? { segmentColor: props.segmentColor, segmentStrokeWidth: props.segmentStrokeWidth, segmentDash: props.segmentDash, segmentFillColor: props.segmentFillColor } : void 0;
330
+ let segments;
331
+ if (segmentOverrides) {
332
+ segments = [];
333
+ for (const segPts of pointGroups) {
334
+ segments.push(...splitSegmentByStyle(segPts, segmentOverrides, curve, tension, isArea, isStacked, baselineY, data, config?.seriesId, seriesIdx));
335
+ }
336
+ } else {
337
+ segments = pointGroups.map((segPts) => ({
338
+ points: segPts,
339
+ linePath: buildLinePath(segPts, curve, tension),
340
+ fillPath: isArea ? isStacked ? buildStackedFillPath(segPts, curve, tension) : buildFillPath(segPts, curve, baselineY, tension) : void 0
341
+ }));
342
+ }
343
+ return {
344
+ datasetId: "",
345
+ points,
346
+ visiblePoints,
347
+ segments,
348
+ categoryScale,
349
+ valueScale,
350
+ lineColor,
351
+ seriesIdx,
352
+ chartArea,
353
+ valueDomain,
354
+ isArea,
355
+ baselineY,
356
+ curve,
357
+ tension
358
+ };
359
+ }
360
+ function hitTestLine(x, y, props, layout) {
361
+ let nearestIndex = null;
362
+ const hitRadius = props.pointHitRadius ?? 10;
363
+ let minDistSq = hitRadius * hitRadius;
364
+ for (const pt of layout.visiblePoints) {
365
+ const dx = pt.x - x;
366
+ const dy = pt.y - y;
367
+ const distSq = dx * dx + dy * dy;
368
+ if (distSq < minDistSq) {
369
+ minDistSq = distSq;
370
+ nearestIndex = pt.dataIndex;
371
+ }
372
+ }
373
+ return nearestIndex;
374
+ }
375
+
376
+ export { applyTipExtension, buildDualRangeFillPaths, buildFillPath, buildLinePath, buildRangeFillPath, buildStackedFillPath, calculateLineLayout, hitTestLine, restoreTipExtension };