@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,984 @@
1
+ // src/utils/math/geometry.ts
2
+ function crisp(value, strokeWidth = 1) {
3
+ if (strokeWidth % 2 === 0) return Math.round(value);
4
+ return Math.round(value) + 0.5;
5
+ }
6
+ var toRad = (degrees) => degrees * Math.PI / 180;
7
+ var xCalc = (angle, radius) => {
8
+ return radius * Math.cos(toRad(angle));
9
+ };
10
+ var yCalc = (angle, radius) => {
11
+ return radius * Math.sin(toRad(angle));
12
+ };
13
+ var pointOnCircle = (cx, cy, angle, radius) => {
14
+ return {
15
+ x: cx + xCalc(angle, radius),
16
+ y: cy + yCalc(angle, radius)
17
+ };
18
+ };
19
+ var normalizeAngle = (angle) => {
20
+ const normalized = angle % 360;
21
+ return normalized < 0 ? normalized + 360 : normalized;
22
+ };
23
+ var normalizeAngleRelativeTo = (angle, rotation) => {
24
+ return normalizeAngle(angle - rotation) + rotation;
25
+ };
26
+ var calculateArcBoundingBox = (cx, cy, radius, startAngle, sweepAngle) => {
27
+ let minX = cx;
28
+ let maxX = cx;
29
+ let minY = cy;
30
+ let maxY = cy;
31
+ const endAngle = startAngle + sweepAngle;
32
+ const startPoint = pointOnCircle(cx, cy, startAngle, radius);
33
+ minX = Math.min(minX, startPoint.x);
34
+ maxX = Math.max(maxX, startPoint.x);
35
+ minY = Math.min(minY, startPoint.y);
36
+ maxY = Math.max(maxY, startPoint.y);
37
+ const endPoint = pointOnCircle(cx, cy, endAngle, radius);
38
+ minX = Math.min(minX, endPoint.x);
39
+ maxX = Math.max(maxX, endPoint.x);
40
+ minY = Math.min(minY, endPoint.y);
41
+ maxY = Math.max(maxY, endPoint.y);
42
+ const cardinalAngles = [0, 90, 180, 270];
43
+ for (const cardinal of cardinalAngles) {
44
+ if (isAngleInArc(cardinal, startAngle, sweepAngle)) {
45
+ const point = pointOnCircle(cx, cy, cardinal, radius);
46
+ minX = Math.min(minX, point.x);
47
+ maxX = Math.max(maxX, point.x);
48
+ minY = Math.min(minY, point.y);
49
+ maxY = Math.max(maxY, point.y);
50
+ }
51
+ }
52
+ const width = maxX - minX;
53
+ const height = maxY - minY;
54
+ const visualCenterX = (minX + maxX) / 2;
55
+ const visualCenterY = (minY + maxY) / 2;
56
+ const centerOffsetX = cx - visualCenterX;
57
+ const centerOffsetY = cy - visualCenterY;
58
+ return {
59
+ minX,
60
+ maxX,
61
+ minY,
62
+ maxY,
63
+ width,
64
+ height,
65
+ centerOffsetX,
66
+ centerOffsetY
67
+ };
68
+ };
69
+ var isAngleInArc = (angle, startAngle, sweepAngle) => {
70
+ const normalizedAngle = normalizeAngle(angle);
71
+ const normalizedStart = normalizeAngle(startAngle);
72
+ const endAngle = normalizedStart + sweepAngle;
73
+ if (sweepAngle >= 360) {
74
+ return true;
75
+ }
76
+ if (endAngle <= 360) {
77
+ return normalizedAngle >= normalizedStart && normalizedAngle <= endAngle;
78
+ } else {
79
+ const wrappedEnd = endAngle - 360;
80
+ return normalizedAngle >= normalizedStart || normalizedAngle <= wrappedEnd;
81
+ }
82
+ };
83
+
84
+ // src/utils/math/number.ts
85
+ var clamp = (value, min, max) => {
86
+ return Math.min(Math.max(value, min), max);
87
+ };
88
+ var scaleLinear = (value, domainMin, domainMax, rangeMin, rangeMax) => {
89
+ return (value - domainMin) / (domainMax - domainMin) * (rangeMax - rangeMin) + rangeMin;
90
+ };
91
+ var findMin = (data) => {
92
+ let min = Infinity;
93
+ if (Array.isArray(data[0])) {
94
+ for (const arr of data) {
95
+ for (const val of arr) {
96
+ if (val < min) min = val;
97
+ }
98
+ }
99
+ } else {
100
+ for (const val of data) {
101
+ if (val < min) min = val;
102
+ }
103
+ }
104
+ return min;
105
+ };
106
+ var findMax = (data, isStacked = false) => {
107
+ if (Array.isArray(data[0])) {
108
+ const multiData = data;
109
+ if (isStacked) {
110
+ const numCategories = multiData[0]?.length ?? 0;
111
+ let maxSum = 0;
112
+ for (let catIdx = 0; catIdx < numCategories; catIdx++) {
113
+ let sum = 0;
114
+ for (let seriesIdx = 0; seriesIdx < multiData.length; seriesIdx++) {
115
+ sum += multiData[seriesIdx][catIdx];
116
+ }
117
+ maxSum = Math.max(maxSum, sum);
118
+ }
119
+ return maxSum;
120
+ }
121
+ let max2 = -Infinity;
122
+ for (const arr of multiData) {
123
+ for (const val of arr) {
124
+ if (val > max2) max2 = val;
125
+ }
126
+ }
127
+ return max2;
128
+ }
129
+ let max = -Infinity;
130
+ for (const val of data) {
131
+ if (val > max) max = val;
132
+ }
133
+ return max;
134
+ };
135
+
136
+ // src/utils/math/compare.ts
137
+ function shallowEqual(a, b) {
138
+ if (a === b) return true;
139
+ if (a == null || b == null) return false;
140
+ const keysA = Object.keys(a);
141
+ const keysB = Object.keys(b);
142
+ if (keysA.length !== keysB.length) return false;
143
+ for (const key of keysA) {
144
+ if (!equalValue(a[key], b[key])) return false;
145
+ }
146
+ return true;
147
+ }
148
+ function equalValue(va, vb) {
149
+ if (va === vb) return true;
150
+ if (typeof va === "function" && typeof vb === "function") return true;
151
+ if (typeof va !== "object" || typeof vb !== "object") return false;
152
+ if (va === null || vb === null) return false;
153
+ const aIsArray = Array.isArray(va);
154
+ const bIsArray = Array.isArray(vb);
155
+ if (aIsArray !== bIsArray) return false;
156
+ if (aIsArray) {
157
+ const aArr = va;
158
+ const bArr = vb;
159
+ if (aArr.length !== bArr.length) return false;
160
+ for (let i = 0; i < aArr.length; i++) {
161
+ if (!equalValue(aArr[i], bArr[i])) return false;
162
+ }
163
+ return true;
164
+ }
165
+ return shallowEqual(va, vb);
166
+ }
167
+
168
+ // src/utils/math/ticks.ts
169
+ function generateLogTicks(min, max, count = 5) {
170
+ const logMin = Math.floor(Math.log10(Math.max(min, 1e-10)));
171
+ const logMax = Math.ceil(Math.log10(Math.max(max, 1e-10)));
172
+ const decades = logMax - logMin;
173
+ if (decades <= 0) return [min, max];
174
+ const ticks = [];
175
+ if (decades <= count) {
176
+ const density = count / Math.max(decades, 1);
177
+ const subMults = density >= 9 ? [2, 3, 4, 5, 6, 7, 8, 9] : density >= 4 ? [2, 3, 5, 7] : density >= 2 ? [2, 5] : [];
178
+ for (let exp = logMin; exp <= logMax; exp++) {
179
+ const base = Math.pow(10, exp);
180
+ ticks.push(base);
181
+ for (const m of subMults) {
182
+ if (base * m <= max) ticks.push(base * m);
183
+ }
184
+ }
185
+ } else {
186
+ const step = Math.max(1, Math.ceil(decades / count));
187
+ for (let exp = logMin; exp <= logMax; exp += step) {
188
+ ticks.push(Math.pow(10, exp));
189
+ }
190
+ }
191
+ return ticks.filter((t) => t >= min && t <= max).sort((a, b) => a - b);
192
+ }
193
+ function generateNiceTicks(min, max, count = 5, exact = false) {
194
+ if (count < 2) count = 2;
195
+ const span = max - min;
196
+ if (span === 0) return [min];
197
+ const rawStep = span / (count - 1);
198
+ const magnitude = Math.pow(10, Math.floor(Math.log10(rawStep)));
199
+ const normalized = rawStep / magnitude;
200
+ const multiples = exact ? [1, 1.2, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] : [1, 2, 2.5, 5, 10];
201
+ let chosen = multiples[multiples.length - 1];
202
+ for (let i = 0; i < multiples.length; i++) {
203
+ const m = multiples[i];
204
+ const accept = exact ? m >= normalized : normalized <= (m + (multiples[i + 1] ?? m)) / 2;
205
+ if (accept) {
206
+ chosen = m;
207
+ break;
208
+ }
209
+ }
210
+ const niceStep = Math.round(chosen * magnitude * 1e10) / 1e10;
211
+ const niceMin = Math.floor(min / niceStep) * niceStep;
212
+ const ticks = [];
213
+ for (let tick = niceMin; tick <= max + niceStep * 0.5; tick += niceStep) {
214
+ const rounded = Math.round(tick * 1e10) / 1e10;
215
+ if (rounded < min - niceStep * 1e-3) continue;
216
+ ticks.push(rounded);
217
+ if (ticks.length > count + 2) break;
218
+ }
219
+ if (exact) {
220
+ const onThreshold = min === 0;
221
+ while (ticks.length < count) {
222
+ const appendSide = ticks.length % 2 === 1 || onThreshold;
223
+ if (appendSide) {
224
+ ticks.push(Math.round((ticks[ticks.length - 1] + niceStep) * 1e10) / 1e10);
225
+ } else {
226
+ ticks.unshift(Math.round((ticks[0] - niceStep) * 1e10) / 1e10);
227
+ }
228
+ }
229
+ }
230
+ return ticks;
231
+ }
232
+ function generateIntervalTicks(min, max, interval) {
233
+ if (interval <= 0 || !isFinite(interval)) return generateNiceTicks(min, max);
234
+ const ticks = [];
235
+ const start = Math.ceil(min / interval) * interval;
236
+ const roundedStart = Math.round(start * 1e10) / 1e10;
237
+ for (let tick = roundedStart; tick <= max + interval * 1e-3; tick += interval) {
238
+ const rounded = Math.round(tick * 1e10) / 1e10;
239
+ ticks.push(rounded);
240
+ if (ticks.length > 200) break;
241
+ }
242
+ return ticks;
243
+ }
244
+
245
+ // src/utils/math/domain.ts
246
+ function calculateNiceLogDomain(values) {
247
+ const positiveValues = values.filter((v) => v > 0);
248
+ if (positiveValues.length === 0) return [1, 10];
249
+ let min = Infinity;
250
+ let max = -Infinity;
251
+ for (const v of positiveValues) {
252
+ if (v < min) min = v;
253
+ if (v > max) max = v;
254
+ }
255
+ const FLOOR_STEPS = [1, 2, 5];
256
+ const CEIL_STEPS = [1, 2, 5, 10];
257
+ const floorNice = (v) => {
258
+ const k = Math.floor(Math.log10(v));
259
+ const base = Math.pow(10, k);
260
+ const m = v / base;
261
+ let step = FLOOR_STEPS[0];
262
+ for (const s of FLOOR_STEPS) if (s <= m + 1e-9) step = s;
263
+ return step * base;
264
+ };
265
+ const ceilNice = (v) => {
266
+ const k = Math.floor(Math.log10(v));
267
+ const base = Math.pow(10, k);
268
+ const m = v / base;
269
+ for (const s of CEIL_STEPS) if (s >= m - 1e-9) return s * base;
270
+ return 10 * base;
271
+ };
272
+ min = floorNice(min);
273
+ max = ceilNice(max);
274
+ if (min === max) max = min * 2;
275
+ return [min, max];
276
+ }
277
+ var DOMAIN_CACHE_MAX = 64;
278
+ var domainCache = /* @__PURE__ */ new Map();
279
+ function cacheDomain(key, result) {
280
+ if (domainCache.size >= DOMAIN_CACHE_MAX) {
281
+ const firstKey = domainCache.keys().next().value;
282
+ if (firstKey !== void 0) domainCache.delete(firstKey);
283
+ }
284
+ domainCache.set(key, result);
285
+ }
286
+ function calculateNiceDomain(values, options = {}) {
287
+ const { min: minOpt = "auto", max: maxOpt = "auto", includeZero = true, nice = true } = options;
288
+ if (values.length === 0) {
289
+ return [0, 1];
290
+ }
291
+ let rawMin = Infinity;
292
+ let rawMax = -Infinity;
293
+ for (const v of values) {
294
+ if (v < rawMin) rawMin = v;
295
+ if (v > rawMax) rawMax = v;
296
+ }
297
+ const cacheKey = `${rawMin}_${rawMax}_${minOpt}_${maxOpt}_${includeZero}_${nice}`;
298
+ const cached = domainCache.get(cacheKey);
299
+ if (cached) {
300
+ domainCache.delete(cacheKey);
301
+ domainCache.set(cacheKey, cached);
302
+ return cached;
303
+ }
304
+ let min = minOpt === "auto" ? rawMin : minOpt;
305
+ let max = maxOpt === "auto" ? rawMax : maxOpt;
306
+ if (includeZero) {
307
+ if (min > 0) min = 0;
308
+ if (max < 0) max = 0;
309
+ }
310
+ if (min === max) {
311
+ if (min === 0) return [0, 1];
312
+ const padding = Math.abs(min) * 0.1;
313
+ const result2 = [min - padding, max + padding];
314
+ cacheDomain(cacheKey, result2);
315
+ return result2;
316
+ }
317
+ let result;
318
+ if (nice) {
319
+ const span = max - min;
320
+ const magnitude = Math.pow(10, Math.floor(Math.log10(span)));
321
+ let niceMin = Math.floor(min / magnitude) * magnitude;
322
+ let niceMax = Math.ceil(max / magnitude) * magnitude;
323
+ const halfStep = magnitude / 2;
324
+ const tighterMax = Math.ceil(max / halfStep) * halfStep;
325
+ if (niceMax - max > halfStep && tighterMax >= max) niceMax = tighterMax;
326
+ const tighterMin = Math.floor(min / halfStep) * halfStep;
327
+ if (min - niceMin > halfStep && tighterMin <= min) niceMin = tighterMin;
328
+ if (niceMax < rawMax && !(includeZero && rawMax <= 0)) {
329
+ niceMax += magnitude;
330
+ }
331
+ if (niceMin >= rawMin && !(includeZero && rawMin >= 0)) {
332
+ niceMin -= magnitude;
333
+ if (rawMin >= 0) niceMin = Math.max(niceMin, 0);
334
+ }
335
+ if (includeZero) {
336
+ result = [Math.min(niceMin, 0), Math.max(niceMax, 0)];
337
+ } else {
338
+ result = [niceMin, niceMax];
339
+ }
340
+ } else {
341
+ result = [min, max];
342
+ }
343
+ cacheDomain(cacheKey, result);
344
+ return result;
345
+ }
346
+
347
+ // src/utils/devWarnings.ts
348
+ var CHART_WARNING_PREFIX = "[PrimeUI Chart]";
349
+ var issuedWarnings = /* @__PURE__ */ new Set();
350
+ function getImportMetaEnv() {
351
+ return import.meta.env ?? {};
352
+ }
353
+ function isChartDevWarningsEnabled() {
354
+ const env = getImportMetaEnv();
355
+ return Boolean(env.DEV) && !env.PROD;
356
+ }
357
+ function warnChartDevOnce(key, message) {
358
+ if (!isChartDevWarningsEnabled() || issuedWarnings.has(key)) {
359
+ return;
360
+ }
361
+ issuedWarnings.add(key);
362
+ console.warn(`${CHART_WARNING_PREFIX} ${message}`);
363
+ }
364
+
365
+ // src/utils/math/scales.ts
366
+ function createBandScale(domainValues, rangeValues, options = {}) {
367
+ const { chartPaddingMin = 0.05, chartPaddingMax = 0.05, categoryGap = 0.1 } = options;
368
+ const n = domainValues.length;
369
+ const rangeSpan = rangeValues[1] - rangeValues[0];
370
+ const paddingMinPx = rangeSpan * chartPaddingMin;
371
+ const paddingMaxPx = rangeSpan * chartPaddingMax;
372
+ const availableSpan = rangeSpan - paddingMinPx - paddingMaxPx;
373
+ const totalUnits = n - categoryGap;
374
+ const stepValue = n > 0 && totalUnits > 0 ? availableSpan / totalUnits : 0;
375
+ const bandwidthValue = stepValue * (1 - categoryGap);
376
+ const start = rangeValues[0] + paddingMinPx;
377
+ const indexMap = /* @__PURE__ */ new Map();
378
+ domainValues.forEach((cat, i) => indexMap.set(cat, i));
379
+ const scale = ((category) => {
380
+ const index = indexMap.get(category);
381
+ if (index === void 0) {
382
+ return NaN;
383
+ }
384
+ return start + index * stepValue;
385
+ });
386
+ scale.bandwidth = () => bandwidthValue;
387
+ scale.step = () => stepValue;
388
+ scale.domain = () => [...domainValues];
389
+ scale.range = () => [...rangeValues];
390
+ return scale;
391
+ }
392
+ function createVariwideBandScale(domainValues, rangeValues, options) {
393
+ const { chartPaddingMin = 0.05, chartPaddingMax = 0.05, categoryGap = 0.1, weights } = options;
394
+ const n = domainValues.length;
395
+ const rangeSpan = rangeValues[1] - rangeValues[0];
396
+ if (n === 0) {
397
+ const emptyScale = Object.assign((() => rangeValues[0]), { bandwidth: () => 0, bandwidthAt: () => 0, step: () => 0, domain: () => [], range: () => [...rangeValues] });
398
+ return emptyScale;
399
+ }
400
+ let totalWeight = 0;
401
+ for (const w of weights) totalWeight += Math.max(w, 0);
402
+ if (totalWeight === 0) totalWeight = n;
403
+ const paddingMinPx = rangeSpan * chartPaddingMin;
404
+ const paddingMaxPx = rangeSpan * chartPaddingMax;
405
+ const availableSpan = rangeSpan - paddingMinPx - paddingMaxPx;
406
+ const totalUnits = n - categoryGap;
407
+ const avgStep = totalUnits > 0 ? availableSpan / totalUnits : 0;
408
+ const gapPx = avgStep * categoryGap;
409
+ const totalGaps = (n - 1) * gapPx;
410
+ const barSpace = availableSpan - totalGaps;
411
+ const bandwidths = [];
412
+ for (let i = 0; i < n; i++) {
413
+ const w = Math.max(weights[i] ?? 0, 0) || totalWeight / n;
414
+ bandwidths[i] = w / totalWeight * barSpace;
415
+ }
416
+ const leftEdges = [];
417
+ let cursor = rangeValues[0] + paddingMinPx;
418
+ for (let i = 0; i < n; i++) {
419
+ leftEdges[i] = cursor;
420
+ cursor += bandwidths[i] + gapPx;
421
+ }
422
+ const indexMap = /* @__PURE__ */ new Map();
423
+ domainValues.forEach((cat, i) => indexMap.set(cat, i));
424
+ const avgBandwidth = barSpace / n;
425
+ const scale = ((category) => {
426
+ const idx = indexMap.get(category);
427
+ return idx !== void 0 ? leftEdges[idx] : rangeValues[0];
428
+ });
429
+ scale.bandwidth = () => avgBandwidth;
430
+ scale.bandwidthAt = (index) => bandwidths[index] ?? avgBandwidth;
431
+ scale.step = () => avgStep;
432
+ scale.domain = () => [...domainValues];
433
+ scale.range = () => [...rangeValues];
434
+ return scale;
435
+ }
436
+ function createLinearScale(domainValues, rangeValues) {
437
+ const domainSpan = domainValues[1] - domainValues[0];
438
+ const rangeSpan = rangeValues[1] - rangeValues[0];
439
+ const scale = ((value) => {
440
+ if (domainSpan === 0) return rangeValues[0];
441
+ return rangeValues[0] + (value - domainValues[0]) / domainSpan * rangeSpan;
442
+ });
443
+ scale.invert = (pixel) => {
444
+ if (rangeSpan === 0) return domainValues[0];
445
+ return domainValues[0] + (pixel - rangeValues[0]) / rangeSpan * domainSpan;
446
+ };
447
+ scale.ticks = (count = 5, exact = false) => {
448
+ return generateNiceTicks(domainValues[0], domainValues[1], count, exact);
449
+ };
450
+ scale.domain = () => [...domainValues];
451
+ scale.range = () => [...rangeValues];
452
+ return scale;
453
+ }
454
+ function createLogScale(domainValues, rangeValues) {
455
+ if (domainValues[0] <= 0) {
456
+ warnChartDevOnce(
457
+ "log-scale-nonpositive-domain",
458
+ `Logarithmic axis received a non-positive domain minimum (${domainValues[0]}). Values \u2264 0 cannot be represented on a log scale and are clamped to 1e-10 \u2014 negative/zero data points will be dropped or misplaced. Use a linear axis for data with non-positive values.`
459
+ );
460
+ }
461
+ const safeMin = Math.max(domainValues[0], 1e-10);
462
+ const safeMax = Math.max(domainValues[1], safeMin * 10);
463
+ const logMin = Math.log10(safeMin);
464
+ const logMax = Math.log10(safeMax);
465
+ const logSpan = logMax - logMin;
466
+ const rangeSpan = rangeValues[1] - rangeValues[0];
467
+ const scale = ((value) => {
468
+ if (logSpan === 0) return rangeValues[0];
469
+ const logValue = Math.log10(Math.max(value, 1e-10));
470
+ return rangeValues[0] + (logValue - logMin) / logSpan * rangeSpan;
471
+ });
472
+ scale.invert = (pixel) => {
473
+ if (rangeSpan === 0) return safeMin;
474
+ const logValue = logMin + (pixel - rangeValues[0]) / rangeSpan * logSpan;
475
+ return Math.pow(10, logValue);
476
+ };
477
+ scale.ticks = (count = 5) => {
478
+ return generateLogTicks(safeMin, safeMax, count);
479
+ };
480
+ scale.domain = () => [safeMin, safeMax];
481
+ scale.range = () => [...rangeValues];
482
+ return scale;
483
+ }
484
+
485
+ // src/utils/math/grouped-bar.ts
486
+ function calculateGroupedBarLayout(seriesCount, groupWidth, barGap = 0.02) {
487
+ if (seriesCount <= 0 || seriesCount === 1) {
488
+ return { barWidth: groupWidth, getOffset: () => 0 };
489
+ }
490
+ const numberOfGaps = seriesCount - 1;
491
+ const gapWidth = groupWidth * barGap;
492
+ const totalGapWidth = gapWidth * numberOfGaps;
493
+ const barWidth = (groupWidth - totalGapWidth) / seriesCount;
494
+ const getOffset = (seriesIndex) => {
495
+ return seriesIndex * (barWidth + gapWidth);
496
+ };
497
+ return { barWidth, getOffset };
498
+ }
499
+
500
+ // src/utils/data/time/core.ts
501
+ var MS = {
502
+ millisecond: 1,
503
+ second: 1e3,
504
+ minute: 6e4,
505
+ hour: 36e5,
506
+ day: 864e5,
507
+ week: 6048e5,
508
+ month: 2592e6,
509
+ // 30 days approx
510
+ quarter: 7776e6,
511
+ // 90 days approx
512
+ year: 31536e6
513
+ // 365 days approx
514
+ };
515
+ var TICK_INTERVALS = [
516
+ // milliseconds
517
+ { unit: "millisecond", count: 1 },
518
+ { unit: "millisecond", count: 2 },
519
+ { unit: "millisecond", count: 5 },
520
+ { unit: "millisecond", count: 10 },
521
+ { unit: "millisecond", count: 20 },
522
+ { unit: "millisecond", count: 50 },
523
+ { unit: "millisecond", count: 100 },
524
+ { unit: "millisecond", count: 200 },
525
+ { unit: "millisecond", count: 500 },
526
+ // seconds
527
+ { unit: "second", count: 1 },
528
+ { unit: "second", count: 2 },
529
+ { unit: "second", count: 5 },
530
+ { unit: "second", count: 10 },
531
+ { unit: "second", count: 15 },
532
+ { unit: "second", count: 30 },
533
+ // minutes
534
+ { unit: "minute", count: 1 },
535
+ { unit: "minute", count: 2 },
536
+ { unit: "minute", count: 5 },
537
+ { unit: "minute", count: 10 },
538
+ { unit: "minute", count: 15 },
539
+ { unit: "minute", count: 30 },
540
+ // hours
541
+ { unit: "hour", count: 1 },
542
+ { unit: "hour", count: 2 },
543
+ { unit: "hour", count: 3 },
544
+ { unit: "hour", count: 4 },
545
+ { unit: "hour", count: 6 },
546
+ { unit: "hour", count: 8 },
547
+ { unit: "hour", count: 12 },
548
+ // days
549
+ { unit: "day", count: 1 },
550
+ { unit: "day", count: 2 },
551
+ { unit: "day", count: 7 },
552
+ { unit: "day", count: 14 },
553
+ // weeks
554
+ { unit: "week", count: 1 },
555
+ { unit: "week", count: 2 },
556
+ { unit: "week", count: 4 },
557
+ // months
558
+ { unit: "month", count: 1 },
559
+ { unit: "month", count: 2 },
560
+ { unit: "month", count: 3 },
561
+ { unit: "month", count: 4 },
562
+ { unit: "month", count: 6 },
563
+ // quarters
564
+ { unit: "quarter", count: 1 },
565
+ // years
566
+ { unit: "year", count: 1 },
567
+ { unit: "year", count: 2 },
568
+ { unit: "year", count: 5 },
569
+ { unit: "year", count: 10 },
570
+ { unit: "year", count: 25 },
571
+ { unit: "year", count: 50 },
572
+ { unit: "year", count: 100 }
573
+ ];
574
+ var DEFAULT_FORMATS = {
575
+ millisecond: { hour: "2-digit", minute: "2-digit", second: "2-digit", fractionalSecondDigits: 3 },
576
+ second: { hour: "2-digit", minute: "2-digit", second: "2-digit" },
577
+ minute: { hour: "2-digit", minute: "2-digit" },
578
+ hour: { hour: "2-digit", minute: "2-digit" },
579
+ day: { month: "short", day: "numeric" },
580
+ week: { month: "short", day: "numeric" },
581
+ month: { month: "short", year: "numeric" },
582
+ quarter: { month: "short", year: "numeric" },
583
+ year: { year: "numeric" }
584
+ };
585
+ function toTimestamp(value) {
586
+ if (value instanceof Date) return value.getTime();
587
+ if (typeof value === "number") return value;
588
+ if (typeof value === "string") {
589
+ const num = Number(value);
590
+ if (value.trim() !== "" && !isNaN(num)) return num;
591
+ const ms = Date.parse(value);
592
+ if (!isNaN(ms)) return ms;
593
+ }
594
+ return NaN;
595
+ }
596
+ function intervalSpanMs(interval) {
597
+ return MS[interval.unit] * interval.count;
598
+ }
599
+ function selectTickInterval(domainSpanMs, pixelWidth, config) {
600
+ if (config?.baseInterval) return config.baseInterval;
601
+ const minSpacing = config?.minTickSpacing ?? 80;
602
+ const maxTicks = Math.max(2, Math.floor(pixelWidth / minSpacing));
603
+ const minIntervalMs = config?.minInterval ? intervalSpanMs(config.minInterval) : 0;
604
+ for (const interval of TICK_INTERVALS) {
605
+ if (minIntervalMs > 0 && intervalSpanMs(interval) < minIntervalMs) continue;
606
+ const approxTicks = domainSpanMs / intervalSpanMs(interval);
607
+ if (approxTicks <= maxTicks) return interval;
608
+ }
609
+ return TICK_INTERVALS[TICK_INTERVALS.length - 1];
610
+ }
611
+ function floorToUnit(timestamp, unit, multiple) {
612
+ const d = new Date(timestamp);
613
+ switch (unit) {
614
+ case "millisecond": {
615
+ const ms = d.getUTCMilliseconds();
616
+ d.setUTCMilliseconds(ms - ms % multiple);
617
+ return d.getTime();
618
+ }
619
+ case "second": {
620
+ d.setUTCMilliseconds(0);
621
+ const s = d.getUTCSeconds();
622
+ d.setUTCSeconds(s - s % multiple);
623
+ return d.getTime();
624
+ }
625
+ case "minute": {
626
+ d.setUTCMilliseconds(0);
627
+ d.setUTCSeconds(0);
628
+ const m = d.getUTCMinutes();
629
+ d.setUTCMinutes(m - m % multiple);
630
+ return d.getTime();
631
+ }
632
+ case "hour": {
633
+ d.setUTCMilliseconds(0);
634
+ d.setUTCSeconds(0);
635
+ d.setUTCMinutes(0);
636
+ const h = d.getUTCHours();
637
+ d.setUTCHours(h - h % multiple);
638
+ return d.getTime();
639
+ }
640
+ case "day": {
641
+ d.setUTCMilliseconds(0);
642
+ d.setUTCSeconds(0);
643
+ d.setUTCMinutes(0);
644
+ d.setUTCHours(0);
645
+ if (multiple > 1) {
646
+ const daysSinceEpoch = Math.floor(d.getTime() / MS.day);
647
+ return (daysSinceEpoch - daysSinceEpoch % multiple) * MS.day;
648
+ }
649
+ return d.getTime();
650
+ }
651
+ case "week": {
652
+ d.setUTCMilliseconds(0);
653
+ d.setUTCSeconds(0);
654
+ d.setUTCMinutes(0);
655
+ d.setUTCHours(0);
656
+ const dow = d.getUTCDay();
657
+ const diff = dow === 0 ? 6 : dow - 1;
658
+ d.setUTCDate(d.getUTCDate() - diff);
659
+ if (multiple > 1) {
660
+ const weeksSinceEpoch = Math.floor(d.getTime() / MS.week);
661
+ const floored = weeksSinceEpoch - weeksSinceEpoch % multiple;
662
+ return floored * MS.week;
663
+ }
664
+ return d.getTime();
665
+ }
666
+ case "month": {
667
+ d.setUTCMilliseconds(0);
668
+ d.setUTCSeconds(0);
669
+ d.setUTCMinutes(0);
670
+ d.setUTCHours(0);
671
+ d.setUTCDate(1);
672
+ const m = d.getUTCMonth();
673
+ d.setUTCMonth(m - m % multiple);
674
+ return d.getTime();
675
+ }
676
+ case "quarter": {
677
+ d.setUTCMilliseconds(0);
678
+ d.setUTCSeconds(0);
679
+ d.setUTCMinutes(0);
680
+ d.setUTCHours(0);
681
+ d.setUTCDate(1);
682
+ const q = Math.floor(d.getUTCMonth() / 3);
683
+ d.setUTCMonth(q * 3);
684
+ return d.getTime();
685
+ }
686
+ case "year": {
687
+ d.setUTCMilliseconds(0);
688
+ d.setUTCSeconds(0);
689
+ d.setUTCMinutes(0);
690
+ d.setUTCHours(0);
691
+ d.setUTCDate(1);
692
+ d.setUTCMonth(0);
693
+ const y = d.getUTCFullYear();
694
+ d.setUTCFullYear(y - y % multiple);
695
+ return d.getTime();
696
+ }
697
+ }
698
+ }
699
+ function advanceByUnit(timestamp, unit, count) {
700
+ const d = new Date(timestamp);
701
+ switch (unit) {
702
+ case "millisecond":
703
+ return timestamp + count;
704
+ case "second":
705
+ return timestamp + count * MS.second;
706
+ case "minute":
707
+ return timestamp + count * MS.minute;
708
+ case "hour":
709
+ return timestamp + count * MS.hour;
710
+ case "day":
711
+ d.setUTCDate(d.getUTCDate() + count);
712
+ return d.getTime();
713
+ case "week":
714
+ d.setUTCDate(d.getUTCDate() + count * 7);
715
+ return d.getTime();
716
+ case "month":
717
+ d.setUTCMonth(d.getUTCMonth() + count);
718
+ return d.getTime();
719
+ case "quarter":
720
+ d.setUTCMonth(d.getUTCMonth() + count * 3);
721
+ return d.getTime();
722
+ case "year":
723
+ d.setUTCFullYear(d.getUTCFullYear() + count);
724
+ return d.getTime();
725
+ }
726
+ }
727
+
728
+ // src/utils/data/time/ticks.ts
729
+ function generateTimeTicks(min, max, pixelWidth, config) {
730
+ const domainSpan = max - min;
731
+ if (domainSpan <= 0 || pixelWidth <= 0) {
732
+ return { ticks: [min], interval: { unit: "day", count: 1 } };
733
+ }
734
+ const interval = selectTickInterval(domainSpan, pixelWidth, config);
735
+ const ticks = [];
736
+ let current = floorToUnit(min, interval.unit, interval.count);
737
+ if (current < min) {
738
+ current = advanceByUnit(current, interval.unit, interval.count);
739
+ }
740
+ const MAX_TICKS = 200;
741
+ while (current <= max && ticks.length < MAX_TICKS) {
742
+ ticks.push(current);
743
+ const next = advanceByUnit(current, interval.unit, interval.count);
744
+ if (next <= current) break;
745
+ current = next;
746
+ }
747
+ return { ticks, interval };
748
+ }
749
+ var FORMATTER_CACHE_MAX = 50;
750
+ var formatterCache = /* @__PURE__ */ new Map();
751
+ function getFormatter(timezone, options, locale) {
752
+ const key = `${locale ?? ""}|${timezone ?? "UTC"}|${JSON.stringify(options)}`;
753
+ let fmt = formatterCache.get(key);
754
+ if (fmt) return fmt;
755
+ if (formatterCache.size >= FORMATTER_CACHE_MAX) {
756
+ const firstKey = formatterCache.keys().next().value;
757
+ if (firstKey !== void 0) formatterCache.delete(firstKey);
758
+ }
759
+ fmt = new Intl.DateTimeFormat(locale, { timeZone: timezone ?? "UTC", ...options });
760
+ formatterCache.set(key, fmt);
761
+ return fmt;
762
+ }
763
+ function formatDateTemplate(timestamp, template, timezone, locale) {
764
+ const d = new Date(timestamp);
765
+ const getPart = (opts) => {
766
+ return new Intl.DateTimeFormat(locale ?? "en-US", { timeZone: timezone ?? "UTC", ...opts }).format(d);
767
+ };
768
+ return template.replace(/YYYY|yyyy/g, getPart({ year: "numeric" })).replace(/MMM/g, getPart({ month: "short" })).replace(/MM/g, getPart({ month: "2-digit" })).replace(/dd/g, getPart({ day: "2-digit" })).replace(/HH/g, getPart({ hour: "2-digit", hour12: false })).replace(/mm/g, getPart({ minute: "2-digit" })).replace(/SSS/g, String(d.getUTCMilliseconds()).padStart(3, "0")).replace(/ss/g, getPart({ second: "2-digit" }));
769
+ }
770
+ function formatTimeTick(timestamp, unit, timezone, overrides, locale) {
771
+ const userFormat = overrides?.[unit];
772
+ if (typeof userFormat === "string") {
773
+ return formatDateTemplate(timestamp, userFormat, timezone, locale);
774
+ }
775
+ const options = userFormat ?? DEFAULT_FORMATS[unit];
776
+ const fmt = getFormatter(timezone, options, locale);
777
+ return fmt.format(new Date(timestamp));
778
+ }
779
+ function detectTickUnit(ticks) {
780
+ if (ticks.length < 2) return "day";
781
+ const avgInterval = (ticks[ticks.length - 1] - ticks[0]) / (ticks.length - 1);
782
+ if (avgInterval < MS.second) return "millisecond";
783
+ if (avgInterval < MS.minute) return "second";
784
+ if (avgInterval < MS.hour) return "minute";
785
+ if (avgInterval < MS.day) return "hour";
786
+ if (avgInterval < MS.week) return "day";
787
+ if (avgInterval < MS.month) return "week";
788
+ if (avgInterval < MS.quarter) return "month";
789
+ if (avgInterval < MS.year) return "quarter";
790
+ return "year";
791
+ }
792
+ function isPeriodBoundary(timestamp, tickUnit) {
793
+ const d = new Date(timestamp);
794
+ switch (tickUnit) {
795
+ case "millisecond":
796
+ case "second":
797
+ case "minute":
798
+ if (d.getUTCMinutes() === 0 && d.getUTCSeconds() === 0 && d.getUTCMilliseconds() === 0) {
799
+ return "hour";
800
+ }
801
+ return null;
802
+ case "hour":
803
+ if (d.getUTCHours() === 0) return "day";
804
+ return null;
805
+ case "day":
806
+ case "week":
807
+ if (d.getUTCMonth() === 0 && d.getUTCDate() === 1) return "year";
808
+ if (d.getUTCDate() === 1) return "month";
809
+ return null;
810
+ case "month":
811
+ case "quarter":
812
+ if (d.getUTCMonth() === 0) return "year";
813
+ return null;
814
+ case "year":
815
+ return null;
816
+ }
817
+ }
818
+
819
+ // src/utils/math/time-scale.ts
820
+ function createTimeScale(domainValues, rangeValues, options) {
821
+ const domainSpan = domainValues[1] - domainValues[0];
822
+ const rangeSpan = rangeValues[1] - rangeValues[0];
823
+ const scale = ((value) => {
824
+ if (domainSpan === 0) return rangeValues[0];
825
+ return rangeValues[0] + (value - domainValues[0]) / domainSpan * rangeSpan;
826
+ });
827
+ scale.invert = (pixel) => {
828
+ if (rangeSpan === 0) return domainValues[0];
829
+ return domainValues[0] + (pixel - rangeValues[0]) / rangeSpan * domainSpan;
830
+ };
831
+ scale.ticks = () => {
832
+ const pixelWidth = Math.abs(rangeSpan);
833
+ const { ticks } = generateTimeTicks(domainValues[0], domainValues[1], pixelWidth, options?.tickConfig);
834
+ return ticks;
835
+ };
836
+ scale.domain = () => [...domainValues];
837
+ scale.range = () => [...rangeValues];
838
+ return scale;
839
+ }
840
+ function calculateNiceTimeDomain(timestamps, options) {
841
+ const valid = timestamps.filter((t) => !isNaN(t));
842
+ if (valid.length === 0) return [0, 1];
843
+ let rawMin = Infinity;
844
+ let rawMax = -Infinity;
845
+ for (const t of valid) {
846
+ if (t < rawMin) rawMin = t;
847
+ if (t > rawMax) rawMax = t;
848
+ }
849
+ const hasExplicitMin = options?.min !== void 0 && options.min !== "auto";
850
+ const hasExplicitMax = options?.max !== void 0 && options.max !== "auto";
851
+ if (hasExplicitMin) {
852
+ rawMin = typeof options.min === "number" ? options.min : toTimestamp(options.min);
853
+ }
854
+ if (hasExplicitMax) {
855
+ rawMax = typeof options.max === "number" ? options.max : toTimestamp(options.max);
856
+ }
857
+ if (rawMin === rawMax) {
858
+ rawMin -= 432e5;
859
+ rawMax += 432e5;
860
+ }
861
+ const span = rawMax - rawMin;
862
+ const interval = selectTickInterval(span, 600);
863
+ const unit = interval.unit;
864
+ const count = interval.count;
865
+ const niceMin = hasExplicitMin ? rawMin : floorToUnit(rawMin, unit, count);
866
+ let niceMax = hasExplicitMax ? rawMax : floorToUnit(rawMax, unit, count);
867
+ if (!hasExplicitMax && niceMax < rawMax) {
868
+ niceMax = advanceByUnit(niceMax, unit, count);
869
+ }
870
+ return [niceMin, niceMax];
871
+ }
872
+ function createTimeBandAdapter(timestamps, timeScale) {
873
+ const sorted = [...timestamps].sort((a, b) => a - b);
874
+ const domain = sorted.map(String);
875
+ const [rangeStart, rangeEnd] = timeScale.range();
876
+ const rangeSpan = Math.abs(rangeEnd - rangeStart);
877
+ let minGapMs = Infinity;
878
+ for (let i = 1; i < sorted.length; i++) {
879
+ const gap = sorted[i] - sorted[i - 1];
880
+ if (gap > 0 && gap < minGapMs) minGapMs = gap;
881
+ }
882
+ let bw;
883
+ if (sorted.length <= 1 || !isFinite(minGapMs)) {
884
+ bw = rangeSpan / Math.max(sorted.length, 1);
885
+ } else {
886
+ const [domMin, domMax] = timeScale.domain();
887
+ const domSpan = domMax - domMin;
888
+ bw = domSpan > 0 ? minGapMs / domSpan * rangeSpan * 0.8 : rangeSpan;
889
+ }
890
+ bw = Math.min(bw, rangeSpan / Math.max(sorted.length, 1));
891
+ const stepValue = sorted.length > 1 ? rangeSpan / (sorted.length - 1) : rangeSpan;
892
+ const halfBw = bw / 2;
893
+ const scale = ((category) => {
894
+ let ts = Number(category);
895
+ if (isNaN(ts)) ts = toTimestamp(category);
896
+ return timeScale(ts) - halfBw;
897
+ });
898
+ scale.bandwidth = () => bw;
899
+ scale.step = () => stepValue;
900
+ scale.domain = () => [...domain];
901
+ scale.range = () => [rangeStart, rangeEnd];
902
+ return scale;
903
+ }
904
+ function createOrdinalTimeScale(sortedTimestamps, rangeValues, options) {
905
+ const rangeSpan = rangeValues[1] - rangeValues[0];
906
+ const count = sortedTimestamps.length;
907
+ const lastIdx = Math.max(0, count - 1);
908
+ const tsToFracIdx = (value) => {
909
+ if (count === 0) return 0;
910
+ if (count === 1) return 0;
911
+ if (value <= sortedTimestamps[0]) return 0;
912
+ if (value >= sortedTimestamps[lastIdx]) return lastIdx;
913
+ let lo = 0;
914
+ let hi = lastIdx;
915
+ while (lo + 1 < hi) {
916
+ const mid = lo + hi >> 1;
917
+ if (sortedTimestamps[mid] === value) return mid;
918
+ if (sortedTimestamps[mid] < value) lo = mid;
919
+ else hi = mid;
920
+ }
921
+ const span = sortedTimestamps[hi] - sortedTimestamps[lo];
922
+ return lo + (span > 0 ? (value - sortedTimestamps[lo]) / span : 0);
923
+ };
924
+ const visMinTs = options?.visibleDomain?.[0] ?? sortedTimestamps[0] ?? 0;
925
+ const visMaxTs = options?.visibleDomain?.[1] ?? sortedTimestamps[lastIdx] ?? 1;
926
+ const rawVisMinIdx = tsToFracIdx(visMinTs);
927
+ const rawVisMaxIdx = tsToFracIdx(visMaxTs);
928
+ const rawVisSpan = rawVisMaxIdx - rawVisMinIdx;
929
+ const padStart = options?.padStart ?? 0;
930
+ const padEnd = options?.padEnd ?? 0;
931
+ const visMinIdx = rawVisMinIdx - padStart * rawVisSpan;
932
+ const visMaxIdx = rawVisMaxIdx + padEnd * rawVisSpan;
933
+ const visSpan = visMaxIdx - visMinIdx;
934
+ const scale = ((value) => {
935
+ if (count === 0 || visSpan <= 0) return rangeValues[0];
936
+ const idx = tsToFracIdx(value);
937
+ return rangeValues[0] + (idx - visMinIdx) / visSpan * rangeSpan;
938
+ });
939
+ scale.invert = (pixel) => {
940
+ if (count === 0 || visSpan <= 0) return sortedTimestamps[0] ?? 0;
941
+ const fracIdx = visMinIdx + (pixel - rangeValues[0]) / rangeSpan * visSpan;
942
+ const clamped = Math.max(0, Math.min(lastIdx, fracIdx));
943
+ const lo = Math.floor(clamped);
944
+ const hi = Math.min(lo + 1, lastIdx);
945
+ const frac = clamped - lo;
946
+ return sortedTimestamps[lo] + frac * (sortedTimestamps[hi] - sortedTimestamps[lo]);
947
+ };
948
+ scale.ticks = () => {
949
+ if (count === 0) return [];
950
+ const pixelWidth = Math.abs(rangeSpan);
951
+ const { ticks } = generateTimeTicks(visMinTs, visMaxTs, pixelWidth, options?.tickConfig);
952
+ return ticks;
953
+ };
954
+ scale.domain = () => [visMinTs, visMaxTs];
955
+ scale.range = () => [...rangeValues];
956
+ scale.dataFirstTs = count > 0 ? sortedTimestamps[0] : void 0;
957
+ scale.dataLastTs = count > 0 ? sortedTimestamps[lastIdx] : void 0;
958
+ return scale;
959
+ }
960
+ function createOrdinalTimeBandAdapter(sortedTimestamps, ordinalScale) {
961
+ const domain = sortedTimestamps.map(String);
962
+ const [rangeStart, rangeEnd] = ordinalScale.range();
963
+ const rangeSpan = Math.abs(rangeEnd - rangeStart);
964
+ let step;
965
+ if (sortedTimestamps.length > 1) {
966
+ step = Math.abs(ordinalScale(sortedTimestamps[1]) - ordinalScale(sortedTimestamps[0]));
967
+ } else {
968
+ step = rangeSpan;
969
+ }
970
+ const bw = Math.min(step * 0.8, rangeSpan);
971
+ const halfBw = bw / 2;
972
+ const scale = ((category) => {
973
+ let ts = Number(category);
974
+ if (isNaN(ts)) ts = toTimestamp(category);
975
+ return ordinalScale(ts) - halfBw;
976
+ });
977
+ scale.bandwidth = () => bw;
978
+ scale.step = () => step;
979
+ scale.domain = () => [...domain];
980
+ scale.range = () => [rangeStart, rangeEnd];
981
+ return scale;
982
+ }
983
+
984
+ export { DEFAULT_FORMATS, MS, TICK_INTERVALS, advanceByUnit, calculateArcBoundingBox, calculateGroupedBarLayout, calculateNiceDomain, calculateNiceLogDomain, calculateNiceTimeDomain, clamp, createBandScale, createLinearScale, createLogScale, createOrdinalTimeBandAdapter, createOrdinalTimeScale, createTimeBandAdapter, createTimeScale, createVariwideBandScale, crisp, detectTickUnit, findMax, findMin, floorToUnit, formatTimeTick, generateIntervalTicks, generateLogTicks, generateNiceTicks, generateTimeTicks, intervalSpanMs, isPeriodBoundary, normalizeAngle, normalizeAngleRelativeTo, pointOnCircle, scaleLinear, selectTickInterval, shallowEqual, toRad, toTimestamp, warnChartDevOnce, xCalc, yCalc };