@chartts/core 0.1.4 → 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-62DBXI4N.js → chunk-2VHG2N75.js} +4 -4
- package/dist/{chunk-62DBXI4N.js.map → chunk-2VHG2N75.js.map} +1 -1
- package/dist/{chunk-VJXUBN7J.js → chunk-2X7UIG3G.js} +3 -3
- package/dist/{chunk-VJXUBN7J.js.map → chunk-2X7UIG3G.js.map} +1 -1
- package/dist/{chunk-ESJMEDLY.cjs → chunk-35XUPEAD.cjs} +4 -4
- package/dist/{chunk-ESJMEDLY.cjs.map → chunk-35XUPEAD.cjs.map} +1 -1
- package/dist/{chunk-Y6CVUI6A.cjs → chunk-3HBRAGJA.cjs} +13 -13
- package/dist/{chunk-Y6CVUI6A.cjs.map → chunk-3HBRAGJA.cjs.map} +1 -1
- package/dist/{chunk-ZOEN3ARN.js → chunk-45Y77XDM.js} +3 -3
- package/dist/{chunk-ZOEN3ARN.js.map → chunk-45Y77XDM.js.map} +1 -1
- package/dist/{chunk-PCAYYCLY.cjs → chunk-47R2QUID.cjs} +10 -10
- package/dist/{chunk-PCAYYCLY.cjs.map → chunk-47R2QUID.cjs.map} +1 -1
- package/dist/{chunk-IF6RQ53Q.cjs → chunk-4C5IV57Z.cjs} +9 -9
- package/dist/{chunk-IF6RQ53Q.cjs.map → chunk-4C5IV57Z.cjs.map} +1 -1
- package/dist/{chunk-2BUIZDOB.js → chunk-4EV5UN6V.js} +3 -3
- package/dist/{chunk-2BUIZDOB.js.map → chunk-4EV5UN6V.js.map} +1 -1
- package/dist/{chunk-THHZMRFU.js → chunk-5JDHVXPE.js} +3 -3
- package/dist/{chunk-THHZMRFU.js.map → chunk-5JDHVXPE.js.map} +1 -1
- package/dist/{chunk-PKXW45G4.js → chunk-5VI5F5XA.js} +3 -3
- package/dist/{chunk-PKXW45G4.js.map → chunk-5VI5F5XA.js.map} +1 -1
- package/dist/{chunk-TEZNWW3R.cjs → chunk-64B7FGFP.cjs} +8 -8
- package/dist/{chunk-TEZNWW3R.cjs.map → chunk-64B7FGFP.cjs.map} +1 -1
- package/dist/{chunk-5HZEDCJG.js → chunk-66GE7TI3.js} +3 -3
- package/dist/{chunk-5HZEDCJG.js.map → chunk-66GE7TI3.js.map} +1 -1
- package/dist/{chunk-CWZADOJ6.js → chunk-6H34P4AG.js} +3 -3
- package/dist/{chunk-CWZADOJ6.js.map → chunk-6H34P4AG.js.map} +1 -1
- package/dist/{chunk-BGGESAAG.cjs → chunk-6KNS32OH.cjs} +7 -7
- package/dist/{chunk-BGGESAAG.cjs.map → chunk-6KNS32OH.cjs.map} +1 -1
- package/dist/{chunk-GBL4R3GH.cjs → chunk-6S2NCXNP.cjs} +6 -6
- package/dist/{chunk-GBL4R3GH.cjs.map → chunk-6S2NCXNP.cjs.map} +1 -1
- package/dist/{chunk-FVLVTY5D.cjs → chunk-6XD3VSAM.cjs} +6 -6
- package/dist/{chunk-FVLVTY5D.cjs.map → chunk-6XD3VSAM.cjs.map} +1 -1
- package/dist/{chunk-KWSVJRXX.cjs → chunk-6XWZSV6M.cjs} +4 -4
- package/dist/{chunk-KWSVJRXX.cjs.map → chunk-6XWZSV6M.cjs.map} +1 -1
- package/dist/{chunk-N35UAFEU.js → chunk-7FUQMZGT.js} +4 -4
- package/dist/{chunk-N35UAFEU.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-A5G32G2R.cjs → chunk-7XOK2HLV.cjs} +9 -9
- package/dist/{chunk-A5G32G2R.cjs.map → chunk-7XOK2HLV.cjs.map} +1 -1
- package/dist/{chunk-SGZUUUXU.js → chunk-ACN4JCSF.js} +4 -4
- package/dist/{chunk-SGZUUUXU.js.map → chunk-ACN4JCSF.js.map} +1 -1
- package/dist/{chunk-3NHH6C4K.cjs → chunk-AOZ47DTE.cjs} +13 -13
- package/dist/{chunk-3NHH6C4K.cjs.map → chunk-AOZ47DTE.cjs.map} +1 -1
- package/dist/{chunk-WZCES5M6.js → chunk-AYEXPYFE.js} +4 -4
- package/dist/{chunk-WZCES5M6.js.map → chunk-AYEXPYFE.js.map} +1 -1
- package/dist/{chunk-D5QUAWF3.cjs → chunk-BPXEQPZU.cjs} +10 -10
- package/dist/{chunk-D5QUAWF3.cjs.map → chunk-BPXEQPZU.cjs.map} +1 -1
- package/dist/{chunk-YZXRD6K6.cjs → chunk-BQUMYOBP.cjs} +7 -7
- package/dist/{chunk-YZXRD6K6.cjs.map → chunk-BQUMYOBP.cjs.map} +1 -1
- package/dist/{chunk-FGHSUT6X.cjs → chunk-CG4KMZRU.cjs} +6 -6
- package/dist/{chunk-FGHSUT6X.cjs.map → chunk-CG4KMZRU.cjs.map} +1 -1
- package/dist/{chunk-BFBVJ6MU.js → chunk-CLBVCWJG.js} +3 -3
- package/dist/{chunk-BFBVJ6MU.js.map → chunk-CLBVCWJG.js.map} +1 -1
- package/dist/{chunk-754Z4OR6.cjs → chunk-CVKWXLXW.cjs} +10 -10
- package/dist/{chunk-754Z4OR6.cjs.map → chunk-CVKWXLXW.cjs.map} +1 -1
- package/dist/{chunk-5E7FXDBM.js → chunk-D4RP2H6A.js} +4 -4
- package/dist/{chunk-5E7FXDBM.js.map → chunk-D4RP2H6A.js.map} +1 -1
- package/dist/{chunk-HCIBBUV5.js → chunk-DMBUUJGU.js} +3 -3
- package/dist/{chunk-HCIBBUV5.js.map → chunk-DMBUUJGU.js.map} +1 -1
- package/dist/{chunk-EWVXMQRW.js → chunk-DQAFYVCX.js} +5 -5
- package/dist/{chunk-EWVXMQRW.js.map → chunk-DQAFYVCX.js.map} +1 -1
- package/dist/{chunk-ATMSGQCW.cjs → chunk-EXA5HCX7.cjs} +9 -9
- package/dist/{chunk-ATMSGQCW.cjs.map → chunk-EXA5HCX7.cjs.map} +1 -1
- package/dist/{chunk-TLHQ6JCK.cjs → chunk-F3TVVAYG.cjs} +11 -11
- package/dist/{chunk-TLHQ6JCK.cjs.map → chunk-F3TVVAYG.cjs.map} +1 -1
- package/dist/{chunk-HCK2VUWD.cjs → chunk-FCDKWHIV.cjs} +8 -8
- package/dist/{chunk-HCK2VUWD.cjs.map → chunk-FCDKWHIV.cjs.map} +1 -1
- package/dist/{chunk-IDZTDJLH.js → chunk-FWKYNE3A.js} +3 -3
- package/dist/{chunk-IDZTDJLH.js.map → chunk-FWKYNE3A.js.map} +1 -1
- package/dist/{chunk-6QMV75NT.js → chunk-GAXX6YK5.js} +4 -4
- package/dist/{chunk-6QMV75NT.js.map → chunk-GAXX6YK5.js.map} +1 -1
- package/dist/{chunk-OMAW52LY.cjs → chunk-H2DHSBPO.cjs} +6 -6
- package/dist/{chunk-OMAW52LY.cjs.map → chunk-H2DHSBPO.cjs.map} +1 -1
- package/dist/{chunk-DX77WSIB.js → chunk-I7HB3FBC.js} +5 -5
- package/dist/{chunk-DX77WSIB.js.map → chunk-I7HB3FBC.js.map} +1 -1
- package/dist/{chunk-MJY25P44.js → chunk-IGIAGPC5.js} +3 -3
- package/dist/{chunk-MJY25P44.js.map → chunk-IGIAGPC5.js.map} +1 -1
- package/dist/{chunk-4QRND2V5.js → chunk-ILD5ZZHH.js} +3 -3
- package/dist/{chunk-4QRND2V5.js.map → chunk-ILD5ZZHH.js.map} +1 -1
- package/dist/{chunk-CU5ZXVZQ.js → chunk-IN7SCXMD.js} +4 -4
- package/dist/{chunk-CU5ZXVZQ.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-7GLCJPV5.js → chunk-J6A72I5K.js} +4 -4
- package/dist/{chunk-7GLCJPV5.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-KNMEXOKJ.js → chunk-K7NVM76W.js} +4 -4
- package/dist/{chunk-KNMEXOKJ.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-OMSHGBV3.js → chunk-KRLKDJPM.js} +4 -4
- package/dist/{chunk-OMSHGBV3.js.map → chunk-KRLKDJPM.js.map} +1 -1
- package/dist/{chunk-ZNKVOTPB.cjs → chunk-KSCMLSUI.cjs} +15 -15
- package/dist/{chunk-ZNKVOTPB.cjs.map → chunk-KSCMLSUI.cjs.map} +1 -1
- package/dist/{chunk-OTXHJHXU.cjs → chunk-KT4LY42Y.cjs} +11 -11
- package/dist/{chunk-OTXHJHXU.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-56BN43J4.js → chunk-KXJOIVL5.js} +5 -5
- package/dist/{chunk-56BN43J4.js.map → chunk-KXJOIVL5.js.map} +1 -1
- package/dist/{chunk-EPUWA3ZW.js → chunk-LFV46XLH.js} +4 -4
- package/dist/{chunk-EPUWA3ZW.js.map → chunk-LFV46XLH.js.map} +1 -1
- package/dist/{chunk-T7SCCACB.js → chunk-LKSKGQX7.js} +3 -3
- package/dist/{chunk-T7SCCACB.js.map → chunk-LKSKGQX7.js.map} +1 -1
- package/dist/{chunk-LARNENXE.cjs → chunk-LQ26WSLH.cjs} +10 -10
- package/dist/{chunk-LARNENXE.cjs.map → chunk-LQ26WSLH.cjs.map} +1 -1
- package/dist/{chunk-NRULNA5F.js → chunk-LROB73B4.js} +4 -4
- package/dist/{chunk-NRULNA5F.js.map → chunk-LROB73B4.js.map} +1 -1
- package/dist/{chunk-34DQGCPP.js → chunk-LXBBM6IF.js} +4 -4
- package/dist/{chunk-34DQGCPP.js.map → chunk-LXBBM6IF.js.map} +1 -1
- package/dist/{chunk-QPHWRD25.js → chunk-MCORUYWB.js} +3 -3
- package/dist/{chunk-QPHWRD25.js.map → chunk-MCORUYWB.js.map} +1 -1
- package/dist/{chunk-2JYK52HV.js → chunk-MJFCMUIY.js} +4 -4
- package/dist/{chunk-2JYK52HV.js.map → chunk-MJFCMUIY.js.map} +1 -1
- package/dist/{chunk-7PHOSSLJ.cjs → chunk-NHSPO4BN.cjs} +9 -9
- package/dist/{chunk-7PHOSSLJ.cjs.map → chunk-NHSPO4BN.cjs.map} +1 -1
- package/dist/{chunk-5QT67VYJ.cjs → chunk-NR5NQ6TV.cjs} +10 -10
- package/dist/{chunk-5QT67VYJ.cjs.map → chunk-NR5NQ6TV.cjs.map} +1 -1
- package/dist/{chunk-DT4GG5BF.cjs → chunk-NRMQMPUE.cjs} +7 -7
- package/dist/{chunk-DT4GG5BF.cjs.map → chunk-NRMQMPUE.cjs.map} +1 -1
- package/dist/{chunk-FGBIJ6PL.js → chunk-NW4JBVY2.js} +4 -4
- package/dist/{chunk-FGBIJ6PL.js.map → chunk-NW4JBVY2.js.map} +1 -1
- package/dist/{chunk-2QRCHYTZ.cjs → chunk-OLY33H6E.cjs} +7 -7
- package/dist/{chunk-2QRCHYTZ.cjs.map → chunk-OLY33H6E.cjs.map} +1 -1
- package/dist/{chunk-2IWLOBSF.cjs → chunk-OUQ63IJQ.cjs} +6 -6
- package/dist/{chunk-2IWLOBSF.cjs.map → chunk-OUQ63IJQ.cjs.map} +1 -1
- package/dist/{chunk-VUHNBLFA.js → chunk-PHFBF5ON.js} +3 -3
- package/dist/{chunk-VUHNBLFA.js.map → chunk-PHFBF5ON.js.map} +1 -1
- package/dist/{chunk-4MNVJVK3.cjs → chunk-PL3M46GS.cjs} +6 -6
- package/dist/{chunk-4MNVJVK3.cjs.map → chunk-PL3M46GS.cjs.map} +1 -1
- package/dist/{chunk-JYVRX3BX.cjs → chunk-PNHDHEBQ.cjs} +8 -8
- package/dist/{chunk-JYVRX3BX.cjs.map → chunk-PNHDHEBQ.cjs.map} +1 -1
- package/dist/{chunk-QYI7ZV3B.cjs → chunk-PX7MLSIH.cjs} +369 -124
- package/dist/chunk-PX7MLSIH.cjs.map +1 -0
- package/dist/{chunk-YCL43UQM.cjs → chunk-QCEC2KBW.cjs} +12 -12
- package/dist/{chunk-YCL43UQM.cjs.map → chunk-QCEC2KBW.cjs.map} +1 -1
- package/dist/{chunk-ZFGLBJYC.js → chunk-QRVTY6UU.js} +3 -3
- package/dist/{chunk-ZFGLBJYC.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-QPHUAF3R.cjs → chunk-QVQKYVD2.cjs} +8 -8
- package/dist/{chunk-QPHUAF3R.cjs.map → chunk-QVQKYVD2.cjs.map} +1 -1
- package/dist/{chunk-CUIPBYMG.cjs → chunk-RIJPMRKC.cjs} +8 -8
- package/dist/{chunk-CUIPBYMG.cjs.map → chunk-RIJPMRKC.cjs.map} +1 -1
- package/dist/{chunk-5QVUBGM7.js → chunk-RKX7GKOU.js} +4 -4
- package/dist/{chunk-5QVUBGM7.js.map → chunk-RKX7GKOU.js.map} +1 -1
- package/dist/{chunk-3SVNEKXE.cjs → chunk-ROUFAI5M.cjs} +11 -11
- package/dist/{chunk-3SVNEKXE.cjs.map → chunk-ROUFAI5M.cjs.map} +1 -1
- package/dist/{chunk-55ZTXQQQ.cjs → chunk-S52RCLDQ.cjs} +12 -12
- package/dist/{chunk-55ZTXQQQ.cjs.map → chunk-S52RCLDQ.cjs.map} +1 -1
- package/dist/{chunk-GRXHW5S3.cjs → chunk-SEOHPUXV.cjs} +12 -12
- package/dist/{chunk-GRXHW5S3.cjs.map → chunk-SEOHPUXV.cjs.map} +1 -1
- package/dist/{chunk-KHG3G2ZX.js → chunk-SI4VJK4A.js} +3 -3
- package/dist/{chunk-KHG3G2ZX.js.map → chunk-SI4VJK4A.js.map} +1 -1
- package/dist/{chunk-VGJD4F4H.js → chunk-SUB5WML4.js} +3 -3
- package/dist/{chunk-VGJD4F4H.js.map → chunk-SUB5WML4.js.map} +1 -1
- package/dist/{chunk-CA42BCSM.cjs → chunk-T5NDUMLD.cjs} +8 -8
- package/dist/{chunk-CA42BCSM.cjs.map → chunk-T5NDUMLD.cjs.map} +1 -1
- package/dist/{chunk-QEPMEEZC.cjs → chunk-TKHYY3B5.cjs} +6 -6
- package/dist/{chunk-QEPMEEZC.cjs.map → chunk-TKHYY3B5.cjs.map} +1 -1
- package/dist/{chunk-LXYNL7BI.cjs → chunk-TMQ2V5B2.cjs} +10 -10
- package/dist/{chunk-LXYNL7BI.cjs.map → chunk-TMQ2V5B2.cjs.map} +1 -1
- package/dist/{chunk-R2W3RJFW.cjs → chunk-TNIMRV3N.cjs} +13 -13
- package/dist/{chunk-R2W3RJFW.cjs.map → chunk-TNIMRV3N.cjs.map} +1 -1
- package/dist/{chunk-NQ7Y6ZKH.js → chunk-TUPPYHUR.js} +3 -3
- package/dist/{chunk-NQ7Y6ZKH.js.map → chunk-TUPPYHUR.js.map} +1 -1
- package/dist/{chunk-MSCRIA2U.cjs → chunk-U456ET3M.cjs} +12 -12
- package/dist/{chunk-MSCRIA2U.cjs.map → chunk-U456ET3M.cjs.map} +1 -1
- package/dist/{chunk-NE2W2MF3.cjs → chunk-UMS2MPYC.cjs} +10 -10
- package/dist/{chunk-NE2W2MF3.cjs.map → chunk-UMS2MPYC.cjs.map} +1 -1
- package/dist/{chunk-DAAU5H24.js → chunk-UNQBXGX5.js} +3 -3
- package/dist/{chunk-DAAU5H24.js.map → chunk-UNQBXGX5.js.map} +1 -1
- package/dist/{chunk-VBMLJUBE.js → chunk-V3AENTZB.js} +4 -4
- package/dist/{chunk-VBMLJUBE.js.map → chunk-V3AENTZB.js.map} +1 -1
- package/dist/{chunk-3JB4JBBK.js → chunk-V5LLTYOY.js} +4 -4
- package/dist/{chunk-3JB4JBBK.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-MEERXUZS.js → chunk-VJT5UA7J.js} +4 -4
- package/dist/{chunk-MEERXUZS.js.map → chunk-VJT5UA7J.js.map} +1 -1
- package/dist/{chunk-JVVGQLJQ.cjs → chunk-W626EAS5.cjs} +100 -6
- package/dist/chunk-W626EAS5.cjs.map +1 -0
- package/dist/{chunk-IOV77VHP.js → chunk-WHGNA44O.js} +4 -4
- package/dist/{chunk-IOV77VHP.js.map → chunk-WHGNA44O.js.map} +1 -1
- package/dist/{chunk-ZYXRRVR6.js → chunk-WIA4MDRX.js} +3 -3
- package/dist/{chunk-ZYXRRVR6.js.map → chunk-WIA4MDRX.js.map} +1 -1
- package/dist/{chunk-OEGSDOJ2.cjs → chunk-WOYVHVXC.cjs} +7 -7
- package/dist/{chunk-OEGSDOJ2.cjs.map → chunk-WOYVHVXC.cjs.map} +1 -1
- package/dist/{chunk-V5Q6UNUK.cjs → chunk-X5SG6MFS.cjs} +4 -4
- package/dist/{chunk-V5Q6UNUK.cjs.map → chunk-X5SG6MFS.cjs.map} +1 -1
- package/dist/{chunk-LRHMLNPW.js → chunk-XB5K7OYD.js} +353 -108
- package/dist/chunk-XB5K7OYD.js.map +1 -0
- package/dist/{chunk-AEQXFDL7.js → chunk-XIVC32HU.js} +100 -6
- package/dist/chunk-XIVC32HU.js.map +1 -0
- package/dist/{chunk-TC3H6ZED.js → chunk-XQ7BTVV3.js} +4 -4
- package/dist/{chunk-TC3H6ZED.js.map → chunk-XQ7BTVV3.js.map} +1 -1
- package/dist/{chunk-4D6PVH2C.cjs → chunk-YMOQGTGJ.cjs} +9 -9
- package/dist/{chunk-4D6PVH2C.cjs.map → chunk-YMOQGTGJ.cjs.map} +1 -1
- package/dist/{chunk-2IMUTDTD.cjs → chunk-YOK3JGW5.cjs} +10 -10
- package/dist/{chunk-2IMUTDTD.cjs.map → chunk-YOK3JGW5.cjs.map} +1 -1
- package/dist/{chunk-24557PYN.js → chunk-YUIHMAHA.js} +3 -3
- package/dist/{chunk-24557PYN.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-W476ER4X.cjs → chunk-ZCLW4B5S.cjs} +17 -17
- package/dist/{chunk-W476ER4X.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 +12 -2
- package/dist/index.d.ts +12 -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-AEQXFDL7.js.map +0 -1
- package/dist/chunk-JVVGQLJQ.cjs.map +0 -1
- package/dist/chunk-LRHMLNPW.js.map +0 -1
- package/dist/chunk-QYI7ZV3B.cjs.map +0 -1
- package/dist/graph-type-Bg04GFeS.d.ts +0 -15
- package/dist/graph-type-DF-vww8T.d.cts +0 -15
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkX5SG6MFS_cjs = require('./chunk-X5SG6MFS.cjs');
|
|
4
|
+
var chunkW626EAS5_cjs = require('./chunk-W626EAS5.cjs');
|
|
5
|
+
|
|
6
|
+
// src/charts/pack/pack-type.ts
|
|
7
|
+
var packChartType = {
|
|
8
|
+
type: "pack",
|
|
9
|
+
getScaleTypes() {
|
|
10
|
+
return { x: "categorical", y: "linear" };
|
|
11
|
+
},
|
|
12
|
+
prepareData(data, options) {
|
|
13
|
+
return chunkX5SG6MFS_cjs.prepareNoAxes(data, options);
|
|
14
|
+
},
|
|
15
|
+
render(ctx) {
|
|
16
|
+
const { data, area, theme, options } = ctx;
|
|
17
|
+
const nodes = [];
|
|
18
|
+
const series = data.series[0];
|
|
19
|
+
if (!series || series.values.length === 0) return nodes;
|
|
20
|
+
const items = series.values.map((v, i) => ({ value: Math.abs(v), index: i })).filter((d) => d.value > 0).sort((a, b) => b.value - a.value);
|
|
21
|
+
if (items.length === 0) return nodes;
|
|
22
|
+
const maxVal = items[0].value;
|
|
23
|
+
const maxR = Math.min(area.width, area.height) * 0.35;
|
|
24
|
+
const minR = Math.max(8, maxR * 0.06);
|
|
25
|
+
const radii = items.map((d) => minR + Math.sqrt(d.value / maxVal) * (maxR - minR));
|
|
26
|
+
const placed = packCircles(radii, area);
|
|
27
|
+
for (let k = 0; k < items.length; k++) {
|
|
28
|
+
const item = items[k];
|
|
29
|
+
const p = placed[k];
|
|
30
|
+
if (!p) continue;
|
|
31
|
+
const color = options.colors[item.index % options.colors.length];
|
|
32
|
+
const label = String(data.labels[item.index] ?? `Item ${item.index + 1}`);
|
|
33
|
+
const r = radii[k];
|
|
34
|
+
const cellNodes = [];
|
|
35
|
+
cellNodes.push(chunkW626EAS5_cjs.circle(p.x, p.y, r, {
|
|
36
|
+
class: "chartts-pack-circle",
|
|
37
|
+
fill: color,
|
|
38
|
+
fillOpacity: 0.6,
|
|
39
|
+
stroke: color,
|
|
40
|
+
strokeWidth: 1.5,
|
|
41
|
+
style: `--chartts-i:${k}`,
|
|
42
|
+
"data-series": 0,
|
|
43
|
+
"data-index": item.index,
|
|
44
|
+
tabindex: 0,
|
|
45
|
+
role: "img",
|
|
46
|
+
ariaLabel: `${label}: ${series.values[item.index]}`
|
|
47
|
+
}));
|
|
48
|
+
if (r > 18) {
|
|
49
|
+
const fontSize = Math.min(theme.fontSizeSmall, r * 0.45);
|
|
50
|
+
cellNodes.push(chunkW626EAS5_cjs.text(p.x, p.y - fontSize * 0.3, label, {
|
|
51
|
+
class: "chartts-pack-label",
|
|
52
|
+
fill: "#fff",
|
|
53
|
+
textAnchor: "middle",
|
|
54
|
+
dominantBaseline: "central",
|
|
55
|
+
fontSize,
|
|
56
|
+
fontFamily: theme.fontFamily,
|
|
57
|
+
fontWeight: 600,
|
|
58
|
+
pointerEvents: "none"
|
|
59
|
+
}));
|
|
60
|
+
if (r > 28) {
|
|
61
|
+
cellNodes.push(chunkW626EAS5_cjs.text(p.x, p.y + fontSize * 0.8, String(series.values[item.index]), {
|
|
62
|
+
class: "chartts-pack-value",
|
|
63
|
+
fill: "rgba(255,255,255,0.7)",
|
|
64
|
+
textAnchor: "middle",
|
|
65
|
+
dominantBaseline: "central",
|
|
66
|
+
fontSize: fontSize * 0.8,
|
|
67
|
+
fontFamily: theme.fontFamily,
|
|
68
|
+
pointerEvents: "none"
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
nodes.push(chunkW626EAS5_cjs.group(cellNodes, {
|
|
73
|
+
class: `chartts-series chartts-series-${item.index}`,
|
|
74
|
+
"data-series-name": label
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
return nodes;
|
|
78
|
+
},
|
|
79
|
+
hitTest(ctx, mx, my) {
|
|
80
|
+
const { data, area } = ctx;
|
|
81
|
+
const series = data.series[0];
|
|
82
|
+
if (!series || series.values.length === 0) return null;
|
|
83
|
+
const items = series.values.map((v, i) => ({ value: Math.abs(v), index: i })).filter((d) => d.value > 0).sort((a, b) => b.value - a.value);
|
|
84
|
+
if (items.length === 0) return null;
|
|
85
|
+
const maxVal = items[0].value;
|
|
86
|
+
const maxR = Math.min(area.width, area.height) * 0.35;
|
|
87
|
+
const minR = Math.max(8, maxR * 0.06);
|
|
88
|
+
const radii = items.map((d) => minR + Math.sqrt(d.value / maxVal) * (maxR - minR));
|
|
89
|
+
const placed = packCircles(radii, area);
|
|
90
|
+
let best = null;
|
|
91
|
+
for (let k = 0; k < items.length; k++) {
|
|
92
|
+
const p = placed[k];
|
|
93
|
+
if (!p) continue;
|
|
94
|
+
const r = radii[k];
|
|
95
|
+
const dist = Math.sqrt((mx - p.x) ** 2 + (my - p.y) ** 2);
|
|
96
|
+
if (dist <= r && (!best || r < best.r)) {
|
|
97
|
+
best = { idx: items[k].index, r, x: p.x, y: p.y };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (!best) return null;
|
|
101
|
+
return { seriesIndex: 0, pointIndex: best.idx, distance: 0, x: best.x, y: best.y };
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
function packCircles(radii, area) {
|
|
105
|
+
const cx = area.x + area.width / 2;
|
|
106
|
+
const cy = area.y + area.height / 2;
|
|
107
|
+
const result = [];
|
|
108
|
+
if (radii.length === 0) return result;
|
|
109
|
+
result.push({ x: cx, y: cy });
|
|
110
|
+
for (let i = 1; i < radii.length; i++) {
|
|
111
|
+
const r = radii[i];
|
|
112
|
+
let bestPos = { x: cx, y: cy };
|
|
113
|
+
let bestDist = Infinity;
|
|
114
|
+
for (let j = 0; j < result.length; j++) {
|
|
115
|
+
const pj = result[j];
|
|
116
|
+
const rj = radii[j];
|
|
117
|
+
const gap = rj + r + 2;
|
|
118
|
+
for (let a = 0; a < 12; a++) {
|
|
119
|
+
const angle = a / 12 * Math.PI * 2;
|
|
120
|
+
const tx = pj.x + Math.cos(angle) * gap;
|
|
121
|
+
const ty = pj.y + Math.sin(angle) * gap;
|
|
122
|
+
let overlaps = false;
|
|
123
|
+
for (let k = 0; k < result.length; k++) {
|
|
124
|
+
const pk = result[k];
|
|
125
|
+
const rk = radii[k];
|
|
126
|
+
const dist = Math.sqrt((tx - pk.x) ** 2 + (ty - pk.y) ** 2);
|
|
127
|
+
if (dist < rk + r + 1) {
|
|
128
|
+
overlaps = true;
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (!overlaps) {
|
|
133
|
+
const distFromCenter = Math.sqrt((tx - cx) ** 2 + (ty - cy) ** 2);
|
|
134
|
+
if (distFromCenter < bestDist) {
|
|
135
|
+
bestDist = distFromCenter;
|
|
136
|
+
bestPos = { x: tx, y: ty };
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
result.push(bestPos);
|
|
142
|
+
}
|
|
143
|
+
return result;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
exports.packChartType = packChartType;
|
|
147
|
+
//# sourceMappingURL=chunk-JRTD6Y34.cjs.map
|
|
148
|
+
//# sourceMappingURL=chunk-JRTD6Y34.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/charts/pack/pack-type.ts"],"names":["prepareNoAxes","circle","text","group"],"mappings":"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","file":"chunk-JRTD6Y34.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 } from '../../render/tree'\n\n/**\n * Pack (Circle Packing) chart — nested circles where area is proportional to value.\n *\n * Uses a front-chain packing algorithm to arrange circles tightly.\n */\nexport const packChartType: ChartTypePlugin = {\n type: 'pack',\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 items = series.values\n .map((v, i) => ({ value: Math.abs(v), index: i }))\n .filter(d => d.value > 0)\n .sort((a, b) => b.value - a.value)\n\n if (items.length === 0) return nodes\n\n // Compute radii proportional to sqrt(value) so AREA is proportional to value\n const maxVal = items[0]!.value\n const maxR = Math.min(area.width, area.height) * 0.35\n const minR = Math.max(8, maxR * 0.06)\n\n const radii = items.map(d => minR + Math.sqrt(d.value / maxVal) * (maxR - minR))\n\n // Pack circles using a simple greedy placement\n const placed = packCircles(radii, area)\n\n for (let k = 0; k < items.length; k++) {\n const item = items[k]!\n const p = placed[k]\n if (!p) continue\n\n const color = options.colors[item.index % options.colors.length]!\n const label = String(data.labels[item.index] ?? `Item ${item.index + 1}`)\n const r = radii[k]!\n\n const cellNodes: RenderNode[] = []\n\n cellNodes.push(circle(p.x, p.y, r, {\n class: 'chartts-pack-circle',\n fill: color,\n fillOpacity: 0.6,\n stroke: color,\n strokeWidth: 1.5,\n style: `--chartts-i:${k}`,\n 'data-series': 0,\n 'data-index': item.index,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${label}: ${series.values[item.index]}`,\n }))\n\n // Label if circle is big enough\n if (r > 18) {\n const fontSize = Math.min(theme.fontSizeSmall, r * 0.45)\n cellNodes.push(text(p.x, p.y - fontSize * 0.3, label, {\n class: 'chartts-pack-label',\n fill: '#fff',\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize,\n fontFamily: theme.fontFamily,\n fontWeight: 600,\n pointerEvents: 'none',\n }))\n\n if (r > 28) {\n cellNodes.push(text(p.x, p.y + fontSize * 0.8, String(series.values[item.index]), {\n class: 'chartts-pack-value',\n fill: 'rgba(255,255,255,0.7)',\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize: fontSize * 0.8,\n fontFamily: theme.fontFamily,\n pointerEvents: 'none',\n }))\n }\n }\n\n nodes.push(group(cellNodes, {\n class: `chartts-series chartts-series-${item.index}`,\n 'data-series-name': label,\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 items = series.values\n .map((v, i) => ({ value: Math.abs(v), index: i }))\n .filter(d => d.value > 0)\n .sort((a, b) => b.value - a.value)\n\n if (items.length === 0) return null\n\n const maxVal = items[0]!.value\n const maxR = Math.min(area.width, area.height) * 0.35\n const minR = Math.max(8, maxR * 0.06)\n const radii = items.map(d => minR + Math.sqrt(d.value / maxVal) * (maxR - minR))\n const placed = packCircles(radii, area)\n\n // Find smallest circle containing the mouse (most specific)\n let best: { idx: number; r: number; x: number; y: number } | null = null\n\n for (let k = 0; k < items.length; k++) {\n const p = placed[k]\n if (!p) continue\n const r = radii[k]!\n const dist = Math.sqrt((mx - p.x) ** 2 + (my - p.y) ** 2)\n if (dist <= r && (!best || r < best.r)) {\n best = { idx: items[k]!.index, r, x: p.x, y: p.y }\n }\n }\n\n if (!best) return null\n return { seriesIndex: 0, pointIndex: best.idx, distance: 0, x: best.x, y: best.y }\n },\n}\n\ninterface Pos { x: number; y: number }\n\n/** Greedy circle packing within a rectangular area. */\nfunction packCircles(radii: number[], area: { x: number; y: number; width: number; height: number }): Pos[] {\n const cx = area.x + area.width / 2\n const cy = area.y + area.height / 2\n const result: Pos[] = []\n\n if (radii.length === 0) return result\n\n // Place first circle at center\n result.push({ x: cx, y: cy })\n\n for (let i = 1; i < radii.length; i++) {\n const r = radii[i]!\n let bestPos: Pos = { x: cx, y: cy }\n let bestDist = Infinity\n\n // Try placing tangent to each existing circle, at various angles\n for (let j = 0; j < result.length; j++) {\n const pj = result[j]!\n const rj = radii[j]!\n const gap = rj + r + 2\n\n for (let a = 0; a < 12; a++) {\n const angle = (a / 12) * Math.PI * 2\n const tx = pj.x + Math.cos(angle) * gap\n const ty = pj.y + Math.sin(angle) * gap\n\n // Check overlap with all placed circles\n let overlaps = false\n for (let k = 0; k < result.length; k++) {\n const pk = result[k]!\n const rk = radii[k]!\n const dist = Math.sqrt((tx - pk.x) ** 2 + (ty - pk.y) ** 2)\n if (dist < rk + r + 1) { overlaps = true; break }\n }\n\n if (!overlaps) {\n // Prefer positions closer to center\n const distFromCenter = Math.sqrt((tx - cx) ** 2 + (ty - cy) ** 2)\n if (distFromCenter < bestDist) {\n bestDist = distFromCenter\n bestPos = { x: tx, y: ty }\n }\n }\n }\n }\n\n result.push(bestPos)\n }\n\n return result\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { prepareNoAxes } from './chunk-
|
|
2
|
-
import { rect, text, group } from './chunk-
|
|
1
|
+
import { prepareNoAxes } from './chunk-LKSKGQX7.js';
|
|
2
|
+
import { rect, text, group } from './chunk-XIVC32HU.js';
|
|
3
3
|
|
|
4
4
|
// src/charts/treemap/treemap-type.ts
|
|
5
5
|
var treemapChartType = {
|
|
@@ -147,5 +147,5 @@ function layoutRow(values, start, x, y, w, h, rects) {
|
|
|
147
147
|
}
|
|
148
148
|
|
|
149
149
|
export { treemapChartType };
|
|
150
|
-
//# sourceMappingURL=chunk-
|
|
151
|
-
//# sourceMappingURL=chunk-
|
|
150
|
+
//# sourceMappingURL=chunk-K7NVM76W.js.map
|
|
151
|
+
//# sourceMappingURL=chunk-K7NVM76W.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/charts/treemap/treemap-type.ts"],"names":["rowThickness"],"mappings":"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","file":"chunk-KNMEXOKJ.js","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareNoAxes } from '../../utils/prepare'\nimport { group, rect, text } from '../../render/tree'\n\n/**\n * Treemap chart — rectangular space-filling visualization.\n *\n * Uses the first series' values as areas. Labels are cell labels.\n * Implements a simple squarified treemap layout.\n */\nexport const treemapChartType: ChartTypePlugin = {\n type: 'treemap',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n return prepareNoAxes(data, options)\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, area, theme, options } = ctx\n const nodes: RenderNode[] = []\n\n const series = data.series[0]\n if (!series || series.values.length === 0) return nodes\n\n // Build items sorted by value descending\n const items = series.values\n .map((v, i) => ({ value: Math.abs(v), index: i }))\n .filter(d => d.value > 0)\n .sort((a, b) => b.value - a.value)\n\n if (items.length === 0) return nodes\n\n const total = items.reduce((s, d) => s + d.value, 0)\n const gap = 2\n\n // Layout using slice-and-dice (simpler, works well)\n const rects = squarify(items.map(d => d.value / total), area.x, area.y, area.width, area.height)\n\n for (let k = 0; k < items.length; k++) {\n const item = items[k]!\n const r = rects[k]!\n const colorIndex = item.index % options.colors.length\n const color = options.colors[colorIndex]!\n const label = String(data.labels[item.index] ?? `Item ${item.index + 1}`)\n\n const cellNodes: RenderNode[] = []\n\n cellNodes.push(rect(r.x + gap / 2, r.y + gap / 2, r.w - gap, r.h - gap, {\n class: 'chartts-treemap-cell',\n fill: color,\n fillOpacity: 0.75,\n rx: 5,\n ry: 5,\n 'data-series': 0,\n 'data-index': item.index,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${label}: ${series.values[item.index]}`,\n }))\n\n // Only show label if cell is big enough\n if (r.w > 30 && r.h > 20) {\n const fontSize = Math.min(theme.fontSizeSmall, r.w * 0.15, r.h * 0.3)\n cellNodes.push(text(r.x + r.w / 2, r.y + r.h / 2 - fontSize * 0.3, label, {\n class: 'chartts-treemap-label',\n fill: '#fff',\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize,\n fontFamily: theme.fontFamily,\n fontWeight: 600,\n }))\n\n // Show value below label\n if (r.h > 35) {\n cellNodes.push(text(r.x + r.w / 2, r.y + r.h / 2 + fontSize * 0.8, String(series.values[item.index]), {\n class: 'chartts-treemap-value',\n fill: 'rgba(255,255,255,0.7)',\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize: fontSize * 0.85,\n fontFamily: theme.fontFamily,\n }))\n }\n }\n\n nodes.push(group(cellNodes, {\n class: `chartts-series chartts-series-${item.index}`,\n 'data-series-name': label,\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 items = series.values\n .map((v, i) => ({ value: Math.abs(v), index: i }))\n .filter(d => d.value > 0)\n .sort((a, b) => b.value - a.value)\n\n if (items.length === 0) return null\n const total = items.reduce((s, d) => s + d.value, 0)\n const rects = squarify(items.map(d => d.value / total), area.x, area.y, area.width, area.height)\n\n for (let k = 0; k < items.length; k++) {\n const r = rects[k]!\n if (mx >= r.x && mx <= r.x + r.w && my >= r.y && my <= r.y + r.h) {\n return { seriesIndex: 0, pointIndex: items[k]!.index, distance: 0, x: r.x + r.w / 2, y: r.y + r.h / 2 }\n }\n }\n\n return null\n },\n}\n\ninterface Rect { x: number; y: number; w: number; h: number }\n\n/**\n * Squarified treemap layout.\n * Takes normalized values (sum to 1) and fills a rectangle.\n */\nfunction squarify(values: number[], x: number, y: number, w: number, h: number): Rect[] {\n const rects: Rect[] = []\n layoutRow(values, 0, x, y, w, h, rects)\n return rects\n}\n\nfunction layoutRow(\n values: number[], start: number,\n x: number, y: number, w: number, h: number,\n rects: Rect[],\n): void {\n if (start >= values.length) return\n if (values.length - start === 1) {\n rects.push({ x, y, w, h })\n return\n }\n\n const isWide = w >= h\n\n // Greedily add items to the current row until aspect ratio gets worse\n let rowSum = 0\n let bestWorst = Infinity\n let rowEnd = start\n\n for (let i = start; i < values.length; i++) {\n const newSum = rowSum + values[i]!\n\n // Compute row takes up fraction of the short side\n const rowFraction = newSum\n const rowThickness = isWide ? w * rowFraction : h * rowFraction\n const count = i - start + 1\n\n if (rowThickness <= 0) { rowSum = newSum; rowEnd = i + 1; continue }\n\n // Worst aspect ratio in this row\n let worst = 0\n for (let j = start; j <= i; j++) {\n const cellFrac = values[j]! / newSum\n const cellLen = isWide ? h * cellFrac : w * cellFrac\n const ar = Math.max(rowThickness / cellLen, cellLen / rowThickness)\n if (ar > worst) worst = ar\n }\n\n if (count === 1 || worst <= bestWorst) {\n bestWorst = worst\n rowSum = newSum\n rowEnd = i + 1\n } else {\n break\n }\n }\n\n if (rowEnd === start) rowEnd = start + 1\n const finalSum = values.slice(start, rowEnd).reduce((a, b) => a + b, 0)\n\n // Lay out this row\n const rowThickness = isWide ? w * finalSum : h * finalSum\n let offset = 0\n\n for (let i = start; i < rowEnd; i++) {\n const frac = finalSum > 0 ? values[i]! / finalSum : 0\n const cellLen = isWide ? h * frac : w * frac\n\n if (isWide) {\n rects.push({ x, y: y + offset, w: rowThickness, h: cellLen })\n } else {\n rects.push({ x: x + offset, y, w: cellLen, h: rowThickness })\n }\n offset += cellLen\n }\n\n // Recurse for remaining items\n if (isWide) {\n layoutRow(values, rowEnd, x + rowThickness, y, w - rowThickness, h, rects)\n } else {\n layoutRow(values, rowEnd, x, y + rowThickness, w, h - rowThickness, rects)\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/charts/treemap/treemap-type.ts"],"names":["rowThickness"],"mappings":"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","file":"chunk-K7NVM76W.js","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareNoAxes } from '../../utils/prepare'\nimport { group, rect, text } from '../../render/tree'\n\n/**\n * Treemap chart — rectangular space-filling visualization.\n *\n * Uses the first series' values as areas. Labels are cell labels.\n * Implements a simple squarified treemap layout.\n */\nexport const treemapChartType: ChartTypePlugin = {\n type: 'treemap',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n return prepareNoAxes(data, options)\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, area, theme, options } = ctx\n const nodes: RenderNode[] = []\n\n const series = data.series[0]\n if (!series || series.values.length === 0) return nodes\n\n // Build items sorted by value descending\n const items = series.values\n .map((v, i) => ({ value: Math.abs(v), index: i }))\n .filter(d => d.value > 0)\n .sort((a, b) => b.value - a.value)\n\n if (items.length === 0) return nodes\n\n const total = items.reduce((s, d) => s + d.value, 0)\n const gap = 2\n\n // Layout using slice-and-dice (simpler, works well)\n const rects = squarify(items.map(d => d.value / total), area.x, area.y, area.width, area.height)\n\n for (let k = 0; k < items.length; k++) {\n const item = items[k]!\n const r = rects[k]!\n const colorIndex = item.index % options.colors.length\n const color = options.colors[colorIndex]!\n const label = String(data.labels[item.index] ?? `Item ${item.index + 1}`)\n\n const cellNodes: RenderNode[] = []\n\n cellNodes.push(rect(r.x + gap / 2, r.y + gap / 2, r.w - gap, r.h - gap, {\n class: 'chartts-treemap-cell',\n fill: color,\n fillOpacity: 0.75,\n rx: 5,\n ry: 5,\n 'data-series': 0,\n 'data-index': item.index,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${label}: ${series.values[item.index]}`,\n }))\n\n // Only show label if cell is big enough\n if (r.w > 30 && r.h > 20) {\n const fontSize = Math.min(theme.fontSizeSmall, r.w * 0.15, r.h * 0.3)\n cellNodes.push(text(r.x + r.w / 2, r.y + r.h / 2 - fontSize * 0.3, label, {\n class: 'chartts-treemap-label',\n fill: '#fff',\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize,\n fontFamily: theme.fontFamily,\n fontWeight: 600,\n }))\n\n // Show value below label\n if (r.h > 35) {\n cellNodes.push(text(r.x + r.w / 2, r.y + r.h / 2 + fontSize * 0.8, String(series.values[item.index]), {\n class: 'chartts-treemap-value',\n fill: 'rgba(255,255,255,0.7)',\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize: fontSize * 0.85,\n fontFamily: theme.fontFamily,\n }))\n }\n }\n\n nodes.push(group(cellNodes, {\n class: `chartts-series chartts-series-${item.index}`,\n 'data-series-name': label,\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 items = series.values\n .map((v, i) => ({ value: Math.abs(v), index: i }))\n .filter(d => d.value > 0)\n .sort((a, b) => b.value - a.value)\n\n if (items.length === 0) return null\n const total = items.reduce((s, d) => s + d.value, 0)\n const rects = squarify(items.map(d => d.value / total), area.x, area.y, area.width, area.height)\n\n for (let k = 0; k < items.length; k++) {\n const r = rects[k]!\n if (mx >= r.x && mx <= r.x + r.w && my >= r.y && my <= r.y + r.h) {\n return { seriesIndex: 0, pointIndex: items[k]!.index, distance: 0, x: r.x + r.w / 2, y: r.y + r.h / 2 }\n }\n }\n\n return null\n },\n}\n\ninterface Rect { x: number; y: number; w: number; h: number }\n\n/**\n * Squarified treemap layout.\n * Takes normalized values (sum to 1) and fills a rectangle.\n */\nfunction squarify(values: number[], x: number, y: number, w: number, h: number): Rect[] {\n const rects: Rect[] = []\n layoutRow(values, 0, x, y, w, h, rects)\n return rects\n}\n\nfunction layoutRow(\n values: number[], start: number,\n x: number, y: number, w: number, h: number,\n rects: Rect[],\n): void {\n if (start >= values.length) return\n if (values.length - start === 1) {\n rects.push({ x, y, w, h })\n return\n }\n\n const isWide = w >= h\n\n // Greedily add items to the current row until aspect ratio gets worse\n let rowSum = 0\n let bestWorst = Infinity\n let rowEnd = start\n\n for (let i = start; i < values.length; i++) {\n const newSum = rowSum + values[i]!\n\n // Compute row takes up fraction of the short side\n const rowFraction = newSum\n const rowThickness = isWide ? w * rowFraction : h * rowFraction\n const count = i - start + 1\n\n if (rowThickness <= 0) { rowSum = newSum; rowEnd = i + 1; continue }\n\n // Worst aspect ratio in this row\n let worst = 0\n for (let j = start; j <= i; j++) {\n const cellFrac = values[j]! / newSum\n const cellLen = isWide ? h * cellFrac : w * cellFrac\n const ar = Math.max(rowThickness / cellLen, cellLen / rowThickness)\n if (ar > worst) worst = ar\n }\n\n if (count === 1 || worst <= bestWorst) {\n bestWorst = worst\n rowSum = newSum\n rowEnd = i + 1\n } else {\n break\n }\n }\n\n if (rowEnd === start) rowEnd = start + 1\n const finalSum = values.slice(start, rowEnd).reduce((a, b) => a + b, 0)\n\n // Lay out this row\n const rowThickness = isWide ? w * finalSum : h * finalSum\n let offset = 0\n\n for (let i = start; i < rowEnd; i++) {\n const frac = finalSum > 0 ? values[i]! / finalSum : 0\n const cellLen = isWide ? h * frac : w * frac\n\n if (isWide) {\n rects.push({ x, y: y + offset, w: rowThickness, h: cellLen })\n } else {\n rects.push({ x: x + offset, y, w: cellLen, h: rowThickness })\n }\n offset += cellLen\n }\n\n // Recurse for remaining items\n if (isWide) {\n layoutRow(values, rowEnd, x + rowThickness, y, w - rowThickness, h, rects)\n } else {\n layoutRow(values, rowEnd, x, y + rowThickness, w, h - rowThickness, rects)\n }\n}\n"]}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkX5SG6MFS_cjs = require('./chunk-X5SG6MFS.cjs');
|
|
4
|
+
var chunkW626EAS5_cjs = require('./chunk-W626EAS5.cjs');
|
|
5
|
+
|
|
6
|
+
// src/charts/pillar/pillar-type.ts
|
|
7
|
+
var pillarChartType = {
|
|
8
|
+
type: "pillar",
|
|
9
|
+
getScaleTypes() {
|
|
10
|
+
return { x: "categorical", y: "linear" };
|
|
11
|
+
},
|
|
12
|
+
prepareData(data, options) {
|
|
13
|
+
return chunkX5SG6MFS_cjs.prepareNoAxes(data, options);
|
|
14
|
+
},
|
|
15
|
+
render(ctx) {
|
|
16
|
+
const { data, area, theme, options } = ctx;
|
|
17
|
+
const nodes = [];
|
|
18
|
+
const series = data.series[0];
|
|
19
|
+
if (!series || series.values.length === 0) return nodes;
|
|
20
|
+
const opts = options;
|
|
21
|
+
const intensity = opts.intensity ?? 1;
|
|
22
|
+
const showLabels = opts.showLabels ?? true;
|
|
23
|
+
const horizontal = opts.orientation === "horizontal";
|
|
24
|
+
const values = series.values;
|
|
25
|
+
const numRings = values.length;
|
|
26
|
+
let maxVal = 0;
|
|
27
|
+
for (const v of values) if (Math.abs(v) > maxVal) maxVal = Math.abs(v);
|
|
28
|
+
if (maxVal === 0) maxVal = 1;
|
|
29
|
+
const gap = 3;
|
|
30
|
+
const cx = area.x + area.width / 2;
|
|
31
|
+
const cy = area.y + area.height / 2;
|
|
32
|
+
if (horizontal) {
|
|
33
|
+
const totalW = area.width * 0.9;
|
|
34
|
+
const ringW = (totalW - gap * (numRings - 1)) / numRings;
|
|
35
|
+
const maxH = area.height * 0.85 * intensity;
|
|
36
|
+
const startX = cx - totalW / 2;
|
|
37
|
+
for (let i = 0; i < numRings; i++) {
|
|
38
|
+
const norm = Math.abs(values[i]) / maxVal;
|
|
39
|
+
const h = maxH * (0.15 + norm * 0.85);
|
|
40
|
+
const x = startX + i * (ringW + gap);
|
|
41
|
+
const y = cy - h / 2;
|
|
42
|
+
const color = options.colors[i % options.colors.length];
|
|
43
|
+
const colorIndex = i % options.colors.length;
|
|
44
|
+
const r = Math.min(ringW * 0.25, h * 0.15, 8);
|
|
45
|
+
const segNodes = [];
|
|
46
|
+
segNodes.push(chunkW626EAS5_cjs.rect(x, y, ringW, h, {
|
|
47
|
+
fill: `url(#chartts-bar-${colorIndex})`,
|
|
48
|
+
stroke: color,
|
|
49
|
+
strokeWidth: 1,
|
|
50
|
+
rx: r,
|
|
51
|
+
ry: r,
|
|
52
|
+
opacity: 0.92,
|
|
53
|
+
"data-series": 0,
|
|
54
|
+
"data-index": i,
|
|
55
|
+
tabindex: 0,
|
|
56
|
+
role: "img",
|
|
57
|
+
ariaLabel: `${data.labels[i] ?? `Ring ${i + 1}`}: ${values[i]}`
|
|
58
|
+
}));
|
|
59
|
+
if (showLabels) {
|
|
60
|
+
const label = data.labels[i] != null ? String(data.labels[i]) : "";
|
|
61
|
+
const valStr = label ? `${label}
|
|
62
|
+
${values[i]}` : String(values[i]);
|
|
63
|
+
segNodes.push(chunkW626EAS5_cjs.text(x + ringW / 2, cy, valStr, {
|
|
64
|
+
fill: theme.textColor,
|
|
65
|
+
textAnchor: "middle",
|
|
66
|
+
dominantBaseline: "central",
|
|
67
|
+
fontSize: theme.fontSize - 1,
|
|
68
|
+
fontFamily: theme.fontFamily,
|
|
69
|
+
fontWeight: 600
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
nodes.push(chunkW626EAS5_cjs.group(segNodes, {
|
|
73
|
+
class: `chartts-series chartts-series-${i}`,
|
|
74
|
+
"data-series-name": String(data.labels[i] ?? `Ring ${i + 1}`)
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
} else {
|
|
78
|
+
const totalH = area.height * 0.9;
|
|
79
|
+
const ringH = (totalH - gap * (numRings - 1)) / numRings;
|
|
80
|
+
const maxW = area.width * 0.85 * intensity;
|
|
81
|
+
const startY = cy - totalH / 2;
|
|
82
|
+
for (let i = 0; i < numRings; i++) {
|
|
83
|
+
const norm = Math.abs(values[i]) / maxVal;
|
|
84
|
+
const w = maxW * (0.15 + norm * 0.85);
|
|
85
|
+
const x = cx - w / 2;
|
|
86
|
+
const y = startY + i * (ringH + gap);
|
|
87
|
+
const color = options.colors[i % options.colors.length];
|
|
88
|
+
const colorIndex = i % options.colors.length;
|
|
89
|
+
const r = Math.min(w * 0.08, ringH * 0.25, 8);
|
|
90
|
+
const segNodes = [];
|
|
91
|
+
segNodes.push(chunkW626EAS5_cjs.rect(x, y, w, ringH, {
|
|
92
|
+
fill: `url(#chartts-bar-${colorIndex})`,
|
|
93
|
+
stroke: color,
|
|
94
|
+
strokeWidth: 1,
|
|
95
|
+
rx: r,
|
|
96
|
+
ry: r,
|
|
97
|
+
opacity: 0.92,
|
|
98
|
+
"data-series": 0,
|
|
99
|
+
"data-index": i,
|
|
100
|
+
tabindex: 0,
|
|
101
|
+
role: "img",
|
|
102
|
+
ariaLabel: `${data.labels[i] ?? `Ring ${i + 1}`}: ${values[i]}`
|
|
103
|
+
}));
|
|
104
|
+
if (showLabels) {
|
|
105
|
+
const label = data.labels[i] != null ? String(data.labels[i]) : "";
|
|
106
|
+
const valStr = label ? `${label}: ${values[i]}` : String(values[i]);
|
|
107
|
+
segNodes.push(chunkW626EAS5_cjs.text(cx, y + ringH / 2, valStr, {
|
|
108
|
+
fill: theme.textColor,
|
|
109
|
+
textAnchor: "middle",
|
|
110
|
+
dominantBaseline: "central",
|
|
111
|
+
fontSize: theme.fontSize - 1,
|
|
112
|
+
fontFamily: theme.fontFamily,
|
|
113
|
+
fontWeight: 600
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
nodes.push(chunkW626EAS5_cjs.group(segNodes, {
|
|
117
|
+
class: `chartts-series chartts-series-${i}`,
|
|
118
|
+
"data-series-name": String(data.labels[i] ?? `Ring ${i + 1}`)
|
|
119
|
+
}));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return nodes;
|
|
123
|
+
},
|
|
124
|
+
hitTest(ctx, mx, my) {
|
|
125
|
+
const { data, area, options } = ctx;
|
|
126
|
+
const series = data.series[0];
|
|
127
|
+
if (!series || series.values.length === 0) return null;
|
|
128
|
+
const opts = options;
|
|
129
|
+
const horizontal = opts.orientation === "horizontal";
|
|
130
|
+
const numRings = series.values.length;
|
|
131
|
+
const gap = 3;
|
|
132
|
+
const cx = area.x + area.width / 2;
|
|
133
|
+
const cy = area.y + area.height / 2;
|
|
134
|
+
if (horizontal) {
|
|
135
|
+
const totalW = area.width * 0.9;
|
|
136
|
+
const ringW = (totalW - gap * (numRings - 1)) / numRings;
|
|
137
|
+
const startX = cx - totalW / 2;
|
|
138
|
+
const idx = Math.floor((mx - startX) / (ringW + gap));
|
|
139
|
+
if (idx < 0 || idx >= numRings) return null;
|
|
140
|
+
const ringCx = startX + idx * (ringW + gap) + ringW / 2;
|
|
141
|
+
return { seriesIndex: 0, pointIndex: idx, distance: Math.abs(mx - ringCx), x: ringCx, y: cy };
|
|
142
|
+
} else {
|
|
143
|
+
const totalH = area.height * 0.9;
|
|
144
|
+
const ringH = (totalH - gap * (numRings - 1)) / numRings;
|
|
145
|
+
const startY = cy - totalH / 2;
|
|
146
|
+
const idx = Math.floor((my - startY) / (ringH + gap));
|
|
147
|
+
if (idx < 0 || idx >= numRings) return null;
|
|
148
|
+
const ringCy = startY + idx * (ringH + gap) + ringH / 2;
|
|
149
|
+
return { seriesIndex: 0, pointIndex: idx, distance: Math.abs(my - ringCy), x: cx, y: ringCy };
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
exports.pillarChartType = pillarChartType;
|
|
155
|
+
//# sourceMappingURL=chunk-KNUMF6K2.cjs.map
|
|
156
|
+
//# sourceMappingURL=chunk-KNUMF6K2.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/charts/pillar/pillar-type.ts"],"names":["prepareNoAxes","rect","text","group"],"mappings":"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","file":"chunk-KNUMF6K2.cjs","sourcesContent":["/**\n * Pillar chart — stacked rounded-rectangle bars.\n * Each data value = one segment. Width proportional to value.\n * Symmetric rounded rectangles stacked along an axis.\n */\n\nimport type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareNoAxes } from '../../utils/prepare'\nimport { group, rect, text } from '../../render/tree'\n\nexport interface PillarOptions {\n /** Scale for ring width. Default 1. */\n intensity?: number\n /** Show value labels. Default true. */\n showLabels?: boolean\n /** Orientation: 'vertical' (default) or 'horizontal'. */\n orientation?: 'vertical' | 'horizontal'\n}\n\nexport const pillarChartType: ChartTypePlugin = {\n type: 'pillar',\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 const series = data.series[0]\n if (!series || series.values.length === 0) return nodes\n\n const opts = options as unknown as PillarOptions\n const intensity = opts.intensity ?? 1\n const showLabels = opts.showLabels ?? true\n const horizontal = opts.orientation === 'horizontal'\n\n const values = series.values\n const numRings = values.length\n let maxVal = 0\n for (const v of values) if (Math.abs(v) > maxVal) maxVal = Math.abs(v)\n if (maxVal === 0) maxVal = 1\n\n const gap = 3\n const cx = area.x + area.width / 2\n const cy = area.y + area.height / 2\n\n if (horizontal) {\n // Rings stacked left to right, width = data value, height = ring thickness\n const totalW = area.width * 0.9\n const ringW = (totalW - gap * (numRings - 1)) / numRings\n const maxH = area.height * 0.85 * intensity\n const startX = cx - totalW / 2\n\n for (let i = 0; i < numRings; i++) {\n const norm = Math.abs(values[i]!) / maxVal\n const h = maxH * (0.15 + norm * 0.85)\n const x = startX + i * (ringW + gap)\n const y = cy - h / 2\n const color = options.colors[i % options.colors.length]!\n const colorIndex = i % options.colors.length\n const r = Math.min(ringW * 0.25, h * 0.15, 8)\n\n const segNodes: RenderNode[] = []\n segNodes.push(rect(x, y, ringW, h, {\n fill: `url(#chartts-bar-${colorIndex})`,\n stroke: color,\n strokeWidth: 1,\n rx: r, ry: r,\n opacity: 0.92,\n 'data-series': 0,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${data.labels[i] ?? `Ring ${i + 1}`}: ${values[i]}`,\n }))\n\n if (showLabels) {\n const label = data.labels[i] != null ? String(data.labels[i]) : ''\n const valStr = label ? `${label}\\n${values[i]}` : String(values[i])\n segNodes.push(text(x + ringW / 2, cy, valStr, {\n fill: theme.textColor,\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize: theme.fontSize - 1,\n fontFamily: theme.fontFamily,\n fontWeight: 600,\n }))\n }\n\n nodes.push(group(segNodes, {\n class: `chartts-series chartts-series-${i}`,\n 'data-series-name': String(data.labels[i] ?? `Ring ${i + 1}`),\n }))\n }\n } else {\n // Vertical: rings stacked top to bottom, height = ring thickness, width = data value\n const totalH = area.height * 0.9\n const ringH = (totalH - gap * (numRings - 1)) / numRings\n const maxW = area.width * 0.85 * intensity\n const startY = cy - totalH / 2\n\n for (let i = 0; i < numRings; i++) {\n const norm = Math.abs(values[i]!) / maxVal\n const w = maxW * (0.15 + norm * 0.85)\n const x = cx - w / 2\n const y = startY + i * (ringH + gap)\n const color = options.colors[i % options.colors.length]!\n const colorIndex = i % options.colors.length\n const r = Math.min(w * 0.08, ringH * 0.25, 8)\n\n const segNodes: RenderNode[] = []\n segNodes.push(rect(x, y, w, ringH, {\n fill: `url(#chartts-bar-${colorIndex})`,\n stroke: color,\n strokeWidth: 1,\n rx: r, ry: r,\n opacity: 0.92,\n 'data-series': 0,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${data.labels[i] ?? `Ring ${i + 1}`}: ${values[i]}`,\n }))\n\n if (showLabels) {\n const label = data.labels[i] != null ? String(data.labels[i]) : ''\n const valStr = label ? `${label}: ${values[i]}` : String(values[i])\n segNodes.push(text(cx, y + ringH / 2, valStr, {\n fill: theme.textColor,\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize: theme.fontSize - 1,\n fontFamily: theme.fontFamily,\n fontWeight: 600,\n }))\n }\n\n nodes.push(group(segNodes, {\n class: `chartts-series chartts-series-${i}`,\n 'data-series-name': String(data.labels[i] ?? `Ring ${i + 1}`),\n }))\n }\n }\n\n return nodes\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { data, area, options } = ctx\n const series = data.series[0]\n if (!series || series.values.length === 0) return null\n\n const opts = options as unknown as PillarOptions\n const horizontal = opts.orientation === 'horizontal'\n const numRings = series.values.length\n const gap = 3\n const cx = area.x + area.width / 2\n const cy = area.y + area.height / 2\n\n if (horizontal) {\n const totalW = area.width * 0.9\n const ringW = (totalW - gap * (numRings - 1)) / numRings\n const startX = cx - totalW / 2\n const idx = Math.floor((mx - startX) / (ringW + gap))\n if (idx < 0 || idx >= numRings) return null\n const ringCx = startX + idx * (ringW + gap) + ringW / 2\n return { seriesIndex: 0, pointIndex: idx, distance: Math.abs(mx - ringCx), x: ringCx, y: cy }\n } else {\n const totalH = area.height * 0.9\n const ringH = (totalH - gap * (numRings - 1)) / numRings\n const startY = cy - totalH / 2\n const idx = Math.floor((my - startY) / (ringH + gap))\n if (idx < 0 || idx >= numRings) return null\n const ringCy = startY + idx * (ringH + gap) + ringH / 2\n return { seriesIndex: 0, pointIndex: idx, distance: Math.abs(my - ringCy), x: cx, y: ringCy }\n }\n },\n}\n"]}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { prepareNoAxes } from './chunk-LKSKGQX7.js';
|
|
2
|
+
import { circle, text, group } from './chunk-XIVC32HU.js';
|
|
3
|
+
|
|
4
|
+
// src/charts/pack/pack-type.ts
|
|
5
|
+
var packChartType = {
|
|
6
|
+
type: "pack",
|
|
7
|
+
getScaleTypes() {
|
|
8
|
+
return { x: "categorical", y: "linear" };
|
|
9
|
+
},
|
|
10
|
+
prepareData(data, options) {
|
|
11
|
+
return prepareNoAxes(data, options);
|
|
12
|
+
},
|
|
13
|
+
render(ctx) {
|
|
14
|
+
const { data, area, theme, options } = ctx;
|
|
15
|
+
const nodes = [];
|
|
16
|
+
const series = data.series[0];
|
|
17
|
+
if (!series || series.values.length === 0) return nodes;
|
|
18
|
+
const items = series.values.map((v, i) => ({ value: Math.abs(v), index: i })).filter((d) => d.value > 0).sort((a, b) => b.value - a.value);
|
|
19
|
+
if (items.length === 0) return nodes;
|
|
20
|
+
const maxVal = items[0].value;
|
|
21
|
+
const maxR = Math.min(area.width, area.height) * 0.35;
|
|
22
|
+
const minR = Math.max(8, maxR * 0.06);
|
|
23
|
+
const radii = items.map((d) => minR + Math.sqrt(d.value / maxVal) * (maxR - minR));
|
|
24
|
+
const placed = packCircles(radii, area);
|
|
25
|
+
for (let k = 0; k < items.length; k++) {
|
|
26
|
+
const item = items[k];
|
|
27
|
+
const p = placed[k];
|
|
28
|
+
if (!p) continue;
|
|
29
|
+
const color = options.colors[item.index % options.colors.length];
|
|
30
|
+
const label = String(data.labels[item.index] ?? `Item ${item.index + 1}`);
|
|
31
|
+
const r = radii[k];
|
|
32
|
+
const cellNodes = [];
|
|
33
|
+
cellNodes.push(circle(p.x, p.y, r, {
|
|
34
|
+
class: "chartts-pack-circle",
|
|
35
|
+
fill: color,
|
|
36
|
+
fillOpacity: 0.6,
|
|
37
|
+
stroke: color,
|
|
38
|
+
strokeWidth: 1.5,
|
|
39
|
+
style: `--chartts-i:${k}`,
|
|
40
|
+
"data-series": 0,
|
|
41
|
+
"data-index": item.index,
|
|
42
|
+
tabindex: 0,
|
|
43
|
+
role: "img",
|
|
44
|
+
ariaLabel: `${label}: ${series.values[item.index]}`
|
|
45
|
+
}));
|
|
46
|
+
if (r > 18) {
|
|
47
|
+
const fontSize = Math.min(theme.fontSizeSmall, r * 0.45);
|
|
48
|
+
cellNodes.push(text(p.x, p.y - fontSize * 0.3, label, {
|
|
49
|
+
class: "chartts-pack-label",
|
|
50
|
+
fill: "#fff",
|
|
51
|
+
textAnchor: "middle",
|
|
52
|
+
dominantBaseline: "central",
|
|
53
|
+
fontSize,
|
|
54
|
+
fontFamily: theme.fontFamily,
|
|
55
|
+
fontWeight: 600,
|
|
56
|
+
pointerEvents: "none"
|
|
57
|
+
}));
|
|
58
|
+
if (r > 28) {
|
|
59
|
+
cellNodes.push(text(p.x, p.y + fontSize * 0.8, String(series.values[item.index]), {
|
|
60
|
+
class: "chartts-pack-value",
|
|
61
|
+
fill: "rgba(255,255,255,0.7)",
|
|
62
|
+
textAnchor: "middle",
|
|
63
|
+
dominantBaseline: "central",
|
|
64
|
+
fontSize: fontSize * 0.8,
|
|
65
|
+
fontFamily: theme.fontFamily,
|
|
66
|
+
pointerEvents: "none"
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
nodes.push(group(cellNodes, {
|
|
71
|
+
class: `chartts-series chartts-series-${item.index}`,
|
|
72
|
+
"data-series-name": label
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
75
|
+
return nodes;
|
|
76
|
+
},
|
|
77
|
+
hitTest(ctx, mx, my) {
|
|
78
|
+
const { data, area } = ctx;
|
|
79
|
+
const series = data.series[0];
|
|
80
|
+
if (!series || series.values.length === 0) return null;
|
|
81
|
+
const items = series.values.map((v, i) => ({ value: Math.abs(v), index: i })).filter((d) => d.value > 0).sort((a, b) => b.value - a.value);
|
|
82
|
+
if (items.length === 0) return null;
|
|
83
|
+
const maxVal = items[0].value;
|
|
84
|
+
const maxR = Math.min(area.width, area.height) * 0.35;
|
|
85
|
+
const minR = Math.max(8, maxR * 0.06);
|
|
86
|
+
const radii = items.map((d) => minR + Math.sqrt(d.value / maxVal) * (maxR - minR));
|
|
87
|
+
const placed = packCircles(radii, area);
|
|
88
|
+
let best = null;
|
|
89
|
+
for (let k = 0; k < items.length; k++) {
|
|
90
|
+
const p = placed[k];
|
|
91
|
+
if (!p) continue;
|
|
92
|
+
const r = radii[k];
|
|
93
|
+
const dist = Math.sqrt((mx - p.x) ** 2 + (my - p.y) ** 2);
|
|
94
|
+
if (dist <= r && (!best || r < best.r)) {
|
|
95
|
+
best = { idx: items[k].index, r, x: p.x, y: p.y };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (!best) return null;
|
|
99
|
+
return { seriesIndex: 0, pointIndex: best.idx, distance: 0, x: best.x, y: best.y };
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
function packCircles(radii, area) {
|
|
103
|
+
const cx = area.x + area.width / 2;
|
|
104
|
+
const cy = area.y + area.height / 2;
|
|
105
|
+
const result = [];
|
|
106
|
+
if (radii.length === 0) return result;
|
|
107
|
+
result.push({ x: cx, y: cy });
|
|
108
|
+
for (let i = 1; i < radii.length; i++) {
|
|
109
|
+
const r = radii[i];
|
|
110
|
+
let bestPos = { x: cx, y: cy };
|
|
111
|
+
let bestDist = Infinity;
|
|
112
|
+
for (let j = 0; j < result.length; j++) {
|
|
113
|
+
const pj = result[j];
|
|
114
|
+
const rj = radii[j];
|
|
115
|
+
const gap = rj + r + 2;
|
|
116
|
+
for (let a = 0; a < 12; a++) {
|
|
117
|
+
const angle = a / 12 * Math.PI * 2;
|
|
118
|
+
const tx = pj.x + Math.cos(angle) * gap;
|
|
119
|
+
const ty = pj.y + Math.sin(angle) * gap;
|
|
120
|
+
let overlaps = false;
|
|
121
|
+
for (let k = 0; k < result.length; k++) {
|
|
122
|
+
const pk = result[k];
|
|
123
|
+
const rk = radii[k];
|
|
124
|
+
const dist = Math.sqrt((tx - pk.x) ** 2 + (ty - pk.y) ** 2);
|
|
125
|
+
if (dist < rk + r + 1) {
|
|
126
|
+
overlaps = true;
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (!overlaps) {
|
|
131
|
+
const distFromCenter = Math.sqrt((tx - cx) ** 2 + (ty - cy) ** 2);
|
|
132
|
+
if (distFromCenter < bestDist) {
|
|
133
|
+
bestDist = distFromCenter;
|
|
134
|
+
bestPos = { x: tx, y: ty };
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
result.push(bestPos);
|
|
140
|
+
}
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export { packChartType };
|
|
145
|
+
//# sourceMappingURL=chunk-KQJZJADP.js.map
|
|
146
|
+
//# sourceMappingURL=chunk-KQJZJADP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/charts/pack/pack-type.ts"],"names":[],"mappings":"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","file":"chunk-KQJZJADP.js","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 } from '../../render/tree'\n\n/**\n * Pack (Circle Packing) chart — nested circles where area is proportional to value.\n *\n * Uses a front-chain packing algorithm to arrange circles tightly.\n */\nexport const packChartType: ChartTypePlugin = {\n type: 'pack',\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 items = series.values\n .map((v, i) => ({ value: Math.abs(v), index: i }))\n .filter(d => d.value > 0)\n .sort((a, b) => b.value - a.value)\n\n if (items.length === 0) return nodes\n\n // Compute radii proportional to sqrt(value) so AREA is proportional to value\n const maxVal = items[0]!.value\n const maxR = Math.min(area.width, area.height) * 0.35\n const minR = Math.max(8, maxR * 0.06)\n\n const radii = items.map(d => minR + Math.sqrt(d.value / maxVal) * (maxR - minR))\n\n // Pack circles using a simple greedy placement\n const placed = packCircles(radii, area)\n\n for (let k = 0; k < items.length; k++) {\n const item = items[k]!\n const p = placed[k]\n if (!p) continue\n\n const color = options.colors[item.index % options.colors.length]!\n const label = String(data.labels[item.index] ?? `Item ${item.index + 1}`)\n const r = radii[k]!\n\n const cellNodes: RenderNode[] = []\n\n cellNodes.push(circle(p.x, p.y, r, {\n class: 'chartts-pack-circle',\n fill: color,\n fillOpacity: 0.6,\n stroke: color,\n strokeWidth: 1.5,\n style: `--chartts-i:${k}`,\n 'data-series': 0,\n 'data-index': item.index,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${label}: ${series.values[item.index]}`,\n }))\n\n // Label if circle is big enough\n if (r > 18) {\n const fontSize = Math.min(theme.fontSizeSmall, r * 0.45)\n cellNodes.push(text(p.x, p.y - fontSize * 0.3, label, {\n class: 'chartts-pack-label',\n fill: '#fff',\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize,\n fontFamily: theme.fontFamily,\n fontWeight: 600,\n pointerEvents: 'none',\n }))\n\n if (r > 28) {\n cellNodes.push(text(p.x, p.y + fontSize * 0.8, String(series.values[item.index]), {\n class: 'chartts-pack-value',\n fill: 'rgba(255,255,255,0.7)',\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize: fontSize * 0.8,\n fontFamily: theme.fontFamily,\n pointerEvents: 'none',\n }))\n }\n }\n\n nodes.push(group(cellNodes, {\n class: `chartts-series chartts-series-${item.index}`,\n 'data-series-name': label,\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 items = series.values\n .map((v, i) => ({ value: Math.abs(v), index: i }))\n .filter(d => d.value > 0)\n .sort((a, b) => b.value - a.value)\n\n if (items.length === 0) return null\n\n const maxVal = items[0]!.value\n const maxR = Math.min(area.width, area.height) * 0.35\n const minR = Math.max(8, maxR * 0.06)\n const radii = items.map(d => minR + Math.sqrt(d.value / maxVal) * (maxR - minR))\n const placed = packCircles(radii, area)\n\n // Find smallest circle containing the mouse (most specific)\n let best: { idx: number; r: number; x: number; y: number } | null = null\n\n for (let k = 0; k < items.length; k++) {\n const p = placed[k]\n if (!p) continue\n const r = radii[k]!\n const dist = Math.sqrt((mx - p.x) ** 2 + (my - p.y) ** 2)\n if (dist <= r && (!best || r < best.r)) {\n best = { idx: items[k]!.index, r, x: p.x, y: p.y }\n }\n }\n\n if (!best) return null\n return { seriesIndex: 0, pointIndex: best.idx, distance: 0, x: best.x, y: best.y }\n },\n}\n\ninterface Pos { x: number; y: number }\n\n/** Greedy circle packing within a rectangular area. */\nfunction packCircles(radii: number[], area: { x: number; y: number; width: number; height: number }): Pos[] {\n const cx = area.x + area.width / 2\n const cy = area.y + area.height / 2\n const result: Pos[] = []\n\n if (radii.length === 0) return result\n\n // Place first circle at center\n result.push({ x: cx, y: cy })\n\n for (let i = 1; i < radii.length; i++) {\n const r = radii[i]!\n let bestPos: Pos = { x: cx, y: cy }\n let bestDist = Infinity\n\n // Try placing tangent to each existing circle, at various angles\n for (let j = 0; j < result.length; j++) {\n const pj = result[j]!\n const rj = radii[j]!\n const gap = rj + r + 2\n\n for (let a = 0; a < 12; a++) {\n const angle = (a / 12) * Math.PI * 2\n const tx = pj.x + Math.cos(angle) * gap\n const ty = pj.y + Math.sin(angle) * gap\n\n // Check overlap with all placed circles\n let overlaps = false\n for (let k = 0; k < result.length; k++) {\n const pk = result[k]!\n const rk = radii[k]!\n const dist = Math.sqrt((tx - pk.x) ** 2 + (ty - pk.y) ** 2)\n if (dist < rk + r + 1) { overlaps = true; break }\n }\n\n if (!overlaps) {\n // Prefer positions closer to center\n const distFromCenter = Math.sqrt((tx - cx) ** 2 + (ty - cy) ** 2)\n if (distFromCenter < bestDist) {\n bestDist = distFromCenter\n bestPos = { x: tx, y: ty }\n }\n }\n }\n }\n\n result.push(bestPos)\n }\n\n return result\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { prepareNoAxes } from './chunk-
|
|
2
|
-
import { PathBuilder, path, text, group } from './chunk-
|
|
1
|
+
import { prepareNoAxes } from './chunk-LKSKGQX7.js';
|
|
2
|
+
import { PathBuilder, path, text, group } from './chunk-XIVC32HU.js';
|
|
3
3
|
|
|
4
4
|
// src/charts/radialbar/radialbar-type.ts
|
|
5
5
|
var radialBarChartType = {
|
|
@@ -122,5 +122,5 @@ function strokeArc(pb, cx, cy, r, startAngle, endAngle) {
|
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
export { radialBarChartType };
|
|
125
|
-
//# sourceMappingURL=chunk-
|
|
126
|
-
//# sourceMappingURL=chunk-
|
|
125
|
+
//# sourceMappingURL=chunk-KRLKDJPM.js.map
|
|
126
|
+
//# sourceMappingURL=chunk-KRLKDJPM.js.map
|