@chartts/core 0.1.0 → 0.1.2
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/README.md +138 -0
- 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-E2S7RAT2.js → chunk-27E6G2GT.js} +3 -3
- package/dist/{chunk-E2S7RAT2.js.map → chunk-27E6G2GT.js.map} +1 -1
- package/dist/{chunk-ROYZ7W4M.cjs → chunk-2KMMVJEE.cjs} +6 -6
- package/dist/{chunk-ROYZ7W4M.cjs.map → chunk-2KMMVJEE.cjs.map} +1 -1
- package/dist/{chunk-QZ4ZYTP6.js → chunk-2L46SAT7.js} +4 -4
- package/dist/{chunk-QZ4ZYTP6.js.map → chunk-2L46SAT7.js.map} +1 -1
- package/dist/{chunk-MVWERW4G.cjs → chunk-2PRCN5OJ.cjs} +6 -6
- package/dist/{chunk-MVWERW4G.cjs.map → chunk-2PRCN5OJ.cjs.map} +1 -1
- package/dist/{chunk-B54L2CPW.cjs → chunk-3N447NTJ.cjs} +13 -13
- package/dist/{chunk-B54L2CPW.cjs.map → chunk-3N447NTJ.cjs.map} +1 -1
- package/dist/{chunk-7YV56WPE.js → chunk-3NWZJCWL.js} +4 -4
- package/dist/{chunk-7YV56WPE.js.map → chunk-3NWZJCWL.js.map} +1 -1
- package/dist/{chunk-O5KGKQSU.js → chunk-3QXN7JBV.js} +4 -4
- package/dist/{chunk-O5KGKQSU.js.map → chunk-3QXN7JBV.js.map} +1 -1
- package/dist/{chunk-XHQWWR5M.cjs → chunk-3TLJCGGQ.cjs} +71 -37
- package/dist/chunk-3TLJCGGQ.cjs.map +1 -0
- package/dist/{chunk-BXX2EPFE.cjs → chunk-3YFDZGHO.cjs} +12 -12
- package/dist/{chunk-BXX2EPFE.cjs.map → chunk-3YFDZGHO.cjs.map} +1 -1
- package/dist/{chunk-LEJGLR2P.cjs → chunk-43WDYYVH.cjs} +8 -8
- package/dist/{chunk-LEJGLR2P.cjs.map → chunk-43WDYYVH.cjs.map} +1 -1
- package/dist/{chunk-SUNC3CPV.js → chunk-4ABM7UYD.js} +3 -3
- package/dist/{chunk-SUNC3CPV.js.map → chunk-4ABM7UYD.js.map} +1 -1
- package/dist/{chunk-Z6E3XVP2.cjs → chunk-5LQ26P4J.cjs} +10 -10
- package/dist/{chunk-Z6E3XVP2.cjs.map → chunk-5LQ26P4J.cjs.map} +1 -1
- package/dist/{chunk-SJS4ISBA.js → chunk-5M624BRW.js} +3 -3
- package/dist/{chunk-SJS4ISBA.js.map → chunk-5M624BRW.js.map} +1 -1
- package/dist/{chunk-4VG47RLS.js → chunk-6WJJ26J5.js} +4 -4
- package/dist/{chunk-4VG47RLS.js.map → chunk-6WJJ26J5.js.map} +1 -1
- package/dist/{chunk-HOOOCSU4.js → chunk-7HOU6XMW.js} +4 -4
- package/dist/{chunk-HOOOCSU4.js.map → chunk-7HOU6XMW.js.map} +1 -1
- package/dist/{chunk-M4AQD6WX.cjs → chunk-7JN6GXML.cjs} +10 -10
- package/dist/{chunk-M4AQD6WX.cjs.map → chunk-7JN6GXML.cjs.map} +1 -1
- package/dist/{chunk-LUTU4WW3.js → chunk-7MXBXWVD.js} +4 -4
- package/dist/{chunk-LUTU4WW3.js.map → chunk-7MXBXWVD.js.map} +1 -1
- package/dist/{chunk-22LR6CFM.js → chunk-AA45U5KV.js} +4 -4
- package/dist/{chunk-22LR6CFM.js.map → chunk-AA45U5KV.js.map} +1 -1
- package/dist/{chunk-GNRRK7TZ.cjs → chunk-AAKS22M3.cjs} +11 -11
- package/dist/{chunk-GNRRK7TZ.cjs.map → chunk-AAKS22M3.cjs.map} +1 -1
- package/dist/{chunk-J6NPRKT4.cjs → chunk-ALRCYQQX.cjs} +6 -6
- package/dist/{chunk-J6NPRKT4.cjs.map → chunk-ALRCYQQX.cjs.map} +1 -1
- package/dist/{chunk-KVI6DN3R.js → chunk-ARQLGTTV.js} +4 -4
- package/dist/{chunk-KVI6DN3R.js.map → chunk-ARQLGTTV.js.map} +1 -1
- package/dist/{chunk-H4RNJ7FK.cjs → chunk-B7IV2PB3.cjs} +8 -8
- package/dist/{chunk-H4RNJ7FK.cjs.map → chunk-B7IV2PB3.cjs.map} +1 -1
- package/dist/{chunk-CMEXNS5V.js → chunk-BMEMMYVF.js} +4 -4
- package/dist/{chunk-CMEXNS5V.js.map → chunk-BMEMMYVF.js.map} +1 -1
- package/dist/{chunk-3BRQGYDX.js → chunk-BMTVFAX2.js} +71 -37
- package/dist/chunk-BMTVFAX2.js.map +1 -0
- package/dist/{chunk-BR3KTAGW.js → chunk-CCHMQZIB.js} +4 -4
- package/dist/{chunk-BR3KTAGW.js.map → chunk-CCHMQZIB.js.map} +1 -1
- package/dist/{chunk-NQSC7CKN.js → chunk-CHERQT4B.js} +3 -3
- package/dist/{chunk-NQSC7CKN.js.map → chunk-CHERQT4B.js.map} +1 -1
- package/dist/chunk-CJEMSKW3.js +356 -0
- package/dist/chunk-CJEMSKW3.js.map +1 -0
- package/dist/{chunk-3TTTELGB.cjs → chunk-COPERSVL.cjs} +15 -15
- package/dist/{chunk-3TTTELGB.cjs.map → chunk-COPERSVL.cjs.map} +1 -1
- package/dist/chunk-D2IP3MWJ.cjs +360 -0
- package/dist/chunk-D2IP3MWJ.cjs.map +1 -0
- package/dist/{chunk-M4UST3UU.cjs → chunk-DAH76GIX.cjs} +10 -10
- package/dist/{chunk-M4UST3UU.cjs.map → chunk-DAH76GIX.cjs.map} +1 -1
- package/dist/{chunk-TOS2RYHQ.js → chunk-DKVRRL3F.js} +4 -4
- package/dist/{chunk-TOS2RYHQ.js.map → chunk-DKVRRL3F.js.map} +1 -1
- package/dist/{chunk-SKVCPG5R.cjs → chunk-DZHP4UUE.cjs} +11 -11
- package/dist/{chunk-SKVCPG5R.cjs.map → chunk-DZHP4UUE.cjs.map} +1 -1
- package/dist/{chunk-NMLDPXOL.js → chunk-DZKYVTV3.js} +4 -4
- package/dist/{chunk-NMLDPXOL.js.map → chunk-DZKYVTV3.js.map} +1 -1
- package/dist/{chunk-66HSJRRH.js → chunk-DZW35WR2.js} +4 -4
- package/dist/{chunk-66HSJRRH.js.map → chunk-DZW35WR2.js.map} +1 -1
- package/dist/{chunk-FFJ6BVEY.cjs → chunk-EAKXLFOR.cjs} +9 -9
- package/dist/{chunk-FFJ6BVEY.cjs.map → chunk-EAKXLFOR.cjs.map} +1 -1
- package/dist/{chunk-QHJHYV3H.cjs → chunk-EFRBTSUO.cjs} +4 -4
- package/dist/{chunk-QHJHYV3H.cjs.map → chunk-EFRBTSUO.cjs.map} +1 -1
- package/dist/{chunk-QIJZZOX7.js → chunk-EYN74SQ5.js} +4 -4
- package/dist/{chunk-QIJZZOX7.js.map → chunk-EYN74SQ5.js.map} +1 -1
- package/dist/{chunk-Y54XVNXB.cjs → chunk-FEQKBVCZ.cjs} +13 -13
- package/dist/{chunk-Y54XVNXB.cjs.map → chunk-FEQKBVCZ.cjs.map} +1 -1
- package/dist/{chunk-UQBDGCS6.cjs → chunk-FIAKZSRR.cjs} +7 -7
- package/dist/{chunk-UQBDGCS6.cjs.map → chunk-FIAKZSRR.cjs.map} +1 -1
- package/dist/{chunk-HB4EGHJ7.cjs → chunk-FKAA5FNG.cjs} +9 -9
- package/dist/{chunk-HB4EGHJ7.cjs.map → chunk-FKAA5FNG.cjs.map} +1 -1
- package/dist/{chunk-NYVFC2SF.js → chunk-FKVYS4RB.js} +3 -3
- package/dist/{chunk-NYVFC2SF.js.map → chunk-FKVYS4RB.js.map} +1 -1
- package/dist/{chunk-ZDZQG3GH.cjs → chunk-FQG4DRJS.cjs} +13 -13
- package/dist/chunk-FQG4DRJS.cjs.map +1 -0
- package/dist/{chunk-GM3ZO5WV.js → chunk-FSKUEB7P.js} +3 -3
- package/dist/{chunk-GM3ZO5WV.js.map → chunk-FSKUEB7P.js.map} +1 -1
- package/dist/{chunk-NONU7KUN.cjs → chunk-FTKL3UAN.cjs} +6 -6
- package/dist/{chunk-NONU7KUN.cjs.map → chunk-FTKL3UAN.cjs.map} +1 -1
- package/dist/{chunk-ZL25X5WW.js → chunk-GI7PBJSK.js} +3 -3
- package/dist/{chunk-ZL25X5WW.js.map → chunk-GI7PBJSK.js.map} +1 -1
- package/dist/{chunk-NFD6VAVM.js → chunk-GL3M7MAM.js} +3 -3
- package/dist/{chunk-NFD6VAVM.js.map → chunk-GL3M7MAM.js.map} +1 -1
- package/dist/{chunk-3XVGEBR4.js → chunk-GMLJDDHZ.js} +3 -3
- package/dist/{chunk-3XVGEBR4.js.map → chunk-GMLJDDHZ.js.map} +1 -1
- package/dist/{chunk-N6IVODRJ.js → chunk-GQR7IHER.js} +4 -4
- package/dist/{chunk-N6IVODRJ.js.map → chunk-GQR7IHER.js.map} +1 -1
- package/dist/{chunk-MYPCA25Y.cjs → chunk-GUVPVNPD.cjs} +10 -10
- package/dist/{chunk-MYPCA25Y.cjs.map → chunk-GUVPVNPD.cjs.map} +1 -1
- package/dist/{chunk-5QOQR5FE.cjs → chunk-HOPFELRP.cjs} +4 -4
- package/dist/{chunk-5QOQR5FE.cjs.map → chunk-HOPFELRP.cjs.map} +1 -1
- package/dist/{chunk-FRWC6GUR.cjs → chunk-IAE4VRB7.cjs} +9 -9
- package/dist/{chunk-FRWC6GUR.cjs.map → chunk-IAE4VRB7.cjs.map} +1 -1
- package/dist/{chunk-BYXRFTEI.cjs → chunk-ID7GYRYL.cjs} +10 -10
- package/dist/{chunk-BYXRFTEI.cjs.map → chunk-ID7GYRYL.cjs.map} +1 -1
- package/dist/{chunk-QLRK46YY.cjs → chunk-IKUA7O73.cjs} +7 -7
- package/dist/{chunk-QLRK46YY.cjs.map → chunk-IKUA7O73.cjs.map} +1 -1
- package/dist/{chunk-HDWWUEPD.js → chunk-IUYPKYOU.js} +4 -4
- package/dist/{chunk-HDWWUEPD.js.map → chunk-IUYPKYOU.js.map} +1 -1
- package/dist/{chunk-BC6KW2OG.js → chunk-IXFSJBJS.js} +3 -3
- package/dist/{chunk-BC6KW2OG.js.map → chunk-IXFSJBJS.js.map} +1 -1
- package/dist/{chunk-X2JNB5UN.js → chunk-JT6H7G52.js} +4 -4
- package/dist/{chunk-X2JNB5UN.js.map → chunk-JT6H7G52.js.map} +1 -1
- package/dist/{chunk-TW6KPQIS.js → chunk-K2EZ4SS4.js} +3 -3
- package/dist/{chunk-TW6KPQIS.js.map → chunk-K2EZ4SS4.js.map} +1 -1
- package/dist/{chunk-KE7ILTM4.cjs → chunk-K7UR7GYC.cjs} +11 -11
- package/dist/{chunk-KE7ILTM4.cjs.map → chunk-K7UR7GYC.cjs.map} +1 -1
- package/dist/{chunk-TTOX27BZ.cjs → chunk-KEMT7F5H.cjs} +7 -7
- package/dist/{chunk-TTOX27BZ.cjs.map → chunk-KEMT7F5H.cjs.map} +1 -1
- package/dist/{chunk-FKYNRMPX.js → chunk-KHQRHTTN.js} +4 -4
- package/dist/{chunk-FKYNRMPX.js.map → chunk-KHQRHTTN.js.map} +1 -1
- package/dist/{chunk-ZDYCIP6N.cjs → chunk-KUFDELQM.cjs} +9 -9
- package/dist/{chunk-ZDYCIP6N.cjs.map → chunk-KUFDELQM.cjs.map} +1 -1
- package/dist/{chunk-LB4MV5CG.js → chunk-L37ZPX6D.js} +3 -3
- package/dist/{chunk-LB4MV5CG.js.map → chunk-L37ZPX6D.js.map} +1 -1
- package/dist/{chunk-QAYX6XN3.js → chunk-LCEMO7NI.js} +3 -3
- package/dist/{chunk-QAYX6XN3.js.map → chunk-LCEMO7NI.js.map} +1 -1
- package/dist/{chunk-L54BZYAI.cjs → chunk-M6JYSINX.cjs} +6 -6
- package/dist/{chunk-L54BZYAI.cjs.map → chunk-M6JYSINX.cjs.map} +1 -1
- package/dist/{chunk-VPI7UGB3.cjs → chunk-MGYBMQAX.cjs} +8 -8
- package/dist/{chunk-VPI7UGB3.cjs.map → chunk-MGYBMQAX.cjs.map} +1 -1
- package/dist/{chunk-6KNBJ4CE.js → chunk-MQBKLKYF.js} +4 -4
- package/dist/{chunk-6KNBJ4CE.js.map → chunk-MQBKLKYF.js.map} +1 -1
- package/dist/{chunk-BRSHEDTZ.js → chunk-MVJKRPX7.js} +3 -3
- package/dist/{chunk-BRSHEDTZ.js.map → chunk-MVJKRPX7.js.map} +1 -1
- package/dist/{chunk-Q6U5D2ZB.cjs → chunk-MZCKMTQE.cjs} +9 -9
- package/dist/{chunk-Q6U5D2ZB.cjs.map → chunk-MZCKMTQE.cjs.map} +1 -1
- package/dist/{chunk-BEYG2HQ4.cjs → chunk-MZQY2FTP.cjs} +12 -12
- package/dist/{chunk-BEYG2HQ4.cjs.map → chunk-MZQY2FTP.cjs.map} +1 -1
- package/dist/{chunk-ETPZGEL7.cjs → chunk-N7NZQVIV.cjs} +6 -6
- package/dist/{chunk-ETPZGEL7.cjs.map → chunk-N7NZQVIV.cjs.map} +1 -1
- package/dist/{chunk-H2AE7JMU.js → chunk-NML7F34A.js} +3 -3
- package/dist/{chunk-H2AE7JMU.js.map → chunk-NML7F34A.js.map} +1 -1
- package/dist/{chunk-DNQ6N3VG.js → chunk-NQGZMWNT.js} +4 -4
- package/dist/{chunk-DNQ6N3VG.js.map → chunk-NQGZMWNT.js.map} +1 -1
- package/dist/{chunk-MLX3EO2C.js → chunk-NZWFBAFQ.js} +3 -3
- package/dist/{chunk-MLX3EO2C.js.map → chunk-NZWFBAFQ.js.map} +1 -1
- package/dist/{chunk-XBIM73HV.cjs → chunk-PCTMS2PX.cjs} +7 -7
- package/dist/{chunk-XBIM73HV.cjs.map → chunk-PCTMS2PX.cjs.map} +1 -1
- package/dist/{chunk-D2SV6YT3.js → chunk-QCR6L55R.js} +4 -4
- package/dist/{chunk-D2SV6YT3.js.map → chunk-QCR6L55R.js.map} +1 -1
- package/dist/{chunk-SZVK6RRQ.js → chunk-QRTYX5KO.js} +4 -4
- package/dist/{chunk-SZVK6RRQ.js.map → chunk-QRTYX5KO.js.map} +1 -1
- package/dist/{chunk-FUZFNUCJ.js → chunk-QXQSJ3FZ.js} +3 -3
- package/dist/{chunk-FUZFNUCJ.js.map → chunk-QXQSJ3FZ.js.map} +1 -1
- package/dist/{chunk-7SEHTEMR.js → chunk-RLH3PS3Y.js} +3 -3
- package/dist/{chunk-7SEHTEMR.js.map → chunk-RLH3PS3Y.js.map} +1 -1
- package/dist/{chunk-Q2BDB5ZA.cjs → chunk-S64PTNT7.cjs} +8 -8
- package/dist/{chunk-Q2BDB5ZA.cjs.map → chunk-S64PTNT7.cjs.map} +1 -1
- package/dist/{chunk-6LKN3HRX.js → chunk-S6NGWPXC.js} +3 -3
- package/dist/{chunk-6LKN3HRX.js.map → chunk-S6NGWPXC.js.map} +1 -1
- package/dist/{chunk-4YJPBUX2.cjs → chunk-SC5BGA2N.cjs} +7 -7
- package/dist/{chunk-4YJPBUX2.cjs.map → chunk-SC5BGA2N.cjs.map} +1 -1
- package/dist/{chunk-KSRROKYC.cjs → chunk-SKREYNRK.cjs} +11 -11
- package/dist/{chunk-KSRROKYC.cjs.map → chunk-SKREYNRK.cjs.map} +1 -1
- package/dist/{chunk-2TWYS3BT.cjs → chunk-SLJNRP7O.cjs} +14 -14
- package/dist/{chunk-2TWYS3BT.cjs.map → chunk-SLJNRP7O.cjs.map} +1 -1
- package/dist/{chunk-Y2JZHX3P.cjs → chunk-T6LXFMBR.cjs} +8 -8
- package/dist/{chunk-Y2JZHX3P.cjs.map → chunk-T6LXFMBR.cjs.map} +1 -1
- package/dist/{chunk-RCVRZCCC.cjs → chunk-TIHVTKXS.cjs} +9 -9
- package/dist/{chunk-RCVRZCCC.cjs.map → chunk-TIHVTKXS.cjs.map} +1 -1
- package/dist/{chunk-DL7P72FA.cjs → chunk-TVPS2NJH.cjs} +10 -10
- package/dist/{chunk-DL7P72FA.cjs.map → chunk-TVPS2NJH.cjs.map} +1 -1
- package/dist/{chunk-SQJAKZ4W.js → chunk-U7GBOQXX.js} +4 -4
- package/dist/{chunk-SQJAKZ4W.js.map → chunk-U7GBOQXX.js.map} +1 -1
- package/dist/{chunk-6N66T7VQ.js → chunk-VGGKMTO6.js} +3 -3
- package/dist/{chunk-6N66T7VQ.js.map → chunk-VGGKMTO6.js.map} +1 -1
- package/dist/{chunk-7CGXK7KT.js → chunk-VJQCHBS6.js} +3 -3
- package/dist/{chunk-7CGXK7KT.js.map → chunk-VJQCHBS6.js.map} +1 -1
- package/dist/{chunk-4HK4RM3X.cjs → chunk-VK72MICB.cjs} +7 -7
- package/dist/{chunk-4HK4RM3X.cjs.map → chunk-VK72MICB.cjs.map} +1 -1
- package/dist/{chunk-EGQ4JCFU.cjs → chunk-WS2AL7GY.cjs} +7 -7
- package/dist/{chunk-EGQ4JCFU.cjs.map → chunk-WS2AL7GY.cjs.map} +1 -1
- package/dist/{chunk-Y4P4VY7A.cjs → chunk-XKDBNAHH.cjs} +10 -10
- package/dist/{chunk-Y4P4VY7A.cjs.map → chunk-XKDBNAHH.cjs.map} +1 -1
- package/dist/{chunk-UN7K3YQG.cjs → chunk-Y4HJCMB4.cjs} +6 -6
- package/dist/{chunk-UN7K3YQG.cjs.map → chunk-Y4HJCMB4.cjs.map} +1 -1
- package/dist/{chunk-SWYCVF46.js → chunk-YMJQUKKX.js} +8 -8
- package/dist/chunk-YMJQUKKX.js.map +1 -0
- 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 +10 -10
- package/dist/donut.js +5 -5
- 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.d.cts +1 -1
- package/dist/geo.d.ts +1 -1
- package/dist/geo.js +5 -5
- package/dist/graph.cjs +10 -10
- 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 +179 -179
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +91 -91
- 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/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 +10 -10
- package/dist/pie.js +5 -5
- package/dist/polar.cjs +10 -10
- package/dist/polar.js +5 -5
- 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 +10 -10
- package/dist/sunburst.js +5 -5
- 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/volume.cjs +9 -9
- package/dist/volume.js +4 -4
- package/dist/waterfall.cjs +9 -9
- package/dist/waterfall.js +4 -4
- package/dist/{world-regions-cMulhqDW.d.cts → world-regions-D-TCHPZP.d.cts} +0 -12
- package/dist/{world-regions-Cfvxpbx0.d.ts → world-regions-DjMvYgFu.d.ts} +0 -12
- package/package.json +14 -4
- package/dist/chunk-3BRQGYDX.js.map +0 -1
- package/dist/chunk-JO6U4YR4.js +0 -355
- package/dist/chunk-JO6U4YR4.js.map +0 -1
- package/dist/chunk-MLD5ZIDO.cjs +0 -359
- package/dist/chunk-MLD5ZIDO.cjs.map +0 -1
- package/dist/chunk-SWYCVF46.js.map +0 -1
- package/dist/chunk-XHQWWR5M.cjs.map +0 -1
- package/dist/chunk-ZDZQG3GH.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/charts/candlestick/candlestick-type.ts"],"names":["prepareData","getBandwidth","rect","group"],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/charts/candlestick/candlestick-type.ts"],"names":["prepareData","getBandwidth","rect","group"],"mappings":"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","file":"chunk-M6JYSINX.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 CandlestickOptions {\n /** OHLC data: { open, high, low, close } arrays. */\n ohlc?: {\n open: number[]\n high: number[]\n low: number[]\n close: number[]\n }\n /** Up candle color. Default green. */\n upColor?: string\n /** Down candle color. Default red. */\n downColor?: string\n /** Wick width. Default 1.5. */\n wickWidth?: number\n}\n\n/**\n * Candlestick / OHLC chart for financial data.\n *\n * Pass OHLC data via options:\n * ```ts\n * Candlestick('#el', {\n * data: { labels: ['Mon','Tue','Wed'], series: [{ name: 'AAPL', values: [150, 152, 148] }] },\n * ohlc: {\n * open: [148, 150, 152],\n * high: [153, 155, 154],\n * low: [146, 149, 147],\n * close: [150, 152, 148],\n * }\n * })\n * ```\n * The series values are used as close prices for scale computation.\n */\nexport const candlestickChartType: ChartTypePlugin = {\n type: 'candlestick',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n const cOpts = options as unknown as CandlestickOptions\n const ohlc = cOpts.ohlc\n\n // Expand bounds to include all OHLC values\n const prepared = prepareData(data, options)\n\n if (ohlc) {\n let yMin = prepared.bounds.yMin\n let yMax = prepared.bounds.yMax\n for (let i = 0; i < ohlc.high.length; i++) {\n if (ohlc.high[i]! < yMin) yMin = ohlc.high[i]!\n if (ohlc.high[i]! > yMax) yMax = ohlc.high[i]!\n if (ohlc.low[i]! < yMin) yMin = ohlc.low[i]!\n if (ohlc.low[i]! > yMax) yMax = ohlc.low[i]!\n }\n prepared.bounds.yMin = yMin\n prepared.bounds.yMax = yMax\n }\n\n return prepared\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, xScale, yScale, options } = ctx\n const nodes: RenderNode[] = []\n\n const cOpts = options as unknown as CandlestickOptions\n const ohlc = cOpts.ohlc\n if (!ohlc) return nodes\n\n const series = data.series[0]\n if (!series) return nodes\n\n const upColor = cOpts.upColor ?? 'var(--color-emerald-500, #10b981)'\n const downColor = cOpts.downColor ?? 'var(--color-red-500, #ef4444)'\n const wickWidth = cOpts.wickWidth ?? 1.5\n\n // Get bandwidth for candle width\n const bw = getBandwidth(xScale)\n const candleWidth = bw * 0.6\n\n const candleNodes: RenderNode[] = []\n\n for (let i = 0; i < ohlc.open.length; i++) {\n const open = ohlc.open[i]!\n const high = ohlc.high[i]!\n const low = ohlc.low[i]!\n const close = ohlc.close[i]!\n\n const cx = xScale.map(i)\n const isUp = close >= open\n const color = isUp ? upColor : downColor\n\n const yHigh = yScale.map(high)\n const yLow = yScale.map(low)\n const yOpen = yScale.map(open)\n const yClose = yScale.map(close)\n\n const bodyTop = Math.min(yOpen, yClose)\n const bodyHeight = Math.max(Math.abs(yOpen - yClose), 1)\n\n // Wick (high-low line)\n candleNodes.push({\n type: 'line',\n x1: cx,\n y1: yHigh,\n x2: cx,\n y2: yLow,\n attrs: {\n class: 'chartts-wick',\n stroke: color,\n strokeWidth: wickWidth,\n 'data-series': 0,\n 'data-index': i,\n },\n })\n\n // Body (open-close rect)\n candleNodes.push(rect(cx - candleWidth / 2, bodyTop, candleWidth, bodyHeight, {\n rx: 2, ry: 2,\n class: 'chartts-candle',\n fill: isUp ? color : color,\n stroke: color,\n strokeWidth: 1,\n 'data-series': 0,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${data.labels[i] ?? i}: O${open} H${high} L${low} C${close}`,\n }))\n }\n\n nodes.push(group(candleNodes, {\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 { xScale, options } = ctx\n const cOpts = options as unknown as CandlestickOptions\n const ohlc = cOpts.ohlc\n if (!ohlc) return null\n\n const bw = getBandwidth(xScale)\n const candleWidth = bw * 0.6\n\n for (let i = 0; i < ohlc.open.length; i++) {\n const cx = xScale.map(i)\n if (mx >= cx - candleWidth / 2 - 4 && mx <= cx + candleWidth / 2 + 4) {\n return { seriesIndex: 0, pointIndex: i, distance: Math.abs(mx - cx) }\n }\n }\n\n return null\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 chunk3TLJCGGQ_cjs = require('./chunk-3TLJCGGQ.cjs');
|
|
6
6
|
|
|
7
7
|
// src/charts/bar/horizontal-bar-type.ts
|
|
8
8
|
var horizontalBarChartType = {
|
|
@@ -11,7 +11,7 @@ var horizontalBarChartType = {
|
|
|
11
11
|
return { x: "categorical", y: "linear" };
|
|
12
12
|
},
|
|
13
13
|
prepareData(data, options) {
|
|
14
|
-
const prepared =
|
|
14
|
+
const prepared = chunk3TLJCGGQ_cjs.prepareData(data, {
|
|
15
15
|
...options,
|
|
16
16
|
xAxis: false,
|
|
17
17
|
yAxis: false,
|
|
@@ -45,7 +45,7 @@ var horizontalBarChartType = {
|
|
|
45
45
|
const zeroX = valueToX(0);
|
|
46
46
|
for (let i = 0; i < pointCount; i++) {
|
|
47
47
|
const catCenter = area.y + categoryHeight * (i + 0.5);
|
|
48
|
-
nodes.push(
|
|
48
|
+
nodes.push(chunk3TLJCGGQ_cjs.text(area.x + labelWidth - 6, catCenter, String(data.labels[i] ?? ""), {
|
|
49
49
|
class: "chartts-hbar-label",
|
|
50
50
|
fill: theme.textMuted,
|
|
51
51
|
textAnchor: "end",
|
|
@@ -67,7 +67,7 @@ var horizontalBarChartType = {
|
|
|
67
67
|
const r = Math.min(options.barRadius, barHeight / 2, w / 2);
|
|
68
68
|
if (r > 0 && w > r * 2) {
|
|
69
69
|
const d = isPositive ? `M${chunkLU35QDPN_cjs.formatNum(x)},${chunkLU35QDPN_cjs.formatNum(barY)}H${chunkLU35QDPN_cjs.formatNum(x + w - r)}Q${chunkLU35QDPN_cjs.formatNum(x + w)},${chunkLU35QDPN_cjs.formatNum(barY)},${chunkLU35QDPN_cjs.formatNum(x + w)},${chunkLU35QDPN_cjs.formatNum(barY + r)}V${chunkLU35QDPN_cjs.formatNum(barY + barHeight - r)}Q${chunkLU35QDPN_cjs.formatNum(x + w)},${chunkLU35QDPN_cjs.formatNum(barY + barHeight)},${chunkLU35QDPN_cjs.formatNum(x + w - r)},${chunkLU35QDPN_cjs.formatNum(barY + barHeight)}H${chunkLU35QDPN_cjs.formatNum(x)}Z` : `M${chunkLU35QDPN_cjs.formatNum(x + w)},${chunkLU35QDPN_cjs.formatNum(barY)}H${chunkLU35QDPN_cjs.formatNum(x + r)}Q${chunkLU35QDPN_cjs.formatNum(x)},${chunkLU35QDPN_cjs.formatNum(barY)},${chunkLU35QDPN_cjs.formatNum(x)},${chunkLU35QDPN_cjs.formatNum(barY + r)}V${chunkLU35QDPN_cjs.formatNum(barY + barHeight - r)}Q${chunkLU35QDPN_cjs.formatNum(x)},${chunkLU35QDPN_cjs.formatNum(barY + barHeight)},${chunkLU35QDPN_cjs.formatNum(x + r)},${chunkLU35QDPN_cjs.formatNum(barY + barHeight)}H${chunkLU35QDPN_cjs.formatNum(x + w)}Z`;
|
|
70
|
-
barNodes.push(
|
|
70
|
+
barNodes.push(chunk3TLJCGGQ_cjs.path(d, {
|
|
71
71
|
class: "chartts-bar chartts-bar-horizontal",
|
|
72
72
|
fill: barFill,
|
|
73
73
|
"data-series": series.index,
|
|
@@ -77,7 +77,7 @@ var horizontalBarChartType = {
|
|
|
77
77
|
ariaLabel: `${series.name}: ${series.values[i]}`
|
|
78
78
|
}));
|
|
79
79
|
} else {
|
|
80
|
-
barNodes.push(
|
|
80
|
+
barNodes.push(chunk3TLJCGGQ_cjs.rect(x, barY, w, barHeight, {
|
|
81
81
|
class: "chartts-bar chartts-bar-horizontal",
|
|
82
82
|
fill: barFill,
|
|
83
83
|
"data-series": series.index,
|
|
@@ -88,7 +88,7 @@ var horizontalBarChartType = {
|
|
|
88
88
|
}));
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
|
-
nodes.push(
|
|
91
|
+
nodes.push(chunk3TLJCGGQ_cjs.group(barNodes, {
|
|
92
92
|
class: `chartts-series chartts-series-${series.index}`,
|
|
93
93
|
"data-series-name": series.name
|
|
94
94
|
}));
|
|
@@ -126,5 +126,5 @@ var horizontalBarChartType = {
|
|
|
126
126
|
};
|
|
127
127
|
|
|
128
128
|
exports.horizontalBarChartType = horizontalBarChartType;
|
|
129
|
-
//# sourceMappingURL=chunk-
|
|
130
|
-
//# sourceMappingURL=chunk-
|
|
129
|
+
//# sourceMappingURL=chunk-MGYBMQAX.cjs.map
|
|
130
|
+
//# sourceMappingURL=chunk-MGYBMQAX.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/charts/bar/horizontal-bar-type.ts"],"names":["prepareData","createHorizontalMapper","text","formatNum","path","rect","group"],"mappings":"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","file":"chunk-VPI7UGB3.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, text } from '../../render/tree'\nimport { formatNum } from '../../utils/format'\nimport { createHorizontalMapper } from '../../utils/scale'\n\n/**\n * Horizontal bar chart — bars grow left-to-right.\n *\n * Uses the xScale for categories (mapped to y positions) and yScale for values\n * (mapped to x positions), but transposes the rendering.\n */\nexport const horizontalBarChartType: ChartTypePlugin = {\n type: 'horizontal-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, {\n ...options,\n xAxis: false,\n yAxis: false,\n xGrid: false,\n yGrid: false,\n legend: false,\n })\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 return prepared\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, area, options, yScale, theme } = 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 // Reserve space for category labels on the left\n const labelWidth = Math.min(70, area.width * 0.2)\n const chartX = area.x + labelWidth\n const chartW = area.width - labelWidth\n\n // In horizontal mode:\n // - Y axis becomes categories\n // - X axis becomes value axis (use yScale for values mapped to x positions)\n const categoryHeight = area.height / pointCount\n const barGap = options.barGap\n const groupHeight = categoryHeight * (1 - barGap)\n const barHeight = groupHeight / seriesCount\n const groupOffset = -groupHeight / 2\n\n const valueToX = createHorizontalMapper(yScale, area, chartX, chartW)\n const zeroX = valueToX(0)\n\n // Category labels on the left\n for (let i = 0; i < pointCount; i++) {\n const catCenter = area.y + categoryHeight * (i + 0.5)\n nodes.push(text(area.x + labelWidth - 6, catCenter, String(data.labels[i] ?? ''), {\n class: 'chartts-hbar-label',\n fill: theme.textMuted,\n textAnchor: 'end',\n dominantBaseline: 'central',\n fontSize: theme.fontSizeSmall,\n fontFamily: theme.fontFamily,\n }))\n }\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 catCenter = area.y + categoryHeight * (i + 0.5)\n const barY = catCenter + groupOffset + series.index * barHeight\n const vx = valueToX(series.values[i]!)\n\n const x = Math.min(vx, zeroX)\n const w = Math.abs(vx - zeroX)\n const isPositive = series.values[i]! >= 0\n\n const barFill = `url(#chartts-bar-${series.index})`\n const r = Math.min(options.barRadius, barHeight / 2, w / 2)\n\n if (r > 0 && w > r * 2) {\n // Rounded right end for positive, left end for negative\n const d = isPositive\n ? `M${formatNum(x)},${formatNum(barY)}H${formatNum(x + w - r)}Q${formatNum(x + w)},${formatNum(barY)},${formatNum(x + w)},${formatNum(barY + r)}V${formatNum(barY + barHeight - r)}Q${formatNum(x + w)},${formatNum(barY + barHeight)},${formatNum(x + w - r)},${formatNum(barY + barHeight)}H${formatNum(x)}Z`\n : `M${formatNum(x + w)},${formatNum(barY)}H${formatNum(x + r)}Q${formatNum(x)},${formatNum(barY)},${formatNum(x)},${formatNum(barY + r)}V${formatNum(barY + barHeight - r)}Q${formatNum(x)},${formatNum(barY + barHeight)},${formatNum(x + r)},${formatNum(barY + barHeight)}H${formatNum(x + w)}Z`\n\n barNodes.push(path(d, {\n class: 'chartts-bar chartts-bar-horizontal',\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(x, barY, w, barHeight, {\n class: 'chartts-bar chartts-bar-horizontal',\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 hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { data, area, options, yScale } = 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 labelWidth = Math.min(70, area.width * 0.2)\n const chartX = area.x + labelWidth\n const chartW = area.width - labelWidth\n const categoryHeight = area.height / pointCount\n const groupHeight = categoryHeight * (1 - options.barGap)\n const barHeight = groupHeight / seriesCount\n const groupOffset = -groupHeight / 2\n\n const valueToX = createHorizontalMapper(yScale, area, chartX, chartW)\n const zeroX = valueToX(0)\n\n for (const series of data.series) {\n for (let i = 0; i < series.values.length; i++) {\n const catCenter = area.y + categoryHeight * (i + 0.5)\n const barY = catCenter + groupOffset + series.index * barHeight\n const vx = valueToX(series.values[i]!)\n const x = Math.min(vx, zeroX)\n const w = Math.abs(vx - zeroX)\n\n if (mx >= x - 2 && mx <= x + w + 2 && my >= barY - 2 && my <= barY + barHeight + 2) {\n return { seriesIndex: series.index, pointIndex: i, distance: 0 }\n }\n }\n }\n\n return null\n },\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/charts/bar/horizontal-bar-type.ts"],"names":["prepareData","createHorizontalMapper","text","formatNum","path","rect","group"],"mappings":"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","file":"chunk-MGYBMQAX.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, text } from '../../render/tree'\nimport { formatNum } from '../../utils/format'\nimport { createHorizontalMapper } from '../../utils/scale'\n\n/**\n * Horizontal bar chart — bars grow left-to-right.\n *\n * Uses the xScale for categories (mapped to y positions) and yScale for values\n * (mapped to x positions), but transposes the rendering.\n */\nexport const horizontalBarChartType: ChartTypePlugin = {\n type: 'horizontal-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, {\n ...options,\n xAxis: false,\n yAxis: false,\n xGrid: false,\n yGrid: false,\n legend: false,\n })\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 return prepared\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, area, options, yScale, theme } = 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 // Reserve space for category labels on the left\n const labelWidth = Math.min(70, area.width * 0.2)\n const chartX = area.x + labelWidth\n const chartW = area.width - labelWidth\n\n // In horizontal mode:\n // - Y axis becomes categories\n // - X axis becomes value axis (use yScale for values mapped to x positions)\n const categoryHeight = area.height / pointCount\n const barGap = options.barGap\n const groupHeight = categoryHeight * (1 - barGap)\n const barHeight = groupHeight / seriesCount\n const groupOffset = -groupHeight / 2\n\n const valueToX = createHorizontalMapper(yScale, area, chartX, chartW)\n const zeroX = valueToX(0)\n\n // Category labels on the left\n for (let i = 0; i < pointCount; i++) {\n const catCenter = area.y + categoryHeight * (i + 0.5)\n nodes.push(text(area.x + labelWidth - 6, catCenter, String(data.labels[i] ?? ''), {\n class: 'chartts-hbar-label',\n fill: theme.textMuted,\n textAnchor: 'end',\n dominantBaseline: 'central',\n fontSize: theme.fontSizeSmall,\n fontFamily: theme.fontFamily,\n }))\n }\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 catCenter = area.y + categoryHeight * (i + 0.5)\n const barY = catCenter + groupOffset + series.index * barHeight\n const vx = valueToX(series.values[i]!)\n\n const x = Math.min(vx, zeroX)\n const w = Math.abs(vx - zeroX)\n const isPositive = series.values[i]! >= 0\n\n const barFill = `url(#chartts-bar-${series.index})`\n const r = Math.min(options.barRadius, barHeight / 2, w / 2)\n\n if (r > 0 && w > r * 2) {\n // Rounded right end for positive, left end for negative\n const d = isPositive\n ? `M${formatNum(x)},${formatNum(barY)}H${formatNum(x + w - r)}Q${formatNum(x + w)},${formatNum(barY)},${formatNum(x + w)},${formatNum(barY + r)}V${formatNum(barY + barHeight - r)}Q${formatNum(x + w)},${formatNum(barY + barHeight)},${formatNum(x + w - r)},${formatNum(barY + barHeight)}H${formatNum(x)}Z`\n : `M${formatNum(x + w)},${formatNum(barY)}H${formatNum(x + r)}Q${formatNum(x)},${formatNum(barY)},${formatNum(x)},${formatNum(barY + r)}V${formatNum(barY + barHeight - r)}Q${formatNum(x)},${formatNum(barY + barHeight)},${formatNum(x + r)},${formatNum(barY + barHeight)}H${formatNum(x + w)}Z`\n\n barNodes.push(path(d, {\n class: 'chartts-bar chartts-bar-horizontal',\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(x, barY, w, barHeight, {\n class: 'chartts-bar chartts-bar-horizontal',\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 hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { data, area, options, yScale } = 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 labelWidth = Math.min(70, area.width * 0.2)\n const chartX = area.x + labelWidth\n const chartW = area.width - labelWidth\n const categoryHeight = area.height / pointCount\n const groupHeight = categoryHeight * (1 - options.barGap)\n const barHeight = groupHeight / seriesCount\n const groupOffset = -groupHeight / 2\n\n const valueToX = createHorizontalMapper(yScale, area, chartX, chartW)\n const zeroX = valueToX(0)\n\n for (const series of data.series) {\n for (let i = 0; i < series.values.length; i++) {\n const catCenter = area.y + categoryHeight * (i + 0.5)\n const barY = catCenter + groupOffset + series.index * barHeight\n const vx = valueToX(series.values[i]!)\n const x = Math.min(vx, zeroX)\n const w = Math.abs(vx - zeroX)\n\n if (mx >= x - 2 && mx <= x + w + 2 && my >= barY - 2 && my <= barY + barHeight + 2) {\n return { seriesIndex: series.index, pointIndex: i, distance: 0 }\n }\n }\n }\n\n return null\n },\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { prepareNoAxes } from './chunk-
|
|
2
|
-
import { path, PathBuilder, circle, text } from './chunk-
|
|
1
|
+
import { prepareNoAxes } from './chunk-GMLJDDHZ.js';
|
|
2
|
+
import { path, PathBuilder, circle, text } from './chunk-BMTVFAX2.js';
|
|
3
3
|
|
|
4
4
|
// src/charts/gauge/gauge-type.ts
|
|
5
5
|
var gaugeChartType = {
|
|
@@ -140,5 +140,5 @@ function strokeArc(cx, cy, r, startAngle, endAngle) {
|
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
export { gaugeChartType };
|
|
143
|
-
//# sourceMappingURL=chunk-
|
|
144
|
-
//# sourceMappingURL=chunk-
|
|
143
|
+
//# sourceMappingURL=chunk-MQBKLKYF.js.map
|
|
144
|
+
//# sourceMappingURL=chunk-MQBKLKYF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/charts/gauge/gauge-type.ts"],"names":[],"mappings":"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","file":"chunk-6KNBJ4CE.js","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareNoAxes } from '../../utils/prepare'\nimport { path, circle, text } from '../../render/tree'\nimport { PathBuilder } from '../../render/tree'\n\nexport interface GaugeOptions {\n /** Minimum value. Default 0. */\n gaugeMin?: number\n /** Maximum value. Default 100. */\n gaugeMax?: number\n /** Show value text in center. Default true. */\n showValue?: boolean\n /** Value format function. Default: round to int. */\n valueFormat?: (v: number) => string\n}\n\n/**\n * Gauge / Meter chart — single-value 240° arc with stroke-based rendering.\n *\n * Uses stroke-linecap:round for clean rounded endcaps. No fill-based donut arcs.\n * Looks like a modern dashboard gauge (Grafana, Material style).\n */\nexport const gaugeChartType: ChartTypePlugin = {\n type: 'gauge',\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 gOpts = options as unknown as GaugeOptions\n const min = gOpts.gaugeMin ?? 0\n const max = gOpts.gaugeMax ?? 100\n const showValue = gOpts.showValue ?? true\n const valueFormat = gOpts.valueFormat ?? ((v: number) => String(Math.round(v)))\n\n const value = series.values[0]!\n const pct = Math.max(0, Math.min(1, (value - min) / (max - min || 1)))\n\n // ----- Layout -----\n const cx = area.x + area.width / 2\n\n // Arc angles: 240° sweep, opening at the bottom\n // Start at 150° (bottom-left), sweep CW to 30° (bottom-right)\n const toRad = (d: number) => (d * Math.PI) / 180\n const startRad = toRad(150)\n const endRad = toRad(390) // 390° = 30° but keeps sweep direction clear\n\n // Size the arc to fit within the area with padding for labels\n // The arc bottom-most points are at 150° and 30° — y = cy + r*sin(30°) = cy + r*0.5\n // The arc top is at cy - r\n // Below the arc we need ~50px for value text, label, min/max\n const labelSpace = Math.min(60, area.height * 0.22)\n const availH = area.height - labelSpace\n // Arc top to arc bottom-endpoints: r + r*sin(30°) = r*1.5\n // So r*1.5 + strokeW <= availH\n const maxRadiusH = (availH - 8) / 1.55\n const maxRadiusW = (area.width - 16) / 2\n const radius = Math.min(maxRadiusH, maxRadiusW)\n const strokeW = Math.max(12, Math.min(radius * 0.18, 28))\n\n // Position: the top of the arc (cy - radius - strokeW/2) should be just inside area.y\n const cy = area.y + radius + strokeW / 2 + 4\n\n // Arc bottom-left/right y coordinate\n const arcBottomY = cy + radius * Math.sin(toRad(30))\n\n // ----- Track arc (background) -----\n nodes.push(path(strokeArc(cx, cy, radius, startRad, endRad), {\n class: 'chartts-gauge-track',\n stroke: theme.gridColor,\n strokeWidth: strokeW,\n fill: 'none',\n opacity: 0.3,\n style: 'stroke-linecap:round',\n }))\n\n // ----- Value arc -----\n const color = options.colors[0]!\n if (pct > 0.005) {\n const valueRad = startRad + (endRad - startRad) * pct\n nodes.push(path(strokeArc(cx, cy, radius, startRad, valueRad), {\n class: 'chartts-gauge-fill',\n stroke: color,\n strokeWidth: strokeW,\n fill: 'none',\n style: 'stroke-linecap:round',\n 'data-series': 0,\n 'data-index': 0,\n }))\n }\n\n // ----- Needle -----\n const needleAngle = startRad + (endRad - startRad) * pct\n const needleLen = radius - strokeW / 2 - 2\n const needleTipX = cx + needleLen * Math.cos(needleAngle)\n const needleTipY = cy + needleLen * Math.sin(needleAngle)\n\n // Tapered needle triangle\n const baseR = 3.5\n const bAngle1 = needleAngle + Math.PI / 2\n const bAngle2 = needleAngle - Math.PI / 2\n const npb = new PathBuilder()\n npb.moveTo(needleTipX, needleTipY)\n npb.lineTo(cx + baseR * Math.cos(bAngle1), cy + baseR * Math.sin(bAngle1))\n npb.lineTo(cx + baseR * Math.cos(bAngle2), cy + baseR * Math.sin(bAngle2))\n npb.close()\n\n nodes.push(path(npb.build(), {\n class: 'chartts-gauge-needle',\n fill: color,\n opacity: 0.85,\n }))\n\n // Center cap\n nodes.push(circle(cx, cy, 5, {\n class: 'chartts-gauge-needle-cap',\n fill: color,\n }))\n\n // ----- Labels -----\n if (showValue) {\n // Big value — in the gap below the arc center\n const valueFontSize = Math.max(16, Math.min(radius * 0.35, 40))\n const valueY = arcBottomY + labelSpace * 0.28\n nodes.push(text(cx, valueY, valueFormat(value), {\n class: 'chartts-gauge-value',\n fill: theme.textColor,\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize: valueFontSize,\n fontFamily: theme.fontFamily,\n fontWeight: 700,\n }))\n\n // Series name\n if (series.name) {\n nodes.push(text(cx, valueY + valueFontSize * 0.85, series.name, {\n class: 'chartts-gauge-label',\n fill: theme.textMuted,\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize: theme.fontSizeSmall,\n fontFamily: theme.fontFamily,\n }))\n }\n\n // Min / Max at arc endpoints\n const minX = cx + radius * Math.cos(startRad)\n const minY = cy + radius * Math.sin(startRad) + strokeW / 2 + 12\n nodes.push(text(minX, minY, valueFormat(min), {\n class: 'chartts-gauge-min',\n fill: theme.textMuted,\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize: theme.fontSizeSmall,\n fontFamily: theme.fontFamily,\n }))\n\n const maxX = cx + radius * Math.cos(toRad(30))\n const maxY = cy + radius * Math.sin(toRad(30)) + strokeW / 2 + 12\n nodes.push(text(maxX, maxY, valueFormat(max), {\n class: 'chartts-gauge-max',\n fill: theme.textMuted,\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize: theme.fontSizeSmall,\n fontFamily: theme.fontFamily,\n }))\n }\n\n return nodes\n },\n\n hitTest(): HitResult | null {\n return null\n },\n}\n\n/**\n * Stroke-based arc path (open, for use with thick stroke + stroke-linecap:round).\n * Angles in radians, CW from positive X axis (SVG convention).\n */\nfunction strokeArc(\n cx: number, cy: number, r: number,\n startAngle: number, endAngle: number,\n): string {\n const pb = new PathBuilder()\n const x1 = cx + r * Math.cos(startAngle)\n const y1 = cy + r * Math.sin(startAngle)\n const x2 = cx + r * Math.cos(endAngle)\n const y2 = cy + r * Math.sin(endAngle)\n\n let span = endAngle - startAngle\n if (span < 0) span += 2 * Math.PI\n const largeArc = span > Math.PI\n\n pb.moveTo(x1, y1)\n pb.arc(r, r, 0, largeArc, true, x2, y2)\n return pb.build()\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/charts/gauge/gauge-type.ts"],"names":[],"mappings":"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","file":"chunk-MQBKLKYF.js","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareNoAxes } from '../../utils/prepare'\nimport { path, circle, text } from '../../render/tree'\nimport { PathBuilder } from '../../render/tree'\n\nexport interface GaugeOptions {\n /** Minimum value. Default 0. */\n gaugeMin?: number\n /** Maximum value. Default 100. */\n gaugeMax?: number\n /** Show value text in center. Default true. */\n showValue?: boolean\n /** Value format function. Default: round to int. */\n valueFormat?: (v: number) => string\n}\n\n/**\n * Gauge / Meter chart — single-value 240° arc with stroke-based rendering.\n *\n * Uses stroke-linecap:round for clean rounded endcaps. No fill-based donut arcs.\n * Looks like a modern dashboard gauge (Grafana, Material style).\n */\nexport const gaugeChartType: ChartTypePlugin = {\n type: 'gauge',\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 gOpts = options as unknown as GaugeOptions\n const min = gOpts.gaugeMin ?? 0\n const max = gOpts.gaugeMax ?? 100\n const showValue = gOpts.showValue ?? true\n const valueFormat = gOpts.valueFormat ?? ((v: number) => String(Math.round(v)))\n\n const value = series.values[0]!\n const pct = Math.max(0, Math.min(1, (value - min) / (max - min || 1)))\n\n // ----- Layout -----\n const cx = area.x + area.width / 2\n\n // Arc angles: 240° sweep, opening at the bottom\n // Start at 150° (bottom-left), sweep CW to 30° (bottom-right)\n const toRad = (d: number) => (d * Math.PI) / 180\n const startRad = toRad(150)\n const endRad = toRad(390) // 390° = 30° but keeps sweep direction clear\n\n // Size the arc to fit within the area with padding for labels\n // The arc bottom-most points are at 150° and 30° — y = cy + r*sin(30°) = cy + r*0.5\n // The arc top is at cy - r\n // Below the arc we need ~50px for value text, label, min/max\n const labelSpace = Math.min(60, area.height * 0.22)\n const availH = area.height - labelSpace\n // Arc top to arc bottom-endpoints: r + r*sin(30°) = r*1.5\n // So r*1.5 + strokeW <= availH\n const maxRadiusH = (availH - 8) / 1.55\n const maxRadiusW = (area.width - 16) / 2\n const radius = Math.min(maxRadiusH, maxRadiusW)\n const strokeW = Math.max(12, Math.min(radius * 0.18, 28))\n\n // Position: the top of the arc (cy - radius - strokeW/2) should be just inside area.y\n const cy = area.y + radius + strokeW / 2 + 4\n\n // Arc bottom-left/right y coordinate\n const arcBottomY = cy + radius * Math.sin(toRad(30))\n\n // ----- Track arc (background) -----\n nodes.push(path(strokeArc(cx, cy, radius, startRad, endRad), {\n class: 'chartts-gauge-track',\n stroke: theme.gridColor,\n strokeWidth: strokeW,\n fill: 'none',\n opacity: 0.3,\n style: 'stroke-linecap:round',\n }))\n\n // ----- Value arc -----\n const color = options.colors[0]!\n if (pct > 0.005) {\n const valueRad = startRad + (endRad - startRad) * pct\n nodes.push(path(strokeArc(cx, cy, radius, startRad, valueRad), {\n class: 'chartts-gauge-fill',\n stroke: color,\n strokeWidth: strokeW,\n fill: 'none',\n style: 'stroke-linecap:round',\n 'data-series': 0,\n 'data-index': 0,\n }))\n }\n\n // ----- Needle -----\n const needleAngle = startRad + (endRad - startRad) * pct\n const needleLen = radius - strokeW / 2 - 2\n const needleTipX = cx + needleLen * Math.cos(needleAngle)\n const needleTipY = cy + needleLen * Math.sin(needleAngle)\n\n // Tapered needle triangle\n const baseR = 3.5\n const bAngle1 = needleAngle + Math.PI / 2\n const bAngle2 = needleAngle - Math.PI / 2\n const npb = new PathBuilder()\n npb.moveTo(needleTipX, needleTipY)\n npb.lineTo(cx + baseR * Math.cos(bAngle1), cy + baseR * Math.sin(bAngle1))\n npb.lineTo(cx + baseR * Math.cos(bAngle2), cy + baseR * Math.sin(bAngle2))\n npb.close()\n\n nodes.push(path(npb.build(), {\n class: 'chartts-gauge-needle',\n fill: color,\n opacity: 0.85,\n }))\n\n // Center cap\n nodes.push(circle(cx, cy, 5, {\n class: 'chartts-gauge-needle-cap',\n fill: color,\n }))\n\n // ----- Labels -----\n if (showValue) {\n // Big value — in the gap below the arc center\n const valueFontSize = Math.max(16, Math.min(radius * 0.35, 40))\n const valueY = arcBottomY + labelSpace * 0.28\n nodes.push(text(cx, valueY, valueFormat(value), {\n class: 'chartts-gauge-value',\n fill: theme.textColor,\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize: valueFontSize,\n fontFamily: theme.fontFamily,\n fontWeight: 700,\n }))\n\n // Series name\n if (series.name) {\n nodes.push(text(cx, valueY + valueFontSize * 0.85, series.name, {\n class: 'chartts-gauge-label',\n fill: theme.textMuted,\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize: theme.fontSizeSmall,\n fontFamily: theme.fontFamily,\n }))\n }\n\n // Min / Max at arc endpoints\n const minX = cx + radius * Math.cos(startRad)\n const minY = cy + radius * Math.sin(startRad) + strokeW / 2 + 12\n nodes.push(text(minX, minY, valueFormat(min), {\n class: 'chartts-gauge-min',\n fill: theme.textMuted,\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize: theme.fontSizeSmall,\n fontFamily: theme.fontFamily,\n }))\n\n const maxX = cx + radius * Math.cos(toRad(30))\n const maxY = cy + radius * Math.sin(toRad(30)) + strokeW / 2 + 12\n nodes.push(text(maxX, maxY, valueFormat(max), {\n class: 'chartts-gauge-max',\n fill: theme.textMuted,\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize: theme.fontSizeSmall,\n fontFamily: theme.fontFamily,\n }))\n }\n\n return nodes\n },\n\n hitTest(): HitResult | null {\n return null\n },\n}\n\n/**\n * Stroke-based arc path (open, for use with thick stroke + stroke-linecap:round).\n * Angles in radians, CW from positive X axis (SVG convention).\n */\nfunction strokeArc(\n cx: number, cy: number, r: number,\n startAngle: number, endAngle: number,\n): string {\n const pb = new PathBuilder()\n const x1 = cx + r * Math.cos(startAngle)\n const y1 = cy + r * Math.sin(startAngle)\n const x2 = cx + r * Math.cos(endAngle)\n const y2 = cy + r * Math.sin(endAngle)\n\n let span = endAngle - startAngle\n if (span < 0) span += 2 * Math.PI\n const largeArc = span > Math.PI\n\n pb.moveTo(x1, y1)\n pb.arc(r, r, 0, largeArc, true, x2, y2)\n return pb.build()\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { lineChartType } from './chunk-
|
|
1
|
+
import { lineChartType } from './chunk-IXFSJBJS.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-MVJKRPX7.js.map
|
|
30
|
+
//# sourceMappingURL=chunk-MVJKRPX7.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-MVJKRPX7.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,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var chunkHOPFELRP_cjs = require('./chunk-HOPFELRP.cjs');
|
|
4
|
+
var chunk3TLJCGGQ_cjs = require('./chunk-3TLJCGGQ.cjs');
|
|
5
5
|
|
|
6
6
|
// src/charts/graph/graph-type.ts
|
|
7
7
|
var graphChartType = {
|
|
@@ -10,7 +10,7 @@ var graphChartType = {
|
|
|
10
10
|
return { x: "categorical", y: "linear" };
|
|
11
11
|
},
|
|
12
12
|
prepareData(data, options) {
|
|
13
|
-
return
|
|
13
|
+
return chunkHOPFELRP_cjs.prepareNoAxes(data, options);
|
|
14
14
|
},
|
|
15
15
|
render(ctx) {
|
|
16
16
|
const { data, area, theme, options } = ctx;
|
|
@@ -22,7 +22,7 @@ var graphChartType = {
|
|
|
22
22
|
const edge = graphEdges[ei];
|
|
23
23
|
const src = graphNodes[edge.source];
|
|
24
24
|
const tgt = graphNodes[edge.target];
|
|
25
|
-
nodes.push(
|
|
25
|
+
nodes.push(chunk3TLJCGGQ_cjs.line(src.x, src.y, tgt.x, tgt.y, {
|
|
26
26
|
class: "chartts-graph-edge",
|
|
27
27
|
stroke: theme.gridColor,
|
|
28
28
|
strokeWidth: Math.max(1, Math.min(3, edge.weight * 0.5)),
|
|
@@ -37,7 +37,7 @@ var graphChartType = {
|
|
|
37
37
|
const color = options.colors[ni % options.colors.length];
|
|
38
38
|
const r = minR + gn.value / maxVal * (maxR - minR);
|
|
39
39
|
const nodeGroup = [];
|
|
40
|
-
nodeGroup.push(
|
|
40
|
+
nodeGroup.push(chunk3TLJCGGQ_cjs.circle(gn.x, gn.y, r, {
|
|
41
41
|
class: "chartts-graph-node",
|
|
42
42
|
fill: color,
|
|
43
43
|
fillOpacity: 0.85,
|
|
@@ -49,7 +49,7 @@ var graphChartType = {
|
|
|
49
49
|
role: "img",
|
|
50
50
|
ariaLabel: `${gn.name}: ${gn.value}`
|
|
51
51
|
}));
|
|
52
|
-
nodeGroup.push(
|
|
52
|
+
nodeGroup.push(chunk3TLJCGGQ_cjs.text(gn.x, gn.y - r - 5, gn.name, {
|
|
53
53
|
class: "chartts-graph-label",
|
|
54
54
|
fill: theme.textColor,
|
|
55
55
|
textAnchor: "middle",
|
|
@@ -57,7 +57,7 @@ var graphChartType = {
|
|
|
57
57
|
fontSize: theme.fontSizeSmall,
|
|
58
58
|
fontFamily: theme.fontFamily
|
|
59
59
|
}));
|
|
60
|
-
nodes.push(
|
|
60
|
+
nodes.push(chunk3TLJCGGQ_cjs.group(nodeGroup, {
|
|
61
61
|
class: `chartts-series chartts-series-${ni}`,
|
|
62
62
|
"data-series-name": gn.name
|
|
63
63
|
}));
|
|
@@ -206,5 +206,5 @@ function forceLayout(nodes, edges, area, iterations) {
|
|
|
206
206
|
}
|
|
207
207
|
|
|
208
208
|
exports.graphChartType = graphChartType;
|
|
209
|
-
//# sourceMappingURL=chunk-
|
|
210
|
-
//# sourceMappingURL=chunk-
|
|
209
|
+
//# sourceMappingURL=chunk-MZCKMTQE.cjs.map
|
|
210
|
+
//# sourceMappingURL=chunk-MZCKMTQE.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/charts/graph/graph-type.ts"],"names":["prepareNoAxes","line","circle","text","group"],"mappings":"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","file":"chunk-Q6U5D2ZB.cjs","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareNoAxes } from '../../utils/prepare'\nimport { group, circle, text, line } from '../../render/tree'\n\n/**\n * Graph / Network chart — node-link diagram with force-directed layout.\n *\n * Data convention:\n * - labels: node names\n * - series[0].values: node values (controls circle radius)\n * - Edge encoding: series names contain \"→\" or \"->\" (e.g., \"A → B\")\n * with values[0] = edge weight. Same as Sankey convention.\n *\n * Alternative: adjacency matrix\n * - series[i].values[j] > 0 means there's an edge from node i to node j.\n *\n * Uses a simple force simulation (no external deps):\n * - Repulsion between all nodes (Coulomb's law)\n * - Attraction along edges (Hooke's law)\n * - Gravity toward center\n */\n\ninterface GraphNode {\n name: string\n index: number\n value: number\n x: number\n y: number\n vx: number\n vy: number\n}\n\ninterface GraphEdge {\n source: number\n target: number\n weight: number\n}\n\nexport const graphChartType: ChartTypePlugin = {\n type: 'graph',\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 { graphNodes, graphEdges } = parseGraphData(data, options)\n if (graphNodes.length === 0) return nodes\n\n // Run force simulation\n forceLayout(graphNodes, graphEdges, area, 80)\n\n // Render edges\n for (let ei = 0; ei < graphEdges.length; ei++) {\n const edge = graphEdges[ei]!\n const src = graphNodes[edge.source]!\n const tgt = graphNodes[edge.target]!\n\n nodes.push(line(src.x, src.y, tgt.x, tgt.y, {\n class: 'chartts-graph-edge',\n stroke: theme.gridColor,\n strokeWidth: Math.max(1, Math.min(3, edge.weight * 0.5)),\n opacity: 0.5,\n }))\n }\n\n // Compute node radii\n const maxVal = Math.max(...graphNodes.map(n => n.value), 1)\n const minR = 5\n const maxR = Math.min(20, Math.min(area.width, area.height) * 0.06)\n\n // Render nodes\n for (let ni = 0; ni < graphNodes.length; ni++) {\n const gn = graphNodes[ni]!\n const color = options.colors[ni % options.colors.length]!\n const r = minR + (gn.value / maxVal) * (maxR - minR)\n const nodeGroup: RenderNode[] = []\n\n nodeGroup.push(circle(gn.x, gn.y, r, {\n class: 'chartts-graph-node',\n fill: color,\n fillOpacity: 0.85,\n stroke: color,\n strokeWidth: 1.5,\n 'data-series': ni,\n 'data-index': 0,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${gn.name}: ${gn.value}`,\n }))\n\n // Label\n nodeGroup.push(text(gn.x, gn.y - r - 5, gn.name, {\n class: 'chartts-graph-label',\n fill: theme.textColor,\n textAnchor: 'middle',\n dominantBaseline: 'auto',\n fontSize: theme.fontSizeSmall,\n fontFamily: theme.fontFamily,\n }))\n\n nodes.push(group(nodeGroup, {\n class: `chartts-series chartts-series-${ni}`,\n 'data-series-name': gn.name,\n }))\n }\n\n return nodes\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { data, area, options } = ctx\n const { graphNodes, graphEdges } = parseGraphData(data, options)\n if (graphNodes.length === 0) return null\n\n forceLayout(graphNodes, graphEdges, area, 80)\n\n const maxVal = Math.max(...graphNodes.map(n => n.value), 1)\n const minR = 5\n const maxR = Math.min(20, Math.min(area.width, area.height) * 0.06)\n\n let best: HitResult | null = null\n let bestDist = Infinity\n\n for (let ni = 0; ni < graphNodes.length; ni++) {\n const gn = graphNodes[ni]!\n const r = minR + (gn.value / maxVal) * (maxR - minR)\n const dist = Math.sqrt((mx - gn.x) ** 2 + (my - gn.y) ** 2)\n if (dist < bestDist && dist < r + 8) {\n bestDist = dist\n best = { seriesIndex: ni, pointIndex: 0, distance: dist }\n }\n }\n\n return best\n },\n}\n\n// ---------------------------------------------------------------------------\n// Data parsing\n// ---------------------------------------------------------------------------\n\nfunction parseGraphData(\n data: PreparedData,\n _options: ResolvedOptions,\n): { graphNodes: GraphNode[]; graphEdges: GraphEdge[] } {\n const graphNodes: GraphNode[] = []\n const graphEdges: GraphEdge[] = []\n const nodeMap = new Map<string, number>()\n\n function getOrCreateNode(name: string, value = 1): number {\n if (nodeMap.has(name)) return nodeMap.get(name)!\n const idx = graphNodes.length\n nodeMap.set(name, idx)\n graphNodes.push({\n name, index: idx, value,\n x: 0, y: 0, vx: 0, vy: 0,\n })\n return idx\n }\n\n const hasArrows = data.series.some(s => s.name.includes('→') || s.name.includes('->'))\n\n if (hasArrows) {\n // Edge list format\n for (const series of data.series) {\n const parts = series.name.split(/\\s*(?:→|->)\\s*/)\n if (parts.length < 2) continue\n const srcName = parts[0]!.trim()\n const tgtName = parts[1]!.trim()\n const weight = series.values[0] ?? 1\n\n const src = getOrCreateNode(srcName)\n const tgt = getOrCreateNode(tgtName)\n graphEdges.push({ source: src, target: tgt, weight })\n graphNodes[src]!.value += weight\n graphNodes[tgt]!.value += weight\n }\n } else {\n // Adjacency matrix or node list\n for (let i = 0; i < data.labels.length; i++) {\n getOrCreateNode(String(data.labels[i]), Math.abs(data.series[0]?.values[i] ?? 1))\n }\n\n // If multiple series with matching dimensions, treat as adjacency matrix\n if (data.series.length > 1 && data.series.length === data.labels.length) {\n for (let si = 0; si < data.series.length; si++) {\n for (let j = 0; j < data.series[si]!.values.length; j++) {\n const val = data.series[si]!.values[j]!\n if (val > 0 && si !== j) {\n graphEdges.push({ source: si, target: j, weight: val })\n }\n }\n }\n }\n }\n\n return { graphNodes, graphEdges }\n}\n\n// ---------------------------------------------------------------------------\n// Force-directed layout (simple Fruchterman-Reingold style)\n// ---------------------------------------------------------------------------\n\nfunction forceLayout(\n nodes: GraphNode[],\n edges: GraphEdge[],\n area: { x: number; y: number; width: number; height: number },\n iterations: number,\n): void {\n const cx = area.x + area.width / 2\n const cy = area.y + area.height / 2\n const n = nodes.length\n\n if (n === 0) return\n\n // Initialize positions in a circle\n for (let i = 0; i < n; i++) {\n const angle = (2 * Math.PI * i) / n\n const r = Math.min(area.width, area.height) * 0.3\n nodes[i]!.x = cx + r * Math.cos(angle)\n nodes[i]!.y = cy + r * Math.sin(angle)\n nodes[i]!.vx = 0\n nodes[i]!.vy = 0\n }\n\n const k = Math.sqrt((area.width * area.height) / Math.max(n, 1))\n const repulsion = k * k\n\n for (let iter = 0; iter < iterations; iter++) {\n const temp = 0.1 * (1 - iter / iterations) * Math.min(area.width, area.height) * 0.5\n\n // Reset velocities\n for (const node of nodes) {\n node.vx = 0\n node.vy = 0\n }\n\n // Repulsion between all pairs\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n const dx = nodes[i]!.x - nodes[j]!.x\n const dy = nodes[i]!.y - nodes[j]!.y\n const dist = Math.max(Math.sqrt(dx * dx + dy * dy), 1)\n const force = repulsion / (dist * dist)\n const fx = (dx / dist) * force\n const fy = (dy / dist) * force\n nodes[i]!.vx += fx\n nodes[i]!.vy += fy\n nodes[j]!.vx -= fx\n nodes[j]!.vy -= fy\n }\n }\n\n // Attraction along edges\n for (const edge of edges) {\n const src = nodes[edge.source]!\n const tgt = nodes[edge.target]!\n const dx = tgt.x - src.x\n const dy = tgt.y - src.y\n const dist = Math.max(Math.sqrt(dx * dx + dy * dy), 1)\n const force = (dist * dist) / k\n const fx = (dx / dist) * force * 0.1\n const fy = (dy / dist) * force * 0.1\n src.vx += fx\n src.vy += fy\n tgt.vx -= fx\n tgt.vy -= fy\n }\n\n // Gravity toward center\n for (const node of nodes) {\n const dx = cx - node.x\n const dy = cy - node.y\n node.vx += dx * 0.01\n node.vy += dy * 0.01\n }\n\n // Apply velocities with temperature damping\n for (const node of nodes) {\n const speed = Math.sqrt(node.vx * node.vx + node.vy * node.vy)\n if (speed > 0) {\n const capped = Math.min(speed, temp)\n node.x += (node.vx / speed) * capped\n node.y += (node.vy / speed) * capped\n }\n\n // Constrain to area\n const margin = 20\n node.x = Math.max(area.x + margin, Math.min(area.x + area.width - margin, node.x))\n node.y = Math.max(area.y + margin, Math.min(area.y + area.height - margin, node.y))\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/charts/graph/graph-type.ts"],"names":["prepareNoAxes","line","circle","text","group"],"mappings":"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","file":"chunk-MZCKMTQE.cjs","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareNoAxes } from '../../utils/prepare'\nimport { group, circle, text, line } from '../../render/tree'\n\n/**\n * Graph / Network chart — node-link diagram with force-directed layout.\n *\n * Data convention:\n * - labels: node names\n * - series[0].values: node values (controls circle radius)\n * - Edge encoding: series names contain \"→\" or \"->\" (e.g., \"A → B\")\n * with values[0] = edge weight. Same as Sankey convention.\n *\n * Alternative: adjacency matrix\n * - series[i].values[j] > 0 means there's an edge from node i to node j.\n *\n * Uses a simple force simulation (no external deps):\n * - Repulsion between all nodes (Coulomb's law)\n * - Attraction along edges (Hooke's law)\n * - Gravity toward center\n */\n\ninterface GraphNode {\n name: string\n index: number\n value: number\n x: number\n y: number\n vx: number\n vy: number\n}\n\ninterface GraphEdge {\n source: number\n target: number\n weight: number\n}\n\nexport const graphChartType: ChartTypePlugin = {\n type: 'graph',\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 { graphNodes, graphEdges } = parseGraphData(data, options)\n if (graphNodes.length === 0) return nodes\n\n // Run force simulation\n forceLayout(graphNodes, graphEdges, area, 80)\n\n // Render edges\n for (let ei = 0; ei < graphEdges.length; ei++) {\n const edge = graphEdges[ei]!\n const src = graphNodes[edge.source]!\n const tgt = graphNodes[edge.target]!\n\n nodes.push(line(src.x, src.y, tgt.x, tgt.y, {\n class: 'chartts-graph-edge',\n stroke: theme.gridColor,\n strokeWidth: Math.max(1, Math.min(3, edge.weight * 0.5)),\n opacity: 0.5,\n }))\n }\n\n // Compute node radii\n const maxVal = Math.max(...graphNodes.map(n => n.value), 1)\n const minR = 5\n const maxR = Math.min(20, Math.min(area.width, area.height) * 0.06)\n\n // Render nodes\n for (let ni = 0; ni < graphNodes.length; ni++) {\n const gn = graphNodes[ni]!\n const color = options.colors[ni % options.colors.length]!\n const r = minR + (gn.value / maxVal) * (maxR - minR)\n const nodeGroup: RenderNode[] = []\n\n nodeGroup.push(circle(gn.x, gn.y, r, {\n class: 'chartts-graph-node',\n fill: color,\n fillOpacity: 0.85,\n stroke: color,\n strokeWidth: 1.5,\n 'data-series': ni,\n 'data-index': 0,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${gn.name}: ${gn.value}`,\n }))\n\n // Label\n nodeGroup.push(text(gn.x, gn.y - r - 5, gn.name, {\n class: 'chartts-graph-label',\n fill: theme.textColor,\n textAnchor: 'middle',\n dominantBaseline: 'auto',\n fontSize: theme.fontSizeSmall,\n fontFamily: theme.fontFamily,\n }))\n\n nodes.push(group(nodeGroup, {\n class: `chartts-series chartts-series-${ni}`,\n 'data-series-name': gn.name,\n }))\n }\n\n return nodes\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { data, area, options } = ctx\n const { graphNodes, graphEdges } = parseGraphData(data, options)\n if (graphNodes.length === 0) return null\n\n forceLayout(graphNodes, graphEdges, area, 80)\n\n const maxVal = Math.max(...graphNodes.map(n => n.value), 1)\n const minR = 5\n const maxR = Math.min(20, Math.min(area.width, area.height) * 0.06)\n\n let best: HitResult | null = null\n let bestDist = Infinity\n\n for (let ni = 0; ni < graphNodes.length; ni++) {\n const gn = graphNodes[ni]!\n const r = minR + (gn.value / maxVal) * (maxR - minR)\n const dist = Math.sqrt((mx - gn.x) ** 2 + (my - gn.y) ** 2)\n if (dist < bestDist && dist < r + 8) {\n bestDist = dist\n best = { seriesIndex: ni, pointIndex: 0, distance: dist }\n }\n }\n\n return best\n },\n}\n\n// ---------------------------------------------------------------------------\n// Data parsing\n// ---------------------------------------------------------------------------\n\nfunction parseGraphData(\n data: PreparedData,\n _options: ResolvedOptions,\n): { graphNodes: GraphNode[]; graphEdges: GraphEdge[] } {\n const graphNodes: GraphNode[] = []\n const graphEdges: GraphEdge[] = []\n const nodeMap = new Map<string, number>()\n\n function getOrCreateNode(name: string, value = 1): number {\n if (nodeMap.has(name)) return nodeMap.get(name)!\n const idx = graphNodes.length\n nodeMap.set(name, idx)\n graphNodes.push({\n name, index: idx, value,\n x: 0, y: 0, vx: 0, vy: 0,\n })\n return idx\n }\n\n const hasArrows = data.series.some(s => s.name.includes('→') || s.name.includes('->'))\n\n if (hasArrows) {\n // Edge list format\n for (const series of data.series) {\n const parts = series.name.split(/\\s*(?:→|->)\\s*/)\n if (parts.length < 2) continue\n const srcName = parts[0]!.trim()\n const tgtName = parts[1]!.trim()\n const weight = series.values[0] ?? 1\n\n const src = getOrCreateNode(srcName)\n const tgt = getOrCreateNode(tgtName)\n graphEdges.push({ source: src, target: tgt, weight })\n graphNodes[src]!.value += weight\n graphNodes[tgt]!.value += weight\n }\n } else {\n // Adjacency matrix or node list\n for (let i = 0; i < data.labels.length; i++) {\n getOrCreateNode(String(data.labels[i]), Math.abs(data.series[0]?.values[i] ?? 1))\n }\n\n // If multiple series with matching dimensions, treat as adjacency matrix\n if (data.series.length > 1 && data.series.length === data.labels.length) {\n for (let si = 0; si < data.series.length; si++) {\n for (let j = 0; j < data.series[si]!.values.length; j++) {\n const val = data.series[si]!.values[j]!\n if (val > 0 && si !== j) {\n graphEdges.push({ source: si, target: j, weight: val })\n }\n }\n }\n }\n }\n\n return { graphNodes, graphEdges }\n}\n\n// ---------------------------------------------------------------------------\n// Force-directed layout (simple Fruchterman-Reingold style)\n// ---------------------------------------------------------------------------\n\nfunction forceLayout(\n nodes: GraphNode[],\n edges: GraphEdge[],\n area: { x: number; y: number; width: number; height: number },\n iterations: number,\n): void {\n const cx = area.x + area.width / 2\n const cy = area.y + area.height / 2\n const n = nodes.length\n\n if (n === 0) return\n\n // Initialize positions in a circle\n for (let i = 0; i < n; i++) {\n const angle = (2 * Math.PI * i) / n\n const r = Math.min(area.width, area.height) * 0.3\n nodes[i]!.x = cx + r * Math.cos(angle)\n nodes[i]!.y = cy + r * Math.sin(angle)\n nodes[i]!.vx = 0\n nodes[i]!.vy = 0\n }\n\n const k = Math.sqrt((area.width * area.height) / Math.max(n, 1))\n const repulsion = k * k\n\n for (let iter = 0; iter < iterations; iter++) {\n const temp = 0.1 * (1 - iter / iterations) * Math.min(area.width, area.height) * 0.5\n\n // Reset velocities\n for (const node of nodes) {\n node.vx = 0\n node.vy = 0\n }\n\n // Repulsion between all pairs\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n const dx = nodes[i]!.x - nodes[j]!.x\n const dy = nodes[i]!.y - nodes[j]!.y\n const dist = Math.max(Math.sqrt(dx * dx + dy * dy), 1)\n const force = repulsion / (dist * dist)\n const fx = (dx / dist) * force\n const fy = (dy / dist) * force\n nodes[i]!.vx += fx\n nodes[i]!.vy += fy\n nodes[j]!.vx -= fx\n nodes[j]!.vy -= fy\n }\n }\n\n // Attraction along edges\n for (const edge of edges) {\n const src = nodes[edge.source]!\n const tgt = nodes[edge.target]!\n const dx = tgt.x - src.x\n const dy = tgt.y - src.y\n const dist = Math.max(Math.sqrt(dx * dx + dy * dy), 1)\n const force = (dist * dist) / k\n const fx = (dx / dist) * force * 0.1\n const fy = (dy / dist) * force * 0.1\n src.vx += fx\n src.vy += fy\n tgt.vx -= fx\n tgt.vy -= fy\n }\n\n // Gravity toward center\n for (const node of nodes) {\n const dx = cx - node.x\n const dy = cy - node.y\n node.vx += dx * 0.01\n node.vy += dy * 0.01\n }\n\n // Apply velocities with temperature damping\n for (const node of nodes) {\n const speed = Math.sqrt(node.vx * node.vx + node.vy * node.vy)\n if (speed > 0) {\n const capped = Math.min(speed, temp)\n node.x += (node.vx / speed) * capped\n node.y += (node.vy / speed) * capped\n }\n\n // Constrain to area\n const margin = 20\n node.x = Math.max(area.x + margin, Math.min(area.x + area.width - margin, node.x))\n node.y = Math.max(area.y + margin, Math.min(area.y + area.height - margin, node.y))\n }\n }\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var chunkHOPFELRP_cjs = require('./chunk-HOPFELRP.cjs');
|
|
4
|
+
var chunk3TLJCGGQ_cjs = require('./chunk-3TLJCGGQ.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 chunkHOPFELRP_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 chunk3TLJCGGQ_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(chunk3TLJCGGQ_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 chunk3TLJCGGQ_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(chunk3TLJCGGQ_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(chunk3TLJCGGQ_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(chunk3TLJCGGQ_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(chunk3TLJCGGQ_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-MZQY2FTP.cjs.map
|
|
178
|
+
//# sourceMappingURL=chunk-MZQY2FTP.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-BEYG2HQ4.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 }\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-MZQY2FTP.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 }\n }\n idx++\n }\n return null\n },\n}\n"]}
|