@chartts/core 0.1.1 → 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.
Files changed (286) hide show
  1. package/README.md +61 -5
  2. package/dist/area.cjs +10 -10
  3. package/dist/area.js +5 -5
  4. package/dist/bar.cjs +9 -9
  5. package/dist/bar.js +4 -4
  6. package/dist/baseline.cjs +9 -9
  7. package/dist/baseline.js +4 -4
  8. package/dist/boxplot.cjs +9 -9
  9. package/dist/boxplot.js +4 -4
  10. package/dist/bubble.cjs +9 -9
  11. package/dist/bubble.js +4 -4
  12. package/dist/bullet.cjs +10 -10
  13. package/dist/bullet.js +5 -5
  14. package/dist/calendar.cjs +10 -10
  15. package/dist/calendar.js +5 -5
  16. package/dist/candlestick.cjs +9 -9
  17. package/dist/candlestick.js +4 -4
  18. package/dist/chord.cjs +10 -10
  19. package/dist/chord.js +5 -5
  20. package/dist/{chunk-E2S7RAT2.js → chunk-27E6G2GT.js} +3 -3
  21. package/dist/{chunk-E2S7RAT2.js.map → chunk-27E6G2GT.js.map} +1 -1
  22. package/dist/{chunk-ROYZ7W4M.cjs → chunk-2KMMVJEE.cjs} +6 -6
  23. package/dist/{chunk-ROYZ7W4M.cjs.map → chunk-2KMMVJEE.cjs.map} +1 -1
  24. package/dist/{chunk-QZ4ZYTP6.js → chunk-2L46SAT7.js} +4 -4
  25. package/dist/{chunk-QZ4ZYTP6.js.map → chunk-2L46SAT7.js.map} +1 -1
  26. package/dist/{chunk-MVWERW4G.cjs → chunk-2PRCN5OJ.cjs} +6 -6
  27. package/dist/{chunk-MVWERW4G.cjs.map → chunk-2PRCN5OJ.cjs.map} +1 -1
  28. package/dist/{chunk-B54L2CPW.cjs → chunk-3N447NTJ.cjs} +13 -13
  29. package/dist/{chunk-B54L2CPW.cjs.map → chunk-3N447NTJ.cjs.map} +1 -1
  30. package/dist/{chunk-7YV56WPE.js → chunk-3NWZJCWL.js} +4 -4
  31. package/dist/{chunk-7YV56WPE.js.map → chunk-3NWZJCWL.js.map} +1 -1
  32. package/dist/{chunk-O5KGKQSU.js → chunk-3QXN7JBV.js} +4 -4
  33. package/dist/{chunk-O5KGKQSU.js.map → chunk-3QXN7JBV.js.map} +1 -1
  34. package/dist/{chunk-XHQWWR5M.cjs → chunk-3TLJCGGQ.cjs} +71 -37
  35. package/dist/chunk-3TLJCGGQ.cjs.map +1 -0
  36. package/dist/{chunk-BXX2EPFE.cjs → chunk-3YFDZGHO.cjs} +12 -12
  37. package/dist/{chunk-BXX2EPFE.cjs.map → chunk-3YFDZGHO.cjs.map} +1 -1
  38. package/dist/{chunk-LEJGLR2P.cjs → chunk-43WDYYVH.cjs} +8 -8
  39. package/dist/{chunk-LEJGLR2P.cjs.map → chunk-43WDYYVH.cjs.map} +1 -1
  40. package/dist/{chunk-SUNC3CPV.js → chunk-4ABM7UYD.js} +3 -3
  41. package/dist/{chunk-SUNC3CPV.js.map → chunk-4ABM7UYD.js.map} +1 -1
  42. package/dist/{chunk-Z6E3XVP2.cjs → chunk-5LQ26P4J.cjs} +10 -10
  43. package/dist/{chunk-Z6E3XVP2.cjs.map → chunk-5LQ26P4J.cjs.map} +1 -1
  44. package/dist/{chunk-SJS4ISBA.js → chunk-5M624BRW.js} +3 -3
  45. package/dist/{chunk-SJS4ISBA.js.map → chunk-5M624BRW.js.map} +1 -1
  46. package/dist/{chunk-4VG47RLS.js → chunk-6WJJ26J5.js} +4 -4
  47. package/dist/{chunk-4VG47RLS.js.map → chunk-6WJJ26J5.js.map} +1 -1
  48. package/dist/{chunk-HOOOCSU4.js → chunk-7HOU6XMW.js} +4 -4
  49. package/dist/{chunk-HOOOCSU4.js.map → chunk-7HOU6XMW.js.map} +1 -1
  50. package/dist/{chunk-M4AQD6WX.cjs → chunk-7JN6GXML.cjs} +10 -10
  51. package/dist/{chunk-M4AQD6WX.cjs.map → chunk-7JN6GXML.cjs.map} +1 -1
  52. package/dist/{chunk-LUTU4WW3.js → chunk-7MXBXWVD.js} +4 -4
  53. package/dist/{chunk-LUTU4WW3.js.map → chunk-7MXBXWVD.js.map} +1 -1
  54. package/dist/{chunk-22LR6CFM.js → chunk-AA45U5KV.js} +4 -4
  55. package/dist/{chunk-22LR6CFM.js.map → chunk-AA45U5KV.js.map} +1 -1
  56. package/dist/{chunk-GNRRK7TZ.cjs → chunk-AAKS22M3.cjs} +11 -11
  57. package/dist/{chunk-GNRRK7TZ.cjs.map → chunk-AAKS22M3.cjs.map} +1 -1
  58. package/dist/{chunk-J6NPRKT4.cjs → chunk-ALRCYQQX.cjs} +6 -6
  59. package/dist/{chunk-J6NPRKT4.cjs.map → chunk-ALRCYQQX.cjs.map} +1 -1
  60. package/dist/{chunk-KVI6DN3R.js → chunk-ARQLGTTV.js} +4 -4
  61. package/dist/{chunk-KVI6DN3R.js.map → chunk-ARQLGTTV.js.map} +1 -1
  62. package/dist/{chunk-H4RNJ7FK.cjs → chunk-B7IV2PB3.cjs} +8 -8
  63. package/dist/{chunk-H4RNJ7FK.cjs.map → chunk-B7IV2PB3.cjs.map} +1 -1
  64. package/dist/{chunk-CMEXNS5V.js → chunk-BMEMMYVF.js} +4 -4
  65. package/dist/{chunk-CMEXNS5V.js.map → chunk-BMEMMYVF.js.map} +1 -1
  66. package/dist/{chunk-3BRQGYDX.js → chunk-BMTVFAX2.js} +71 -37
  67. package/dist/chunk-BMTVFAX2.js.map +1 -0
  68. package/dist/{chunk-BR3KTAGW.js → chunk-CCHMQZIB.js} +4 -4
  69. package/dist/{chunk-BR3KTAGW.js.map → chunk-CCHMQZIB.js.map} +1 -1
  70. package/dist/{chunk-NQSC7CKN.js → chunk-CHERQT4B.js} +3 -3
  71. package/dist/{chunk-NQSC7CKN.js.map → chunk-CHERQT4B.js.map} +1 -1
  72. package/dist/{chunk-KOHWMGRF.js → chunk-CJEMSKW3.js} +7 -7
  73. package/dist/{chunk-KOHWMGRF.js.map → chunk-CJEMSKW3.js.map} +1 -1
  74. package/dist/{chunk-3TTTELGB.cjs → chunk-COPERSVL.cjs} +15 -15
  75. package/dist/{chunk-3TTTELGB.cjs.map → chunk-COPERSVL.cjs.map} +1 -1
  76. package/dist/{chunk-PLGZ4REQ.cjs → chunk-D2IP3MWJ.cjs} +12 -12
  77. package/dist/{chunk-PLGZ4REQ.cjs.map → chunk-D2IP3MWJ.cjs.map} +1 -1
  78. package/dist/{chunk-M4UST3UU.cjs → chunk-DAH76GIX.cjs} +10 -10
  79. package/dist/{chunk-M4UST3UU.cjs.map → chunk-DAH76GIX.cjs.map} +1 -1
  80. package/dist/{chunk-TOS2RYHQ.js → chunk-DKVRRL3F.js} +4 -4
  81. package/dist/{chunk-TOS2RYHQ.js.map → chunk-DKVRRL3F.js.map} +1 -1
  82. package/dist/{chunk-SKVCPG5R.cjs → chunk-DZHP4UUE.cjs} +11 -11
  83. package/dist/{chunk-SKVCPG5R.cjs.map → chunk-DZHP4UUE.cjs.map} +1 -1
  84. package/dist/{chunk-NMLDPXOL.js → chunk-DZKYVTV3.js} +4 -4
  85. package/dist/{chunk-NMLDPXOL.js.map → chunk-DZKYVTV3.js.map} +1 -1
  86. package/dist/{chunk-66HSJRRH.js → chunk-DZW35WR2.js} +4 -4
  87. package/dist/{chunk-66HSJRRH.js.map → chunk-DZW35WR2.js.map} +1 -1
  88. package/dist/{chunk-FFJ6BVEY.cjs → chunk-EAKXLFOR.cjs} +9 -9
  89. package/dist/{chunk-FFJ6BVEY.cjs.map → chunk-EAKXLFOR.cjs.map} +1 -1
  90. package/dist/{chunk-QHJHYV3H.cjs → chunk-EFRBTSUO.cjs} +4 -4
  91. package/dist/{chunk-QHJHYV3H.cjs.map → chunk-EFRBTSUO.cjs.map} +1 -1
  92. package/dist/{chunk-QIJZZOX7.js → chunk-EYN74SQ5.js} +4 -4
  93. package/dist/{chunk-QIJZZOX7.js.map → chunk-EYN74SQ5.js.map} +1 -1
  94. package/dist/{chunk-Y54XVNXB.cjs → chunk-FEQKBVCZ.cjs} +13 -13
  95. package/dist/{chunk-Y54XVNXB.cjs.map → chunk-FEQKBVCZ.cjs.map} +1 -1
  96. package/dist/{chunk-UQBDGCS6.cjs → chunk-FIAKZSRR.cjs} +7 -7
  97. package/dist/{chunk-UQBDGCS6.cjs.map → chunk-FIAKZSRR.cjs.map} +1 -1
  98. package/dist/{chunk-HB4EGHJ7.cjs → chunk-FKAA5FNG.cjs} +9 -9
  99. package/dist/{chunk-HB4EGHJ7.cjs.map → chunk-FKAA5FNG.cjs.map} +1 -1
  100. package/dist/{chunk-NYVFC2SF.js → chunk-FKVYS4RB.js} +3 -3
  101. package/dist/{chunk-NYVFC2SF.js.map → chunk-FKVYS4RB.js.map} +1 -1
  102. package/dist/{chunk-ZDZQG3GH.cjs → chunk-FQG4DRJS.cjs} +13 -13
  103. package/dist/chunk-FQG4DRJS.cjs.map +1 -0
  104. package/dist/{chunk-GM3ZO5WV.js → chunk-FSKUEB7P.js} +3 -3
  105. package/dist/{chunk-GM3ZO5WV.js.map → chunk-FSKUEB7P.js.map} +1 -1
  106. package/dist/{chunk-NONU7KUN.cjs → chunk-FTKL3UAN.cjs} +6 -6
  107. package/dist/{chunk-NONU7KUN.cjs.map → chunk-FTKL3UAN.cjs.map} +1 -1
  108. package/dist/{chunk-ZL25X5WW.js → chunk-GI7PBJSK.js} +3 -3
  109. package/dist/{chunk-ZL25X5WW.js.map → chunk-GI7PBJSK.js.map} +1 -1
  110. package/dist/{chunk-NFD6VAVM.js → chunk-GL3M7MAM.js} +3 -3
  111. package/dist/{chunk-NFD6VAVM.js.map → chunk-GL3M7MAM.js.map} +1 -1
  112. package/dist/{chunk-3XVGEBR4.js → chunk-GMLJDDHZ.js} +3 -3
  113. package/dist/{chunk-3XVGEBR4.js.map → chunk-GMLJDDHZ.js.map} +1 -1
  114. package/dist/{chunk-N6IVODRJ.js → chunk-GQR7IHER.js} +4 -4
  115. package/dist/{chunk-N6IVODRJ.js.map → chunk-GQR7IHER.js.map} +1 -1
  116. package/dist/{chunk-MYPCA25Y.cjs → chunk-GUVPVNPD.cjs} +10 -10
  117. package/dist/{chunk-MYPCA25Y.cjs.map → chunk-GUVPVNPD.cjs.map} +1 -1
  118. package/dist/{chunk-5QOQR5FE.cjs → chunk-HOPFELRP.cjs} +4 -4
  119. package/dist/{chunk-5QOQR5FE.cjs.map → chunk-HOPFELRP.cjs.map} +1 -1
  120. package/dist/{chunk-FRWC6GUR.cjs → chunk-IAE4VRB7.cjs} +9 -9
  121. package/dist/{chunk-FRWC6GUR.cjs.map → chunk-IAE4VRB7.cjs.map} +1 -1
  122. package/dist/{chunk-BYXRFTEI.cjs → chunk-ID7GYRYL.cjs} +10 -10
  123. package/dist/{chunk-BYXRFTEI.cjs.map → chunk-ID7GYRYL.cjs.map} +1 -1
  124. package/dist/{chunk-QLRK46YY.cjs → chunk-IKUA7O73.cjs} +7 -7
  125. package/dist/{chunk-QLRK46YY.cjs.map → chunk-IKUA7O73.cjs.map} +1 -1
  126. package/dist/{chunk-HDWWUEPD.js → chunk-IUYPKYOU.js} +4 -4
  127. package/dist/{chunk-HDWWUEPD.js.map → chunk-IUYPKYOU.js.map} +1 -1
  128. package/dist/{chunk-BC6KW2OG.js → chunk-IXFSJBJS.js} +3 -3
  129. package/dist/{chunk-BC6KW2OG.js.map → chunk-IXFSJBJS.js.map} +1 -1
  130. package/dist/{chunk-X2JNB5UN.js → chunk-JT6H7G52.js} +4 -4
  131. package/dist/{chunk-X2JNB5UN.js.map → chunk-JT6H7G52.js.map} +1 -1
  132. package/dist/{chunk-TW6KPQIS.js → chunk-K2EZ4SS4.js} +3 -3
  133. package/dist/{chunk-TW6KPQIS.js.map → chunk-K2EZ4SS4.js.map} +1 -1
  134. package/dist/{chunk-KE7ILTM4.cjs → chunk-K7UR7GYC.cjs} +11 -11
  135. package/dist/{chunk-KE7ILTM4.cjs.map → chunk-K7UR7GYC.cjs.map} +1 -1
  136. package/dist/{chunk-TTOX27BZ.cjs → chunk-KEMT7F5H.cjs} +7 -7
  137. package/dist/{chunk-TTOX27BZ.cjs.map → chunk-KEMT7F5H.cjs.map} +1 -1
  138. package/dist/{chunk-FKYNRMPX.js → chunk-KHQRHTTN.js} +4 -4
  139. package/dist/{chunk-FKYNRMPX.js.map → chunk-KHQRHTTN.js.map} +1 -1
  140. package/dist/{chunk-ZDYCIP6N.cjs → chunk-KUFDELQM.cjs} +9 -9
  141. package/dist/{chunk-ZDYCIP6N.cjs.map → chunk-KUFDELQM.cjs.map} +1 -1
  142. package/dist/{chunk-LB4MV5CG.js → chunk-L37ZPX6D.js} +3 -3
  143. package/dist/{chunk-LB4MV5CG.js.map → chunk-L37ZPX6D.js.map} +1 -1
  144. package/dist/{chunk-QAYX6XN3.js → chunk-LCEMO7NI.js} +3 -3
  145. package/dist/{chunk-QAYX6XN3.js.map → chunk-LCEMO7NI.js.map} +1 -1
  146. package/dist/{chunk-L54BZYAI.cjs → chunk-M6JYSINX.cjs} +6 -6
  147. package/dist/{chunk-L54BZYAI.cjs.map → chunk-M6JYSINX.cjs.map} +1 -1
  148. package/dist/{chunk-VPI7UGB3.cjs → chunk-MGYBMQAX.cjs} +8 -8
  149. package/dist/{chunk-VPI7UGB3.cjs.map → chunk-MGYBMQAX.cjs.map} +1 -1
  150. package/dist/{chunk-6KNBJ4CE.js → chunk-MQBKLKYF.js} +4 -4
  151. package/dist/{chunk-6KNBJ4CE.js.map → chunk-MQBKLKYF.js.map} +1 -1
  152. package/dist/{chunk-BRSHEDTZ.js → chunk-MVJKRPX7.js} +3 -3
  153. package/dist/{chunk-BRSHEDTZ.js.map → chunk-MVJKRPX7.js.map} +1 -1
  154. package/dist/{chunk-Q6U5D2ZB.cjs → chunk-MZCKMTQE.cjs} +9 -9
  155. package/dist/{chunk-Q6U5D2ZB.cjs.map → chunk-MZCKMTQE.cjs.map} +1 -1
  156. package/dist/{chunk-BEYG2HQ4.cjs → chunk-MZQY2FTP.cjs} +12 -12
  157. package/dist/{chunk-BEYG2HQ4.cjs.map → chunk-MZQY2FTP.cjs.map} +1 -1
  158. package/dist/{chunk-ETPZGEL7.cjs → chunk-N7NZQVIV.cjs} +6 -6
  159. package/dist/{chunk-ETPZGEL7.cjs.map → chunk-N7NZQVIV.cjs.map} +1 -1
  160. package/dist/{chunk-H2AE7JMU.js → chunk-NML7F34A.js} +3 -3
  161. package/dist/{chunk-H2AE7JMU.js.map → chunk-NML7F34A.js.map} +1 -1
  162. package/dist/{chunk-DNQ6N3VG.js → chunk-NQGZMWNT.js} +4 -4
  163. package/dist/{chunk-DNQ6N3VG.js.map → chunk-NQGZMWNT.js.map} +1 -1
  164. package/dist/{chunk-MLX3EO2C.js → chunk-NZWFBAFQ.js} +3 -3
  165. package/dist/{chunk-MLX3EO2C.js.map → chunk-NZWFBAFQ.js.map} +1 -1
  166. package/dist/{chunk-XBIM73HV.cjs → chunk-PCTMS2PX.cjs} +7 -7
  167. package/dist/{chunk-XBIM73HV.cjs.map → chunk-PCTMS2PX.cjs.map} +1 -1
  168. package/dist/{chunk-D2SV6YT3.js → chunk-QCR6L55R.js} +4 -4
  169. package/dist/{chunk-D2SV6YT3.js.map → chunk-QCR6L55R.js.map} +1 -1
  170. package/dist/{chunk-SZVK6RRQ.js → chunk-QRTYX5KO.js} +4 -4
  171. package/dist/{chunk-SZVK6RRQ.js.map → chunk-QRTYX5KO.js.map} +1 -1
  172. package/dist/{chunk-FUZFNUCJ.js → chunk-QXQSJ3FZ.js} +3 -3
  173. package/dist/{chunk-FUZFNUCJ.js.map → chunk-QXQSJ3FZ.js.map} +1 -1
  174. package/dist/{chunk-7SEHTEMR.js → chunk-RLH3PS3Y.js} +3 -3
  175. package/dist/{chunk-7SEHTEMR.js.map → chunk-RLH3PS3Y.js.map} +1 -1
  176. package/dist/{chunk-Q2BDB5ZA.cjs → chunk-S64PTNT7.cjs} +8 -8
  177. package/dist/{chunk-Q2BDB5ZA.cjs.map → chunk-S64PTNT7.cjs.map} +1 -1
  178. package/dist/{chunk-6LKN3HRX.js → chunk-S6NGWPXC.js} +3 -3
  179. package/dist/{chunk-6LKN3HRX.js.map → chunk-S6NGWPXC.js.map} +1 -1
  180. package/dist/{chunk-4YJPBUX2.cjs → chunk-SC5BGA2N.cjs} +7 -7
  181. package/dist/{chunk-4YJPBUX2.cjs.map → chunk-SC5BGA2N.cjs.map} +1 -1
  182. package/dist/{chunk-KSRROKYC.cjs → chunk-SKREYNRK.cjs} +11 -11
  183. package/dist/{chunk-KSRROKYC.cjs.map → chunk-SKREYNRK.cjs.map} +1 -1
  184. package/dist/{chunk-2TWYS3BT.cjs → chunk-SLJNRP7O.cjs} +14 -14
  185. package/dist/{chunk-2TWYS3BT.cjs.map → chunk-SLJNRP7O.cjs.map} +1 -1
  186. package/dist/{chunk-Y2JZHX3P.cjs → chunk-T6LXFMBR.cjs} +8 -8
  187. package/dist/{chunk-Y2JZHX3P.cjs.map → chunk-T6LXFMBR.cjs.map} +1 -1
  188. package/dist/{chunk-RCVRZCCC.cjs → chunk-TIHVTKXS.cjs} +9 -9
  189. package/dist/{chunk-RCVRZCCC.cjs.map → chunk-TIHVTKXS.cjs.map} +1 -1
  190. package/dist/{chunk-DL7P72FA.cjs → chunk-TVPS2NJH.cjs} +10 -10
  191. package/dist/{chunk-DL7P72FA.cjs.map → chunk-TVPS2NJH.cjs.map} +1 -1
  192. package/dist/{chunk-SQJAKZ4W.js → chunk-U7GBOQXX.js} +4 -4
  193. package/dist/{chunk-SQJAKZ4W.js.map → chunk-U7GBOQXX.js.map} +1 -1
  194. package/dist/{chunk-6N66T7VQ.js → chunk-VGGKMTO6.js} +3 -3
  195. package/dist/{chunk-6N66T7VQ.js.map → chunk-VGGKMTO6.js.map} +1 -1
  196. package/dist/{chunk-7CGXK7KT.js → chunk-VJQCHBS6.js} +3 -3
  197. package/dist/{chunk-7CGXK7KT.js.map → chunk-VJQCHBS6.js.map} +1 -1
  198. package/dist/{chunk-4HK4RM3X.cjs → chunk-VK72MICB.cjs} +7 -7
  199. package/dist/{chunk-4HK4RM3X.cjs.map → chunk-VK72MICB.cjs.map} +1 -1
  200. package/dist/{chunk-EGQ4JCFU.cjs → chunk-WS2AL7GY.cjs} +7 -7
  201. package/dist/{chunk-EGQ4JCFU.cjs.map → chunk-WS2AL7GY.cjs.map} +1 -1
  202. package/dist/{chunk-Y4P4VY7A.cjs → chunk-XKDBNAHH.cjs} +10 -10
  203. package/dist/{chunk-Y4P4VY7A.cjs.map → chunk-XKDBNAHH.cjs.map} +1 -1
  204. package/dist/{chunk-UN7K3YQG.cjs → chunk-Y4HJCMB4.cjs} +6 -6
  205. package/dist/{chunk-UN7K3YQG.cjs.map → chunk-Y4HJCMB4.cjs.map} +1 -1
  206. package/dist/{chunk-SWYCVF46.js → chunk-YMJQUKKX.js} +8 -8
  207. package/dist/chunk-YMJQUKKX.js.map +1 -0
  208. package/dist/combo.cjs +9 -9
  209. package/dist/combo.js +4 -4
  210. package/dist/custom.cjs +10 -10
  211. package/dist/custom.js +5 -5
  212. package/dist/donut.cjs +10 -10
  213. package/dist/donut.js +5 -5
  214. package/dist/dumbbell.cjs +10 -10
  215. package/dist/dumbbell.js +5 -5
  216. package/dist/funnel.cjs +10 -10
  217. package/dist/funnel.js +5 -5
  218. package/dist/gauge.cjs +10 -10
  219. package/dist/gauge.js +5 -5
  220. package/dist/geo.cjs +12 -12
  221. package/dist/geo.js +5 -5
  222. package/dist/graph.cjs +10 -10
  223. package/dist/graph.js +5 -5
  224. package/dist/heatmap.cjs +10 -10
  225. package/dist/heatmap.js +5 -5
  226. package/dist/histogram.cjs +9 -9
  227. package/dist/histogram.js +4 -4
  228. package/dist/horizontal-bar.cjs +9 -9
  229. package/dist/horizontal-bar.js +4 -4
  230. package/dist/index.cjs +179 -179
  231. package/dist/index.js +91 -91
  232. package/dist/kagi.cjs +10 -10
  233. package/dist/kagi.js +5 -5
  234. package/dist/line.cjs +9 -9
  235. package/dist/line.js +4 -4
  236. package/dist/lines.cjs +10 -10
  237. package/dist/lines.js +5 -5
  238. package/dist/lollipop.cjs +9 -9
  239. package/dist/lollipop.js +4 -4
  240. package/dist/matrix.cjs +10 -10
  241. package/dist/matrix.js +5 -5
  242. package/dist/ohlc.cjs +9 -9
  243. package/dist/ohlc.js +4 -4
  244. package/dist/parallel.cjs +10 -10
  245. package/dist/parallel.js +5 -5
  246. package/dist/pictorialbar.cjs +10 -10
  247. package/dist/pictorialbar.js +5 -5
  248. package/dist/pie.cjs +10 -10
  249. package/dist/pie.js +5 -5
  250. package/dist/polar.cjs +10 -10
  251. package/dist/polar.js +5 -5
  252. package/dist/radar.cjs +10 -10
  253. package/dist/radar.js +5 -5
  254. package/dist/radialbar.cjs +10 -10
  255. package/dist/radialbar.js +5 -5
  256. package/dist/range.cjs +9 -9
  257. package/dist/range.js +4 -4
  258. package/dist/renko.cjs +10 -10
  259. package/dist/renko.js +5 -5
  260. package/dist/sankey.cjs +10 -10
  261. package/dist/sankey.js +5 -5
  262. package/dist/scatter.cjs +9 -9
  263. package/dist/scatter.js +4 -4
  264. package/dist/sparkline.cjs +9 -9
  265. package/dist/sparkline.js +4 -4
  266. package/dist/stacked-bar.cjs +9 -9
  267. package/dist/stacked-bar.js +4 -4
  268. package/dist/step.cjs +10 -10
  269. package/dist/step.js +5 -5
  270. package/dist/sunburst.cjs +10 -10
  271. package/dist/sunburst.js +5 -5
  272. package/dist/themeriver.cjs +10 -10
  273. package/dist/themeriver.js +5 -5
  274. package/dist/tree.cjs +10 -10
  275. package/dist/tree.js +5 -5
  276. package/dist/treemap.cjs +10 -10
  277. package/dist/treemap.js +5 -5
  278. package/dist/volume.cjs +9 -9
  279. package/dist/volume.js +4 -4
  280. package/dist/waterfall.cjs +9 -9
  281. package/dist/waterfall.js +4 -4
  282. package/package.json +1 -1
  283. package/dist/chunk-3BRQGYDX.js.map +0 -1
  284. package/dist/chunk-SWYCVF46.js.map +0 -1
  285. package/dist/chunk-XHQWWR5M.cjs.map +0 -1
  286. package/dist/chunk-ZDZQG3GH.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/charts/bar/stacked-bar-type.ts"],"names":[],"mappings":"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","file":"chunk-E2S7RAT2.js","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareData } from '../../data/prepare'\nimport { group, rect, path } from '../../render/tree'\nimport { formatNum } from '../../utils/format'\nimport { getBandwidth } from '../../utils/scale'\n\n/**\n * Stacked bar chart — all series at the same x position are stacked vertically.\n */\nexport const stackedBarChartType: ChartTypePlugin = {\n type: 'stacked-bar',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n const prepared = prepareData(data, options)\n\n // y-axis range should cover cumulative totals per x-index\n const pointCount = prepared.series[0]?.values.length ?? 0\n let maxTotal = 0\n let minTotal = 0\n\n for (let i = 0; i < pointCount; i++) {\n let posSum = 0\n let negSum = 0\n for (const s of prepared.series) {\n const v = s.values[i] ?? 0\n if (v >= 0) posSum += v\n else negSum += v\n }\n if (posSum > maxTotal) maxTotal = posSum\n if (negSum < minTotal) minTotal = negSum\n }\n\n if (options.yMin === undefined) prepared.bounds.yMin = Math.min(0, minTotal)\n if (options.yMax === undefined) prepared.bounds.yMax = Math.max(0, maxTotal)\n\n return prepared\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, options, xScale, yScale } = ctx\n const nodes: RenderNode[] = []\n\n const pointCount = data.series[0]?.values.length ?? 0\n if (pointCount === 0) return nodes\n\n const bw = getBandwidth(xScale)\n const barWidth = bw * (1 - options.barGap)\n const barOffset = -barWidth / 2\n const baseline = yScale.map(0)\n\n for (let i = 0; i < pointCount; i++) {\n let posY = baseline // tracks current top of positive stack\n let negY = baseline // tracks current bottom of negative stack\n\n for (const series of data.series) {\n const value = series.values[i] ?? 0\n if (value === 0) continue\n\n const cx = xScale.map(i)\n const barX = cx + barOffset\n const vy = yScale.map(Math.abs(value))\n const h = Math.abs(vy - baseline)\n\n let y: number\n if (value >= 0) {\n y = posY - h\n posY = y\n } else {\n y = negY\n negY = y + h\n }\n\n const barFill = `url(#chartts-bar-${series.index})`\n const r = Math.min(options.barRadius, barWidth / 2, h / 2)\n\n const barNode = (r > 0 && h > r * 2)\n ? path(\n `M${formatNum(barX)},${formatNum(y + h)}V${formatNum(y + r)}Q${formatNum(barX)},${formatNum(y)},${formatNum(barX + r)},${formatNum(y)}H${formatNum(barX + barWidth - r)}Q${formatNum(barX + barWidth)},${formatNum(y)},${formatNum(barX + barWidth)},${formatNum(y + r)}V${formatNum(y + h)}Z`,\n {\n class: 'chartts-bar',\n fill: barFill,\n 'data-series': series.index,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${series.name}: ${value}`,\n },\n )\n : rect(barX, y, barWidth, h, {\n class: 'chartts-bar',\n fill: barFill,\n 'data-series': series.index,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${series.name}: ${value}`,\n })\n\n // Wrap each series segment in its own group for hover isolation\n nodes.push(group([barNode], {\n class: `chartts-series chartts-series-${series.index}`,\n 'data-series-name': series.name,\n }))\n }\n }\n\n return nodes\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { data, xScale, yScale, options } = ctx\n const pointCount = data.series[0]?.values.length ?? 0\n if (pointCount === 0) return null\n\n const bw = getBandwidth(xScale)\n const barWidth = bw * (1 - options.barGap)\n const barOffset = -barWidth / 2\n const baseline = yScale.map(0)\n\n for (let i = 0; i < pointCount; i++) {\n const cx = xScale.map(i)\n const barX = cx + barOffset\n\n if (mx < barX - 2 || mx > barX + barWidth + 2) continue\n\n let posY = baseline\n let negY = baseline\n\n for (const series of data.series) {\n const value = series.values[i] ?? 0\n if (value === 0) continue\n\n const vy = yScale.map(Math.abs(value))\n const h = Math.abs(vy - baseline)\n let y: number\n if (value >= 0) { y = posY - h; posY = y }\n else { y = negY; negY = y + h }\n\n if (my >= y - 2 && my <= y + h + 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/stacked-bar-type.ts"],"names":[],"mappings":"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","file":"chunk-27E6G2GT.js","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareData } from '../../data/prepare'\nimport { group, rect, path } from '../../render/tree'\nimport { formatNum } from '../../utils/format'\nimport { getBandwidth } from '../../utils/scale'\n\n/**\n * Stacked bar chart — all series at the same x position are stacked vertically.\n */\nexport const stackedBarChartType: ChartTypePlugin = {\n type: 'stacked-bar',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n const prepared = prepareData(data, options)\n\n // y-axis range should cover cumulative totals per x-index\n const pointCount = prepared.series[0]?.values.length ?? 0\n let maxTotal = 0\n let minTotal = 0\n\n for (let i = 0; i < pointCount; i++) {\n let posSum = 0\n let negSum = 0\n for (const s of prepared.series) {\n const v = s.values[i] ?? 0\n if (v >= 0) posSum += v\n else negSum += v\n }\n if (posSum > maxTotal) maxTotal = posSum\n if (negSum < minTotal) minTotal = negSum\n }\n\n if (options.yMin === undefined) prepared.bounds.yMin = Math.min(0, minTotal)\n if (options.yMax === undefined) prepared.bounds.yMax = Math.max(0, maxTotal)\n\n return prepared\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, options, xScale, yScale } = ctx\n const nodes: RenderNode[] = []\n\n const pointCount = data.series[0]?.values.length ?? 0\n if (pointCount === 0) return nodes\n\n const bw = getBandwidth(xScale)\n const barWidth = bw * (1 - options.barGap)\n const barOffset = -barWidth / 2\n const baseline = yScale.map(0)\n\n for (let i = 0; i < pointCount; i++) {\n let posY = baseline // tracks current top of positive stack\n let negY = baseline // tracks current bottom of negative stack\n\n for (const series of data.series) {\n const value = series.values[i] ?? 0\n if (value === 0) continue\n\n const cx = xScale.map(i)\n const barX = cx + barOffset\n const vy = yScale.map(Math.abs(value))\n const h = Math.abs(vy - baseline)\n\n let y: number\n if (value >= 0) {\n y = posY - h\n posY = y\n } else {\n y = negY\n negY = y + h\n }\n\n const barFill = `url(#chartts-bar-${series.index})`\n const r = Math.min(options.barRadius, barWidth / 2, h / 2)\n\n const barNode = (r > 0 && h > r * 2)\n ? path(\n `M${formatNum(barX)},${formatNum(y + h)}V${formatNum(y + r)}Q${formatNum(barX)},${formatNum(y)},${formatNum(barX + r)},${formatNum(y)}H${formatNum(barX + barWidth - r)}Q${formatNum(barX + barWidth)},${formatNum(y)},${formatNum(barX + barWidth)},${formatNum(y + r)}V${formatNum(y + h)}Z`,\n {\n class: 'chartts-bar',\n fill: barFill,\n 'data-series': series.index,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${series.name}: ${value}`,\n },\n )\n : rect(barX, y, barWidth, h, {\n class: 'chartts-bar',\n fill: barFill,\n 'data-series': series.index,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${series.name}: ${value}`,\n })\n\n // Wrap each series segment in its own group for hover isolation\n nodes.push(group([barNode], {\n class: `chartts-series chartts-series-${series.index}`,\n 'data-series-name': series.name,\n }))\n }\n }\n\n return nodes\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { data, xScale, yScale, options } = ctx\n const pointCount = data.series[0]?.values.length ?? 0\n if (pointCount === 0) return null\n\n const bw = getBandwidth(xScale)\n const barWidth = bw * (1 - options.barGap)\n const barOffset = -barWidth / 2\n const baseline = yScale.map(0)\n\n for (let i = 0; i < pointCount; i++) {\n const cx = xScale.map(i)\n const barX = cx + barOffset\n\n if (mx < barX - 2 || mx > barX + barWidth + 2) continue\n\n let posY = baseline\n let negY = baseline\n\n for (const series of data.series) {\n const value = series.values[i] ?? 0\n if (value === 0) continue\n\n const vy = yScale.map(Math.abs(value))\n const h = Math.abs(vy - baseline)\n let y: number\n if (value >= 0) { y = posY - h; posY = y }\n else { y = negY; negY = y + h }\n\n if (my >= y - 2 && my <= y + h + 2) {\n return { seriesIndex: series.index, pointIndex: i, distance: 0 }\n }\n }\n }\n\n return null\n },\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkNHGKZMD7_cjs = require('./chunk-NHGKZMD7.cjs');
4
- var chunkXHQWWR5M_cjs = require('./chunk-XHQWWR5M.cjs');
4
+ var chunk3TLJCGGQ_cjs = require('./chunk-3TLJCGGQ.cjs');
5
5
 
6
6
  // src/charts/histogram/histogram-type.ts
7
7
  var histogramChartType = {
@@ -10,7 +10,7 @@ var histogramChartType = {
10
10
  return { x: "categorical", y: "linear" };
11
11
  },
12
12
  prepareData(data, options) {
13
- const prepared = chunkXHQWWR5M_cjs.prepareData(data, options);
13
+ const prepared = chunk3TLJCGGQ_cjs.prepareData(data, options);
14
14
  if (options.yMin === void 0 && prepared.bounds.yMin > 0) {
15
15
  prepared.bounds.yMin = 0;
16
16
  }
@@ -35,7 +35,7 @@ var histogramChartType = {
35
35
  if (h < 0.5) continue;
36
36
  const colorIndex = i % options.colors.length;
37
37
  const barFill = `url(#chartts-bar-${colorIndex})`;
38
- barNodes.push(chunkXHQWWR5M_cjs.rect(barX, y, barWidth, h, {
38
+ barNodes.push(chunk3TLJCGGQ_cjs.rect(barX, y, barWidth, h, {
39
39
  rx: 2,
40
40
  ry: 2,
41
41
  class: "chartts-bar chartts-histogram-bar",
@@ -49,7 +49,7 @@ var histogramChartType = {
49
49
  ariaLabel: `${data.labels[i]}: ${value}`
50
50
  }));
51
51
  }
52
- nodes.push(chunkXHQWWR5M_cjs.group(barNodes, {
52
+ nodes.push(chunk3TLJCGGQ_cjs.group(barNodes, {
53
53
  class: "chartts-series chartts-series-0",
54
54
  "data-series-name": series.name
55
55
  }));
@@ -77,5 +77,5 @@ var histogramChartType = {
77
77
  };
78
78
 
79
79
  exports.histogramChartType = histogramChartType;
80
- //# sourceMappingURL=chunk-ROYZ7W4M.cjs.map
81
- //# sourceMappingURL=chunk-ROYZ7W4M.cjs.map
80
+ //# sourceMappingURL=chunk-2KMMVJEE.cjs.map
81
+ //# sourceMappingURL=chunk-2KMMVJEE.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/charts/histogram/histogram-type.ts"],"names":["prepareData","getBandwidth","rect","group"],"mappings":"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","file":"chunk-ROYZ7W4M.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\n/**\n * Histogram chart — bars touch each other (no gap), representing frequency distribution.\n *\n * Uses the same data format as bar chart. The key differences:\n * - Zero gap between bars\n * - Bars fill the full bandwidth\n * - Designed for continuous data ranges\n */\nexport const histogramChartType: ChartTypePlugin = {\n type: 'histogram',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n const prepared = prepareData(data, options)\n if (options.yMin === undefined && prepared.bounds.yMin > 0) {\n prepared.bounds.yMin = 0\n }\n return prepared\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, options, xScale, yScale } = ctx\n const nodes: RenderNode[] = []\n\n const series = data.series[0]\n if (!series || series.values.length === 0) return nodes\n\n const bw = getBandwidth(xScale)\n // Histograms have no gap — bars touch\n const barWidth = bw\n const baseline = yScale.map(Math.max(0, yScale.getDomain()[0] as number))\n\n const barNodes: RenderNode[] = []\n\n for (let i = 0; i < series.values.length; i++) {\n const value = series.values[i]!\n const cx = xScale.map(i)\n const barX = cx - barWidth / 2\n const vy = yScale.map(value)\n\n const y = value >= 0 ? vy : baseline\n const h = Math.abs(vy - baseline)\n if (h < 0.5) continue\n\n const colorIndex = i % options.colors.length\n const barFill = `url(#chartts-bar-${colorIndex})`\n\n barNodes.push(rect(barX, y, barWidth, h, {\n rx: 2, ry: 2,\n class: 'chartts-bar chartts-histogram-bar',\n fill: barFill,\n stroke: series.color,\n strokeWidth: 0.5,\n 'data-series': 0,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${data.labels[i]}: ${value}`,\n }))\n }\n\n nodes.push(group(barNodes, {\n class: 'chartts-series chartts-series-0',\n 'data-series-name': series.name,\n }))\n\n return nodes\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { data, xScale, yScale } = ctx\n const series = data.series[0]\n if (!series || series.values.length === 0) return null\n\n const bw = getBandwidth(xScale)\n const barWidth = bw\n const baseline = yScale.map(Math.max(0, yScale.getDomain()[0] as number))\n\n for (let i = 0; i < series.values.length; i++) {\n const cx = xScale.map(i)\n const barX = cx - barWidth / 2\n const vy = yScale.map(series.values[i]!)\n const y = series.values[i]! >= 0 ? vy : baseline\n const h = Math.abs(vy - baseline)\n\n if (mx >= barX - 1 && mx <= barX + barWidth + 1 && my >= y - 2 && my <= y + h + 2) {\n return { seriesIndex: 0, pointIndex: i, distance: 0 }\n }\n }\n\n return null\n },\n}\n"]}
1
+ {"version":3,"sources":["../src/charts/histogram/histogram-type.ts"],"names":["prepareData","getBandwidth","rect","group"],"mappings":"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","file":"chunk-2KMMVJEE.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\n/**\n * Histogram chart — bars touch each other (no gap), representing frequency distribution.\n *\n * Uses the same data format as bar chart. The key differences:\n * - Zero gap between bars\n * - Bars fill the full bandwidth\n * - Designed for continuous data ranges\n */\nexport const histogramChartType: ChartTypePlugin = {\n type: 'histogram',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n const prepared = prepareData(data, options)\n if (options.yMin === undefined && prepared.bounds.yMin > 0) {\n prepared.bounds.yMin = 0\n }\n return prepared\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, options, xScale, yScale } = ctx\n const nodes: RenderNode[] = []\n\n const series = data.series[0]\n if (!series || series.values.length === 0) return nodes\n\n const bw = getBandwidth(xScale)\n // Histograms have no gap — bars touch\n const barWidth = bw\n const baseline = yScale.map(Math.max(0, yScale.getDomain()[0] as number))\n\n const barNodes: RenderNode[] = []\n\n for (let i = 0; i < series.values.length; i++) {\n const value = series.values[i]!\n const cx = xScale.map(i)\n const barX = cx - barWidth / 2\n const vy = yScale.map(value)\n\n const y = value >= 0 ? vy : baseline\n const h = Math.abs(vy - baseline)\n if (h < 0.5) continue\n\n const colorIndex = i % options.colors.length\n const barFill = `url(#chartts-bar-${colorIndex})`\n\n barNodes.push(rect(barX, y, barWidth, h, {\n rx: 2, ry: 2,\n class: 'chartts-bar chartts-histogram-bar',\n fill: barFill,\n stroke: series.color,\n strokeWidth: 0.5,\n 'data-series': 0,\n 'data-index': i,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${data.labels[i]}: ${value}`,\n }))\n }\n\n nodes.push(group(barNodes, {\n class: 'chartts-series chartts-series-0',\n 'data-series-name': series.name,\n }))\n\n return nodes\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { data, xScale, yScale } = ctx\n const series = data.series[0]\n if (!series || series.values.length === 0) return null\n\n const bw = getBandwidth(xScale)\n const barWidth = bw\n const baseline = yScale.map(Math.max(0, yScale.getDomain()[0] as number))\n\n for (let i = 0; i < series.values.length; i++) {\n const cx = xScale.map(i)\n const barX = cx - barWidth / 2\n const vy = yScale.map(series.values[i]!)\n const y = series.values[i]! >= 0 ? vy : baseline\n const h = Math.abs(vy - baseline)\n\n if (mx >= barX - 1 && mx <= barX + barWidth + 1 && my >= y - 2 && my <= y + h + 2) {\n return { seriesIndex: 0, pointIndex: i, distance: 0 }\n }\n }\n\n return null\n },\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { prepareNoAxes } from './chunk-3XVGEBR4.js';
2
- import { text, rect, group } from './chunk-3BRQGYDX.js';
1
+ import { prepareNoAxes } from './chunk-GMLJDDHZ.js';
2
+ import { text, rect, group } from './chunk-BMTVFAX2.js';
3
3
 
4
4
  // src/charts/heatmap/heatmap-type.ts
5
5
  var heatmapChartType = {
@@ -120,5 +120,5 @@ function interpolateColor(baseColor, t) {
120
120
  }
121
121
 
122
122
  export { heatmapChartType };
123
- //# sourceMappingURL=chunk-QZ4ZYTP6.js.map
124
- //# sourceMappingURL=chunk-QZ4ZYTP6.js.map
123
+ //# sourceMappingURL=chunk-2L46SAT7.js.map
124
+ //# sourceMappingURL=chunk-2L46SAT7.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/charts/heatmap/heatmap-type.ts"],"names":[],"mappings":"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","file":"chunk-QZ4ZYTP6.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 * Heatmap chart — displays a matrix of colored cells.\n *\n * Data format: each series is a row, each value is a cell.\n * Labels are column headers, series names are row headers.\n * Cell color intensity is proportional to value.\n */\nexport const heatmapChartType: ChartTypePlugin = {\n type: 'heatmap',\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 rowCount = data.series.length\n const colCount = data.labels.length\n if (rowCount === 0 || colCount === 0) return nodes\n\n // Find min/max values for color interpolation\n let vMin = Infinity\n let vMax = -Infinity\n for (const s of data.series) {\n for (const v of s.values) {\n if (v < vMin) vMin = v\n if (v > vMax) vMax = v\n }\n }\n if (vMin === vMax) vMax = vMin + 1\n\n // Layout: leave space for labels\n const labelW = Math.min(60, area.width * 0.15)\n const labelH = Math.min(24, area.height * 0.1)\n const gridX = area.x + labelW\n const gridY = area.y + labelH\n const gridW = area.width - labelW\n const gridH = area.height - labelH\n const cellW = gridW / colCount\n const cellH = gridH / rowCount\n const gap = 1.5\n\n // Column labels (top)\n for (let c = 0; c < colCount; c++) {\n const x = gridX + cellW * (c + 0.5)\n nodes.push(text(x, area.y + labelH * 0.5, String(data.labels[c]!), {\n class: 'chartts-heatmap-col-label',\n fill: theme.textMuted,\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize: Math.min(theme.fontSizeSmall, cellW * 0.35),\n fontFamily: theme.fontFamily,\n }))\n }\n\n // Row labels (left) + cells\n for (let r = 0; r < rowCount; r++) {\n const series = data.series[r]!\n const ry = gridY + cellH * r\n\n // Row label\n nodes.push(text(area.x + labelW - 4, ry + cellH / 2, series.name, {\n class: 'chartts-heatmap-row-label',\n fill: theme.textMuted,\n textAnchor: 'end',\n dominantBaseline: 'central',\n fontSize: Math.min(theme.fontSizeSmall, cellH * 0.45),\n fontFamily: theme.fontFamily,\n }))\n\n const cellNodes: RenderNode[] = []\n\n for (let c = 0; c < colCount; c++) {\n const value = series.values[c] ?? 0\n const t = (value - vMin) / (vMax - vMin)\n const color = interpolateColor(options.colors[0]!, t)\n\n cellNodes.push(rect(\n gridX + cellW * c + gap / 2,\n ry + gap / 2,\n cellW - gap,\n cellH - gap,\n {\n class: 'chartts-heatmap-cell',\n fill: color,\n rx: 4,\n ry: 2,\n 'data-series': r,\n 'data-index': c,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${series.name}, ${data.labels[c]}: ${value}`,\n },\n ))\n }\n\n nodes.push(group(cellNodes, {\n class: `chartts-series chartts-series-${r}`,\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 } = ctx\n const rowCount = data.series.length\n const colCount = data.labels.length\n if (rowCount === 0 || colCount === 0) return null\n\n const labelW = Math.min(60, area.width * 0.15)\n const labelH = Math.min(24, area.height * 0.1)\n const gridX = area.x + labelW\n const gridY = area.y + labelH\n const gridW = area.width - labelW\n const gridH = area.height - labelH\n const cellW = gridW / colCount\n const cellH = gridH / rowCount\n\n if (mx < gridX || mx > gridX + gridW || my < gridY || my > gridY + gridH) return null\n\n const col = Math.floor((mx - gridX) / cellW)\n const row = Math.floor((my - gridY) / cellH)\n\n if (row >= 0 && row < rowCount && col >= 0 && col < colCount) {\n return { seriesIndex: row, pointIndex: col, distance: 0 }\n }\n\n return null\n },\n}\n\n/** Interpolate from transparent to the given color based on t (0..1) */\nfunction interpolateColor(baseColor: string, t: number): string {\n // Extract hex fallback from var(--color-xxx, #hex) format\n const hexMatch = baseColor.match(/#([0-9a-fA-F]{6})/)\n if (!hexMatch) return `rgba(59, 130, 246, ${(0.1 + t * 0.9).toFixed(2)})`\n\n const hex = hexMatch[1]!\n const r = parseInt(hex.slice(0, 2), 16)\n const g = parseInt(hex.slice(2, 4), 16)\n const b = parseInt(hex.slice(4, 6), 16)\n\n const opacity = 0.1 + t * 0.9\n return `rgba(${r}, ${g}, ${b}, ${opacity.toFixed(2)})`\n}\n"]}
1
+ {"version":3,"sources":["../src/charts/heatmap/heatmap-type.ts"],"names":[],"mappings":"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","file":"chunk-2L46SAT7.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 * Heatmap chart — displays a matrix of colored cells.\n *\n * Data format: each series is a row, each value is a cell.\n * Labels are column headers, series names are row headers.\n * Cell color intensity is proportional to value.\n */\nexport const heatmapChartType: ChartTypePlugin = {\n type: 'heatmap',\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 rowCount = data.series.length\n const colCount = data.labels.length\n if (rowCount === 0 || colCount === 0) return nodes\n\n // Find min/max values for color interpolation\n let vMin = Infinity\n let vMax = -Infinity\n for (const s of data.series) {\n for (const v of s.values) {\n if (v < vMin) vMin = v\n if (v > vMax) vMax = v\n }\n }\n if (vMin === vMax) vMax = vMin + 1\n\n // Layout: leave space for labels\n const labelW = Math.min(60, area.width * 0.15)\n const labelH = Math.min(24, area.height * 0.1)\n const gridX = area.x + labelW\n const gridY = area.y + labelH\n const gridW = area.width - labelW\n const gridH = area.height - labelH\n const cellW = gridW / colCount\n const cellH = gridH / rowCount\n const gap = 1.5\n\n // Column labels (top)\n for (let c = 0; c < colCount; c++) {\n const x = gridX + cellW * (c + 0.5)\n nodes.push(text(x, area.y + labelH * 0.5, String(data.labels[c]!), {\n class: 'chartts-heatmap-col-label',\n fill: theme.textMuted,\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize: Math.min(theme.fontSizeSmall, cellW * 0.35),\n fontFamily: theme.fontFamily,\n }))\n }\n\n // Row labels (left) + cells\n for (let r = 0; r < rowCount; r++) {\n const series = data.series[r]!\n const ry = gridY + cellH * r\n\n // Row label\n nodes.push(text(area.x + labelW - 4, ry + cellH / 2, series.name, {\n class: 'chartts-heatmap-row-label',\n fill: theme.textMuted,\n textAnchor: 'end',\n dominantBaseline: 'central',\n fontSize: Math.min(theme.fontSizeSmall, cellH * 0.45),\n fontFamily: theme.fontFamily,\n }))\n\n const cellNodes: RenderNode[] = []\n\n for (let c = 0; c < colCount; c++) {\n const value = series.values[c] ?? 0\n const t = (value - vMin) / (vMax - vMin)\n const color = interpolateColor(options.colors[0]!, t)\n\n cellNodes.push(rect(\n gridX + cellW * c + gap / 2,\n ry + gap / 2,\n cellW - gap,\n cellH - gap,\n {\n class: 'chartts-heatmap-cell',\n fill: color,\n rx: 4,\n ry: 2,\n 'data-series': r,\n 'data-index': c,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${series.name}, ${data.labels[c]}: ${value}`,\n },\n ))\n }\n\n nodes.push(group(cellNodes, {\n class: `chartts-series chartts-series-${r}`,\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 } = ctx\n const rowCount = data.series.length\n const colCount = data.labels.length\n if (rowCount === 0 || colCount === 0) return null\n\n const labelW = Math.min(60, area.width * 0.15)\n const labelH = Math.min(24, area.height * 0.1)\n const gridX = area.x + labelW\n const gridY = area.y + labelH\n const gridW = area.width - labelW\n const gridH = area.height - labelH\n const cellW = gridW / colCount\n const cellH = gridH / rowCount\n\n if (mx < gridX || mx > gridX + gridW || my < gridY || my > gridY + gridH) return null\n\n const col = Math.floor((mx - gridX) / cellW)\n const row = Math.floor((my - gridY) / cellH)\n\n if (row >= 0 && row < rowCount && col >= 0 && col < colCount) {\n return { seriesIndex: row, pointIndex: col, distance: 0 }\n }\n\n return null\n },\n}\n\n/** Interpolate from transparent to the given color based on t (0..1) */\nfunction interpolateColor(baseColor: string, t: number): string {\n // Extract hex fallback from var(--color-xxx, #hex) format\n const hexMatch = baseColor.match(/#([0-9a-fA-F]{6})/)\n if (!hexMatch) return `rgba(59, 130, 246, ${(0.1 + t * 0.9).toFixed(2)})`\n\n const hex = hexMatch[1]!\n const r = parseInt(hex.slice(0, 2), 16)\n const g = parseInt(hex.slice(2, 4), 16)\n const b = parseInt(hex.slice(4, 6), 16)\n\n const opacity = 0.1 + t * 0.9\n return `rgba(${r}, ${g}, ${b}, ${opacity.toFixed(2)})`\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunk2TWYS3BT_cjs = require('./chunk-2TWYS3BT.cjs');
3
+ var chunkSLJNRP7O_cjs = require('./chunk-SLJNRP7O.cjs');
4
4
 
5
5
  // src/charts/step/step-type.ts
6
6
  var stepChartType = {
@@ -9,20 +9,20 @@ var stepChartType = {
9
9
  return { x: "categorical", y: "linear" };
10
10
  },
11
11
  prepareData(data, options) {
12
- return chunk2TWYS3BT_cjs.lineChartType.prepareData(data, options);
12
+ return chunkSLJNRP7O_cjs.lineChartType.prepareData(data, options);
13
13
  },
14
14
  render(ctx) {
15
15
  const stepCtx = {
16
16
  ...ctx,
17
17
  options: { ...ctx.options, curve: "step" }
18
18
  };
19
- return chunk2TWYS3BT_cjs.lineChartType.render(stepCtx);
19
+ return chunkSLJNRP7O_cjs.lineChartType.render(stepCtx);
20
20
  },
21
21
  hitTest(ctx, mx, my) {
22
- return chunk2TWYS3BT_cjs.lineChartType.hitTest(ctx, mx, my);
22
+ return chunkSLJNRP7O_cjs.lineChartType.hitTest(ctx, mx, my);
23
23
  }
24
24
  };
25
25
 
26
26
  exports.stepChartType = stepChartType;
27
- //# sourceMappingURL=chunk-MVWERW4G.cjs.map
28
- //# sourceMappingURL=chunk-MVWERW4G.cjs.map
27
+ //# sourceMappingURL=chunk-2PRCN5OJ.cjs.map
28
+ //# sourceMappingURL=chunk-2PRCN5OJ.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/charts/step/step-type.ts"],"names":["lineChartType"],"mappings":";;;;;AAYO,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;AACnE,IAAA,OAAOA,+BAAA,CAAc,WAAA,CAAY,IAAA,EAAM,OAAO,CAAA;AAAA,EAChD,CAAA;AAAA,EAEA,OAAO,GAAA,EAAkC;AAEvC,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,GAAG,GAAA;AAAA,MACH,SAAS,EAAE,GAAG,GAAA,CAAI,OAAA,EAAS,OAAO,MAAA;AAAgB,KACpD;AACA,IAAA,OAAOA,+BAAA,CAAc,OAAO,OAAO,CAAA;AAAA,EACrC,CAAA;AAAA,EAEA,OAAA,CAAQ,GAAA,EAAoB,EAAA,EAAY,EAAA,EAA8B;AACpE,IAAA,OAAOA,+BAAA,CAAc,OAAA,CAAQ,GAAA,EAAK,EAAA,EAAI,EAAE,CAAA;AAAA,EAC1C;AACF","file":"chunk-MVWERW4G.cjs","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 * Step chart — line chart with stair-step interpolation.\n *\n * Delegates entirely to lineChartType after forcing curve:'step'.\n * Used for: interest rates, order books, discrete pricing tiers.\n */\nexport const stepChartType: ChartTypePlugin = {\n type: 'step',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n return lineChartType.prepareData(data, options)\n },\n\n render(ctx: RenderContext): RenderNode[] {\n // Force step interpolation\n const stepCtx = {\n ...ctx,\n options: { ...ctx.options, curve: 'step' as const },\n }\n return lineChartType.render(stepCtx)\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n return lineChartType.hitTest(ctx, mx, my)\n },\n}\n"]}
1
+ {"version":3,"sources":["../src/charts/step/step-type.ts"],"names":["lineChartType"],"mappings":";;;;;AAYO,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;AACnE,IAAA,OAAOA,+BAAA,CAAc,WAAA,CAAY,IAAA,EAAM,OAAO,CAAA;AAAA,EAChD,CAAA;AAAA,EAEA,OAAO,GAAA,EAAkC;AAEvC,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,GAAG,GAAA;AAAA,MACH,SAAS,EAAE,GAAG,GAAA,CAAI,OAAA,EAAS,OAAO,MAAA;AAAgB,KACpD;AACA,IAAA,OAAOA,+BAAA,CAAc,OAAO,OAAO,CAAA;AAAA,EACrC,CAAA;AAAA,EAEA,OAAA,CAAQ,GAAA,EAAoB,EAAA,EAAY,EAAA,EAA8B;AACpE,IAAA,OAAOA,+BAAA,CAAc,OAAA,CAAQ,GAAA,EAAK,EAAA,EAAI,EAAE,CAAA;AAAA,EAC1C;AACF","file":"chunk-2PRCN5OJ.cjs","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 * Step chart — line chart with stair-step interpolation.\n *\n * Delegates entirely to lineChartType after forcing curve:'step'.\n * Used for: interest rates, order books, discrete pricing tiers.\n */\nexport const stepChartType: ChartTypePlugin = {\n type: 'step',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n return lineChartType.prepareData(data, options)\n },\n\n render(ctx: RenderContext): RenderNode[] {\n // Force step interpolation\n const stepCtx = {\n ...ctx,\n options: { ...ctx.options, curve: 'step' as const },\n }\n return lineChartType.render(stepCtx)\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n return lineChartType.hitTest(ctx, mx, my)\n },\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkXHQWWR5M_cjs = require('./chunk-XHQWWR5M.cjs');
3
+ var chunk3TLJCGGQ_cjs = require('./chunk-3TLJCGGQ.cjs');
4
4
 
5
5
  // src/charts/baseline/baseline-type.ts
6
6
  var baselineChartType = {
@@ -11,7 +11,7 @@ var baselineChartType = {
11
11
  prepareData(data, options) {
12
12
  const opts = options;
13
13
  const bv = opts.baseline ?? 0;
14
- const prepared = chunkXHQWWR5M_cjs.prepareData(data, options);
14
+ const prepared = chunk3TLJCGGQ_cjs.prepareData(data, options);
15
15
  if (bv < prepared.bounds.yMin) prepared.bounds.yMin = bv;
16
16
  if (bv > prepared.bounds.yMax) prepared.bounds.yMax = bv;
17
17
  return prepared;
@@ -40,7 +40,7 @@ var baselineChartType = {
40
40
  const points = validPoints.map((p) => ({ x: p.x, y: p.y }));
41
41
  const posFill = buildClippedArea(points, baseY, "above");
42
42
  if (posFill) {
43
- seriesNodes.push(chunkXHQWWR5M_cjs.path(posFill, {
43
+ seriesNodes.push(chunk3TLJCGGQ_cjs.path(posFill, {
44
44
  class: "chartts-baseline-pos",
45
45
  fill: posColor,
46
46
  fillOpacity: fillOp,
@@ -49,21 +49,21 @@ var baselineChartType = {
49
49
  }
50
50
  const negFill = buildClippedArea(points, baseY, "below");
51
51
  if (negFill) {
52
- seriesNodes.push(chunkXHQWWR5M_cjs.path(negFill, {
52
+ seriesNodes.push(chunk3TLJCGGQ_cjs.path(negFill, {
53
53
  class: "chartts-baseline-neg",
54
54
  fill: negColor,
55
55
  fillOpacity: fillOp,
56
56
  "data-series": series.index
57
57
  }));
58
58
  }
59
- const linePath = new chunkXHQWWR5M_cjs.PathBuilder();
59
+ const linePath = new chunk3TLJCGGQ_cjs.PathBuilder();
60
60
  if (points.length > 0) {
61
61
  linePath.moveTo(points[0].x, points[0].y);
62
62
  for (let i = 1; i < points.length; i++) {
63
63
  linePath.lineTo(points[i].x, points[i].y);
64
64
  }
65
65
  }
66
- seriesNodes.push(chunkXHQWWR5M_cjs.path(linePath.build(), {
66
+ seriesNodes.push(chunk3TLJCGGQ_cjs.path(linePath.build(), {
67
67
  class: "chartts-baseline-line",
68
68
  stroke: series.color,
69
69
  strokeWidth: theme.lineWidth,
@@ -72,10 +72,10 @@ var baselineChartType = {
72
72
  if (showPoints) {
73
73
  for (const vp of validPoints) {
74
74
  const color = vp.val >= bv ? posColor : negColor;
75
- seriesNodes.push(chunkXHQWWR5M_cjs.circle(vp.x, vp.y, theme.pointRadius, {
75
+ seriesNodes.push(chunk3TLJCGGQ_cjs.circle(vp.x, vp.y, theme.pointRadius, {
76
76
  class: "chartts-point",
77
77
  fill: color,
78
- stroke: `var(${chunkXHQWWR5M_cjs.CSS_PREFIX}-bg, #fff)`,
78
+ stroke: `var(${chunk3TLJCGGQ_cjs.CSS_PREFIX}-bg, #fff)`,
79
79
  strokeWidth: 2,
80
80
  "data-series": series.index,
81
81
  "data-index": vp.idx,
@@ -85,13 +85,13 @@ var baselineChartType = {
85
85
  }));
86
86
  }
87
87
  }
88
- nodes.push(chunkXHQWWR5M_cjs.group(seriesNodes, {
88
+ nodes.push(chunk3TLJCGGQ_cjs.group(seriesNodes, {
89
89
  class: `chartts-series chartts-series-${series.index}`,
90
90
  "data-series-name": series.name
91
91
  }));
92
92
  }
93
93
  if (showBaseline) {
94
- nodes.push(chunkXHQWWR5M_cjs.line(area.x, baseY, area.x + area.width, baseY, {
94
+ nodes.push(chunk3TLJCGGQ_cjs.line(area.x, baseY, area.x + area.width, baseY, {
95
95
  class: "chartts-baseline-ref",
96
96
  stroke: theme.textMuted,
97
97
  strokeWidth: 1,
@@ -147,7 +147,7 @@ function buildClippedArea(points, baseY, side) {
147
147
  }
148
148
  if (current.length >= 2) segments.push(current);
149
149
  if (segments.length === 0) return null;
150
- const pb = new chunkXHQWWR5M_cjs.PathBuilder();
150
+ const pb = new chunk3TLJCGGQ_cjs.PathBuilder();
151
151
  for (const seg of segments) {
152
152
  pb.moveTo(seg[0].x, seg[0].y);
153
153
  for (let i = 1; i < seg.length; i++) {
@@ -161,5 +161,5 @@ function buildClippedArea(points, baseY, side) {
161
161
  }
162
162
 
163
163
  exports.baselineChartType = baselineChartType;
164
- //# sourceMappingURL=chunk-B54L2CPW.cjs.map
165
- //# sourceMappingURL=chunk-B54L2CPW.cjs.map
164
+ //# sourceMappingURL=chunk-3N447NTJ.cjs.map
165
+ //# sourceMappingURL=chunk-3N447NTJ.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/charts/baseline/baseline-type.ts"],"names":["prepareData","path","PathBuilder","circle","CSS_PREFIX","group","line"],"mappings":"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","file":"chunk-B54L2CPW.cjs","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { CSS_PREFIX } from '../../constants'\nimport { prepareData } from '../../data/prepare'\nimport { group, path, circle, line } from '../../render/tree'\nimport { PathBuilder } from '../../render/tree'\n\nexport interface BaselineOptions {\n /** Reference value for positive/negative split. Default 0. */\n baseline?: number\n /** Color for values above baseline. Default green. */\n positiveColor?: string\n /** Color for values below baseline. Default red. */\n negativeColor?: string\n /** Fill opacity for shaded areas. Default 0.15. */\n fillOpacity?: number\n /** Show the baseline reference line. Default true. */\n showBaseline?: boolean\n /** Show data points. Default true. */\n showPoints?: boolean\n}\n\n/**\n * Baseline chart — line with positive/negative shading.\n *\n * Values above the baseline are shaded green, below shaded red.\n * Used for: performance vs benchmark, P&L, temperature anomalies.\n */\nexport const baselineChartType: ChartTypePlugin = {\n type: 'baseline',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n const opts = options as unknown as BaselineOptions\n const bv = opts.baseline ?? 0\n const prepared = prepareData(data, options)\n // Ensure baseline value is visible in the scale\n if (bv < prepared.bounds.yMin) prepared.bounds.yMin = bv\n if (bv > prepared.bounds.yMax) prepared.bounds.yMax = bv\n return prepared\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, xScale, yScale, area, options, theme } = ctx\n const nodes: RenderNode[] = []\n\n const opts = options as unknown as BaselineOptions\n const bv = opts.baseline ?? 0\n const posColor = opts.positiveColor ?? 'var(--color-emerald-500, #10b981)'\n const negColor = opts.negativeColor ?? 'var(--color-red-500, #ef4444)'\n const fillOp = opts.fillOpacity ?? 0.15\n const showBaseline = opts.showBaseline ?? true\n const showPoints = opts.showPoints ?? true\n\n const baseY = yScale.map(bv)\n\n for (const series of data.series) {\n const seriesNodes: RenderNode[] = []\n const values = series.values\n if (values.length === 0) continue\n\n // Filter out NaN for path building — only use valid data points\n const validPoints: { x: number; y: number; idx: number; val: number }[] = []\n for (let i = 0; i < values.length; i++) {\n if (!isNaN(values[i]!)) {\n validPoints.push({ x: xScale.map(i), y: yScale.map(values[i]!), idx: i, val: values[i]! })\n }\n }\n const points = validPoints.map(p => ({ x: p.x, y: p.y }))\n\n // Positive fill (above baseline, clipped at baseline)\n const posFill = buildClippedArea(points, baseY, 'above')\n if (posFill) {\n seriesNodes.push(path(posFill, {\n class: 'chartts-baseline-pos',\n fill: posColor,\n fillOpacity: fillOp,\n 'data-series': series.index,\n }))\n }\n\n // Negative fill (below baseline, clipped at baseline)\n const negFill = buildClippedArea(points, baseY, 'below')\n if (negFill) {\n seriesNodes.push(path(negFill, {\n class: 'chartts-baseline-neg',\n fill: negColor,\n fillOpacity: fillOp,\n 'data-series': series.index,\n }))\n }\n\n // Main line (using valid points only)\n const linePath = new PathBuilder()\n if (points.length > 0) {\n linePath.moveTo(points[0]!.x, points[0]!.y)\n for (let i = 1; i < points.length; i++) {\n linePath.lineTo(points[i]!.x, points[i]!.y)\n }\n }\n seriesNodes.push(path(linePath.build(), {\n class: 'chartts-baseline-line',\n stroke: series.color,\n strokeWidth: theme.lineWidth,\n 'data-series': series.index,\n }))\n\n // Data points (only for valid points)\n if (showPoints) {\n for (const vp of validPoints) {\n const color = vp.val >= bv ? posColor : negColor\n seriesNodes.push(circle(vp.x, vp.y, theme.pointRadius, {\n class: 'chartts-point',\n fill: color,\n stroke: `var(${CSS_PREFIX}-bg, #fff)`,\n strokeWidth: 2,\n 'data-series': series.index,\n 'data-index': vp.idx,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${series.name}: ${vp.val} (${vp.val >= bv ? '+' : ''}${(vp.val - bv).toFixed(1)})`,\n }))\n }\n }\n\n nodes.push(group(seriesNodes, {\n class: `chartts-series chartts-series-${series.index}`,\n 'data-series-name': series.name,\n }))\n }\n\n // Baseline reference line\n if (showBaseline) {\n nodes.push(line(area.x, baseY, area.x + area.width, baseY, {\n class: 'chartts-baseline-ref',\n stroke: theme.textMuted,\n strokeWidth: 1,\n strokeDasharray: '6,4',\n opacity: 0.5,\n }))\n }\n\n return nodes\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { data, xScale, yScale } = ctx\n let best: HitResult | null = null\n let bestDist = Infinity\n\n for (const series of data.series) {\n for (let i = 0; i < series.values.length; i++) {\n if (isNaN(series.values[i]!)) continue\n const x = xScale.map(i)\n const y = yScale.map(series.values[i]!)\n const dist = Math.sqrt((mx - x) ** 2 + (my - y) ** 2)\n if (dist < bestDist) {\n bestDist = dist\n best = { seriesIndex: series.index, pointIndex: i, distance: dist }\n }\n }\n }\n\n return best && best.distance < 30 ? best : null\n },\n}\n\n/**\n * Build a filled area path clipped to one side of the baseline.\n * Interpolates intersection points where the line crosses the baseline.\n */\nfunction buildClippedArea(\n points: { x: number; y: number }[],\n baseY: number,\n side: 'above' | 'below',\n): string | null {\n if (points.length < 2) return null\n\n // Collect segments that are on the desired side\n const segments: { x: number; y: number }[][] = []\n let current: { x: number; y: number }[] = []\n\n for (let i = 0; i < points.length; i++) {\n const p = points[i]!\n const onSide = side === 'above' ? p.y <= baseY : p.y >= baseY\n\n if (i > 0) {\n const prev = points[i - 1]!\n const prevOnSide = side === 'above' ? prev.y <= baseY : prev.y >= baseY\n\n // Crossing detected — compute intersection\n if (onSide !== prevOnSide) {\n const t = (baseY - prev.y) / (p.y - prev.y)\n const ix = prev.x + t * (p.x - prev.x)\n const cross = { x: ix, y: baseY }\n\n if (prevOnSide) {\n // Was on side, now leaving — close current segment\n current.push(cross)\n if (current.length >= 2) segments.push(current)\n current = []\n } else {\n // Was off side, now entering — start new segment\n current = [cross]\n }\n }\n }\n\n if (onSide) current.push(p)\n }\n if (current.length >= 2) segments.push(current)\n if (segments.length === 0) return null\n\n // Build SVG path for all segments\n const pb = new PathBuilder()\n for (const seg of segments) {\n pb.moveTo(seg[0]!.x, seg[0]!.y)\n for (let i = 1; i < seg.length; i++) {\n pb.lineTo(seg[i]!.x, seg[i]!.y)\n }\n // Close down/up to baseline\n pb.lineTo(seg[seg.length - 1]!.x, baseY)\n pb.lineTo(seg[0]!.x, baseY)\n pb.close()\n }\n\n return pb.build()\n}\n"]}
1
+ {"version":3,"sources":["../src/charts/baseline/baseline-type.ts"],"names":["prepareData","path","PathBuilder","circle","CSS_PREFIX","group","line"],"mappings":"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","file":"chunk-3N447NTJ.cjs","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { CSS_PREFIX } from '../../constants'\nimport { prepareData } from '../../data/prepare'\nimport { group, path, circle, line } from '../../render/tree'\nimport { PathBuilder } from '../../render/tree'\n\nexport interface BaselineOptions {\n /** Reference value for positive/negative split. Default 0. */\n baseline?: number\n /** Color for values above baseline. Default green. */\n positiveColor?: string\n /** Color for values below baseline. Default red. */\n negativeColor?: string\n /** Fill opacity for shaded areas. Default 0.15. */\n fillOpacity?: number\n /** Show the baseline reference line. Default true. */\n showBaseline?: boolean\n /** Show data points. Default true. */\n showPoints?: boolean\n}\n\n/**\n * Baseline chart — line with positive/negative shading.\n *\n * Values above the baseline are shaded green, below shaded red.\n * Used for: performance vs benchmark, P&L, temperature anomalies.\n */\nexport const baselineChartType: ChartTypePlugin = {\n type: 'baseline',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'linear' }\n },\n\n prepareData(data: ChartData, options: ResolvedOptions): PreparedData {\n const opts = options as unknown as BaselineOptions\n const bv = opts.baseline ?? 0\n const prepared = prepareData(data, options)\n // Ensure baseline value is visible in the scale\n if (bv < prepared.bounds.yMin) prepared.bounds.yMin = bv\n if (bv > prepared.bounds.yMax) prepared.bounds.yMax = bv\n return prepared\n },\n\n render(ctx: RenderContext): RenderNode[] {\n const { data, xScale, yScale, area, options, theme } = ctx\n const nodes: RenderNode[] = []\n\n const opts = options as unknown as BaselineOptions\n const bv = opts.baseline ?? 0\n const posColor = opts.positiveColor ?? 'var(--color-emerald-500, #10b981)'\n const negColor = opts.negativeColor ?? 'var(--color-red-500, #ef4444)'\n const fillOp = opts.fillOpacity ?? 0.15\n const showBaseline = opts.showBaseline ?? true\n const showPoints = opts.showPoints ?? true\n\n const baseY = yScale.map(bv)\n\n for (const series of data.series) {\n const seriesNodes: RenderNode[] = []\n const values = series.values\n if (values.length === 0) continue\n\n // Filter out NaN for path building — only use valid data points\n const validPoints: { x: number; y: number; idx: number; val: number }[] = []\n for (let i = 0; i < values.length; i++) {\n if (!isNaN(values[i]!)) {\n validPoints.push({ x: xScale.map(i), y: yScale.map(values[i]!), idx: i, val: values[i]! })\n }\n }\n const points = validPoints.map(p => ({ x: p.x, y: p.y }))\n\n // Positive fill (above baseline, clipped at baseline)\n const posFill = buildClippedArea(points, baseY, 'above')\n if (posFill) {\n seriesNodes.push(path(posFill, {\n class: 'chartts-baseline-pos',\n fill: posColor,\n fillOpacity: fillOp,\n 'data-series': series.index,\n }))\n }\n\n // Negative fill (below baseline, clipped at baseline)\n const negFill = buildClippedArea(points, baseY, 'below')\n if (negFill) {\n seriesNodes.push(path(negFill, {\n class: 'chartts-baseline-neg',\n fill: negColor,\n fillOpacity: fillOp,\n 'data-series': series.index,\n }))\n }\n\n // Main line (using valid points only)\n const linePath = new PathBuilder()\n if (points.length > 0) {\n linePath.moveTo(points[0]!.x, points[0]!.y)\n for (let i = 1; i < points.length; i++) {\n linePath.lineTo(points[i]!.x, points[i]!.y)\n }\n }\n seriesNodes.push(path(linePath.build(), {\n class: 'chartts-baseline-line',\n stroke: series.color,\n strokeWidth: theme.lineWidth,\n 'data-series': series.index,\n }))\n\n // Data points (only for valid points)\n if (showPoints) {\n for (const vp of validPoints) {\n const color = vp.val >= bv ? posColor : negColor\n seriesNodes.push(circle(vp.x, vp.y, theme.pointRadius, {\n class: 'chartts-point',\n fill: color,\n stroke: `var(${CSS_PREFIX}-bg, #fff)`,\n strokeWidth: 2,\n 'data-series': series.index,\n 'data-index': vp.idx,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${series.name}: ${vp.val} (${vp.val >= bv ? '+' : ''}${(vp.val - bv).toFixed(1)})`,\n }))\n }\n }\n\n nodes.push(group(seriesNodes, {\n class: `chartts-series chartts-series-${series.index}`,\n 'data-series-name': series.name,\n }))\n }\n\n // Baseline reference line\n if (showBaseline) {\n nodes.push(line(area.x, baseY, area.x + area.width, baseY, {\n class: 'chartts-baseline-ref',\n stroke: theme.textMuted,\n strokeWidth: 1,\n strokeDasharray: '6,4',\n opacity: 0.5,\n }))\n }\n\n return nodes\n },\n\n hitTest(ctx: RenderContext, mx: number, my: number): HitResult | null {\n const { data, xScale, yScale } = ctx\n let best: HitResult | null = null\n let bestDist = Infinity\n\n for (const series of data.series) {\n for (let i = 0; i < series.values.length; i++) {\n if (isNaN(series.values[i]!)) continue\n const x = xScale.map(i)\n const y = yScale.map(series.values[i]!)\n const dist = Math.sqrt((mx - x) ** 2 + (my - y) ** 2)\n if (dist < bestDist) {\n bestDist = dist\n best = { seriesIndex: series.index, pointIndex: i, distance: dist }\n }\n }\n }\n\n return best && best.distance < 30 ? best : null\n },\n}\n\n/**\n * Build a filled area path clipped to one side of the baseline.\n * Interpolates intersection points where the line crosses the baseline.\n */\nfunction buildClippedArea(\n points: { x: number; y: number }[],\n baseY: number,\n side: 'above' | 'below',\n): string | null {\n if (points.length < 2) return null\n\n // Collect segments that are on the desired side\n const segments: { x: number; y: number }[][] = []\n let current: { x: number; y: number }[] = []\n\n for (let i = 0; i < points.length; i++) {\n const p = points[i]!\n const onSide = side === 'above' ? p.y <= baseY : p.y >= baseY\n\n if (i > 0) {\n const prev = points[i - 1]!\n const prevOnSide = side === 'above' ? prev.y <= baseY : prev.y >= baseY\n\n // Crossing detected — compute intersection\n if (onSide !== prevOnSide) {\n const t = (baseY - prev.y) / (p.y - prev.y)\n const ix = prev.x + t * (p.x - prev.x)\n const cross = { x: ix, y: baseY }\n\n if (prevOnSide) {\n // Was on side, now leaving — close current segment\n current.push(cross)\n if (current.length >= 2) segments.push(current)\n current = []\n } else {\n // Was off side, now entering — start new segment\n current = [cross]\n }\n }\n }\n\n if (onSide) current.push(p)\n }\n if (current.length >= 2) segments.push(current)\n if (segments.length === 0) return null\n\n // Build SVG path for all segments\n const pb = new PathBuilder()\n for (const seg of segments) {\n pb.moveTo(seg[0]!.x, seg[0]!.y)\n for (let i = 1; i < seg.length; i++) {\n pb.lineTo(seg[i]!.x, seg[i]!.y)\n }\n // Close down/up to baseline\n pb.lineTo(seg[seg.length - 1]!.x, baseY)\n pb.lineTo(seg[0]!.x, baseY)\n pb.close()\n }\n\n return pb.build()\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { prepareNoAxes } from './chunk-3XVGEBR4.js';
2
- import { text, rect, group } from './chunk-3BRQGYDX.js';
1
+ import { prepareNoAxes } from './chunk-GMLJDDHZ.js';
2
+ import { text, rect, group } from './chunk-BMTVFAX2.js';
3
3
 
4
4
  // src/charts/matrix/matrix-type.ts
5
5
  var matrixChartType = {
@@ -153,5 +153,5 @@ function interpolateOpacity(baseColor, opacity) {
153
153
  }
154
154
 
155
155
  export { matrixChartType };
156
- //# sourceMappingURL=chunk-7YV56WPE.js.map
157
- //# sourceMappingURL=chunk-7YV56WPE.js.map
156
+ //# sourceMappingURL=chunk-3NWZJCWL.js.map
157
+ //# sourceMappingURL=chunk-3NWZJCWL.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/charts/matrix/matrix-type.ts"],"names":["t"],"mappings":"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","file":"chunk-7YV56WPE.js","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareNoAxes } from '../../utils/prepare'\nimport { rect, text, group } from '../../render/tree'\n\n/**\n * Matrix chart — grid layout with color-coded cells.\n *\n * Data convention:\n * - labels: row/column names (for square matrices) or column names\n * - series[i].name: row name, series[i].values[j]: cell value at row i, col j\n *\n * Options:\n * - showValues: display values in cells (default true)\n * - cellRadius: border-radius for cells (default 2)\n * - colorScale: 'sequential' | 'diverging' (default 'sequential')\n * - minColor: color for minimum value\n * - maxColor: color for maximum value\n */\n\nexport interface MatrixOptions {\n showValues?: boolean\n cellRadius?: number\n colorScale?: 'sequential' | 'diverging'\n minColor?: string\n maxColor?: string\n}\n\nexport const matrixChartType: ChartTypePlugin = {\n type: 'matrix',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'categorical' }\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 mOpts = options as unknown as MatrixOptions\n const showValues = mOpts.showValues !== false\n const cellRadius = mOpts.cellRadius ?? 2\n const colorScale = mOpts.colorScale ?? 'sequential'\n\n const rows = data.series.length\n const cols = data.labels.length\n if (rows === 0 || cols === 0) return nodes\n\n // Gather all values for color scale\n let allMin = Infinity, allMax = -Infinity\n for (const s of data.series) {\n for (const v of s.values) {\n if (v < allMin) allMin = v\n if (v > allMax) allMax = v\n }\n }\n if (!isFinite(allMin)) allMin = 0\n if (!isFinite(allMax)) allMax = 1\n const valRange = allMax - allMin || 1\n\n // Layout\n const labelPadLeft = 60\n const labelPadTop = 30\n const gap = 2\n const gridW = area.width - labelPadLeft - 10\n const gridH = area.height - labelPadTop - 10\n const cellW = (gridW - gap * (cols - 1)) / cols\n const cellH = (gridH - gap * (rows - 1)) / rows\n const gridX = area.x + labelPadLeft\n const gridY = area.y + labelPadTop\n\n // Column headers\n for (let c = 0; c < cols; c++) {\n const cx = gridX + c * (cellW + gap) + cellW / 2\n nodes.push(text(cx, gridY - 8, String(data.labels[c] ?? ''), {\n class: 'chartts-matrix-col-label',\n fill: theme.textMuted,\n textAnchor: 'middle',\n dominantBaseline: 'auto',\n fontSize: Math.min(theme.fontSizeSmall, cellW * 0.35),\n fontFamily: theme.fontFamily,\n }))\n }\n\n // Row labels + cells\n for (let r = 0; r < rows; r++) {\n const series = data.series[r]!\n const ry = gridY + r * (cellH + gap)\n\n // Row label\n nodes.push(text(gridX - 6, ry + cellH / 2, series.name, {\n class: 'chartts-matrix-row-label',\n fill: theme.textMuted,\n textAnchor: 'end',\n dominantBaseline: 'central',\n fontSize: Math.min(theme.fontSizeSmall, cellH * 0.4),\n fontFamily: theme.fontFamily,\n }))\n\n const rowNodes: RenderNode[] = []\n for (let c = 0; c < cols; c++) {\n const val = series.values[c] ?? 0\n const cx = gridX + c * (cellW + gap)\n\n // Color interpolation\n const color = getCellColor(val, allMin, allMax, valRange, colorScale, options.colors)\n const textColor = getContrastColor(val, allMin, allMax, valRange, colorScale)\n\n rowNodes.push(rect(cx, ry, cellW, cellH, {\n class: 'chartts-matrix-cell',\n fill: color,\n rx: cellRadius,\n ry: cellRadius,\n 'data-series': r,\n 'data-index': c,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${series.name} × ${data.labels[c]}: ${val}`,\n }))\n\n // Value text\n if (showValues && cellW > 18 && cellH > 14) {\n const displayVal = Number.isInteger(val) ? String(val)\n : Math.abs(val) < 10 ? val.toFixed(2) : val.toFixed(1)\n\n rowNodes.push(text(cx + cellW / 2, ry + cellH / 2, displayVal, {\n class: 'chartts-matrix-value',\n fill: textColor,\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize: Math.min(theme.fontSizeSmall, cellW * 0.3, cellH * 0.4),\n fontFamily: theme.fontFamily,\n fontWeight: 600,\n pointerEvents: 'none',\n }))\n }\n }\n\n nodes.push(group(rowNodes, {\n class: `chartts-series chartts-series-${r}`,\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 } = ctx\n const rows = data.series.length\n const cols = data.labels.length\n if (rows === 0 || cols === 0) return null\n\n const labelPadLeft = 60\n const labelPadTop = 30\n const gap = 2\n const gridW = area.width - labelPadLeft - 10\n const gridH = area.height - labelPadTop - 10\n const cellW = (gridW - gap * (cols - 1)) / cols\n const cellH = (gridH - gap * (rows - 1)) / rows\n const gridX = area.x + labelPadLeft\n const gridY = area.y + labelPadTop\n\n const col = Math.floor((mx - gridX) / (cellW + gap))\n const row = Math.floor((my - gridY) / (cellH + gap))\n\n if (row >= 0 && row < rows && col >= 0 && col < cols) {\n return { seriesIndex: row, pointIndex: col, distance: 0 }\n }\n return null\n },\n}\n\n// ---------------------------------------------------------------------------\n// Color helpers\n// ---------------------------------------------------------------------------\n\nfunction getCellColor(\n val: number, min: number, max: number, range: number,\n scale: string, colors: readonly string[],\n): string {\n if (scale === 'diverging') {\n const mid = (min + max) / 2\n if (val >= mid) {\n const t = (val - mid) / ((max - mid) || 1)\n return interpolateOpacity(colors[0] ?? '#3b82f6', 0.15 + t * 0.85)\n } else {\n const t = (mid - val) / ((mid - min) || 1)\n return interpolateOpacity(colors[1] ?? '#ef4444', 0.15 + t * 0.85)\n }\n }\n // Sequential\n const t = (val - min) / range\n return interpolateOpacity(colors[0] ?? '#3b82f6', 0.08 + t * 0.9)\n}\n\nfunction getContrastColor(\n val: number, min: number, max: number, range: number, scale: string,\n): string {\n if (scale === 'diverging') {\n const mid = (min + max) / 2\n const t = Math.abs(val - mid) / ((max - min) / 2 || 1)\n return t > 0.5 ? '#ffffff' : '#1f2937'\n }\n const t = (val - min) / range\n return t > 0.55 ? '#ffffff' : '#1f2937'\n}\n\nfunction interpolateOpacity(baseColor: string, opacity: number): string {\n // For CSS var() colors, we use opacity approach\n // Return as rgba-compatible format\n const hex = baseColor.includes('#') ? baseColor : '#3b82f6'\n const r = parseInt(hex.slice(1, 3), 16) || 59\n const g = parseInt(hex.slice(3, 5), 16) || 130\n const b = parseInt(hex.slice(5, 7), 16) || 246\n return `rgba(${r},${g},${b},${opacity.toFixed(2)})`\n}\n"]}
1
+ {"version":3,"sources":["../src/charts/matrix/matrix-type.ts"],"names":["t"],"mappings":"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","file":"chunk-3NWZJCWL.js","sourcesContent":["import type {\n ChartTypePlugin, ChartData, ResolvedOptions, PreparedData,\n RenderContext, RenderNode, HitResult, ScaleType,\n} from '../../types'\nimport { prepareNoAxes } from '../../utils/prepare'\nimport { rect, text, group } from '../../render/tree'\n\n/**\n * Matrix chart — grid layout with color-coded cells.\n *\n * Data convention:\n * - labels: row/column names (for square matrices) or column names\n * - series[i].name: row name, series[i].values[j]: cell value at row i, col j\n *\n * Options:\n * - showValues: display values in cells (default true)\n * - cellRadius: border-radius for cells (default 2)\n * - colorScale: 'sequential' | 'diverging' (default 'sequential')\n * - minColor: color for minimum value\n * - maxColor: color for maximum value\n */\n\nexport interface MatrixOptions {\n showValues?: boolean\n cellRadius?: number\n colorScale?: 'sequential' | 'diverging'\n minColor?: string\n maxColor?: string\n}\n\nexport const matrixChartType: ChartTypePlugin = {\n type: 'matrix',\n\n getScaleTypes(): { x: ScaleType; y: ScaleType } {\n return { x: 'categorical', y: 'categorical' }\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 mOpts = options as unknown as MatrixOptions\n const showValues = mOpts.showValues !== false\n const cellRadius = mOpts.cellRadius ?? 2\n const colorScale = mOpts.colorScale ?? 'sequential'\n\n const rows = data.series.length\n const cols = data.labels.length\n if (rows === 0 || cols === 0) return nodes\n\n // Gather all values for color scale\n let allMin = Infinity, allMax = -Infinity\n for (const s of data.series) {\n for (const v of s.values) {\n if (v < allMin) allMin = v\n if (v > allMax) allMax = v\n }\n }\n if (!isFinite(allMin)) allMin = 0\n if (!isFinite(allMax)) allMax = 1\n const valRange = allMax - allMin || 1\n\n // Layout\n const labelPadLeft = 60\n const labelPadTop = 30\n const gap = 2\n const gridW = area.width - labelPadLeft - 10\n const gridH = area.height - labelPadTop - 10\n const cellW = (gridW - gap * (cols - 1)) / cols\n const cellH = (gridH - gap * (rows - 1)) / rows\n const gridX = area.x + labelPadLeft\n const gridY = area.y + labelPadTop\n\n // Column headers\n for (let c = 0; c < cols; c++) {\n const cx = gridX + c * (cellW + gap) + cellW / 2\n nodes.push(text(cx, gridY - 8, String(data.labels[c] ?? ''), {\n class: 'chartts-matrix-col-label',\n fill: theme.textMuted,\n textAnchor: 'middle',\n dominantBaseline: 'auto',\n fontSize: Math.min(theme.fontSizeSmall, cellW * 0.35),\n fontFamily: theme.fontFamily,\n }))\n }\n\n // Row labels + cells\n for (let r = 0; r < rows; r++) {\n const series = data.series[r]!\n const ry = gridY + r * (cellH + gap)\n\n // Row label\n nodes.push(text(gridX - 6, ry + cellH / 2, series.name, {\n class: 'chartts-matrix-row-label',\n fill: theme.textMuted,\n textAnchor: 'end',\n dominantBaseline: 'central',\n fontSize: Math.min(theme.fontSizeSmall, cellH * 0.4),\n fontFamily: theme.fontFamily,\n }))\n\n const rowNodes: RenderNode[] = []\n for (let c = 0; c < cols; c++) {\n const val = series.values[c] ?? 0\n const cx = gridX + c * (cellW + gap)\n\n // Color interpolation\n const color = getCellColor(val, allMin, allMax, valRange, colorScale, options.colors)\n const textColor = getContrastColor(val, allMin, allMax, valRange, colorScale)\n\n rowNodes.push(rect(cx, ry, cellW, cellH, {\n class: 'chartts-matrix-cell',\n fill: color,\n rx: cellRadius,\n ry: cellRadius,\n 'data-series': r,\n 'data-index': c,\n tabindex: 0,\n role: 'img',\n ariaLabel: `${series.name} × ${data.labels[c]}: ${val}`,\n }))\n\n // Value text\n if (showValues && cellW > 18 && cellH > 14) {\n const displayVal = Number.isInteger(val) ? String(val)\n : Math.abs(val) < 10 ? val.toFixed(2) : val.toFixed(1)\n\n rowNodes.push(text(cx + cellW / 2, ry + cellH / 2, displayVal, {\n class: 'chartts-matrix-value',\n fill: textColor,\n textAnchor: 'middle',\n dominantBaseline: 'central',\n fontSize: Math.min(theme.fontSizeSmall, cellW * 0.3, cellH * 0.4),\n fontFamily: theme.fontFamily,\n fontWeight: 600,\n pointerEvents: 'none',\n }))\n }\n }\n\n nodes.push(group(rowNodes, {\n class: `chartts-series chartts-series-${r}`,\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 } = ctx\n const rows = data.series.length\n const cols = data.labels.length\n if (rows === 0 || cols === 0) return null\n\n const labelPadLeft = 60\n const labelPadTop = 30\n const gap = 2\n const gridW = area.width - labelPadLeft - 10\n const gridH = area.height - labelPadTop - 10\n const cellW = (gridW - gap * (cols - 1)) / cols\n const cellH = (gridH - gap * (rows - 1)) / rows\n const gridX = area.x + labelPadLeft\n const gridY = area.y + labelPadTop\n\n const col = Math.floor((mx - gridX) / (cellW + gap))\n const row = Math.floor((my - gridY) / (cellH + gap))\n\n if (row >= 0 && row < rows && col >= 0 && col < cols) {\n return { seriesIndex: row, pointIndex: col, distance: 0 }\n }\n return null\n },\n}\n\n// ---------------------------------------------------------------------------\n// Color helpers\n// ---------------------------------------------------------------------------\n\nfunction getCellColor(\n val: number, min: number, max: number, range: number,\n scale: string, colors: readonly string[],\n): string {\n if (scale === 'diverging') {\n const mid = (min + max) / 2\n if (val >= mid) {\n const t = (val - mid) / ((max - mid) || 1)\n return interpolateOpacity(colors[0] ?? '#3b82f6', 0.15 + t * 0.85)\n } else {\n const t = (mid - val) / ((mid - min) || 1)\n return interpolateOpacity(colors[1] ?? '#ef4444', 0.15 + t * 0.85)\n }\n }\n // Sequential\n const t = (val - min) / range\n return interpolateOpacity(colors[0] ?? '#3b82f6', 0.08 + t * 0.9)\n}\n\nfunction getContrastColor(\n val: number, min: number, max: number, range: number, scale: string,\n): string {\n if (scale === 'diverging') {\n const mid = (min + max) / 2\n const t = Math.abs(val - mid) / ((max - min) / 2 || 1)\n return t > 0.5 ? '#ffffff' : '#1f2937'\n }\n const t = (val - min) / range\n return t > 0.55 ? '#ffffff' : '#1f2937'\n}\n\nfunction interpolateOpacity(baseColor: string, opacity: number): string {\n // For CSS var() colors, we use opacity approach\n // Return as rgba-compatible format\n const hex = baseColor.includes('#') ? baseColor : '#3b82f6'\n const r = parseInt(hex.slice(1, 3), 16) || 59\n const g = parseInt(hex.slice(3, 5), 16) || 130\n const b = parseInt(hex.slice(5, 7), 16) || 246\n return `rgba(${r},${g},${b},${opacity.toFixed(2)})`\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { prepareNoAxes } from './chunk-3XVGEBR4.js';
2
- import { PathBuilder, path, text } from './chunk-3BRQGYDX.js';
1
+ import { prepareNoAxes } from './chunk-GMLJDDHZ.js';
2
+ import { PathBuilder, path, text } from './chunk-BMTVFAX2.js';
3
3
 
4
4
  // src/charts/chord/chord-type.ts
5
5
  var chordChartType = {
@@ -214,5 +214,5 @@ function buildChordLayout(data, _options) {
214
214
  }
215
215
 
216
216
  export { chordChartType };
217
- //# sourceMappingURL=chunk-O5KGKQSU.js.map
218
- //# sourceMappingURL=chunk-O5KGKQSU.js.map
217
+ //# sourceMappingURL=chunk-3QXN7JBV.js.map
218
+ //# sourceMappingURL=chunk-3QXN7JBV.js.map