@banzamel/mineralui 1.2.0 → 1.3.0

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 (269) hide show
  1. package/README.md +1 -1
  2. package/dist/MAvatar-B4Y9P5ua.js +57 -0
  3. package/dist/MAvatar-B4Y9P5ua.js.map +1 -0
  4. package/dist/MAvatar-D4ZC9wml.cjs +2 -0
  5. package/dist/MAvatar-D4ZC9wml.cjs.map +1 -0
  6. package/dist/MBadge-BaeeIRhu.js +19 -0
  7. package/dist/MBadge-BaeeIRhu.js.map +1 -0
  8. package/dist/MBadge-DJuqtMP7.cjs +2 -0
  9. package/dist/MBadge-DJuqtMP7.cjs.map +1 -0
  10. package/dist/MButton-Rg85cgO1.cjs +2 -0
  11. package/dist/{MButton-B8rXmFX9.cjs.map → MButton-Rg85cgO1.cjs.map} +1 -1
  12. package/dist/MButton-pSNx-6UK.js +113 -0
  13. package/dist/{MButton-BmTDe5Oa.js.map → MButton-pSNx-6UK.js.map} +1 -1
  14. package/dist/{MDataTable-Cqwkiq7A.js → MDataTable-D5SnGm3D.js} +3 -3
  15. package/dist/{MDataTable-Cqwkiq7A.js.map → MDataTable-D5SnGm3D.js.map} +1 -1
  16. package/dist/{MDataTable-BI7wFZYN.cjs → MDataTable-_afEvx2S.cjs} +2 -2
  17. package/dist/{MDataTable-BI7wFZYN.cjs.map → MDataTable-_afEvx2S.cjs.map} +1 -1
  18. package/dist/{MDrawer-CSvjLrhB.cjs → MDrawer-2NDNRU77.cjs} +2 -2
  19. package/dist/{MDrawer-CSvjLrhB.cjs.map → MDrawer-2NDNRU77.cjs.map} +1 -1
  20. package/dist/{MDrawer-DXHtAckQ.js → MDrawer-CHvOVWPw.js} +2 -2
  21. package/dist/{MDrawer-DXHtAckQ.js.map → MDrawer-CHvOVWPw.js.map} +1 -1
  22. package/dist/MHeading-C5s-kb2D.js +21 -0
  23. package/dist/MHeading-C5s-kb2D.js.map +1 -0
  24. package/dist/MHeading-CvAYmqMN.cjs +2 -0
  25. package/dist/MHeading-CvAYmqMN.cjs.map +1 -0
  26. package/dist/MImage-DqAx0_B0.cjs +2 -0
  27. package/dist/MImage-DqAx0_B0.cjs.map +1 -0
  28. package/dist/MImage-F34N1nhB.js +53 -0
  29. package/dist/MImage-F34N1nhB.js.map +1 -0
  30. package/dist/MInline-BKY7arDg.js +41 -0
  31. package/dist/MInline-BKY7arDg.js.map +1 -0
  32. package/dist/MInline-FgdIt6kv.cjs +2 -0
  33. package/dist/MInline-FgdIt6kv.cjs.map +1 -0
  34. package/dist/{MInput-W7DJQ_ng.cjs → MInput-C_Prnehc.cjs} +2 -2
  35. package/dist/{MInput-W7DJQ_ng.cjs.map → MInput-C_Prnehc.cjs.map} +1 -1
  36. package/dist/{MInput-BSaKw0Uc.js → MInput-DI066RK9.js} +2 -2
  37. package/dist/{MInput-BSaKw0Uc.js.map → MInput-DI066RK9.js.map} +1 -1
  38. package/dist/{MInputCVC-DH_bjV5R.cjs → MInputCVC-B75iBIRt.cjs} +2 -2
  39. package/dist/{MInputCVC-DH_bjV5R.cjs.map → MInputCVC-B75iBIRt.cjs.map} +1 -1
  40. package/dist/{MInputCVC-Dqbl1zG9.js → MInputCVC-BlBZjRft.js} +2 -2
  41. package/dist/{MInputCVC-Dqbl1zG9.js.map → MInputCVC-BlBZjRft.js.map} +1 -1
  42. package/dist/{MInputSearch-C7betxTa.cjs → MInputSearch-BKQnKS-9.cjs} +2 -2
  43. package/dist/{MInputSearch-C7betxTa.cjs.map → MInputSearch-BKQnKS-9.cjs.map} +1 -1
  44. package/dist/{MInputSearch-CH5ZcjLq.js → MInputSearch-CBsBsuqu.js} +2 -2
  45. package/dist/{MInputSearch-CH5ZcjLq.js.map → MInputSearch-CBsBsuqu.js.map} +1 -1
  46. package/dist/MLink-BgYBHhce.js +31 -0
  47. package/dist/{MLink-ODytrwne.js.map → MLink-BgYBHhce.js.map} +1 -1
  48. package/dist/MLink-DmB3rcWB.cjs +2 -0
  49. package/dist/{MLink-DHryXq_D.cjs.map → MLink-DmB3rcWB.cjs.map} +1 -1
  50. package/dist/{MModal-pMcPs3pw.cjs → MModal-BaA098nr.cjs} +2 -2
  51. package/dist/{MModal-pMcPs3pw.cjs.map → MModal-BaA098nr.cjs.map} +1 -1
  52. package/dist/{MModal-DShADuLw.js → MModal-DXZ2SrJt.js} +2 -2
  53. package/dist/{MModal-DShADuLw.js.map → MModal-DXZ2SrJt.js.map} +1 -1
  54. package/dist/{MPagination-B7aho7rQ.js → MPagination-BFI_z3y6.js} +2 -2
  55. package/dist/{MPagination-B7aho7rQ.js.map → MPagination-BFI_z3y6.js.map} +1 -1
  56. package/dist/{MPagination-BWHAVgWN.cjs → MPagination-C6hnhbTp.cjs} +2 -2
  57. package/dist/{MPagination-BWHAVgWN.cjs.map → MPagination-C6hnhbTp.cjs.map} +1 -1
  58. package/dist/{MQrCode-6Cz9B7Qy.js → MQrCode-DfZwkhZV.js} +2 -2
  59. package/dist/{MQrCode-6Cz9B7Qy.js.map → MQrCode-DfZwkhZV.js.map} +1 -1
  60. package/dist/{MQrCode-Bp2CWpmX.cjs → MQrCode-L0trT6n3.cjs} +2 -2
  61. package/dist/{MQrCode-Bp2CWpmX.cjs.map → MQrCode-L0trT6n3.cjs.map} +1 -1
  62. package/dist/{MSkeleton-BfRBJ6ku.cjs → MSkeleton-BEdflu0F.cjs} +2 -2
  63. package/dist/{MSkeleton-BfRBJ6ku.cjs.map → MSkeleton-BEdflu0F.cjs.map} +1 -1
  64. package/dist/{MSkeleton-CauCfkzj.js → MSkeleton-DX9gJ311.js} +2 -2
  65. package/dist/{MSkeleton-CauCfkzj.js.map → MSkeleton-DX9gJ311.js.map} +1 -1
  66. package/dist/MStack-BgwBqm-V.cjs +2 -0
  67. package/dist/MStack-BgwBqm-V.cjs.map +1 -0
  68. package/dist/MStack-Dk0GNVBT.js +41 -0
  69. package/dist/MStack-Dk0GNVBT.js.map +1 -0
  70. package/dist/MSubText-D8VxE877.cjs +2 -0
  71. package/dist/MSubText-D8VxE877.cjs.map +1 -0
  72. package/dist/MSubText-DwNeDGYg.js +17 -0
  73. package/dist/MSubText-DwNeDGYg.js.map +1 -0
  74. package/dist/MSurface-CFbX5C63.cjs +2 -0
  75. package/dist/MSurface-CFbX5C63.cjs.map +1 -0
  76. package/dist/MSurface-COlEjDyo.js +41 -0
  77. package/dist/MSurface-COlEjDyo.js.map +1 -0
  78. package/dist/MTag-DZjcHYn0.cjs +2 -0
  79. package/dist/MTag-DZjcHYn0.cjs.map +1 -0
  80. package/dist/MTag-wsCYRndK.js +39 -0
  81. package/dist/MTag-wsCYRndK.js.map +1 -0
  82. package/dist/MText-CexZuJgV.js +45 -0
  83. package/dist/MText-CexZuJgV.js.map +1 -0
  84. package/dist/MText-YIBipYLh.cjs +2 -0
  85. package/dist/MText-YIBipYLh.cjs.map +1 -0
  86. package/dist/{cards-BE77zKTI.js → cards-BguCbFp7.js} +10 -10
  87. package/dist/{cards-BE77zKTI.js.map → cards-BguCbFp7.js.map} +1 -1
  88. package/dist/{cards-BINs-dmS.cjs → cards-DgOG2sWk.cjs} +2 -2
  89. package/dist/{cards-BINs-dmS.cjs.map → cards-DgOG2sWk.cjs.map} +1 -1
  90. package/dist/cards.cjs +1 -1
  91. package/dist/cards.js +2 -2
  92. package/dist/components/controls/MButton/MButton.types.d.ts +2 -2
  93. package/dist/components/feedback/MAlert/MAlert.d.ts +1 -1
  94. package/dist/components/feedback/MAlert/MAlert.types.d.ts +2 -2
  95. package/dist/components/feedback/MBadge/MBadge.d.ts +1 -1
  96. package/dist/components/feedback/MBadge/MBadge.types.d.ts +2 -2
  97. package/dist/components/feedback/MBanner/MBanner.d.ts +1 -1
  98. package/dist/components/feedback/MBanner/MBanner.types.d.ts +2 -2
  99. package/dist/components/feedback/MTag/MTag.d.ts +1 -1
  100. package/dist/components/feedback/MTag/MTag.types.d.ts +2 -2
  101. package/dist/components/layout/MContainer/MContainer.d.ts +1 -1
  102. package/dist/components/layout/MContainer/MContainer.types.d.ts +2 -1
  103. package/dist/components/layout/MDivider/MDivider.d.ts +1 -1
  104. package/dist/components/layout/MDivider/MDivider.types.d.ts +2 -1
  105. package/dist/components/layout/MFooter/MFooter.d.ts +1 -1
  106. package/dist/components/layout/MFooter/MFooter.types.d.ts +2 -1
  107. package/dist/components/layout/MGrid/MGrid.d.ts +2 -2
  108. package/dist/components/layout/MGrid/MGrid.types.d.ts +4 -2
  109. package/dist/components/layout/MHeader/MHeader.d.ts +1 -1
  110. package/dist/components/layout/MHeader/MHeader.types.d.ts +2 -1
  111. package/dist/components/layout/MInline/MInline.d.ts +1 -1
  112. package/dist/components/layout/MInline/MInline.types.d.ts +2 -1
  113. package/dist/components/layout/MNavbar/MNavbar.d.ts +1 -1
  114. package/dist/components/layout/MNavbar/MNavbar.types.d.ts +2 -1
  115. package/dist/components/layout/MNavs/index.d.ts +1 -1
  116. package/dist/components/layout/MSection/MSection.d.ts +1 -1
  117. package/dist/components/layout/MSection/MSection.types.d.ts +2 -1
  118. package/dist/components/layout/MStack/MStack.d.ts +1 -1
  119. package/dist/components/layout/MStack/MStack.types.d.ts +2 -1
  120. package/dist/components/layout/MSurface/MSurface.d.ts +1 -1
  121. package/dist/components/layout/MSurface/MSurface.types.d.ts +2 -1
  122. package/dist/components/layout/MTopbar/MTopbar.d.ts +1 -1
  123. package/dist/components/layout/MTopbar/MTopbar.types.d.ts +2 -2
  124. package/dist/components/media/MAvatar/MAvatar.d.ts +1 -1
  125. package/dist/components/media/MAvatar/MAvatar.types.d.ts +2 -2
  126. package/dist/components/media/MAvatarStack/MAvatarStack.d.ts +1 -1
  127. package/dist/components/media/MAvatarStack/MAvatarStack.types.d.ts +2 -2
  128. package/dist/components/media/MImage/MImage.d.ts +1 -1
  129. package/dist/components/media/MImage/MImage.types.d.ts +2 -1
  130. package/dist/components/typography/MHeading/MHeading.d.ts +563 -2
  131. package/dist/components/typography/MHeading/MHeading.types.d.ts +2 -2
  132. package/dist/components/typography/MLink/MLink.types.d.ts +2 -1
  133. package/dist/components/typography/MSubText/MSubText.d.ts +1 -1
  134. package/dist/components/typography/MSubText/MSubText.types.d.ts +2 -2
  135. package/dist/components/typography/MText/MText.d.ts +1 -1
  136. package/dist/components/typography/MText/MText.types.d.ts +2 -2
  137. package/dist/controls-CN5d1q6e.cjs +2 -0
  138. package/dist/{controls-DwL1-nVC.cjs.map → controls-CN5d1q6e.cjs.map} +1 -1
  139. package/dist/{controls-BMwQ3C1R.js → controls-CVdInuMI.js} +145 -143
  140. package/dist/{controls-BMwQ3C1R.js.map → controls-CVdInuMI.js.map} +1 -1
  141. package/dist/controls.cjs +1 -1
  142. package/dist/controls.js +2 -2
  143. package/dist/data-BZ3Uio4Z.cjs +2 -0
  144. package/dist/data-BZ3Uio4Z.cjs.map +1 -0
  145. package/dist/{data-s8Hkht1B.js → data-BpGAUxCL.js} +751 -750
  146. package/dist/data-BpGAUxCL.js.map +1 -0
  147. package/dist/data.cjs +1 -1
  148. package/dist/data.js +2 -2
  149. package/dist/{display-B0lpgApV.cjs → display-CCG1eb0m.cjs} +2 -2
  150. package/dist/{display-B0lpgApV.cjs.map → display-CCG1eb0m.cjs.map} +1 -1
  151. package/dist/{display-DuBRiEKr.js → display-gwrOWH2c.js} +3 -3
  152. package/dist/{display-DuBRiEKr.js.map → display-gwrOWH2c.js.map} +1 -1
  153. package/dist/display.cjs +1 -1
  154. package/dist/display.js +2 -2
  155. package/dist/{dropdowns-BcVrUMPE.js → dropdowns-CNKEy6vf.js} +4 -4
  156. package/dist/{dropdowns-BcVrUMPE.js.map → dropdowns-CNKEy6vf.js.map} +1 -1
  157. package/dist/{dropdowns-CK-oxd62.cjs → dropdowns-HY56LZkp.cjs} +2 -2
  158. package/dist/{dropdowns-CK-oxd62.cjs.map → dropdowns-HY56LZkp.cjs.map} +1 -1
  159. package/dist/dropdowns.cjs +1 -1
  160. package/dist/dropdowns.js +1 -1
  161. package/dist/{feedback-D3LLKNlY.js → feedback-BfSdnvUS.js} +304 -301
  162. package/dist/feedback-BfSdnvUS.js.map +1 -0
  163. package/dist/feedback-DkQNQVdK.cjs +2 -0
  164. package/dist/feedback-DkQNQVdK.cjs.map +1 -0
  165. package/dist/feedback.cjs +1 -1
  166. package/dist/feedback.js +5 -5
  167. package/dist/index.cjs +1 -1
  168. package/dist/index.js +59 -59
  169. package/dist/{inputs-bCxSLz-U.js → inputs-BO7bjvyf.js} +3 -3
  170. package/dist/{inputs-bCxSLz-U.js.map → inputs-BO7bjvyf.js.map} +1 -1
  171. package/dist/{inputs-Dcj6C_Fn.cjs → inputs-vov7Kj6q.cjs} +2 -2
  172. package/dist/{inputs-Dcj6C_Fn.cjs.map → inputs-vov7Kj6q.cjs.map} +1 -1
  173. package/dist/inputs.cjs +1 -1
  174. package/dist/inputs.js +4 -4
  175. package/dist/layout-BvKpFxol.js +905 -0
  176. package/dist/layout-BvKpFxol.js.map +1 -0
  177. package/dist/layout-TFV-1uoQ.cjs +2 -0
  178. package/dist/layout-TFV-1uoQ.cjs.map +1 -0
  179. package/dist/layout.cjs +1 -1
  180. package/dist/layout.js +5 -5
  181. package/dist/media-BhRjHzpA.cjs +2 -0
  182. package/dist/{media-D5YGOTm7.cjs.map → media-BhRjHzpA.cjs.map} +1 -1
  183. package/dist/{media-8aMOtckF.js → media-BuIEAgV-.js} +145 -143
  184. package/dist/{media-8aMOtckF.js.map → media-BuIEAgV-.js.map} +1 -1
  185. package/dist/media.cjs +1 -1
  186. package/dist/media.js +3 -3
  187. package/dist/{overlays-DCj-oV2H.cjs → overlays-CjEh_HWn.cjs} +2 -2
  188. package/dist/{overlays-DCj-oV2H.cjs.map → overlays-CjEh_HWn.cjs.map} +1 -1
  189. package/dist/{overlays-gjg00CAf.js → overlays-D1SAF1F_.js} +3 -3
  190. package/dist/{overlays-gjg00CAf.js.map → overlays-D1SAF1F_.js.map} +1 -1
  191. package/dist/overlays.cjs +1 -1
  192. package/dist/overlays.js +3 -3
  193. package/dist/style-runtime.cjs +1 -1
  194. package/dist/style-runtime.js +1 -1
  195. package/dist/styles.css +1 -1
  196. package/dist/theme/MTheme.types.d.ts +5 -0
  197. package/dist/theme/index.d.ts +2 -1
  198. package/dist/theme/responsive.d.ts +18 -0
  199. package/dist/{theme-DLorpkJc.cjs → theme-CyIOdO9W.cjs} +2 -2
  200. package/dist/theme-CyIOdO9W.cjs.map +1 -0
  201. package/dist/{theme-BV4qkzZU.js → theme-Dl4EpdnW.js} +14 -2
  202. package/dist/theme-Dl4EpdnW.js.map +1 -0
  203. package/dist/theme.cjs +1 -1
  204. package/dist/theme.js +2 -2
  205. package/dist/{typography-DKdr1Tds.js → typography-BrIbvz08.js} +2 -2
  206. package/dist/{typography-DKdr1Tds.js.map → typography-BrIbvz08.js.map} +1 -1
  207. package/dist/{typography-qbFGv1gA.cjs → typography-DHjL4YTH.cjs} +2 -2
  208. package/dist/{typography-qbFGv1gA.cjs.map → typography-DHjL4YTH.cjs.map} +1 -1
  209. package/dist/typography.cjs +1 -1
  210. package/dist/typography.js +5 -5
  211. package/package.json +1 -1
  212. package/dist/MAvatar-BoO51a6m.js +0 -55
  213. package/dist/MAvatar-BoO51a6m.js.map +0 -1
  214. package/dist/MAvatar-DJKtca9j.cjs +0 -2
  215. package/dist/MAvatar-DJKtca9j.cjs.map +0 -1
  216. package/dist/MBadge-CexVV675.cjs +0 -2
  217. package/dist/MBadge-CexVV675.cjs.map +0 -1
  218. package/dist/MBadge-Y1JnZiIC.js +0 -17
  219. package/dist/MBadge-Y1JnZiIC.js.map +0 -1
  220. package/dist/MButton-B8rXmFX9.cjs +0 -2
  221. package/dist/MButton-BmTDe5Oa.js +0 -111
  222. package/dist/MHeading-C3IgV22T.js +0 -19
  223. package/dist/MHeading-C3IgV22T.js.map +0 -1
  224. package/dist/MHeading-DqvWKia1.cjs +0 -2
  225. package/dist/MHeading-DqvWKia1.cjs.map +0 -1
  226. package/dist/MImage-BDcrV6IC.js +0 -49
  227. package/dist/MImage-BDcrV6IC.js.map +0 -1
  228. package/dist/MImage-BsQJ_eYf.cjs +0 -2
  229. package/dist/MImage-BsQJ_eYf.cjs.map +0 -1
  230. package/dist/MInline-BAhu2zT-.cjs +0 -2
  231. package/dist/MInline-BAhu2zT-.cjs.map +0 -1
  232. package/dist/MInline-Dfy3Lrjs.js +0 -39
  233. package/dist/MInline-Dfy3Lrjs.js.map +0 -1
  234. package/dist/MLink-DHryXq_D.cjs +0 -2
  235. package/dist/MLink-ODytrwne.js +0 -29
  236. package/dist/MStack-Cifiqeb2.js +0 -39
  237. package/dist/MStack-Cifiqeb2.js.map +0 -1
  238. package/dist/MStack-lrvy7l3w.cjs +0 -2
  239. package/dist/MStack-lrvy7l3w.cjs.map +0 -1
  240. package/dist/MSubText-78oYdJQy.cjs +0 -2
  241. package/dist/MSubText-78oYdJQy.cjs.map +0 -1
  242. package/dist/MSubText-C2oxXwKT.js +0 -15
  243. package/dist/MSubText-C2oxXwKT.js.map +0 -1
  244. package/dist/MSurface-B1LXFczo.js +0 -39
  245. package/dist/MSurface-B1LXFczo.js.map +0 -1
  246. package/dist/MSurface-BgZ86iYn.cjs +0 -2
  247. package/dist/MSurface-BgZ86iYn.cjs.map +0 -1
  248. package/dist/MTag-C4_rBj4b.cjs +0 -2
  249. package/dist/MTag-C4_rBj4b.cjs.map +0 -1
  250. package/dist/MTag-DOcKm3c2.js +0 -37
  251. package/dist/MTag-DOcKm3c2.js.map +0 -1
  252. package/dist/MText-CxSZ2md0.cjs +0 -2
  253. package/dist/MText-CxSZ2md0.cjs.map +0 -1
  254. package/dist/MText-DX9O7gh7.js +0 -43
  255. package/dist/MText-DX9O7gh7.js.map +0 -1
  256. package/dist/controls-DwL1-nVC.cjs +0 -2
  257. package/dist/data-BESfox0z.cjs +0 -2
  258. package/dist/data-BESfox0z.cjs.map +0 -1
  259. package/dist/data-s8Hkht1B.js.map +0 -1
  260. package/dist/feedback-D3LLKNlY.js.map +0 -1
  261. package/dist/feedback-DYjg0Dbp.cjs +0 -2
  262. package/dist/feedback-DYjg0Dbp.cjs.map +0 -1
  263. package/dist/layout-Cb94o3oU.js +0 -891
  264. package/dist/layout-Cb94o3oU.js.map +0 -1
  265. package/dist/layout-DgfsQ-Tn.cjs +0 -2
  266. package/dist/layout-DgfsQ-Tn.cjs.map +0 -1
  267. package/dist/media-D5YGOTm7.cjs +0 -2
  268. package/dist/theme-BV4qkzZU.js.map +0 -1
  269. package/dist/theme-DLorpkJc.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-BZ3Uio4Z.cjs","names":[],"sources":["../src/components/data/MChat/MChatContext.ts","../src/components/data/MChat/MChat.tsx","../src/components/data/MChat/MChatHeader.tsx","../src/components/data/MChat/MChatMessage.tsx","../src/components/data/MChat/MChatBody.tsx","../src/components/data/MChat/emojis.ts","../src/components/data/MChat/MChatInput.tsx","../src/components/data/MChat/MChatTypingIndicator.tsx","../src/components/data/MChat/MChatConversationList.tsx","../src/components/data/MChat/MChatConversationItem.tsx","../src/components/data/MTreeView/MTreeView.tsx","../src/components/data/MTaskList/MTaskList.tsx","../src/components/data/MFileManager/MFileManager.tsx","../src/components/data/MCalendarBoard/MCalendarBoard.tsx","../src/components/data/MChart/MChart.types.ts","../src/components/data/MChart/utils/formats.ts","../src/components/data/MChart/parts/ChartGrid.tsx","../src/components/data/MChart/parts/ChartAxis.tsx","../src/components/data/MChart/charts/MLineChart.tsx","../src/components/data/MChart/charts/MBarChart.tsx","../src/components/data/MChart/charts/MAreaChart.tsx","../src/components/data/MChart/charts/MPieChart.tsx","../src/components/data/MChart/parts/ChartDefs.tsx","../src/components/data/MChart/parts/ChartTooltip.tsx","../src/components/data/MChart/parts/ChartLegend.tsx","../src/components/data/MChart/MChart.tsx","../src/components/data/MChart/MLineChart.tsx","../src/components/data/MChart/MBarChart.tsx","../src/components/data/MChart/MAreaChart.tsx","../src/components/data/MChart/MPieChart.tsx"],"sourcesContent":["import {createContext, useContext} from 'react'\nimport type {MColor} from '../../../theme'\n\nexport interface MChatContextValue {\n color?: MColor\n}\n\nexport const MChatContext = createContext<MChatContextValue>({})\n\nexport function useMChatContext() {\n return useContext(MChatContext)\n}\n","import {Children, isValidElement, useMemo} from 'react'\nimport type {ReactNode} from 'react'\nimport type {MChatProps} from './MChat.types'\nimport {MChatContext} from './MChatContext'\nimport {MPortal} from '../../primitives'\nimport {MButton} from '../../controls'\nimport {MChatIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport './MChat.css'\n\nfunction isChatSlot(child: ReactNode, flag: string): boolean {\n return isValidElement(child) && !!(child.type as any)[flag]\n}\n\nexport function MChat({\n variant = 'inline',\n open,\n onToggle,\n unreadCount,\n color = 'primary',\n className,\n children,\n ...rest\n}: MChatProps) {\n let header: ReactNode = null\n let conversationList: ReactNode = null\n const body: ReactNode[] = []\n\n Children.forEach(children, (child) => {\n if (isChatSlot(child, '__chatHeader')) {\n header = child\n return\n }\n if (isChatSlot(child, '__chatConversationList')) {\n conversationList = child\n return\n }\n body.push(child)\n })\n\n const ctx = useMemo(() => ({color}), [color])\n\n const chatContent = (\n <MChatContext.Provider value={ctx}>\n <div\n className={cn('chat', variant, `color-${color}`, variant === 'floating' && open && 'open', className)}\n {...rest}\n >\n {conversationList && <div className=\"chat-sidebar\">{conversationList}</div>}\n <div className=\"chat-main\">\n {header}\n {body}\n </div>\n </div>\n </MChatContext.Provider>\n )\n\n if (variant === 'floating') {\n return (\n <MPortal>\n <div className={cn('chat-floating-wrapper', open && 'open')}>\n {open && chatContent}\n <MButton\n variant=\"filled\"\n color={color}\n shape=\"circle\"\n size=\"lg\"\n className=\"chat-floating-trigger\"\n onClick={onToggle}\n aria-label={open ? 'Close chat' : 'Open chat'}\n badge={!open && unreadCount ? unreadCount : undefined}\n badgeColor=\"error\"\n badgePulsing={!open && !!unreadCount}\n >\n <MChatIcon />\n </MButton>\n </div>\n </MPortal>\n )\n }\n\n return chatContent\n}\n","import type {MChatHeaderProps} from './MChat.types'\nimport {cn} from '../../../utils/cn'\n\nexport function MChatHeader({bordered = false, className, children, ...rest}: MChatHeaderProps) {\n return (\n <div className={cn('chat-header', bordered && 'bordered', className)} {...rest}>\n {children}\n </div>\n )\n}\n;(MChatHeader as any).__chatHeader = true\n","import type {MChatMessageProps} from './MChat.types'\nimport {MAvatar} from '../../media'\nimport {MImage} from '../../media'\nimport {MText, MSubText} from '../../typography'\nimport {MTimeAgo} from '../../display'\nimport {cn} from '../../../utils/cn'\n\nfunction StatusIcon({status}: {status?: string}) {\n if (!status) return null\n\n const double = status === 'delivered' || status === 'read'\n const colorClass = status === 'read' ? 'chat-status-read' : ''\n\n return (\n <span className={cn('chat-status', colorClass)} aria-label={status}>\n {double ? '✓✓' : '✓'}\n </span>\n )\n}\n\nexport function MChatMessage({\n message,\n showAvatar = true,\n showTimestamp = true,\n color,\n className,\n ...rest\n}: MChatMessageProps) {\n const {content, sender, timestamp, status, isOwn, images} = message\n const colorClass = color ? color : undefined\n\n return (\n <div className={cn('chat-message', isOwn && 'own', colorClass, className)} {...rest}>\n {showAvatar && !isOwn && (\n <MAvatar\n src={sender.avatar}\n name={sender.name}\n size=\"sm\"\n color={color}\n className=\"chat-message-avatar\"\n />\n )}\n <div className=\"chat-message-content\">\n {!isOwn && (\n <MText className=\"chat-message-sender\" color=\"neutral\">\n {sender.name}\n </MText>\n )}\n <div className=\"chat-message-bubble\">\n {content && <MText>{content}</MText>}\n {images && images.length > 0 && (\n <div className={cn('chat-message-images', images.length > 1 && 'grid')}>\n {images.map((src, i) => (\n <MImage key={i} src={src} alt=\"\" fit=\"cover\" rounded className=\"chat-message-image\" />\n ))}\n </div>\n )}\n </div>\n <div className=\"chat-message-meta\">\n {isOwn && <StatusIcon status={status} />}\n {showTimestamp && (\n <MSubText className=\"chat-message-time\">\n <MTimeAgo value={timestamp} />\n </MSubText>\n )}\n </div>\n </div>\n </div>\n )\n}\n","import {useRef, useEffect, useCallback} from 'react'\nimport type {MChatBodyProps} from './MChat.types'\nimport {useMChatContext} from './MChatContext'\nimport {MChatMessage} from './MChatMessage'\nimport {MSpinner} from '../../feedback'\nimport {cn} from '../../../utils/cn'\n\nexport function MChatBody({\n messages,\n onScrollTop,\n loading = false,\n color: colorProp,\n className,\n children,\n ...rest\n}: MChatBodyProps) {\n const {color: ctxColor} = useMChatContext()\n const color = colorProp ?? ctxColor\n\n const containerRef = useRef<HTMLDivElement>(null)\n const stickToBottom = useRef(true)\n const prevMessageCount = useRef(0)\n\n const scrollToBottom = useCallback(() => {\n const el = containerRef.current\n if (el) el.scrollTop = el.scrollHeight\n }, [])\n\n useEffect(() => {\n const count = messages?.length ?? 0\n if (count > prevMessageCount.current && stickToBottom.current) {\n scrollToBottom()\n }\n prevMessageCount.current = count\n }, [messages?.length, scrollToBottom])\n\n useEffect(() => {\n scrollToBottom()\n }, [scrollToBottom])\n\n const handleScroll = () => {\n const el = containerRef.current\n if (!el) return\n\n const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 40\n stickToBottom.current = atBottom\n\n if (el.scrollTop < 40 && onScrollTop && !loading) {\n onScrollTop()\n }\n }\n\n return (\n <div ref={containerRef} className={cn('chat-body', className)} onScroll={handleScroll} {...rest}>\n {loading && (\n <div className=\"chat-body-loader\">\n <MSpinner size=\"sm\" />\n </div>\n )}\n {messages?.map((msg) => (\n <MChatMessage key={msg.id} message={msg} color={color} />\n ))}\n {children}\n </div>\n )\n}\n","import type {MChatEmojiCategory} from './MChat.types'\n\nexport const chatEmojiCategories: MChatEmojiCategory[] = [\n {\n label: 'Smileys',\n emojis: [\n '😀',\n '😃',\n '😄',\n '😁',\n '😆',\n '😅',\n '🤣',\n '😂',\n '🙂',\n '😊',\n '😇',\n '🥰',\n '😍',\n '🤩',\n '😘',\n '😗',\n '😋',\n '😛',\n '😜',\n '🤪',\n '😝',\n '🤗',\n '🤔',\n '🫡',\n '🤐',\n '🤨',\n '😐',\n '😑',\n '😶',\n '🫠',\n '😏',\n '😒',\n '🙄',\n '😬',\n '😮‍💨',\n '🤥',\n '😌',\n '😔',\n '😪',\n '🤤',\n '😴',\n '😷',\n '🤒',\n '🤕',\n '🤢',\n '🤮',\n '🤧',\n '🥵',\n '🥶',\n '😵',\n '🤯',\n '🥳',\n '🥸',\n '😎',\n '🤓',\n '🧐',\n ],\n },\n {\n label: 'Gestures',\n emojis: [\n '👋',\n '🤚',\n '🖐️',\n '✋',\n '🖖',\n '🫱',\n '🫲',\n '👌',\n '🤌',\n '🤏',\n '✌️',\n '🤞',\n '🫰',\n '🤟',\n '🤘',\n '🤙',\n '👈',\n '👉',\n '👆',\n '👇',\n '☝️',\n '👍',\n '👎',\n '✊',\n '👊',\n '🤛',\n '🤜',\n '👏',\n '🙌',\n '🫶',\n '👐',\n '🤝',\n ],\n },\n {\n label: 'Hearts',\n emojis: [\n '❤️',\n '🧡',\n '💛',\n '💚',\n '💙',\n '💜',\n '🖤',\n '🤍',\n '🤎',\n '💔',\n '❤️‍🔥',\n '❤️‍🩹',\n '💕',\n '💞',\n '💓',\n '💗',\n '💖',\n '💘',\n '💝',\n '💟',\n ],\n },\n {\n label: 'Objects',\n emojis: [\n '🔥',\n '✨',\n '🌟',\n '💫',\n '⚡',\n '💥',\n '🎉',\n '🎊',\n '🏆',\n '🥇',\n '🎯',\n '💡',\n '📌',\n '📎',\n '✅',\n '❌',\n '⭐',\n '💬',\n '👁️‍🗨️',\n '🔔',\n ],\n },\n]\n","import {useState, useRef, useCallback, useEffect} from 'react'\nimport type {KeyboardEvent, DragEvent} from 'react'\nimport type {MChatInputProps} from './MChat.types'\nimport {useMChatContext} from './MChatContext'\nimport {MButton} from '../../controls'\nimport {MImage} from '../../media'\nimport {MPopover} from '../../primitives'\nimport {MAttachIcon, MCloseIcon, MSendIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport {chatEmojiCategories} from './emojis'\n\nconst ACCEPT_IMAGES = 'image/png,image/jpeg,image/gif,image/webp'\n\nexport function MChatInput({\n onSend,\n placeholder = 'Type a message…',\n disabled = false,\n showEmoji = true,\n showAttach = true,\n onTyping,\n color: colorProp,\n className,\n ...rest\n}: MChatInputProps) {\n const {color: ctxColor} = useMChatContext()\n const color = colorProp ?? ctxColor\n const [value, setValue] = useState('')\n const [emojiOpen, setEmojiOpen] = useState(false)\n const [attachedFiles, setAttachedFiles] = useState<File[]>([])\n const [previews, setPreviews] = useState<string[]>([])\n const [dragOver, setDragOver] = useState(false)\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const emojiButtonRef = useRef<HTMLButtonElement>(null)\n const fileInputRef = useRef<HTMLInputElement>(null)\n const typingRef = useRef(false)\n const typingTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n\n const addFiles = useCallback((files: File[]) => {\n const imageFiles = files.filter((f) => f.type.startsWith('image/'))\n if (imageFiles.length === 0) return\n\n setAttachedFiles((prev) => [...prev, ...imageFiles])\n\n imageFiles.forEach((file) => {\n const url = URL.createObjectURL(file)\n setPreviews((prev) => [...prev, url])\n })\n }, [])\n\n const removeFile = useCallback((index: number) => {\n setPreviews((prev) => {\n URL.revokeObjectURL(prev[index])\n return prev.filter((_, i) => i !== index)\n })\n setAttachedFiles((prev) => prev.filter((_, i) => i !== index))\n }, [])\n\n useEffect(() => {\n return () => previews.forEach((url) => URL.revokeObjectURL(url))\n }, [])\n\n const send = useCallback(() => {\n const trimmed = value.trim()\n if (!trimmed && attachedFiles.length === 0) return\n if (disabled) return\n\n onSend?.(trimmed, attachedFiles.length > 0 ? attachedFiles : undefined)\n setValue('')\n setAttachedFiles([])\n setPreviews((prev) => {\n prev.forEach((url) => URL.revokeObjectURL(url))\n return []\n })\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto'\n }\n if (typingRef.current) {\n typingRef.current = false\n onTyping?.(false)\n }\n }, [value, attachedFiles, disabled, onSend, onTyping])\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n send()\n }\n }\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setValue(e.target.value)\n autoResize(e.target)\n\n if (onTyping) {\n if (!typingRef.current) {\n typingRef.current = true\n onTyping(true)\n }\n clearTimeout(typingTimerRef.current)\n typingTimerRef.current = setTimeout(() => {\n typingRef.current = false\n onTyping(false)\n }, 1500)\n }\n }\n\n const autoResize = (el: HTMLTextAreaElement) => {\n el.style.height = 'auto'\n el.style.height = Math.min(el.scrollHeight, 120) + 'px'\n }\n\n useEffect(() => {\n return () => clearTimeout(typingTimerRef.current)\n }, [])\n\n const insertEmoji = (emoji: string) => {\n setValue((prev) => prev + emoji)\n setEmojiOpen(false)\n textareaRef.current?.focus()\n }\n\n const handleDragOver = (e: DragEvent) => {\n e.preventDefault()\n setDragOver(true)\n }\n\n const handleDragLeave = (e: DragEvent) => {\n e.preventDefault()\n setDragOver(false)\n }\n\n const handleDrop = (e: DragEvent) => {\n e.preventDefault()\n setDragOver(false)\n const files = Array.from(e.dataTransfer.files)\n addFiles(files)\n }\n\n const handleFileSelect = () => {\n const files = fileInputRef.current?.files\n if (files) addFiles(Array.from(files))\n if (fileInputRef.current) fileInputRef.current.value = ''\n }\n\n const canSend = value.trim() || attachedFiles.length > 0\n\n return (\n <div\n className={cn('chat-input', dragOver && 'drag-over', className)}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n {...rest}\n >\n {previews.length > 0 && (\n <div className=\"chat-input-previews\">\n {previews.map((src, i) => (\n <div key={i} className=\"chat-input-preview\">\n <MImage src={src} alt=\"\" fit=\"cover\" rounded className=\"chat-input-preview-img\" />\n <button\n type=\"button\"\n className=\"chat-input-preview-remove\"\n onClick={() => removeFile(i)}\n aria-label=\"Remove image\"\n >\n <MCloseIcon />\n </button>\n </div>\n ))}\n </div>\n )}\n <div className=\"chat-input-field\">\n {showEmoji && (\n <>\n <button\n ref={emojiButtonRef}\n type=\"button\"\n className=\"chat-input-emoji-trigger\"\n onClick={() => setEmojiOpen((o) => !o)}\n aria-label=\"Emoji\"\n disabled={disabled}\n >\n 😊\n </button>\n <MPopover\n open={emojiOpen}\n anchorRef={emojiButtonRef as React.RefObject<HTMLElement>}\n onClose={() => setEmojiOpen(false)}\n placement=\"top-start\"\n >\n <div className=\"chat-emoji-picker\">\n {chatEmojiCategories.map((cat) => (\n <div key={cat.label} className=\"chat-emoji-category\">\n <div className=\"chat-emoji-category-label\">{cat.label}</div>\n <div className=\"chat-emoji-grid\">\n {cat.emojis.map((emoji) => (\n <button\n key={emoji}\n type=\"button\"\n className=\"chat-emoji-btn\"\n onClick={() => insertEmoji(emoji)}\n >\n {emoji}\n </button>\n ))}\n </div>\n </div>\n ))}\n </div>\n </MPopover>\n </>\n )}\n {showAttach && (\n <>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={ACCEPT_IMAGES}\n multiple\n className=\"chat-input-file-hidden\"\n onChange={handleFileSelect}\n tabIndex={-1}\n />\n <button\n type=\"button\"\n className=\"chat-input-attach-trigger\"\n onClick={() => fileInputRef.current?.click()}\n aria-label=\"Attach image\"\n disabled={disabled}\n >\n <MAttachIcon color=\"inherit\" />\n </button>\n </>\n )}\n <textarea\n ref={textareaRef}\n className=\"chat-input-textarea\"\n value={value}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n rows={1}\n />\n <MButton\n variant=\"filled\"\n size=\"sm\"\n color={color ?? 'primary'}\n iconOnly\n shape=\"circle\"\n className=\"chat-input-send\"\n onClick={send}\n disabled={disabled || !canSend}\n aria-label=\"Send\"\n >\n <MSendIcon />\n </MButton>\n </div>\n </div>\n )\n}\n","import type {MChatTypingIndicatorProps} from './MChat.types'\nimport {MAvatar} from '../../media'\nimport {cn} from '../../../utils/cn'\n\nexport function MChatTypingIndicator({users = [], visible = true, className, ...rest}: MChatTypingIndicatorProps) {\n if (!visible || users.length === 0) return null\n\n const label =\n users.length === 1\n ? `${users[0].name} is typing`\n : users.length === 2\n ? `${users[0].name} and ${users[1].name} are typing`\n : `${users[0].name} and ${users.length - 1} others are typing`\n\n return (\n <div className={cn('chat-typing', className)} aria-label={label} {...rest}>\n {users.length === 1 && (\n <MAvatar src={users[0].avatar} name={users[0].name} size=\"sm\" className=\"chat-typing-avatar\" />\n )}\n <div className=\"chat-typing-dots\">\n <span className=\"chat-typing-dot\" />\n <span className=\"chat-typing-dot\" />\n <span className=\"chat-typing-dot\" />\n </div>\n </div>\n )\n}\n","import type {MChatConversationListProps} from './MChat.types'\nimport {cn} from '../../../utils/cn'\n\nexport function MChatConversationList({className, children, ...rest}: MChatConversationListProps) {\n return (\n <div className={cn('chat-conversation-list', className)} {...rest}>\n {children}\n </div>\n )\n}\n;(MChatConversationList as any).__chatConversationList = true\n","import type {MChatConversationItemProps} from './MChat.types'\nimport {useMChatContext} from './MChatContext'\nimport {MAvatar} from '../../media'\nimport {MText, MSubText} from '../../typography'\nimport {MBadge} from '../../feedback'\nimport {MTimeAgo} from '../../display'\nimport {cn} from '../../../utils/cn'\n\nexport function MChatConversationItem({\n conversation,\n active = false,\n color: colorProp,\n onClick,\n className,\n ...rest\n}: MChatConversationItemProps) {\n const {color: ctxColor} = useMChatContext()\n const color = colorProp ?? ctxColor\n const {title, participants, lastMessage, unreadCount} = conversation\n const displayName = title ?? participants.map((p) => p.name).join(', ')\n const firstParticipant = participants[0]\n const hasOnline = participants.some((p) => p.online)\n\n return (\n <div\n className={cn('chat-conversation-item', active && 'active', className)}\n onClick={() => onClick?.(conversation)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onClick?.(conversation)\n }\n }}\n {...rest}\n >\n <MAvatar\n src={firstParticipant?.avatar}\n name={firstParticipant?.name}\n size=\"md\"\n color={color}\n badge={hasOnline}\n badgeColor=\"success\"\n className=\"chat-conversation-avatar\"\n />\n <div className=\"chat-conversation-info\">\n <div className=\"chat-conversation-top\">\n <MText className=\"chat-conversation-name\">{displayName}</MText>\n {lastMessage && (\n <MSubText className=\"chat-conversation-time\">\n <MTimeAgo value={lastMessage.timestamp} />\n </MSubText>\n )}\n </div>\n {lastMessage && (\n <div className=\"chat-conversation-bottom\">\n <MSubText className=\"chat-conversation-preview\">\n {lastMessage.isOwn ? 'You: ' : ''}\n {lastMessage.content}\n </MSubText>\n {!!unreadCount && unreadCount > 0 && (\n <MBadge color={color ?? 'primary'} size=\"sm\" rounded>\n {unreadCount}\n </MBadge>\n )}\n </div>\n )}\n </div>\n </div>\n )\n}\n","import {useEffect, useRef, useState} from 'react'\nimport type {CSSProperties, DragEvent, MouseEvent, ReactNode} from 'react'\nimport type {\n MTreeViewProps,\n MTreeItemProps,\n MTreeNode,\n MTreeViewContextMenuItem,\n MTreeViewMoveEvent,\n} from './MTreeView.types'\nimport {cn} from '../../../utils/cn'\nimport {MPortal} from '../../primitives'\nimport {\n MChevronRightIcon,\n MFileCodeIcon,\n MFileCsvIcon,\n MFileCssIcon,\n MFileExeIcon,\n MFileGifIcon,\n MFileHtmlIcon,\n MFileIcon,\n MFileImageIcon,\n MFileJpgIcon,\n MFileJsIcon,\n MFileJsonIcon,\n MFileMdIcon,\n MFileMp3Icon,\n MFileMp4Icon,\n MFileOdtIcon,\n MFilePdfIcon,\n MFilePhpIcon,\n MFilePngIcon,\n MFilePptIcon,\n MFileRarIcon,\n MFileSvgIcon,\n MFileTextIcon,\n MFileTsIcon,\n MFileTsxIcon,\n MFileTxtIcon,\n MFileWebpIcon,\n MFileXlsIcon,\n MFileXmlIcon,\n MFileZipIcon,\n MFolderIcon,\n MFolderOpenIcon,\n} from '../../../icons'\nimport './MTreeView.css'\nconst fileTypeMap: Record<string, ReactNode> = {\n pdf: <MFilePdfIcon />,\n ts: <MFileTsIcon />,\n tsx: <MFileTsxIcon />,\n js: <MFileJsIcon />,\n jsx: <MFileCodeIcon />,\n css: <MFileCssIcon />,\n scss: <MFileCssIcon />,\n html: <MFileHtmlIcon />,\n json: <MFileJsonIcon />,\n md: <MFileMdIcon />,\n txt: <MFileTxtIcon />,\n csv: <MFileCsvIcon />,\n zip: <MFileZipIcon />,\n rar: <MFileRarIcon />,\n svg: <MFileSvgIcon />,\n png: <MFilePngIcon />,\n jpg: <MFileJpgIcon />,\n jpeg: <MFileImageIcon />,\n gif: <MFileGifIcon />,\n webp: <MFileWebpIcon />,\n php: <MFilePhpIcon />,\n xml: <MFileXmlIcon />,\n xls: <MFileXlsIcon />,\n ppt: <MFilePptIcon />,\n odt: <MFileOdtIcon />,\n exe: <MFileExeIcon />,\n mp3: <MFileMp3Icon />,\n mp4: <MFileMp4Icon />,\n}\n\n// Read the file extension once so icon logic stays predictable.\nfunction getFileExtension(label: string): string | null {\n const dot = label.lastIndexOf('.')\n if (dot < 1) return null\n return label.slice(dot + 1).toLowerCase()\n}\n\n// Treat explicit folders and nodes with children as directory-like.\nfunction isFolderNode(node: MTreeNode) {\n return node.kind === 'folder' || Boolean(node.children?.length)\n}\n\n// Resolve the proper file icon by extension.\nfunction getFileIcon(label: string): ReactNode {\n const ext = getFileExtension(label)\n if (!ext) return <MFileIcon />\n\n return fileTypeMap[ext] ?? <MFileTextIcon />\n}\n\n// Prefer custom icons first, then fall back to folder or file visuals.\nfunction getDefaultIcon(node: MTreeNode, isExpanded: boolean, fileIcons: boolean) {\n if (node.icon) return node.icon\n if (!fileIcons) return null\n\n if (isFolderNode(node)) return isExpanded ? <MFolderOpenIcon /> : <MFolderIcon />\n\n return getFileIcon(node.label)\n}\n\n// Cache nodes and descendants so drag-drop validation stays fast.\nfunction buildTreeLookup(items: MTreeNode[]) {\n const nodeMap = new Map<string, MTreeNode>()\n const descendants = new Map<string, Set<string>>()\n\n function walk(node: MTreeNode) {\n nodeMap.set(node.id, node)\n\n const childIds = new Set<string>()\n\n for (const child of node.children ?? []) {\n childIds.add(child.id)\n\n const nestedIds = walk(child)\n nestedIds.forEach((id) => childIds.add(id))\n }\n\n descendants.set(node.id, childIds)\n return childIds\n }\n\n items.forEach(walk)\n\n return {nodeMap, descendants}\n}\n\n// Keep the context menu inside the viewport.\nfunction clampMenuPosition(x: number, y: number) {\n if (typeof window === 'undefined') {\n return {x, y}\n }\n\n return {\n x: Math.max(8, Math.min(x, window.innerWidth - 220)),\n y: Math.max(8, Math.min(y, window.innerHeight - 16)),\n }\n}\n\n// Render one visible row and recurse into children when expanded.\nfunction TreeItem({\n node,\n level,\n expandable,\n selectable,\n expandedIds,\n selectedId,\n draggedId,\n dropTargetId,\n onToggle,\n onSelect,\n indent,\n showLines,\n fileIcons,\n draggable,\n canDropOnNode,\n onContextMenu,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n}: MTreeItemProps) {\n const hasChildren = isFolderNode(node)\n const isExpanded = expandedIds.has(node.id)\n const isSelected = selectedId === node.id\n const isDragging = draggedId === node.id\n const isDropTarget = dropTargetId === node.id\n const canDrop = canDropOnNode?.(node)\n const icon = getDefaultIcon(node, isExpanded, !!fileIcons)\n\n return (\n <li role=\"treeitem\" aria-expanded={hasChildren ? isExpanded : undefined}>\n <div\n className={cn(\n 'item',\n isSelected && 'selected',\n node.disabled && 'disabled',\n selectable && !node.disabled && 'selectable',\n draggable && !node.disabled && 'draggable',\n isDragging && 'dragging',\n canDrop && 'can-drop',\n isDropTarget && 'drop-target'\n )}\n style={{paddingLeft: level * indent}}\n draggable={draggable && !node.disabled}\n onClick={() => {\n if (node.disabled) return\n if (hasChildren && expandable) onToggle(node.id)\n if (selectable) onSelect?.(node.id, node)\n }}\n onContextMenu={(event) => onContextMenu?.(event, node)}\n onDragStart={(event) => onDragStart?.(event, node)}\n onDragOver={(event) => onDragOver?.(event, node)}\n onDrop={(event) => onDrop?.(event, node)}\n onDragEnd={onDragEnd}\n >\n <span className=\"toggle\">\n {hasChildren && expandable ? (\n <span className={cn('arrow', isExpanded && 'expanded')}>\n <MChevronRightIcon />\n </span>\n ) : (\n <span className=\"spacer\" />\n )}\n </span>\n {icon && <span className=\"icon\">{icon}</span>}\n <span className=\"label\">{node.label}</span>\n </div>\n {hasChildren && isExpanded && (\n <ul\n className=\"list\"\n role=\"group\"\n style={showLines ? ({'--line-left': `${level * indent + 17}px`} as CSSProperties) : undefined}\n >\n {(node.children ?? []).map((child) => (\n <TreeItem\n key={child.id}\n node={child}\n level={level + 1}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={onToggle}\n onSelect={onSelect}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={canDropOnNode}\n onContextMenu={onContextMenu}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onDragEnd={onDragEnd}\n />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\n// Render a file tree with selection, context actions and folder moves.\nexport function MTreeView({\n items,\n expandable = true,\n selectable = false,\n defaultExpanded = [],\n expanded: controlledExpanded,\n onExpandChange,\n selected: controlledSelected,\n onSelect,\n indent = 20,\n showLines = true,\n fileIcons = true,\n draggable = false,\n canDrop,\n onMove,\n contextMenuItems,\n onContextMenuAction,\n className,\n ...rest\n}: MTreeViewProps) {\n const [internalExpanded, setInternalExpanded] = useState<string[]>(defaultExpanded)\n const [internalSelected, setInternalSelected] = useState<string | null>(null)\n const [draggedId, setDraggedId] = useState<string | null>(null)\n const [dropTargetId, setDropTargetId] = useState<string | null>(null)\n const [menu, setMenu] = useState<{\n node: MTreeNode\n items: MTreeViewContextMenuItem[]\n x: number\n y: number\n } | null>(null)\n const menuRef = useRef<HTMLDivElement>(null)\n\n const expandedArr = controlledExpanded ?? internalExpanded\n const expandedIds = new Set(expandedArr)\n const selectedId = controlledSelected !== undefined ? controlledSelected : internalSelected\n const {nodeMap, descendants} = buildTreeLookup(items)\n const draggedNode = draggedId ? (nodeMap.get(draggedId) ?? null) : null\n\n useEffect(() => {\n if (!menu) return\n\n function closeMenu(event?: Event) {\n if (event && menuRef.current && menuRef.current.contains(event.target as Node)) {\n return\n }\n\n setMenu(null)\n }\n\n function handleKey(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n setMenu(null)\n }\n }\n\n document.addEventListener('mousedown', closeMenu)\n document.addEventListener('scroll', closeMenu, true)\n window.addEventListener('resize', closeMenu)\n document.addEventListener('keydown', handleKey)\n\n return () => {\n document.removeEventListener('mousedown', closeMenu)\n document.removeEventListener('scroll', closeMenu, true)\n window.removeEventListener('resize', closeMenu)\n document.removeEventListener('keydown', handleKey)\n }\n }, [menu])\n\n function handleToggle(id: string) {\n const next = expandedIds.has(id) ? expandedArr.filter((e) => e !== id) : [...expandedArr, id]\n if (onExpandChange) onExpandChange(next)\n else setInternalExpanded(next)\n }\n\n function handleSelect(id: string, node: MTreeNode) {\n if (onSelect) onSelect(id, node)\n else setInternalSelected(id)\n }\n\n function closeDrag() {\n setDraggedId(null)\n setDropTargetId(null)\n }\n\n function isValidDropTarget(targetNode: MTreeNode) {\n if (!draggedNode || !draggable || !onMove) return false\n if (targetNode.disabled || !isFolderNode(targetNode)) return false\n if (targetNode.id === draggedNode.id) return false\n if (descendants.get(draggedNode.id)?.has(targetNode.id)) return false\n\n return canDrop ? canDrop(draggedNode, targetNode) : true\n }\n\n function handleContextMenu(event: MouseEvent<HTMLDivElement>, node: MTreeNode) {\n if (!contextMenuItems || node.disabled) return\n\n const items = contextMenuItems(node).filter(Boolean)\n if (!items.length) return\n\n event.preventDefault()\n handleSelect(node.id, node)\n\n const pos = clampMenuPosition(event.clientX, event.clientY)\n setMenu({\n node,\n items,\n x: pos.x,\n y: pos.y,\n })\n }\n\n function handleDragStart(event: DragEvent<HTMLDivElement>, node: MTreeNode) {\n if (!draggable || node.disabled) return\n\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData('text/plain', node.id)\n setMenu(null)\n setDraggedId(node.id)\n }\n\n function handleDragOver(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n if (!isValidDropTarget(targetNode)) return\n\n event.preventDefault()\n event.dataTransfer.dropEffect = 'move'\n setDropTargetId(targetNode.id)\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n event.preventDefault()\n\n if (!draggedNode || !isValidDropTarget(targetNode)) {\n closeDrag()\n return\n }\n\n onMove?.({\n draggedId: draggedNode.id,\n draggedNode,\n targetId: targetNode.id,\n targetNode,\n } satisfies MTreeViewMoveEvent)\n\n if (expandable && !expandedIds.has(targetNode.id)) {\n handleToggle(targetNode.id)\n }\n\n closeDrag()\n }\n\n return (\n <div className={cn('tree', showLines && 'lines', className)} {...rest}>\n <ul className=\"list\" role=\"tree\">\n {items.map((item) => (\n <TreeItem\n key={item.id}\n node={item}\n level={0}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={handleToggle}\n onSelect={handleSelect}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={isValidDropTarget}\n onContextMenu={handleContextMenu}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n onDragEnd={closeDrag}\n />\n ))}\n </ul>\n {menu && (\n <MPortal>\n <div ref={menuRef} className=\"tree menu\" style={{top: menu.y, left: menu.x}} role=\"menu\">\n {menu.items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className={cn('action', item.color, item.disabled && 'disabled')}\n role=\"menuitem\"\n disabled={item.disabled}\n onClick={() => {\n if (item.disabled) return\n onContextMenuAction?.(item.id, menu.node)\n setMenu(null)\n }}\n >\n {item.icon && <span className=\"icon\">{item.icon}</span>}\n <span>{item.label}</span>\n </button>\n ))}\n </div>\n </MPortal>\n )}\n </div>\n )\n}\n","import type {MTaskListProps} from './MTaskList.types'\nimport {MCheckbox} from '../../controls'\nimport {cn} from '../../../utils/cn'\nimport './MTaskList.css'\n\n// Render an interactive checklist with toggleable task items.\nexport function MTaskList({\n items,\n color = 'primary',\n strikethrough = true,\n onChange,\n className,\n ...rest\n}: MTaskListProps) {\n return (\n <div className={cn('task list', `color-${color}`, className)} role=\"list\" {...rest}>\n {items.map((item) => (\n <div\n key={item.id}\n className={cn('task item', item.checked && 'checked', item.disabled && 'disabled')}\n role=\"listitem\"\n onClick={(event) => {\n if (item.disabled) return\n if ((event.target as HTMLElement).closest('.checkbox')) return\n onChange?.(item.id, !(item.checked ?? false))\n }}\n >\n <MCheckbox\n className=\"task control\"\n checked={item.checked ?? false}\n color={color}\n size=\"sm\"\n disabled={item.disabled}\n onChange={(e) => onChange?.(item.id, e.target.checked)}\n clickEffect=\"ripple\"\n />\n <span className={cn('task label', item.checked && strikethrough && 'done')}>{item.label}</span>\n </div>\n ))}\n </div>\n )\n}\n","import {useMemo, useState} from 'react'\nimport type {ReactNode} from 'react'\nimport type {\n MFileManagerActionEvent,\n MFileManagerLocale,\n MFileManagerMoveEvent,\n MFileManagerNode,\n MFileManagerProps,\n MFileManagerSelectionEvent,\n MFileManagerView,\n} from './MFileManager.types'\nimport {MButton} from '../../controls'\nimport {MBadge} from '../../feedback'\nimport {MInputSearch} from '../../inputs'\nimport {MInline, MStack} from '../../layout'\nimport {MDropdownItem, MDropdownMenu} from '../../overlays'\nimport {MText} from '../../typography'\nimport {MTreeView} from '../MTreeView'\nimport {\n MArrowRightIcon,\n MDownloadIcon,\n MEditIcon,\n MEllipsisVerticalIcon,\n MFileCodeIcon,\n MFileCsvIcon,\n MFileCssIcon,\n MFileExeIcon,\n MFileGifIcon,\n MFileHtmlIcon,\n MFileIcon,\n MFileImageIcon,\n MFileJpgIcon,\n MFileJsIcon,\n MFileJsonIcon,\n MFileMdIcon,\n MFileMp3Icon,\n MFileMp4Icon,\n MFileOdtIcon,\n MFilePdfIcon,\n MFilePhpIcon,\n MFilePngIcon,\n MFilePptIcon,\n MFileRarIcon,\n MFileSvgIcon,\n MFileTextIcon,\n MFileTsIcon,\n MFileTsxIcon,\n MFileTxtIcon,\n MFileWebpIcon,\n MFileXlsIcon,\n MFileXmlIcon,\n MFileZipIcon,\n MFolderPlusIcon,\n MFolderIcon,\n MFolderOpenIcon,\n MHomeIcon,\n MTrashIcon,\n} from '../../../icons'\nimport {useMFileManagerTexts} from '../../../i18n/frameworkTexts'\nimport {cn} from '../../../utils/cn'\nimport {useDocumentLocale} from '../../../utils/locale'\nimport './MFileManager.css'\n\ninterface FileManagerMenuAction {\n id: string\n label: ReactNode\n icon?: ReactNode\n color?: 'primary' | 'error'\n}\n\nconst fileTypeMap: Record<string, ReactNode> = {\n pdf: <MFilePdfIcon />,\n ts: <MFileTsIcon />,\n tsx: <MFileTsxIcon />,\n js: <MFileJsIcon />,\n jsx: <MFileCodeIcon />,\n css: <MFileCssIcon />,\n scss: <MFileCssIcon />,\n html: <MFileHtmlIcon />,\n json: <MFileJsonIcon />,\n md: <MFileMdIcon />,\n txt: <MFileTxtIcon />,\n csv: <MFileCsvIcon />,\n zip: <MFileZipIcon />,\n rar: <MFileRarIcon />,\n svg: <MFileSvgIcon />,\n png: <MFilePngIcon />,\n jpg: <MFileJpgIcon />,\n jpeg: <MFileImageIcon />,\n gif: <MFileGifIcon />,\n webp: <MFileWebpIcon />,\n php: <MFilePhpIcon />,\n xml: <MFileXmlIcon />,\n xls: <MFileXlsIcon />,\n ppt: <MFilePptIcon />,\n odt: <MFileOdtIcon />,\n exe: <MFileExeIcon />,\n mp3: <MFileMp3Icon />,\n mp4: <MFileMp4Icon />,\n}\n\nfunction getFileExtension(label: string): string | null {\n const dot = label.lastIndexOf('.')\n if (dot < 1) return null\n return label.slice(dot + 1).toLowerCase()\n}\n\nfunction isFolderNode(node: MFileManagerNode | null | undefined) {\n return node?.kind === 'folder' || Boolean(node?.children?.length)\n}\n\nfunction getFileIcon(label: string): ReactNode {\n const ext = getFileExtension(label)\n if (!ext) return <MFileIcon />\n\n return fileTypeMap[ext] ?? <MFileTextIcon />\n}\n\nfunction getNodeIcon(node: MFileManagerNode, isExpanded = false): ReactNode {\n if (node.icon) return node.icon\n if (isFolderNode(node)) return isExpanded ? <MFolderOpenIcon /> : <MFolderIcon />\n return getFileIcon(node.label)\n}\n\nfunction formatBytes(value?: number) {\n if (!value || value < 1) return null\n\n const units = ['B', 'KB', 'MB', 'GB', 'TB']\n let current = value\n let index = 0\n\n while (current >= 1024 && index < units.length - 1) {\n current /= 1024\n index += 1\n }\n\n const digits = current >= 100 || index === 0 ? 0 : 1\n return `${current.toFixed(digits)} ${units[index]}`\n}\n\nfunction formatModifiedAt(value: Date | string | undefined, locale: MFileManagerLocale) {\n if (!value) return null\n\n const date = value instanceof Date ? value : new Date(value)\n if (Number.isNaN(date.getTime())) return null\n\n return new Intl.DateTimeFormat(locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n }).format(date)\n}\n\nfunction buildLookup(items: MFileManagerNode[]) {\n const nodeMap = new Map<string, MFileManagerNode>()\n const parentMap = new Map<string, string | null>()\n\n function walk(nodes: MFileManagerNode[], parentId: string | null) {\n for (const node of nodes) {\n nodeMap.set(node.id, node)\n parentMap.set(node.id, parentId)\n\n if (node.children?.length) {\n walk(node.children, node.id)\n }\n }\n }\n\n walk(items, null)\n\n return {nodeMap, parentMap}\n}\n\nfunction buildFolderTree(items: MFileManagerNode[]): MFileManagerNode[] {\n return items.flatMap((node) => {\n if (!isFolderNode(node)) return []\n\n return [\n {\n ...node,\n kind: 'folder',\n children: buildFolderTree(node.children ?? []),\n },\n ]\n })\n}\n\nfunction buildPath(id: string | null, nodeMap: Map<string, MFileManagerNode>, parentMap: Map<string, string | null>) {\n const path: MFileManagerNode[] = []\n let currentId = id\n\n while (currentId) {\n const node = nodeMap.get(currentId)\n if (!node) break\n path.unshift(node)\n currentId = parentMap.get(currentId) ?? null\n }\n\n return path\n}\n\nfunction resolveFolderId(\n value: string | null | undefined,\n nodeMap: Map<string, MFileManagerNode>,\n parentMap: Map<string, string | null>\n) {\n if (!value) return null\n\n const node = nodeMap.get(value)\n if (!node) return null\n if (isFolderNode(node)) return node.id\n\n return parentMap.get(node.id) ?? null\n}\n\nfunction getCurrentItems(activeFolder: MFileManagerNode | null, items: MFileManagerNode[]) {\n return activeFolder ? (activeFolder.children ?? []) : items\n}\n\nfunction makeSelectionEvent(\n id: string | null,\n nodeMap: Map<string, MFileManagerNode>,\n parentMap: Map<string, string | null>,\n activeFolderId: string | null,\n activeFolder: MFileManagerNode | null\n): MFileManagerSelectionEvent {\n const node = id ? (nodeMap.get(id) ?? null) : null\n const parentId = node ? (parentMap.get(node.id) ?? null) : null\n\n return {\n id,\n node,\n parentId,\n parentNode: parentId ? (nodeMap.get(parentId) ?? null) : null,\n activeFolderId,\n activeFolder,\n }\n}\n\nfunction getDefaultItemActions(\n node: MFileManagerNode,\n texts: ReturnType<typeof useMFileManagerTexts>\n): FileManagerMenuAction[] {\n return [\n ...(isFolderNode(node)\n ? []\n : [{id: 'download', label: texts.download, icon: <MDownloadIcon />, color: 'primary' as const}]),\n {id: 'rename', label: texts.rename, icon: <MEditIcon />},\n {id: 'move', label: texts.moveTo, icon: <MArrowRightIcon />},\n {id: 'delete', label: texts.delete, icon: <MTrashIcon />, color: 'error' as const},\n ]\n}\n\nfunction getDefaultContextMenuActions(\n node: MFileManagerNode,\n texts: ReturnType<typeof useMFileManagerTexts>\n): FileManagerMenuAction[] {\n return [\n ...(isFolderNode(node) ? [{id: 'new-folder', label: texts.newFolder, icon: <MFolderPlusIcon />}] : []),\n ...getDefaultItemActions(node, texts),\n ]\n}\n\nexport function MFileManager({\n items,\n locale: localeOverride,\n defaultExpanded = [],\n expanded,\n onExpandChange,\n folderId: controlledFolderId,\n defaultFolderId = null,\n onFolderChange,\n selectedId: controlledSelectedId,\n onSelectionChange,\n view: controlledView,\n defaultView = 'list',\n onViewChange,\n searchValue: controlledSearch,\n defaultSearchValue = '',\n onSearchChange,\n searchable = true,\n searchPlaceholder,\n showSidebar = true,\n showPreview = true,\n emptyText,\n toolbarActions = [],\n onToolbarAction,\n onOpenItem,\n onItemAction,\n onContextMenuAction,\n canDrop,\n onMove,\n renderPreview,\n className,\n ...rest\n}: MFileManagerProps) {\n const locale = useDocumentLocale(localeOverride)\n const texts = useMFileManagerTexts()\n const [internalFolderId, setInternalFolderId] = useState<string | null>(defaultFolderId)\n const [internalSelectedId, setInternalSelectedId] = useState<string | null>(null)\n const [internalView, setInternalView] = useState<MFileManagerView>(defaultView)\n const [internalSearch, setInternalSearch] = useState(defaultSearchValue)\n\n const {nodeMap, parentMap} = useMemo(() => buildLookup(items), [items])\n const folderTree = useMemo(() => buildFolderTree(items), [items])\n\n const rawFolderId = controlledFolderId !== undefined ? controlledFolderId : internalFolderId\n const activeFolderId = resolveFolderId(rawFolderId, nodeMap, parentMap)\n const activeFolder = activeFolderId ? (nodeMap.get(activeFolderId) ?? null) : null\n\n const rawSelectedId = controlledSelectedId !== undefined ? controlledSelectedId : internalSelectedId\n const selectedNode = rawSelectedId ? (nodeMap.get(rawSelectedId) ?? null) : null\n const selectedId = selectedNode ? selectedNode.id : null\n\n const activeView = controlledView ?? internalView\n const search = controlledSearch ?? internalSearch\n const currentItems = getCurrentItems(activeFolder, items)\n const query = search.trim().toLowerCase()\n const activePath = buildPath(activeFolderId, nodeMap, parentMap)\n const effectiveSearchPlaceholder = searchPlaceholder ?? texts.searchPlaceholder\n const effectiveEmptyText = emptyText ?? texts.emptyText\n const hasNodeActionHandler = Boolean(onItemAction || onContextMenuAction)\n\n const visibleItems = useMemo(() => {\n if (!query) return currentItems\n\n return currentItems.filter((item) => item.label.toLowerCase().includes(query))\n }, [currentItems, query])\n\n function changeFolder(nextId: string | null) {\n const nextFolderId = resolveFolderId(nextId, nodeMap, parentMap)\n const nextFolder = nextFolderId ? (nodeMap.get(nextFolderId) ?? null) : null\n\n if (onFolderChange) onFolderChange(nextFolderId, nextFolder)\n else setInternalFolderId(nextFolderId)\n }\n\n function changeSelection(\n nextId: string | null,\n nextActiveFolderId = activeFolderId,\n nextActiveFolder = activeFolder\n ) {\n const event = makeSelectionEvent(nextId, nodeMap, parentMap, nextActiveFolderId, nextActiveFolder)\n\n if (onSelectionChange) onSelectionChange(event)\n else setInternalSelectedId(nextId)\n }\n\n function changeView(nextView: MFileManagerView) {\n if (onViewChange) onViewChange(nextView)\n else setInternalView(nextView)\n }\n\n function changeSearch(nextSearch: string) {\n if (onSearchChange) onSearchChange(nextSearch)\n else setInternalSearch(nextSearch)\n }\n\n function handleFolderSelect(id: string, node: MFileManagerNode) {\n changeFolder(id)\n changeSelection(id, node.id, node)\n }\n\n function handleItemClick(node: MFileManagerNode) {\n if (isFolderNode(node)) {\n changeFolder(node.id)\n changeSelection(node.id, node.id, node)\n return\n }\n\n changeSelection(node.id)\n }\n\n function emitToolbarAction(actionId: string) {\n if (!onToolbarAction) return\n\n const baseEvent = makeSelectionEvent(selectedId, nodeMap, parentMap, activeFolderId, activeFolder)\n onToolbarAction({\n ...baseEvent,\n actionId,\n visibleItems,\n } satisfies MFileManagerActionEvent)\n }\n\n function emitItemAction(actionId: string, node: MFileManagerNode) {\n ;(onItemAction ?? onContextMenuAction)?.(actionId, node)\n }\n\n function emitContextMenuAction(actionId: string, node: MFileManagerNode) {\n ;(onContextMenuAction ?? onItemAction)?.(actionId, node)\n }\n\n function renderItemMeta(node: MFileManagerNode) {\n const details = []\n const size = formatBytes(node.size)\n const modifiedAt = formatModifiedAt(node.modifiedAt, locale)\n\n if (isFolderNode(node)) {\n details.push(texts.itemsCount(node.children?.length ?? 0))\n }\n\n if (size) {\n details.push(size)\n }\n\n if (modifiedAt) {\n details.push(modifiedAt)\n }\n\n return details.join(' / ')\n }\n\n return (\n <div\n className={cn('file-manager', !showSidebar && 'no-sidebar', !showPreview && 'no-preview', className)}\n {...rest}\n >\n <div className=\"toolbar\">\n <div className=\"toolbar-main\">\n <div className=\"breadcrumbs\">\n <button type=\"button\" className=\"breadcrumb root\" onClick={() => changeFolder(null)}>\n <MHomeIcon />\n <MText as=\"span\" weight=\"semibold\">\n {texts.home}\n </MText>\n </button>\n {activePath.map((node) => (\n <div key={node.id} className=\"breadcrumbs\">\n <span className=\"breadcrumb-separator\">/</span>\n <button type=\"button\" className=\"breadcrumb\" onClick={() => changeFolder(node.id)}>\n <MText as=\"span\">{node.label}</MText>\n </button>\n </div>\n ))}\n </div>\n {searchable && (\n <MInputSearch\n className=\"toolbar-search\"\n size=\"sm\"\n placeholder={effectiveSearchPlaceholder}\n value={search}\n onChange={(event) => changeSearch(event.target.value)}\n onClear={() => changeSearch('')}\n />\n )}\n </div>\n <div className=\"toolbar-actions\">\n {toolbarActions.map((action) => (\n <MButton\n key={action.id}\n size=\"sm\"\n variant={action.variant ?? 'ghost'}\n color={action.color}\n disabled={action.disabled}\n onClick={() => emitToolbarAction(action.id)}\n startIcon={action.icon}\n >\n {action.label}\n </MButton>\n ))}\n <div className=\"view-switch\">\n <MButton\n size=\"sm\"\n variant={activeView === 'list' ? 'secondary' : 'ghost'}\n onClick={() => changeView('list')}\n >\n {texts.listView}\n </MButton>\n <MButton\n size=\"sm\"\n variant={activeView === 'grid' ? 'secondary' : 'ghost'}\n onClick={() => changeView('grid')}\n >\n {texts.gridView}\n </MButton>\n </div>\n </div>\n </div>\n\n <div className=\"body\">\n {showSidebar && (\n <aside className=\"panel\">\n <div className=\"panel-header\">\n <MText weight=\"semibold\">{texts.folders}</MText>\n <MBadge size=\"sm\" color=\"info\">\n {folderTree.length}\n </MBadge>\n </div>\n <div className=\"panel-body sidebar-body\">\n {folderTree.length > 0 ? (\n <MTreeView\n items={folderTree}\n selectable\n fileIcons\n defaultExpanded={defaultExpanded}\n expanded={expanded}\n onExpandChange={onExpandChange}\n selected={activeFolderId}\n onSelect={(id, node) => handleFolderSelect(id, node as MFileManagerNode)}\n draggable={Boolean(onMove)}\n canDrop={\n canDrop\n ? (draggedNode, targetNode) =>\n canDrop(\n draggedNode as MFileManagerNode,\n targetNode as MFileManagerNode\n )\n : undefined\n }\n onMove={\n onMove\n ? (event) =>\n onMove({\n draggedId: event.draggedId,\n draggedNode: event.draggedNode as MFileManagerNode,\n targetId: event.targetId,\n targetNode: event.targetNode as MFileManagerNode,\n } satisfies MFileManagerMoveEvent)\n : undefined\n }\n contextMenuItems={\n hasNodeActionHandler\n ? (node) => getDefaultContextMenuActions(node as MFileManagerNode, texts)\n : undefined\n }\n onContextMenuAction={\n hasNodeActionHandler\n ? (actionId, node) =>\n emitContextMenuAction(actionId, node as MFileManagerNode)\n : undefined\n }\n />\n ) : (\n <div className=\"empty-state\">{texts.noFoldersAvailable}</div>\n )}\n </div>\n </aside>\n )}\n\n <section className=\"panel\">\n <div className=\"panel-header\">\n <MInline align=\"center\" wrap=\"wrap\">\n <MText weight=\"semibold\">{activeFolder?.label ?? texts.home}</MText>\n <MBadge size=\"sm\">{visibleItems.length}</MBadge>\n </MInline>\n <MText size=\"sm\" tone=\"muted\">\n {query ? texts.filteredBy(search) : texts.currentFolder}\n </MText>\n </div>\n <div className=\"panel-body\">\n {visibleItems.length > 0 ? (\n <div className={cn('content-items', activeView)}>\n {visibleItems.map((node) => {\n const isSelected = selectedId === node.id\n const itemMeta = renderItemMeta(node)\n const actions = hasNodeActionHandler ? getDefaultItemActions(node, texts) : []\n\n return (\n <div key={node.id} className={cn('item-card', isSelected && 'selected')}>\n <button\n type=\"button\"\n className=\"item-card-main\"\n onClick={() => handleItemClick(node)}\n onDoubleClick={() => onOpenItem?.(node)}\n >\n <span className=\"item-icon\">{getNodeIcon(node)}</span>\n <span className=\"item-text\">\n <MText as=\"span\" weight=\"semibold\" truncate>\n {node.label}\n </MText>\n {node.description ? (\n <MText as=\"span\" size=\"sm\" tone=\"muted\" truncate={2}>\n {node.description}\n </MText>\n ) : null}\n <span className=\"item-meta\">\n <MBadge\n size=\"sm\"\n color={isFolderNode(node) ? 'info' : 'primary'}\n >\n {isFolderNode(node) ? texts.folder : texts.file}\n </MBadge>\n {itemMeta ? (\n <MText as=\"span\" size=\"sm\" tone=\"muted\" truncate>\n {itemMeta}\n </MText>\n ) : null}\n </span>\n </span>\n </button>\n {actions.length > 0 ? (\n <div className=\"item-card-actions\">\n <MDropdownMenu\n placement=\"bottom-end\"\n trigger={\n <MButton\n aria-label={`${texts.preview}: ${node.label}`}\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n >\n <MEllipsisVerticalIcon />\n </MButton>\n }\n >\n {actions.map((action) => (\n <MDropdownItem\n key={action.id}\n icon={action.icon}\n label={action.label}\n color={action.color}\n onClick={() => emitItemAction(action.id, node)}\n />\n ))}\n </MDropdownMenu>\n </div>\n ) : null}\n </div>\n )\n })}\n </div>\n ) : (\n <div className=\"empty-state\">{effectiveEmptyText}</div>\n )}\n </div>\n </section>\n\n {showPreview && (\n <aside className=\"panel\">\n <div className=\"panel-header\">\n <MText weight=\"semibold\">{texts.preview}</MText>\n {selectedNode ? (\n <MBadge size=\"sm\" color={isFolderNode(selectedNode) ? 'info' : 'primary'}>\n {isFolderNode(selectedNode) ? texts.folder : texts.file}\n </MBadge>\n ) : null}\n </div>\n <div className=\"panel-body\">\n {selectedNode ? (\n <MStack>\n <div className=\"preview-visual\">\n {renderPreview ? (\n renderPreview(selectedNode)\n ) : selectedNode.preview ? (\n selectedNode.preview\n ) : (\n <span className=\"preview-icon\">{getNodeIcon(selectedNode, true)}</span>\n )}\n </div>\n <MText weight=\"semibold\">{selectedNode.label}</MText>\n {selectedNode.description ? (\n <MText size=\"sm\" tone=\"muted\">\n {selectedNode.description}\n </MText>\n ) : null}\n <div className=\"preview-meta\">\n <MBadge size=\"sm\" color={isFolderNode(selectedNode) ? 'info' : 'primary'}>\n {isFolderNode(selectedNode) ? texts.folder : texts.file}\n </MBadge>\n {formatBytes(selectedNode.size) ? (\n <MBadge size=\"sm\">{formatBytes(selectedNode.size)}</MBadge>\n ) : null}\n {formatModifiedAt(selectedNode.modifiedAt, locale) ? (\n <MBadge size=\"sm\" color=\"neutral\">\n {formatModifiedAt(selectedNode.modifiedAt, locale)}\n </MBadge>\n ) : null}\n </div>\n <MText size=\"sm\" tone=\"muted\">\n {texts.path}:{' '}\n {[\n texts.home,\n ...buildPath(selectedNode.id, nodeMap, parentMap).map((node) => node.label),\n ].join(' / ')}\n </MText>\n </MStack>\n ) : (\n <div className=\"preview-empty\">{texts.selectItemToInspect}</div>\n )}\n </div>\n </aside>\n )}\n </div>\n </div>\n )\n}\n","import {useEffect, useMemo, useRef, useState} from 'react'\nimport type {ReactNode, RefObject} from 'react'\nimport type {\n MCalendarBoardLocale,\n MCalendarBoardProps,\n MCalendarBoardView,\n MCalendarDayCellProps,\n MCalendarDetailsMode,\n MCalendarEvent,\n MCalendarEventItemProps,\n MCalendarEventListProps,\n MCalendarEventPopoverProps,\n MCalendarFilterOption,\n MCalendarTimelineProps,\n MCalendarTimelineSlotState,\n} from './MCalendarBoard.types'\nimport {cn} from '../../../utils/cn'\nimport {useMCalendarBoardTexts, useMDatePickerTexts} from '../../../i18n/frameworkTexts'\nimport {useDocumentLocale} from '../../../utils/locale'\nimport {MButton} from '../../controls'\nimport {MBadge} from '../../feedback'\nimport {MCard, MCardBody} from '../../cards'\nimport {MAvatar} from '../../media'\nimport {MModal} from '../../overlays'\nimport {MPopover} from '../../primitives'\nimport {MHeading, MText} from '../../typography'\nimport {MStack} from '../../layout'\nimport {MBreakpoints} from '../../../theme'\nimport './MCalendarBoard.css'\n\ninterface CalendarDetailsContentProps {\n date: Date | null\n events: MCalendarEvent[]\n locale: MCalendarBoardLocale\n timelineStartHour: number\n timelineEndHour: number\n showTimeline: boolean\n emptyStateText: string\n renderEventItem?: (event: MCalendarEvent) => ReactNode\n}\n\ninterface CalendarWeekViewProps {\n days: Date[]\n eventsByDay: Map<string, MCalendarEvent[]>\n selectedDate: Date | null\n activeDate: Date | null\n onDayInteract: (date: Date, target: HTMLElement, events: MCalendarEvent[]) => void\n onDayHover: (date: Date, target: HTMLElement, events: MCalendarEvent[]) => void\n onDayLeave: () => void\n dayBadge?: MCalendarBoardProps['dayBadge']\n renderDayCell?: MCalendarBoardProps['renderDayCell']\n}\n\nfunction stripTime(date: Date) {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate())\n}\n\nfunction normalizeDate(value?: Date | string | null) {\n if (!value) {\n return null\n }\n\n if (value instanceof Date) {\n return stripTime(value)\n }\n\n const parsed = new Date(value)\n if (Number.isNaN(parsed.getTime())) {\n return null\n }\n\n return stripTime(parsed)\n}\n\nfunction getDateKey(date: Date) {\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n\n return `${year}-${month}-${day}`\n}\n\nfunction getEventDate(event: MCalendarEvent) {\n return normalizeDate(event.date)\n}\n\nfunction addDays(date: Date, amount: number) {\n const nextDate = new Date(date)\n nextDate.setDate(nextDate.getDate() + amount)\n return stripTime(nextDate)\n}\n\nfunction startOfWeek(date: Date, weekStartsOn: 0 | 1) {\n const safeDate = stripTime(date)\n const day = safeDate.getDay()\n const delta = (day - weekStartsOn + 7) % 7\n return addDays(safeDate, -delta)\n}\n\nfunction sortEventsByTime(events: MCalendarEvent[]) {\n return [...events].sort((leftEvent, rightEvent) => {\n const leftTime = leftEvent.startTime ?? '99:99'\n const rightTime = rightEvent.startTime ?? '99:99'\n return leftTime.localeCompare(rightTime)\n })\n}\n\nfunction buildMonthGrid(month: Date, weekStartsOn: 0 | 1) {\n const monthStart = new Date(month.getFullYear(), month.getMonth(), 1)\n const gridStart = startOfWeek(monthStart, weekStartsOn)\n\n return Array.from({length: 42}, (_, index) => addDays(gridStart, index))\n}\n\nfunction getStatusColor(status?: MCalendarEvent['status']) {\n switch (status) {\n case 'active':\n return 'rgba(14, 165, 233, 1)'\n case 'done':\n return 'rgba(34, 197, 94, 1)'\n case 'cancelled':\n return 'rgba(239, 68, 68, 1)'\n default:\n return 'rgba(245, 158, 11, 1)'\n }\n}\n\nfunction formatBoardDate(date: Date, locale: MCalendarBoardLocale) {\n return new Intl.DateTimeFormat(locale, {\n weekday: 'long',\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n }).format(date)\n}\n\nfunction formatWeekRange(startDate: Date, locale: MCalendarBoardLocale) {\n const endDate = addDays(startDate, 6)\n const formatter = new Intl.DateTimeFormat(locale, {\n day: 'numeric',\n month: 'short',\n })\n\n return `${formatter.format(startDate)} - ${formatter.format(endDate)}`\n}\n\nfunction formatEventTime(event: MCalendarEvent, texts: ReturnType<typeof useMCalendarBoardTexts>) {\n if (event.startTime && event.endTime) {\n return `${event.startTime} - ${event.endTime}`\n }\n\n if (event.startTime) {\n return event.startTime\n }\n\n return texts.allDay\n}\n\nfunction getTimelineSlotState(date: Date, hour: number): MCalendarTimelineSlotState {\n const now = new Date()\n const slotStart = new Date(date)\n slotStart.setHours(hour, 0, 0, 0)\n const slotEnd = new Date(slotStart)\n slotEnd.setHours(hour + 1, 0, 0, 0)\n\n if (slotEnd <= now) {\n return 'past'\n }\n\n if (slotStart <= now && slotEnd > now) {\n return 'active'\n }\n\n return 'upcoming'\n}\n\nfunction buildDayMarkers(events: MCalendarEvent[]) {\n return sortEventsByTime(events)\n .slice(0, 4)\n .map((event) => (\n <span\n key={event.id}\n className={'marker'}\n style={{background: event.color ?? getStatusColor(event.status)}}\n aria-hidden={'true'}\n />\n ))\n}\n\nfunction applyCalendarFilters(events: MCalendarEvent[], filters: MCalendarFilterOption[], activeFilterIds: string[]) {\n if (!filters.length || !activeFilterIds.length) {\n return events\n }\n\n const activeFilters = filters.filter((filterOption) => activeFilterIds.includes(filterOption.id))\n if (!activeFilters.length) {\n return events\n }\n\n return events.filter((event) => activeFilters.some((filterOption) => filterOption.predicate(event)))\n}\n\nfunction getViewTitle(month: Date, view: MCalendarBoardView, locale: MCalendarBoardLocale, weekStartsOn: 0 | 1) {\n if (view === 'week') {\n return formatWeekRange(startOfWeek(month, weekStartsOn), locale)\n }\n\n return new Intl.DateTimeFormat(locale, {\n month: 'long',\n year: 'numeric',\n }).format(month)\n}\n\nfunction getViewSubtitle(view: MCalendarBoardView, texts: ReturnType<typeof useMCalendarBoardTexts>) {\n return view === 'week' ? texts.weekView : texts.monthView\n}\n\nfunction CalendarDetailsContent({\n date,\n events,\n locale,\n timelineStartHour,\n timelineEndHour,\n showTimeline,\n emptyStateText,\n renderEventItem,\n}: CalendarDetailsContentProps) {\n if (!date) {\n return null\n }\n\n const texts = useMCalendarBoardTexts()\n\n return (\n <MStack>\n <MStack>\n <MHeading level={4}>{formatBoardDate(date, locale)}</MHeading>\n <MText tone={'muted'} size={'sm'}>\n {events.length > 0 ? texts.itemsCount(events.length) : emptyStateText}\n </MText>\n </MStack>\n <MCalendarEventList\n events={events}\n locale={locale}\n currentDate={date}\n emptyStateText={emptyStateText}\n renderEventItem={renderEventItem}\n />\n {showTimeline && (\n <MCalendarTimeline\n date={date}\n events={events}\n locale={locale}\n startHour={timelineStartHour}\n endHour={timelineEndHour}\n />\n )}\n </MStack>\n )\n}\n\nfunction CalendarFilters({\n filters,\n activeFilterIds,\n onToggle,\n}: {\n filters: MCalendarFilterOption[]\n activeFilterIds: string[]\n onToggle: (filterId: string) => void\n}) {\n if (!filters.length) {\n return null\n }\n\n return (\n <div className={'calendar filters'}>\n {filters.map((filterOption) => {\n const isActive = activeFilterIds.includes(filterOption.id)\n\n return (\n <MButton\n key={filterOption.id}\n type={'button'}\n size={'sm'}\n variant=\"outlined\"\n color={isActive ? 'primary' : 'neutral'}\n active={isActive}\n className={'calendar filter button'}\n onClick={() => onToggle(filterOption.id)}\n >\n {filterOption.label}\n </MButton>\n )\n })}\n </div>\n )\n}\nfunction CalendarWeekView({\n days,\n eventsByDay,\n selectedDate,\n activeDate,\n onDayInteract,\n onDayHover,\n onDayLeave,\n dayBadge,\n renderDayCell,\n}: CalendarWeekViewProps) {\n const todayKey = getDateKey(stripTime(new Date()))\n\n return (\n <div className={'calendar week'}>\n {days.map((day) => {\n const dayKey = getDateKey(day)\n const dayEvents = eventsByDay.get(dayKey) ?? []\n const badge =\n dayBadge?.(day, dayEvents) ??\n (dayEvents.length > 0 ? <MBadge size={'sm'}>{dayEvents.length}</MBadge> : null)\n const markers = buildDayMarkers(dayEvents)\n const isSelected = Boolean(selectedDate && getDateKey(selectedDate) === dayKey)\n const context = {\n date: day,\n events: dayEvents,\n badge,\n isToday: dayKey === todayKey,\n isSelected,\n isOutsideMonth: false,\n }\n\n return (\n <div key={dayKey} className={'calendar week column'}>\n <MCalendarDayCell\n date={day}\n events={dayEvents}\n badge={badge}\n markers={markers}\n isToday={context.isToday}\n isSelected={isSelected || Boolean(activeDate && getDateKey(activeDate) === dayKey)}\n isOutsideMonth={false}\n onClick={(event) => onDayInteract(day, event.currentTarget, dayEvents)}\n onMouseEnter={(event) => onDayHover(day, event.currentTarget, dayEvents)}\n onMouseLeave={onDayLeave}\n >\n {renderDayCell ? renderDayCell(day, context) : undefined}\n </MCalendarDayCell>\n </div>\n )\n })}\n </div>\n )\n}\n\nexport function MCalendarDayCell({\n date,\n events = [],\n badge,\n markers,\n isToday = false,\n isSelected = false,\n isOutsideMonth = false,\n className,\n children,\n ...rest\n}: MCalendarDayCellProps) {\n return (\n <button\n type={'button'}\n className={cn(\n 'calendar day cell',\n isToday && 'today',\n isSelected && 'selected',\n isOutsideMonth && 'outside-month',\n className\n )}\n {...rest}\n >\n {children ?? (\n <>\n <div className={'day header'}>\n <span className={'day number'}>{date.getDate()}</span>\n <div className={'day meta'}>{badge}</div>\n </div>\n <div className={'markers'}>{markers ?? buildDayMarkers(events)}</div>\n </>\n )}\n </button>\n )\n}\n\nexport function MCalendarEventItem({\n event,\n locale: localeOverride,\n className,\n currentDate,\n ...rest\n}: MCalendarEventItemProps) {\n const locale = useDocumentLocale(localeOverride)\n const texts = useMCalendarBoardTexts()\n const statusColor =\n event.status === 'cancelled'\n ? 'error'\n : event.status === 'done'\n ? 'success'\n : event.status === 'active'\n ? 'info'\n : 'warning'\n\n return (\n <div className={cn('calendar event item', className)} {...rest}>\n <div className={'event time'}>{formatEventTime(event, texts)}</div>\n <div className={'event content'}>\n <div className={'event title row'}>\n <MHeading level={5}>{event.title}</MHeading>\n {event.status && (\n <MBadge color={statusColor} size={'sm'}>\n {event.status}\n </MBadge>\n )}\n </div>\n {event.description && (\n <MText size={'sm'} tone={'muted'}>\n {event.description}\n </MText>\n )}\n <div className={'event details'}>\n {event.type && (\n <MBadge color={'neutral'} size={'sm'}>\n {event.type}\n </MBadge>\n )}\n {event.badgeLabel && <MBadge size={'sm'}>{event.badgeLabel}</MBadge>}\n {event.user && (\n <span className={'event user'}>\n <MAvatar\n size={'sm'}\n src={event.user.avatar}\n name={event.user.name}\n backgroundColor={event.user.color}\n />\n {event.user.name}\n </span>\n )}\n {!event.startTime && !event.endTime && currentDate && (\n <MText size={'sm'} tone={'muted'}>\n {formatBoardDate(currentDate, locale)}\n </MText>\n )}\n </div>\n </div>\n </div>\n )\n}\n\nexport function MCalendarEventList({\n events,\n locale: localeOverride,\n currentDate,\n emptyStateText,\n renderEventItem,\n className,\n ...rest\n}: MCalendarEventListProps) {\n const locale = useDocumentLocale(localeOverride)\n const texts = useMCalendarBoardTexts()\n\n if (!events.length) {\n return (\n <MText size={'sm'} tone={'muted'} className={cn('calendar event list', className)} {...rest}>\n {emptyStateText ?? texts.emptyStateText}\n </MText>\n )\n }\n\n return (\n <div className={cn('calendar event list', className)} {...rest}>\n <MStack>\n {sortEventsByTime(events).map((event) =>\n renderEventItem ? (\n <div key={event.id}>{renderEventItem(event)}</div>\n ) : (\n <MCalendarEventItem key={event.id} event={event} locale={locale} currentDate={currentDate} />\n )\n )}\n </MStack>\n </div>\n )\n}\nexport function MCalendarTimeline({\n date,\n events,\n locale: localeOverride,\n startHour = 6,\n endHour = 22,\n emptyStateText,\n className,\n ...rest\n}: MCalendarTimelineProps) {\n const locale = useDocumentLocale(localeOverride)\n const texts = useMCalendarBoardTexts()\n const hours = Array.from({length: Math.max(endHour - startHour + 1, 1)}, (_, index) => startHour + index)\n\n return (\n <div className={cn('calendar timeline', className)} {...rest}>\n <MStack>\n <MHeading level={5}>{texts.timelineTitle}</MHeading>\n <div className={'timeline slots'}>\n {hours.map((hour) => {\n const matchingEvents = events.filter((event) => {\n if (!event.startTime) {\n return false\n }\n\n return Number(event.startTime.split(':')[0]) === hour\n })\n const slotState = getTimelineSlotState(date, hour)\n\n return (\n <div key={hour} className={cn('timeline slot', slotState)}>\n <div className={'slot time'}>{`${String(hour).padStart(2, '0')}:00`}</div>\n <div className={'slot line'} />\n <div className={'slot content'}>\n {matchingEvents.length > 0 ? (\n <MStack>\n {matchingEvents.map((event) => (\n <div key={event.id} className={'slot event'}>\n <span\n className={'slot event dot'}\n style={{\n background: event.color ?? getStatusColor(event.status),\n }}\n />\n <MText size={'sm'}>{event.title}</MText>\n </div>\n ))}\n </MStack>\n ) : (\n <MText size={'sm'} tone={'muted'}>\n {emptyStateText ?? texts.timelineEmptyState}\n </MText>\n )}\n </div>\n </div>\n )\n })}\n </div>\n </MStack>\n </div>\n )\n}\n\nexport function MCalendarEventPopover({\n open,\n anchorRef,\n onClose,\n onPointerEnter,\n onPointerLeave,\n date,\n events,\n locale: localeOverride,\n timelineStartHour = 6,\n timelineEndHour = 22,\n showTimeline = true,\n emptyStateText,\n renderEventItem,\n className,\n style,\n}: MCalendarEventPopoverProps) {\n const locale = useDocumentLocale(localeOverride)\n const texts = useMCalendarBoardTexts()\n\n return (\n <MPopover\n open={open}\n anchorRef={anchorRef}\n onClose={onClose}\n placement={'bottom-start'}\n className={cn('calendar popover', className)}\n style={style}\n >\n <MCard className={'calendar event popover'} onPointerEnter={onPointerEnter} onPointerLeave={onPointerLeave}>\n <MCardBody>\n <CalendarDetailsContent\n date={date}\n events={events}\n locale={locale}\n timelineStartHour={timelineStartHour}\n timelineEndHour={timelineEndHour}\n showTimeline={showTimeline}\n emptyStateText={emptyStateText ?? texts.emptyStateText}\n renderEventItem={renderEventItem}\n />\n </MCardBody>\n </MCard>\n </MPopover>\n )\n}\n\nexport function MCalendarBoard({\n month,\n defaultMonth,\n onMonthChange,\n events = [],\n locale: localeOverride,\n weekStartsOn = 1,\n view,\n defaultView = 'month',\n views = ['month', 'week'],\n onViewChange,\n selectedDate,\n defaultSelectedDate,\n onDayClick,\n dayBadge,\n renderDayCell,\n renderEventItem,\n detailsTrigger = 'click',\n detailsMode = 'auto',\n showTimeline = true,\n timelineStartHour = 6,\n timelineEndHour = 22,\n emptyStateText,\n filters = [],\n activeFilters,\n defaultActiveFilters = [],\n onActiveFiltersChange,\n fullWidth = false,\n className,\n ...rest\n}: MCalendarBoardProps) {\n const locale = useDocumentLocale(localeOverride)\n const datePickerTexts = useMDatePickerTexts()\n const texts = useMCalendarBoardTexts()\n const today = stripTime(new Date())\n const [internalMonth, setInternalMonth] = useState(stripTime(defaultMonth ?? month ?? today))\n const [internalView, setInternalView] = useState<MCalendarBoardView>(defaultView)\n const [internalSelectedDate, setInternalSelectedDate] = useState<Date | null>(normalizeDate(defaultSelectedDate))\n const [internalActiveFilters, setInternalActiveFilters] = useState<string[]>(defaultActiveFilters)\n const [activeDate, setActiveDate] = useState<Date | null>(null)\n const [detailsOpen, setDetailsOpen] = useState(false)\n const [isCompact, setIsCompact] = useState(false)\n const activeAnchorRef = useRef<HTMLElement | null>(null)\n const closeTimeoutRef = useRef<number | null>(null)\n\n const isMonthControlled = month !== undefined && typeof onMonthChange === 'function'\n const visibleMonth = stripTime(isMonthControlled ? (month ?? internalMonth) : internalMonth)\n const currentView = view ?? internalView\n const resolvedSelectedDate = normalizeDate(selectedDate) ?? internalSelectedDate\n const resolvedActiveFilters = activeFilters ?? internalActiveFilters\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(`(max-width: ${MBreakpoints.md}px)`)\n const updateCompactState = () => setIsCompact(mediaQuery.matches)\n\n updateCompactState()\n mediaQuery.addEventListener('change', updateCompactState)\n\n return () => mediaQuery.removeEventListener('change', updateCompactState)\n }, [])\n\n useEffect(() => {\n if (isMonthControlled && month) {\n setInternalMonth(stripTime(month))\n }\n }, [isMonthControlled, month])\n\n useEffect(() => {\n if (view) {\n setInternalView(view)\n }\n }, [view])\n\n useEffect(() => {\n if (selectedDate !== undefined) {\n setInternalSelectedDate(normalizeDate(selectedDate))\n }\n }, [selectedDate])\n\n useEffect(\n () => () => {\n if (closeTimeoutRef.current) {\n window.clearTimeout(closeTimeoutRef.current)\n }\n },\n []\n )\n\n const filteredEvents = useMemo(\n () => applyCalendarFilters(events, filters, resolvedActiveFilters),\n [events, filters, resolvedActiveFilters]\n )\n\n const eventsByDay = useMemo(() => {\n const nextMap = new Map<string, MCalendarEvent[]>()\n\n filteredEvents.forEach((event) => {\n const eventDate = getEventDate(event)\n if (!eventDate) {\n return\n }\n\n const key = getDateKey(eventDate)\n const currentEvents = nextMap.get(key) ?? []\n currentEvents.push(event)\n nextMap.set(key, currentEvents)\n })\n\n return nextMap\n }, [filteredEvents])\n const calendarDays = useMemo(() => {\n if (currentView === 'week') {\n const baseDate = resolvedSelectedDate ?? visibleMonth\n const weekStart = startOfWeek(baseDate, weekStartsOn)\n return Array.from({length: 7}, (_, index) => addDays(weekStart, index))\n }\n\n return buildMonthGrid(visibleMonth, weekStartsOn)\n }, [currentView, resolvedSelectedDate, visibleMonth, weekStartsOn])\n\n const effectiveDetailsMode: MCalendarDetailsMode =\n detailsMode === 'auto' ? (isCompact ? 'modal' : 'popover') : detailsMode\n const activeEvents = activeDate ? (eventsByDay.get(getDateKey(activeDate)) ?? []) : []\n const canShowMonthView = views.includes('month')\n const canShowWeekView = views.includes('week')\n\n const setMonthAndNotify = (nextMonth: Date) => {\n const normalizedMonth = stripTime(nextMonth)\n setInternalMonth(normalizedMonth)\n onMonthChange?.(normalizedMonth)\n }\n\n const navigateBy = (amount: number) => {\n if (currentView === 'week') {\n const nextAnchor = addDays(resolvedSelectedDate ?? visibleMonth, amount * 7)\n setMonthAndNotify(nextAnchor)\n setInternalSelectedDate(nextAnchor)\n setActiveDate(nextAnchor)\n setDetailsOpen(false)\n return\n }\n\n const nextMonth = new Date(visibleMonth.getFullYear(), visibleMonth.getMonth() + amount, 1)\n setMonthAndNotify(nextMonth)\n setDetailsOpen(false)\n setActiveDate(null)\n }\n\n const setViewAndNotify = (nextView: MCalendarBoardView) => {\n setInternalView(nextView)\n onViewChange?.(nextView)\n }\n\n const setSelectedDateAndNotify = (nextDate: Date, dayEvents: MCalendarEvent[]) => {\n const normalizedDate = stripTime(nextDate)\n setInternalSelectedDate(normalizedDate)\n onDayClick?.(normalizedDate, dayEvents)\n }\n\n const clearCloseTimeout = () => {\n if (closeTimeoutRef.current) {\n window.clearTimeout(closeTimeoutRef.current)\n closeTimeoutRef.current = null\n }\n }\n\n const scheduleClose = () => {\n clearCloseTimeout()\n closeTimeoutRef.current = window.setTimeout(() => {\n setDetailsOpen(false)\n }, 180)\n }\n\n const openDetails = (date: Date, target: HTMLElement, dayEvents: MCalendarEvent[]) => {\n activeAnchorRef.current = target\n setActiveDate(date)\n setSelectedDateAndNotify(date, dayEvents)\n setDetailsOpen(true)\n }\n\n const handleDayInteract = (date: Date, target: HTMLElement, dayEvents: MCalendarEvent[]) => {\n clearCloseTimeout()\n openDetails(date, target, dayEvents)\n\n if (currentView === 'month' && date.getMonth() !== visibleMonth.getMonth()) {\n setMonthAndNotify(new Date(date.getFullYear(), date.getMonth(), 1))\n }\n }\n\n const handleDayHover = (date: Date, target: HTMLElement, dayEvents: MCalendarEvent[]) => {\n if (detailsTrigger !== 'hover' || effectiveDetailsMode !== 'popover') {\n return\n }\n\n clearCloseTimeout()\n openDetails(date, target, dayEvents)\n }\n\n const handleFilterToggle = (filterId: string) => {\n const nextFilters = resolvedActiveFilters.includes(filterId)\n ? resolvedActiveFilters.filter((id) => id !== filterId)\n : [...resolvedActiveFilters, filterId]\n\n setInternalActiveFilters(nextFilters)\n onActiveFiltersChange?.(nextFilters)\n }\n\n const dayNameBase = startOfWeek(\n currentView === 'week' ? (resolvedSelectedDate ?? visibleMonth) : visibleMonth,\n weekStartsOn\n )\n\n return (\n <div className={cn('calendar board', fullWidth && 'full-width', className)} {...rest}>\n <div className={'calendar header'}>\n <MStack>\n <MHeading level={3}>{getViewTitle(visibleMonth, currentView, locale, weekStartsOn)}</MHeading>\n <MText size={'sm'} tone={'muted'}>\n {getViewSubtitle(currentView, texts)}\n </MText>\n </MStack>\n <MStack align={'end'}>\n <div className={'calendar actions'}>\n <MButton\n type={'button'}\n size={'sm'}\n variant={'outlined'}\n color={'neutral'}\n onClick={() => navigateBy(-1)}\n >\n {currentView === 'week' ? texts.previousWeek : datePickerTexts.previousMonth}\n </MButton>\n <MButton\n type={'button'}\n size={'sm'}\n variant={'outlined'}\n color={'neutral'}\n onClick={() => navigateBy(1)}\n >\n {currentView === 'week' ? texts.nextWeek : datePickerTexts.nextMonth}\n </MButton>\n </div>\n {(canShowMonthView || canShowWeekView) && (\n <div className={'calendar views'}>\n {canShowMonthView && (\n <MButton\n type={'button'}\n size={'sm'}\n variant=\"outlined\"\n color={currentView === 'month' ? 'primary' : 'neutral'}\n active={currentView === 'month'}\n onClick={() => setViewAndNotify('month')}\n >\n {texts.monthView}\n </MButton>\n )}\n {canShowWeekView && (\n <MButton\n type={'button'}\n size={'sm'}\n variant=\"outlined\"\n color={currentView === 'week' ? 'primary' : 'neutral'}\n active={currentView === 'week'}\n onClick={() => setViewAndNotify('week')}\n >\n {texts.weekView}\n </MButton>\n )}\n </div>\n )}\n </MStack>\n </div>\n\n <CalendarFilters filters={filters} activeFilterIds={resolvedActiveFilters} onToggle={handleFilterToggle} />\n\n <div className={'calendar days'}>\n {Array.from({length: 7}, (_, index) => addDays(dayNameBase, index)).map((day) => (\n <div key={getDateKey(day)} className={'calendar day'}>\n {new Intl.DateTimeFormat(locale, {weekday: 'short'}).format(day)}\n </div>\n ))}\n </div>\n\n {currentView === 'week' ? (\n <CalendarWeekView\n days={calendarDays}\n eventsByDay={eventsByDay}\n selectedDate={resolvedSelectedDate}\n activeDate={activeDate}\n onDayInteract={handleDayInteract}\n onDayHover={handleDayHover}\n onDayLeave={() => {\n if (detailsTrigger === 'hover' && effectiveDetailsMode === 'popover') {\n scheduleClose()\n }\n }}\n dayBadge={dayBadge}\n renderDayCell={renderDayCell}\n />\n ) : (\n <div className={'calendar grid'}>\n {calendarDays.map((day) => {\n const dayKey = getDateKey(day)\n const dayEvents = eventsByDay.get(dayKey) ?? []\n const badge =\n dayBadge?.(day, dayEvents) ??\n (dayEvents.length > 0 ? <MBadge size={'sm'}>{dayEvents.length}</MBadge> : null)\n const isToday = dayKey === getDateKey(today)\n const isSelected = Boolean(resolvedSelectedDate && dayKey === getDateKey(resolvedSelectedDate))\n const isOutsideMonth = day.getMonth() !== visibleMonth.getMonth()\n const markers = buildDayMarkers(dayEvents)\n const context = {\n date: day,\n events: dayEvents,\n badge,\n isToday,\n isSelected,\n isOutsideMonth,\n }\n\n return (\n <MCalendarDayCell\n key={dayKey}\n date={day}\n events={dayEvents}\n badge={badge}\n markers={markers}\n isToday={isToday}\n isSelected={isSelected || Boolean(activeDate && dayKey === getDateKey(activeDate))}\n isOutsideMonth={isOutsideMonth}\n onClick={(event) => handleDayInteract(day, event.currentTarget, dayEvents)}\n onMouseEnter={(event) => handleDayHover(day, event.currentTarget, dayEvents)}\n onMouseLeave={() => {\n if (detailsTrigger === 'hover' && effectiveDetailsMode === 'popover') {\n scheduleClose()\n }\n }}\n >\n {renderDayCell ? renderDayCell(day, context) : undefined}\n </MCalendarDayCell>\n )\n })}\n </div>\n )}\n\n {effectiveDetailsMode === 'popover' ? (\n <MCalendarEventPopover\n open={detailsOpen && Boolean(activeDate) && Boolean(activeAnchorRef.current)}\n anchorRef={activeAnchorRef as RefObject<HTMLElement | null>}\n onClose={() => setDetailsOpen(false)}\n onPointerEnter={() => clearCloseTimeout()}\n onPointerLeave={() => scheduleClose()}\n date={activeDate}\n events={activeEvents}\n locale={locale}\n timelineStartHour={timelineStartHour}\n timelineEndHour={timelineEndHour}\n showTimeline={showTimeline}\n emptyStateText={emptyStateText ?? texts.emptyStateText}\n renderEventItem={renderEventItem}\n />\n ) : (\n <MModal\n open={detailsOpen && Boolean(activeDate)}\n onClose={() => setDetailsOpen(false)}\n title={activeDate ? formatBoardDate(activeDate, locale) : undefined}\n description={activeDate ? texts.itemsCount(activeEvents.length) : undefined}\n size={'lg'}\n >\n <CalendarDetailsContent\n date={activeDate}\n events={activeEvents}\n locale={locale}\n timelineStartHour={timelineStartHour}\n timelineEndHour={timelineEndHour}\n showTimeline={showTimeline}\n emptyStateText={emptyStateText ?? texts.emptyStateText}\n renderEventItem={renderEventItem}\n />\n </MModal>\n )}\n </div>\n )\n}\n","import type {HTMLAttributes, ReactNode} from 'react'\nimport type {MColor} from '../../../theme/MTheme.types'\n\nexport type MChartType = 'line' | 'bar' | 'area' | 'pie'\n\nexport interface MChartDataset {\n label: string\n data: number[]\n color?: MColor\n}\n\nexport interface MChartAxisConfig {\n labels?: string[]\n min?: number\n max?: number\n ticks?: number\n formatter?: (value: number) => string\n title?: string\n}\n\nexport interface MChartProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n type: MChartType\n data: MChartDataset[]\n width?: number | string\n height?: number\n aspectRatio?: number\n xAxis?: MChartAxisConfig\n yAxis?: MChartAxisConfig\n showGrid?: boolean\n showXAxis?: boolean\n showYAxis?: boolean\n showLegend?: boolean\n showTooltip?: boolean\n animated?: boolean\n stacked?: boolean\n curved?: boolean\n donut?: boolean\n donutWidth?: number\n valueFormatter?: (value: number) => string\n labelFormatter?: (label: string) => string\n onDataClick?: (datasetIndex: number, dataIndex: number, value: number) => void\n}\n\nexport interface MChartTooltipData {\n label: string\n items: {name: string; value: number; color: MColor}[]\n x: number\n y: number\n}\n\nexport const CHART_DEFAULT_COLORS: MColor[] = [\n 'primary',\n 'info',\n 'success',\n 'warning',\n 'error',\n 'news',\n 'neutral',\n 'dark',\n]\n\n/* ── Per-type public prop interfaces ── */\n\ninterface MChartBaseProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n data: MChartDataset[]\n width?: number | string\n height?: number\n aspectRatio?: number\n xAxis?: MChartAxisConfig\n showLegend?: boolean\n showTooltip?: boolean\n animated?: boolean\n valueFormatter?: (value: number) => string\n labelFormatter?: (label: string) => string\n onDataClick?: (datasetIndex: number, dataIndex: number, value: number) => void\n}\n\ninterface MCartesianChartProps extends MChartBaseProps {\n yAxis?: MChartAxisConfig\n showGrid?: boolean\n showXAxis?: boolean\n showYAxis?: boolean\n}\n\nexport interface MLineChartProps extends MCartesianChartProps {\n curved?: boolean\n}\n\nexport interface MBarChartProps extends MCartesianChartProps {\n stacked?: boolean\n}\n\nexport interface MAreaChartProps extends MCartesianChartProps {\n curved?: boolean\n stacked?: boolean\n}\n\nexport interface MPieChartProps extends MChartBaseProps {\n donut?: boolean\n donutWidth?: number\n}\n\nexport const CHART_PADDING = {top: 20, right: 20, bottom: 40, left: 50}\nexport const CHART_PADDING_WITH_TITLE = {top: 20, right: 20, bottom: 55, left: 65}\n","export function defaultValueFormatter(value: number): string {\n if (Math.abs(value) >= 1_000_000) {\n return (value / 1_000_000).toFixed(1).replace(/\\.0$/, '') + 'M'\n }\n if (Math.abs(value) >= 1_000) {\n return (value / 1_000).toFixed(1).replace(/\\.0$/, '') + 'k'\n }\n if (Number.isInteger(value)) return String(value)\n return value.toFixed(1)\n}\n\nexport function defaultLabelFormatter(label: string): string {\n return label\n}\n\nexport function percentFormatter(value: number): string {\n return value.toFixed(0) + '%'\n}\n","interface ChartGridProps {\n x: number\n y: number\n width: number\n height: number\n horizontalLines: number[]\n verticalLines?: number[]\n}\n\nexport function ChartGrid({x, y, width, height, horizontalLines, verticalLines}: ChartGridProps) {\n return (\n <g className=\"chart-grid\">\n {horizontalLines.map((ly, i) => (\n <line key={`h${i}`} x1={x} y1={ly} x2={x + width} y2={ly} className=\"chart-grid-line\" />\n ))}\n {verticalLines?.map((lx, i) => (\n <line\n key={`v${i}`}\n x1={lx}\n y1={y}\n x2={lx}\n y2={y + height}\n className=\"chart-grid-line chart-grid-line-vertical\"\n />\n ))}\n </g>\n )\n}\n","interface ChartAxisProps {\n type: 'x' | 'y'\n x: number\n y: number\n length: number\n ticks: {position: number; label: string}[]\n title?: string\n}\n\nexport function ChartAxis({type, x, y, length, ticks, title}: ChartAxisProps) {\n const isX = type === 'x'\n\n return (\n <g className={`chart-axis chart-axis-${type}`}>\n <line x1={x} y1={y} x2={isX ? x + length : x} y2={isX ? y : y - length} className=\"chart-axis-line\" />\n {ticks.map((tick, i) => (\n <g key={i}>\n {isX ? (\n <text x={tick.position} y={y + 16} textAnchor=\"middle\" className=\"chart-axis-label\">\n {tick.label}\n </text>\n ) : (\n <text\n x={x - 8}\n y={tick.position}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n className=\"chart-axis-label\"\n >\n {tick.label}\n </text>\n )}\n </g>\n ))}\n {title &&\n (isX ? (\n <text x={x + length / 2} y={y + 36} textAnchor=\"middle\" className=\"chart-axis-title\">\n {title}\n </text>\n ) : (\n <text\n x={x - 40}\n y={y - length / 2}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n transform={`rotate(-90, ${x - 40}, ${y - length / 2})`}\n className=\"chart-axis-title\"\n >\n {title}\n </text>\n ))}\n </g>\n )\n}\n","import {useMemo, useCallback, useState} from 'react'\nimport type {MChartDataset, MChartTooltipData} from '../MChart.types'\nimport type {MColor} from '../../../../theme/MTheme.types'\nimport {createLinearScale, generateTicks, getDataExtent, niceMin, niceMax} from '../utils/scales'\nimport {linePath, curvedPath} from '../utils/paths'\nimport type {Point} from '../utils/paths'\nimport {defaultValueFormatter} from '../utils/formats'\nimport {ChartGrid} from '../parts/ChartGrid'\nimport {ChartAxis} from '../parts/ChartAxis'\nimport type {MChartAxisConfig} from '../MChart.types'\n\ninterface MLineChartProps {\n data: MChartDataset[]\n colors: MColor[]\n innerWidth: number\n innerHeight: number\n padding: {top: number; right: number; bottom: number; left: number}\n xAxis?: MChartAxisConfig\n yAxis?: MChartAxisConfig\n showGrid: boolean\n showXAxis: boolean\n showYAxis: boolean\n curved: boolean\n animated: boolean\n valueFormatter: (value: number) => string\n onTooltip: (data: MChartTooltipData | null) => void\n onDataClick?: (datasetIndex: number, dataIndex: number, value: number) => void\n}\n\nexport function MLineChart({\n data,\n colors,\n innerWidth,\n innerHeight,\n padding,\n xAxis,\n yAxis,\n showGrid,\n showXAxis,\n showYAxis,\n curved,\n animated,\n valueFormatter = defaultValueFormatter,\n onTooltip,\n onDataClick,\n}: MLineChartProps) {\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n\n const plotW = innerWidth - padding.left - padding.right\n const plotH = innerHeight - padding.top - padding.bottom\n\n const {yMin, yMax, yTicks, xLabels, seriesPoints} = useMemo(() => {\n const allData = data.map((d) => d.data)\n const [rawMin, rawMax] = getDataExtent(allData)\n const min = yAxis?.min ?? niceMin(rawMin)\n const max = yAxis?.max ?? niceMax(rawMax, rawMin)\n const ticks = generateTicks(min, max, yAxis?.ticks ?? 5)\n const maxLen = Math.max(...allData.map((d) => d.length), 1)\n const labels = xAxis?.labels ?? Array.from({length: maxLen}, (_, i) => String(i))\n\n const xScale = createLinearScale([0, Math.max(maxLen - 1, 1)], [0, plotW])\n const yScale = createLinearScale([min, max], [plotH, 0])\n\n const pts = allData.map((series) => series.map((v, i): Point => ({x: xScale(i), y: yScale(v)})))\n\n return {yMin: min, yMax: max, yTicks: ticks, xLabels: labels, seriesPoints: pts}\n }, [data, plotW, plotH, xAxis, yAxis])\n\n const yScale = createLinearScale([yMin, yMax], [plotH, 0])\n const xScale = createLinearScale([0, Math.max(xLabels.length - 1, 1)], [0, plotW])\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<SVGGElement>) => {\n const svg = e.currentTarget.closest('svg')\n if (!svg) return\n const rect = svg.getBoundingClientRect()\n const scale = innerWidth / rect.width\n const mx = (e.clientX - rect.left) * scale - padding.left\n const idx = Math.round((mx / plotW) * Math.max(xLabels.length - 1, 1))\n const clampedIdx = Math.max(0, Math.min(idx, xLabels.length - 1))\n\n setHoveredIndex(clampedIdx)\n onTooltip({\n label: xLabels[clampedIdx],\n items: data.map((ds, di) => ({\n name: ds.label,\n value: ds.data[clampedIdx] ?? 0,\n color: ds.color ?? colors[di % colors.length],\n })),\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n })\n },\n [data, colors, xLabels, plotW, padding.left, innerWidth, onTooltip]\n )\n\n const handleMouseLeave = useCallback(() => {\n setHoveredIndex(null)\n onTooltip(null)\n }, [onTooltip])\n\n const gridH = yTicks.map((t) => padding.top + yScale(t))\n const xTickPositions = xLabels.map((_, i) => padding.left + xScale(i))\n const yTickData = yTicks.map((t) => ({\n position: padding.top + yScale(t),\n label: (yAxis?.formatter ?? valueFormatter)(t),\n }))\n const xTickData = xLabels.map((l, i) => ({\n position: padding.left + xScale(i),\n label: l,\n }))\n\n return (\n <g>\n {showGrid && (\n <ChartGrid\n x={padding.left}\n y={padding.top}\n width={plotW}\n height={plotH}\n horizontalLines={gridH}\n verticalLines={xTickPositions}\n />\n )}\n {showYAxis && (\n <ChartAxis\n type=\"y\"\n x={padding.left}\n y={padding.top + plotH}\n length={plotH}\n ticks={yTickData}\n title={yAxis?.title}\n />\n )}\n {showXAxis && (\n <ChartAxis\n type=\"x\"\n x={padding.left}\n y={padding.top + plotH}\n length={plotW}\n ticks={xTickData}\n title={xAxis?.title}\n />\n )}\n <g onMouseMove={handleMouseMove} onMouseLeave={handleMouseLeave}>\n <rect x={padding.left} y={padding.top} width={plotW} height={plotH} fill=\"transparent\" />\n {seriesPoints.map((pts, di) => {\n const c = data[di].color ?? colors[di % colors.length]\n const d = curved\n ? curvedPath(pts.map((p) => ({x: p.x + padding.left, y: p.y + padding.top})))\n : linePath(pts.map((p) => ({x: p.x + padding.left, y: p.y + padding.top})))\n return (\n <g key={di}>\n <path className={`chart-line ${c} ${animated ? 'animated' : ''}`} d={d} />\n {pts.map((p, pi) => (\n <circle\n key={pi}\n className={`chart-dot ${c} ${hoveredIndex === pi ? 'active' : ''}`}\n cx={p.x + padding.left}\n cy={p.y + padding.top}\n r={hoveredIndex === pi ? 5 : 3}\n onClick={() => onDataClick?.(di, pi, data[di].data[pi])}\n style={{cursor: onDataClick ? 'pointer' : undefined}}\n />\n ))}\n </g>\n )\n })}\n {hoveredIndex !== null && (\n <line\n className=\"chart-crosshair\"\n x1={padding.left + xScale(hoveredIndex)}\n y1={padding.top}\n x2={padding.left + xScale(hoveredIndex)}\n y2={padding.top + plotH}\n />\n )}\n </g>\n </g>\n )\n}\n","import {useMemo, useCallback, useState} from 'react'\nimport type {MChartDataset, MChartTooltipData, MChartAxisConfig} from '../MChart.types'\nimport type {MColor} from '../../../../theme/MTheme.types'\nimport {createLinearScale, generateTicks, getDataExtent, getStackedExtent, niceMin, niceMax} from '../utils/scales'\nimport {defaultValueFormatter} from '../utils/formats'\nimport {ChartGrid} from '../parts/ChartGrid'\nimport {ChartAxis} from '../parts/ChartAxis'\n\ninterface MBarChartProps {\n data: MChartDataset[]\n colors: MColor[]\n innerWidth: number\n innerHeight: number\n padding: {top: number; right: number; bottom: number; left: number}\n xAxis?: MChartAxisConfig\n yAxis?: MChartAxisConfig\n showGrid: boolean\n showXAxis: boolean\n showYAxis: boolean\n stacked: boolean\n animated: boolean\n valueFormatter: (value: number) => string\n onTooltip: (data: MChartTooltipData | null) => void\n onDataClick?: (datasetIndex: number, dataIndex: number, value: number) => void\n}\n\nexport function MBarChart({\n data,\n colors,\n innerWidth,\n innerHeight,\n padding,\n xAxis,\n yAxis,\n showGrid,\n showXAxis,\n showYAxis,\n stacked,\n animated,\n valueFormatter = defaultValueFormatter,\n onTooltip,\n onDataClick,\n}: MBarChartProps) {\n const [hoveredBar, setHoveredBar] = useState<{di: number; pi: number} | null>(null)\n\n const plotW = innerWidth - padding.left - padding.right\n const plotH = innerHeight - padding.top - padding.bottom\n\n const {yMin, yMax, yTicks, xLabels, maxLen} = useMemo(() => {\n const allData = data.map((d) => d.data)\n const mLen = Math.max(...allData.map((d) => d.length), 1)\n\n let rawMin: number, rawMax: number\n if (stacked) {\n ;[rawMin, rawMax] = getStackedExtent(allData)\n } else {\n ;[rawMin, rawMax] = getDataExtent(allData)\n }\n\n const min = yAxis?.min ?? niceMin(rawMin)\n const max = yAxis?.max ?? niceMax(rawMax, rawMin)\n const ticks = generateTicks(min, max, yAxis?.ticks ?? 5)\n const labels = xAxis?.labels ?? Array.from({length: mLen}, (_, i) => String(i))\n\n return {yMin: min, yMax: max, yTicks: ticks, xLabels: labels, maxLen: mLen}\n }, [data, xAxis, yAxis, stacked])\n\n const yScale = createLinearScale([yMin, yMax], [plotH, 0])\n const groupWidth = plotW / maxLen\n const barGap = Math.max(groupWidth * 0.1, 2)\n const seriesCount = data.length\n\n const handleBarEnter = useCallback(\n (di: number, pi: number, e: React.MouseEvent) => {\n setHoveredBar({di, pi})\n const svg = e.currentTarget.closest('svg')\n if (!svg) return\n const rect = svg.getBoundingClientRect()\n onTooltip({\n label: xLabels[pi],\n items: stacked\n ? data.map((ds, dsi) => ({\n name: ds.label,\n value: ds.data[pi] ?? 0,\n color: ds.color ?? colors[dsi % colors.length],\n }))\n : [\n {\n name: data[di].label,\n value: data[di].data[pi],\n color: data[di].color ?? colors[di % colors.length],\n },\n ],\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n })\n },\n [data, colors, xLabels, stacked, onTooltip]\n )\n\n const handleMouseLeave = useCallback(() => {\n setHoveredBar(null)\n onTooltip(null)\n }, [onTooltip])\n\n const gridH = yTicks.map((t) => padding.top + yScale(t))\n const xTickData = xLabels.map((l, i) => ({\n position: padding.left + groupWidth * i + groupWidth / 2,\n label: l,\n }))\n const yTickData = yTicks.map((t) => ({\n position: padding.top + yScale(t),\n label: (yAxis?.formatter ?? valueFormatter)(t),\n }))\n\n const baselineY = yScale(0)\n\n return (\n <g>\n {showGrid && (\n <ChartGrid x={padding.left} y={padding.top} width={plotW} height={plotH} horizontalLines={gridH} />\n )}\n {showYAxis && (\n <ChartAxis\n type=\"y\"\n x={padding.left}\n y={padding.top + plotH}\n length={plotH}\n ticks={yTickData}\n title={yAxis?.title}\n />\n )}\n {showXAxis && (\n <ChartAxis\n type=\"x\"\n x={padding.left}\n y={padding.top + plotH}\n length={plotW}\n ticks={xTickData}\n title={xAxis?.title}\n />\n )}\n <g onMouseLeave={handleMouseLeave}>\n {stacked\n ? xLabels.map((_, pi) => {\n let cumY = baselineY\n const barW = groupWidth - barGap * 2\n const x = padding.left + groupWidth * pi + barGap\n\n return (\n <g key={pi}>\n {data.map((ds, di) => {\n const v = ds.data[pi] ?? 0\n const barH = baselineY - yScale(v)\n const y = cumY - barH\n cumY = y\n const c = ds.color ?? colors[di % colors.length]\n const isHovered = hoveredBar?.di === di && hoveredBar?.pi === pi\n return (\n <rect\n key={di}\n className={`chart-bar ${c} ${animated ? 'animated' : ''} ${isHovered ? 'active' : ''}`}\n x={x}\n y={padding.top + y}\n width={Math.max(barW, 1)}\n height={Math.max(barH, 0)}\n rx={di === data.length - 1 ? 3 : 0}\n onMouseEnter={(e) => handleBarEnter(di, pi, e)}\n onClick={() => onDataClick?.(di, pi, v)}\n style={{cursor: onDataClick ? 'pointer' : undefined}}\n />\n )\n })}\n </g>\n )\n })\n : data.map((ds, di) => {\n const barW = (groupWidth - barGap * 2) / seriesCount\n return (\n <g key={di}>\n {ds.data.map((v, pi) => {\n const barH = baselineY - yScale(v)\n const x = padding.left + groupWidth * pi + barGap + barW * di\n const y = Math.min(baselineY, yScale(v))\n const c = ds.color ?? colors[di % colors.length]\n const isHovered = hoveredBar?.di === di && hoveredBar?.pi === pi\n return (\n <rect\n key={pi}\n className={`chart-bar ${c} ${animated ? 'animated' : ''} ${isHovered ? 'active' : ''}`}\n x={x}\n y={padding.top + y}\n width={Math.max(barW, 1)}\n height={Math.max(Math.abs(barH), 0)}\n rx={3}\n onMouseEnter={(e) => handleBarEnter(di, pi, e)}\n onClick={() => onDataClick?.(di, pi, v)}\n style={{cursor: onDataClick ? 'pointer' : undefined}}\n />\n )\n })}\n </g>\n )\n })}\n </g>\n </g>\n )\n}\n","import {useMemo, useCallback, useState} from 'react'\nimport type {MChartDataset, MChartTooltipData, MChartAxisConfig} from '../MChart.types'\nimport type {MColor} from '../../../../theme/MTheme.types'\nimport {createLinearScale, generateTicks, getDataExtent, getStackedExtent, niceMin, niceMax} from '../utils/scales'\nimport {linePath, curvedPath, areaPath, stackedAreaPath} from '../utils/paths'\nimport type {Point} from '../utils/paths'\nimport {defaultValueFormatter} from '../utils/formats'\nimport {ChartGrid} from '../parts/ChartGrid'\nimport {ChartAxis} from '../parts/ChartAxis'\n\ninterface MAreaChartProps {\n data: MChartDataset[]\n colors: MColor[]\n innerWidth: number\n innerHeight: number\n padding: {top: number; right: number; bottom: number; left: number}\n xAxis?: MChartAxisConfig\n yAxis?: MChartAxisConfig\n showGrid: boolean\n showXAxis: boolean\n showYAxis: boolean\n curved: boolean\n stacked: boolean\n animated: boolean\n valueFormatter: (value: number) => string\n onTooltip: (data: MChartTooltipData | null) => void\n onDataClick?: (datasetIndex: number, dataIndex: number, value: number) => void\n}\n\nexport function MAreaChart({\n data,\n colors,\n innerWidth,\n innerHeight,\n padding,\n xAxis,\n yAxis,\n showGrid,\n showXAxis,\n showYAxis,\n curved,\n stacked,\n animated,\n valueFormatter = defaultValueFormatter,\n onTooltip,\n onDataClick,\n}: MAreaChartProps) {\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n\n const plotW = innerWidth - padding.left - padding.right\n const plotH = innerHeight - padding.top - padding.bottom\n\n const {yMin, yMax, yTicks, xLabels, seriesPoints, stackedPaths} = useMemo(() => {\n const allData = data.map((d) => d.data)\n const maxLen = Math.max(...allData.map((d) => d.length), 1)\n\n let rawMin: number, rawMax: number\n if (stacked) {\n ;[rawMin, rawMax] = getStackedExtent(allData)\n } else {\n ;[rawMin, rawMax] = getDataExtent(allData)\n }\n\n const min = yAxis?.min ?? niceMin(rawMin)\n const max = yAxis?.max ?? niceMax(rawMax, rawMin)\n const ticks = generateTicks(min, max, yAxis?.ticks ?? 5)\n const labels = xAxis?.labels ?? Array.from({length: maxLen}, (_, i) => String(i))\n\n const xScale = createLinearScale([0, Math.max(maxLen - 1, 1)], [0, plotW])\n const yScale = createLinearScale([min, max], [plotH, 0])\n\n if (stacked) {\n const cumulative: number[][] = []\n for (let i = 0; i < allData.length; i++) {\n cumulative[i] = []\n for (let j = 0; j < maxLen; j++) {\n cumulative[i][j] = (allData[i][j] ?? 0) + (i > 0 ? cumulative[i - 1][j] : 0)\n }\n }\n\n const sPaths = cumulative.map((series, di) => {\n const topPts: Point[] = series.map((v, j) => ({\n x: padding.left + xScale(j),\n y: padding.top + yScale(v),\n }))\n const bottomPts: Point[] =\n di === 0\n ? series.map((_, j) => ({x: padding.left + xScale(j), y: padding.top + yScale(0)}))\n : cumulative[di - 1].map((v, j) => ({x: padding.left + xScale(j), y: padding.top + yScale(v)}))\n\n return {\n area: stackedAreaPath(topPts, bottomPts, curved),\n line: curved ? curvedPath(topPts) : linePath(topPts),\n topPts,\n }\n })\n\n return {\n yMin: min,\n yMax: max,\n yTicks: ticks,\n xLabels: labels,\n seriesPoints: [] as Point[][],\n stackedPaths: sPaths,\n }\n }\n\n const pts = allData.map((series) =>\n series.map((v, i): Point => ({x: padding.left + xScale(i), y: padding.top + yScale(v)}))\n )\n\n return {yMin: min, yMax: max, yTicks: ticks, xLabels: labels, seriesPoints: pts, stackedPaths: undefined}\n }, [data, plotW, plotH, xAxis, yAxis, stacked, curved, padding])\n\n const yScale = createLinearScale([yMin, yMax], [plotH, 0])\n const xScale = createLinearScale([0, Math.max(xLabels.length - 1, 1)], [0, plotW])\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<SVGGElement>) => {\n const svg = e.currentTarget.closest('svg')\n if (!svg) return\n const rect = svg.getBoundingClientRect()\n const scale = innerWidth / rect.width\n const mx = (e.clientX - rect.left) * scale - padding.left\n const idx = Math.round((mx / plotW) * Math.max(xLabels.length - 1, 1))\n const clampedIdx = Math.max(0, Math.min(idx, xLabels.length - 1))\n\n setHoveredIndex(clampedIdx)\n onTooltip({\n label: xLabels[clampedIdx],\n items: data.map((ds, di) => ({\n name: ds.label,\n value: ds.data[clampedIdx] ?? 0,\n color: ds.color ?? colors[di % colors.length],\n })),\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n })\n },\n [data, colors, xLabels, plotW, padding.left, innerWidth, onTooltip]\n )\n\n const handleMouseLeave = useCallback(() => {\n setHoveredIndex(null)\n onTooltip(null)\n }, [onTooltip])\n\n const gridH = yTicks.map((t) => padding.top + yScale(t))\n const yTickData = yTicks.map((t) => ({\n position: padding.top + yScale(t),\n label: (yAxis?.formatter ?? valueFormatter)(t),\n }))\n const xTickData = xLabels.map((l, i) => ({\n position: padding.left + xScale(i),\n label: l,\n }))\n\n return (\n <g>\n {showGrid && (\n <ChartGrid x={padding.left} y={padding.top} width={plotW} height={plotH} horizontalLines={gridH} />\n )}\n {showYAxis && (\n <ChartAxis\n type=\"y\"\n x={padding.left}\n y={padding.top + plotH}\n length={plotH}\n ticks={yTickData}\n title={yAxis?.title}\n />\n )}\n {showXAxis && (\n <ChartAxis\n type=\"x\"\n x={padding.left}\n y={padding.top + plotH}\n length={plotW}\n ticks={xTickData}\n title={xAxis?.title}\n />\n )}\n <g onMouseMove={handleMouseMove} onMouseLeave={handleMouseLeave}>\n <rect x={padding.left} y={padding.top} width={plotW} height={plotH} fill=\"transparent\" />\n {stacked && stackedPaths\n ? stackedPaths.map((sp, di) => {\n const c = data[di].color ?? colors[di % colors.length]\n return (\n <g key={di}>\n <path className={`chart-area-fill ${c}`} d={sp.area} />\n <path className={`chart-line ${c} ${animated ? 'animated' : ''}`} d={sp.line} />\n </g>\n )\n })\n : seriesPoints.map((pts, di) => {\n const c = data[di].color ?? colors[di % colors.length]\n const lineD = curved ? curvedPath(pts) : linePath(pts)\n const areaD = areaPath(pts, padding.top + plotH, curved)\n return (\n <g key={di}>\n <path className={`chart-area-fill ${c}`} d={areaD} />\n <path className={`chart-line ${c} ${animated ? 'animated' : ''}`} d={lineD} />\n {pts.map((p, pi) => (\n <circle\n key={pi}\n className={`chart-dot ${c} ${hoveredIndex === pi ? 'active' : ''}`}\n cx={p.x}\n cy={p.y}\n r={hoveredIndex === pi ? 5 : 3}\n onClick={() => onDataClick?.(di, pi, data[di].data[pi])}\n style={{cursor: onDataClick ? 'pointer' : undefined}}\n />\n ))}\n </g>\n )\n })}\n {hoveredIndex !== null && (\n <line\n className=\"chart-crosshair\"\n x1={padding.left + xScale(hoveredIndex)}\n y1={padding.top}\n x2={padding.left + xScale(hoveredIndex)}\n y2={padding.top + plotH}\n />\n )}\n </g>\n </g>\n )\n}\n","import {useMemo, useCallback, useState} from 'react'\nimport type {MChartDataset, MChartTooltipData} from '../MChart.types'\nimport type {MColor} from '../../../../theme/MTheme.types'\nimport {pieSector} from '../utils/paths'\nimport {defaultValueFormatter} from '../utils/formats'\n\ninterface MPieChartProps {\n data: MChartDataset[]\n colors: MColor[]\n innerWidth: number\n innerHeight: number\n donut: boolean\n donutWidth?: number\n animated: boolean\n valueFormatter: (value: number) => string\n xAxis?: {labels?: string[]}\n onTooltip: (data: MChartTooltipData | null) => void\n onDataClick?: (datasetIndex: number, dataIndex: number, value: number) => void\n}\n\nexport function MPieChart({\n data,\n colors,\n innerWidth,\n innerHeight,\n donut,\n donutWidth,\n animated,\n valueFormatter = defaultValueFormatter,\n xAxis,\n onTooltip,\n onDataClick,\n}: MPieChartProps) {\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n\n const cx = innerWidth / 2\n const cy = innerHeight / 2\n const radius = Math.min(cx, cy) - 10\n const innerRadius = donut ? radius - (donutWidth ?? radius * 0.4) : 0\n\n const segments = useMemo(() => {\n const values = data.length === 1 ? data[0].data : data.map((d) => d.data[0] ?? 0)\n const labels =\n data.length === 1 ? (xAxis?.labels ?? values.map((_, i) => `Segment ${i + 1}`)) : data.map((d) => d.label)\n const total = values.reduce((s, v) => s + Math.max(v, 0), 0) || 1\n const startAngle = -Math.PI / 2\n\n let current = startAngle\n return values.map((v, i) => {\n const sweep = (Math.max(v, 0) / total) * Math.PI * 2\n const seg = {\n value: v,\n label: labels[i] ?? `Segment ${i + 1}`,\n color: (data.length === 1 ? undefined : data[i].color) ?? colors[i % colors.length],\n startAngle: current,\n endAngle: current + sweep,\n percentage: (Math.max(v, 0) / total) * 100,\n }\n current += sweep\n return seg\n })\n }, [data, colors, xAxis])\n\n const handleEnter = useCallback(\n (i: number, e: React.MouseEvent) => {\n setHoveredIndex(i)\n const svg = e.currentTarget.closest('svg')\n if (!svg) return\n const rect = svg.getBoundingClientRect()\n onTooltip({\n label: segments[i].label,\n items: [{name: segments[i].label, value: segments[i].value, color: segments[i].color}],\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n })\n },\n [segments, onTooltip]\n )\n\n const handleLeave = useCallback(() => {\n setHoveredIndex(null)\n onTooltip(null)\n }, [onTooltip])\n\n return (\n <g>\n {segments.map((seg, i) => {\n const isHovered = hoveredIndex === i\n const path = pieSector(\n cx,\n cy,\n isHovered ? radius + 4 : radius,\n innerRadius,\n seg.startAngle,\n seg.endAngle\n )\n return (\n <path\n key={i}\n className={`chart-pie-segment ${seg.color} ${animated ? 'animated' : ''} ${isHovered ? 'active' : ''}`}\n d={path}\n onMouseEnter={(e) => handleEnter(i, e)}\n onMouseLeave={handleLeave}\n onMouseMove={(e) => {\n const svg = e.currentTarget.closest('svg')\n if (!svg) return\n const rect = svg.getBoundingClientRect()\n onTooltip({\n label: seg.label,\n items: [{name: seg.label, value: seg.value, color: seg.color}],\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n })\n }}\n onClick={() => onDataClick?.(0, i, seg.value)}\n style={{cursor: onDataClick ? 'pointer' : undefined}}\n />\n )\n })}\n {donut && (\n <text x={cx} y={cy} textAnchor=\"middle\" dominantBaseline=\"middle\" className=\"chart-pie-center\">\n {hoveredIndex !== null\n ? valueFormatter(segments[hoveredIndex].value)\n : valueFormatter(segments.reduce((s, seg) => s + seg.value, 0))}\n </text>\n )}\n </g>\n )\n}\n","const COLORS = ['primary', 'info', 'success', 'warning', 'error', 'news', 'neutral', 'dark', 'light'] as const\n\nexport function ChartDefs() {\n return (\n <defs>\n {COLORS.map((c) => (\n <linearGradient key={`bar-${c}`} id={`chart-bar-grad-${c}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" className={`chart-grad-stop-start ${c}`} />\n <stop offset=\"100%\" className={`chart-grad-stop-end ${c}`} />\n </linearGradient>\n ))}\n {COLORS.map((c) => (\n <linearGradient key={`pie-${c}`} id={`chart-pie-grad-${c}`} x1=\"0.3\" y1=\"0\" x2=\"0.7\" y2=\"1\">\n <stop offset=\"0%\" className={`chart-grad-stop-start ${c}`} />\n <stop offset=\"100%\" className={`chart-grad-stop-end ${c}`} />\n </linearGradient>\n ))}\n {COLORS.map((c) => (\n <linearGradient key={`area-${c}`} id={`chart-area-grad-${c}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" className={`chart-grad-area-start ${c}`} />\n <stop offset=\"100%\" className={`chart-grad-area-end ${c}`} />\n </linearGradient>\n ))}\n </defs>\n )\n}\n","import type {MChartTooltipData} from '../MChart.types'\n\ninterface ChartTooltipProps {\n data: MChartTooltipData | null\n valueFormatter: (value: number) => string\n}\n\nexport function ChartTooltip({data, valueFormatter}: ChartTooltipProps) {\n if (!data) return null\n\n return (\n <div className=\"chart-tooltip\" style={{left: data.x, top: data.y}}>\n <div className=\"chart-tooltip-label\">{data.label}</div>\n {data.items.map((item, i) => (\n <div key={i} className=\"chart-tooltip-row\">\n <span className={`chart-tooltip-dot ${item.color}`} />\n <span className=\"chart-tooltip-name\">{item.name}</span>\n <span className=\"chart-tooltip-value\">{valueFormatter(item.value)}</span>\n </div>\n ))}\n </div>\n )\n}\n","import type {MColor} from '../../../../theme/MTheme.types'\n\ninterface ChartLegendProps {\n items: {label: string; color: MColor}[]\n}\n\nexport function ChartLegend({items}: ChartLegendProps) {\n if (items.length <= 1) return null\n\n return (\n <div className=\"chart-legend\">\n {items.map((item, i) => (\n <div key={i} className=\"chart-legend-item\">\n <span className={`chart-legend-dot ${item.color}`} />\n <span className=\"chart-legend-label\">{item.label}</span>\n </div>\n ))}\n </div>\n )\n}\n","import {useMemo, useCallback, useState, useRef} from 'react'\nimport type {MChartProps, MChartTooltipData} from './MChart.types'\nimport {CHART_DEFAULT_COLORS, CHART_PADDING, CHART_PADDING_WITH_TITLE} from './MChart.types'\nimport {defaultValueFormatter, defaultLabelFormatter} from './utils/formats'\nimport {cn} from '../../../utils/cn'\nimport {MLineChart} from './charts/MLineChart'\nimport {MBarChart} from './charts/MBarChart'\nimport {MAreaChart} from './charts/MAreaChart'\nimport {MPieChart} from './charts/MPieChart'\nimport {ChartDefs} from './parts/ChartDefs'\nimport {ChartTooltip} from './parts/ChartTooltip'\nimport {ChartLegend} from './parts/ChartLegend'\nimport './MChart.css'\n\nexport function MChart({\n type,\n data,\n width = '100%',\n height = 300,\n aspectRatio,\n xAxis,\n yAxis,\n showGrid = true,\n showXAxis = true,\n showYAxis = true,\n showLegend = true,\n showTooltip = true,\n animated = true,\n stacked = false,\n curved = false,\n donut = false,\n donutWidth,\n valueFormatter = defaultValueFormatter,\n labelFormatter = defaultLabelFormatter,\n onDataClick,\n className,\n style,\n ...rest\n}: MChartProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const [tooltip, setTooltip] = useState<MChartTooltipData | null>(null)\n\n const colors = CHART_DEFAULT_COLORS\n\n const hasTitles = !!(xAxis?.title || yAxis?.title)\n const padding = hasTitles ? CHART_PADDING_WITH_TITLE : CHART_PADDING\n\n const computedHeight = aspectRatio ? undefined : typeof height === 'number' ? height : 300\n\n const svgWidth = 600\n const svgHeight = computedHeight ?? 300\n\n const onTooltip = useCallback(\n (data: MChartTooltipData | null) => {\n if (showTooltip) setTooltip(data)\n },\n [showTooltip]\n )\n\n const legendItems = useMemo(() => {\n if (type === 'pie' && data.length === 1) {\n const labels = xAxis?.labels ?? data[0].data.map((_, i) => `Segment ${i + 1}`)\n return labels.map((l, i) => ({label: l, color: colors[i % colors.length]}))\n }\n return data.map((ds, i) => ({label: ds.label, color: ds.color ?? colors[i % colors.length]}))\n }, [data, colors, type, xAxis])\n\n const chartProps = {\n data,\n colors,\n innerWidth: svgWidth,\n innerHeight: svgHeight,\n padding,\n xAxis,\n yAxis,\n showGrid,\n showXAxis,\n showYAxis,\n animated,\n valueFormatter,\n onTooltip,\n onDataClick,\n }\n\n return (\n <div\n ref={containerRef}\n className={cn('chart', className)}\n style={{\n width,\n height: aspectRatio ? undefined : computedHeight,\n aspectRatio: aspectRatio ? String(aspectRatio) : undefined,\n ...style,\n }}\n {...rest}\n >\n <svg viewBox={`0 0 ${svgWidth} ${svgHeight}`} preserveAspectRatio=\"xMidYMid meet\" className=\"chart-svg\">\n <ChartDefs />\n {type === 'line' && <MLineChart {...chartProps} curved={curved} />}\n {type === 'bar' && <MBarChart {...chartProps} stacked={stacked} />}\n {type === 'area' && <MAreaChart {...chartProps} curved={curved} stacked={stacked} />}\n {type === 'pie' && <MPieChart {...chartProps} donut={donut} donutWidth={donutWidth} />}\n </svg>\n {showTooltip && <ChartTooltip data={tooltip} valueFormatter={valueFormatter} />}\n {showLegend && <ChartLegend items={legendItems} />}\n </div>\n )\n}\n","import type {MLineChartProps} from './MChart.types'\nimport {MChart} from './MChart'\n\nexport function MLineChart(props: MLineChartProps) {\n return <MChart type=\"line\" {...props} />\n}\n","import type {MBarChartProps} from './MChart.types'\nimport {MChart} from './MChart'\n\nexport function MBarChart(props: MBarChartProps) {\n return <MChart type=\"bar\" {...props} />\n}\n","import type {MAreaChartProps} from './MChart.types'\nimport {MChart} from './MChart'\n\nexport function MAreaChart(props: MAreaChartProps) {\n return <MChart type=\"area\" {...props} />\n}\n","import type {MPieChartProps} from './MChart.types'\nimport {MChart} from './MChart'\n\nexport function MPieChart(props: MPieChartProps) {\n return <MChart type=\"pie\" {...props} />\n}\n"],"mappings":"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"}