@chartts/core 0.1.3 → 0.1.4

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 (291) hide show
  1. package/dist/area.cjs +10 -10
  2. package/dist/area.js +5 -5
  3. package/dist/bar.cjs +9 -9
  4. package/dist/bar.js +4 -4
  5. package/dist/baseline.cjs +9 -9
  6. package/dist/baseline.js +4 -4
  7. package/dist/boxplot.cjs +9 -9
  8. package/dist/boxplot.js +4 -4
  9. package/dist/bubble.cjs +9 -9
  10. package/dist/bubble.js +4 -4
  11. package/dist/bullet.cjs +10 -10
  12. package/dist/bullet.js +5 -5
  13. package/dist/calendar.cjs +10 -10
  14. package/dist/calendar.js +5 -5
  15. package/dist/candlestick.cjs +9 -9
  16. package/dist/candlestick.js +4 -4
  17. package/dist/chord.cjs +10 -10
  18. package/dist/chord.js +5 -5
  19. package/dist/{chunk-XKERO5K2.js → chunk-24557PYN.js} +3 -3
  20. package/dist/{chunk-XKERO5K2.js.map → chunk-24557PYN.js.map} +1 -1
  21. package/dist/{chunk-5YNIOIKK.js → chunk-2BUIZDOB.js} +3 -3
  22. package/dist/{chunk-5YNIOIKK.js.map → chunk-2BUIZDOB.js.map} +1 -1
  23. package/dist/{chunk-EHKHXQ46.cjs → chunk-2IMUTDTD.cjs} +10 -10
  24. package/dist/{chunk-EHKHXQ46.cjs.map → chunk-2IMUTDTD.cjs.map} +1 -1
  25. package/dist/{chunk-7ZPHLIFP.cjs → chunk-2IWLOBSF.cjs} +6 -6
  26. package/dist/{chunk-7ZPHLIFP.cjs.map → chunk-2IWLOBSF.cjs.map} +1 -1
  27. package/dist/{chunk-F5AOBHQY.js → chunk-2JYK52HV.js} +4 -4
  28. package/dist/{chunk-F5AOBHQY.js.map → chunk-2JYK52HV.js.map} +1 -1
  29. package/dist/{chunk-WVQVGQJO.cjs → chunk-2QRCHYTZ.cjs} +7 -7
  30. package/dist/{chunk-WVQVGQJO.cjs.map → chunk-2QRCHYTZ.cjs.map} +1 -1
  31. package/dist/{chunk-XWCY67K5.js → chunk-34DQGCPP.js} +4 -4
  32. package/dist/{chunk-XWCY67K5.js.map → chunk-34DQGCPP.js.map} +1 -1
  33. package/dist/{chunk-5J26EN5I.js → chunk-3JB4JBBK.js} +4 -4
  34. package/dist/{chunk-5J26EN5I.js.map → chunk-3JB4JBBK.js.map} +1 -1
  35. package/dist/{chunk-EHNX3MG3.cjs → chunk-3NHH6C4K.cjs} +13 -13
  36. package/dist/{chunk-EHNX3MG3.cjs.map → chunk-3NHH6C4K.cjs.map} +1 -1
  37. package/dist/{chunk-ECB3UPTC.cjs → chunk-3SVNEKXE.cjs} +11 -11
  38. package/dist/{chunk-ECB3UPTC.cjs.map → chunk-3SVNEKXE.cjs.map} +1 -1
  39. package/dist/{chunk-BYB3LQAT.cjs → chunk-4D6PVH2C.cjs} +9 -9
  40. package/dist/{chunk-BYB3LQAT.cjs.map → chunk-4D6PVH2C.cjs.map} +1 -1
  41. package/dist/{chunk-NG7DRWWT.cjs → chunk-4MNVJVK3.cjs} +6 -6
  42. package/dist/{chunk-NG7DRWWT.cjs.map → chunk-4MNVJVK3.cjs.map} +1 -1
  43. package/dist/{chunk-RQJRVKAH.js → chunk-4QRND2V5.js} +3 -3
  44. package/dist/{chunk-RQJRVKAH.js.map → chunk-4QRND2V5.js.map} +1 -1
  45. package/dist/{chunk-NGKUI7XE.cjs → chunk-55ZTXQQQ.cjs} +12 -12
  46. package/dist/{chunk-NGKUI7XE.cjs.map → chunk-55ZTXQQQ.cjs.map} +1 -1
  47. package/dist/{chunk-2MWA7H6J.js → chunk-56BN43J4.js} +5 -5
  48. package/dist/{chunk-2MWA7H6J.js.map → chunk-56BN43J4.js.map} +1 -1
  49. package/dist/{chunk-RJIPFWW7.js → chunk-5E7FXDBM.js} +4 -4
  50. package/dist/{chunk-RJIPFWW7.js.map → chunk-5E7FXDBM.js.map} +1 -1
  51. package/dist/{chunk-ILCWDAKD.js → chunk-5HZEDCJG.js} +3 -3
  52. package/dist/{chunk-ILCWDAKD.js.map → chunk-5HZEDCJG.js.map} +1 -1
  53. package/dist/{chunk-DKXW2FQC.cjs → chunk-5QT67VYJ.cjs} +10 -10
  54. package/dist/{chunk-DKXW2FQC.cjs.map → chunk-5QT67VYJ.cjs.map} +1 -1
  55. package/dist/{chunk-XE5ZYFGM.js → chunk-5QVUBGM7.js} +4 -4
  56. package/dist/{chunk-XE5ZYFGM.js.map → chunk-5QVUBGM7.js.map} +1 -1
  57. package/dist/{chunk-DR5MQC3W.js → chunk-62DBXI4N.js} +4 -4
  58. package/dist/{chunk-DR5MQC3W.js.map → chunk-62DBXI4N.js.map} +1 -1
  59. package/dist/{chunk-HMB2RIEE.js → chunk-6QMV75NT.js} +4 -4
  60. package/dist/{chunk-HMB2RIEE.js.map → chunk-6QMV75NT.js.map} +1 -1
  61. package/dist/{chunk-OUN3MWRQ.cjs → chunk-754Z4OR6.cjs} +10 -10
  62. package/dist/{chunk-OUN3MWRQ.cjs.map → chunk-754Z4OR6.cjs.map} +1 -1
  63. package/dist/{chunk-3SOKHPAO.js → chunk-7GLCJPV5.js} +4 -4
  64. package/dist/{chunk-3SOKHPAO.js.map → chunk-7GLCJPV5.js.map} +1 -1
  65. package/dist/{chunk-PQCHNZHM.cjs → chunk-7PHOSSLJ.cjs} +9 -9
  66. package/dist/{chunk-PQCHNZHM.cjs.map → chunk-7PHOSSLJ.cjs.map} +1 -1
  67. package/dist/{chunk-VBEZS3Q4.cjs → chunk-A5G32G2R.cjs} +9 -9
  68. package/dist/{chunk-VBEZS3Q4.cjs.map → chunk-A5G32G2R.cjs.map} +1 -1
  69. package/dist/{chunk-DX4FBN3I.js → chunk-AEQXFDL7.js} +14 -9
  70. package/dist/chunk-AEQXFDL7.js.map +1 -0
  71. package/dist/{chunk-RHTVKBRC.cjs → chunk-ATMSGQCW.cjs} +9 -9
  72. package/dist/{chunk-RHTVKBRC.cjs.map → chunk-ATMSGQCW.cjs.map} +1 -1
  73. package/dist/{chunk-2ITF366P.js → chunk-BFBVJ6MU.js} +3 -3
  74. package/dist/{chunk-2ITF366P.js.map → chunk-BFBVJ6MU.js.map} +1 -1
  75. package/dist/{chunk-E43H3A3G.cjs → chunk-BGGESAAG.cjs} +7 -7
  76. package/dist/{chunk-E43H3A3G.cjs.map → chunk-BGGESAAG.cjs.map} +1 -1
  77. package/dist/{chunk-R6ZDSXN7.cjs → chunk-CA42BCSM.cjs} +8 -8
  78. package/dist/{chunk-R6ZDSXN7.cjs.map → chunk-CA42BCSM.cjs.map} +1 -1
  79. package/dist/{chunk-FV7R2LLD.js → chunk-CU5ZXVZQ.js} +4 -4
  80. package/dist/{chunk-FV7R2LLD.js.map → chunk-CU5ZXVZQ.js.map} +1 -1
  81. package/dist/{chunk-JNQ4NL3R.cjs → chunk-CUIPBYMG.cjs} +8 -8
  82. package/dist/{chunk-JNQ4NL3R.cjs.map → chunk-CUIPBYMG.cjs.map} +1 -1
  83. package/dist/{chunk-CCMLOCTH.js → chunk-CWZADOJ6.js} +3 -3
  84. package/dist/{chunk-CCMLOCTH.js.map → chunk-CWZADOJ6.js.map} +1 -1
  85. package/dist/{chunk-FZIBM3G5.cjs → chunk-D5QUAWF3.cjs} +10 -10
  86. package/dist/{chunk-FZIBM3G5.cjs.map → chunk-D5QUAWF3.cjs.map} +1 -1
  87. package/dist/{chunk-YZQROIJY.js → chunk-DAAU5H24.js} +3 -3
  88. package/dist/{chunk-YZQROIJY.js.map → chunk-DAAU5H24.js.map} +1 -1
  89. package/dist/{chunk-GAWIUMAK.cjs → chunk-DT4GG5BF.cjs} +7 -7
  90. package/dist/{chunk-GAWIUMAK.cjs.map → chunk-DT4GG5BF.cjs.map} +1 -1
  91. package/dist/{chunk-4L62MAZA.js → chunk-DX77WSIB.js} +5 -5
  92. package/dist/{chunk-4L62MAZA.js.map → chunk-DX77WSIB.js.map} +1 -1
  93. package/dist/{chunk-4ORSJM2I.js → chunk-EPUWA3ZW.js} +4 -4
  94. package/dist/{chunk-4ORSJM2I.js.map → chunk-EPUWA3ZW.js.map} +1 -1
  95. package/dist/{chunk-ZTUKOCJN.cjs → chunk-ESJMEDLY.cjs} +4 -4
  96. package/dist/{chunk-ZTUKOCJN.cjs.map → chunk-ESJMEDLY.cjs.map} +1 -1
  97. package/dist/{chunk-6JNW43SE.js → chunk-EWVXMQRW.js} +5 -5
  98. package/dist/{chunk-6JNW43SE.js.map → chunk-EWVXMQRW.js.map} +1 -1
  99. package/dist/{chunk-LIY7MYRG.js → chunk-FGBIJ6PL.js} +4 -4
  100. package/dist/{chunk-LIY7MYRG.js.map → chunk-FGBIJ6PL.js.map} +1 -1
  101. package/dist/{chunk-OFEROCC5.cjs → chunk-FGHSUT6X.cjs} +6 -6
  102. package/dist/{chunk-OFEROCC5.cjs.map → chunk-FGHSUT6X.cjs.map} +1 -1
  103. package/dist/{chunk-QKJUAMRK.cjs → chunk-FVLVTY5D.cjs} +6 -6
  104. package/dist/{chunk-QKJUAMRK.cjs.map → chunk-FVLVTY5D.cjs.map} +1 -1
  105. package/dist/{chunk-YX6RW6ZW.cjs → chunk-GBL4R3GH.cjs} +6 -6
  106. package/dist/{chunk-YX6RW6ZW.cjs.map → chunk-GBL4R3GH.cjs.map} +1 -1
  107. package/dist/{chunk-SXVMEC6N.cjs → chunk-GRXHW5S3.cjs} +12 -12
  108. package/dist/{chunk-SXVMEC6N.cjs.map → chunk-GRXHW5S3.cjs.map} +1 -1
  109. package/dist/{chunk-K5TPJVOK.js → chunk-HCIBBUV5.js} +3 -3
  110. package/dist/{chunk-K5TPJVOK.js.map → chunk-HCIBBUV5.js.map} +1 -1
  111. package/dist/{chunk-HFWO37RY.cjs → chunk-HCK2VUWD.cjs} +8 -8
  112. package/dist/{chunk-HFWO37RY.cjs.map → chunk-HCK2VUWD.cjs.map} +1 -1
  113. package/dist/{chunk-FSDI3NJV.js → chunk-IDZTDJLH.js} +3 -3
  114. package/dist/{chunk-FSDI3NJV.js.map → chunk-IDZTDJLH.js.map} +1 -1
  115. package/dist/{chunk-FDNJNVKA.cjs → chunk-IF6RQ53Q.cjs} +9 -9
  116. package/dist/{chunk-FDNJNVKA.cjs.map → chunk-IF6RQ53Q.cjs.map} +1 -1
  117. package/dist/{chunk-PVPTFMJJ.js → chunk-IOV77VHP.js} +4 -4
  118. package/dist/{chunk-PVPTFMJJ.js.map → chunk-IOV77VHP.js.map} +1 -1
  119. package/dist/{chunk-UMIJYYF3.cjs → chunk-JVVGQLJQ.cjs} +14 -9
  120. package/dist/chunk-JVVGQLJQ.cjs.map +1 -0
  121. package/dist/{chunk-MY4KMVJ5.cjs → chunk-JYVRX3BX.cjs} +8 -8
  122. package/dist/{chunk-MY4KMVJ5.cjs.map → chunk-JYVRX3BX.cjs.map} +1 -1
  123. package/dist/{chunk-ZY7ETQD6.js → chunk-KHG3G2ZX.js} +3 -3
  124. package/dist/{chunk-ZY7ETQD6.js.map → chunk-KHG3G2ZX.js.map} +1 -1
  125. package/dist/{chunk-ASNAQ35U.js → chunk-KNMEXOKJ.js} +4 -4
  126. package/dist/{chunk-ASNAQ35U.js.map → chunk-KNMEXOKJ.js.map} +1 -1
  127. package/dist/{chunk-WYIIWTIR.cjs → chunk-KWSVJRXX.cjs} +4 -4
  128. package/dist/{chunk-WYIIWTIR.cjs.map → chunk-KWSVJRXX.cjs.map} +1 -1
  129. package/dist/{chunk-OAL5RS2X.cjs → chunk-LARNENXE.cjs} +10 -10
  130. package/dist/{chunk-OAL5RS2X.cjs.map → chunk-LARNENXE.cjs.map} +1 -1
  131. package/dist/{chunk-MYXLKVJE.js → chunk-LRHMLNPW.js} +12 -4
  132. package/dist/chunk-LRHMLNPW.js.map +1 -0
  133. package/dist/{chunk-66BHM3UN.cjs → chunk-LXYNL7BI.cjs} +10 -10
  134. package/dist/{chunk-66BHM3UN.cjs.map → chunk-LXYNL7BI.cjs.map} +1 -1
  135. package/dist/{chunk-V45C74EB.js → chunk-MEERXUZS.js} +4 -4
  136. package/dist/{chunk-V45C74EB.js.map → chunk-MEERXUZS.js.map} +1 -1
  137. package/dist/{chunk-YJHB2GHQ.js → chunk-MJY25P44.js} +3 -3
  138. package/dist/{chunk-YJHB2GHQ.js.map → chunk-MJY25P44.js.map} +1 -1
  139. package/dist/{chunk-6UWYKNFN.cjs → chunk-MSCRIA2U.cjs} +12 -12
  140. package/dist/{chunk-6UWYKNFN.cjs.map → chunk-MSCRIA2U.cjs.map} +1 -1
  141. package/dist/{chunk-UZH6PVHD.js → chunk-N35UAFEU.js} +4 -4
  142. package/dist/{chunk-UZH6PVHD.js.map → chunk-N35UAFEU.js.map} +1 -1
  143. package/dist/{chunk-6E6ZDWZD.cjs → chunk-NE2W2MF3.cjs} +10 -10
  144. package/dist/{chunk-6E6ZDWZD.cjs.map → chunk-NE2W2MF3.cjs.map} +1 -1
  145. package/dist/{chunk-7PNCJ4OQ.js → chunk-NQ7Y6ZKH.js} +3 -3
  146. package/dist/{chunk-7PNCJ4OQ.js.map → chunk-NQ7Y6ZKH.js.map} +1 -1
  147. package/dist/{chunk-LK2A3HBT.js → chunk-NRULNA5F.js} +4 -4
  148. package/dist/{chunk-LK2A3HBT.js.map → chunk-NRULNA5F.js.map} +1 -1
  149. package/dist/{chunk-47EP245Y.cjs → chunk-OEGSDOJ2.cjs} +7 -7
  150. package/dist/{chunk-47EP245Y.cjs.map → chunk-OEGSDOJ2.cjs.map} +1 -1
  151. package/dist/{chunk-ZFSFOD5W.cjs → chunk-OMAW52LY.cjs} +6 -6
  152. package/dist/{chunk-ZFSFOD5W.cjs.map → chunk-OMAW52LY.cjs.map} +1 -1
  153. package/dist/{chunk-YOLF5DYU.js → chunk-OMSHGBV3.js} +4 -4
  154. package/dist/{chunk-YOLF5DYU.js.map → chunk-OMSHGBV3.js.map} +1 -1
  155. package/dist/{chunk-4H2LGLGI.cjs → chunk-OTXHJHXU.cjs} +11 -11
  156. package/dist/{chunk-4H2LGLGI.cjs.map → chunk-OTXHJHXU.cjs.map} +1 -1
  157. package/dist/{chunk-DRIJNFWP.cjs → chunk-PCAYYCLY.cjs} +10 -10
  158. package/dist/{chunk-DRIJNFWP.cjs.map → chunk-PCAYYCLY.cjs.map} +1 -1
  159. package/dist/{chunk-QERWC7U6.js → chunk-PKXW45G4.js} +3 -3
  160. package/dist/{chunk-QERWC7U6.js.map → chunk-PKXW45G4.js.map} +1 -1
  161. package/dist/{chunk-YDQDZWZ7.cjs → chunk-QEPMEEZC.cjs} +6 -6
  162. package/dist/{chunk-YDQDZWZ7.cjs.map → chunk-QEPMEEZC.cjs.map} +1 -1
  163. package/dist/{chunk-G6R6MSRF.cjs → chunk-QPHUAF3R.cjs} +8 -8
  164. package/dist/{chunk-G6R6MSRF.cjs.map → chunk-QPHUAF3R.cjs.map} +1 -1
  165. package/dist/{chunk-RFEKSP62.js → chunk-QPHWRD25.js} +3 -3
  166. package/dist/{chunk-RFEKSP62.js.map → chunk-QPHWRD25.js.map} +1 -1
  167. package/dist/{chunk-XN6YS55F.cjs → chunk-QYI7ZV3B.cjs} +30 -22
  168. package/dist/chunk-QYI7ZV3B.cjs.map +1 -0
  169. package/dist/{chunk-3V64BDKG.cjs → chunk-R2W3RJFW.cjs} +13 -13
  170. package/dist/{chunk-3V64BDKG.cjs.map → chunk-R2W3RJFW.cjs.map} +1 -1
  171. package/dist/{chunk-46ZZTP5B.js → chunk-SGZUUUXU.js} +4 -4
  172. package/dist/{chunk-46ZZTP5B.js.map → chunk-SGZUUUXU.js.map} +1 -1
  173. package/dist/{chunk-MPQECPE3.js → chunk-T7SCCACB.js} +3 -3
  174. package/dist/{chunk-MPQECPE3.js.map → chunk-T7SCCACB.js.map} +1 -1
  175. package/dist/{chunk-GPSNBZPX.js → chunk-TC3H6ZED.js} +4 -4
  176. package/dist/{chunk-GPSNBZPX.js.map → chunk-TC3H6ZED.js.map} +1 -1
  177. package/dist/{chunk-AG7VY6MJ.cjs → chunk-TEZNWW3R.cjs} +8 -8
  178. package/dist/{chunk-AG7VY6MJ.cjs.map → chunk-TEZNWW3R.cjs.map} +1 -1
  179. package/dist/{chunk-KTCP23W6.js → chunk-THHZMRFU.js} +3 -3
  180. package/dist/{chunk-KTCP23W6.js.map → chunk-THHZMRFU.js.map} +1 -1
  181. package/dist/{chunk-RWQH5EO5.cjs → chunk-TLHQ6JCK.cjs} +11 -11
  182. package/dist/{chunk-RWQH5EO5.cjs.map → chunk-TLHQ6JCK.cjs.map} +1 -1
  183. package/dist/{chunk-CDS2NXGT.cjs → chunk-V5Q6UNUK.cjs} +4 -4
  184. package/dist/{chunk-CDS2NXGT.cjs.map → chunk-V5Q6UNUK.cjs.map} +1 -1
  185. package/dist/{chunk-BT5H3WMI.js → chunk-VBMLJUBE.js} +4 -4
  186. package/dist/{chunk-BT5H3WMI.js.map → chunk-VBMLJUBE.js.map} +1 -1
  187. package/dist/{chunk-UFMPALRH.js → chunk-VGJD4F4H.js} +3 -3
  188. package/dist/{chunk-UFMPALRH.js.map → chunk-VGJD4F4H.js.map} +1 -1
  189. package/dist/{chunk-RN7NNB6I.js → chunk-VJXUBN7J.js} +3 -3
  190. package/dist/{chunk-RN7NNB6I.js.map → chunk-VJXUBN7J.js.map} +1 -1
  191. package/dist/{chunk-TVDQNLGJ.js → chunk-VUHNBLFA.js} +3 -3
  192. package/dist/{chunk-TVDQNLGJ.js.map → chunk-VUHNBLFA.js.map} +1 -1
  193. package/dist/{chunk-OAIMES5S.cjs → chunk-W476ER4X.cjs} +17 -17
  194. package/dist/{chunk-OAIMES5S.cjs.map → chunk-W476ER4X.cjs.map} +1 -1
  195. package/dist/{chunk-4XVJYNOT.js → chunk-WZCES5M6.js} +4 -4
  196. package/dist/{chunk-4XVJYNOT.js.map → chunk-WZCES5M6.js.map} +1 -1
  197. package/dist/{chunk-2EZ2TVYT.cjs → chunk-Y6CVUI6A.cjs} +13 -13
  198. package/dist/{chunk-2EZ2TVYT.cjs.map → chunk-Y6CVUI6A.cjs.map} +1 -1
  199. package/dist/{chunk-4WQUX2B4.cjs → chunk-YCL43UQM.cjs} +12 -12
  200. package/dist/{chunk-4WQUX2B4.cjs.map → chunk-YCL43UQM.cjs.map} +1 -1
  201. package/dist/{chunk-XWN43PZF.cjs → chunk-YZXRD6K6.cjs} +7 -7
  202. package/dist/{chunk-XWN43PZF.cjs.map → chunk-YZXRD6K6.cjs.map} +1 -1
  203. package/dist/{chunk-IRUIWMH6.js → chunk-ZFGLBJYC.js} +3 -3
  204. package/dist/{chunk-IRUIWMH6.js.map → chunk-ZFGLBJYC.js.map} +1 -1
  205. package/dist/{chunk-6EGHZDZI.cjs → chunk-ZNKVOTPB.cjs} +15 -15
  206. package/dist/{chunk-6EGHZDZI.cjs.map → chunk-ZNKVOTPB.cjs.map} +1 -1
  207. package/dist/{chunk-WJP6CRML.js → chunk-ZOEN3ARN.js} +3 -3
  208. package/dist/{chunk-WJP6CRML.js.map → chunk-ZOEN3ARN.js.map} +1 -1
  209. package/dist/{chunk-TWSWD4PU.js → chunk-ZYXRRVR6.js} +3 -3
  210. package/dist/{chunk-TWSWD4PU.js.map → chunk-ZYXRRVR6.js.map} +1 -1
  211. package/dist/combo.cjs +9 -9
  212. package/dist/combo.js +4 -4
  213. package/dist/custom.cjs +10 -10
  214. package/dist/custom.js +5 -5
  215. package/dist/donut.cjs +11 -11
  216. package/dist/donut.js +6 -6
  217. package/dist/dumbbell.cjs +10 -10
  218. package/dist/dumbbell.js +5 -5
  219. package/dist/funnel.cjs +10 -10
  220. package/dist/funnel.js +5 -5
  221. package/dist/gauge.cjs +10 -10
  222. package/dist/gauge.js +5 -5
  223. package/dist/geo.cjs +12 -12
  224. package/dist/geo.js +5 -5
  225. package/dist/graph.cjs +10 -10
  226. package/dist/graph.js +5 -5
  227. package/dist/heatmap.cjs +10 -10
  228. package/dist/heatmap.js +5 -5
  229. package/dist/histogram.cjs +9 -9
  230. package/dist/histogram.js +4 -4
  231. package/dist/horizontal-bar.cjs +9 -9
  232. package/dist/horizontal-bar.js +4 -4
  233. package/dist/index.cjs +180 -180
  234. package/dist/index.d.cts +4 -0
  235. package/dist/index.d.ts +4 -0
  236. package/dist/index.js +92 -92
  237. package/dist/kagi.cjs +10 -10
  238. package/dist/kagi.js +5 -5
  239. package/dist/line.cjs +9 -9
  240. package/dist/line.js +4 -4
  241. package/dist/lines.cjs +10 -10
  242. package/dist/lines.js +5 -5
  243. package/dist/lollipop.cjs +9 -9
  244. package/dist/lollipop.js +4 -4
  245. package/dist/matrix.cjs +10 -10
  246. package/dist/matrix.js +5 -5
  247. package/dist/ohlc.cjs +9 -9
  248. package/dist/ohlc.js +4 -4
  249. package/dist/parallel.cjs +10 -10
  250. package/dist/parallel.js +5 -5
  251. package/dist/pictorialbar.cjs +10 -10
  252. package/dist/pictorialbar.js +5 -5
  253. package/dist/pie.cjs +11 -11
  254. package/dist/pie.js +6 -6
  255. package/dist/polar.cjs +11 -11
  256. package/dist/polar.js +6 -6
  257. package/dist/radar.cjs +10 -10
  258. package/dist/radar.js +5 -5
  259. package/dist/radialbar.cjs +10 -10
  260. package/dist/radialbar.js +5 -5
  261. package/dist/range.cjs +9 -9
  262. package/dist/range.js +4 -4
  263. package/dist/renko.cjs +10 -10
  264. package/dist/renko.js +5 -5
  265. package/dist/sankey.cjs +10 -10
  266. package/dist/sankey.js +5 -5
  267. package/dist/scatter.cjs +9 -9
  268. package/dist/scatter.js +4 -4
  269. package/dist/sparkline.cjs +9 -9
  270. package/dist/sparkline.js +4 -4
  271. package/dist/stacked-bar.cjs +9 -9
  272. package/dist/stacked-bar.js +4 -4
  273. package/dist/step.cjs +10 -10
  274. package/dist/step.js +5 -5
  275. package/dist/sunburst.cjs +11 -11
  276. package/dist/sunburst.js +6 -6
  277. package/dist/themeriver.cjs +10 -10
  278. package/dist/themeriver.js +5 -5
  279. package/dist/tree.cjs +10 -10
  280. package/dist/tree.js +5 -5
  281. package/dist/treemap.cjs +10 -10
  282. package/dist/treemap.js +5 -5
  283. package/dist/volume.cjs +9 -9
  284. package/dist/volume.js +4 -4
  285. package/dist/waterfall.cjs +9 -9
  286. package/dist/waterfall.js +4 -4
  287. package/package.json +1 -1
  288. package/dist/chunk-DX4FBN3I.js.map +0 -1
  289. package/dist/chunk-MYXLKVJE.js.map +0 -1
  290. package/dist/chunk-UMIJYYF3.cjs.map +0 -1
  291. package/dist/chunk-XN6YS55F.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/charts/sunburst/sunburst-type.ts"],"names":["prepareNoAxes","roundedSlicePath","path","text"],"mappings":"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","file":"chunk-BYB3LQAT.cjs","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareNoAxes } from '../../utils/prepare'\nimport { path, text } from '../../render/tree'\nimport { roundedSlicePath } from '../../utils/slice-path'\n\n/**\n * Sunburst chart — hierarchical radial visualization.\n *\n * Data convention:\n * - labels: leaf node names\n * - series[0].values: leaf values (sizes)\n * - Hierarchy is encoded via label separators: \"A/B/C\" means root→A→B→C\n * If no separators, falls back to flat ring layout (single ring).\n *\n * The chart draws concentric rings from center outward, one ring per depth level.\n */\n\ninterface SunburstNode {\n name: string\n fullPath: string\n value: number\n children: SunburstNode[]\n depth: number\n startAngle: number\n endAngle: number\n // Computed during layout\n totalValue: number\n}\n\nexport const sunburstChartType: ChartTypePlugin = {\n type: 'sunburst',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n return prepareNoAxes(data, options)\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, area, theme, options } = ctx\n const nodes: RenderNode[] = []\n\n const series = data.series[0]\n if (!series || series.values.length === 0) return nodes\n\n // Build tree from labels\n const root = buildTree(data.labels, series.values)\n if (root.totalValue === 0) return nodes\n\n const cx = area.x + area.width / 2\n const cy = area.y + area.height / 2\n const maxRadius = Math.min(area.width, area.height) / 2 - 4\n const innerRadius = maxRadius * 0.15\n\n // Compute max depth for ring sizing\n const maxDepth = getMaxDepth(root)\n const ringWidth = (maxRadius - innerRadius) / Math.max(maxDepth, 1)\n\n // Layout angles recursively\n layoutAngles(root, -Math.PI / 2, -Math.PI / 2 + Math.PI * 2)\n\n // Render all non-root nodes\n let colorIdx = 0\n const renderNode = (node: SunburstNode, parentColorIdx: number) => {\n if (node.depth === 0) {\n // Root — render children with cycling colors\n for (let i = 0; i < node.children.length; i++) {\n renderNode(node.children[i]!, i)\n }\n return\n }\n\n const ci = node.depth === 1 ? parentColorIdx : parentColorIdx\n const color = options.colors[ci % options.colors.length]!\n const r0 = innerRadius + (node.depth - 1) * ringWidth\n const r1 = r0 + ringWidth - 1 // 1px gap between rings\n\n const sliceAngle = node.endAngle - node.startAngle\n if (sliceAngle < 0.005) return // Skip tiny slices\n\n // Uniform pixel gap: different angular offsets at different radii\n const gapPx = 3\n const halfGap = gapPx / 2\n const outerPadAngle = halfGap / r1\n const innerPadAngle = r0 > 0 ? halfGap / r0 : 0\n\n if (sliceAngle < outerPadAngle * 2 + 0.005) return\n\n const cr = Math.min(4, ringWidth * 0.2)\n\n const d = roundedSlicePath(\n cx, cy, r1, r0,\n node.startAngle + outerPadAngle, node.endAngle - outerPadAngle,\n node.startAngle + innerPadAngle, node.endAngle - innerPadAngle,\n cr,\n )\n\n const opacity = 1 - (node.depth - 1) * 0.15\n\n nodes.push(path(d, {\n class: 'chartts-sunburst-sector',\n fill: color,\n fillOpacity: Math.max(0.4, opacity),\n 'data-series': 0,\n 'data-index': colorIdx,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${node.name}: ${node.totalValue}`,\n }))\n\n // Label for larger sectors\n if (sliceAngle > 0.3 && ringWidth > 20) {\n const midAngle = (node.startAngle + node.endAngle) / 2\n const labelR = (r0 + r1) / 2\n const lx = cx + labelR * Math.cos(midAngle)\n const ly = cy + labelR * Math.sin(midAngle)\n\n const fontSize = Math.min(theme.fontSizeSmall, ringWidth * 0.35)\n nodes.push(text(lx, ly, node.name, {\n class: 'chartts-sunburst-label',\n fill: '#fff',\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize,\n fontFamily: theme.fontFamily,\n fontWeight: 600,\n }))\n }\n\n colorIdx++\n\n // Render children\n for (let i = 0; i < node.children.length; i++) {\n renderNode(node.children[i]!, parentColorIdx)\n }\n }\n\n renderNode(root, 0)\n\n return nodes\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { data, area } = ctx\n const series = data.series[0]\n if (!series || series.values.length === 0) return null\n\n const cx = area.x + area.width / 2\n const cy = area.y + area.height / 2\n const maxRadius = Math.min(area.width, area.height) / 2 - 4\n const innerRadius = maxRadius * 0.15\n\n const dx = mx - cx\n const dy = my - cy\n const dist = Math.sqrt(dx * dx + dy * dy)\n\n if (dist > maxRadius || dist < innerRadius) return null\n\n const root = buildTree(data.labels, series.values)\n const maxDepth = getMaxDepth(root)\n const ringWidth = (maxRadius - innerRadius) / Math.max(maxDepth, 1)\n\n layoutAngles(root, -Math.PI / 2, -Math.PI / 2 + Math.PI * 2)\n\n let angle = Math.atan2(dy, dx)\n if (angle < -Math.PI / 2) angle += Math.PI * 2\n\n // Find which ring (depth) the point is in\n const depthFloat = (dist - innerRadius) / ringWidth\n const depth = Math.floor(depthFloat) + 1\n\n // Find sector at this depth and angle\n const hit = findSector(root, depth, angle)\n if (hit) {\n return { seriesIndex: 0, pointIndex: hit, distance: 0, x: mx, y: my }\n }\n\n return null\n },\n}\n\n// ---------------------------------------------------------------------------\n// Tree building\n// ---------------------------------------------------------------------------\n\nfunction buildTree(labels: (string | number | Date)[], values: number[]): SunburstNode {\n const root: SunburstNode = {\n name: 'root', fullPath: '', value: 0,\n children: [], depth: 0, startAngle: 0, endAngle: 0, totalValue: 0,\n }\n\n for (let i = 0; i < labels.length; i++) {\n const label = String(labels[i] ?? `Item ${i}`)\n const value = Math.abs(values[i] ?? 0)\n if (value <= 0) continue\n\n const parts = label.includes('/') ? label.split('/') : [label]\n let current = root\n\n for (let p = 0; p < parts.length; p++) {\n const part = parts[p]!.trim()\n let child = current.children.find(c => c.name === part)\n\n if (!child) {\n child = {\n name: part,\n fullPath: parts.slice(0, p + 1).join('/'),\n value: 0,\n children: [],\n depth: p + 1,\n startAngle: 0,\n endAngle: 0,\n totalValue: 0,\n }\n current.children.push(child)\n }\n\n if (p === parts.length - 1) {\n child.value = value\n }\n current = child\n }\n }\n\n // Compute totals bottom-up\n computeTotals(root)\n\n return root\n}\n\nfunction computeTotals(node: SunburstNode): number {\n if (node.children.length === 0) {\n node.totalValue = node.value\n return node.totalValue\n }\n let sum = 0\n for (const child of node.children) {\n sum += computeTotals(child)\n }\n node.totalValue = Math.max(sum, node.value)\n return node.totalValue\n}\n\nfunction layoutAngles(node: SunburstNode, start: number, end: number): void {\n node.startAngle = start\n node.endAngle = end\n\n if (node.children.length === 0 || node.totalValue === 0) return\n\n let current = start\n for (const child of node.children) {\n const fraction = child.totalValue / node.totalValue\n const childEnd = current + fraction * (end - start)\n layoutAngles(child, current, childEnd)\n current = childEnd\n }\n}\n\nfunction getMaxDepth(node: SunburstNode): number {\n if (node.children.length === 0) return node.depth\n let max = node.depth\n for (const child of node.children) {\n max = Math.max(max, getMaxDepth(child))\n }\n return max\n}\n\nfunction findSector(node: SunburstNode, targetDepth: number, angle: number): number | null {\n if (node.depth === targetDepth) {\n if (angle >= node.startAngle && angle < node.endAngle) {\n return node.depth // Return something non-null to indicate a hit\n }\n return null\n }\n\n for (const child of node.children) {\n if (angle >= child.startAngle && angle < child.endAngle) {\n const result = findSector(child, targetDepth, angle)\n if (result !== null) return result\n }\n }\n\n return null\n}\n"]}
1
+ {"version":3,"sources":["../src/charts/sunburst/sunburst-type.ts"],"names":["prepareNoAxes","roundedSlicePath","path","text"],"mappings":"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","file":"chunk-4D6PVH2C.cjs","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareNoAxes } from '../../utils/prepare'\nimport { path, text } from '../../render/tree'\nimport { roundedSlicePath } from '../../utils/slice-path'\n\n/**\n * Sunburst chart — hierarchical radial visualization.\n *\n * Data convention:\n * - labels: leaf node names\n * - series[0].values: leaf values (sizes)\n * - Hierarchy is encoded via label separators: \"A/B/C\" means root→A→B→C\n * If no separators, falls back to flat ring layout (single ring).\n *\n * The chart draws concentric rings from center outward, one ring per depth level.\n */\n\ninterface SunburstNode {\n name: string\n fullPath: string\n value: number\n children: SunburstNode[]\n depth: number\n startAngle: number\n endAngle: number\n // Computed during layout\n totalValue: number\n}\n\nexport const sunburstChartType: ChartTypePlugin = {\n type: 'sunburst',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n return prepareNoAxes(data, options)\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, area, theme, options } = ctx\n const nodes: RenderNode[] = []\n\n const series = data.series[0]\n if (!series || series.values.length === 0) return nodes\n\n // Build tree from labels\n const root = buildTree(data.labels, series.values)\n if (root.totalValue === 0) return nodes\n\n const cx = area.x + area.width / 2\n const cy = area.y + area.height / 2\n const maxRadius = Math.min(area.width, area.height) / 2 - 4\n const innerRadius = maxRadius * 0.15\n\n // Compute max depth for ring sizing\n const maxDepth = getMaxDepth(root)\n const ringWidth = (maxRadius - innerRadius) / Math.max(maxDepth, 1)\n\n // Layout angles recursively\n layoutAngles(root, -Math.PI / 2, -Math.PI / 2 + Math.PI * 2)\n\n // Render all non-root nodes\n let colorIdx = 0\n const renderNode = (node: SunburstNode, parentColorIdx: number) => {\n if (node.depth === 0) {\n // Root — render children with cycling colors\n for (let i = 0; i < node.children.length; i++) {\n renderNode(node.children[i]!, i)\n }\n return\n }\n\n const ci = node.depth === 1 ? parentColorIdx : parentColorIdx\n const color = options.colors[ci % options.colors.length]!\n const r0 = innerRadius + (node.depth - 1) * ringWidth\n const r1 = r0 + ringWidth - 1 // 1px gap between rings\n\n const sliceAngle = node.endAngle - node.startAngle\n if (sliceAngle < 0.005) return // Skip tiny slices\n\n // Uniform pixel gap: different angular offsets at different radii\n const gapPx = 3\n const halfGap = gapPx / 2\n const outerPadAngle = halfGap / r1\n const innerPadAngle = r0 > 0 ? halfGap / r0 : 0\n\n if (sliceAngle < outerPadAngle * 2 + 0.005) return\n\n const cr = Math.min(4, ringWidth * 0.2)\n\n const d = roundedSlicePath(\n cx, cy, r1, r0,\n node.startAngle + outerPadAngle, node.endAngle - outerPadAngle,\n node.startAngle + innerPadAngle, node.endAngle - innerPadAngle,\n cr,\n )\n\n const opacity = 1 - (node.depth - 1) * 0.15\n\n nodes.push(path(d, {\n class: 'chartts-sunburst-sector',\n fill: color,\n fillOpacity: Math.max(0.4, opacity),\n 'data-series': 0,\n 'data-index': colorIdx,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${node.name}: ${node.totalValue}`,\n }))\n\n // Label for larger sectors\n if (sliceAngle > 0.3 && ringWidth > 20) {\n const midAngle = (node.startAngle + node.endAngle) / 2\n const labelR = (r0 + r1) / 2\n const lx = cx + labelR * Math.cos(midAngle)\n const ly = cy + labelR * Math.sin(midAngle)\n\n const fontSize = Math.min(theme.fontSizeSmall, ringWidth * 0.35)\n nodes.push(text(lx, ly, node.name, {\n class: 'chartts-sunburst-label',\n fill: '#fff',\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize,\n fontFamily: theme.fontFamily,\n fontWeight: 600,\n }))\n }\n\n colorIdx++\n\n // Render children\n for (let i = 0; i < node.children.length; i++) {\n renderNode(node.children[i]!, parentColorIdx)\n }\n }\n\n renderNode(root, 0)\n\n return nodes\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { data, area } = ctx\n const series = data.series[0]\n if (!series || series.values.length === 0) return null\n\n const cx = area.x + area.width / 2\n const cy = area.y + area.height / 2\n const maxRadius = Math.min(area.width, area.height) / 2 - 4\n const innerRadius = maxRadius * 0.15\n\n const dx = mx - cx\n const dy = my - cy\n const dist = Math.sqrt(dx * dx + dy * dy)\n\n if (dist > maxRadius || dist < innerRadius) return null\n\n const root = buildTree(data.labels, series.values)\n const maxDepth = getMaxDepth(root)\n const ringWidth = (maxRadius - innerRadius) / Math.max(maxDepth, 1)\n\n layoutAngles(root, -Math.PI / 2, -Math.PI / 2 + Math.PI * 2)\n\n let angle = Math.atan2(dy, dx)\n if (angle < -Math.PI / 2) angle += Math.PI * 2\n\n // Find which ring (depth) the point is in\n const depthFloat = (dist - innerRadius) / ringWidth\n const depth = Math.floor(depthFloat) + 1\n\n // Find sector at this depth and angle\n const hit = findSector(root, depth, angle)\n if (hit) {\n return { seriesIndex: 0, pointIndex: hit, distance: 0, x: mx, y: my }\n }\n\n return null\n },\n}\n\n// ---------------------------------------------------------------------------\n// Tree building\n// ---------------------------------------------------------------------------\n\nfunction buildTree(labels: (string | number | Date)[], values: number[]): SunburstNode {\n const root: SunburstNode = {\n name: 'root', fullPath: '', value: 0,\n children: [], depth: 0, startAngle: 0, endAngle: 0, totalValue: 0,\n }\n\n for (let i = 0; i < labels.length; i++) {\n const label = String(labels[i] ?? `Item ${i}`)\n const value = Math.abs(values[i] ?? 0)\n if (value <= 0) continue\n\n const parts = label.includes('/') ? label.split('/') : [label]\n let current = root\n\n for (let p = 0; p < parts.length; p++) {\n const part = parts[p]!.trim()\n let child = current.children.find(c => c.name === part)\n\n if (!child) {\n child = {\n name: part,\n fullPath: parts.slice(0, p + 1).join('/'),\n value: 0,\n children: [],\n depth: p + 1,\n startAngle: 0,\n endAngle: 0,\n totalValue: 0,\n }\n current.children.push(child)\n }\n\n if (p === parts.length - 1) {\n child.value = value\n }\n current = child\n }\n }\n\n // Compute totals bottom-up\n computeTotals(root)\n\n return root\n}\n\nfunction computeTotals(node: SunburstNode): number {\n if (node.children.length === 0) {\n node.totalValue = node.value\n return node.totalValue\n }\n let sum = 0\n for (const child of node.children) {\n sum += computeTotals(child)\n }\n node.totalValue = Math.max(sum, node.value)\n return node.totalValue\n}\n\nfunction layoutAngles(node: SunburstNode, start: number, end: number): void {\n node.startAngle = start\n node.endAngle = end\n\n if (node.children.length === 0 || node.totalValue === 0) return\n\n let current = start\n for (const child of node.children) {\n const fraction = child.totalValue / node.totalValue\n const childEnd = current + fraction * (end - start)\n layoutAngles(child, current, childEnd)\n current = childEnd\n }\n}\n\nfunction getMaxDepth(node: SunburstNode): number {\n if (node.children.length === 0) return node.depth\n let max = node.depth\n for (const child of node.children) {\n max = Math.max(max, getMaxDepth(child))\n }\n return max\n}\n\nfunction findSector(node: SunburstNode, targetDepth: number, angle: number): number | null {\n if (node.depth === targetDepth) {\n if (angle >= node.startAngle && angle < node.endAngle) {\n return node.depth // Return something non-null to indicate a hit\n }\n return null\n }\n\n for (const child of node.children) {\n if (angle >= child.startAngle && angle < child.endAngle) {\n const result = findSector(child, targetDepth, angle)\n if (result !== null) return result\n }\n }\n\n return null\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkUMIJYYF3_cjs = require('./chunk-UMIJYYF3.cjs');
3
+ var chunkJVVGQLJQ_cjs = require('./chunk-JVVGQLJQ.cjs');
4
4
 
5
5
  // src/charts/bubble/bubble-type.ts
6
6
  var bubbleChartType = {
@@ -9,7 +9,7 @@ var bubbleChartType = {
9
9
  return { x: "categorical", y: "linear" };
10
10
  },
11
11
  prepareData(data, options) {
12
- return chunkUMIJYYF3_cjs.prepareData(data, options);
12
+ return chunkJVVGQLJQ_cjs.prepareData(data, options);
13
13
  },
14
14
  render(ctx) {
15
15
  const { data, xScale, yScale } = ctx;
@@ -40,7 +40,7 @@ var bubbleChartType = {
40
40
  const rawSize = sizes[i] ?? 1;
41
41
  const normalized = (rawSize - sizeMin) / sizeRange;
42
42
  const r = minR + normalized * (maxR - minR);
43
- dots.push(chunkUMIJYYF3_cjs.circle(x, y, r, {
43
+ dots.push(chunkJVVGQLJQ_cjs.circle(x, y, r, {
44
44
  class: "chartts-bubble",
45
45
  fill: series.color,
46
46
  fillOpacity: 0.5,
@@ -53,7 +53,7 @@ var bubbleChartType = {
53
53
  ariaLabel: `${series.name}: ${series.values[i]} (size: ${rawSize})`
54
54
  }));
55
55
  }
56
- nodes.push(chunkUMIJYYF3_cjs.group(dots, {
56
+ nodes.push(chunkJVVGQLJQ_cjs.group(dots, {
57
57
  class: `chartts-series chartts-series-${series.index}`,
58
58
  "data-series-name": series.name
59
59
  }));
@@ -101,5 +101,5 @@ var bubbleChartType = {
101
101
  };
102
102
 
103
103
  exports.bubbleChartType = bubbleChartType;
104
- //# sourceMappingURL=chunk-NG7DRWWT.cjs.map
105
- //# sourceMappingURL=chunk-NG7DRWWT.cjs.map
104
+ //# sourceMappingURL=chunk-4MNVJVK3.cjs.map
105
+ //# sourceMappingURL=chunk-4MNVJVK3.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/charts/bubble/bubble-type.ts"],"names":["prepareData","circle","group"],"mappings":"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","file":"chunk-NG7DRWWT.cjs","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareData } from '../../data/prepare'\nimport { group, circle } from '../../render/tree'\n\nexport interface BubbleOptions {\n /** Sizes array per series. Each entry maps 1:1 to values. */\n sizes?: number[][]\n /** Min bubble radius in px. Default 4. */\n minRadius?: number\n /** Max bubble radius in px. Default 30. */\n maxRadius?: number\n}\n\n/**\n * Bubble chart — scatter with variable-radius circles.\n * Pass sizes via options: `{ sizes: [[10, 20, 5, ...], ...] }`\n */\nexport const bubbleChartType: ChartTypePlugin = {\n type: 'bubble',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n return prepareData(data, options)\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, xScale, yScale } = ctx\n const nodes: RenderNode[] = []\n\n const bOpts = ctx.options as unknown as BubbleOptions\n const allSizes = bOpts.sizes ?? []\n const minR = bOpts.minRadius ?? 4\n const maxR = bOpts.maxRadius ?? 30\n\n // Find global size range for normalization\n let sizeMin = Infinity\n let sizeMax = -Infinity\n for (const sizes of allSizes) {\n for (const s of sizes) {\n if (s < sizeMin) sizeMin = s\n if (s > sizeMax) sizeMax = s\n }\n }\n if (!isFinite(sizeMin)) { sizeMin = 1; sizeMax = 1 }\n const sizeRange = sizeMax - sizeMin || 1\n\n for (const series of data.series) {\n const sizes = allSizes[series.index] ?? []\n const dots: RenderNode[] = []\n\n for (let i = 0; i < series.values.length; i++) {\n const x = xScale.map(i)\n const y = yScale.map(series.values[i]!)\n const rawSize = sizes[i] ?? 1\n const normalized = (rawSize - sizeMin) / sizeRange\n const r = minR + normalized * (maxR - minR)\n\n dots.push(circle(x, y, r, {\n class: 'chartts-bubble',\n fill: series.color,\n fillOpacity: 0.5,\n stroke: series.color,\n strokeWidth: 1.5,\n 'data-series': series.index,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${series.name}: ${series.values[i]} (size: ${rawSize})`,\n }))\n }\n\n nodes.push(group(dots, {\n class: `chartts-series chartts-series-${series.index}`,\n 'data-series-name': series.name,\n }))\n }\n\n return nodes\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { data, xScale, yScale } = ctx\n const bOpts = ctx.options as unknown as BubbleOptions\n const allSizes = bOpts.sizes ?? []\n const minR = bOpts.minRadius ?? 4\n const maxR = bOpts.maxRadius ?? 30\n\n let sizeMin = Infinity\n let sizeMax = -Infinity\n for (const sizes of allSizes) {\n for (const s of sizes) {\n if (s < sizeMin) sizeMin = s\n if (s > sizeMax) sizeMax = s\n }\n }\n if (!isFinite(sizeMin)) { sizeMin = 1; sizeMax = 1 }\n const sizeRange = sizeMax - sizeMin || 1\n\n let best: HitResult | null = null\n let bestDist = Infinity\n\n for (const series of data.series) {\n const sizes = allSizes[series.index] ?? []\n for (let i = 0; i < series.values.length; i++) {\n const x = xScale.map(i)\n const y = yScale.map(series.values[i]!)\n const rawSize = sizes[i] ?? 1\n const normalized = (rawSize - sizeMin) / sizeRange\n const r = minR + normalized * (maxR - minR)\n\n const dist = Math.sqrt((mx - x) ** 2 + (my - y) ** 2)\n if (dist < r + 4 && dist < bestDist) {\n bestDist = dist\n best = { seriesIndex: series.index, pointIndex: i, distance: dist, x, y }\n }\n }\n }\n\n return best\n },\n}\n"]}
1
+ {"version":3,"sources":["../src/charts/bubble/bubble-type.ts"],"names":["prepareData","circle","group"],"mappings":"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","file":"chunk-4MNVJVK3.cjs","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareData } from '../../data/prepare'\nimport { group, circle } from '../../render/tree'\n\nexport interface BubbleOptions {\n /** Sizes array per series. Each entry maps 1:1 to values. */\n sizes?: number[][]\n /** Min bubble radius in px. Default 4. */\n minRadius?: number\n /** Max bubble radius in px. Default 30. */\n maxRadius?: number\n}\n\n/**\n * Bubble chart — scatter with variable-radius circles.\n * Pass sizes via options: `{ sizes: [[10, 20, 5, ...], ...] }`\n */\nexport const bubbleChartType: ChartTypePlugin = {\n type: 'bubble',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n return prepareData(data, options)\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, xScale, yScale } = ctx\n const nodes: RenderNode[] = []\n\n const bOpts = ctx.options as unknown as BubbleOptions\n const allSizes = bOpts.sizes ?? []\n const minR = bOpts.minRadius ?? 4\n const maxR = bOpts.maxRadius ?? 30\n\n // Find global size range for normalization\n let sizeMin = Infinity\n let sizeMax = -Infinity\n for (const sizes of allSizes) {\n for (const s of sizes) {\n if (s < sizeMin) sizeMin = s\n if (s > sizeMax) sizeMax = s\n }\n }\n if (!isFinite(sizeMin)) { sizeMin = 1; sizeMax = 1 }\n const sizeRange = sizeMax - sizeMin || 1\n\n for (const series of data.series) {\n const sizes = allSizes[series.index] ?? []\n const dots: RenderNode[] = []\n\n for (let i = 0; i < series.values.length; i++) {\n const x = xScale.map(i)\n const y = yScale.map(series.values[i]!)\n const rawSize = sizes[i] ?? 1\n const normalized = (rawSize - sizeMin) / sizeRange\n const r = minR + normalized * (maxR - minR)\n\n dots.push(circle(x, y, r, {\n class: 'chartts-bubble',\n fill: series.color,\n fillOpacity: 0.5,\n stroke: series.color,\n strokeWidth: 1.5,\n 'data-series': series.index,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${series.name}: ${series.values[i]} (size: ${rawSize})`,\n }))\n }\n\n nodes.push(group(dots, {\n class: `chartts-series chartts-series-${series.index}`,\n 'data-series-name': series.name,\n }))\n }\n\n return nodes\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { data, xScale, yScale } = ctx\n const bOpts = ctx.options as unknown as BubbleOptions\n const allSizes = bOpts.sizes ?? []\n const minR = bOpts.minRadius ?? 4\n const maxR = bOpts.maxRadius ?? 30\n\n let sizeMin = Infinity\n let sizeMax = -Infinity\n for (const sizes of allSizes) {\n for (const s of sizes) {\n if (s < sizeMin) sizeMin = s\n if (s > sizeMax) sizeMax = s\n }\n }\n if (!isFinite(sizeMin)) { sizeMin = 1; sizeMax = 1 }\n const sizeRange = sizeMax - sizeMin || 1\n\n let best: HitResult | null = null\n let bestDist = Infinity\n\n for (const series of data.series) {\n const sizes = allSizes[series.index] ?? []\n for (let i = 0; i < series.values.length; i++) {\n const x = xScale.map(i)\n const y = yScale.map(series.values[i]!)\n const rawSize = sizes[i] ?? 1\n const normalized = (rawSize - sizeMin) / sizeRange\n const r = minR + normalized * (maxR - minR)\n\n const dist = Math.sqrt((mx - x) ** 2 + (my - y) ** 2)\n if (dist < r + 4 && dist < bestDist) {\n bestDist = dist\n best = { seriesIndex: series.index, pointIndex: i, distance: dist, x, y }\n }\n }\n }\n\n return best\n },\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { circle, group, prepareData } from './chunk-DX4FBN3I.js';
1
+ import { circle, group, prepareData } from './chunk-AEQXFDL7.js';
2
2
 
3
3
  // src/charts/bubble/bubble-type.ts
4
4
  var bubbleChartType = {
@@ -99,5 +99,5 @@ var bubbleChartType = {
99
99
  };
100
100
 
101
101
  export { bubbleChartType };
102
- //# sourceMappingURL=chunk-RQJRVKAH.js.map
103
- //# sourceMappingURL=chunk-RQJRVKAH.js.map
102
+ //# sourceMappingURL=chunk-4QRND2V5.js.map
103
+ //# sourceMappingURL=chunk-4QRND2V5.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/charts/bubble/bubble-type.ts"],"names":[],"mappings":"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","file":"chunk-RQJRVKAH.js","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareData } from '../../data/prepare'\nimport { group, circle } from '../../render/tree'\n\nexport interface BubbleOptions {\n /** Sizes array per series. Each entry maps 1:1 to values. */\n sizes?: number[][]\n /** Min bubble radius in px. Default 4. */\n minRadius?: number\n /** Max bubble radius in px. Default 30. */\n maxRadius?: number\n}\n\n/**\n * Bubble chart — scatter with variable-radius circles.\n * Pass sizes via options: `{ sizes: [[10, 20, 5, ...], ...] }`\n */\nexport const bubbleChartType: ChartTypePlugin = {\n type: 'bubble',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n return prepareData(data, options)\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, xScale, yScale } = ctx\n const nodes: RenderNode[] = []\n\n const bOpts = ctx.options as unknown as BubbleOptions\n const allSizes = bOpts.sizes ?? []\n const minR = bOpts.minRadius ?? 4\n const maxR = bOpts.maxRadius ?? 30\n\n // Find global size range for normalization\n let sizeMin = Infinity\n let sizeMax = -Infinity\n for (const sizes of allSizes) {\n for (const s of sizes) {\n if (s < sizeMin) sizeMin = s\n if (s > sizeMax) sizeMax = s\n }\n }\n if (!isFinite(sizeMin)) { sizeMin = 1; sizeMax = 1 }\n const sizeRange = sizeMax - sizeMin || 1\n\n for (const series of data.series) {\n const sizes = allSizes[series.index] ?? []\n const dots: RenderNode[] = []\n\n for (let i = 0; i < series.values.length; i++) {\n const x = xScale.map(i)\n const y = yScale.map(series.values[i]!)\n const rawSize = sizes[i] ?? 1\n const normalized = (rawSize - sizeMin) / sizeRange\n const r = minR + normalized * (maxR - minR)\n\n dots.push(circle(x, y, r, {\n class: 'chartts-bubble',\n fill: series.color,\n fillOpacity: 0.5,\n stroke: series.color,\n strokeWidth: 1.5,\n 'data-series': series.index,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${series.name}: ${series.values[i]} (size: ${rawSize})`,\n }))\n }\n\n nodes.push(group(dots, {\n class: `chartts-series chartts-series-${series.index}`,\n 'data-series-name': series.name,\n }))\n }\n\n return nodes\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { data, xScale, yScale } = ctx\n const bOpts = ctx.options as unknown as BubbleOptions\n const allSizes = bOpts.sizes ?? []\n const minR = bOpts.minRadius ?? 4\n const maxR = bOpts.maxRadius ?? 30\n\n let sizeMin = Infinity\n let sizeMax = -Infinity\n for (const sizes of allSizes) {\n for (const s of sizes) {\n if (s < sizeMin) sizeMin = s\n if (s > sizeMax) sizeMax = s\n }\n }\n if (!isFinite(sizeMin)) { sizeMin = 1; sizeMax = 1 }\n const sizeRange = sizeMax - sizeMin || 1\n\n let best: HitResult | null = null\n let bestDist = Infinity\n\n for (const series of data.series) {\n const sizes = allSizes[series.index] ?? []\n for (let i = 0; i < series.values.length; i++) {\n const x = xScale.map(i)\n const y = yScale.map(series.values[i]!)\n const rawSize = sizes[i] ?? 1\n const normalized = (rawSize - sizeMin) / sizeRange\n const r = minR + normalized * (maxR - minR)\n\n const dist = Math.sqrt((mx - x) ** 2 + (my - y) ** 2)\n if (dist < r + 4 && dist < bestDist) {\n bestDist = dist\n best = { seriesIndex: series.index, pointIndex: i, distance: dist, x, y }\n }\n }\n }\n\n return best\n },\n}\n"]}
1
+ {"version":3,"sources":["../src/charts/bubble/bubble-type.ts"],"names":[],"mappings":";;;AAoBO,IAAM,eAAA,GAAmC;AAAA,EAC9C,IAAA,EAAM,QAAA;AAAA,EAEN,aAAA,GAAgD;AAC9C,IAAA,OAAO,EAAE,CAAA,EAAG,aAAA,EAAe,CAAA,EAAG,QAAA,EAAS;AAAA,EACzC,CAAA;AAAA,EAEA,WAAA,CAAY,MAAiB,OAAA,EAAwC;AACnE,IAAA,OAAO,WAAA,CAAY,MAAM,OAAO,CAAA;AAAA,EAClC,CAAA;AAAA,EAEA,OAAO,GAAA,EAAkC;AACvC,IAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAO,GAAI,GAAA;AACjC,IAAA,MAAM,QAAsB,EAAC;AAE7B,IAAA,MAAM,QAAQ,GAAA,CAAI,OAAA;AAClB,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,IAAS,EAAC;AACjC,IAAA,MAAM,IAAA,GAAO,MAAM,SAAA,IAAa,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,MAAM,SAAA,IAAa,EAAA;AAGhC,IAAA,IAAI,OAAA,GAAU,QAAA;AACd,IAAA,IAAI,OAAA,GAAU,CAAA,QAAA;AACd,IAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,MAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,QAAA,IAAI,CAAA,GAAI,SAAS,OAAA,GAAU,CAAA;AAC3B,QAAA,IAAI,CAAA,GAAI,SAAS,OAAA,GAAU,CAAA;AAAA,MAC7B;AAAA,IACF;AACA,IAAA,IAAI,CAAC,QAAA,CAAS,OAAO,CAAA,EAAG;AAAE,MAAA,OAAA,GAAU,CAAA;AAAG,MAAA,OAAA,GAAU,CAAA;AAAA,IAAE;AACnD,IAAA,MAAM,SAAA,GAAY,UAAU,OAAA,IAAW,CAAA;AAEvC,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,MAAA,EAAQ;AAChC,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,MAAA,CAAO,KAAK,KAAK,EAAC;AACzC,MAAA,MAAM,OAAqB,EAAC;AAE5B,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAC7C,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA;AACtB,QAAA,MAAM,IAAI,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAE,CAAA;AACtC,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAC5B,QAAA,MAAM,UAAA,GAAA,CAAc,UAAU,OAAA,IAAW,SAAA;AACzC,QAAA,MAAM,CAAA,GAAI,IAAA,GAAO,UAAA,IAAc,IAAA,GAAO,IAAA,CAAA;AAEtC,QAAA,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG;AAAA,UACxB,KAAA,EAAO,gBAAA;AAAA,UACP,MAAM,MAAA,CAAO,KAAA;AAAA,UACb,WAAA,EAAa,GAAA;AAAA,UACb,QAAQ,MAAA,CAAO,KAAA;AAAA,UACf,WAAA,EAAa,GAAA;AAAA,UACb,eAAe,MAAA,CAAO,KAAA;AAAA,UACtB,YAAA,EAAc,CAAA;AAAA,UACd,QAAA,EAAU,CAAA;AAAA,UACV,IAAA,EAAM,KAAA;AAAA,UACN,SAAA,EAAW,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,EAAA,EAAK,OAAO,MAAA,CAAO,CAAC,CAAC,CAAA,QAAA,EAAW,OAAO,CAAA,CAAA;AAAA,SACjE,CAAC,CAAA;AAAA,MACJ;AAEA,MAAA,KAAA,CAAM,IAAA,CAAK,MAAM,IAAA,EAAM;AAAA,QACrB,KAAA,EAAO,CAAA,8BAAA,EAAiC,MAAA,CAAO,KAAK,CAAA,CAAA;AAAA,QACpD,oBAAoB,MAAA,CAAO;AAAA,OAC5B,CAAC,CAAA;AAAA,IACJ;AAEA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAAA,EAEA,OAAA,CAAQ,GAAA,EAAoB,EAAA,EAAY,EAAA,EAA8B;AACpE,IAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAO,GAAI,GAAA;AACjC,IAAA,MAAM,QAAQ,GAAA,CAAI,OAAA;AAClB,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,IAAS,EAAC;AACjC,IAAA,MAAM,IAAA,GAAO,MAAM,SAAA,IAAa,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,MAAM,SAAA,IAAa,EAAA;AAEhC,IAAA,IAAI,OAAA,GAAU,QAAA;AACd,IAAA,IAAI,OAAA,GAAU,CAAA,QAAA;AACd,IAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,MAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,QAAA,IAAI,CAAA,GAAI,SAAS,OAAA,GAAU,CAAA;AAC3B,QAAA,IAAI,CAAA,GAAI,SAAS,OAAA,GAAU,CAAA;AAAA,MAC7B;AAAA,IACF;AACA,IAAA,IAAI,CAAC,QAAA,CAAS,OAAO,CAAA,EAAG;AAAE,MAAA,OAAA,GAAU,CAAA;AAAG,MAAA,OAAA,GAAU,CAAA;AAAA,IAAE;AACnD,IAAA,MAAM,SAAA,GAAY,UAAU,OAAA,IAAW,CAAA;AAEvC,IAAA,IAAI,IAAA,GAAyB,IAAA;AAC7B,IAAA,IAAI,QAAA,GAAW,QAAA;AAEf,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,MAAA,EAAQ;AAChC,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,MAAA,CAAO,KAAK,KAAK,EAAC;AACzC,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAC7C,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA;AACtB,QAAA,MAAM,IAAI,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAE,CAAA;AACtC,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAC5B,QAAA,MAAM,UAAA,GAAA,CAAc,UAAU,OAAA,IAAW,SAAA;AACzC,QAAA,MAAM,CAAA,GAAI,IAAA,GAAO,UAAA,IAAc,IAAA,GAAO,IAAA,CAAA;AAEtC,QAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAA,CAAM,EAAA,GAAK,MAAM,CAAA,GAAA,CAAK,EAAA,GAAK,MAAM,CAAC,CAAA;AACpD,QAAA,IAAI,IAAA,GAAO,CAAA,GAAI,CAAA,IAAK,IAAA,GAAO,QAAA,EAAU;AACnC,UAAA,QAAA,GAAW,IAAA;AACX,UAAA,IAAA,GAAO,EAAE,aAAa,MAAA,CAAO,KAAA,EAAO,YAAY,CAAA,EAAG,QAAA,EAAU,IAAA,EAAM,CAAA,EAAG,CAAA,EAAE;AAAA,QAC1E;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF","file":"chunk-4QRND2V5.js","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareData } from '../../data/prepare'\nimport { group, circle } from '../../render/tree'\n\nexport interface BubbleOptions {\n /** Sizes array per series. Each entry maps 1:1 to values. */\n sizes?: number[][]\n /** Min bubble radius in px. Default 4. */\n minRadius?: number\n /** Max bubble radius in px. Default 30. */\n maxRadius?: number\n}\n\n/**\n * Bubble chart — scatter with variable-radius circles.\n * Pass sizes via options: `{ sizes: [[10, 20, 5, ...], ...] }`\n */\nexport const bubbleChartType: ChartTypePlugin = {\n type: 'bubble',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n return prepareData(data, options)\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, xScale, yScale } = ctx\n const nodes: RenderNode[] = []\n\n const bOpts = ctx.options as unknown as BubbleOptions\n const allSizes = bOpts.sizes ?? []\n const minR = bOpts.minRadius ?? 4\n const maxR = bOpts.maxRadius ?? 30\n\n // Find global size range for normalization\n let sizeMin = Infinity\n let sizeMax = -Infinity\n for (const sizes of allSizes) {\n for (const s of sizes) {\n if (s < sizeMin) sizeMin = s\n if (s > sizeMax) sizeMax = s\n }\n }\n if (!isFinite(sizeMin)) { sizeMin = 1; sizeMax = 1 }\n const sizeRange = sizeMax - sizeMin || 1\n\n for (const series of data.series) {\n const sizes = allSizes[series.index] ?? []\n const dots: RenderNode[] = []\n\n for (let i = 0; i < series.values.length; i++) {\n const x = xScale.map(i)\n const y = yScale.map(series.values[i]!)\n const rawSize = sizes[i] ?? 1\n const normalized = (rawSize - sizeMin) / sizeRange\n const r = minR + normalized * (maxR - minR)\n\n dots.push(circle(x, y, r, {\n class: 'chartts-bubble',\n fill: series.color,\n fillOpacity: 0.5,\n stroke: series.color,\n strokeWidth: 1.5,\n 'data-series': series.index,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${series.name}: ${series.values[i]} (size: ${rawSize})`,\n }))\n }\n\n nodes.push(group(dots, {\n class: `chartts-series chartts-series-${series.index}`,\n 'data-series-name': series.name,\n }))\n }\n\n return nodes\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { data, xScale, yScale } = ctx\n const bOpts = ctx.options as unknown as BubbleOptions\n const allSizes = bOpts.sizes ?? []\n const minR = bOpts.minRadius ?? 4\n const maxR = bOpts.maxRadius ?? 30\n\n let sizeMin = Infinity\n let sizeMax = -Infinity\n for (const sizes of allSizes) {\n for (const s of sizes) {\n if (s < sizeMin) sizeMin = s\n if (s > sizeMax) sizeMax = s\n }\n }\n if (!isFinite(sizeMin)) { sizeMin = 1; sizeMax = 1 }\n const sizeRange = sizeMax - sizeMin || 1\n\n let best: HitResult | null = null\n let bestDist = Infinity\n\n for (const series of data.series) {\n const sizes = allSizes[series.index] ?? []\n for (let i = 0; i < series.values.length; i++) {\n const x = xScale.map(i)\n const y = yScale.map(series.values[i]!)\n const rawSize = sizes[i] ?? 1\n const normalized = (rawSize - sizeMin) / sizeRange\n const r = minR + normalized * (maxR - minR)\n\n const dist = Math.sqrt((mx - x) ** 2 + (my - y) ** 2)\n if (dist < r + 4 && dist < bestDist) {\n bestDist = dist\n best = { seriesIndex: series.index, pointIndex: i, distance: dist, x, y }\n }\n }\n }\n\n return best\n },\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunkCDS2NXGT_cjs = require('./chunk-CDS2NXGT.cjs');
4
- var chunkUMIJYYF3_cjs = require('./chunk-UMIJYYF3.cjs');
3
+ var chunkV5Q6UNUK_cjs = require('./chunk-V5Q6UNUK.cjs');
4
+ var chunkJVVGQLJQ_cjs = require('./chunk-JVVGQLJQ.cjs');
5
5
 
6
6
  // src/charts/lines/lines-type.ts
7
7
  var linesChartType = {
@@ -10,7 +10,7 @@ var linesChartType = {
10
10
  return { x: "categorical", y: "linear" };
11
11
  },
12
12
  prepareData(data, options) {
13
- return chunkCDS2NXGT_cjs.prepareNoAxes(data, options);
13
+ return chunkV5Q6UNUK_cjs.prepareNoAxes(data, options);
14
14
  },
15
15
  render(ctx) {
16
16
  const { data, area, theme, options } = ctx;
@@ -76,10 +76,10 @@ var linesChartType = {
76
76
  const my = (src.y + tgt.y) / 2;
77
77
  const cpx = mx - dy * curvature;
78
78
  const cpy = my + dx * curvature;
79
- const pb = new chunkUMIJYYF3_cjs.PathBuilder();
79
+ const pb = new chunkJVVGQLJQ_cjs.PathBuilder();
80
80
  pb.moveTo(src.x, src.y);
81
81
  pb.quadTo(cpx, cpy, tgt.x, tgt.y);
82
- nodes.push(chunkUMIJYYF3_cjs.path(pb.build(), {
82
+ nodes.push(chunkJVVGQLJQ_cjs.path(pb.build(), {
83
83
  class: "chartts-lines-flow",
84
84
  fill: "none",
85
85
  stroke: color,
@@ -98,7 +98,7 @@ var linesChartType = {
98
98
  const ay = (1 - t) * (1 - t) * src.y + 2 * (1 - t) * t * cpy + t * t * tgt.y;
99
99
  const angle = Math.atan2(tgt.y - ay, tgt.x - ax);
100
100
  const arrowSize = 6 + lineWidth;
101
- const apb = new chunkUMIJYYF3_cjs.PathBuilder();
101
+ const apb = new chunkJVVGQLJQ_cjs.PathBuilder();
102
102
  apb.moveTo(tgt.x, tgt.y);
103
103
  apb.lineTo(
104
104
  tgt.x - arrowSize * Math.cos(angle - 0.4),
@@ -109,7 +109,7 @@ var linesChartType = {
109
109
  tgt.y - arrowSize * Math.sin(angle + 0.4)
110
110
  );
111
111
  apb.close();
112
- nodes.push(chunkUMIJYYF3_cjs.path(apb.build(), {
112
+ nodes.push(chunkJVVGQLJQ_cjs.path(apb.build(), {
113
113
  class: "chartts-lines-arrow",
114
114
  fill: color,
115
115
  fillOpacity: 0.8
@@ -121,7 +121,7 @@ var linesChartType = {
121
121
  let idx = 0;
122
122
  for (const [name, pos] of pointMap) {
123
123
  const color = options.colors[idx % options.colors.length];
124
- nodeNodes.push(chunkUMIJYYF3_cjs.circle(pos.x, pos.y, 6, {
124
+ nodeNodes.push(chunkJVVGQLJQ_cjs.circle(pos.x, pos.y, 6, {
125
125
  class: "chartts-lines-node",
126
126
  fill: color,
127
127
  stroke: theme.background === "transparent" ? "#fff" : theme.background,
@@ -130,7 +130,7 @@ var linesChartType = {
130
130
  "data-index": 0
131
131
  }));
132
132
  if (showLabels) {
133
- nodeNodes.push(chunkUMIJYYF3_cjs.text(pos.x, pos.y - 14, name, {
133
+ nodeNodes.push(chunkJVVGQLJQ_cjs.text(pos.x, pos.y - 14, name, {
134
134
  class: "chartts-lines-label",
135
135
  fill: theme.textColor,
136
136
  textAnchor: "middle",
@@ -142,7 +142,7 @@ var linesChartType = {
142
142
  }
143
143
  idx++;
144
144
  }
145
- nodes.push(chunkUMIJYYF3_cjs.group(nodeNodes, { class: "chartts-lines-nodes" }));
145
+ nodes.push(chunkJVVGQLJQ_cjs.group(nodeNodes, { class: "chartts-lines-nodes" }));
146
146
  }
147
147
  return nodes;
148
148
  },
@@ -174,5 +174,5 @@ var linesChartType = {
174
174
  };
175
175
 
176
176
  exports.linesChartType = linesChartType;
177
- //# sourceMappingURL=chunk-NGKUI7XE.cjs.map
178
- //# sourceMappingURL=chunk-NGKUI7XE.cjs.map
177
+ //# sourceMappingURL=chunk-55ZTXQQQ.cjs.map
178
+ //# sourceMappingURL=chunk-55ZTXQQQ.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/charts/lines/lines-type.ts"],"names":["prepareNoAxes","PathBuilder","path","circle","text","group"],"mappings":"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","file":"chunk-NGKUI7XE.cjs","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareNoAxes } from '../../utils/prepare'\nimport { circle, text, group } from '../../render/tree'\nimport { PathBuilder } from '../../render/tree'\nimport { path } from '../../render/tree'\n\n/**\n * Lines (flow lines) chart — curved connection lines between named points.\n *\n * Data convention:\n * - labels: point/city names\n * - series use arrow notation: \"A → B\" with values[0] = flow magnitude\n *\n * Options:\n * - points: array of {name, x, y} defining positions in 0..1 normalized space\n * - showNodes: show circles at point positions (default true)\n * - showArrows: show arrowheads (default true)\n * - showLabels: show point name labels (default true)\n * - curvature: bezier curve amount 0..1 (default 0.3)\n */\n\nexport interface LinesPoint {\n name: string\n x: number // 0..1 normalized\n y: number // 0..1 normalized\n}\n\nexport interface LinesOptions {\n points?: LinesPoint[]\n showNodes?: boolean\n showArrows?: boolean\n showLabels?: boolean\n curvature?: number\n}\n\ninterface ParsedFlow {\n source: string\n target: string\n value: number\n}\n\nexport const linesChartType: ChartTypePlugin = {\n type: 'lines',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n return prepareNoAxes(data, options)\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, area, theme, options } = ctx\n const nodes: RenderNode[] = []\n\n const lOpts = options as unknown as LinesOptions\n const showNodes = lOpts.showNodes !== false\n const showArrows = lOpts.showArrows !== false\n const showLabels = lOpts.showLabels !== false\n const curvature = lOpts.curvature ?? 0.3\n\n // Build point positions\n const pointMap = new Map<string, { x: number; y: number }>()\n\n if (lOpts.points) {\n for (const p of lOpts.points) {\n pointMap.set(p.name, {\n x: area.x + p.x * area.width,\n y: area.y + p.y * area.height,\n })\n }\n } else {\n // Auto-layout: arrange points in a circle\n const names = new Set<string>()\n for (const s of data.series) {\n const parts = s.name.split(/\\s*(?:→|->)\\s*/)\n if (parts.length >= 2) {\n names.add(parts[0]!.trim())\n names.add(parts[1]!.trim())\n }\n }\n // Also add labels\n for (const l of data.labels) names.add(String(l))\n\n const nameArr = [...names]\n const cx = area.x + area.width / 2\n const cy = area.y + area.height / 2\n const r = Math.min(area.width, area.height) / 2 - 40\n\n nameArr.forEach((name, i) => {\n const angle = (i / nameArr.length) * Math.PI * 2 - Math.PI / 2\n pointMap.set(name, {\n x: cx + r * Math.cos(angle),\n y: cy + r * Math.sin(angle),\n })\n })\n }\n\n // Parse flows from series\n const flows: ParsedFlow[] = []\n for (const s of data.series) {\n const parts = s.name.split(/\\s*(?:→|->)\\s*/)\n if (parts.length >= 2) {\n flows.push({\n source: parts[0]!.trim(),\n target: parts[1]!.trim(),\n value: s.values[0] ?? 1,\n })\n }\n }\n\n if (flows.length === 0 && pointMap.size === 0) return nodes\n\n // Max flow for line width scaling\n const maxFlow = Math.max(...flows.map(f => Math.abs(f.value)), 1)\n\n // Render flow lines\n for (let fi = 0; fi < flows.length; fi++) {\n const flow = flows[fi]!\n const src = pointMap.get(flow.source)\n const tgt = pointMap.get(flow.target)\n if (!src || !tgt) continue\n\n const color = options.colors[fi % options.colors.length]!\n const lineWidth = 1 + (Math.abs(flow.value) / maxFlow) * 4\n\n // Curved bezier\n const dx = tgt.x - src.x\n const dy = tgt.y - src.y\n const mx = (src.x + tgt.x) / 2\n const my = (src.y + tgt.y) / 2\n const cpx = mx - dy * curvature\n const cpy = my + dx * curvature\n\n const pb = new PathBuilder()\n pb.moveTo(src.x, src.y)\n pb.quadTo(cpx, cpy, tgt.x, tgt.y)\n\n nodes.push(path(pb.build(), {\n class: 'chartts-lines-flow',\n fill: 'none',\n stroke: color,\n strokeWidth: lineWidth,\n strokeOpacity: 0.6,\n strokeLinecap: 'round',\n 'data-series': fi,\n 'data-index': 0,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${flow.source} → ${flow.target}: ${flow.value}`,\n }))\n\n // Arrowhead at target\n if (showArrows) {\n const t = 0.95 // position along curve for arrow direction\n const ax = (1 - t) * (1 - t) * src.x + 2 * (1 - t) * t * cpx + t * t * tgt.x\n const ay = (1 - t) * (1 - t) * src.y + 2 * (1 - t) * t * cpy + t * t * tgt.y\n const angle = Math.atan2(tgt.y - ay, tgt.x - ax)\n const arrowSize = 6 + lineWidth\n\n const apb = new PathBuilder()\n apb.moveTo(tgt.x, tgt.y)\n apb.lineTo(\n tgt.x - arrowSize * Math.cos(angle - 0.4),\n tgt.y - arrowSize * Math.sin(angle - 0.4),\n )\n apb.lineTo(\n tgt.x - arrowSize * Math.cos(angle + 0.4),\n tgt.y - arrowSize * Math.sin(angle + 0.4),\n )\n apb.close()\n\n nodes.push(path(apb.build(), {\n class: 'chartts-lines-arrow',\n fill: color,\n fillOpacity: 0.8,\n }))\n }\n }\n\n // Render nodes\n if (showNodes) {\n const nodeNodes: RenderNode[] = []\n let idx = 0\n for (const [name, pos] of pointMap) {\n const color = options.colors[idx % options.colors.length]!\n\n nodeNodes.push(circle(pos.x, pos.y, 6, {\n class: 'chartts-lines-node',\n fill: color,\n stroke: theme.background === 'transparent' ? '#fff' : theme.background,\n strokeWidth: 2,\n 'data-series': idx,\n 'data-index': 0,\n }))\n\n if (showLabels) {\n nodeNodes.push(text(pos.x, pos.y - 14, name, {\n class: 'chartts-lines-label',\n fill: theme.textColor,\n textAnchor: 'middle',\n dominantBaseline: 'auto',\n fontSize: theme.fontSizeSmall,\n fontFamily: theme.fontFamily,\n fontWeight: 600,\n }))\n }\n idx++\n }\n nodes.push(group(nodeNodes, { class: 'chartts-lines-nodes' }))\n }\n\n return nodes\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { options } = ctx\n const lOpts = options as unknown as LinesOptions\n const pointMap = new Map<string, { x: number; y: number }>()\n\n if (lOpts.points) {\n const { area } = ctx\n for (const p of lOpts.points) {\n pointMap.set(p.name, {\n x: area.x + p.x * area.width,\n y: area.y + p.y * area.height,\n })\n }\n }\n\n let idx = 0\n for (const [, pos] of pointMap) {\n const dx = mx - pos.x\n const dy = my - pos.y\n const dist = Math.sqrt(dx * dx + dy * dy)\n if (dist < 12) {\n return { seriesIndex: idx, pointIndex: 0, distance: dist, x: pos.x, y: pos.y }\n }\n idx++\n }\n return null\n },\n}\n"]}
1
+ {"version":3,"sources":["../src/charts/lines/lines-type.ts"],"names":["prepareNoAxes","PathBuilder","path","circle","text","group"],"mappings":"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","file":"chunk-55ZTXQQQ.cjs","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareNoAxes } from '../../utils/prepare'\nimport { circle, text, group } from '../../render/tree'\nimport { PathBuilder } from '../../render/tree'\nimport { path } from '../../render/tree'\n\n/**\n * Lines (flow lines) chart — curved connection lines between named points.\n *\n * Data convention:\n * - labels: point/city names\n * - series use arrow notation: \"A → B\" with values[0] = flow magnitude\n *\n * Options:\n * - points: array of {name, x, y} defining positions in 0..1 normalized space\n * - showNodes: show circles at point positions (default true)\n * - showArrows: show arrowheads (default true)\n * - showLabels: show point name labels (default true)\n * - curvature: bezier curve amount 0..1 (default 0.3)\n */\n\nexport interface LinesPoint {\n name: string\n x: number // 0..1 normalized\n y: number // 0..1 normalized\n}\n\nexport interface LinesOptions {\n points?: LinesPoint[]\n showNodes?: boolean\n showArrows?: boolean\n showLabels?: boolean\n curvature?: number\n}\n\ninterface ParsedFlow {\n source: string\n target: string\n value: number\n}\n\nexport const linesChartType: ChartTypePlugin = {\n type: 'lines',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n return prepareNoAxes(data, options)\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, area, theme, options } = ctx\n const nodes: RenderNode[] = []\n\n const lOpts = options as unknown as LinesOptions\n const showNodes = lOpts.showNodes !== false\n const showArrows = lOpts.showArrows !== false\n const showLabels = lOpts.showLabels !== false\n const curvature = lOpts.curvature ?? 0.3\n\n // Build point positions\n const pointMap = new Map<string, { x: number; y: number }>()\n\n if (lOpts.points) {\n for (const p of lOpts.points) {\n pointMap.set(p.name, {\n x: area.x + p.x * area.width,\n y: area.y + p.y * area.height,\n })\n }\n } else {\n // Auto-layout: arrange points in a circle\n const names = new Set<string>()\n for (const s of data.series) {\n const parts = s.name.split(/\\s*(?:→|->)\\s*/)\n if (parts.length >= 2) {\n names.add(parts[0]!.trim())\n names.add(parts[1]!.trim())\n }\n }\n // Also add labels\n for (const l of data.labels) names.add(String(l))\n\n const nameArr = [...names]\n const cx = area.x + area.width / 2\n const cy = area.y + area.height / 2\n const r = Math.min(area.width, area.height) / 2 - 40\n\n nameArr.forEach((name, i) => {\n const angle = (i / nameArr.length) * Math.PI * 2 - Math.PI / 2\n pointMap.set(name, {\n x: cx + r * Math.cos(angle),\n y: cy + r * Math.sin(angle),\n })\n })\n }\n\n // Parse flows from series\n const flows: ParsedFlow[] = []\n for (const s of data.series) {\n const parts = s.name.split(/\\s*(?:→|->)\\s*/)\n if (parts.length >= 2) {\n flows.push({\n source: parts[0]!.trim(),\n target: parts[1]!.trim(),\n value: s.values[0] ?? 1,\n })\n }\n }\n\n if (flows.length === 0 && pointMap.size === 0) return nodes\n\n // Max flow for line width scaling\n const maxFlow = Math.max(...flows.map(f => Math.abs(f.value)), 1)\n\n // Render flow lines\n for (let fi = 0; fi < flows.length; fi++) {\n const flow = flows[fi]!\n const src = pointMap.get(flow.source)\n const tgt = pointMap.get(flow.target)\n if (!src || !tgt) continue\n\n const color = options.colors[fi % options.colors.length]!\n const lineWidth = 1 + (Math.abs(flow.value) / maxFlow) * 4\n\n // Curved bezier\n const dx = tgt.x - src.x\n const dy = tgt.y - src.y\n const mx = (src.x + tgt.x) / 2\n const my = (src.y + tgt.y) / 2\n const cpx = mx - dy * curvature\n const cpy = my + dx * curvature\n\n const pb = new PathBuilder()\n pb.moveTo(src.x, src.y)\n pb.quadTo(cpx, cpy, tgt.x, tgt.y)\n\n nodes.push(path(pb.build(), {\n class: 'chartts-lines-flow',\n fill: 'none',\n stroke: color,\n strokeWidth: lineWidth,\n strokeOpacity: 0.6,\n strokeLinecap: 'round',\n 'data-series': fi,\n 'data-index': 0,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${flow.source} → ${flow.target}: ${flow.value}`,\n }))\n\n // Arrowhead at target\n if (showArrows) {\n const t = 0.95 // position along curve for arrow direction\n const ax = (1 - t) * (1 - t) * src.x + 2 * (1 - t) * t * cpx + t * t * tgt.x\n const ay = (1 - t) * (1 - t) * src.y + 2 * (1 - t) * t * cpy + t * t * tgt.y\n const angle = Math.atan2(tgt.y - ay, tgt.x - ax)\n const arrowSize = 6 + lineWidth\n\n const apb = new PathBuilder()\n apb.moveTo(tgt.x, tgt.y)\n apb.lineTo(\n tgt.x - arrowSize * Math.cos(angle - 0.4),\n tgt.y - arrowSize * Math.sin(angle - 0.4),\n )\n apb.lineTo(\n tgt.x - arrowSize * Math.cos(angle + 0.4),\n tgt.y - arrowSize * Math.sin(angle + 0.4),\n )\n apb.close()\n\n nodes.push(path(apb.build(), {\n class: 'chartts-lines-arrow',\n fill: color,\n fillOpacity: 0.8,\n }))\n }\n }\n\n // Render nodes\n if (showNodes) {\n const nodeNodes: RenderNode[] = []\n let idx = 0\n for (const [name, pos] of pointMap) {\n const color = options.colors[idx % options.colors.length]!\n\n nodeNodes.push(circle(pos.x, pos.y, 6, {\n class: 'chartts-lines-node',\n fill: color,\n stroke: theme.background === 'transparent' ? '#fff' : theme.background,\n strokeWidth: 2,\n 'data-series': idx,\n 'data-index': 0,\n }))\n\n if (showLabels) {\n nodeNodes.push(text(pos.x, pos.y - 14, name, {\n class: 'chartts-lines-label',\n fill: theme.textColor,\n textAnchor: 'middle',\n dominantBaseline: 'auto',\n fontSize: theme.fontSizeSmall,\n fontFamily: theme.fontFamily,\n fontWeight: 600,\n }))\n }\n idx++\n }\n nodes.push(group(nodeNodes, { class: 'chartts-lines-nodes' }))\n }\n\n return nodes\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { options } = ctx\n const lOpts = options as unknown as LinesOptions\n const pointMap = new Map<string, { x: number; y: number }>()\n\n if (lOpts.points) {\n const { area } = ctx\n for (const p of lOpts.points) {\n pointMap.set(p.name, {\n x: area.x + p.x * area.width,\n y: area.y + p.y * area.height,\n })\n }\n }\n\n let idx = 0\n for (const [, pos] of pointMap) {\n const dx = mx - pos.x\n const dy = my - pos.y\n const dist = Math.sqrt(dx * dx + dy * dy)\n if (dist < 12) {\n return { seriesIndex: idx, pointIndex: 0, distance: dist, x: pos.x, y: pos.y }\n }\n idx++\n }\n return null\n },\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { roundedSlicePath } from './chunk-UFMPALRH.js';
2
- import { prepareNoAxes } from './chunk-MPQECPE3.js';
3
- import { path, text, group } from './chunk-DX4FBN3I.js';
1
+ import { roundedSlicePath } from './chunk-VGJD4F4H.js';
2
+ import { prepareNoAxes } from './chunk-T7SCCACB.js';
3
+ import { path, text, group } from './chunk-AEQXFDL7.js';
4
4
 
5
5
  // src/charts/pie/pie-type.ts
6
6
  var pieChartType = {
@@ -167,5 +167,5 @@ var donutChartType = {
167
167
  };
168
168
 
169
169
  export { donutChartType, pieChartType };
170
- //# sourceMappingURL=chunk-2MWA7H6J.js.map
171
- //# sourceMappingURL=chunk-2MWA7H6J.js.map
170
+ //# sourceMappingURL=chunk-56BN43J4.js.map
171
+ //# sourceMappingURL=chunk-56BN43J4.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/charts/pie/pie-type.ts"],"names":[],"mappings":"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","file":"chunk-2MWA7H6J.js","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareNoAxes } from '../../utils/prepare'\nimport { group, path, text } from '../../render/tree'\nimport { roundedSlicePath } from '../../utils/slice-path'\n\nexport interface PieOptions {\n /** Inner radius ratio (0 = pie, 0.5+ = donut). Default 0.08 (small center gap). */\n innerRadius?: number\n /** Uniform pixel gap between slices. Default 4. */\n gap?: number\n /** Corner radius in px for rounded slice edges. Default 6. */\n cornerRadius?: number\n /** Show value labels on slices. Default true. */\n showLabels?: boolean\n}\n\n// ---------------------------------------------------------------------------\n// Pie chart type\n// ---------------------------------------------------------------------------\n\nexport const pieChartType: ChartTypePlugin = {\n type: 'pie',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n return prepareNoAxes(data, options)\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, area, theme } = ctx\n const nodes: RenderNode[] = []\n\n const series = data.series[0]\n if (!series || series.values.length === 0) return nodes\n\n const values = series.values\n const total = values.reduce((sum, v) => sum + Math.abs(v), 0)\n if (total === 0) return nodes\n\n const cx = area.x + area.width / 2\n const cy = area.y + area.height / 2\n const outerR = Math.min(area.width, area.height) / 2 - 2\n const opts = ctx.options as unknown as PieOptions\n const innerRatio = opts.innerRadius ?? 0.08\n const innerR = outerR * Math.max(0, Math.min(0.9, innerRatio))\n const gapPx = opts.gap ?? 4\n const halfGap = gapPx / 2\n const cornerRadius = opts.cornerRadius ?? 6\n const showLabels = opts.showLabels ?? true\n\n // Angular gap offsets per radius.\n // At the outer edge, uniform pixel gap is straightforward.\n // At the inner edge, clamp the pad angle so it never eats more than 15%\n // of the smallest slice — otherwise the inner path self-intersects.\n // When innerR is tiny, use the same angle as outer (gap tapers to center).\n const outerPadAngle = halfGap / outerR\n const rawInnerPad = innerR > 0 ? halfGap / innerR : 0\n const innerPadAngle = Math.min(rawInnerPad, outerPadAngle * 3)\n\n let startAngle = -Math.PI / 2\n\n for (let i = 0; i < values.length; i++) {\n const value = Math.abs(values[i]!)\n const sliceAngle = (value / total) * Math.PI * 2\n const endAngle = startAngle + sliceAngle\n\n // Check if slice is too small to render with gap\n if (sliceAngle < outerPadAngle * 2 + 0.01) {\n startAngle = endAngle\n continue\n }\n\n // Per-slice clamp: inner pad must not exceed 15% of the slice angle\n const sliceInnerPad = Math.min(innerPadAngle, sliceAngle * 0.15)\n\n const d = roundedSlicePath(\n cx, cy, outerR, innerR,\n startAngle + outerPadAngle, endAngle - outerPadAngle,\n startAngle + sliceInnerPad, endAngle - sliceInnerPad,\n cornerRadius,\n )\n\n const colorIndex = i % ctx.options.colors.length\n const sliceNodes: RenderNode[] = [\n path(d, {\n class: 'chartts-slice',\n fill: `url(#chartts-pie-${colorIndex})`,\n 'data-series': 0,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${data.labels[i] ?? `Slice ${i + 1}`}: ${values[i]}`,\n }),\n ]\n\n // Label\n if (showLabels && sliceAngle > 0.3) {\n const midAngle = (startAngle + endAngle) / 2\n const labelR = (outerR + innerR) / 2\n const lx = cx + labelR * Math.cos(midAngle)\n const ly = cy + labelR * Math.sin(midAngle)\n const pct = Math.round((value / total) * 100)\n\n sliceNodes.push(text(lx, ly, `${pct}%`, {\n class: 'chartts-slice-label',\n fill: '#fff',\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize: theme.fontSizeSmall,\n fontFamily: theme.fontFamily,\n fontWeight: 600,\n }))\n }\n\n nodes.push(group(sliceNodes, {\n class: `chartts-series chartts-series-${i}`,\n 'data-series-name': String(data.labels[i] ?? `Slice ${i + 1}`),\n }))\n\n startAngle = endAngle\n }\n\n return nodes\n },\n\n getHighlightNodes(ctx: RenderContext, hit: HitResult): RenderNode[] {\n const { data, area } = ctx\n const series = data.series[0]\n if (!series || series.values.length === 0) return []\n\n const values = series.values\n const total = values.reduce((sum, v) => sum + Math.abs(v), 0)\n if (total === 0) return []\n\n const cx = area.x + area.width / 2\n const cy = area.y + area.height / 2\n const outerR = Math.min(area.width, area.height) / 2 - 2\n const opts = ctx.options as unknown as PieOptions\n const innerRatio = opts.innerRadius ?? 0.08\n const innerR = outerR * Math.max(0, Math.min(0.9, innerRatio))\n\n // Find the hit slice angles\n let startAngle = -Math.PI / 2\n for (let i = 0; i < values.length; i++) {\n const sliceAngle = (Math.abs(values[i]!) / total) * Math.PI * 2\n const endAngle = startAngle + sliceAngle\n if (i === hit.pointIndex) {\n // Draw a bright outline around this slice\n const d = roundedSlicePath(cx, cy, outerR + 3, innerR - 2, startAngle, endAngle, startAngle, endAngle, 0)\n return [\n path(d, {\n class: 'chartts-highlight-slice',\n fill: 'none',\n stroke: series.color,\n strokeWidth: 2,\n strokeOpacity: 0.8,\n }),\n ]\n }\n startAngle = endAngle\n }\n return []\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { data, area } = ctx\n const series = data.series[0]\n if (!series || series.values.length === 0) return null\n\n const cx = area.x + area.width / 2\n const cy = area.y + area.height / 2\n const outerR = Math.min(area.width, area.height) / 2 - 2\n const innerRatio = (ctx.options as unknown as PieOptions).innerRadius ?? 0.08\n const innerR = outerR * Math.max(0, Math.min(0.9, innerRatio))\n\n const dx = mx - cx\n const dy = my - cy\n const dist = Math.sqrt(dx * dx + dy * dy)\n\n if (dist > outerR || dist < innerR) return null\n\n let angle = Math.atan2(dy, dx)\n if (angle < -Math.PI / 2) angle += Math.PI * 2\n\n const values = series.values\n const total = values.reduce((sum, v) => sum + Math.abs(v), 0)\n if (total === 0) return null\n\n let startAngle = -Math.PI / 2\n for (let i = 0; i < values.length; i++) {\n const sliceAngle = (Math.abs(values[i]!) / total) * Math.PI * 2\n const endAngle = startAngle + sliceAngle\n\n if (angle >= startAngle && angle < endAngle) {\n const midAngle = (startAngle + endAngle) / 2\n const midR = (innerR + outerR) / 2\n return { seriesIndex: 0, pointIndex: i, distance: 0, x: cx + midR * Math.cos(midAngle), y: cy + midR * Math.sin(midAngle) }\n }\n\n startAngle = endAngle\n }\n\n return null\n },\n}\n\n/** Donut chart = pie with innerRadius */\nexport const donutChartType: ChartTypePlugin = {\n ...pieChartType,\n type: 'donut',\n render(ctx: RenderContext): RenderNode[] {\n const opts = ctx.options as unknown as PieOptions\n if (!opts.innerRadius || opts.innerRadius < 0.3) {\n (opts as PieOptions).innerRadius = 0.55\n }\n return pieChartType.render(ctx)\n },\n}\n"]}
1
+ {"version":3,"sources":["../src/charts/pie/pie-type.ts"],"names":[],"mappings":"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","file":"chunk-56BN43J4.js","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareNoAxes } from '../../utils/prepare'\nimport { group, path, text } from '../../render/tree'\nimport { roundedSlicePath } from '../../utils/slice-path'\n\nexport interface PieOptions {\n /** Inner radius ratio (0 = pie, 0.5+ = donut). Default 0.08 (small center gap). */\n innerRadius?: number\n /** Uniform pixel gap between slices. Default 4. */\n gap?: number\n /** Corner radius in px for rounded slice edges. Default 6. */\n cornerRadius?: number\n /** Show value labels on slices. Default true. */\n showLabels?: boolean\n}\n\n// ---------------------------------------------------------------------------\n// Pie chart type\n// ---------------------------------------------------------------------------\n\nexport const pieChartType: ChartTypePlugin = {\n type: 'pie',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n return prepareNoAxes(data, options)\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, area, theme } = ctx\n const nodes: RenderNode[] = []\n\n const series = data.series[0]\n if (!series || series.values.length === 0) return nodes\n\n const values = series.values\n const total = values.reduce((sum, v) => sum + Math.abs(v), 0)\n if (total === 0) return nodes\n\n const cx = area.x + area.width / 2\n const cy = area.y + area.height / 2\n const outerR = Math.min(area.width, area.height) / 2 - 2\n const opts = ctx.options as unknown as PieOptions\n const innerRatio = opts.innerRadius ?? 0.08\n const innerR = outerR * Math.max(0, Math.min(0.9, innerRatio))\n const gapPx = opts.gap ?? 4\n const halfGap = gapPx / 2\n const cornerRadius = opts.cornerRadius ?? 6\n const showLabels = opts.showLabels ?? true\n\n // Angular gap offsets per radius.\n // At the outer edge, uniform pixel gap is straightforward.\n // At the inner edge, clamp the pad angle so it never eats more than 15%\n // of the smallest slice — otherwise the inner path self-intersects.\n // When innerR is tiny, use the same angle as outer (gap tapers to center).\n const outerPadAngle = halfGap / outerR\n const rawInnerPad = innerR > 0 ? halfGap / innerR : 0\n const innerPadAngle = Math.min(rawInnerPad, outerPadAngle * 3)\n\n let startAngle = -Math.PI / 2\n\n for (let i = 0; i < values.length; i++) {\n const value = Math.abs(values[i]!)\n const sliceAngle = (value / total) * Math.PI * 2\n const endAngle = startAngle + sliceAngle\n\n // Check if slice is too small to render with gap\n if (sliceAngle < outerPadAngle * 2 + 0.01) {\n startAngle = endAngle\n continue\n }\n\n // Per-slice clamp: inner pad must not exceed 15% of the slice angle\n const sliceInnerPad = Math.min(innerPadAngle, sliceAngle * 0.15)\n\n const d = roundedSlicePath(\n cx, cy, outerR, innerR,\n startAngle + outerPadAngle, endAngle - outerPadAngle,\n startAngle + sliceInnerPad, endAngle - sliceInnerPad,\n cornerRadius,\n )\n\n const colorIndex = i % ctx.options.colors.length\n const sliceNodes: RenderNode[] = [\n path(d, {\n class: 'chartts-slice',\n fill: `url(#chartts-pie-${colorIndex})`,\n 'data-series': 0,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${data.labels[i] ?? `Slice ${i + 1}`}: ${values[i]}`,\n }),\n ]\n\n // Label\n if (showLabels && sliceAngle > 0.3) {\n const midAngle = (startAngle + endAngle) / 2\n const labelR = (outerR + innerR) / 2\n const lx = cx + labelR * Math.cos(midAngle)\n const ly = cy + labelR * Math.sin(midAngle)\n const pct = Math.round((value / total) * 100)\n\n sliceNodes.push(text(lx, ly, `${pct}%`, {\n class: 'chartts-slice-label',\n fill: '#fff',\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize: theme.fontSizeSmall,\n fontFamily: theme.fontFamily,\n fontWeight: 600,\n }))\n }\n\n nodes.push(group(sliceNodes, {\n class: `chartts-series chartts-series-${i}`,\n 'data-series-name': String(data.labels[i] ?? `Slice ${i + 1}`),\n }))\n\n startAngle = endAngle\n }\n\n return nodes\n },\n\n getHighlightNodes(ctx: RenderContext, hit: HitResult): RenderNode[] {\n const { data, area } = ctx\n const series = data.series[0]\n if (!series || series.values.length === 0) return []\n\n const values = series.values\n const total = values.reduce((sum, v) => sum + Math.abs(v), 0)\n if (total === 0) return []\n\n const cx = area.x + area.width / 2\n const cy = area.y + area.height / 2\n const outerR = Math.min(area.width, area.height) / 2 - 2\n const opts = ctx.options as unknown as PieOptions\n const innerRatio = opts.innerRadius ?? 0.08\n const innerR = outerR * Math.max(0, Math.min(0.9, innerRatio))\n\n // Find the hit slice angles\n let startAngle = -Math.PI / 2\n for (let i = 0; i < values.length; i++) {\n const sliceAngle = (Math.abs(values[i]!) / total) * Math.PI * 2\n const endAngle = startAngle + sliceAngle\n if (i === hit.pointIndex) {\n // Draw a bright outline around this slice\n const d = roundedSlicePath(cx, cy, outerR + 3, innerR - 2, startAngle, endAngle, startAngle, endAngle, 0)\n return [\n path(d, {\n class: 'chartts-highlight-slice',\n fill: 'none',\n stroke: series.color,\n strokeWidth: 2,\n strokeOpacity: 0.8,\n }),\n ]\n }\n startAngle = endAngle\n }\n return []\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { data, area } = ctx\n const series = data.series[0]\n if (!series || series.values.length === 0) return null\n\n const cx = area.x + area.width / 2\n const cy = area.y + area.height / 2\n const outerR = Math.min(area.width, area.height) / 2 - 2\n const innerRatio = (ctx.options as unknown as PieOptions).innerRadius ?? 0.08\n const innerR = outerR * Math.max(0, Math.min(0.9, innerRatio))\n\n const dx = mx - cx\n const dy = my - cy\n const dist = Math.sqrt(dx * dx + dy * dy)\n\n if (dist > outerR || dist < innerR) return null\n\n let angle = Math.atan2(dy, dx)\n if (angle < -Math.PI / 2) angle += Math.PI * 2\n\n const values = series.values\n const total = values.reduce((sum, v) => sum + Math.abs(v), 0)\n if (total === 0) return null\n\n let startAngle = -Math.PI / 2\n for (let i = 0; i < values.length; i++) {\n const sliceAngle = (Math.abs(values[i]!) / total) * Math.PI * 2\n const endAngle = startAngle + sliceAngle\n\n if (angle >= startAngle && angle < endAngle) {\n const midAngle = (startAngle + endAngle) / 2\n const midR = (innerR + outerR) / 2\n return { seriesIndex: 0, pointIndex: i, distance: 0, x: cx + midR * Math.cos(midAngle), y: cy + midR * Math.sin(midAngle) }\n }\n\n startAngle = endAngle\n }\n\n return null\n },\n}\n\n/** Donut chart = pie with innerRadius */\nexport const donutChartType: ChartTypePlugin = {\n ...pieChartType,\n type: 'donut',\n render(ctx: RenderContext): RenderNode[] {\n const opts = ctx.options as unknown as PieOptions\n if (!opts.innerRadius || opts.innerRadius < 0.3) {\n (opts as PieOptions).innerRadius = 0.55\n }\n return pieChartType.render(ctx)\n },\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { prepareNoAxes } from './chunk-MPQECPE3.js';
2
- import { PathBuilder, path, text, group } from './chunk-DX4FBN3I.js';
1
+ import { prepareNoAxes } from './chunk-T7SCCACB.js';
2
+ import { PathBuilder, path, text, group } from './chunk-AEQXFDL7.js';
3
3
 
4
4
  // src/charts/funnel/funnel-type.ts
5
5
  var funnelChartType = {
@@ -94,5 +94,5 @@ var funnelChartType = {
94
94
  };
95
95
 
96
96
  export { funnelChartType };
97
- //# sourceMappingURL=chunk-RJIPFWW7.js.map
98
- //# sourceMappingURL=chunk-RJIPFWW7.js.map
97
+ //# sourceMappingURL=chunk-5E7FXDBM.js.map
98
+ //# sourceMappingURL=chunk-5E7FXDBM.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/charts/funnel/funnel-type.ts"],"names":[],"mappings":"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","file":"chunk-RJIPFWW7.js","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareNoAxes } from '../../utils/prepare'\nimport { group, path, text } from '../../render/tree'\nimport { PathBuilder } from '../../render/tree'\n\nexport interface FunnelOptions {\n /** Gap between steps in px. Default 2. */\n stepGap?: number\n /** Show percentage labels. Default true. */\n showLabels?: boolean\n /** Show value labels. Default true. */\n showValues?: boolean\n}\n\n/**\n * Funnel chart — tapered horizontal bars representing conversion steps.\n * Uses the first series. Values should be descending (largest to smallest).\n */\nexport const funnelChartType: ChartTypePlugin = {\n type: 'funnel',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n return prepareNoAxes(data, options)\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, area, theme, options } = ctx\n const nodes: RenderNode[] = []\n\n const series = data.series[0]\n if (!series || series.values.length === 0) return nodes\n\n const fOpts = options as unknown as FunnelOptions\n const stepGap = fOpts.stepGap ?? 4\n const showLabels = fOpts.showLabels ?? true\n const showValues = fOpts.showValues ?? true\n\n const values = series.values\n const maxVal = Math.max(...values.map(Math.abs))\n if (maxVal === 0) return nodes\n\n const stepCount = values.length\n const totalGap = stepGap * (stepCount - 1)\n const stepHeight = (area.height - totalGap) / stepCount\n const centerX = area.x + area.width / 2\n\n for (let i = 0; i < stepCount; i++) {\n const val = Math.abs(values[i]!)\n const nextVal = i < stepCount - 1 ? Math.abs(values[i + 1]!) : val * 0.7\n\n const topWidth = (val / maxVal) * area.width\n const bottomWidth = (nextVal / maxVal) * area.width\n const y = area.y + i * (stepHeight + stepGap)\n\n const color = options.colors[i % options.colors.length]!\n\n // Trapezoid path\n const pb = new PathBuilder()\n pb.moveTo(centerX - topWidth / 2, y)\n pb.lineTo(centerX + topWidth / 2, y)\n pb.lineTo(centerX + bottomWidth / 2, y + stepHeight)\n pb.lineTo(centerX - bottomWidth / 2, y + stepHeight)\n pb.close()\n\n const stepNodes: RenderNode[] = []\n\n const colorIndex = i % options.colors.length\n stepNodes.push(path(pb.build(), {\n class: 'chartts-funnel-step',\n fill: `url(#chartts-bar-${colorIndex})`,\n stroke: color,\n strokeWidth: 0.5,\n 'data-series': 0,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${data.labels[i] ?? `Step ${i + 1}`}: ${values[i]}`,\n }))\n\n // Label text\n const textY = y + stepHeight / 2\n if (showLabels) {\n const label = String(data.labels[i] ?? `Step ${i + 1}`)\n const pct = maxVal > 0 ? Math.round((val / maxVal) * 100) : 0\n\n const labelStr = showValues\n ? `${label}: ${values[i]} (${pct}%)`\n : `${label} (${pct}%)`\n\n stepNodes.push(text(centerX, textY, labelStr, {\n class: 'chartts-funnel-label',\n fill: '#fff',\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize: theme.fontSize,\n fontFamily: theme.fontFamily,\n fontWeight: 600,\n }))\n }\n\n nodes.push(group(stepNodes, {\n class: `chartts-series chartts-series-${i}`,\n 'data-series-name': String(data.labels[i] ?? `Step ${i + 1}`),\n }))\n }\n\n return nodes\n },\n\n hitTest(ctx: RenderContext, _mx: number, my: number): HitResult | null {\n const { data, area, options } = ctx\n const series = data.series[0]\n if (!series || series.values.length === 0) return null\n\n const fOpts = options as unknown as FunnelOptions\n const stepGap = fOpts.stepGap ?? 2\n const stepCount = series.values.length\n const totalGap = stepGap * (stepCount - 1)\n const stepHeight = (area.height - totalGap) / stepCount\n\n for (let i = 0; i < stepCount; i++) {\n const y = area.y + i * (stepHeight + stepGap)\n if (my >= y && my <= y + stepHeight) {\n return { seriesIndex: 0, pointIndex: i, distance: 0, x: area.x + area.width / 2, y: y + stepHeight / 2 }\n }\n }\n\n return null\n },\n}\n"]}
1
+ {"version":3,"sources":["../src/charts/funnel/funnel-type.ts"],"names":[],"mappings":"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","file":"chunk-5E7FXDBM.js","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareNoAxes } from '../../utils/prepare'\nimport { group, path, text } from '../../render/tree'\nimport { PathBuilder } from '../../render/tree'\n\nexport interface FunnelOptions {\n /** Gap between steps in px. Default 2. */\n stepGap?: number\n /** Show percentage labels. Default true. */\n showLabels?: boolean\n /** Show value labels. Default true. */\n showValues?: boolean\n}\n\n/**\n * Funnel chart — tapered horizontal bars representing conversion steps.\n * Uses the first series. Values should be descending (largest to smallest).\n */\nexport const funnelChartType: ChartTypePlugin = {\n type: 'funnel',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n return prepareNoAxes(data, options)\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, area, theme, options } = ctx\n const nodes: RenderNode[] = []\n\n const series = data.series[0]\n if (!series || series.values.length === 0) return nodes\n\n const fOpts = options as unknown as FunnelOptions\n const stepGap = fOpts.stepGap ?? 4\n const showLabels = fOpts.showLabels ?? true\n const showValues = fOpts.showValues ?? true\n\n const values = series.values\n const maxVal = Math.max(...values.map(Math.abs))\n if (maxVal === 0) return nodes\n\n const stepCount = values.length\n const totalGap = stepGap * (stepCount - 1)\n const stepHeight = (area.height - totalGap) / stepCount\n const centerX = area.x + area.width / 2\n\n for (let i = 0; i < stepCount; i++) {\n const val = Math.abs(values[i]!)\n const nextVal = i < stepCount - 1 ? Math.abs(values[i + 1]!) : val * 0.7\n\n const topWidth = (val / maxVal) * area.width\n const bottomWidth = (nextVal / maxVal) * area.width\n const y = area.y + i * (stepHeight + stepGap)\n\n const color = options.colors[i % options.colors.length]!\n\n // Trapezoid path\n const pb = new PathBuilder()\n pb.moveTo(centerX - topWidth / 2, y)\n pb.lineTo(centerX + topWidth / 2, y)\n pb.lineTo(centerX + bottomWidth / 2, y + stepHeight)\n pb.lineTo(centerX - bottomWidth / 2, y + stepHeight)\n pb.close()\n\n const stepNodes: RenderNode[] = []\n\n const colorIndex = i % options.colors.length\n stepNodes.push(path(pb.build(), {\n class: 'chartts-funnel-step',\n fill: `url(#chartts-bar-${colorIndex})`,\n stroke: color,\n strokeWidth: 0.5,\n 'data-series': 0,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${data.labels[i] ?? `Step ${i + 1}`}: ${values[i]}`,\n }))\n\n // Label text\n const textY = y + stepHeight / 2\n if (showLabels) {\n const label = String(data.labels[i] ?? `Step ${i + 1}`)\n const pct = maxVal > 0 ? Math.round((val / maxVal) * 100) : 0\n\n const labelStr = showValues\n ? `${label}: ${values[i]} (${pct}%)`\n : `${label} (${pct}%)`\n\n stepNodes.push(text(centerX, textY, labelStr, {\n class: 'chartts-funnel-label',\n fill: '#fff',\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize: theme.fontSize,\n fontFamily: theme.fontFamily,\n fontWeight: 600,\n }))\n }\n\n nodes.push(group(stepNodes, {\n class: `chartts-series chartts-series-${i}`,\n 'data-series-name': String(data.labels[i] ?? `Step ${i + 1}`),\n }))\n }\n\n return nodes\n },\n\n hitTest(ctx: RenderContext, _mx: number, my: number): HitResult | null {\n const { data, area, options } = ctx\n const series = data.series[0]\n if (!series || series.values.length === 0) return null\n\n const fOpts = options as unknown as FunnelOptions\n const stepGap = fOpts.stepGap ?? 2\n const stepCount = series.values.length\n const totalGap = stepGap * (stepCount - 1)\n const stepHeight = (area.height - totalGap) / stepCount\n\n for (let i = 0; i < stepCount; i++) {\n const y = area.y + i * (stepHeight + stepGap)\n if (my >= y && my <= y + stepHeight) {\n return { seriesIndex: 0, pointIndex: i, distance: 0, x: area.x + area.width / 2, y: y + stepHeight / 2 }\n }\n }\n\n return null\n },\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { formatNum } from './chunk-OGSZO22B.js';
2
- import { path, prepareData, PathBuilder } from './chunk-DX4FBN3I.js';
2
+ import { path, prepareData, PathBuilder } from './chunk-AEQXFDL7.js';
3
3
 
4
4
  // src/charts/sparkline/sparkline-type.ts
5
5
  var sparklineChartType = {
@@ -87,5 +87,5 @@ function buildSparklinePath(points) {
87
87
  }
88
88
 
89
89
  export { sparklineChartType };
90
- //# sourceMappingURL=chunk-ILCWDAKD.js.map
91
- //# sourceMappingURL=chunk-ILCWDAKD.js.map
90
+ //# sourceMappingURL=chunk-5HZEDCJG.js.map
91
+ //# sourceMappingURL=chunk-5HZEDCJG.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/charts/sparkline/sparkline-type.ts"],"names":[],"mappings":"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","file":"chunk-ILCWDAKD.js","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareData } from '../../data/prepare'\nimport { path } from '../../render/tree'\nimport { PathBuilder } from '../../render/tree'\nimport { formatNum } from '../../utils/format'\n\n/**\n * Sparkline — tiny inline chart with no axes, no labels, no legend.\n * Just the line/area and optionally a highlight of the last value.\n */\nexport const sparklineChartType: ChartTypePlugin = {\n type: 'sparkline',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n // Override: sparklines don't need axes/legend space\n const prepared = prepareData(data, {\n ...options,\n xAxis: false,\n yAxis: false,\n legend: false,\n xGrid: false,\n yGrid: false,\n padding: [2, 2, 2, 2],\n })\n return prepared\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, area, xScale, yScale } = ctx\n const nodes: RenderNode[] = []\n const series = data.series[0]\n if (!series || series.values.length === 0) return nodes\n\n const values = series.values\n const points = values.map((v, i) => ({\n x: xScale.map(i),\n y: yScale.map(v),\n }))\n\n // Build monotone path\n const linePath = buildSparklinePath(points)\n\n // Area fill\n const baseline = area.y + area.height\n const first = points[0]!\n const last = points[points.length - 1]!\n const areaPath = `${linePath}L${formatNum(last.x)},${formatNum(baseline)}L${formatNum(first.x)},${formatNum(baseline)}Z`\n\n nodes.push(path(areaPath, {\n class: 'chartts-sparkline-area',\n fill: series.color,\n fillOpacity: 0.15,\n }))\n\n nodes.push(path(linePath, {\n class: 'chartts-sparkline-line',\n stroke: series.color,\n strokeWidth: 1.5,\n }))\n\n // Last point indicator\n if (points.length > 0) {\n const lp = points[points.length - 1]!\n nodes.push({\n type: 'circle',\n cx: lp.x,\n cy: lp.y,\n r: 2.5,\n attrs: {\n class: 'chartts-sparkline-dot',\n fill: series.color,\n },\n })\n }\n\n return nodes\n },\n\n hitTest(): HitResult | null {\n // Sparklines typically don't need hit testing\n return null\n },\n}\n\nfunction buildSparklinePath(points: { x: number; y: number }[]): string {\n if (points.length === 0) return ''\n if (points.length === 1) return `M${formatNum(points[0]!.x)},${formatNum(points[0]!.y)}`\n\n // Simple monotone interpolation\n const pb = new PathBuilder()\n pb.moveTo(points[0]!.x, points[0]!.y)\n\n if (points.length === 2) {\n pb.lineTo(points[1]!.x, points[1]!.y)\n return pb.build()\n }\n\n for (let i = 0; i < points.length - 1; i++) {\n const p0 = points[Math.max(0, i - 1)]!\n const p1 = points[i]!\n const p2 = points[i + 1]!\n const p3 = points[Math.min(points.length - 1, i + 2)]!\n\n const cp1x = p1.x + (p2.x - p0.x) / 6\n const cp1y = p1.y + (p2.y - p0.y) / 6\n const cp2x = p2.x - (p3.x - p1.x) / 6\n const cp2y = p2.y - (p3.y - p1.y) / 6\n\n pb.curveTo(cp1x, cp1y, cp2x, cp2y, p2.x, p2.y)\n }\n\n return pb.build()\n}\n"]}
1
+ {"version":3,"sources":["../src/charts/sparkline/sparkline-type.ts"],"names":[],"mappings":";;;;AAaO,IAAM,kBAAA,GAAsC;AAAA,EACjD,IAAA,EAAM,WAAA;AAAA,EAEN,aAAA,GAAgD;AAC9C,IAAA,OAAO,EAAE,CAAA,EAAG,aAAA,EAAe,CAAA,EAAG,QAAA,EAAS;AAAA,EACzC,CAAA;AAAA,EAEA,WAAA,CAAY,MAAiB,OAAA,EAAwC;AAEnE,IAAA,MAAM,QAAA,GAAW,YAAY,IAAA,EAAM;AAAA,MACjC,GAAG,OAAA;AAAA,MACH,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ,KAAA;AAAA,MACR,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,KAAA;AAAA,MACP,OAAA,EAAS,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC;AAAA,KACrB,CAAA;AACD,IAAA,OAAO,QAAA;AAAA,EACT,CAAA;AAAA,EAEA,OAAO,GAAA,EAAkC;AACvC,IAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,QAAO,GAAI,GAAA;AACvC,IAAA,MAAM,QAAsB,EAAC;AAC7B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA;AAC5B,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,KAAA;AAElD,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO;AAAA,MACnC,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA;AAAA,MACf,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,CAAC;AAAA,KACjB,CAAE,CAAA;AAGF,IAAA,MAAM,QAAA,GAAW,mBAAmB,MAAM,CAAA;AAG1C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA;AAC/B,IAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,IAAA,MAAM,QAAA,GAAW,GAAG,QAAQ,CAAA,CAAA,EAAI,UAAU,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA,EAAI,SAAA,CAAU,QAAQ,CAAC,CAAA,CAAA,EAAI,UAAU,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,SAAA,CAAU,QAAQ,CAAC,CAAA,CAAA,CAAA;AAErH,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,QAAA,EAAU;AAAA,MACxB,KAAA,EAAO,wBAAA;AAAA,MACP,MAAM,MAAA,CAAO,KAAA;AAAA,MACb,WAAA,EAAa;AAAA,KACd,CAAC,CAAA;AAEF,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,QAAA,EAAU;AAAA,MACxB,KAAA,EAAO,wBAAA;AAAA,MACP,QAAQ,MAAA,CAAO,KAAA;AAAA,MACf,WAAA,EAAa;AAAA,KACd,CAAC,CAAA;AAGF,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACnC,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,IAAA,EAAM,QAAA;AAAA,QACN,IAAI,EAAA,CAAG,CAAA;AAAA,QACP,IAAI,EAAA,CAAG,CAAA;AAAA,QACP,CAAA,EAAG,GAAA;AAAA,QACH,KAAA,EAAO;AAAA,UACL,KAAA,EAAO,uBAAA;AAAA,UACP,MAAM,MAAA,CAAO;AAAA;AACf,OACD,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAAA,EAEA,OAAA,GAA4B;AAE1B,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,mBAAmB,MAAA,EAA4C;AACtE,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAChC,EAAA,IAAI,OAAO,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,UAAU,MAAA,CAAO,CAAC,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,EAAI,SAAA,CAAU,OAAO,CAAC,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA;AAGtF,EAAA,MAAM,EAAA,GAAK,IAAI,WAAA,EAAY;AAC3B,EAAA,EAAA,CAAG,MAAA,CAAO,OAAO,CAAC,CAAA,CAAG,GAAG,MAAA,CAAO,CAAC,EAAG,CAAC,CAAA;AAEpC,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,EAAA,CAAG,MAAA,CAAO,OAAO,CAAC,CAAA,CAAG,GAAG,MAAA,CAAO,CAAC,EAAG,CAAC,CAAA;AACpC,IAAA,OAAO,GAAG,KAAA,EAAM;AAAA,EAClB;AAEA,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC1C,IAAA,MAAM,KAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AACpC,IAAA,MAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AACnB,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACvB,IAAA,MAAM,EAAA,GAAK,OAAO,IAAA,CAAK,GAAA,CAAI,OAAO,MAAA,GAAS,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAEpD,IAAA,MAAM,OAAO,EAAA,CAAG,CAAA,GAAA,CAAK,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA;AACpC,IAAA,MAAM,OAAO,EAAA,CAAG,CAAA,GAAA,CAAK,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA;AACpC,IAAA,MAAM,OAAO,EAAA,CAAG,CAAA,GAAA,CAAK,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA;AACpC,IAAA,MAAM,OAAO,EAAA,CAAG,CAAA,GAAA,CAAK,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA;AAEpC,IAAA,EAAA,CAAG,OAAA,CAAQ,MAAM,IAAA,EAAM,IAAA,EAAM,MAAM,EAAA,CAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,EAC/C;AAEA,EAAA,OAAO,GAAG,KAAA,EAAM;AAClB","file":"chunk-5HZEDCJG.js","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareData } from '../../data/prepare'\nimport { path } from '../../render/tree'\nimport { PathBuilder } from '../../render/tree'\nimport { formatNum } from '../../utils/format'\n\n/**\n * Sparkline — tiny inline chart with no axes, no labels, no legend.\n * Just the line/area and optionally a highlight of the last value.\n */\nexport const sparklineChartType: ChartTypePlugin = {\n type: 'sparkline',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n // Override: sparklines don't need axes/legend space\n const prepared = prepareData(data, {\n ...options,\n xAxis: false,\n yAxis: false,\n legend: false,\n xGrid: false,\n yGrid: false,\n padding: [2, 2, 2, 2],\n })\n return prepared\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, area, xScale, yScale } = ctx\n const nodes: RenderNode[] = []\n const series = data.series[0]\n if (!series || series.values.length === 0) return nodes\n\n const values = series.values\n const points = values.map((v, i) => ({\n x: xScale.map(i),\n y: yScale.map(v),\n }))\n\n // Build monotone path\n const linePath = buildSparklinePath(points)\n\n // Area fill\n const baseline = area.y + area.height\n const first = points[0]!\n const last = points[points.length - 1]!\n const areaPath = `${linePath}L${formatNum(last.x)},${formatNum(baseline)}L${formatNum(first.x)},${formatNum(baseline)}Z`\n\n nodes.push(path(areaPath, {\n class: 'chartts-sparkline-area',\n fill: series.color,\n fillOpacity: 0.15,\n }))\n\n nodes.push(path(linePath, {\n class: 'chartts-sparkline-line',\n stroke: series.color,\n strokeWidth: 1.5,\n }))\n\n // Last point indicator\n if (points.length > 0) {\n const lp = points[points.length - 1]!\n nodes.push({\n type: 'circle',\n cx: lp.x,\n cy: lp.y,\n r: 2.5,\n attrs: {\n class: 'chartts-sparkline-dot',\n fill: series.color,\n },\n })\n }\n\n return nodes\n },\n\n hitTest(): HitResult | null {\n // Sparklines typically don't need hit testing\n return null\n },\n}\n\nfunction buildSparklinePath(points: { x: number; y: number }[]): string {\n if (points.length === 0) return ''\n if (points.length === 1) return `M${formatNum(points[0]!.x)},${formatNum(points[0]!.y)}`\n\n // Simple monotone interpolation\n const pb = new PathBuilder()\n pb.moveTo(points[0]!.x, points[0]!.y)\n\n if (points.length === 2) {\n pb.lineTo(points[1]!.x, points[1]!.y)\n return pb.build()\n }\n\n for (let i = 0; i < points.length - 1; i++) {\n const p0 = points[Math.max(0, i - 1)]!\n const p1 = points[i]!\n const p2 = points[i + 1]!\n const p3 = points[Math.min(points.length - 1, i + 2)]!\n\n const cp1x = p1.x + (p2.x - p0.x) / 6\n const cp1y = p1.y + (p2.y - p0.y) / 6\n const cp2x = p2.x - (p3.x - p1.x) / 6\n const cp2y = p2.y - (p3.y - p1.y) / 6\n\n pb.curveTo(cp1x, cp1y, cp2x, cp2y, p2.x, p2.y)\n }\n\n return pb.build()\n}\n"]}