@chartts/core 0.1.3 → 0.1.5
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.
- package/dist/area.cjs +10 -10
- package/dist/area.js +5 -5
- package/dist/bar.cjs +9 -9
- package/dist/bar.js +4 -4
- package/dist/baseline.cjs +9 -9
- package/dist/baseline.js +4 -4
- package/dist/boxplot.cjs +9 -9
- package/dist/boxplot.js +4 -4
- package/dist/bubble.cjs +9 -9
- package/dist/bubble.js +4 -4
- package/dist/bullet.cjs +10 -10
- package/dist/bullet.js +5 -5
- package/dist/calendar.cjs +10 -10
- package/dist/calendar.js +5 -5
- package/dist/candlestick.cjs +9 -9
- package/dist/candlestick.js +4 -4
- package/dist/chord.cjs +10 -10
- package/dist/chord.js +5 -5
- package/dist/chunk-2OWMJBRN.js +122 -0
- package/dist/chunk-2OWMJBRN.js.map +1 -0
- package/dist/{chunk-DR5MQC3W.js → chunk-2VHG2N75.js} +4 -4
- package/dist/{chunk-DR5MQC3W.js.map → chunk-2VHG2N75.js.map} +1 -1
- package/dist/{chunk-RN7NNB6I.js → chunk-2X7UIG3G.js} +3 -3
- package/dist/{chunk-RN7NNB6I.js.map → chunk-2X7UIG3G.js.map} +1 -1
- package/dist/{chunk-ZTUKOCJN.cjs → chunk-35XUPEAD.cjs} +4 -4
- package/dist/{chunk-ZTUKOCJN.cjs.map → chunk-35XUPEAD.cjs.map} +1 -1
- package/dist/{chunk-2EZ2TVYT.cjs → chunk-3HBRAGJA.cjs} +13 -13
- package/dist/{chunk-2EZ2TVYT.cjs.map → chunk-3HBRAGJA.cjs.map} +1 -1
- package/dist/{chunk-WJP6CRML.js → chunk-45Y77XDM.js} +3 -3
- package/dist/{chunk-WJP6CRML.js.map → chunk-45Y77XDM.js.map} +1 -1
- package/dist/{chunk-DRIJNFWP.cjs → chunk-47R2QUID.cjs} +10 -10
- package/dist/{chunk-DRIJNFWP.cjs.map → chunk-47R2QUID.cjs.map} +1 -1
- package/dist/{chunk-FDNJNVKA.cjs → chunk-4C5IV57Z.cjs} +9 -9
- package/dist/{chunk-FDNJNVKA.cjs.map → chunk-4C5IV57Z.cjs.map} +1 -1
- package/dist/{chunk-5YNIOIKK.js → chunk-4EV5UN6V.js} +3 -3
- package/dist/{chunk-5YNIOIKK.js.map → chunk-4EV5UN6V.js.map} +1 -1
- package/dist/{chunk-KTCP23W6.js → chunk-5JDHVXPE.js} +3 -3
- package/dist/{chunk-KTCP23W6.js.map → chunk-5JDHVXPE.js.map} +1 -1
- package/dist/{chunk-QERWC7U6.js → chunk-5VI5F5XA.js} +3 -3
- package/dist/{chunk-QERWC7U6.js.map → chunk-5VI5F5XA.js.map} +1 -1
- package/dist/{chunk-AG7VY6MJ.cjs → chunk-64B7FGFP.cjs} +8 -8
- package/dist/{chunk-AG7VY6MJ.cjs.map → chunk-64B7FGFP.cjs.map} +1 -1
- package/dist/{chunk-ILCWDAKD.js → chunk-66GE7TI3.js} +3 -3
- package/dist/{chunk-ILCWDAKD.js.map → chunk-66GE7TI3.js.map} +1 -1
- package/dist/{chunk-CCMLOCTH.js → chunk-6H34P4AG.js} +3 -3
- package/dist/{chunk-CCMLOCTH.js.map → chunk-6H34P4AG.js.map} +1 -1
- package/dist/{chunk-E43H3A3G.cjs → chunk-6KNS32OH.cjs} +7 -7
- package/dist/{chunk-E43H3A3G.cjs.map → chunk-6KNS32OH.cjs.map} +1 -1
- package/dist/{chunk-YX6RW6ZW.cjs → chunk-6S2NCXNP.cjs} +6 -6
- package/dist/{chunk-YX6RW6ZW.cjs.map → chunk-6S2NCXNP.cjs.map} +1 -1
- package/dist/{chunk-QKJUAMRK.cjs → chunk-6XD3VSAM.cjs} +6 -6
- package/dist/{chunk-QKJUAMRK.cjs.map → chunk-6XD3VSAM.cjs.map} +1 -1
- package/dist/{chunk-WYIIWTIR.cjs → chunk-6XWZSV6M.cjs} +4 -4
- package/dist/{chunk-WYIIWTIR.cjs.map → chunk-6XWZSV6M.cjs.map} +1 -1
- package/dist/{chunk-UZH6PVHD.js → chunk-7FUQMZGT.js} +4 -4
- package/dist/{chunk-UZH6PVHD.js.map → chunk-7FUQMZGT.js.map} +1 -1
- package/dist/chunk-7LZVSOZR.cjs +172 -0
- package/dist/chunk-7LZVSOZR.cjs.map +1 -0
- package/dist/{chunk-VBEZS3Q4.cjs → chunk-7XOK2HLV.cjs} +9 -9
- package/dist/{chunk-VBEZS3Q4.cjs.map → chunk-7XOK2HLV.cjs.map} +1 -1
- package/dist/{chunk-46ZZTP5B.js → chunk-ACN4JCSF.js} +4 -4
- package/dist/{chunk-46ZZTP5B.js.map → chunk-ACN4JCSF.js.map} +1 -1
- package/dist/{chunk-EHNX3MG3.cjs → chunk-AOZ47DTE.cjs} +13 -13
- package/dist/{chunk-EHNX3MG3.cjs.map → chunk-AOZ47DTE.cjs.map} +1 -1
- package/dist/{chunk-4XVJYNOT.js → chunk-AYEXPYFE.js} +4 -4
- package/dist/{chunk-4XVJYNOT.js.map → chunk-AYEXPYFE.js.map} +1 -1
- package/dist/{chunk-FZIBM3G5.cjs → chunk-BPXEQPZU.cjs} +10 -10
- package/dist/{chunk-FZIBM3G5.cjs.map → chunk-BPXEQPZU.cjs.map} +1 -1
- package/dist/{chunk-XWN43PZF.cjs → chunk-BQUMYOBP.cjs} +7 -7
- package/dist/{chunk-XWN43PZF.cjs.map → chunk-BQUMYOBP.cjs.map} +1 -1
- package/dist/{chunk-OFEROCC5.cjs → chunk-CG4KMZRU.cjs} +6 -6
- package/dist/{chunk-OFEROCC5.cjs.map → chunk-CG4KMZRU.cjs.map} +1 -1
- package/dist/{chunk-2ITF366P.js → chunk-CLBVCWJG.js} +3 -3
- package/dist/{chunk-2ITF366P.js.map → chunk-CLBVCWJG.js.map} +1 -1
- package/dist/{chunk-OUN3MWRQ.cjs → chunk-CVKWXLXW.cjs} +10 -10
- package/dist/{chunk-OUN3MWRQ.cjs.map → chunk-CVKWXLXW.cjs.map} +1 -1
- package/dist/{chunk-RJIPFWW7.js → chunk-D4RP2H6A.js} +4 -4
- package/dist/{chunk-RJIPFWW7.js.map → chunk-D4RP2H6A.js.map} +1 -1
- package/dist/{chunk-K5TPJVOK.js → chunk-DMBUUJGU.js} +3 -3
- package/dist/{chunk-K5TPJVOK.js.map → chunk-DMBUUJGU.js.map} +1 -1
- package/dist/{chunk-6JNW43SE.js → chunk-DQAFYVCX.js} +5 -5
- package/dist/{chunk-6JNW43SE.js.map → chunk-DQAFYVCX.js.map} +1 -1
- package/dist/{chunk-RHTVKBRC.cjs → chunk-EXA5HCX7.cjs} +9 -9
- package/dist/{chunk-RHTVKBRC.cjs.map → chunk-EXA5HCX7.cjs.map} +1 -1
- package/dist/{chunk-RWQH5EO5.cjs → chunk-F3TVVAYG.cjs} +11 -11
- package/dist/{chunk-RWQH5EO5.cjs.map → chunk-F3TVVAYG.cjs.map} +1 -1
- package/dist/{chunk-HFWO37RY.cjs → chunk-FCDKWHIV.cjs} +8 -8
- package/dist/{chunk-HFWO37RY.cjs.map → chunk-FCDKWHIV.cjs.map} +1 -1
- package/dist/{chunk-FSDI3NJV.js → chunk-FWKYNE3A.js} +3 -3
- package/dist/{chunk-FSDI3NJV.js.map → chunk-FWKYNE3A.js.map} +1 -1
- package/dist/{chunk-HMB2RIEE.js → chunk-GAXX6YK5.js} +4 -4
- package/dist/{chunk-HMB2RIEE.js.map → chunk-GAXX6YK5.js.map} +1 -1
- package/dist/{chunk-ZFSFOD5W.cjs → chunk-H2DHSBPO.cjs} +6 -6
- package/dist/{chunk-ZFSFOD5W.cjs.map → chunk-H2DHSBPO.cjs.map} +1 -1
- package/dist/{chunk-4L62MAZA.js → chunk-I7HB3FBC.js} +5 -5
- package/dist/{chunk-4L62MAZA.js.map → chunk-I7HB3FBC.js.map} +1 -1
- package/dist/{chunk-YJHB2GHQ.js → chunk-IGIAGPC5.js} +3 -3
- package/dist/{chunk-YJHB2GHQ.js.map → chunk-IGIAGPC5.js.map} +1 -1
- package/dist/{chunk-RQJRVKAH.js → chunk-ILD5ZZHH.js} +3 -3
- package/dist/{chunk-RQJRVKAH.js.map → chunk-ILD5ZZHH.js.map} +1 -1
- package/dist/{chunk-FV7R2LLD.js → chunk-IN7SCXMD.js} +4 -4
- package/dist/{chunk-FV7R2LLD.js.map → chunk-IN7SCXMD.js.map} +1 -1
- package/dist/chunk-IRBGJP2E.js +170 -0
- package/dist/chunk-IRBGJP2E.js.map +1 -0
- package/dist/{chunk-3SOKHPAO.js → chunk-J6A72I5K.js} +4 -4
- package/dist/{chunk-3SOKHPAO.js.map → chunk-J6A72I5K.js.map} +1 -1
- package/dist/chunk-JRTD6Y34.cjs +148 -0
- package/dist/chunk-JRTD6Y34.cjs.map +1 -0
- package/dist/{chunk-ASNAQ35U.js → chunk-K7NVM76W.js} +4 -4
- package/dist/{chunk-ASNAQ35U.js.map → chunk-K7NVM76W.js.map} +1 -1
- package/dist/chunk-KNUMF6K2.cjs +156 -0
- package/dist/chunk-KNUMF6K2.cjs.map +1 -0
- package/dist/chunk-KQJZJADP.js +146 -0
- package/dist/chunk-KQJZJADP.js.map +1 -0
- package/dist/{chunk-YOLF5DYU.js → chunk-KRLKDJPM.js} +4 -4
- package/dist/{chunk-YOLF5DYU.js.map → chunk-KRLKDJPM.js.map} +1 -1
- package/dist/{chunk-6EGHZDZI.cjs → chunk-KSCMLSUI.cjs} +15 -15
- package/dist/{chunk-6EGHZDZI.cjs.map → chunk-KSCMLSUI.cjs.map} +1 -1
- package/dist/{chunk-4H2LGLGI.cjs → chunk-KT4LY42Y.cjs} +11 -11
- package/dist/{chunk-4H2LGLGI.cjs.map → chunk-KT4LY42Y.cjs.map} +1 -1
- package/dist/chunk-KX4ZBUHB.cjs +211 -0
- package/dist/chunk-KX4ZBUHB.cjs.map +1 -0
- package/dist/{chunk-2MWA7H6J.js → chunk-KXJOIVL5.js} +5 -5
- package/dist/{chunk-2MWA7H6J.js.map → chunk-KXJOIVL5.js.map} +1 -1
- package/dist/{chunk-4ORSJM2I.js → chunk-LFV46XLH.js} +4 -4
- package/dist/{chunk-4ORSJM2I.js.map → chunk-LFV46XLH.js.map} +1 -1
- package/dist/{chunk-MPQECPE3.js → chunk-LKSKGQX7.js} +3 -3
- package/dist/{chunk-MPQECPE3.js.map → chunk-LKSKGQX7.js.map} +1 -1
- package/dist/{chunk-OAL5RS2X.cjs → chunk-LQ26WSLH.cjs} +10 -10
- package/dist/{chunk-OAL5RS2X.cjs.map → chunk-LQ26WSLH.cjs.map} +1 -1
- package/dist/{chunk-LK2A3HBT.js → chunk-LROB73B4.js} +4 -4
- package/dist/{chunk-LK2A3HBT.js.map → chunk-LROB73B4.js.map} +1 -1
- package/dist/{chunk-XWCY67K5.js → chunk-LXBBM6IF.js} +4 -4
- package/dist/{chunk-XWCY67K5.js.map → chunk-LXBBM6IF.js.map} +1 -1
- package/dist/{chunk-RFEKSP62.js → chunk-MCORUYWB.js} +3 -3
- package/dist/{chunk-RFEKSP62.js.map → chunk-MCORUYWB.js.map} +1 -1
- package/dist/{chunk-F5AOBHQY.js → chunk-MJFCMUIY.js} +4 -4
- package/dist/{chunk-F5AOBHQY.js.map → chunk-MJFCMUIY.js.map} +1 -1
- package/dist/{chunk-PQCHNZHM.cjs → chunk-NHSPO4BN.cjs} +9 -9
- package/dist/{chunk-PQCHNZHM.cjs.map → chunk-NHSPO4BN.cjs.map} +1 -1
- package/dist/{chunk-DKXW2FQC.cjs → chunk-NR5NQ6TV.cjs} +10 -10
- package/dist/{chunk-DKXW2FQC.cjs.map → chunk-NR5NQ6TV.cjs.map} +1 -1
- package/dist/{chunk-GAWIUMAK.cjs → chunk-NRMQMPUE.cjs} +7 -7
- package/dist/{chunk-GAWIUMAK.cjs.map → chunk-NRMQMPUE.cjs.map} +1 -1
- package/dist/{chunk-LIY7MYRG.js → chunk-NW4JBVY2.js} +4 -4
- package/dist/{chunk-LIY7MYRG.js.map → chunk-NW4JBVY2.js.map} +1 -1
- package/dist/{chunk-WVQVGQJO.cjs → chunk-OLY33H6E.cjs} +7 -7
- package/dist/{chunk-WVQVGQJO.cjs.map → chunk-OLY33H6E.cjs.map} +1 -1
- package/dist/{chunk-7ZPHLIFP.cjs → chunk-OUQ63IJQ.cjs} +6 -6
- package/dist/{chunk-7ZPHLIFP.cjs.map → chunk-OUQ63IJQ.cjs.map} +1 -1
- package/dist/{chunk-TVDQNLGJ.js → chunk-PHFBF5ON.js} +3 -3
- package/dist/{chunk-TVDQNLGJ.js.map → chunk-PHFBF5ON.js.map} +1 -1
- package/dist/{chunk-NG7DRWWT.cjs → chunk-PL3M46GS.cjs} +6 -6
- package/dist/{chunk-NG7DRWWT.cjs.map → chunk-PL3M46GS.cjs.map} +1 -1
- package/dist/{chunk-MY4KMVJ5.cjs → chunk-PNHDHEBQ.cjs} +8 -8
- package/dist/{chunk-MY4KMVJ5.cjs.map → chunk-PNHDHEBQ.cjs.map} +1 -1
- package/dist/{chunk-XN6YS55F.cjs → chunk-PX7MLSIH.cjs} +377 -124
- package/dist/chunk-PX7MLSIH.cjs.map +1 -0
- package/dist/{chunk-4WQUX2B4.cjs → chunk-QCEC2KBW.cjs} +12 -12
- package/dist/{chunk-4WQUX2B4.cjs.map → chunk-QCEC2KBW.cjs.map} +1 -1
- package/dist/{chunk-IRUIWMH6.js → chunk-QRVTY6UU.js} +3 -3
- package/dist/{chunk-IRUIWMH6.js.map → chunk-QRVTY6UU.js.map} +1 -1
- package/dist/chunk-QS6GR2CQ.js +154 -0
- package/dist/chunk-QS6GR2CQ.js.map +1 -0
- package/dist/{chunk-G6R6MSRF.cjs → chunk-QVQKYVD2.cjs} +8 -8
- package/dist/{chunk-G6R6MSRF.cjs.map → chunk-QVQKYVD2.cjs.map} +1 -1
- package/dist/{chunk-JNQ4NL3R.cjs → chunk-RIJPMRKC.cjs} +8 -8
- package/dist/{chunk-JNQ4NL3R.cjs.map → chunk-RIJPMRKC.cjs.map} +1 -1
- package/dist/{chunk-XE5ZYFGM.js → chunk-RKX7GKOU.js} +4 -4
- package/dist/{chunk-XE5ZYFGM.js.map → chunk-RKX7GKOU.js.map} +1 -1
- package/dist/{chunk-ECB3UPTC.cjs → chunk-ROUFAI5M.cjs} +11 -11
- package/dist/{chunk-ECB3UPTC.cjs.map → chunk-ROUFAI5M.cjs.map} +1 -1
- package/dist/{chunk-NGKUI7XE.cjs → chunk-S52RCLDQ.cjs} +12 -12
- package/dist/{chunk-NGKUI7XE.cjs.map → chunk-S52RCLDQ.cjs.map} +1 -1
- package/dist/{chunk-SXVMEC6N.cjs → chunk-SEOHPUXV.cjs} +12 -12
- package/dist/{chunk-SXVMEC6N.cjs.map → chunk-SEOHPUXV.cjs.map} +1 -1
- package/dist/{chunk-ZY7ETQD6.js → chunk-SI4VJK4A.js} +3 -3
- package/dist/{chunk-ZY7ETQD6.js.map → chunk-SI4VJK4A.js.map} +1 -1
- package/dist/{chunk-UFMPALRH.js → chunk-SUB5WML4.js} +3 -3
- package/dist/{chunk-UFMPALRH.js.map → chunk-SUB5WML4.js.map} +1 -1
- package/dist/{chunk-R6ZDSXN7.cjs → chunk-T5NDUMLD.cjs} +8 -8
- package/dist/{chunk-R6ZDSXN7.cjs.map → chunk-T5NDUMLD.cjs.map} +1 -1
- package/dist/{chunk-YDQDZWZ7.cjs → chunk-TKHYY3B5.cjs} +6 -6
- package/dist/{chunk-YDQDZWZ7.cjs.map → chunk-TKHYY3B5.cjs.map} +1 -1
- package/dist/{chunk-66BHM3UN.cjs → chunk-TMQ2V5B2.cjs} +10 -10
- package/dist/{chunk-66BHM3UN.cjs.map → chunk-TMQ2V5B2.cjs.map} +1 -1
- package/dist/{chunk-3V64BDKG.cjs → chunk-TNIMRV3N.cjs} +13 -13
- package/dist/{chunk-3V64BDKG.cjs.map → chunk-TNIMRV3N.cjs.map} +1 -1
- package/dist/{chunk-7PNCJ4OQ.js → chunk-TUPPYHUR.js} +3 -3
- package/dist/{chunk-7PNCJ4OQ.js.map → chunk-TUPPYHUR.js.map} +1 -1
- package/dist/{chunk-6UWYKNFN.cjs → chunk-U456ET3M.cjs} +12 -12
- package/dist/{chunk-6UWYKNFN.cjs.map → chunk-U456ET3M.cjs.map} +1 -1
- package/dist/{chunk-6E6ZDWZD.cjs → chunk-UMS2MPYC.cjs} +10 -10
- package/dist/{chunk-6E6ZDWZD.cjs.map → chunk-UMS2MPYC.cjs.map} +1 -1
- package/dist/{chunk-YZQROIJY.js → chunk-UNQBXGX5.js} +3 -3
- package/dist/{chunk-YZQROIJY.js.map → chunk-UNQBXGX5.js.map} +1 -1
- package/dist/{chunk-BT5H3WMI.js → chunk-V3AENTZB.js} +4 -4
- package/dist/{chunk-BT5H3WMI.js.map → chunk-V3AENTZB.js.map} +1 -1
- package/dist/{chunk-5J26EN5I.js → chunk-V5LLTYOY.js} +4 -4
- package/dist/{chunk-5J26EN5I.js.map → chunk-V5LLTYOY.js.map} +1 -1
- package/dist/chunk-VALFF4NG.cjs +124 -0
- package/dist/chunk-VALFF4NG.cjs.map +1 -0
- package/dist/{chunk-V45C74EB.js → chunk-VJT5UA7J.js} +4 -4
- package/dist/{chunk-V45C74EB.js.map → chunk-VJT5UA7J.js.map} +1 -1
- package/dist/{chunk-UMIJYYF3.cjs → chunk-W626EAS5.cjs} +112 -13
- package/dist/chunk-W626EAS5.cjs.map +1 -0
- package/dist/{chunk-PVPTFMJJ.js → chunk-WHGNA44O.js} +4 -4
- package/dist/{chunk-PVPTFMJJ.js.map → chunk-WHGNA44O.js.map} +1 -1
- package/dist/{chunk-TWSWD4PU.js → chunk-WIA4MDRX.js} +3 -3
- package/dist/{chunk-TWSWD4PU.js.map → chunk-WIA4MDRX.js.map} +1 -1
- package/dist/{chunk-47EP245Y.cjs → chunk-WOYVHVXC.cjs} +7 -7
- package/dist/{chunk-47EP245Y.cjs.map → chunk-WOYVHVXC.cjs.map} +1 -1
- package/dist/{chunk-CDS2NXGT.cjs → chunk-X5SG6MFS.cjs} +4 -4
- package/dist/{chunk-CDS2NXGT.cjs.map → chunk-X5SG6MFS.cjs.map} +1 -1
- package/dist/{chunk-MYXLKVJE.js → chunk-XB5K7OYD.js} +361 -108
- package/dist/chunk-XB5K7OYD.js.map +1 -0
- package/dist/{chunk-DX4FBN3I.js → chunk-XIVC32HU.js} +112 -13
- package/dist/chunk-XIVC32HU.js.map +1 -0
- package/dist/{chunk-GPSNBZPX.js → chunk-XQ7BTVV3.js} +4 -4
- package/dist/{chunk-GPSNBZPX.js.map → chunk-XQ7BTVV3.js.map} +1 -1
- package/dist/{chunk-BYB3LQAT.cjs → chunk-YMOQGTGJ.cjs} +9 -9
- package/dist/{chunk-BYB3LQAT.cjs.map → chunk-YMOQGTGJ.cjs.map} +1 -1
- package/dist/{chunk-EHKHXQ46.cjs → chunk-YOK3JGW5.cjs} +10 -10
- package/dist/{chunk-EHKHXQ46.cjs.map → chunk-YOK3JGW5.cjs.map} +1 -1
- package/dist/{chunk-XKERO5K2.js → chunk-YUIHMAHA.js} +3 -3
- package/dist/{chunk-XKERO5K2.js.map → chunk-YUIHMAHA.js.map} +1 -1
- package/dist/chunk-ZBWBLCY2.js +209 -0
- package/dist/chunk-ZBWBLCY2.js.map +1 -0
- package/dist/{chunk-OAIMES5S.cjs → chunk-ZCLW4B5S.cjs} +17 -17
- package/dist/{chunk-OAIMES5S.cjs.map → chunk-ZCLW4B5S.cjs.map} +1 -1
- package/dist/combo.cjs +9 -9
- package/dist/combo.js +4 -4
- package/dist/custom.cjs +10 -10
- package/dist/custom.js +5 -5
- package/dist/donut.cjs +11 -11
- package/dist/donut.js +6 -6
- package/dist/dumbbell.cjs +10 -10
- package/dist/dumbbell.js +5 -5
- package/dist/funnel.cjs +10 -10
- package/dist/funnel.js +5 -5
- package/dist/gauge.cjs +10 -10
- package/dist/gauge.js +5 -5
- package/dist/geo.cjs +12 -12
- package/dist/geo.js +5 -5
- package/dist/graph-type-Cyb5U1y2.d.ts +5 -0
- package/dist/graph-type-DRbMI2E9.d.cts +5 -0
- package/dist/graph.cjs +10 -10
- package/dist/graph.d.cts +1 -1
- package/dist/graph.d.ts +1 -1
- package/dist/graph.js +5 -5
- package/dist/heatmap.cjs +10 -10
- package/dist/heatmap.js +5 -5
- package/dist/histogram.cjs +9 -9
- package/dist/histogram.js +4 -4
- package/dist/horizontal-bar.cjs +9 -9
- package/dist/horizontal-bar.js +4 -4
- package/dist/index.cjs +242 -192
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -2
- package/dist/index.d.ts +16 -2
- package/dist/index.js +123 -93
- package/dist/index.js.map +1 -1
- package/dist/kagi.cjs +10 -10
- package/dist/kagi.js +5 -5
- package/dist/line.cjs +9 -9
- package/dist/line.js +4 -4
- package/dist/lines.cjs +10 -10
- package/dist/lines.js +5 -5
- package/dist/lollipop.cjs +9 -9
- package/dist/lollipop.js +4 -4
- package/dist/matrix.cjs +10 -10
- package/dist/matrix.js +5 -5
- package/dist/ohlc.cjs +9 -9
- package/dist/ohlc.js +4 -4
- package/dist/pack-type-CdtdkPBR.d.cts +10 -0
- package/dist/pack-type-Dm27RLC-.d.ts +10 -0
- package/dist/pack.cjs +33 -0
- package/dist/pack.cjs.map +1 -0
- package/dist/pack.d.cts +8 -0
- package/dist/pack.d.ts +8 -0
- package/dist/pack.js +12 -0
- package/dist/pack.js.map +1 -0
- package/dist/parallel.cjs +10 -10
- package/dist/parallel.js +5 -5
- package/dist/pictorialbar.cjs +10 -10
- package/dist/pictorialbar.js +5 -5
- package/dist/pie.cjs +11 -11
- package/dist/pie.js +6 -6
- package/dist/pillar-type-CIcSuZdu.d.cts +11 -0
- package/dist/pillar-type-DNpR_98h.d.ts +11 -0
- package/dist/pillar.cjs +33 -0
- package/dist/pillar.cjs.map +1 -0
- package/dist/pillar.d.cts +8 -0
- package/dist/pillar.d.ts +8 -0
- package/dist/pillar.js +12 -0
- package/dist/pillar.js.map +1 -0
- package/dist/polar.cjs +11 -11
- package/dist/polar.js +6 -6
- package/dist/radar.cjs +10 -10
- package/dist/radar.js +5 -5
- package/dist/radialbar.cjs +10 -10
- package/dist/radialbar.js +5 -5
- package/dist/range.cjs +9 -9
- package/dist/range.js +4 -4
- package/dist/renko.cjs +10 -10
- package/dist/renko.js +5 -5
- package/dist/sankey.cjs +10 -10
- package/dist/sankey.js +5 -5
- package/dist/scatter.cjs +9 -9
- package/dist/scatter.js +4 -4
- package/dist/sparkline.cjs +9 -9
- package/dist/sparkline.js +4 -4
- package/dist/stacked-bar.cjs +9 -9
- package/dist/stacked-bar.js +4 -4
- package/dist/step.cjs +10 -10
- package/dist/step.js +5 -5
- package/dist/sunburst.cjs +11 -11
- package/dist/sunburst.js +6 -6
- package/dist/themeriver.cjs +10 -10
- package/dist/themeriver.js +5 -5
- package/dist/tree.cjs +10 -10
- package/dist/tree.js +5 -5
- package/dist/treemap.cjs +10 -10
- package/dist/treemap.js +5 -5
- package/dist/violin-type-6KmTiJNp.d.cts +5 -0
- package/dist/violin-type-BOmiulQc.d.ts +5 -0
- package/dist/violin.cjs +33 -0
- package/dist/violin.cjs.map +1 -0
- package/dist/violin.d.cts +8 -0
- package/dist/violin.d.ts +8 -0
- package/dist/violin.js +12 -0
- package/dist/violin.js.map +1 -0
- package/dist/volume.cjs +9 -9
- package/dist/volume.js +4 -4
- package/dist/voronoi-type-BU5WnrcT.d.cts +12 -0
- package/dist/voronoi-type-D7n4mFNp.d.ts +12 -0
- package/dist/voronoi.cjs +33 -0
- package/dist/voronoi.cjs.map +1 -0
- package/dist/voronoi.d.cts +8 -0
- package/dist/voronoi.d.ts +8 -0
- package/dist/voronoi.js +12 -0
- package/dist/voronoi.js.map +1 -0
- package/dist/waterfall.cjs +9 -9
- package/dist/waterfall.js +4 -4
- package/dist/wordcloud-type-C6X9ORRR.d.ts +11 -0
- package/dist/wordcloud-type-CCm8rWK7.d.cts +11 -0
- package/dist/wordcloud.cjs +33 -0
- package/dist/wordcloud.cjs.map +1 -0
- package/dist/wordcloud.d.cts +8 -0
- package/dist/wordcloud.d.ts +8 -0
- package/dist/wordcloud.js +12 -0
- package/dist/wordcloud.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-DX4FBN3I.js.map +0 -1
- package/dist/chunk-MYXLKVJE.js.map +0 -1
- package/dist/chunk-UMIJYYF3.cjs.map +0 -1
- package/dist/chunk-XN6YS55F.cjs.map +0 -1
- package/dist/graph-type-Bg04GFeS.d.ts +0 -15
- package/dist/graph-type-DF-vww8T.d.cts +0 -15
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var chunkX5SG6MFS_cjs = require('./chunk-X5SG6MFS.cjs');
|
|
4
|
+
var chunkW626EAS5_cjs = require('./chunk-W626EAS5.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
|
|
13
|
+
return chunkX5SG6MFS_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
|
|
79
|
+
const pb = new chunkW626EAS5_cjs.PathBuilder();
|
|
80
80
|
pb.moveTo(src.x, src.y);
|
|
81
81
|
pb.quadTo(cpx, cpy, tgt.x, tgt.y);
|
|
82
|
-
nodes.push(
|
|
82
|
+
nodes.push(chunkW626EAS5_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
|
|
101
|
+
const apb = new chunkW626EAS5_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(
|
|
112
|
+
nodes.push(chunkW626EAS5_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(
|
|
124
|
+
nodeNodes.push(chunkW626EAS5_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(
|
|
133
|
+
nodeNodes.push(chunkW626EAS5_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(
|
|
145
|
+
nodes.push(chunkW626EAS5_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-
|
|
178
|
-
//# sourceMappingURL=chunk-
|
|
177
|
+
//# sourceMappingURL=chunk-S52RCLDQ.cjs.map
|
|
178
|
+
//# sourceMappingURL=chunk-S52RCLDQ.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-S52RCLDQ.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,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
3
|
+
var chunk6XWZSV6M_cjs = require('./chunk-6XWZSV6M.cjs');
|
|
4
|
+
var chunkX5SG6MFS_cjs = require('./chunk-X5SG6MFS.cjs');
|
|
5
|
+
var chunkW626EAS5_cjs = require('./chunk-W626EAS5.cjs');
|
|
6
6
|
|
|
7
7
|
// src/charts/polar/polar-type.ts
|
|
8
8
|
var polarChartType = {
|
|
@@ -11,7 +11,7 @@ var polarChartType = {
|
|
|
11
11
|
return { x: "categorical", y: "linear" };
|
|
12
12
|
},
|
|
13
13
|
prepareData(data, options) {
|
|
14
|
-
return
|
|
14
|
+
return chunkX5SG6MFS_cjs.prepareNoAxes(data, options);
|
|
15
15
|
},
|
|
16
16
|
render(ctx) {
|
|
17
17
|
const { data, area, theme, options } = ctx;
|
|
@@ -36,11 +36,11 @@ var polarChartType = {
|
|
|
36
36
|
const ringCount = 3;
|
|
37
37
|
for (let r = 1; r <= ringCount; r++) {
|
|
38
38
|
const ringR = maxOuterR * r / ringCount;
|
|
39
|
-
const pb = new
|
|
39
|
+
const pb = new chunkW626EAS5_cjs.PathBuilder();
|
|
40
40
|
pb.moveTo(cx + ringR, cy);
|
|
41
41
|
pb.arc(ringR, ringR, 0, false, true, cx - ringR, cy);
|
|
42
42
|
pb.arc(ringR, ringR, 0, false, true, cx + ringR, cy);
|
|
43
|
-
nodes.push(
|
|
43
|
+
nodes.push(chunkW626EAS5_cjs.path(pb.build(), {
|
|
44
44
|
class: "chartts-polar-grid",
|
|
45
45
|
stroke: theme.gridColor,
|
|
46
46
|
strokeWidth: theme.gridWidth,
|
|
@@ -60,7 +60,7 @@ var polarChartType = {
|
|
|
60
60
|
if (sliceAngle < outerPadAngle * 2 + 0.01) continue;
|
|
61
61
|
const colorIndex = i % options.colors.length;
|
|
62
62
|
const color = options.colors[colorIndex];
|
|
63
|
-
const d =
|
|
63
|
+
const d = chunk6XWZSV6M_cjs.roundedSlicePath(
|
|
64
64
|
cx,
|
|
65
65
|
cy,
|
|
66
66
|
wedgeR,
|
|
@@ -72,7 +72,7 @@ var polarChartType = {
|
|
|
72
72
|
cornerRadius
|
|
73
73
|
);
|
|
74
74
|
const wedgeNodes = [
|
|
75
|
-
|
|
75
|
+
chunkW626EAS5_cjs.path(d, {
|
|
76
76
|
class: "chartts-polar-wedge",
|
|
77
77
|
fill: color,
|
|
78
78
|
fillOpacity: 0.75,
|
|
@@ -88,7 +88,7 @@ var polarChartType = {
|
|
|
88
88
|
const lx = cx + labelR * Math.cos(midAngle);
|
|
89
89
|
const ly = cy + labelR * Math.sin(midAngle);
|
|
90
90
|
const anchor = Math.abs(Math.cos(midAngle)) < 0.01 ? "middle" : Math.cos(midAngle) > 0 ? "start" : "end";
|
|
91
|
-
wedgeNodes.push(
|
|
91
|
+
wedgeNodes.push(chunkW626EAS5_cjs.text(lx, ly, String(data.labels[i] ?? ""), {
|
|
92
92
|
class: "chartts-polar-label",
|
|
93
93
|
fill: theme.textMuted,
|
|
94
94
|
textAnchor: anchor,
|
|
@@ -96,7 +96,7 @@ var polarChartType = {
|
|
|
96
96
|
fontSize: theme.fontSizeSmall,
|
|
97
97
|
fontFamily: theme.fontFamily
|
|
98
98
|
}));
|
|
99
|
-
nodes.push(
|
|
99
|
+
nodes.push(chunkW626EAS5_cjs.group(wedgeNodes, {
|
|
100
100
|
class: `chartts-series chartts-series-${i}`,
|
|
101
101
|
"data-series-name": String(data.labels[i] ?? `Item ${i + 1}`)
|
|
102
102
|
}));
|
|
@@ -141,5 +141,5 @@ var polarChartType = {
|
|
|
141
141
|
};
|
|
142
142
|
|
|
143
143
|
exports.polarChartType = polarChartType;
|
|
144
|
-
//# sourceMappingURL=chunk-
|
|
145
|
-
//# sourceMappingURL=chunk-
|
|
144
|
+
//# sourceMappingURL=chunk-SEOHPUXV.cjs.map
|
|
145
|
+
//# sourceMappingURL=chunk-SEOHPUXV.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/charts/polar/polar-type.ts"],"names":["prepareNoAxes","PathBuilder","path","roundedSlicePath","text","group"],"mappings":";;;;;;;AAgBO,IAAM,cAAA,GAAkC;AAAA,EAC7C,IAAA,EAAM,OAAA;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,OAAOA,+BAAA,CAAc,MAAM,OAAO,CAAA;AAAA,EACpC,CAAA;AAAA,EAEA,OAAO,GAAA,EAAkC;AACvC,IAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,SAAQ,GAAI,GAAA;AACvC,IAAA,MAAM,QAAsB,EAAC;AAE7B,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,QAAQ,MAAA,CAAO,MAAA;AACrB,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,IAAI,IAAA,CAAK,IAAI,CAAC,CAAA,GAAI,QAAQ,MAAA,GAAS,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IAC/C;AACA,IAAA,IAAI,MAAA,KAAW,GAAG,MAAA,GAAS,CAAA;AAE3B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA;AACjC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AAClC,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,IAAA,CAAK,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA,GAAI,EAAA;AAC1D,IAAA,MAAM,SAAS,SAAA,GAAY,IAAA;AAC3B,IAAA,MAAM,SAAA,GAAa,IAAA,CAAK,EAAA,GAAK,CAAA,GAAK,KAAA;AAClC,IAAA,MAAM,KAAA,GAAQ,CAAA;AACd,IAAA,MAAM,UAAU,KAAA,GAAQ,CAAA;AACxB,IAAA,MAAM,YAAA,GAAe,CAAA;AAGrB,IAAA,MAAM,SAAA,GAAY,CAAA;AAClB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,SAAA,EAAW,CAAA,EAAA,EAAK;AACnC,MAAA,MAAM,KAAA,GAAS,YAAY,CAAA,GAAK,SAAA;AAChC,MAAA,MAAM,EAAA,GAAK,IAAIC,6BAAA,EAAY;AAC3B,MAAA,EAAA,CAAG,MAAA,CAAO,EAAA,GAAK,KAAA,EAAO,EAAE,CAAA;AACxB,MAAA,EAAA,CAAG,GAAA,CAAI,OAAO,KAAA,EAAO,CAAA,EAAG,OAAO,IAAA,EAAM,EAAA,GAAK,OAAO,EAAE,CAAA;AACnD,MAAA,EAAA,CAAG,GAAA,CAAI,OAAO,KAAA,EAAO,CAAA,EAAG,OAAO,IAAA,EAAM,EAAA,GAAK,OAAO,EAAE,CAAA;AAEnD,MAAA,KAAA,CAAM,IAAA,CAAKC,sBAAA,CAAK,EAAA,CAAG,KAAA,EAAM,EAAG;AAAA,QAC1B,KAAA,EAAO,oBAAA;AAAA,QACP,QAAQ,KAAA,CAAM,SAAA;AAAA,QACd,aAAa,KAAA,CAAM,SAAA;AAAA,QACnB,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAC,CAAA;AAAA,IACJ;AAGA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,CAAC,CAAE,CAAA;AACjC,MAAA,MAAM,MAAA,GAAU,QAAQ,MAAA,GAAU,SAAA;AAClC,MAAA,MAAM,UAAA,GAAa,CAAC,IAAA,CAAK,EAAA,GAAK,IAAI,CAAA,GAAI,SAAA;AACtC,MAAA,MAAM,WAAW,CAAC,IAAA,CAAK,EAAA,GAAK,CAAA,GAAA,CAAK,IAAI,CAAA,IAAK,SAAA;AAC1C,MAAA,MAAM,aAAa,QAAA,GAAW,UAAA;AAE9B,MAAA,IAAI,MAAA,GAAS,SAAS,CAAA,EAAG;AAGzB,MAAA,MAAM,gBAAgB,OAAA,GAAU,MAAA;AAChC,MAAA,MAAM,aAAA,GAAgB,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,MAAA,GAAS,CAAA;AAEtD,MAAA,IAAI,UAAA,GAAa,aAAA,GAAgB,CAAA,GAAI,IAAA,EAAM;AAE3C,MAAA,MAAM,UAAA,GAAa,CAAA,GAAI,OAAA,CAAQ,MAAA,CAAO,MAAA;AACtC,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA;AAEvC,MAAA,MAAM,CAAA,GAAIC,kCAAA;AAAA,QACR,EAAA;AAAA,QAAI,EAAA;AAAA,QAAI,MAAA;AAAA,QAAQ,MAAA;AAAA,QAChB,UAAA,GAAa,aAAA;AAAA,QAAe,QAAA,GAAW,aAAA;AAAA,QACvC,UAAA,GAAa,aAAA;AAAA,QAAe,QAAA,GAAW,aAAA;AAAA,QACvC;AAAA,OACF;AAEA,MAAA,MAAM,UAAA,GAA2B;AAAA,QAC/BD,uBAAK,CAAA,EAAG;AAAA,UACN,KAAA,EAAO,qBAAA;AAAA,UACP,IAAA,EAAM,KAAA;AAAA,UACN,WAAA,EAAa,IAAA;AAAA,UACb,aAAA,EAAe,CAAA;AAAA,UACf,YAAA,EAAc,CAAA;AAAA,UACd,QAAA,EAAU,CAAA;AAAA,UACV,IAAA,EAAM,KAAA;AAAA,UACN,SAAA,EAAW,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA,KAAA,EAAQ,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA,EAAA,EAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,SAC9D;AAAA,OACH;AAGA,MAAA,MAAM,QAAA,GAAA,CAAY,aAAa,QAAA,IAAY,CAAA;AAC3C,MAAA,MAAM,SAAS,SAAA,GAAY,EAAA;AAC3B,MAAA,MAAM,EAAA,GAAK,EAAA,GAAK,MAAA,GAAS,IAAA,CAAK,IAAI,QAAQ,CAAA;AAC1C,MAAA,MAAM,EAAA,GAAK,EAAA,GAAK,MAAA,GAAS,IAAA,CAAK,IAAI,QAAQ,CAAA;AAC1C,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAI,QAAQ,CAAC,CAAA,GAAI,IAAA,GAAO,WACjD,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,GAAI,IAAI,OAAA,GAAmB,KAAA;AAEhD,MAAA,UAAA,CAAW,IAAA,CAAKE,sBAAA,CAAK,EAAA,EAAI,EAAA,EAAI,MAAA,CAAO,KAAK,MAAA,CAAO,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG;AAAA,QACzD,KAAA,EAAO,qBAAA;AAAA,QACP,MAAM,KAAA,CAAM,SAAA;AAAA,QACZ,UAAA,EAAY,MAAA;AAAA,QACZ,gBAAA,EAAkB,SAAA;AAAA,QAClB,UAAU,KAAA,CAAM,aAAA;AAAA,QAChB,YAAY,KAAA,CAAM;AAAA,OACnB,CAAC,CAAA;AAEF,MAAA,KAAA,CAAM,IAAA,CAAKC,wBAAM,UAAA,EAAY;AAAA,QAC3B,KAAA,EAAO,iCAAiC,CAAC,CAAA,CAAA;AAAA,QACzC,kBAAA,EAAoB,OAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA,KAAA,EAAQ,CAAA,GAAI,CAAC,CAAA,CAAE;AAAA,OAC7D,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,IAAA,EAAK,GAAI,GAAA;AACvB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA;AAC5B,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,IAAA;AAElD,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,IAAA,MAAM,QAAQ,MAAA,CAAO,MAAA;AACrB,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,IAAI,IAAA,CAAK,IAAI,CAAC,CAAA,GAAI,QAAQ,MAAA,GAAS,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IAC/C;AACA,IAAA,IAAI,MAAA,KAAW,GAAG,OAAO,IAAA;AAEzB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA;AACjC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AAClC,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,IAAA,CAAK,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA,GAAI,EAAA;AAC1D,IAAA,MAAM,SAAS,SAAA,GAAY,IAAA;AAC3B,IAAA,MAAM,SAAA,GAAa,IAAA,CAAK,EAAA,GAAK,CAAA,GAAK,KAAA;AAElC,IAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,IAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACxC,IAAA,IAAI,IAAA,GAAO,SAAA,IAAa,IAAA,GAAO,MAAA,EAAQ,OAAO,IAAA;AAE9C,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAC7B,IAAA,IAAI,QAAQ,CAAC,IAAA,CAAK,KAAK,CAAA,EAAG,KAAA,IAAS,KAAK,EAAA,GAAK,CAAA;AAE7C,IAAA,MAAM,MAAA,GAAS,KAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,CAAA;AACjC,IAAA,MAAM,kBAAkB,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,IAAA,CAAK,KAAK,CAAA,GAAI,MAAA;AAC5D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,eAAA,GAAkB,SAAS,CAAA;AAElD,IAAA,IAAI,GAAA,IAAO,CAAA,IAAK,GAAA,GAAM,KAAA,EAAO;AAC3B,MAAA,MAAM,SAAU,IAAA,CAAK,GAAA,CAAI,OAAO,GAAG,CAAE,IAAI,MAAA,GAAU,SAAA;AACnD,MAAA,IAAI,IAAA,IAAQ,MAAA,IAAU,IAAA,IAAQ,MAAA,EAAQ;AACpC,QAAA,MAAM,WAAW,CAAC,IAAA,CAAK,EAAA,GAAK,CAAA,GAAA,CAAK,MAAM,GAAA,IAAO,SAAA;AAC9C,QAAA,MAAM,IAAA,GAAA,CAAQ,SAAS,MAAA,IAAU,CAAA;AACjC,QAAA,OAAO,EAAE,aAAa,CAAA,EAAG,UAAA,EAAY,KAAK,QAAA,EAAU,IAAA,EAAM,GAAG,EAAA,GAAK,IAAA,GAAO,KAAK,GAAA,CAAI,QAAQ,GAAG,CAAA,EAAG,EAAA,GAAK,OAAO,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAE;AAAA,MACjI;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF","file":"chunk-SXVMEC6N.cjs","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'\nimport { roundedSlicePath } from '../../utils/slice-path'\n\n/**\n * Polar / Radial bar chart (Nightingale rose diagram).\n *\n * Each category is a wedge whose radius is proportional to its value.\n * Uses the first series' values as wedge sizes.\n * Wedges have uniform pixel gaps, rounded corners, and a small inner radius.\n */\nexport const polarChartType: ChartTypePlugin = {\n type: 'polar',\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 values = series.values\n const count = values.length\n let maxVal = 0\n for (const v of values) {\n if (Math.abs(v) > maxVal) maxVal = Math.abs(v)\n }\n if (maxVal === 0) maxVal = 1\n\n const cx = area.x + area.width / 2\n const cy = area.y + area.height / 2\n const maxOuterR = Math.min(area.width, area.height) / 2 - 16\n const innerR = maxOuterR * 0.08\n const angleStep = (Math.PI * 2) / count\n const gapPx = 4\n const halfGap = gapPx / 2\n const cornerRadius = 5\n\n // Draw concentric grid rings\n const ringCount = 3\n for (let r = 1; r <= ringCount; r++) {\n const ringR = (maxOuterR * r) / ringCount\n const pb = new PathBuilder()\n pb.moveTo(cx + ringR, cy)\n pb.arc(ringR, ringR, 0, false, true, cx - ringR, cy)\n pb.arc(ringR, ringR, 0, false, true, cx + ringR, cy)\n\n nodes.push(path(pb.build(), {\n class: 'chartts-polar-grid',\n stroke: theme.gridColor,\n strokeWidth: theme.gridWidth,\n fill: 'none',\n opacity: 0.3,\n }))\n }\n\n // Draw wedges\n for (let i = 0; i < count; i++) {\n const value = Math.abs(values[i]!)\n const wedgeR = (value / maxVal) * maxOuterR\n const startAngle = -Math.PI / 2 + i * angleStep\n const endAngle = -Math.PI / 2 + (i + 1) * angleStep\n const sliceAngle = endAngle - startAngle\n\n if (wedgeR < innerR + 2) continue\n\n // Uniform pixel gap: different angular offsets at different radii\n const outerPadAngle = halfGap / wedgeR\n const innerPadAngle = innerR > 0 ? halfGap / innerR : 0\n\n if (sliceAngle < outerPadAngle * 2 + 0.01) continue\n\n const colorIndex = i % options.colors.length\n const color = options.colors[colorIndex]!\n\n const d = roundedSlicePath(\n cx, cy, wedgeR, innerR,\n startAngle + outerPadAngle, endAngle - outerPadAngle,\n startAngle + innerPadAngle, endAngle - innerPadAngle,\n cornerRadius,\n )\n\n const wedgeNodes: RenderNode[] = [\n path(d, {\n class: 'chartts-polar-wedge',\n fill: color,\n fillOpacity: 0.75,\n 'data-series': 0,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${data.labels[i] ?? `Item ${i + 1}`}: ${values[i]}`,\n }),\n ]\n\n // Label at the outer edge\n const midAngle = (startAngle + endAngle) / 2\n const labelR = maxOuterR + 10\n const lx = cx + labelR * Math.cos(midAngle)\n const ly = cy + labelR * Math.sin(midAngle)\n const anchor = Math.abs(Math.cos(midAngle)) < 0.01 ? 'middle' as const\n : Math.cos(midAngle) > 0 ? 'start' as const : 'end' as const\n\n wedgeNodes.push(text(lx, ly, String(data.labels[i] ?? ''), {\n class: 'chartts-polar-label',\n fill: theme.textMuted,\n textAnchor: anchor,\n dominantBaseline: 'central',\n fontSize: theme.fontSizeSmall,\n fontFamily: theme.fontFamily,\n }))\n\n nodes.push(group(wedgeNodes, {\n class: `chartts-series chartts-series-${i}`,\n 'data-series-name': String(data.labels[i] ?? `Item ${i + 1}`),\n }))\n }\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 values = series.values\n const count = values.length\n let maxVal = 0\n for (const v of values) {\n if (Math.abs(v) > maxVal) maxVal = Math.abs(v)\n }\n if (maxVal === 0) return null\n\n const cx = area.x + area.width / 2\n const cy = area.y + area.height / 2\n const maxOuterR = Math.min(area.width, area.height) / 2 - 16\n const innerR = maxOuterR * 0.08\n const angleStep = (Math.PI * 2) / count\n\n const dx = mx - cx\n const dy = my - cy\n const dist = Math.sqrt(dx * dx + dy * dy)\n if (dist > maxOuterR || 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 offset = angle + Math.PI / 2\n const normalizedAngle = offset < 0 ? offset + Math.PI * 2 : offset\n const idx = Math.floor(normalizedAngle / angleStep)\n\n if (idx >= 0 && idx < count) {\n const wedgeR = (Math.abs(values[idx]!) / maxVal) * maxOuterR\n if (dist <= wedgeR && dist >= innerR) {\n const midAngle = -Math.PI / 2 + (idx + 0.5) * angleStep\n const midR = (innerR + wedgeR) / 2\n return { seriesIndex: 0, pointIndex: idx, distance: dist, x: cx + midR * Math.cos(midAngle), y: cy + midR * Math.sin(midAngle) }\n }\n }\n\n return null\n },\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/charts/polar/polar-type.ts"],"names":["prepareNoAxes","PathBuilder","path","roundedSlicePath","text","group"],"mappings":"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","file":"chunk-SEOHPUXV.cjs","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'\nimport { roundedSlicePath } from '../../utils/slice-path'\n\n/**\n * Polar / Radial bar chart (Nightingale rose diagram).\n *\n * Each category is a wedge whose radius is proportional to its value.\n * Uses the first series' values as wedge sizes.\n * Wedges have uniform pixel gaps, rounded corners, and a small inner radius.\n */\nexport const polarChartType: ChartTypePlugin = {\n type: 'polar',\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 values = series.values\n const count = values.length\n let maxVal = 0\n for (const v of values) {\n if (Math.abs(v) > maxVal) maxVal = Math.abs(v)\n }\n if (maxVal === 0) maxVal = 1\n\n const cx = area.x + area.width / 2\n const cy = area.y + area.height / 2\n const maxOuterR = Math.min(area.width, area.height) / 2 - 16\n const innerR = maxOuterR * 0.08\n const angleStep = (Math.PI * 2) / count\n const gapPx = 4\n const halfGap = gapPx / 2\n const cornerRadius = 5\n\n // Draw concentric grid rings\n const ringCount = 3\n for (let r = 1; r <= ringCount; r++) {\n const ringR = (maxOuterR * r) / ringCount\n const pb = new PathBuilder()\n pb.moveTo(cx + ringR, cy)\n pb.arc(ringR, ringR, 0, false, true, cx - ringR, cy)\n pb.arc(ringR, ringR, 0, false, true, cx + ringR, cy)\n\n nodes.push(path(pb.build(), {\n class: 'chartts-polar-grid',\n stroke: theme.gridColor,\n strokeWidth: theme.gridWidth,\n fill: 'none',\n opacity: 0.3,\n }))\n }\n\n // Draw wedges\n for (let i = 0; i < count; i++) {\n const value = Math.abs(values[i]!)\n const wedgeR = (value / maxVal) * maxOuterR\n const startAngle = -Math.PI / 2 + i * angleStep\n const endAngle = -Math.PI / 2 + (i + 1) * angleStep\n const sliceAngle = endAngle - startAngle\n\n if (wedgeR < innerR + 2) continue\n\n // Uniform pixel gap: different angular offsets at different radii\n const outerPadAngle = halfGap / wedgeR\n const innerPadAngle = innerR > 0 ? halfGap / innerR : 0\n\n if (sliceAngle < outerPadAngle * 2 + 0.01) continue\n\n const colorIndex = i % options.colors.length\n const color = options.colors[colorIndex]!\n\n const d = roundedSlicePath(\n cx, cy, wedgeR, innerR,\n startAngle + outerPadAngle, endAngle - outerPadAngle,\n startAngle + innerPadAngle, endAngle - innerPadAngle,\n cornerRadius,\n )\n\n const wedgeNodes: RenderNode[] = [\n path(d, {\n class: 'chartts-polar-wedge',\n fill: color,\n fillOpacity: 0.75,\n 'data-series': 0,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${data.labels[i] ?? `Item ${i + 1}`}: ${values[i]}`,\n }),\n ]\n\n // Label at the outer edge\n const midAngle = (startAngle + endAngle) / 2\n const labelR = maxOuterR + 10\n const lx = cx + labelR * Math.cos(midAngle)\n const ly = cy + labelR * Math.sin(midAngle)\n const anchor = Math.abs(Math.cos(midAngle)) < 0.01 ? 'middle' as const\n : Math.cos(midAngle) > 0 ? 'start' as const : 'end' as const\n\n wedgeNodes.push(text(lx, ly, String(data.labels[i] ?? ''), {\n class: 'chartts-polar-label',\n fill: theme.textMuted,\n textAnchor: anchor,\n dominantBaseline: 'central',\n fontSize: theme.fontSizeSmall,\n fontFamily: theme.fontFamily,\n }))\n\n nodes.push(group(wedgeNodes, {\n class: `chartts-series chartts-series-${i}`,\n 'data-series-name': String(data.labels[i] ?? `Item ${i + 1}`),\n }))\n }\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 values = series.values\n const count = values.length\n let maxVal = 0\n for (const v of values) {\n if (Math.abs(v) > maxVal) maxVal = Math.abs(v)\n }\n if (maxVal === 0) return null\n\n const cx = area.x + area.width / 2\n const cy = area.y + area.height / 2\n const maxOuterR = Math.min(area.width, area.height) / 2 - 16\n const innerR = maxOuterR * 0.08\n const angleStep = (Math.PI * 2) / count\n\n const dx = mx - cx\n const dy = my - cy\n const dist = Math.sqrt(dx * dx + dy * dy)\n if (dist > maxOuterR || 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 offset = angle + Math.PI / 2\n const normalizedAngle = offset < 0 ? offset + Math.PI * 2 : offset\n const idx = Math.floor(normalizedAngle / angleStep)\n\n if (idx >= 0 && idx < count) {\n const wedgeR = (Math.abs(values[idx]!) / maxVal) * maxOuterR\n if (dist <= wedgeR && dist >= innerR) {\n const midAngle = -Math.PI / 2 + (idx + 0.5) * angleStep\n const midR = (innerR + wedgeR) / 2\n return { seriesIndex: 0, pointIndex: idx, distance: dist, x: cx + midR * Math.cos(midAngle), y: cy + midR * Math.sin(midAngle) }\n }\n }\n\n return null\n },\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { lineChartType } from './chunk-
|
|
1
|
+
import { lineChartType } from './chunk-45Y77XDM.js';
|
|
2
2
|
|
|
3
3
|
// src/charts/area/area-type.ts
|
|
4
4
|
var areaChartType = {
|
|
@@ -26,5 +26,5 @@ var areaChartType = {
|
|
|
26
26
|
};
|
|
27
27
|
|
|
28
28
|
export { areaChartType };
|
|
29
|
-
//# sourceMappingURL=chunk-
|
|
30
|
-
//# sourceMappingURL=chunk-
|
|
29
|
+
//# sourceMappingURL=chunk-SI4VJK4A.js.map
|
|
30
|
+
//# sourceMappingURL=chunk-SI4VJK4A.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/charts/area/area-type.ts"],"names":[],"mappings":";;;AAUO,IAAM,aAAA,GAAiC;AAAA,EAC5C,IAAA,EAAM,MAAA;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,MAAA,GAAoB;AAAA,MACxB,GAAG,IAAA;AAAA,MACH,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QAC5B,GAAG,CAAA;AAAA,QACH,IAAA,EAAM,EAAE,IAAA,IAAQ,IAAA;AAAA,QAChB,WAAA,EAAa,EAAE,WAAA,IAAe;AAAA,OAChC,CAAE;AAAA,KACJ;AACA,IAAA,OAAO,aAAA,CAAc,WAAA,CAAY,MAAA,EAAQ,OAAO,CAAA;AAAA,EAClD,CAAA;AAAA,EAEA,OAAO,GAAA,EAAkC;AACvC,IAAA,OAAO,aAAA,CAAc,OAAO,GAAG,CAAA;AAAA,EACjC,CAAA;AAAA,EAEA,OAAA,CAAQ,GAAA,EAAoB,EAAA,EAAY,EAAA,EAA8B;AACpE,IAAA,OAAO,aAAA,CAAc,OAAA,CAAQ,GAAA,EAAK,EAAA,EAAI,EAAE,CAAA;AAAA,EAC1C;AACF","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/charts/area/area-type.ts"],"names":[],"mappings":";;;AAUO,IAAM,aAAA,GAAiC;AAAA,EAC5C,IAAA,EAAM,MAAA;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,MAAA,GAAoB;AAAA,MACxB,GAAG,IAAA;AAAA,MACH,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QAC5B,GAAG,CAAA;AAAA,QACH,IAAA,EAAM,EAAE,IAAA,IAAQ,IAAA;AAAA,QAChB,WAAA,EAAa,EAAE,WAAA,IAAe;AAAA,OAChC,CAAE;AAAA,KACJ;AACA,IAAA,OAAO,aAAA,CAAc,WAAA,CAAY,MAAA,EAAQ,OAAO,CAAA;AAAA,EAClD,CAAA;AAAA,EAEA,OAAO,GAAA,EAAkC;AACvC,IAAA,OAAO,aAAA,CAAc,OAAO,GAAG,CAAA;AAAA,EACjC,CAAA;AAAA,EAEA,OAAA,CAAQ,GAAA,EAAoB,EAAA,EAAY,EAAA,EAA8B;AACpE,IAAA,OAAO,aAAA,CAAc,OAAA,CAAQ,GAAA,EAAK,EAAA,EAAI,EAAE,CAAA;AAAA,EAC1C;AACF","file":"chunk-SI4VJK4A.js","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { lineChartType } from '../line/line-type'\n\n/**\n * Area chart — line chart with fill enabled on all series by default.\n * Delegates entirely to lineChartType after forcing fill:true.\n */\nexport const areaChartType: ChartTypePlugin = {\n type: 'area',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n // Force fill on all series\n const filled: ChartData = {\n ...data,\n series: data.series.map(s => ({\n ...s,\n fill: s.fill ?? true,\n fillOpacity: s.fillOpacity ?? 0.25,\n })),\n }\n return lineChartType.prepareData(filled, options)\n },\n\n render(ctx: RenderContext): RenderNode[] {\n return lineChartType.render(ctx)\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n return lineChartType.hitTest(ctx, mx, my)\n },\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PathBuilder } from './chunk-
|
|
1
|
+
import { PathBuilder } from './chunk-XIVC32HU.js';
|
|
2
2
|
|
|
3
3
|
// src/utils/slice-path.ts
|
|
4
4
|
function roundedSlicePath(cx, cy, outerR, innerR, outerStart, outerEnd, innerStart, innerEnd, cornerRadius) {
|
|
@@ -122,5 +122,5 @@ function roundedSlicePath(cx, cy, outerR, innerR, outerStart, outerEnd, innerSta
|
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
export { roundedSlicePath };
|
|
125
|
-
//# sourceMappingURL=chunk-
|
|
126
|
-
//# sourceMappingURL=chunk-
|
|
125
|
+
//# sourceMappingURL=chunk-SUB5WML4.js.map
|
|
126
|
+
//# sourceMappingURL=chunk-SUB5WML4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/slice-path.ts"],"names":[],"mappings":"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","file":"chunk-UFMPALRH.js","sourcesContent":["import { PathBuilder } from '../render/tree'\n\n/**\n * Build a rounded annular sector (pie/donut slice) SVG path string.\n *\n * Supports different angular offsets at inner vs outer radius for uniform\n * pixel-width gaps between slices.\n *\n * @param cx - Center x\n * @param cy - Center y\n * @param outerR - Outer radius\n * @param innerR - Inner radius (0 for full pie, >0 for donut)\n * @param outerStart - Start angle on outer arc (radians)\n * @param outerEnd - End angle on outer arc (radians)\n * @param innerStart - Start angle on inner arc (radians)\n * @param innerEnd - End angle on inner arc (radians)\n * @param cornerRadius - Corner rounding radius in px\n */\nexport function roundedSlicePath(\n cx: number, cy: number,\n outerR: number, innerR: number,\n outerStart: number, outerEnd: number,\n innerStart: number, innerEnd: number,\n cornerRadius: number,\n): string {\n const pb = new PathBuilder()\n const outerSliceAngle = outerEnd - outerStart\n const innerSliceAngle = innerEnd - innerStart\n const radialThickness = outerR - innerR\n const outerArcLen = outerSliceAngle * outerR\n const innerArcLen = innerSliceAngle * innerR\n\n // Separate corner radii for outer and inner edges.\n // Inner corners need aggressive clamping — when innerR is small, the angular\n // span of a corner becomes huge relative to the slice, causing path distortion.\n const outerCr = Math.min(\n cornerRadius,\n radialThickness / 2,\n outerArcLen / 4,\n )\n // Skip inner rounding entirely when inner radius is too small (<20px)\n // — the angular span of any rounding would dominate the inner edge.\n const innerCr = innerR >= 20\n ? Math.min(\n cornerRadius,\n radialThickness / 2,\n innerArcLen / 4,\n innerR * 0.25,\n )\n : 0\n\n if (outerCr < 0.5 && innerCr < 0.5) {\n // No rounding — standard path with per-radius angles\n const x1o = cx + outerR * Math.cos(outerStart)\n const y1o = cy + outerR * Math.sin(outerStart)\n const x2o = cx + outerR * Math.cos(outerEnd)\n const y2o = cy + outerR * Math.sin(outerEnd)\n const x1i = cx + innerR * Math.cos(innerEnd)\n const y1i = cy + innerR * Math.sin(innerEnd)\n const x2i = cx + innerR * Math.cos(innerStart)\n const y2i = cy + innerR * Math.sin(innerStart)\n\n pb.moveTo(x1o, y1o)\n pb.arc(outerR, outerR, 0, outerSliceAngle > Math.PI, true, x2o, y2o)\n pb.lineTo(x1i, y1i)\n if (innerR > 0) {\n pb.arc(innerR, innerR, 0, innerSliceAngle > Math.PI, false, x2i, y2i)\n }\n pb.close()\n return pb.build()\n }\n\n // Angular offsets for rounding on each arc (separate for outer/inner)\n const outerCrAngle = outerCr / outerR\n const innerCrAngle = innerR > 0 && innerCr > 0.5 ? innerCr / innerR : 0\n\n // Outer arc inset by corner angles\n const oa1 = outerStart + outerCrAngle\n const oa2 = outerEnd - outerCrAngle\n // Inner arc inset by corner angles (reverse direction)\n const ia1 = innerEnd - innerCrAngle\n const ia2 = innerStart + innerCrAngle\n\n // -- Corner 1: outer-start (start radial meets outer arc) --\n pb.moveTo(\n cx + (outerR - outerCr) * Math.cos(outerStart),\n cy + (outerR - outerCr) * Math.sin(outerStart),\n )\n if (outerCr >= 0.5) {\n pb.quadTo(\n cx + outerR * Math.cos(outerStart),\n cy + outerR * Math.sin(outerStart),\n cx + outerR * Math.cos(oa1),\n cy + outerR * Math.sin(oa1),\n )\n }\n\n // -- Outer arc from oa1 to oa2 --\n if (oa2 > oa1) {\n pb.arc(outerR, outerR, 0, (oa2 - oa1) > Math.PI, true,\n cx + outerR * Math.cos(oa2),\n cy + outerR * Math.sin(oa2),\n )\n }\n\n // -- Corner 2: outer-end (outer arc meets end radial) --\n if (outerCr >= 0.5) {\n pb.quadTo(\n cx + outerR * Math.cos(outerEnd),\n cy + outerR * Math.sin(outerEnd),\n cx + (outerR - outerCr) * Math.cos(outerEnd),\n cy + (outerR - outerCr) * Math.sin(outerEnd),\n )\n }\n\n // -- Inner edge --\n if (innerCr >= 0.5 && innerR > 0) {\n // Line down to inner-end corner\n pb.lineTo(\n cx + (innerR + innerCr) * Math.cos(innerEnd),\n cy + (innerR + innerCr) * Math.sin(innerEnd),\n )\n\n // Corner 3: inner-end (end radial meets inner arc)\n pb.quadTo(\n cx + innerR * Math.cos(innerEnd),\n cy + innerR * Math.sin(innerEnd),\n cx + innerR * Math.cos(ia1),\n cy + innerR * Math.sin(ia1),\n )\n\n // Inner arc from ia1 to ia2 (reverse)\n if (ia1 > ia2) {\n pb.arc(innerR, innerR, 0, (ia1 - ia2) > Math.PI, false,\n cx + innerR * Math.cos(ia2),\n cy + innerR * Math.sin(ia2),\n )\n }\n\n // Corner 4: inner-start (inner arc meets start radial)\n pb.quadTo(\n cx + innerR * Math.cos(innerStart),\n cy + innerR * Math.sin(innerStart),\n cx + (innerR + innerCr) * Math.cos(innerStart),\n cy + (innerR + innerCr) * Math.sin(innerStart),\n )\n } else if (innerR > 0) {\n // No inner rounding — sharp inner corners\n pb.lineTo(\n cx + innerR * Math.cos(innerEnd),\n cy + innerR * Math.sin(innerEnd),\n )\n pb.arc(innerR, innerR, 0, innerSliceAngle > Math.PI, false,\n cx + innerR * Math.cos(innerStart),\n cy + innerR * Math.sin(innerStart),\n )\n }\n\n pb.close()\n return pb.build()\n}\n\n/**\n * Compute angular offsets for a uniform pixel gap at different radii.\n * Returns the padded start/end angles for both outer and inner arcs.\n */\nexport function uniformGapAngles(\n startAngle: number, endAngle: number,\n outerR: number, innerR: number,\n gapPx: number,\n): { outerStart: number; outerEnd: number; innerStart: number; innerEnd: number } {\n const halfGap = gapPx / 2\n const outerPad = halfGap / outerR\n const innerPad = innerR > 0 ? halfGap / innerR : 0\n return {\n outerStart: startAngle + outerPad,\n outerEnd: endAngle - outerPad,\n innerStart: startAngle + innerPad,\n innerEnd: endAngle - innerPad,\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/slice-path.ts"],"names":[],"mappings":"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","file":"chunk-SUB5WML4.js","sourcesContent":["import { PathBuilder } from '../render/tree'\n\n/**\n * Build a rounded annular sector (pie/donut slice) SVG path string.\n *\n * Supports different angular offsets at inner vs outer radius for uniform\n * pixel-width gaps between slices.\n *\n * @param cx - Center x\n * @param cy - Center y\n * @param outerR - Outer radius\n * @param innerR - Inner radius (0 for full pie, >0 for donut)\n * @param outerStart - Start angle on outer arc (radians)\n * @param outerEnd - End angle on outer arc (radians)\n * @param innerStart - Start angle on inner arc (radians)\n * @param innerEnd - End angle on inner arc (radians)\n * @param cornerRadius - Corner rounding radius in px\n */\nexport function roundedSlicePath(\n cx: number, cy: number,\n outerR: number, innerR: number,\n outerStart: number, outerEnd: number,\n innerStart: number, innerEnd: number,\n cornerRadius: number,\n): string {\n const pb = new PathBuilder()\n const outerSliceAngle = outerEnd - outerStart\n const innerSliceAngle = innerEnd - innerStart\n const radialThickness = outerR - innerR\n const outerArcLen = outerSliceAngle * outerR\n const innerArcLen = innerSliceAngle * innerR\n\n // Separate corner radii for outer and inner edges.\n // Inner corners need aggressive clamping — when innerR is small, the angular\n // span of a corner becomes huge relative to the slice, causing path distortion.\n const outerCr = Math.min(\n cornerRadius,\n radialThickness / 2,\n outerArcLen / 4,\n )\n // Skip inner rounding entirely when inner radius is too small (<20px)\n // — the angular span of any rounding would dominate the inner edge.\n const innerCr = innerR >= 20\n ? Math.min(\n cornerRadius,\n radialThickness / 2,\n innerArcLen / 4,\n innerR * 0.25,\n )\n : 0\n\n if (outerCr < 0.5 && innerCr < 0.5) {\n // No rounding — standard path with per-radius angles\n const x1o = cx + outerR * Math.cos(outerStart)\n const y1o = cy + outerR * Math.sin(outerStart)\n const x2o = cx + outerR * Math.cos(outerEnd)\n const y2o = cy + outerR * Math.sin(outerEnd)\n const x1i = cx + innerR * Math.cos(innerEnd)\n const y1i = cy + innerR * Math.sin(innerEnd)\n const x2i = cx + innerR * Math.cos(innerStart)\n const y2i = cy + innerR * Math.sin(innerStart)\n\n pb.moveTo(x1o, y1o)\n pb.arc(outerR, outerR, 0, outerSliceAngle > Math.PI, true, x2o, y2o)\n pb.lineTo(x1i, y1i)\n if (innerR > 0) {\n pb.arc(innerR, innerR, 0, innerSliceAngle > Math.PI, false, x2i, y2i)\n }\n pb.close()\n return pb.build()\n }\n\n // Angular offsets for rounding on each arc (separate for outer/inner)\n const outerCrAngle = outerCr / outerR\n const innerCrAngle = innerR > 0 && innerCr > 0.5 ? innerCr / innerR : 0\n\n // Outer arc inset by corner angles\n const oa1 = outerStart + outerCrAngle\n const oa2 = outerEnd - outerCrAngle\n // Inner arc inset by corner angles (reverse direction)\n const ia1 = innerEnd - innerCrAngle\n const ia2 = innerStart + innerCrAngle\n\n // -- Corner 1: outer-start (start radial meets outer arc) --\n pb.moveTo(\n cx + (outerR - outerCr) * Math.cos(outerStart),\n cy + (outerR - outerCr) * Math.sin(outerStart),\n )\n if (outerCr >= 0.5) {\n pb.quadTo(\n cx + outerR * Math.cos(outerStart),\n cy + outerR * Math.sin(outerStart),\n cx + outerR * Math.cos(oa1),\n cy + outerR * Math.sin(oa1),\n )\n }\n\n // -- Outer arc from oa1 to oa2 --\n if (oa2 > oa1) {\n pb.arc(outerR, outerR, 0, (oa2 - oa1) > Math.PI, true,\n cx + outerR * Math.cos(oa2),\n cy + outerR * Math.sin(oa2),\n )\n }\n\n // -- Corner 2: outer-end (outer arc meets end radial) --\n if (outerCr >= 0.5) {\n pb.quadTo(\n cx + outerR * Math.cos(outerEnd),\n cy + outerR * Math.sin(outerEnd),\n cx + (outerR - outerCr) * Math.cos(outerEnd),\n cy + (outerR - outerCr) * Math.sin(outerEnd),\n )\n }\n\n // -- Inner edge --\n if (innerCr >= 0.5 && innerR > 0) {\n // Line down to inner-end corner\n pb.lineTo(\n cx + (innerR + innerCr) * Math.cos(innerEnd),\n cy + (innerR + innerCr) * Math.sin(innerEnd),\n )\n\n // Corner 3: inner-end (end radial meets inner arc)\n pb.quadTo(\n cx + innerR * Math.cos(innerEnd),\n cy + innerR * Math.sin(innerEnd),\n cx + innerR * Math.cos(ia1),\n cy + innerR * Math.sin(ia1),\n )\n\n // Inner arc from ia1 to ia2 (reverse)\n if (ia1 > ia2) {\n pb.arc(innerR, innerR, 0, (ia1 - ia2) > Math.PI, false,\n cx + innerR * Math.cos(ia2),\n cy + innerR * Math.sin(ia2),\n )\n }\n\n // Corner 4: inner-start (inner arc meets start radial)\n pb.quadTo(\n cx + innerR * Math.cos(innerStart),\n cy + innerR * Math.sin(innerStart),\n cx + (innerR + innerCr) * Math.cos(innerStart),\n cy + (innerR + innerCr) * Math.sin(innerStart),\n )\n } else if (innerR > 0) {\n // No inner rounding — sharp inner corners\n pb.lineTo(\n cx + innerR * Math.cos(innerEnd),\n cy + innerR * Math.sin(innerEnd),\n )\n pb.arc(innerR, innerR, 0, innerSliceAngle > Math.PI, false,\n cx + innerR * Math.cos(innerStart),\n cy + innerR * Math.sin(innerStart),\n )\n }\n\n pb.close()\n return pb.build()\n}\n\n/**\n * Compute angular offsets for a uniform pixel gap at different radii.\n * Returns the padded start/end angles for both outer and inner arcs.\n */\nexport function uniformGapAngles(\n startAngle: number, endAngle: number,\n outerR: number, innerR: number,\n gapPx: number,\n): { outerStart: number; outerEnd: number; innerStart: number; innerEnd: number } {\n const halfGap = gapPx / 2\n const outerPad = halfGap / outerR\n const innerPad = innerR > 0 ? halfGap / innerR : 0\n return {\n outerStart: startAngle + outerPad,\n outerEnd: endAngle - outerPad,\n innerStart: startAngle + innerPad,\n innerEnd: endAngle - innerPad,\n }\n}\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var chunkNHGKZMD7_cjs = require('./chunk-NHGKZMD7.cjs');
|
|
4
4
|
var chunkLU35QDPN_cjs = require('./chunk-LU35QDPN.cjs');
|
|
5
|
-
var
|
|
5
|
+
var chunkW626EAS5_cjs = require('./chunk-W626EAS5.cjs');
|
|
6
6
|
|
|
7
7
|
// src/charts/bar/bar-type.ts
|
|
8
8
|
var barChartType = {
|
|
@@ -11,7 +11,7 @@ var barChartType = {
|
|
|
11
11
|
return { x: "categorical", y: "linear" };
|
|
12
12
|
},
|
|
13
13
|
prepareData(data, options) {
|
|
14
|
-
const prepared =
|
|
14
|
+
const prepared = chunkW626EAS5_cjs.prepareData(data, options);
|
|
15
15
|
if (options.yMin === void 0 && prepared.bounds.yMin > 0) {
|
|
16
16
|
prepared.bounds.yMin = 0;
|
|
17
17
|
}
|
|
@@ -44,7 +44,7 @@ var barChartType = {
|
|
|
44
44
|
const barFill = `url(#chartts-bar-${series.index})`;
|
|
45
45
|
if (r > 0 && h > r * 2) {
|
|
46
46
|
const d = isPositive ? `M${chunkLU35QDPN_cjs.formatNum(barX)},${chunkLU35QDPN_cjs.formatNum(y + h)}V${chunkLU35QDPN_cjs.formatNum(y + r)}Q${chunkLU35QDPN_cjs.formatNum(barX)},${chunkLU35QDPN_cjs.formatNum(y)},${chunkLU35QDPN_cjs.formatNum(barX + r)},${chunkLU35QDPN_cjs.formatNum(y)}H${chunkLU35QDPN_cjs.formatNum(barX + barWidth - r)}Q${chunkLU35QDPN_cjs.formatNum(barX + barWidth)},${chunkLU35QDPN_cjs.formatNum(y)},${chunkLU35QDPN_cjs.formatNum(barX + barWidth)},${chunkLU35QDPN_cjs.formatNum(y + r)}V${chunkLU35QDPN_cjs.formatNum(y + h)}Z` : `M${chunkLU35QDPN_cjs.formatNum(barX)},${chunkLU35QDPN_cjs.formatNum(y)}V${chunkLU35QDPN_cjs.formatNum(y + h - r)}Q${chunkLU35QDPN_cjs.formatNum(barX)},${chunkLU35QDPN_cjs.formatNum(y + h)},${chunkLU35QDPN_cjs.formatNum(barX + r)},${chunkLU35QDPN_cjs.formatNum(y + h)}H${chunkLU35QDPN_cjs.formatNum(barX + barWidth - r)}Q${chunkLU35QDPN_cjs.formatNum(barX + barWidth)},${chunkLU35QDPN_cjs.formatNum(y + h)},${chunkLU35QDPN_cjs.formatNum(barX + barWidth)},${chunkLU35QDPN_cjs.formatNum(y + h - r)}V${chunkLU35QDPN_cjs.formatNum(y)}Z`;
|
|
47
|
-
barNodes.push(
|
|
47
|
+
barNodes.push(chunkW626EAS5_cjs.path(d, {
|
|
48
48
|
class: "chartts-bar",
|
|
49
49
|
fill: barFill,
|
|
50
50
|
"data-series": series.index,
|
|
@@ -54,7 +54,7 @@ var barChartType = {
|
|
|
54
54
|
ariaLabel: `${series.name}: ${series.values[i]}`
|
|
55
55
|
}));
|
|
56
56
|
} else {
|
|
57
|
-
barNodes.push(
|
|
57
|
+
barNodes.push(chunkW626EAS5_cjs.rect(barX, y, barWidth, h, {
|
|
58
58
|
class: "chartts-bar",
|
|
59
59
|
fill: barFill,
|
|
60
60
|
"data-series": series.index,
|
|
@@ -65,7 +65,7 @@ var barChartType = {
|
|
|
65
65
|
}));
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
|
-
nodes.push(
|
|
68
|
+
nodes.push(chunkW626EAS5_cjs.group(barNodes, {
|
|
69
69
|
class: `chartts-series chartts-series-${series.index}`,
|
|
70
70
|
"data-series-name": series.name
|
|
71
71
|
}));
|
|
@@ -89,7 +89,7 @@ var barChartType = {
|
|
|
89
89
|
const y = series.values[i] >= 0 ? vy : baseline;
|
|
90
90
|
const h = Math.abs(vy - baseline);
|
|
91
91
|
return [
|
|
92
|
-
|
|
92
|
+
chunkW626EAS5_cjs.rect(barX - 1, y - 1, barWidth + 2, h + 2, {
|
|
93
93
|
class: "chartts-highlight-bar",
|
|
94
94
|
fill: "none",
|
|
95
95
|
stroke: series.color,
|
|
@@ -131,5 +131,5 @@ var barChartType = {
|
|
|
131
131
|
};
|
|
132
132
|
|
|
133
133
|
exports.barChartType = barChartType;
|
|
134
|
-
//# sourceMappingURL=chunk-
|
|
135
|
-
//# sourceMappingURL=chunk-
|
|
134
|
+
//# sourceMappingURL=chunk-T5NDUMLD.cjs.map
|
|
135
|
+
//# sourceMappingURL=chunk-T5NDUMLD.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/charts/bar/bar-type.ts"],"names":["prepareData","getBandwidth","formatNum","path","rect","group"],"mappings":"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","file":"chunk-R6ZDSXN7.cjs","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareData } from '../../data/prepare'\nimport { group, rect, path } from '../../render/tree'\nimport { formatNum } from '../../utils/format'\nimport { getBandwidth } from '../../utils/scale'\n\nexport const barChartType: ChartTypePlugin = {\n type: 'bar',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n const prepared = prepareData(data, options)\n\n // Bar charts should always include 0 in the y-axis range\n // unless the user explicitly set yMin/yMax\n if (options.yMin === undefined && prepared.bounds.yMin > 0) {\n prepared.bounds.yMin = 0\n }\n if (options.yMax === undefined && prepared.bounds.yMax < 0) {\n prepared.bounds.yMax = 0\n }\n\n return prepared\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, options, xScale, yScale } = ctx\n const nodes: RenderNode[] = []\n\n const seriesCount = data.series.length\n const pointCount = data.series[0]?.values.length ?? 0\n if (pointCount === 0) return nodes\n\n const bw = getBandwidth(xScale)\n const groupWidth = bw * (1 - options.barGap)\n const barWidth = groupWidth / seriesCount\n const groupOffset = -groupWidth / 2\n\n const baseline = yScale.map(Math.max(0, yScale.getDomain()[0] as number))\n\n for (const series of data.series) {\n const barNodes: RenderNode[] = []\n\n for (let i = 0; i < series.values.length; i++) {\n const cx = xScale.map(i)\n const barX = cx + groupOffset + series.index * barWidth\n const vy = yScale.map(series.values[i]!)\n\n // Handle positive and negative values\n const y = series.values[i]! >= 0 ? vy : baseline\n const h = Math.abs(vy - baseline)\n\n const r = Math.min(options.barRadius, barWidth / 2, h / 2)\n const isPositive = series.values[i]! >= 0\n\n const barFill = `url(#chartts-bar-${series.index})`\n\n if (r > 0 && h > r * 2) {\n const d = isPositive\n ? `M${formatNum(barX)},${formatNum(y + h)}V${formatNum(y + r)}Q${formatNum(barX)},${formatNum(y)},${formatNum(barX + r)},${formatNum(y)}H${formatNum(barX + barWidth - r)}Q${formatNum(barX + barWidth)},${formatNum(y)},${formatNum(barX + barWidth)},${formatNum(y + r)}V${formatNum(y + h)}Z`\n : `M${formatNum(barX)},${formatNum(y)}V${formatNum(y + h - r)}Q${formatNum(barX)},${formatNum(y + h)},${formatNum(barX + r)},${formatNum(y + h)}H${formatNum(barX + barWidth - r)}Q${formatNum(barX + barWidth)},${formatNum(y + h)},${formatNum(barX + barWidth)},${formatNum(y + h - r)}V${formatNum(y)}Z`\n\n barNodes.push(path(d, {\n class: 'chartts-bar',\n fill: barFill,\n 'data-series': series.index,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${series.name}: ${series.values[i]}`,\n }))\n } else {\n barNodes.push(rect(barX, y, barWidth, h, {\n class: 'chartts-bar',\n fill: barFill,\n 'data-series': series.index,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${series.name}: ${series.values[i]}`,\n }))\n }\n }\n\n nodes.push(group(barNodes, {\n class: `chartts-series chartts-series-${series.index}`,\n 'data-series-name': series.name,\n }))\n }\n\n return nodes\n },\n\n getHighlightNodes(ctx: RenderContext, hit: HitResult): RenderNode[] {\n const { data, xScale, yScale, options } = ctx\n const seriesCount = data.series.length\n const bw = getBandwidth(xScale)\n const groupWidth = bw * (1 - options.barGap)\n const barWidth = groupWidth / seriesCount\n const groupOffset = -groupWidth / 2\n const baseline = yScale.map(Math.max(0, yScale.getDomain()[0] as number))\n\n const series = data.series[hit.seriesIndex]\n if (!series) return []\n const i = hit.pointIndex\n const cx = xScale.map(i)\n const barX = cx + groupOffset + series.index * barWidth\n const vy = yScale.map(series.values[i]!)\n const y = series.values[i]! >= 0 ? vy : baseline\n const h = Math.abs(vy - baseline)\n\n // Bright outline around the hovered bar\n return [\n rect(barX - 1, y - 1, barWidth + 2, h + 2, {\n class: 'chartts-highlight-bar',\n fill: 'none',\n stroke: series.color,\n strokeWidth: 2,\n strokeOpacity: 0.8,\n }),\n ]\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { data, xScale, yScale, options } = ctx\n const seriesCount = data.series.length\n const pointCount = data.series[0]?.values.length ?? 0\n if (pointCount === 0) return null\n\n const bw = getBandwidth(xScale)\n const groupWidth = bw * (1 - options.barGap)\n const barWidth = groupWidth / seriesCount\n const groupOffset = -groupWidth / 2\n const baseline = yScale.map(Math.max(0, yScale.getDomain()[0] as number))\n\n let best: HitResult | null = null\n let bestDist = Infinity\n\n for (const series of data.series) {\n for (let i = 0; i < series.values.length; i++) {\n const cx = xScale.map(i)\n const barX = cx + groupOffset + series.index * barWidth\n const vy = yScale.map(series.values[i]!)\n const y = series.values[i]! >= 0 ? vy : baseline\n const h = Math.abs(vy - baseline)\n\n // Check if mouse is inside bar bounds (with small padding)\n if (mx >= barX - 2 && mx <= barX + barWidth + 2 && my >= y - 2 && my <= y + h + 2) {\n const dist = 0\n if (dist < bestDist) {\n bestDist = dist\n best = { seriesIndex: series.index, pointIndex: i, distance: dist, x: cx, y: vy }\n }\n }\n }\n }\n\n return best\n },\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/charts/bar/bar-type.ts"],"names":["prepareData","getBandwidth","formatNum","path","rect","group"],"mappings":"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","file":"chunk-T5NDUMLD.cjs","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareData } from '../../data/prepare'\nimport { group, rect, path } from '../../render/tree'\nimport { formatNum } from '../../utils/format'\nimport { getBandwidth } from '../../utils/scale'\n\nexport const barChartType: ChartTypePlugin = {\n type: 'bar',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n const prepared = prepareData(data, options)\n\n // Bar charts should always include 0 in the y-axis range\n // unless the user explicitly set yMin/yMax\n if (options.yMin === undefined && prepared.bounds.yMin > 0) {\n prepared.bounds.yMin = 0\n }\n if (options.yMax === undefined && prepared.bounds.yMax < 0) {\n prepared.bounds.yMax = 0\n }\n\n return prepared\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, options, xScale, yScale } = ctx\n const nodes: RenderNode[] = []\n\n const seriesCount = data.series.length\n const pointCount = data.series[0]?.values.length ?? 0\n if (pointCount === 0) return nodes\n\n const bw = getBandwidth(xScale)\n const groupWidth = bw * (1 - options.barGap)\n const barWidth = groupWidth / seriesCount\n const groupOffset = -groupWidth / 2\n\n const baseline = yScale.map(Math.max(0, yScale.getDomain()[0] as number))\n\n for (const series of data.series) {\n const barNodes: RenderNode[] = []\n\n for (let i = 0; i < series.values.length; i++) {\n const cx = xScale.map(i)\n const barX = cx + groupOffset + series.index * barWidth\n const vy = yScale.map(series.values[i]!)\n\n // Handle positive and negative values\n const y = series.values[i]! >= 0 ? vy : baseline\n const h = Math.abs(vy - baseline)\n\n const r = Math.min(options.barRadius, barWidth / 2, h / 2)\n const isPositive = series.values[i]! >= 0\n\n const barFill = `url(#chartts-bar-${series.index})`\n\n if (r > 0 && h > r * 2) {\n const d = isPositive\n ? `M${formatNum(barX)},${formatNum(y + h)}V${formatNum(y + r)}Q${formatNum(barX)},${formatNum(y)},${formatNum(barX + r)},${formatNum(y)}H${formatNum(barX + barWidth - r)}Q${formatNum(barX + barWidth)},${formatNum(y)},${formatNum(barX + barWidth)},${formatNum(y + r)}V${formatNum(y + h)}Z`\n : `M${formatNum(barX)},${formatNum(y)}V${formatNum(y + h - r)}Q${formatNum(barX)},${formatNum(y + h)},${formatNum(barX + r)},${formatNum(y + h)}H${formatNum(barX + barWidth - r)}Q${formatNum(barX + barWidth)},${formatNum(y + h)},${formatNum(barX + barWidth)},${formatNum(y + h - r)}V${formatNum(y)}Z`\n\n barNodes.push(path(d, {\n class: 'chartts-bar',\n fill: barFill,\n 'data-series': series.index,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${series.name}: ${series.values[i]}`,\n }))\n } else {\n barNodes.push(rect(barX, y, barWidth, h, {\n class: 'chartts-bar',\n fill: barFill,\n 'data-series': series.index,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${series.name}: ${series.values[i]}`,\n }))\n }\n }\n\n nodes.push(group(barNodes, {\n class: `chartts-series chartts-series-${series.index}`,\n 'data-series-name': series.name,\n }))\n }\n\n return nodes\n },\n\n getHighlightNodes(ctx: RenderContext, hit: HitResult): RenderNode[] {\n const { data, xScale, yScale, options } = ctx\n const seriesCount = data.series.length\n const bw = getBandwidth(xScale)\n const groupWidth = bw * (1 - options.barGap)\n const barWidth = groupWidth / seriesCount\n const groupOffset = -groupWidth / 2\n const baseline = yScale.map(Math.max(0, yScale.getDomain()[0] as number))\n\n const series = data.series[hit.seriesIndex]\n if (!series) return []\n const i = hit.pointIndex\n const cx = xScale.map(i)\n const barX = cx + groupOffset + series.index * barWidth\n const vy = yScale.map(series.values[i]!)\n const y = series.values[i]! >= 0 ? vy : baseline\n const h = Math.abs(vy - baseline)\n\n // Bright outline around the hovered bar\n return [\n rect(barX - 1, y - 1, barWidth + 2, h + 2, {\n class: 'chartts-highlight-bar',\n fill: 'none',\n stroke: series.color,\n strokeWidth: 2,\n strokeOpacity: 0.8,\n }),\n ]\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { data, xScale, yScale, options } = ctx\n const seriesCount = data.series.length\n const pointCount = data.series[0]?.values.length ?? 0\n if (pointCount === 0) return null\n\n const bw = getBandwidth(xScale)\n const groupWidth = bw * (1 - options.barGap)\n const barWidth = groupWidth / seriesCount\n const groupOffset = -groupWidth / 2\n const baseline = yScale.map(Math.max(0, yScale.getDomain()[0] as number))\n\n let best: HitResult | null = null\n let bestDist = Infinity\n\n for (const series of data.series) {\n for (let i = 0; i < series.values.length; i++) {\n const cx = xScale.map(i)\n const barX = cx + groupOffset + series.index * barWidth\n const vy = yScale.map(series.values[i]!)\n const y = series.values[i]! >= 0 ? vy : baseline\n const h = Math.abs(vy - baseline)\n\n // Check if mouse is inside bar bounds (with small padding)\n if (mx >= barX - 2 && mx <= barX + barWidth + 2 && my >= y - 2 && my <= y + h + 2) {\n const dist = 0\n if (dist < bestDist) {\n bestDist = dist\n best = { seriesIndex: series.index, pointIndex: i, distance: dist, x: cx, y: vy }\n }\n }\n }\n }\n\n return best\n },\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chunkNHGKZMD7_cjs = require('./chunk-NHGKZMD7.cjs');
|
|
4
|
-
var
|
|
4
|
+
var chunkW626EAS5_cjs = require('./chunk-W626EAS5.cjs');
|
|
5
5
|
|
|
6
6
|
// src/charts/volume/volume-type.ts
|
|
7
7
|
var volumeChartType = {
|
|
@@ -10,7 +10,7 @@ var volumeChartType = {
|
|
|
10
10
|
return { x: "categorical", y: "linear" };
|
|
11
11
|
},
|
|
12
12
|
prepareData(data, options) {
|
|
13
|
-
const prepared =
|
|
13
|
+
const prepared = chunkW626EAS5_cjs.prepareData(data, options);
|
|
14
14
|
if (prepared.bounds.yMin > 0) prepared.bounds.yMin = 0;
|
|
15
15
|
return prepared;
|
|
16
16
|
},
|
|
@@ -37,7 +37,7 @@ var volumeChartType = {
|
|
|
37
37
|
const barHeight = Math.max(baseline - yTop, 1);
|
|
38
38
|
const dir = directions[i] ?? "up";
|
|
39
39
|
const color = dir === "up" ? upColor : downColor;
|
|
40
|
-
barNodes.push(
|
|
40
|
+
barNodes.push(chunkW626EAS5_cjs.rect(cx - barWidth / 2, yTop, barWidth, barHeight, {
|
|
41
41
|
rx: 1,
|
|
42
42
|
ry: 1,
|
|
43
43
|
class: "chartts-volume-bar",
|
|
@@ -50,7 +50,7 @@ var volumeChartType = {
|
|
|
50
50
|
ariaLabel: `${data.labels[i] ?? i}: ${val} (${dir})`
|
|
51
51
|
}));
|
|
52
52
|
}
|
|
53
|
-
nodes.push(
|
|
53
|
+
nodes.push(chunkW626EAS5_cjs.group(barNodes, {
|
|
54
54
|
class: "chartts-series chartts-series-0",
|
|
55
55
|
"data-series-name": series.name
|
|
56
56
|
}));
|
|
@@ -77,5 +77,5 @@ var volumeChartType = {
|
|
|
77
77
|
};
|
|
78
78
|
|
|
79
79
|
exports.volumeChartType = volumeChartType;
|
|
80
|
-
//# sourceMappingURL=chunk-
|
|
81
|
-
//# sourceMappingURL=chunk-
|
|
80
|
+
//# sourceMappingURL=chunk-TKHYY3B5.cjs.map
|
|
81
|
+
//# sourceMappingURL=chunk-TKHYY3B5.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/charts/volume/volume-type.ts"],"names":["prepareData","getBandwidth","rect","group"],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/charts/volume/volume-type.ts"],"names":["prepareData","getBandwidth","rect","group"],"mappings":"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","file":"chunk-TKHYY3B5.cjs","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareData } from '../../data/prepare'\nimport { group, rect } from '../../render/tree'\nimport { getBandwidth } from '../../utils/scale'\n\nexport interface VolumeOptions {\n /** Explicit direction per bar: 'up' or 'down'. Auto-detected if omitted. */\n directions?: ('up' | 'down')[]\n /** Up color (volume on up-price day). Default green. */\n upColor?: string\n /** Down color (volume on down-price day). Default red. */\n downColor?: string\n /** Gap between bars as fraction of bandwidth. Default 0.2. */\n gap?: number\n}\n\n/**\n * Volume chart — vertical bars colored by price direction.\n *\n * Essential companion to candlestick/OHLC price charts.\n * Green bars = volume on up days, red bars = volume on down days.\n */\nexport const volumeChartType: ChartTypePlugin = {\n type: 'volume',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n const prepared = prepareData(data, options)\n // Volume always starts at zero\n if (prepared.bounds.yMin > 0) prepared.bounds.yMin = 0\n return prepared\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, xScale, yScale, area, options } = ctx\n const nodes: RenderNode[] = []\n\n const series = data.series[0]\n if (!series) return nodes\n\n const opts = options as unknown as VolumeOptions\n const upColor = opts.upColor ?? 'var(--color-emerald-500, #10b981)'\n const downColor = opts.downColor ?? 'var(--color-red-500, #ef4444)'\n const gapFrac = opts.gap ?? 0.2\n\n const bw = getBandwidth(xScale)\n const barWidth = bw * (1 - gapFrac)\n const baseline = area.y + area.height\n\n // Auto-detect direction: current value vs previous\n const directions = opts.directions ?? series.values.map((v, i) =>\n i === 0 ? 'up' as const : (v >= series.values[i - 1]! ? 'up' as const : 'down' as const),\n )\n\n const barNodes: RenderNode[] = []\n\n for (let i = 0; i < series.values.length; i++) {\n const val = series.values[i]!\n const cx = xScale.map(i)\n const yTop = yScale.map(val)\n const barHeight = Math.max(baseline - yTop, 1)\n const dir = directions[i] ?? 'up'\n const color = dir === 'up' ? upColor : downColor\n\n barNodes.push(rect(cx - barWidth / 2, yTop, barWidth, barHeight, {\n rx: 1, ry: 1,\n class: 'chartts-volume-bar',\n fill: color,\n fillOpacity: 0.85,\n 'data-series': 0,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${data.labels[i] ?? i}: ${val} (${dir})`,\n }))\n }\n\n nodes.push(group(barNodes, {\n class: 'chartts-series chartts-series-0',\n 'data-series-name': series.name,\n }))\n\n return nodes\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { data, xScale, yScale, area, options } = ctx\n const series = data.series[0]\n if (!series) return null\n\n const opts = options as unknown as VolumeOptions\n const gapFrac = opts.gap ?? 0.2\n const bw = getBandwidth(xScale)\n const barWidth = bw * (1 - gapFrac)\n const baseline = area.y + area.height\n\n for (let i = 0; i < series.values.length; i++) {\n const cx = xScale.map(i)\n const yTop = yScale.map(series.values[i]!)\n if (mx >= cx - barWidth / 2 && mx <= cx + barWidth / 2 && my >= yTop && my <= baseline) {\n return { seriesIndex: 0, pointIndex: i, distance: Math.abs(mx - cx), x: cx, y: yTop }\n }\n }\n\n return null\n },\n}\n"]}
|